pax_global_header00006660000000000000000000000064135644056550014527gustar00rootroot0000000000000052 comment=5034c68450de857b70fbe4a4b9f8dddb62badef3 vtk-dicom-0.8.12/000077500000000000000000000000001356440565500135145ustar00rootroot00000000000000vtk-dicom-0.8.12/CMake/000077500000000000000000000000001356440565500144745ustar00rootroot00000000000000vtk-dicom-0.8.12/CMake/DICOMConfig.cmake.in000066400000000000000000000045121356440565500200660ustar00rootroot00000000000000#----------------------------------------------------------------------------- # # DICOMConfig.cmake - cmake configuration file for external projects. # #----------------------------------------------------------------------------- @DICOM_CONFIG_CODE@ # The C and C++ flags added to the cmake-configured flags. set(DICOM_REQUIRED_C_FLAGS "@DICOM_REQUIRED_C_FLAGS@") set(DICOM_REQUIRED_CXX_FLAGS "@DICOM_REQUIRED_CXX_FLAGS@") # The version number set(DICOM_MAJOR_VERSION "@DICOM_MAJOR_VERSION@") set(DICOM_MINOR_VERSION "@DICOM_MINOR_VERSION@") set(DICOM_PATCH_VERSION "@DICOM_PATCH_VERSION@") # Legacy (for backwards compatibility) set(DICOM_BUILD_VERSION "${DICOM_PATCH_VERSION}") # Configured settings set(DICOM_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@") set(DICOM_USE_ITK_GDCM "@USE_ITK_GDCM@") set(DICOM_USE_GDCM "@USE_GDCM@") set(DICOM_USE_DCMTK "@USE_DCMTK@") set(DICOM_USE_SQLITE "@USE_SQLITE@") # Auto-configured settings set(DICOM_USE_VTKZLIB "@DICOM_USE_VTKZLIB@") # Dependencies set(DICOM_VTK_DIR "@VTK_DIR@") if(NOT VTK_FOUND) find_package(VTK PATHS "${DICOM_VTK_DIR}") else() get_filename_component(tmp1 "${DICOM_VTK_DIR}" REALPATH) get_filename_component(tmp2 "${VTK_DIR}" REALPATH) if(NOT "${tmp1}" STREQUAL "${tmp2}") message(WARNING "Mismatch for VTK between vtk-dicom and current project: " "DICOM_DIR=${DICOM_DIR} " "VTK_DICOM_DIR=${DICOM_VTK_DIR} " "VTK_DIR=${VTK_DIR}") endif() endif() if(DICOM_USE_ITK_GDCM) set(DICOM_ITK_DIR "@ITK_DIR@") if(NOT DICOM_BUILD_SHARED_LIBS AND NOT ITK_FOUND) find_package(ITK PATHS "${DICOM_ITK_DIR}") endif() elseif(DICOM_USE_GDCM) set(DICOM_GDCM_DIR "@GDCM_DIR@") if(NOT DICOM_BUILD_SHARED_LIBS AND NOT GDCM_FOUND) find_package(GDCM PATHS "${DICOM_GDCM_DIR}") endif() endif() # Get the current directory get_filename_component(DICOM_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) # The location of the "use" file. set(DICOM_USE_FILE "${DICOM_CMAKE_DIR}/UseDICOM.cmake") # Our library dependencies (contains definitions for IMPORTED targets) if(NOT TARGET vtkDICOM AND NOT DICOM_BINARY_DIR) include("${DICOM_CMAKE_DIR}/DICOMTargets.cmake") endif() # Compute paths set(DICOM_INCLUDE_DIRS "@INCLUDE_DIRS_CONFIG@") set(DICOM_LIBRARY_DIRS "@LIBRARY_DIRS_CONFIG@") # These are IMPORTED targets created by DICOMTargets.cmake set(DICOM_LIBRARIES @DICOM_LIBRARIES@) vtk-dicom-0.8.12/CMake/DICOMConfigVersion.cmake.in000066400000000000000000000005711356440565500214350ustar00rootroot00000000000000set(PACKAGE_VERSION "@DICOM_VERSION@") # Check whether the requested PACKAGE_FIND_VERSION is compatible if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() endif() vtk-dicom-0.8.12/CMake/FindDCMTK.cmake000066400000000000000000000137161356440565500171510ustar00rootroot00000000000000# - find DCMTK libraries and applications # # DCMTK_INCLUDE_DIRS - Directories to include to use DCMTK # DCMTK_LIBRARIES - Files to link against to use DCMTK # DCMTK_FOUND - If false, don't try to use DCMTK # DCMTK_DIR - (optional) Source directory for DCMTK # # DCMTK_DIR can be used to make it simpler to find the various include # directories and compiled libraries if you've just compiled it in the # source tree. Just set it to the root of the tree where you extracted # the source (default to /usr/include/dcmtk/) #============================================================================= # Copyright 2000-2009 Kitware, Inc., Insight Software Consortium. # Copyright 2009-2010 Mathieu Malaterre # Copyright 2010 Thomas Sondergaard # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # 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. # Neither the names of Kitware, Inc., the Insight Software Consortium, nor the # names of their contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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. #============================================================================= # # Written for VXL by Amitha Perera. # Upgraded for GDCM by Mathieu Malaterre. # Modified for EasyViz by Thomas Sondergaard. # Upgraded for DCMTK 3.6 by David Gobbi # if(NOT DCMTK_SOURCE_DIR OR NOT DCMTK_BINARY_DIR) if(NOT DCMTK_DIR) set(DCMTK_DIR DCMTK_DIR-NOTFOUND CACHE PATH "Root of DCMTK source/build tree (optional).") endif() if(NOT DCMTK_SOURCE_DIR) set(DCMTK_SOURCE_DIR ${DCMTK_DIR}) endif() if(NOT DCMTK_BINARY_DIR) set(DCMTK_BINARY_DIR ${DCMTK_DIR}) endif() endif() foreach(lib charls dcmdata dcmdsig dcmimage dcmimgle dcmjpeg dcmjpls dcmnet dcmpstat dcmqrdb dcmsr dcmtls dcmwlm i2d libi2d ijg12 ijg16 ijg8 oflog ofstd) if(WIN32) set(CONFIG_SUFFIXES Release Debug) endif() if(DCMTK_BINARY_DIR) find_library(DCMTK_${lib}_LIBRARY ${lib} PATHS ${DCMTK_BINARY_DIR}/${lib}/libsrc ${DCMTK_BINARY_DIR}/dcmdata/lib${lib} ${DCMTK_BINARY_DIR}/dcmdata/libi2d ${DCMTK_BINARY_DIR}/dcmsign/libsrc ${DCMTK_BINARY_DIR}/dcmjpeg/lib${lib} ${DCMTK_BINARY_DIR}/dcmjpls/lib${lib} ${DCMTK_BINARY_DIR}/${lib} ${DCMTK_BINARY_DIR}/lib PATH_SUFFIXES ${CONFIG_SUFFIXES} NO_DEFAULT_PATH) else() find_library(DCMTK_${lib}_LIBRARY ${lib}) endif() mark_as_advanced(DCMTK_${lib}_LIBRARY) if(DCMTK_${lib}_LIBRARY) list(APPEND DCMTK_LIBRARIES ${DCMTK_${lib}_LIBRARY}) endif() endforeach() set(DCMTK_config_TEST_HEADER osconfig.h) set(DCMTK_dcmdata_TEST_HEADER dctypes.h) set(DCMTK_dcmimage_TEST_HEADER dicoimg.h) set(DCMTK_dcmimgle_TEST_HEADER dcmimage.h) set(DCMTK_dcmjpeg_TEST_HEADER djdecode.h) set(DCMTK_dcmjpls_TEST_HEADER djcodecd.h) set(DCMTK_dcmnet_TEST_HEADER assoc.h) set(DCMTK_dcmpstat_TEST_HEADER dcmpstat.h) set(DCMTK_dcmqrdb_TEST_HEADER dcmqrdba.h) set(DCMTK_dcmsign_TEST_HEADER sicert.h) set(DCMTK_dcmsr_TEST_HEADER dsrtree.h) set(DCMTK_dcmtls_TEST_HEADER tlslayer.h) set(DCMTK_dcmwlm_TEST_HEADER wlds.h) set(DCMTK_oflog_TEST_HEADER syslogap.h) set(DCMTK_ofstd_TEST_HEADER ofstdinc.h) foreach(dir config dcmdata dcmimage dcmimgle dcmjpeg dcmjpls dcmnet dcmpstat dcmqrdb dcmsign dcmsr dcmtls dcmwlm oflog ofstd) find_path(DCMTK_${dir}_INCLUDE_DIR dcmtk/${dir}/${DCMTK_${dir}_TEST_HEADER} PATHS ${DCMTK_BINARY_DIR}/${dir}/include ${DCMTK_BINARY_DIR} ${DCMTK_SOURCE_DIR}/${dir}/include ${DCMTK_SOURCE_DIR}) mark_as_advanced(DCMTK_${dir}_INCLUDE_DIR) if(DCMTK_${dir}_INCLUDE_DIR) list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_${dir}_INCLUDE_DIR}) endif() endforeach() if(WIN32) list(APPEND DCMTK_LIBRARIES netapi32 wsock32) else() list(APPEND DCMTK_LIBRARIES z) endif() if(DCMTK_ofstd_INCLUDE_DIR) get_filename_component(DCMTK_dcmtk_INCLUDE_DIR ${DCMTK_ofstd_INCLUDE_DIR} PATH CACHE) list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_dcmtk_INCLUDE_DIR}) mark_as_advanced(DCMTK_dcmtk_INCLUDE_DIR) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DCMTK DEFAULT_MSG DCMTK_config_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_ofstd_LIBRARY DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmdata_LIBRARY DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmimgle_LIBRARY) # Compatibility: This variable is deprecated set(DCMTK_INCLUDE_DIR ${DCMTK_INCLUDE_DIRS}) foreach(executable dcmdump dcmdjpeg dcmdrle) string(TOUPPER ${executable} EXECUTABLE) find_program(DCMTK_${EXECUTABLE}_EXECUTABLE ${executable} ${DCMTK_BINARY_DIR}/bin) mark_as_advanced(DCMTK_${EXECUTABLE}_EXECUTABLE) endforeach() vtk-dicom-0.8.12/CMake/UseDICOM.cmake.in000066400000000000000000000024011356440565500174100ustar00rootroot00000000000000# This module is provided as DICOM_USE_FILE by DICOMConfig.cmake. It can # be INCLUDEd in a project to load the needed compiler and linker settings. if(NOT DICOM_USE_FILE_INCLUDED) set(DICOM_USE_FILE_INCLUDED 1) # Dependencies if(VTK_FOUND) include(${VTK_USE_FILE}) else() message(FATAL_ERROR "VTK not found in DICOM_VTK_DIR=\"${DICOM_VTK_DIR}\".") endif() if(NOT DICOM_BUILD_SHARED_LIBS) if(DICOM_USE_ITK_GDCM) if(ITK_FOUND) include(${ITK_USE_FILE}) else() message(FATAL_ERROR "ITK not found in DICOM_ITK_DIR=\"${DICOM_ITK_DIR}\"") endif() elseif(DICOM_USE_GDCM) if(GDCM_FOUND) include(${GDCM_USE_FILE}) else() message(FATAL_ERROR "GDCM not found in DICOM_GDCM_DIR=\"${DICOM_GDCM_DIR}\"") endif() endif() endif() # Update CMAKE_MODULE_PATH so includes work. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${DICOM_CMAKE_DIR}) # Add compiler flags needed to use DICOM. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DICOM_REQUIRED_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DICOM_REQUIRED_CXX_FLAGS}") # Add include directories needed to use DICOM. include_directories(${DICOM_INCLUDE_DIRS}) endif(NOT DICOM_USE_FILE_INCLUDED) vtk-dicom-0.8.12/CMake/pkgIndex.tcl.in000066400000000000000000000007141356440565500173600ustar00rootroot00000000000000package ifneeded @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR@.@VTK_VERSION_MINOR@ { set libPrefix "" if {$tcl_platform(platform) == "unix"} { set libPrefix "lib" } set libExt [info sharedlibextension] set libPath {@MODULE_TCL_PATH@} set libFile [file join ${libPath} ${libPrefix}@LIB_TCL_OUTPUT_NAME@${libExt}] if { [file exists ${libFile}] } { load ${libFile} package provide @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR@.@VTK_VERSION_MINOR@ } } vtk-dicom-0.8.12/CMake/vtkDICOMBuild.h.in000066400000000000000000000014021356440565500176070ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://www.cognitive-antics.net/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMBuild_h #define vtkDICOMBuild_h /* Source and Build version info. */ #define DICOM_SOURCE_VERSION "@DICOM_SOURCE_VERSION@" #define DICOM_BUILD_DATE "@DICOM_BUILD_DATE@" #define DICOM_BUILD_TIME "@DICOM_BUILD_TIME@" #endif vtk-dicom-0.8.12/CMake/vtkDICOMConfig.h.in000066400000000000000000000025011356440565500177560ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://www.cognitive-antics.net/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMConfig_h #define vtkDICOMConfig_h /* Configuration information. */ #cmakedefine DICOM_BUILD_SHARED_LIBS #cmakedefine DICOM_BUILD_TESTING #cmakedefine DICOM_USE_GDCM #cmakedefine DICOM_USE_DCMTK #cmakedefine DICOM_USE_SQLITE #cmakedefine DICOM_USE_VTKZLIB /* Version number. */ #define DICOM_MAJOR_VERSION @DICOM_MAJOR_VERSION@ #define DICOM_MINOR_VERSION @DICOM_MINOR_VERSION@ #define DICOM_PATCH_VERSION @DICOM_PATCH_VERSION@ #define DICOM_SHORT_VERSION "@DICOM_SHORT_VERSION@" #define DICOM_VERSION "@DICOM_VERSION@" /* Legacy (for backwards compatibility) */ #define DICOM_BUILD_VERSION DICOM_PATCH_VERSION /* To support 'override' for C++11 compilers */ #define VTK_DICOM_OVERRIDE@DICOM_OVERRIDE@ /* To support '=delete' for C++11 compilers */ #define VTK_DICOM_DELETE@DICOM_DELETE@ #endif vtk-dicom-0.8.12/CMake/vtkDICOMModule.h.in000066400000000000000000000005411356440565500200000ustar00rootroot00000000000000/* Export macros for shared libraries */ #ifndef vtkDICOMModule_h #define vtkDICOMModule_h #include "vtkABI.h" #include "vtkDICOMConfig.h" #if defined(DICOM_BUILD_SHARED_LIBS) # if defined(vtkDICOM_EXPORTS) # define VTKDICOM_EXPORT VTK_ABI_EXPORT # else # define VTKDICOM_EXPORT VTK_ABI_IMPORT # endif #else # define VTKDICOM_EXPORT #endif #endif vtk-dicom-0.8.12/CMake/vtkWrapHierarchy.cmake000066400000000000000000000132571356440565500210030ustar00rootroot00000000000000# # a cmake macro to generate a text file with the class hierarchy # macro(VTK_WRAP_HIERARCHY module_name OUTPUT_DIR SOURCES) if(NOT VTK_WRAP_HIERARCHY_EXE) if(TARGET vtkWrapHierarchy) set(VTK_WRAP_HIERARCHY_EXE vtkWrapHierarchy) else() message(SEND_ERROR "VTK_WRAP_HIERARCHY_EXE not specified when calling VTK_WRAP_HIERARCHY") endif() endif() # collect the common wrapper-tool arguments if(NOT CMAKE_VERSION VERSION_LESS 3.1 AND NOT VTK_VERSION VERSION_LESS 7.1) # write wrapper-tool arguments to a file set(_args_file ${module_name}Hierarchy.$.args) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_args_file} CONTENT " $<$>: -D\"$,\" -D\">\"> $<$>: -I\"$,\" -I\">\"> ") else() set(_common_args) get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS) foreach(TMP_DEF ${_def_list}) set(_common_args "${_common_args}-D${TMP_DEF}\n") endforeach() # all the include directories if(VTK_WRAP_INCLUDE_DIRS) set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS}) else() set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS}) endif() foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS}) set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n") endforeach() # write wrapper-tool arguments to a file set(_args_file ${module_name}Hierarchy.args) string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT) configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in ${_args_file} @ONLY) endif() # list of all files to wrap set(VTK_WRAPPER_INIT_DATA) # list of used files set(INPUT_FILES) # For each class foreach(FILE ${SOURCES}) # file properties to include in the hierarchy file get_property(TMP_WRAP_EXCLUDE SOURCE ${FILE} PROPERTY WRAP_EXCLUDE) get_source_file_property(TMP_ABSTRACT ${FILE} ABSTRACT) get_source_file_property(TMP_EXCLUDE_PYTHON ${FILE} WRAP_EXCLUDE_PYTHON) get_source_file_property(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL) # what is the filename without the extension get_filename_component(TMP_FILENAME ${FILE} NAME_WE) # get the absolute path to the file get_filename_component(TMP_FULLPATH ${FILE} ABSOLUTE) # get the directory get_filename_component(TMP_FILEPATH ${TMP_FULLPATH} PATH) # assume header file is in the same directory set(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h) # include all non-private headers in the hierarchy files set(TMP_EXCLUDE_FROM_HIERARCHY OFF) get_source_file_property(TMP_SKIP ${FILE} SKIP_HEADER_INSTALL) if(TMP_SKIP) set(TMP_EXCLUDE_FROM_HIERARCHY ON) endif() # ensure that header exists (assume it exists if it is marked as wrapped) if(TMP_WRAP_EXCLUDE) if(NOT EXISTS ${TMP_INPUT}) set(TMP_EXCLUDE_FROM_HIERARCHY ON) endif() endif() # Exclude this huge generated header file if("${TMP_FILENAME}" STREQUAL "vtkgl") set(TMP_EXCLUDE_FROM_HIERARCHY ON) endif() if(NOT TMP_EXCLUDE_FROM_HIERARCHY) # add to the INPUT_FILES list(APPEND INPUT_FILES ${TMP_INPUT}) # add the info to the init file set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${module_name}") if(TMP_ABSTRACT) set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};ABSTRACT") endif() if(TMP_WRAP_EXCLUDE) set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE") endif() if(TMP_EXCLUDE_PYTHON) set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE_PYTHON") endif() if(TMP_WRAP_SPECIAL) set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_SPECIAL") endif() set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA}\n") endif() endforeach() # finish the data file for the init file configure_file( ${VTK_CMAKE_DIR}/vtkWrapperInit.data.in ${module_name}Hierarchy.data @ONLY ) # search through the deps to find modules we depend on set(OTHER_HIERARCHY_FILES) # Don't use ${module_name}_DEPENDS. That list also includes COMPILE_DEPENDS, # which aren't library dependencies, merely dependencies for generators and # such. The dependecies specified under "DEPENDS" in the vtk_module(..) macro # call are located under _LINK_DEPENDS. if(NOT ${module_name}_WRAP_DEPENDS) set(${module_name}_WRAP_DEPENDS ${${module_name}_LINK_DEPENDS}) endif() foreach(dep ${${module_name}_WRAP_DEPENDS}) if(NOT "${module_name}" STREQUAL "${dep}") if(NOT ${dep}_EXCLUDE_FROM_WRAPPING) list(APPEND OTHER_HIERARCHY_FILES "${${dep}_WRAP_HIERARCHY_FILE}") endif() endif() endforeach() add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt ${OUTPUT_DIR}/${module_name}Hierarchy.txt COMMAND ${VTK_WRAP_HIERARCHY_EXE} @${_args_file} -o ${OUTPUT_DIR}/${module_name}Hierarchy.txt ${module_name}Hierarchy.data ${OTHER_HIERARCHY_FILES} COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt COMMENT "For ${module_name} - updating ${module_name}Hierarchy.txt" DEPENDS ${VTK_WRAP_HIERARCHY_EXE} ${CMAKE_CURRENT_BINARY_DIR}/${_args_file} ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.data ${OTHER_HIERARCHY_FILES} ${INPUT_FILES} VERBATIM ) add_custom_target(${module_name}Hierarchy DEPENDS ${OUTPUT_DIR}/${module_name}Hierarchy.stamp.txt) endmacro() vtk-dicom-0.8.12/CMakeLists.txt000066400000000000000000000365461356440565500162720ustar00rootroot00000000000000# for CMake 3, add VERSION X.Y.Z to set the version here project(DICOM) # CMake version requirements cmake_minimum_required(VERSION 2.8.7) # Allow custom cmake overrides set(DICOM_CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CMake) set(CMAKE_MODULE_PATH ${DICOM_CMAKE_DIR} ${CMAKE_MODULE_PATH}) # Use ctest for dashboard submissions include(CTest) # Project version set(DICOM_MAJOR_VERSION 0) set(DICOM_MINOR_VERSION 8) set(DICOM_PATCH_VERSION 12) set(DICOM_SHORT_VERSION "${DICOM_MAJOR_VERSION}.${DICOM_MINOR_VERSION}") set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_PATCH_VERSION}") # Generic project version variables (forwards compatibility with CMake 3) set(PROJECT_MAJOR_VERSION ${DICOM_MAJOR_VERSION}) set(PROJECT_MINOR_VERSION ${DICOM_MINOR_VERSION}) set(PROJECT_PATCH_VERSION ${DICOM_PATCH_VERSION}) set(PROJECT_VERSION ${DICOM_VERSION}) # Include directories set(DICOM_INCLUDE_DIRS "${DICOM_SOURCE_DIR}/Source" "${DICOM_BINARY_DIR}/Source") # Is this CMakeLists.txt file being called directly by cmake? if("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") set(_dicom_direct_build ON) else() set(_dicom_direct_build OFF) endif() set(DICOM_EXTERNAL_BUILD ${_dicom_direct_build} CACHE BOOL "Building DICOM module external to the VTK build") mark_as_advanced(DICOM_EXTERNAL_BUILD) if(DEFINED VTK_MODULE_ENABLE_VTK_DICOM AND NOT DICOM_EXTERNAL_BUILD) # When building as a remote module for VTK 9 (or VTK 8.90+) message(STATUS "vtkDICOM: Building vtkDICOM as a Remote VTK Module") # Clear VTK_LIBS, linking will be handled by modular build set(VTK_LIBS) set(VTK_DICOM_LINK_TARGET VTK::DICOM) # To set DICOM_USE_VTKZLIB in vtkDICOMConfig.h set(DICOM_USE_VTKZLIB ON) option(BUILD_DICOM_PROGRAMS "Build the vtkDICOM tools" OFF) option(BUILD_DICOM_EXAMPLES "Build the vtkDICOM examples" OFF) set(BUILD_PROGRAMS ${BUILD_DICOM_PROGRAMS}) set(BUILD_EXAMPLES ${BUILD_DICOM_EXAMPLES}) elseif(Module_vtkDICOM) # When building as a remote module for older versions of VTK message(STATUS "vtkDICOM: Building vtkDICOM as a Remote VTK Module") set(vtkDICOM_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Source) set(vtkDICOM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/Source) vtk_module_impl() # Clear VTK_LIBS, linking will be handled by modular build set(VTK_LIBS) set(VTK_DICOM_LINK_TARGET vtkDICOM) # To set DICOM_USE_VTKZLIB in vtkDICOMConfig.h set(DICOM_USE_VTKZLIB ON) option(BUILD_DICOM_PROGRAMS "Build the vtkDICOM tools" ON) option(BUILD_DICOM_EXAMPLES "Build the vtkDICOM examples" OFF) set(BUILD_PROGRAMS ${BUILD_DICOM_PROGRAMS}) set(BUILD_EXAMPLES ${BUILD_DICOM_EXAMPLES}) else() # When building external to VTK message(STATUS "vtkDICOM: Building vtkDICOM outside of VTK") # Find VTK and get VTK configuration information find_package(VTK REQUIRED) # define VTK_VERSION if not already defined if(NOT DEFINED VTK_VERSION) set(VTK_VERSION ${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}) endif() if(VTK_VERSION VERSION_LESS 8.90) include(${VTK_USE_FILE}) endif() if(VTK_VERSION VERSION_LESS 5.8) message(FATAL_ERROR "VTK 5.8 or later is required.") endif() # We are being built as a stand-alone package set(VTK_DICOM_LINK_TARGET vtkDICOM) # When CMake 3.0.0 is required, remove this block (see CMP0042). if(NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH 0) endif() option(BUILD_SHARED_LIBS "Build shared libraries." OFF) # Which parts of the package to build option(BUILD_TESTING "Build the tests" OFF) option(BUILD_PROGRAMS "Build some useful DICOM tools" ON) option(BUILD_EXAMPLES "Build the examples" OFF) # Wrap Python option if(VTK_WRAP_PYTHON) option(BUILD_PYTHON_WRAPPERS "Build python wrappers" ON) else() unset(BUILD_PYTHON_WRAPPERS CACHE) endif() # Wrap Tcl option if(VTK_WRAP_TCL) option(BUILD_TCL_WRAPPERS "Build tcl wrappers" ON) else() unset(BUILD_TCL_WRAPPERS CACHE) endif() # Wrap Java option if(VTK_WRAP_JAVA) option(BUILD_JAVA_WRAPPERS "Build java wrappers" OFF) else() unset(BUILD_JAVA_WRAPPERS CACHE) endif() # Defines CMAKE_INSTALL_LIBDIR etcetera include(GNUInstallDirs) # Set up our directory structure for output libraries and binaries # (Note: these are the build locations, not the install locations) if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${DICOM_BINARY_DIR}/bin") endif() if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) if(UNIX) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${DICOM_BINARY_DIR}/lib") else() set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${DICOM_BINARY_DIR}/bin") endif() endif() if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${DICOM_BINARY_DIR}/lib") endif() # Check if VTK set VTK_ZLIB_LIBRARIES if(NOT VTK_ZLIB_LIBRARIES) # VTK 6 doesn't set it, so search for vtkzlib directly list(FIND VTK_LIBRARIES vtkzlib TMP_INDEX) if(TMP_INDEX GREATER -1) set(VTK_ZLIB_LIBRARIES vtkzlib) endif() endif() set(DICOM_USE_VTKZLIB OFF) if(VTK_ZLIB_LIBRARIES) set(DICOM_USE_VTKZLIB ON) set(ZLIB_LIBS ${VTK_ZLIB_LIBRARIES}) endif() # Look for zlib if(NOT DICOM_USE_VTKZLIB) find_package(ZLIB REQUIRED) if(ZLIB_FOUND) set(ZLIB_LIBS ${ZLIB_LIBRARIES}) include_directories("${ZLIB_INCLUDE_DIR}") endif() endif() if(NOT VTK_VERSION VERSION_LESS 8.90) # When building as a stand-alone module for VTK 9 message(STATUS "vtkDICOM: Building as an External VTK Module") # Clear VTK_LIBS, linking will be handled by modular build set(VTK_LIBS) set(VTK_DICOM_LINK_TARGET VTK::DICOM) # To set DICOM_USE_VTKZLIB in vtkDICOMConfig.h set(DICOM_USE_VTKZLIB ON) vtk_module_scan( MODULE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/Source/dicom.module" REQUEST_MODULES "VTK::DICOM" PROVIDES_MODULES dicom_modules ENABLE_TESTS "${BUILD_TESTING}") vtk_module_build( MODULES ${dicom_modules} INSTALL_EXPORT DICOM ARCHIVE_DESTINATION "lib" HEADERS_DESTINATION "include/dicom${DICOM_SHORT_VERSOIN}" CMAKE_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/vtk" LICENSE_DESTINATION "${CMAKE_INSTALL_LIBDIR}/vtk" HIERARCHY_DESTINATION "${CMAKE_INSTALL_LIBDIR}/vtk/hierarchy/${CMAKE_PROJECT_NAME}" LIBRARY_NAME_SUFFIX "${DICOM_CUSTOM_LIBRARY_SUFFIX}" VERSION "${DICOM_VERSION}" SOVERSION "1" TEST_DATA_TARGET DicomData USE_EXTERNAL "${DICOM_USE_EXTERNAL}" TEST_INPUT_DATA_DIRECTORY "${dicom_test_data_directory_input}" TEST_OUTPUT_DATA_DIRECTORY "${dicom_test_data_directory_output}") if(BUILD_PYTHON_WRAPPERS) find_package(PythonInterp ${VTK_PYTHON_VERSION} QUIET) vtk_module_wrap_python( MODULES ${dicom_modules} INSTALL_EXPORT DICOMPython PYTHON_PACKAGE "vtk.modules" #MODULE_DESTINATION "" CMAKE_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/vtk" LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}" BUILD_STATIC OFF) endif() if(BUILD_JAVA_WRAPPERS) vtk_module_wrap_java( MODULES ${dicom_modules} WRAPPED_MODULES dicom_java_wrapped_modules JAVA_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles") endif() endif() #(NOT VTK_VERSION VERSION_LESS 8.90) endif() # Store the git hash of the current head if(EXISTS "${DICOM_SOURCE_DIR}/.git/HEAD") file(READ "${DICOM_SOURCE_DIR}/.git/HEAD" DICOM_SOURCE_VERSION) if("${DICOM_SOURCE_VERSION}" MATCHES "^ref:") string(REGEX REPLACE "^ref: *([^ \n\r]*).*" "\\1" DICOM_GIT_REF "${DICOM_SOURCE_VERSION}") file(READ "${DICOM_SOURCE_DIR}/.git/${DICOM_GIT_REF}" DICOM_SOURCE_VERSION) endif() string(STRIP "${DICOM_SOURCE_VERSION}" DICOM_SOURCE_VERSION) endif() # Store the build date if(WIN32) # execute_process(COMMAND "cmd" " /c date /t" OUTPUT_VARIABLE DATE) # string(REGEX REPLACE "[^0-9]*(..).*" "\\1" MONTH "${DATE}") # set(MONTHS "" # "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec") # list(GET MONTHS "${MONTH}" MONTH) # string(REGEX REPLACE "[^/]*/(..)/(....).*" "\\1 ${MONTH} \\2" # DICOM_BUILD_DATE "${DATE}") # execute_process(COMMAND "cmd" " /c echo %TIME%" OUTPUT_VARIABLE TIME) # string(REGEX REPLACE "[^0-9]*(..:..:..).*" "\\1" # DICOM_BUILD_TIME "${TIME}") else() execute_process(COMMAND "date" "+%d %b %Y/%H:%M:%S" OUTPUT_VARIABLE DATE_TIME) string(REGEX REPLACE "([^/]*)/.*" "\\1" DICOM_BUILD_DATE "${DATE_TIME}") string(REGEX REPLACE "[^/]*/([0-9:]*).*" "\\1" DICOM_BUILD_TIME "${DATE_TIME}") endif() if(Module_vtkDICOM) set(DICOM_BIN_DIR ${VTK_INSTALL_RUNTIME_DIR}) set(DICOM_LIB_DIR ${VTK_INSTALL_LIBRARY_DIR}) set(DICOM_ARC_DIR ${VTK_INSTALL_ARCHIVE_DIR}) set(DICOM_INC_DIR ${VTK_INSTALL_INCLUDE_DIR}) endif() # Set up our target directory structure for "make install" set(DICOM_BIN_DIR "bin") # for executables and ".dll" libraries if(NOT DICOM_LIB_DIR) set(DICOM_LIB_DIR "lib") # for unix/linux/osx shared libraries endif() if(NOT DICOM_ARC_DIR) set(DICOM_ARC_DIR "${DICOM_LIB_DIR}") # for static or ".lib" libraries endif() if(NOT DICOM_INC_DIR) set(DICOM_INC_DIR "include") # for header files endif() if(NOT DICOM_TCL_DIR) set(DICOM_TCL_DIR "lib/tcltk/dicom-${DICOM_SHORT_VERSION}") endif() if(NOT DICOM_JAVA_DIR) set(DICOM_JAVA_DIR "share/java") endif() if(NOT DICOM_DATA_DIR) set(DICOM_DATA_DIR "share/dicom-${DICOM_SHORT_VERSION}") endif() if(NOT DICOM_PGK_DIR) set(DICOM_PGK_DIR "${DICOM_LIB_DIR}/dicom-${DICOM_SHORT_VERSION}/cmake") endif() # Set the full paths to the install tree set(DICOM_RUNTIME_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_BIN_DIR}) set(DICOM_LIBRARY_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_LIB_DIR}) set(DICOM_ARCHIVE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_ARC_DIR}) set(DICOM_INCLUDE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_INC_DIR}) set(DICOM_TCL_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_TCL_DIR}) set(DICOM_JAVA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_JAVA_DIR}) set(DICOM_DATA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_DATA_DIR}) set(DICOM_CMAKE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_PGK_DIR}) if(NOT Module_vtkDICOM) # Libraries set(DICOM_LIBRARIES vtkDICOM) # The library dependencies if(NOT VTK_VERSION VERSION_LESS 6) set(VTK_TARGET_PREFIX "VTK::") if(VTK_VERSION VERSION_LESS 8.90) set(VTK_TARGET_PREFIX "vtk") endif() set(VTK_LIBS) # required libraries foreach(_lib CommonCore CommonMisc CommonDataModel ImagingCore IOCore IOImage) list(APPEND VTK_LIBS ${VTK_TARGET_PREFIX}${_lib}) endforeach() # factory libraries (only needed if present) foreach(_lib IOMPIImage) list(FIND VTK_LIBRARIES ${VTK_TARGET_PREFIX}${_lib} _index) if(_index GREATER -1) list(APPEND VTK_LIBS ${VTK_TARGET_PREFIX}${_lib}) endif() endforeach() else() set(VTK_LIBS vtkCommon vtkFiltering vtkImaging vtkIO vtkInfovis) # VTK 5.x endif() endif() if(NOT Module_vtkDICOM AND VTK_VERSION VERSION_LESS 8.90) # External wrapping previous to VTK 9 set(VTK_WRAP_INCLUDE_DIRS ${DICOM_INCLUDE_DIRS} ${VTK_WRAP_INCLUDE_DIRS}) # For the python wrappers if(BUILD_PYTHON_WRAPPERS) if(TARGET vtkCommonCorePythonD OR TARGET vtkCommonKitPythonD OR TARGET vtkCommonPythonD) set(DICOM_PYTHON_LIBRARIES vtkDICOMPythonD) endif() endif() # For the tcl wrappers if(BUILD_TCL_WRAPPERS) find_package(TCL REQUIRED) set(DICOM_TCL_LIBRARIES vtkDICOMTCL) endif() # For the java wrappers if(BUILD_JAVA_WRAPPERS) find_package(Java REQUIRED) find_package(JNI REQUIRED) if(NOT VTK_JAVA_SOURCE_VERSION) set(VTK_JAVA_SOURCE_VERSION "1.6" CACHE STRING "javac source version") mark_as_advanced(VTK_JAVA_SOURCE_VERSION) endif() if(NOT VTK_JAVA_TARGET_VERSION) set(VTK_JAVA_TARGET_VERSION "1.6" CACHE STRING "javac target version") mark_as_advanced(VTK_JAVA_TARGET_VERSION) endif() if(APPLE) set(JAVAC_OPTIONS -J-Xmx512m) endif() if(NOT VTK_JAR_PATH) set(VTK_JAR_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") endif() find_file(VTK_JAVA_JAR NAMES vtk.jar vtk6.jar vtk5.jar PATHS ${vtkWrappingJava_RUNTIME_LIBRARY_DIRS}) if(NOT VTK_JAVA_JAR) message(FATAL_ERROR "VTK_JAVA_JAR must be set to the location of vtk.jar") endif() set(DICOM_JAVA_LIBRARIES vtkDICOMJava) endif() endif() # NOT Module_vtkDICOM) # Disable C and C++ deprecation warnings for MSVC 2005 and later if(MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400 OR MSVC10) add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS) endif() if(NOT DICOM_EXTERNAL_BUILD OR NOT DEFINED VTK_MODULE_ENABLE_VTK_DICOM) # The main library, if not handled by the VTK 9 functions add_subdirectory(Source) endif() # Subdirectories if(BUILD_PROGRAMS) add_subdirectory(DicomCli) add_subdirectory(Programs) endif() if(BUILD_EXAMPLES) add_subdirectory(Examples) endif() if(DICOM_EXTERNAL_BUILD OR NOT DEFINED VTK_MODULE_ENABLE_VTK_DICOM) if(BUILD_TESTING) enable_testing() add_subdirectory(Testing) endif() # Install files install(FILES Copyright.txt DESTINATION ${DICOM_DATA_INSTALL_DEST}) endif() if(NOT Module_vtkDICOM AND NOT DEFINED VTK_MODULE_ENABLE_VTK_DICOM) #--------------------------------------------------- # Export information for other projects # Add all targets to the build-tree export set export(TARGETS ${DICOM_LIBRARIES} ${DICOM_PYTHON_LIBRARIES} ${DICOM_JAVA_LIBRARIES} FILE "${DICOM_BINARY_DIR}/DICOMTargets.cmake") # Export the package for use from the build-tree # (this registers the build-tree with a global CMake-registry) export(PACKAGE DICOM) # Create the DICOMConfig.cmake and DICOMConfigVersion.cmake files # ... for the build tree set(INCLUDE_DIRS_CONFIG ${DICOM_INCLUDE_DIRS}) set(LIBRARY_DIRS_CONFIG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") configure_file(CMake/DICOMConfig.cmake.in "${DICOM_BINARY_DIR}/DICOMConfig.cmake" @ONLY) # ... for the install tree file(RELATIVE_PATH REL_INCLUDE_DIR "${DICOM_CMAKE_INSTALL_DEST}" "${DICOM_INCLUDE_INSTALL_DEST}") set(INCLUDE_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_INCLUDE_DIR}") file(RELATIVE_PATH REL_LIBRARY_DIR "${DICOM_CMAKE_INSTALL_DEST}" "${DICOM_LIBRARY_INSTALL_DEST}") set(LIBRARY_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_LIBRARY_DIR}") configure_file(CMake/DICOMConfig.cmake.in "${DICOM_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DICOMConfig.cmake" @ONLY) # ... for both configure_file(CMake/DICOMConfigVersion.cmake.in "${DICOM_BINARY_DIR}/DICOMConfigVersion.cmake" @ONLY) # Install the DICOMConfig.cmake and DICOMConfigVersion.cmake install(FILES "${DICOM_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DICOMConfig.cmake" "${DICOM_BINARY_DIR}/DICOMConfigVersion.cmake" DESTINATION "${DICOM_CMAKE_INSTALL_DEST}" COMPONENT Development) # Install the Use file in the build and install directories configure_file(${DICOM_SOURCE_DIR}/CMake/UseDICOM.cmake.in ${DICOM_BINARY_DIR}/UseDICOM.cmake COPYONLY IMMEDIATE) install(FILES "${DICOM_BINARY_DIR}/UseDICOM.cmake" DESTINATION "${DICOM_CMAKE_INSTALL_DEST}" COMPONENT Development) # Install the export set for use with the install-tree install(EXPORT DICOMTargets DESTINATION "${DICOM_CMAKE_INSTALL_DEST}" COMPONENT Development) endif() vtk-dicom-0.8.12/CTestConfig.cmake000066400000000000000000000005561356440565500166740ustar00rootroot00000000000000set(CTEST_PROJECT_NAME "vtk-dicom") set(CTEST_NIGHTLY_START_TIME "00:00:00 UTC") if(NOT DEFINED CTEST_DROP_METHOD) SET(CTEST_DROP_METHOD "http") endif() if(CTEST_DROP_METHOD STREQUAL "http") set(CTEST_DROP_METHOD "http") set(CTEST_DROP_SITE "my.cdash.org") set(CTEST_DROP_LOCATION "/submit.php?project=vtk-dicom") set(CTEST_DROP_SITE_CDASH TRUE) endif() vtk-dicom-0.8.12/Copyright.txt000066400000000000000000000027141356440565500162310ustar00rootroot00000000000000Copyright (c) 2012-2019 David Gobbi All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of David Gobbi nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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. vtk-dicom-0.8.12/DicomCli/000077500000000000000000000000001356440565500151775ustar00rootroot00000000000000vtk-dicom-0.8.12/DicomCli/CMakeLists.txt000066400000000000000000000006311356440565500177370ustar00rootroot00000000000000if(POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() include_directories(${DICOM_INCLUDE_DIRS}) set(LIB_NAME dicomcli) if(WIN32) set(MAINMACRO_SRC mainmacro.cxx) else() set(MAINMACRO_SRC) endif() set(LIB_SRCS ${MAINMACRO_SRC} readquery.cxx progress.cxx vtkConsoleOutputWindow.cxx ) add_library(${LIB_NAME} STATIC ${LIB_SRCS}) target_link_libraries(${LIB_NAME} ${VTK_DICOM_LINK_TARGET}) vtk-dicom-0.8.12/DicomCli/mainmacro.cxx000066400000000000000000000316371356440565500177030ustar00rootroot00000000000000/*========================================================================= Copyright (c) 2015,2016 David Gobbi All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of David Gobbi nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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 "mainmacro.h" #include #ifdef _WIN32 #include #endif // A struct to arguments converted from UTF-16 to UTF-8. #ifdef _WIN32 namespace { class Arguments { public: // Construct with an empty argument list, set console code page to UTF-8. Arguments(); // Destruct by freeing the memory and restoring the origin code page. ~Arguments(); // Add the next arg (this is called by ExpandArgs). void Push(wchar_t *arg); // Expand args, result can be retrieved with GetArgc, GetArgv. bool ExpandArgs(int argc, wchar_t *argv[], const char *passthrough); // Get the argc and argv for the args. int GetArgc() { return m_Argc; } char **GetArgv() { return m_Argv; } private: // Check if the given string matches the given wildcard pattern. static bool MatchesSpec( const wchar_t *val, size_t vl, const wchar_t *spec, size_t pl); // Get the power of two equal or greater than n. static size_t NearestPowerOfTwo(size_t n) { size_t m = ((n > 0) ? n - 1 : 0); m |= m >> 1; m |= m >> 2; m |= m >> 4; m |= m >> 8; m |= m >> 16; #ifdef _WIN64 m |= m >> 32; #endif return m + 1; } // Check if n is a power of two. static bool IsPowerOfTwo(size_t n) { return (n > 0 && (n & (n - 1)) == 0); } // Create a string of length n and add it to the given array. template static T *NewString(size_t n, int *count, T ***strings) { T **array = *strings; (*count)++; if (array == 0) { size_t m = NearestPowerOfTwo(n); array = new T *[2]; array[0] = new T[m]; *strings = array; } else { if (IsPowerOfTwo(*count)) { T **newarray = new T *[*count * 2]; for (int i = 0; i < *count; i++) { newarray[i] = array[i]; } delete [] array; array = newarray; *strings = array; } size_t m = array[*count - 1] - array[0]; if (m + n > NearestPowerOfTwo(m)) { T *cp = new T[NearestPowerOfTwo(m + n)]; T *oldcp = array[0]; for (size_t j = 0; j < m; j++) { cp[j] = oldcp[j]; } for (int i = 0; i < *count; i++) { array[i] = cp + (array[i] - oldcp); } delete [] oldcp; } } array[*count] = array[*count - 1] + n; return array[*count - 1]; } // Delete the array of strings. template static void FreeStrings(int *count, T ***strings) { if (*strings) { delete [] **strings; delete [] *strings; } *count = 0; *strings = 0; } int m_Argc; char **m_Argv; UINT m_CodePage; }; Arguments::Arguments() : m_Argc(0), m_Argv(0) { // Save the current code page, then set code page to UTF-8 m_CodePage = GetConsoleOutputCP(); SetConsoleOutputCP(65001); } Arguments::~Arguments() { FreeStrings(&m_Argc, &m_Argv); // Restore the old code page SetConsoleOutputCP(m_CodePage); } bool Arguments::MatchesSpec( const wchar_t *val, size_t vl, const wchar_t *spec, size_t sl) { // convert to lower case for case insensitivity wchar_t val_lower[MAX_PATH]; wchar_t spec_lower[MAX_PATH]; if (vl < MAX_PATH && sl < MAX_PATH) { for (size_t i = 0; i < vl; i++) { val_lower[i] = val[i]; } for (size_t i = 0; i < sl; i++) { spec_lower[i] = spec[i]; } if (CharLowerBuffW(val_lower, static_cast(vl)) == vl && CharLowerBuffW(spec_lower, static_cast(sl)) == sl) { // if successful, use the lower-case strings spec = spec_lower; val = val_lower; } } // get pointers to the end of the strings const wchar_t *cp = spec; const wchar_t *ep = spec + sl; const wchar_t *dp = val; const wchar_t *fp = val + vl; while (cp != ep && dp != fp) { if (*cp == '*') { cp++; // if '*' is the final character, it matches the remainder of val if (cp == ep) { dp = fp; } else { while (dp != fp) { if (*cp == '?' || *dp == *cp) { // check if the remainder of val matches remainder of spec if (MatchesSpec(dp, fp-dp, cp, ep-cp)) { break; } } // else let the "*" eat one more codepoint of "val" if ((*dp++ & 0xFC00) == 0xD800) { if (dp != fp && (*dp & 0xFC00) == 0xDC00) { dp++; } } } } } else if (*cp == '?') { // the '?' matches a whole codepoint, not just one wchar cp++; if ((*dp++ & 0xFC00) == 0xD800) { if (dp != fp && (*dp & 0xFC00) == 0xDC00) { dp++; } } } else if (*cp == *dp) { // make sure the entire codepoint matches cp++; if ((*dp++ & 0xFC00) == 0xD800) { if (cp != ep && dp != fp && ((*cp & 0xFC00) == 0xDC00 || (*dp & 0xFC00) == 0xDC00)) { if (*dp != *cp) { return false; } cp++; dp++; } } } else { return false; } } // skip over any remaining '*' wildcards while (cp != ep && *cp == '*') { cp++; } // make sure we've reached the end of both the spec and the value return (cp == ep && dp == fp); } void Arguments::Push(wchar_t *arg) { int n = WideCharToMultiByte( CP_UTF8, 0, arg, -1, NULL, 0, NULL, NULL); char *cp = NewString(n, &m_Argc, &m_Argv); WideCharToMultiByte( CP_UTF8, 0, arg, -1, cp, n, NULL, NULL); } bool Arguments::ExpandArgs(int argc, wchar_t *argv[], const char *passthrough) { WIN32_FIND_DATAW data; wchar_t *temp = 0; size_t tempsize = 0; bool expand_wildcards = true; for (int i = 0; i < argc; i++) { // for storing segments of the path that have wildcards int dirstart = 0; int dircount = 0; wchar_t **directories = 0; // check for wildcards bool has_wildcard = false; bool segment_has_wildcard = false; bool wildcard_expanded = false; bool path_is_complete = false; wchar_t *dp = argv[i]; for (wchar_t *cp = dp; !path_is_complete; cp++) { if (expand_wildcards && (*cp == '\?' || *cp == '*')) { has_wildcard = true; segment_has_wildcard = true; } else if (*cp == '\\' || *cp == '/' || *cp == 0) { path_is_complete = (*cp == 0); // If path has a wildcard push all matching dirs onto a list. if (has_wildcard) { // Check if directory list is empty. if (dircount == 0) { // Push path segment (argv[i]..dp) onto the directory list. size_t l = dp - argv[i]; wchar_t *ep = NewString(l, &dircount, &directories); for (size_t j = 0; j < l; j++) { ep[j] = argv[i][j]; } } // Get the length of the path segment. size_t m = cp - dp; int prevcount = dircount; for (int k = dirstart; k < prevcount; k++) { // Length of the directory (including the "/"). size_t l = directories[k + 1] - directories[k]; if (l+m+1 > tempsize) { tempsize = l+m+9; delete [] temp; temp = new wchar_t[tempsize]; } for (size_t j = 0; j < l; j++) { temp[j] = directories[k][j]; } for (size_t j = 0; j < m; j++) { temp[l+j] = dp[j]; } temp[l+m] = 0; // Find all existing directories. HANDLE hFile = FindFirstFileW(temp, &data); if (hFile != INVALID_HANDLE_VALUE) { do { if (!path_is_complete && (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { // A directory was expected continue; } if (data.cFileName[0] == '.' && (data.cFileName[1] == 0 || (data.cFileName[1] == '.' && data.cFileName[2] == 0))) { // The found file was '.' or '..' continue; } if (data.cFileName[0] == '.' && dp[0] != '.') { // The found file began with '.' but the filespec did not. continue; } // Append wildcard result to the directory. wchar_t *result; size_t n = 0; while (n < MAX_PATH && data.cFileName[n] != 0) { n++; } // Ensure that the true filename matches the wildcards. // (FindFirstFile, FindNextFile also match short filename) if (!MatchesSpec(data.cFileName, n, dp, cp-dp)) { continue; } if (path_is_complete) { // Expand into temporary string if path is complete. if (l+n+1 > tempsize) { tempsize = l+n+9; delete [] temp; temp = new wchar_t[tempsize]; } result = temp; } else { // Add result to directory list if path is not complete yet. result = NewString(l+n+1, &dircount, &directories); } for (size_t j = 0; j < l; j++) { result[j] = directories[k][j]; } for (size_t j = 0; j < n; j++) { result[l+j] = data.cFileName[j]; } result[l+n] = *cp; // Push result onto the args if path is complete. if (path_is_complete) { Push(result); wildcard_expanded = true; } } while (FindNextFileW(hFile, &data)); FindClose(hFile); } } dirstart = prevcount; } dp = cp + 1; } } // If no expansion could be done, push the argument as-is. if (!wildcard_expanded) { Push(argv[i]); if (passthrough) { expand_wildcards = true; // Check the arg against the expansion exclusion list. const char *arg = m_Argv[m_Argc-1]; const char *ex = passthrough; while (*ex == ' ' || *ex == '\t') { ex++; } while (*ex != '\0') { const char *ee = ex; while (*ee != '\0' && *ee != ' ' && *ee != '\t') { ee++; } while (*arg != '\0' && ex != ee && *ex == *arg) { ex++; arg++; } if (*arg == '\0' && ex == ee) { // Do not expand wildcards in the next arg. expand_wildcards = false; break; } ex = ee; while (*ex == ' ' || *ex == '\t') { ex++; } } } } FreeStrings(&dircount, &directories); } delete [] temp; return true; } } // namespace // A static variable to hold the arguments (will destruct on exit). static Arguments mainmacro_arguments; #endif /* _WIN32 */ // The function, with special definition for Windows. #ifdef _WIN32 bool mainmacro_expandargs( int argc, wchar_t *argv[], int *argc_p, char ***argv_p, const char *passthrough) { if (mainmacro_arguments.ExpandArgs(argc, argv, passthrough)) { *argc_p = mainmacro_arguments.GetArgc(); *argv_p = mainmacro_arguments.GetArgv(); return true; } return false; } #endif vtk-dicom-0.8.12/DicomCli/mainmacro.h000066400000000000000000000061301356440565500173160ustar00rootroot00000000000000/*========================================================================= Copyright (c) 2015,2016 David Gobbi All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of David Gobbi nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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. =========================================================================*/ #ifndef mainmacro_h #define mainmacro_h #ifdef _WIN32 #include #endif //! Expand command line arguments for Windows command line. /*! * This will expand any wildcards in the arguments, and is only applied * on Windows because UNIX shells do wildcard expansion by themselves. */ #ifdef _WIN32 bool mainmacro_expandargs( int wargc, wchar_t *wargv[], int *argc_p, char ***argv_p, const char *passthrough); #endif //! Supply a list of options for which wildcards should be passed through. /*! * The command-line argument that follows any of the options that are * passed to this macro will not be expanded if they include wildcards. * Instead, the wildcards will be passed through to main(). */ //! This is the macro for specifying the passthrough options, if any. #ifdef _WIN32 #define MAINMACRO_PASSTHROUGH(opts) \ inline const char *mainmacro_passthrough(int) { return #opts; } inline const char *mainmacro_passthrough(float) { return 0; } #else #define MAINMACRO_PASSTHROUGH(opts) #endif //! A macro to use wmain on Windows. #ifdef _WIN32 #define MAINMACRO(a, b) \ main_with_utf8_args(a, b); \ int wmain(int wargc, wchar_t *wargv[]) \ { \ int argc = 0; \ char **argv = 0; \ mainmacro_expandargs(wargc, wargv, &argc, &argv, \ mainmacro_passthrough(1)); \ return main_with_utf8_args(argc, argv); \ } \ int main_with_utf8_args(a, b) #else #define MAINMACRO(a, b) \ main(a, b) #endif #endif /* mainmacro_h */ vtk-dicom-0.8.12/DicomCli/progress.cxx000066400000000000000000000036241356440565500175740ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "progress.h" #include "vtkDICOMUtilities.h" void ProgressObserver::Execute(vtkObject *, unsigned long e, void *vp) { const double initial = 2.0; // time until first report const double delta = 0.1; // time between reports double t = 1e-6*vtkDICOMUtilities::GetUTC(NULL); if (e == vtkCommand::StartEvent) { this->LastTime = t; this->Stage = 0; this->Anim = 0; } else if (e == vtkCommand::ProgressEvent) { double *dp = static_cast(vp); int progress = static_cast((*dp)*100.0 + 0.5); if (this->Stage == 0) { if (t - this->LastTime > initial) { std::cout << "\r "; this->Stage = 1; } } if (t - this->LastTime > delta) { if (this->Stage == 1) { if (progress == 0) { const char *dots[] = { ". ", ".. ", "..." }; this->Anim = (this->Anim + 1) % 3; std::cout << "\r" << this->Text << dots[this->Anim]; std::cout.flush(); this->LastTime = t; } else { std::cout << "\r" << this->Text << " " << progress << "%"; std::cout.flush(); this->LastTime = t; } } } } else if (e == vtkCommand::EndEvent) { if (this->Stage > 0) { std::cout << "\r" << this->Text << " 100%"; std::cout << std::endl; } } } vtk-dicom-0.8.12/DicomCli/progress.h000066400000000000000000000023321356440565500172140ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef progress_h #define progress_h #include "vtkCommand.h" #include "vtkDICOMConfig.h" // Capture progress events class ProgressObserver : public vtkCommand { public: static ProgressObserver *New() { return new ProgressObserver; } vtkTypeMacro(ProgressObserver,vtkCommand); void Execute( vtkObject *caller, unsigned long eventId, void *callData) VTK_DICOM_OVERRIDE; void SetText(const char *text) { this->Text = text; } protected: ProgressObserver() : Stage(0), Anim(0), LastTime(0), Text("") {} ProgressObserver(const ProgressObserver& c) : vtkCommand(c) {} void operator=(const ProgressObserver&) {} int Stage; int Anim; double LastTime; const char *Text; }; #endif /* progress_h */ vtk-dicom-0.8.12/DicomCli/readquery.cxx000066400000000000000000000413241356440565500177300ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "readquery.h" #include "vtkDICOMFile.h" #include "vtkDICOMSequence.h" #include "vtkDICOMDictionary.h" #include #include #include #include #ifdef _WIN32 #include #endif typedef vtkDICOMVR VR; namespace { // A class for reading a text file line-by-line. // It uses its own buffer, since the file is unbuffered. class LineReader { public: LineReader(vtkDICOMFile *file); ~LineReader(); size_t ReadLine(std::string *s); private: LineReader(const LineReader&); // = delete; LineReader& operator=(const LineReader&); // = delete; vtkDICOMFile *File; size_t BufferSize; unsigned char *Buffer; const unsigned char *Pointer; const unsigned char *EndPointer; }; LineReader::LineReader(vtkDICOMFile *file) : File(file), BufferSize(4096) { this->Buffer = new unsigned char [this->BufferSize]; this->Pointer = &this->Buffer[0]; this->EndPointer = this->Pointer; } LineReader::~LineReader() { delete [] this->Buffer; this->File->Close(); } size_t LineReader::ReadLine(std::string *s) { s->clear(); size_t total = 0; while (!this->File->GetError() && !this->File->EndOfFile()) { if (this->Pointer == this->EndPointer) { this->Pointer = this->Buffer; this->EndPointer = this->Buffer; this->EndPointer += this->File->Read(this->Buffer, this->BufferSize); if (this->Pointer == this->EndPointer) { break; } } const unsigned char *ucp = this->Pointer; const char *cp = reinterpret_cast(ucp); size_t l = 0; while (ucp != this->EndPointer && *ucp != '\r' && *ucp != '\n') { ucp++; l++; } this->Pointer = ucp; if (ucp == this->EndPointer) { // append and continue s->append(cp, l); total += l; } else if (*ucp == '\n') { // newline means end of line this->Pointer++; l++; s->append(cp, l); total += l; break; } else if (*ucp == '\r') { // carriage return is end of line, also eat following newline this->Pointer++; l++; if (this->Pointer == this->EndPointer) { s->append(cp, l); total += l; l = 0; this->Pointer = this->Buffer; this->EndPointer = this->Buffer; this->EndPointer += this->File->Read(this->Buffer, this->BufferSize); cp = reinterpret_cast(this->Pointer); } if (this->Pointer != this->EndPointer && *this->Pointer == '\n') { this->Pointer++; l++; } if (l != 0) { s->append(cp, l); total += l; } break; } } return total; } } // Prototype for function that reads one query key bool dicomcli_readkey_query( const char *cp, vtkDICOMItem *query, QueryTagList *ql, bool ql_unique, bool qfile); // Read a query file bool dicomcli_readquery( const char *fname, vtkDICOMItem *query, QueryTagList *ql, bool ql_unique) { vtkDICOMFile f(fname, vtkDICOMFile::In); // Each query line is either: // # a comment // GGGG,EEEE # a tag to be returned // GGGG,EEEE=PATTERN # a pattern that must match // GGGG,EEEE:VR=PATTERN # search pattern with explicit VR // [PRIVATE_CREATOR]GGGG,EEEE # private tag with creator name // GGGG,EEEE\GGGG,EEEE # a tag nested within a sequence int lineNumber = 0; std::string line; LineReader lr(&f); while (lr.ReadLine(&line)) { const char *cp = line.c_str(); size_t n = line.size(); lineNumber++; // strip leading whitespace size_t s = 0; while (s < n && (cp[s] & 0x80) == 0 && isspace(cp[s])) { s++; } // skip line if it is a comment if (s == n || cp[s] == '#') { continue; } if (!dicomcli_readkey_query(cp, query, ql, ql_unique, true)) { fprintf(stderr, "Error %s line %d:\n", fname, lineNumber); return false; } } return (f.GetError() == 0); } // If qfile is true, then key is being read from a query file bool dicomcli_readkey_query( const char *cp, vtkDICOMItem *query, QueryTagList *ql, bool ql_unique, bool qfile) { // read the tag path vtkDICOMTagPath tagPath; std::string creator; size_t tagDepth = 0; size_t s = 0; size_t lineStart = s; size_t n = strlen(cp); bool tagError = false; const int maxerrlen = 80; // set the default character set to utf-8 vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192); while (!tagError) { // check for private creator in square brackets if (cp[s] == '[') { size_t t = ++s; while (s < n && cp[s] != ']') { s++; } if (s == n) { fprintf(stderr, "Error: Block is missing the final \"]\".\n"); tagError = true; continue; } creator.assign(&cp[t], s++ - t); } // read the DICOM tag vtkDICOMTag tag(0x0000,0x0000); size_t tagStart = s; bool isHex = true; bool hasComma = false; size_t commaPos = 0; while (s < n && (cp[s] & 0x80) == 0 && (isalnum(cp[s]) || (cp[s] == ',' && !hasComma))) { if (cp[s] == ',') { hasComma = true; commaPos = s - tagStart; } else if ((cp[s] & 0x80) != 0 || !isxdigit(cp[s])) { isHex = false; } s++; } size_t tagEnd = s; if (hasComma) { if (isHex) { unsigned int group = strtoul(&cp[tagStart], NULL, 16); unsigned int element = strtoul(&cp[tagStart+commaPos+1], NULL, 16); if (group < 0xFFFF && element < 0xFFFF) { tag = vtkDICOMTag(group, element); } } } else { std::string key(&cp[tagStart], tagEnd - tagStart); vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry( key.c_str(), creator.c_str()); if (de.IsValid()) { tag = de.GetTag(); } else { fprintf(stderr, "Error: Unrecognized key %s\n", key.c_str()); tagError = true; continue; } } // if creator, then resolve the tag now if (creator.length() > 0 && (tag.GetGroup() & 0x0001) != 0) { if (tagDepth == 0) { tag = query->ResolvePrivateTagForWriting(tag, creator); } else { // Since "item" is copy-on-write, we want to avoid creating // an unnecessary copy when the the creator element is added. // So we get the item, add the creator element, then get // the tag and value for that element, and let the item go // out of scope so that its reference count is decremented // (hopefully decremented to 1, so that the "copy" is not // performed). Then we add the creator element to the // query data set (which may have become a copy due to // copy-on-write, if the reference count was greater than one). vtkDICOMTagPath ctagPath; vtkDICOMValue cval; { // this must be in its own scope in order to work... vtkDICOMSequence seq = query->Get(tagPath); vtkDICOMItem item = seq.GetItem(0); tag = item.ResolvePrivateTagForWriting(tag, creator); vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8); ctagPath = vtkDICOMTagPath(tagPath, 0, ctag); cval = item.Get(ctag); } // add the creator element query->Set(ctagPath, cval); } } // build the tag path tagPath = vtkDICOMTagPath(tagPath, 0, tag); if (s < n && (cp[s] == '/' || cp[s] == '\\')) { // create an item for the next level of depth if (!query->Get(tagPath).IsValid()) { query->Set(tagPath, vtkDICOMSequence(1)); } s++; tagDepth++; } else { break; } } // if an error occurred while reading tag, skip to next line if (tagError) { return false; } // read the DICOM vr vtkDICOMVR vr; size_t vrEnd = s; if (s < n && cp[s] == ':') { s++; size_t vrStart = s; vrEnd = s; if (n - s >= 2) { s += 2; vrEnd = s; vr = vtkDICOMVR(&cp[vrStart]); if (!vr.IsValid() || vr == VR::OX || vr == VR::XS || vr == VR::UN) { int m = static_cast(vrEnd - lineStart); m = (m > maxerrlen ? maxerrlen : m); fprintf(stderr, "Error: Unrecognized DICOM VR \"%*.*s\"\n", m, m, &cp[lineStart]); return false; } } } // dig down into the tag path const vtkDICOMItem *pitem = query; vtkDICOMTag tag = tagPath.GetHead(); vtkDICOMTagPath tmpPath = tagPath; while (tmpPath.HasTail()) { pitem = pitem->Get(tag).GetSequenceData(); tmpPath = tmpPath.GetTail(); tag = tmpPath.GetHead(); } // validate the tag and the vr against the dictionary vtkDICOMVR dictvr = pitem->FindDictVR(tag); // the above method returns UN for OX and XS if it cannot resolve them if (dictvr == VR::UN) { // try again, taking a more direct approach vtkDICOMDictEntry e = pitem->FindDictEntry(tag); if (e.IsValid()) { dictvr = e.GetVR(); } } if (!vr.IsValid()) { vr = dictvr; } else if (dictvr.IsValid() && dictvr != VR::UN) { if (vr != dictvr && !(((dictvr == VR::OX && (vr == VR::OW || vr == VR::OB))) || ((dictvr == VR::XS && (vr == VR::SS || vr == VR::US))))) { int m = static_cast(vrEnd - lineStart); m = (m > maxerrlen ? maxerrlen : m); fprintf(stderr, "Error: VR of \"%*.*s\" doesn't match dict VR of %s\n", m, m, &cp[lineStart], dictvr.GetText()); } } if (!vr.IsValid() || vr == VR::UN) { int m = static_cast(s - lineStart); m = (m > maxerrlen ? maxerrlen : m); fprintf(stderr, "Error: Unrecognized DICOM tag \"%*.*s\"\n", m, m, &cp[lineStart]); return false; } // check for a value or pattern following "=" size_t valueStart = s; size_t valueEnd = s; bool valueContainsQuotes = false; bool keyHasAssignment = false; if (s < n && cp[s] == '=') { keyHasAssignment = true; s++; valueStart = s; if (s < n && qfile && cp[s] == '\"') { char delim = cp[s++]; valueStart = s; while (s < n) { if (cp[s] == delim) { // a repeated quote becomes a literal quote if (s+1 < n && cp[s+1] == delim) { valueContainsQuotes = true; s++; } else { break; } } s++; } valueEnd = s; } else { while (s < n && (!qfile || (cp[s] & 0x80) != 0 || !isspace(cp[s]))) { s++; } valueEnd = s; } } else if (s < n && (!qfile || (cp[s] & 0x80) != 0 || !isspace(cp[s]))) { if ((cp[s] & 0x80) != 0 || isgraph(cp[s])) { fprintf(stderr, "Error: Illegal character \"%c\" after tag.\n", cp[s]); } else { fprintf(stderr, "Error: Illegal character after tag.\n"); } return false; } // add the tag and value to the query data set if (valueStart == valueEnd) { // only overwrite previous value if '=' was explicitly used if (keyHasAssignment || !query->Get(tagPath).IsValid()) { // empty value (always matches, always retrieved) query->Set(tagPath, vtkDICOMValue(vr)); } } else if (valueContainsQuotes) { // convert "" to ", which is the rule for csv files std::string sval; for (size_t t = valueStart; t < valueEnd; t++) { sval.push_back(cp[t]); if (cp[t] == '\"' && t+1 < valueEnd && cp[t+1] == '\"') { t++; } } if (vr.HasSpecificCharacterSet()) { query->Set(tagPath, vtkDICOMValue(vr, cs, sval)); } else { query->Set(tagPath, vtkDICOMValue(vr, sval)); } } else { if (vr.HasSpecificCharacterSet()) { query->Set(tagPath, vtkDICOMValue(vr, cs, &cp[valueStart], valueEnd - valueStart)); } else { query->Set(tagPath, vtkDICOMValue(vr, &cp[valueStart], valueEnd - valueStart)); } } // add the tag path to the list, if it isn't already there if (ql) { if (!ql_unique || std::find(ql->begin(), ql->end(), tagPath) == ql->end()) { ql->push_back(tagPath); } } return true; } bool dicomcli_readkey( const char *cp, vtkDICOMItem *query, QueryTagList *ql, bool ql_unique) { return dicomcli_readkey_query(cp, query, ql, ql_unique, false); } bool dicomcli_looks_like_key(const char *cp) { size_t s = 0; size_t l = 0; // Look for private dictionary specifier in square brackets if (*cp == '[') { while (cp[l] != ']' && cp[l] != '\0') { l++; } if (cp[l] == ']') { l++; s = l; } else { return false; } } // Look for hexadecimal tag bool istag = true; size_t commas = 0; size_t digitrun = 0; while (cp[l] != '\0' && cp[l] != ':' && cp[l] != '=') { if (cp[l] == ',') { commas++; if (digitrun > 4) { istag = false; } digitrun = 0; } else if ((cp[l] & 0x80) == 0 && isxdigit(cp[l])) { digitrun++; } else { istag = false; } l++; } if (istag && digitrun > 0 && ((commas == 0 && digitrun <= 8) || (commas == 1 && digitrun <= 4))) { return true; } // Look for dictionary key if (l != s) { std::string key(&cp[s], l - s); std::string creator; if (s > 0) { creator = std::string(&cp[1], s-2); } vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str(), creator.c_str()); if (de.IsValid()) { return true; } } return false; } bool dicomcli_readuids( const char *fname, vtkDICOMItem *query, QueryTagList *ql) { vtkDICOMFile f(fname, vtkDICOMFile::In); // Basic file structure: // # one or more comments // GGGG,EEEE # a tag or key (only one) // 1.185.234 # a UID, followed by more UIDs QueryTagList ql2; std::string val; int lineNumber = 0; std::string line; LineReader lr(&f); while (lr.ReadLine(&line)) { const char *cp = line.c_str(); size_t n = line.size(); lineNumber++; // strip leading whitespace size_t s = 0; while (s < n && (cp[s] & 0x80) == 0 && isspace(cp[s])) { s++; } // skip trailing whitespace if (n > s && (cp[n-1] & 0x80) == 0 && isspace(cp[n-1])) { --n; } // skip line if it is a comment if (s == n || cp[s] == '#') { continue; } if (ql2.size() == 0) { // get the tag line, if not gotten yet if (!dicomcli_readkey_query(cp, query, &ql2, true, true)) { fprintf(stderr, "Error %s line %d: ", fname, lineNumber); fprintf(stderr, "Need Valid DICOM tag at top of file.\n"); return false; } } else { // read and append a value if (val.length() > 0) { val.append("\\", 1); } val.append(&cp[s], n-s); if (val.length() >= 65535) { fprintf(stderr, "Error %s line %d: ", fname, lineNumber); fprintf(stderr, "Too many values (there is a 65535 byte limit)\n"); return false; } } } if (ql2.size() > 0) { // add the key and value to the query vtkDICOMTagPath tagPath = ql2[0]; query->Set(tagPath, val); if (ql && std::find(ql->begin(), ql->end(), tagPath) == ql->end()) { ql->push_back(tagPath); } } return (f.GetError() == 0); } void dicomcli_error_helper(vtkDICOMMetaData *meta, int i) { if (meta) { // print some useful identifying information about a DICOM file fprintf(stderr, "Cannot read the DICOM file for the following entry:\n"); fprintf(stderr, "StudyInstanceUID=\"%s\",\n", meta->Get(DC::StudyInstanceUID).AsString().c_str()); fprintf(stderr, "SeriesInstanceUID=\"%s\",\n", meta->Get(DC::SeriesInstanceUID).AsString().c_str()); fprintf(stderr, "PatientID=\"%s\", StudyDate=\"%s\", StudyTime=\"%s\",\n", meta->Get(DC::PatientID).AsString().c_str(), meta->Get(DC::StudyDate).AsString().c_str(), meta->Get(DC::StudyTime).AsString().c_str()); fprintf(stderr, "StudyID=\"%s\", SeriesNumber=\"%s\", InstanceNumber=\"%s\"\n", meta->Get(DC::StudyID).AsString().c_str(), meta->Get(DC::SeriesNumber).AsString().c_str(), meta->Get(i, DC::InstanceNumber).AsString().c_str()); } } vtk-dicom-0.8.12/DicomCli/readquery.h000066400000000000000000000045771356440565500173660ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef readquery_h #define readquery_h #include "vtkDICOMItem.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMTagPath.h" #include typedef std::vector QueryTagList; //! Read a query file, return 'true' on success. /*! * The query file is read into the supplied vtkDICOMItem as a set of * attribute values. If the ordering within the file is important, * then a QueryTagList can also be provided. The tags will be pushed * onto the QueryTagList in the same order as they are encountered in * the file. If ql_unique is true (the default) then repeated tags * will not be pushed onto the QueryTagList. */ bool dicomcli_readquery( const char *fname, vtkDICOMItem *query, QueryTagList *ql=0, bool ql_unique=true); //! Read a single query key, return 'true' on success. /*! * See dicomcli_readquery() for more information. */ bool dicomcli_readkey( const char *key, vtkDICOMItem *query, QueryTagList *ql=0, bool ql_unique=true); //! Check if text looks like a query key (for error checking). bool dicomcli_looks_like_key(const char *key); //! Read a UID file, return 'true' on success. /*! * The first line of the file must contain a valid key, for example * SeriesInstanceUID, and the remainder of the file should contain * values, one value per line, without quotes. */ bool dicomcli_readuids( const char *fname, vtkDICOMItem *query, QueryTagList *ql=0); //! Print brief info about a file for error messages. /*! * Sometimes a file that is found in an index doesn't actually exist, * or cannot be read. This method will print out the PatientID, * StudyDate, StudyTime, StudyId, SeriesNumber, and InstanceNumber * so that the user will have an idea of what file is missing, since * the DICOM filenames themselves are usually not informative. */ void dicomcli_error_helper(vtkDICOMMetaData *meta, int i); #endif /* readquery_h */ vtk-dicom-0.8.12/DicomCli/vtkConsoleOutputWindow.cxx000066400000000000000000000024161356440565500224660ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkConsoleOutputWindow.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkConsoleOutputWindow.h" #include "vtkObjectFactory.h" vtkStandardNewMacro(vtkConsoleOutputWindow); vtkConsoleOutputWindow::vtkConsoleOutputWindow() { } vtkConsoleOutputWindow::~vtkConsoleOutputWindow() { } void vtkConsoleOutputWindow::Initialize() { } void vtkConsoleOutputWindow::Install() { vtkConsoleOutputWindow *win = vtkConsoleOutputWindow::New(); vtkOutputWindow::SetInstance(win); win->Delete(); } void vtkConsoleOutputWindow::DisplayText(const char* text) { if (text) { fwrite(text, 1, strlen(text), stderr); fputc('\n', stderr); } } void vtkConsoleOutputWindow::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } vtk-dicom-0.8.12/DicomCli/vtkConsoleOutputWindow.h000066400000000000000000000032141356440565500221100ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkConsoleOutputWindow.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ // .NAME vtkConsoleOutputWindow - Output errors to the console. // .SECTION Description // Writes debug/warning/error output to the console, even on Windows. // To use this class, instantiate it and then call SetInstance(this). // #ifndef vtkConsoleOutputWindow_h #define vtkConsoleOutputWindow_h #include "vtkOutputWindow.h" #include "vtkDICOMConfig.h" class vtkConsoleOutputWindow : public vtkOutputWindow { public: vtkTypeMacro(vtkConsoleOutputWindow, vtkOutputWindow); static vtkConsoleOutputWindow* New(); void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; void DisplayText(const char*) VTK_DICOM_OVERRIDE; static void Install(); protected: vtkConsoleOutputWindow(); virtual ~vtkConsoleOutputWindow(); void Initialize(); private: #ifdef VTK_DICOM_DELETE vtkConsoleOutputWindow(const vtkConsoleOutputWindow&) VTK_DICOM_DELETE; void operator=(const vtkConsoleOutputWindow&) VTK_DICOM_DELETE; #else vtkConsoleOutputWindow(const vtkConsoleOutputWindow&) = delete; void operator=(const vtkConsoleOutputWindow&) = delete; #endif }; #endif vtk-dicom-0.8.12/Documents/000077500000000000000000000000001356440565500154555ustar00rootroot00000000000000vtk-dicom-0.8.12/Documents/Attributes.md000066400000000000000000000343631356440565500201360ustar00rootroot00000000000000## Attributes {#attributes} @brief Managing DICOM meta data. ## Overview The meta data can be loaded from a DICOM file in two ways: either via the vtkDICOMReader class (which also reads the image data), or via the vtkDICOMParser class (which reads only the meta data). These classes store the meta data in a vtkDICOMMetaData object, which provides storage for all of the files in the DICOM series. The Get() method for this class, which returns the value of a DICOM attribute, accepts a file index as a parameter. This allows one to choose the file in the series for which to get the attribute. ~~~~~~~~{.cpp} // Get meta data from a vtkDICOMReader reader->UpdateInformation(); vtkDICOMMetaData *meta = reader->GetMetaData(); // Get the number of files for which "meta" holds meta-data int n = meta->GetNumberOfInstances(); // Get EchoTime attribute for first file in series. if (meta->Has(DC::EchoTime)) { int fileIndex = 0; double t = meta->Get(fileIndex, DC::EchoTime).AsDouble(); } // If fileIndex is not given, attribute is retrieved from first file. std::string str = meta->Get(DC::SeriesDescription).AsString(); ~~~~~~~~ Attributes are returned as a vtkDICOMValue object, which has methods such as AsDouble(), AsInt() or AsString() that allow conversion of the value to various C++ types. If the DICOM file does not have the requested attribute, then the returned value will be empty and "value.IsValid()" will return "false". Calling AsString() on an invalid value will return the empty string, and likewise calling AsInt() or AsDouble() on an invalid value will return 0. ## Per-slice meta data As discussed in the Overview, a "file index" can be used when retrieving an attribute from vtkDICOMMetaData. It is important to note that this is a file index and not a slice index. The slices are sorted by spatial location, which might be different from the file order. Furthermore, a single DICOM file might actually contain multiple slices, with each slice stored in a different frame within the file. The reader provides an array, the FileIndexArray, that can be used to convert a "slice index" to a file index. It also provides a FrameIndexArray that can be used to convert a slice index to a frame number. Together, these can be used regardless of whether the there was one slice per file, or one slice per frame in a multi-frame file: the vtkDICOMMetaData object provides a Get() method that takes both a file index and a frame index, along with the tag of the attribute to be inspected. ~~~~~~~~{.cpp} // Read the files and get the meta data. reader->SetFileNames(fileNameArray); reader->Update(); vtkDICOMMetaData *meta = reader->GetMetaData(); // Get the arrays that map slice to file and frame. vtkIntArray *fileMap = reader->GetFileIndexArray(); vtkIntArray *frameMap = reader->GetFrameIndexArray(); // Get the file and frame for a particular slice. int sliceIndex = 6; int fileIndex = fileMap->GetComponent(sliceIndex, 0); int frameIndex = frameMap->GetComponent(sliceIndex, 0); // Get the position for that slice. vtkDICOMValue pv = meta->Get(fileIdx, frameIdx, DC::ImagePositionPatient); double position[3] = { 0.0, 0.0, 0.0 }; if (pv.IsValid() && pv.GetNumberOfValues() == 3) { pv.GetValues(position, 3); } ~~~~~~~~ As a caveat, for multi-frame files, the example given above assumes that the meta data contains a per-frame ImagePositionPatient attribute. This is the case for enhanced multi-frame CT and MRI files, but not for multi-frame nuclear medicine files. Whenever retrieving meta data from a DICOM image, it is wise to consult the DICOM standard to see how the attributes are defined for the various modality-specific IODs (information object descriptions). ## Per-component meta data In the example in the previous section, the fileMap->GetComponent() method was called with two arguments, but the second argument was set to zero. If the vtkDICOMReader assigned a vector dimension to the data, then the the vtkImageData will have multiple scalar values in each voxel. For instance, the first component in each voxel may have come from a file that provided the real component of a complex-valued image, while the second component from a file that provided the imaginary component. In this case, one would do the following to retrieve the meta data from the "imaginary" file: ~~~~~~~~{.cpp} // Read the files and get the meta data. reader->SetFileNames(fileNameArray); reader->Update(); vtkDICOMMetaData *metaData = reader->GetMetaData(); // Get the arrays that map slice to file and frame. vtkIntArray *fileMap = reader->GetFileIndexArray(); vtkIntArray *frameMap = reader->GetFrameIndexArray(); // Get the file and frame for a particular slice and component. int sliceIndex = 6; int vectorIndex = 1; // 2nd component is the imaginary component int fileIndex = fileMap->GetComponent(sliceIndex, vectorIndex); int frameIndex = frameMap->GetComponent(sliceIndex, vectorIndex); // Get an attribute from the meta data. vtkDICOMValue v = metaData->Get(fileIdx, frameIdx, tag); ~~~~~~~~ If the data has a time dimension and the reader's TimeAsVectorOn() method was called, then the components of each voxel can correspond both to a specific time slot, and to a specific vector component. To make the situation even more complicated, each pixel in the DICOM files might be an RGB pixel and therefore have three components as given by the SamplesPerPixel attribute in the meta data. The number of components in the FileIndexArray and FrameIndexArray is equal to the vector dimension, and if TimeAsVectorOn() was called, then the vector dimension will include the time dimension. The FileIndexArray and FrameIndexArray do not have components that correspond to the individual R,G,B components in RGB images, since the R, G, and B components will always have the same meta data because they always come from the same file and frame. The following strategy is recommended for accessing per-component meta data in multi-dimensional images: ~~~~~~~~{.cpp} // Get the arrays that map slice to file and frame. vtkIntArray *fileMap = reader->GetFileIndexArray(); vtkIntArray *frameMap = reader->GetFrameIndexArray(); // Get the image data and meta data. vtkImageData *image = reader->GetOutput(); vtkDICOMMetaData *meta = reader->GetMetaData(); // Get the number of components in the data. int numComponents = image->GetNumberOfScalarComponents(); // Get the full vector dimension for the DICOM data. int vectorDimension = fileMap->GetNumberOfComponents(); // Compute the samples per pixel in original files. int samplesPerPixel = numComponents/vectorDimension; // Check for time dimension int timeDimension = reader->GetTimeDimension(); if (timeDimension == 0) { timeDimension = 1; } // Get all attributes for a specific time. int vectorIndex = timeIndex*vectorDimension/timeDimension; int vectorEndIndex = (timeIndex + 1)*vectorDimension/timeDimension; for (int i = vectorIndex; i < vectorEndIndex; i++) { int fileIndex = fileMap->GetComponent(sliceIndex, i); int frameIndex = frameMap->GetComponent(sliceIndex, i); vtkDICOMValue v = meta->Get(fileIdx, frameIdx, tag); // print or display the value } // Extract an image at the desired time slot (e.g. for display). int componentIndex = timeIndex*vectorDimension/timeDimension*samplesPerPixel; vtkNew extractor; extractor->SetInputConnection(reader->GetOutputPort()); if (samplesPerPixel == 1) { extractor->SetComponents(componentIndex); } else if (samplesPerPixel == 2) // rare/nonexistent in DICOM images { extractor->SetComponents(componentIndex, componentIndex + 1); } else { extractor->SetComponents(componentIndex, componentIndex + 1, componentIndex + 2); } extractor->Update(); ~~~~~~~~ ## Nested data, tag paths, and multi-frame files DICOM meta data can be nested. For example, nesting is used to store per-frame meta data for enhanced multi-frame DICOM files. In order to make it easy to access nested attributes, the vtkDICOMTagPath class describes the full path to a nested attribute. ~~~~~~~~{.cpp} // Get an attribute for frame 3 of a multi-frame file. int frameIdx = 3; double echoTime = meta->Get( vtkDICOMTagPath(DC::PerFrameFunctionalGroupSequence, frameIdx, DC::CardiacSynchronizationSequence, 0, DC::NominalCardiacTriggerDelayTime)).AsDouble(); ~~~~~~~~ This is rather verbose, so a more convenient method for accessing per-frame data is provided for enhanced multi-frame files. You can give the frame index after the file index, in which case the Get() method will perform a search for the attribute without requiring a full path. ~~~~~~~~{.cpp} // Get an attribute for frame 3 of an enhanced multi-frame file. int fileIdx = 0; int frameIdx = 3; vtkDICOMValue vw = meta->Get(fileIdx, frameIdx, DC::WindowWidth); vtkDICOMValue vc = meta->Get(fileIdx, frameIdx, DC::WindowCenter); if (vw.IsValid() && vc.IsValid()) { // set the window for the image } ~~~~~~~~ The vtkDICOMMetaDataAdapter class can also be used to access enhanced multi-frame files as if each frame was a separate file. ## Iterating over data elements The vtkDICOMMetaData object also provides iterator-style access to the data elements. This is useful, for instance, when you want to iterate through all of the elements in the meta data in sequential order. It is also useful if you want to check which attributes vary between files in the series. ~~~~~~~~{.cpp} // Iterate through all data elements in the meta data. for (vtkDICOMDataElementIterator iter = meta->Begin(); iter != meta->End(); ++iter) { vtkDICOMTag tag = iter->GetTag(); std::cout << "tag: " << tag << std::endl; // Crucial step: check for values that vary across the series. if (iter->IsPerInstance()) { int n = iter->GetNumberOfInstances(); for (int i = 0; i < n; i++) { std::cout << "instance " << i << ": " << iter->GetValue(i) << std::endl; } } else { // Not PerInstance: value is the same for all files in series. std::cout << "all instances: " << iter->GetValue() << std::endl; } } // Get the iterator to a specific element (hash table lookup). vtkDICOMDataElementIterator iter = meta->Find(DC::ImageOrientationPatient); if (iter != meta->End()) { // do something } ~~~~~~~~ You might be surprised by the PerInstance check, but it is necessary due to the fact that vtkDICOMMetaData holds the meta data for an entire series of DICOM files. Most attributes are the same across the series, but a few attributes vary from one file to the next. These per-file attributes are identified when the file is read by vtkDICOMReader. ## Dictionaries When iterating through the data elements in the meta data, as described in the previous section, it can be useful to get information about the meaning of the data elements that are encountered. Complete information can only be provided by the DICOM standards documents themselves, but the vtkDICOMDictionary can at least provide a summary of what kind of data to expect for a given attribute. ~~~~~~~~{.cpp} // do a dictionary lookup on a tag vtkDICOMDictEntry entry; entry = vtkDICOMDictionary::FindDictEntry(vtkDICOMTag(0x0008,0x0020)); // check if entry was found in dictionary if (entry.IsValid()) { std::cout << entry.GetName() << std::endl; // prints "StudyDate" std::cout << entry.GetVR() << std::endl; // prints "DA" std::cout << entry.GetVM() << std::endl; // prints "1" } // do a dictionary lookup by name entry = vtkDICOMDictionary::FindDictEntry("StudyDate"); if (entry.IsValid()) { std::cout << entry.GetTag() << std::endl; // prints "0008,0020" } ~~~~~~~~ The vtkDICOMDictionary class provides information for attributes that are described in the DICOM standard, as well as information for private attributes defined by medical device manufacturers. Every DICOM file is likely to have a mix of standard attributes and private attributes. Fortunately, it is easy to tell the difference between the two: private attributes always use a tag with with an odd group number, while the DICOM standard only uses even group numbers. The lookup of private tags requires the name of the private dictionary. ~~~~~~~~{.cpp} // do a private dictionary lookup in GE dictionary GEMS_ACQU_01 vtkDICOMDictEntry entry; entry = vtkDICOMDictionary::FindDictEntry("CellSpacing", "GEMS_ACQU_01"); if (entry.IsValid()) { std::cout << entry.GetTag() << std::endl; // prints "0019,0004" std::cout << entry.GetName() << std::endl; // prints "CellSpacing" std::cout << entry.GetVR() << std::endl; // prints "DS" std::cout << entry.GetVM() << std::endl; // prints "1" } ~~~~~~~~ ## Private meta data Because private tags are not registered with any central authority, there is no guarantee that they are unique. Instead, each private group within a DICOM file contains 240 blocks (each with 256 elements) that can be be individually reserved for elements belonging to a specific private dictionary. The details of how this is done are described in Part 5, Section 7.8 of the DICOM standard. The result of this is that private tags are of the form (gggg,xxee) where "xx" is a hexadecimal value between `10` and `ff` that identifies the block that was used to store the attribute. The tricky thing is that this value can vary from one DICOM file to the next, though it is usually consistent within a single series. Some people are surprised by this, because the first block (i.e. `10`) is the only block that is used in most files. To ensure that you are looking for private attributes in the correct location (i.e. within the correct block), you must resolve each private tag before using it. ~~~~~~~~{.cpp} // start with the tag in its "dictionary" form, with xx=00 vtkDICOMTag ptag = vtkDICOMTag(0019,0004); // resolve the private tag (find out what block was reserved) ptag = meta->ResolvePrivateTag(ptag, "GEMS_ACQU_01"); if (ptag == vtkDICOMTag(0xffff,0xffff)) { // the special tag value ffff,ffff indicates that the tag could not be // resolved: no private block was reserved for dictionary GEMS_ACQU_01 } else { // ptag will now be 0019,xx04 where "xx" is usually 10 (first block) double spacing = meta->Get(ptag).AsDouble(); } ~~~~~~~~ vtk-dicom-0.8.12/Documents/Directories.md000066400000000000000000000172441356440565500202630ustar00rootroot00000000000000## Directories {#directory} @brief Reading a directory that contains DICOM files. ## DICOM file directory DICOM files rarely have descriptive names, so it is usually necessary to identify them by their contents. A typical DICOM folder listing looks something like this: ~~~~~~~~{.cpp} IM-0001-0001.dcm IM-0001-0005.dcm IM-0001-0009.dcm IM-0001-0013.dcm IM-0001-0002.dcm IM-0001-0006.dcm IM-0001-0010.dcm IM-0001-0014.dcm IM-0001-0003.dcm IM-0001-0007.dcm IM-0001-0011.dcm IM-0001-0015.dcm IM-0001-0004.dcm IM-0001-0008.dcm IM-0001-0012.dcm IM-0001-0016.dcm ~~~~~~~~ These files might be 16 slices of a 3D image, or the first three files might be localizer images while the remaining 13 files are slices of a 3D volume. Or they might be something else entirely. So the first thing to do with a batch of DICOM files is to find out how they fit together. There are two classes that can be used for this: the old vtkDICOMFileSorter class, and the newer vtkDICOMDirectory class. ## Scanning a directory The vtkDICOMDirectory class solves this problem by scanning the directory and reporting information on all of the DICOM files that it finds. In addition, if the directory contains a **DICOMDIR** file (as is the case for a DICOM CD), then the DICOMDIR file is used as an index. In the simplest case, the directory will contain a single series as in the example below. Since the example is looking for images (and not for other DICOM files such as structured reports), the RequirePixelData flag is set: ~~~~~~~~{.cpp} vtkNew dicomdir; dicomdir->SetDirectoryName("E:"); dicomdir->RequirePixelDataOn(); dicomdir->Update(); int n = dicomdir->GetNumberOfSeries(); vtkNew reader; if (n > 0) { // read the first series found reader->SetFileNames(dicomdir->GetFileNamesForSeries(0)); reader->Update(); } else { std::cerr << "No DICOM images in directory!" << std::endl; } ~~~~~~~~ Since vtkDICOMDirectory will scan subdirectories recursively, it can be used to catalogue a large collection of DICOM files: ~~~~~~~~{.cpp} // Iterate through all of the studies that are present. int n = dicomdir->GetNumberOfStudies(); for (int i = 0; i < n; i++) { // Get information related to the patient study vtkDICOMItem patient = dicomdir->GetPatientRecordForStudy(i); vtkDICOMItem study = dicomdir->GetStudyRecord(i); std::cout << patient.Get(DC::PatientName) << " "; std::cout << patient.Get(DC::PatientID) << " "; std::cout << study.Get(DC::StudyDate) << " "; std::cout << study.Get(DC::StudyTime) << std::endl; // Iterate through all of the series in this study. int j1 = dicomdir->GetFirstSeriesForStudy(i); int j2 = dicomdir->GetLastSeriesForStudy(i); for (int j = j1; j <= j2; j++) { // get some of the series attributes as a vtkDICOMItem vtkDICOMItem series = dicomdir->GetSeriesRecord(j); // get all the files in the series vtkStringArray *sortedFiles = dicomdir->GetFileNamesForSeries(j); std::cout << sortedFiles.GetNumberOfValues() << " files: "; std::cout << series.Get(DC::SeriesInstanceUID) << std::endl; } } ~~~~~~~~ The PatientRecord, StudyRecord, and SeriesRecord in the above example contain attributes for the images that were stored in the DICOMDIR index file. At the bare minimum, these will provide the PatientName, PatientID, StudyDate, StudyTime, StudyInstanceUID, and SeriesInstanceUID. Usually the StudyDescription, SeriesDescription and SeriesNumber are also available. Furthermore, the method GetMetaDataForSeries() returns an amalgamation of the Patient, Study, Series, and Image information as a vtkDICOMMetaData object (though the per-image information is sometimes limited to just the InstanceNumber and the SOPInstanceUID). ### Searching for files that match a query The vtkDICOMDirectory class has another trick up its sleeve. It can search for files that have certain attributes, for example it can search a filesystem for all scans of a specific patient. This is similar in purpose to querying a PACS system, except that you are instead providing one or more disk directories where the files might exist. These directories are searched recursively for all files that match the query. ~~~~~~~~{.cpp} // Make a list of the directories to search. vtkNew dicompath; dicompath->InsertNextValue("/Volumes/Images1"); dicompath->InsertNextValue("/Volumes/Images2"); // Make a list of attributes to match, using the utf-8 character set. vtkDICOMItem query; query.Set(DC::SpecificCharacterSet, "ISO_IR 192"); query.Set(DC::PatientName, "Doe^John"); query.Set(DC::StudyDate, "2012-2015"); query.Set(DC::Modality, "MR"); query.Set(DC::ImageType, "PRIMARY"); query.Set(DC::SeriesDescription, "*T1w*"); vtkNew dicomdir; // The SetInputFileNames method takes directories, too! dicomdir->SetInputFileNames(dicompath.GetPointer()); // Optionally restrict the search to files ending with ".dcm" dicomdir->SetFilePattern("*.dcm"); dicomdir->SetFindQuery(query); dicomdir->Update(); ~~~~~~~~ All text attributes except for dates accept the wildcards '\*' and '?'. For dates, you can use a hyphen to specify a range of dates. Matching of all text is done by first converting the text to utf-8 for compatibility, and for patient names the matching is case insensitive. The query **PRIMARY** will match the multi-valued attribute value **ORIGINAL\\PRIMARY**, since only one value has to match. If the query contains any non-ASCII text, you must set the SpecificCharacterSet attribute to whichever character set your program uses internally. This does not have to be the same as the character set used in the files you are searching for. It is recommended to use utf-8 as the character set for the query, regardless of the character set used in the DICOM files. ## Sorting a list of files The vtkDICOMFileSorter class is obsolete, since its capabilities are eclipsed by the vtkDICOMDirectory class, but its use is documented here for historical reasons. It is also worth stating that the "sorting" provided by this class is, in fact, unnecessary: the vtkDICOMReader itself is capable of sorting its input files into the correct order. ~~~~~~~~{.cpp} // Instantiate a DICOM sorter. vtkNew sorter; // Provide an array containing a list of filenames. sorter->SetInputFileNames(filenames); // Update the sorter (i.e. perform the sort). sorter->Update(); // Get the first series. int i = sorter->GetNumberOfSeries(); if (i > 0) { vtkStringArray *sortedFiles = sorter->GetFileNamesForSeries(0); // do something with the files } ~~~~~~~~ In addition, the sorter can discover which series belong to the same study. That is, it can tell us which series were collected during the same imaging session. One thing the sorter does *not* do is sort the images in the series according to slice location. It only sorts the images according to the Instance Number embedded in each image, where the Instance Number gives the logical viewing order prescribed by the medical device that generated the images. It is up to the vtkDICOMReader to check the slice positions for the files and sort them by location before generating an image volume or time series. ~~~~~~~~{.cpp} // Sort the input filenames by series and study. sorter->SetInputFileNames(filenames); sorter->Update(); // Iterate through all of the studies that are present. int n = sorter->GetNumberOfStudies(); for (int i = 0; i < n; i++) { // Iterate through all of the series in this study. int j1 = sorter->GetFirstSeriesForStudy(i); int j2 = sorter->GetLastSeriesForStudy(i); for (int j = j1; j <= j2; j++) { vtkStringArray *sortedFiles = sorter->GetFileNamesForSeries(j); // do something with the files } } ~~~~~~~~ vtk-dicom-0.8.12/Documents/ImageDisplay.md000066400000000000000000000156461356440565500203630ustar00rootroot00000000000000## Image Display {#imageDisplay} @brief Correct display of pixel values. ## Overview In general, the pixel values that are stored in a DICOM file cannot be directly displayed to the screen. Instead, the pixel values go through a *display pipeline* that changes the values to something suitable for viewing. Unless the pixels are stored in the file as RGB or as 8-bit grayscale, the display pipeline will generally do one of two things: it will map the values through a palette to generate RGB pixels, or it will rescale the values (sometimes in multiple steps) for monochrome display. The vtkDICOMReader will, by default, produce the *Modality Values* of the pixels, which are the values associated with the modality that produced the images (e.g. Hounsfield values for CT). If desired, the AutoRescaleOff() method can be called on the reader to force it to produce *Stored Values* instead, which are the pixel values stored in the file. Note that *Modality Values* are equal to *Stored Values* for many modalities, including MRI and Ultrasound. ## Photometric Interpretation The [Image Pixel Module](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html) of the DICOM standard defines the Photometric Interpretation attribute as a hint for how the stored pixel values should be interpreted by a DICOM image display pipeline. Typical values are: * MONOCHROME1 - negative image, where higher values are darker (e.g. radiographic film ) * MONOCHROME2 - positive image, where higher values are brighter (e.g. CT, MR) * PALETTE COLOR - indexed color with palette * RGB - full-color image with separate RGB components In addition to the above, the YBR family of photometric interpretations indicate that the image was stored with one luma channel and two color channels, which is commonly done when a color image is compressed. The vtkDICOMReader automatically converts YBR images to RGB, so display pipelines should interpret YBR the same as RGB. * YBR_FULL - used by ultrasound, usually with RLE compression * YBR_FULL_422 - used by JPEG lossy compressed images * YBR_PARTIAL_420 - used by MPEG lossy compressed video * YBR_ICT - used by JPEG2000 lossy compressed images * YBR_RCT - used by JPEG2000 lossless compressed images Here is a short example of how to interpret the output of vtkDICOMReader for display: ~~~~~~~~{.cpp} reader->Update(); vtkDICOMMetaData *meta = reader->GetMetaData(); vtkDICOMValue photometric = meta->Get(DC::PhotometricInterpretation) if (photometric.Matches("MONOCHROME1")) { // display with a lookup table that goes from white to black } else if (photometric.Matches("MONOCHROME2")) { // display with a lookup table that goes from black to white, // or display with a suitable pseudocolor lookup table } else if (photometric.Matches("PALETTE*")) { // display with palette lookup table (see vtkDICOMLookupTable), // or convert to RGB with vtkDICOMApplyPalette } else if (photometric.Matches("RGB*") || photometric.Matches("YBR*")) { // display RGB data directly } ~~~~~~~~ ## Grayscale image display DICOM defines a grayscale display pipeline that converts the *Stored Values* in the file to *Presentation Values* that are suitable for display. The details of how this is done are described in the [Lookup Tables and Presentation States](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.11.html) chapter of the DICOM standard. A brief summary of the steps in the grayscale display pipeline is as follows: 1. *Stored Values* are rescaled to generate *Modality Values* 2. *Modality Values* are windowed to generate *Windowed Values* (or *Values of Interest*) 3. *Windowed Values* are mapped to *Presentation Values* The *Modality Values* are real values in units that are appropriate to the modality, for example, Hounsfield units for CT or counts for PET. The **RescaleIntercept** and **RescaleSlope** define a linear mapping from *Stored Values* to *Modality Values*: ModalityValue = RescaleSlope * StoredValue + RescaleIntercept For modalities such as ultrasound and MRI that do not have any units, the RescaleSlope and RescaleIntercept are absent and the *Modality Values* are equal to the *Stored Values*. The *Windowed Values* (or more generically, *Values of Interest* or *VOIs*) represent the range of values to be displayed. Decreasing the **WindowWidth** increases the perceived contrast of the image, and decreasing the **WindowCenter** increases the perceived brightness of the image. Note that, as shown in the pseudocode below, the DICOM standard uses a definition of "window" and "level" that might be different from that to which you are accustomed. The DICOM WindowWidth must be greater than or equal to 1. n = number of output gray levels (usually 256 or 1024) w = WindowWidth - 1.0 c = WindowCenter - 0.5 if (ModalityValue <= c - 0.5*w), then WindowedValue = 0 else if (ModalityValue > c + 0.5*w), then WindowedValue = n - 1 else WindowedValue = ((ModalityValue - c)/w + 0.5) * (n - 1) For ultrasound (and for 8-bit images in general) the WindowWidth and WindowCenter may be absent from the file. If absent, they can be assumed to be 256 and 128 respectively, which provides an 8-bit identity mapping. More information can be found in the [VOI LUT Module](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.11.2.html) of the DICOM standard. Note that a DICOM display application should allow the user to adjust the window according to his or her needs. The *Presentation Values* are the values that are ultimately displayed to the user. If the PhotometricInterpretation is MONOCHROME2, then the *Windowed Values* should be displayed directly. If the the PhotometricInterpetation is MONOCHROME1, then the grayscale lookup table should be inverted such that a value of 0 is displayed as white and the maximum value is displayed as black. ## Color image display There are several categories of color display for DICOM, the most important of which are: * RGB (or YBR) values stored directly in the file * PALETTE COLOR where a palette LUT is applied to the stored values * A supplemental palette LUT applied to some or all stored values * A pseudo-color palette LUT applied to the windowed values For convenience, the vtkDICOMApplyPalette filter can convert a PALETTE COLOR image to RGB, or can convert an image with a supplemental palette to RGB, but will pass through all other images. For more information about supplemental palettes, see the [Supplemental Palette Lookup Table Module](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.19.html). As an alternative to vtkDICOMApplyPalette, the palette lookup table can be retrieved from a DICOM data set with the vtkDICOMLookupTable class. The final category of color display, pseudo-color, is displayed as per the grayscale pipeline described above, except that a pseudocolor LUT is used in place of the black-to-white (MONOCHROME2) or white-to-black (MONOCHROME1) LUT. vtk-dicom-0.8.12/Documents/ImageOrientation.md000066400000000000000000000063051356440565500212410ustar00rootroot00000000000000## Image Orientation {#imageOrientation} @brief Medical image orientation in VTK. ## Overview When people use the term "image orientation" with respect to medical images, they usually mean one or more of the items listed below: 1. The order in which the pixels, rows, and slices are stored in the computer's memory. 2. The orientation of the image slices in a real-world coordinate system, for example the patient coordinate system as defined by the medical imaging equipment that generated the images. 3. The orientation of the subject (patient) with respect to the viewer when the images are viewed on a workstation. The first of these, the way the data is stored in memory, should merely be an implementation detail, but unfortunately the vtkImageViewer class insists that the pixels must be arranged in memory such that the pixel at the bottom-left corner of the image is the pixel at the lowest address in memory. This is in conflict with DICOM, which stores the top-left pixel as the first pixel in the file. To provide compatibility with the vtkImageViewer, the default behavior of the vtkDICOMReader is to flip the image in memory while it is loading it from the file. This behavior can be turned off by calling reader->SetMemoryRowOrderToFileNative(). The second and third items in the list can be referred to as the real-world orientation, and the display orientation, respectively. Neither of these can be considered an implementation detail, as both of them are crucial to the user experience. Also, it is important not to confuse one with the other. An application that incorrectly manages the real-world orientation is seriously flawed, even if it manages to display the images to the user in the correct orientation. The real-world orientation is provided by the GetPatientMatrix() method of the vtkDICOMReader. This method returns a vtkMatrix4x4 object that describes the coordinate transformation from the data coordinates of the vtkImageData that stores the image, to the real-world Patient Coordinate System defined in the DICOM standard. The matrix is used to correctly place the image in the VTK world coordinate system. The PatientMatrix is constructed from the ImagePositionPatient and ImageOrientationPatient attributes in the series of DICOM files that are provided to the reader. Note that unless SetMemoryRowOrderToFileNative() has been called on the reader, the orientation of the matrix will be flipped with respect to ImageOrientationPatient in order to account for the fact that the image rows were flipped in memory. ~~~~~~~~{.cpp} reader->SetMemoryRowOrderToFileNative(); // keep native row order reader->Update(); // update the reader vtkMatrix4x4 *matrix = reader->GetPatientMatrix(); // create an image actor and specify the orientation. vtkNew actor; actor->GetMapper()->SetInputConnection(reader->GetOutputPort()); actor->SetUserMatrix(matrix); ~~~~~~~~ Setting the actor's UserMatrix will ensure that the real-world orientation of the image is correctly handled, as far as the VTK display pipeline is concerned. It does not, however, set the display orientation, which is the responsibility of the application. The display orientation can be set via manipulation of the VTK camera. vtk-dicom-0.8.12/Documents/ImageReader.md000066400000000000000000000316031356440565500201470ustar00rootroot00000000000000## Image Reader {#imageReader} @brief Nitty-gritty details for loading DICOM images. ## Overview The vtkDICOMReader converts a series of images (usually collated by vtkDICOMDirectory) into three outputs: 1. a vtkImageData object to hold the pixel data for the volume 2. a vtkMatrix4x4 to hold the position and orientation of the volume 3. a vtkDICOMMetaData object to hold the meta-data Each slice of the output image data is generated from one of the input files (or, in the case of multi-frame images, from one frame). The slices are sorted into the correct order by the reader, so it is not necessary to sort the files beforehand. The reader also computes a 4x4 matrix, the "PatientMatrix", that can be used to convert from image data coordinates (measured in millimeters from the center of the first voxel), to DICOM patient coordinates (as described in the [DICOM Image Plane Module](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.2.html)). In order to achieve this, the reader checks the Image Position and Image Orientation that are recorded in the meta data for each slice. Then, if and only if the slices have the same orientation and the slice positions fit a line, the reader sorts the slices according to location. The vtkImageData *z* spacing is then set to the average center-to-center distance between adjacent slices. In the absence of Image Position information in the meta data, or if the slices do not form a rectilinear or parallelepiped volume, then the slices are sorted only according to the Instance Number in the meta data. There is also a reader method called SortingOff() than can be called to disable sorting entirely, so that the order of the slices in the vtkImageData will reflect the order of the list of files provided to the reader. ## Row order DICOM images are rasterized from top to bottom, meaning that the first pixel in the file is meant to be displayed at the top left corner of the viewport. The convention for the VTK image reader classes, however, is to store the pixels in memory such that the first pixel is at the bottom left corner. To support his convention, the default behavior of the vtkDICOMReader is to flip the images while reading them so that last image row in the file becomes the first row of the vtkImageData. In this way, if the image is displayed by the vtkImageViewer, it will be displayed the right way up. However, flipping the image has consequences. When the reader flips the image image, it likewise flips the PatientMatrix with respect to the ImageOrientationPatient stored in the file. Also, since a flip along one axis requires a flip along another axis in order for the coordinate system to obey the right-hand-rule, the reversal of the ordering of the rows is accompanied by a reversal of the ordering of the slices. This is done because the alternative, introducing a PatientMatrix with a negative determinant, will cause difficulties with 3D processing and display of the images. Hence, unless the intent is to use vtkDICOMReader in a simple 2D display pipeline with vtkImageViewer, it is recommended to call the SetMemoryRowOrderToFileNative() method when reading the images. This will keep the keep the image in its original top-to-bottom ordering. ~~~~~~~~{.cpp} vtkNew reader; reader->SetFileNames(fileNameArray); reader->SetMemoryRowOrderToFileNative(); reader->Update(); // get the matrix to use when displaying the data // (this matrix provides position and orientation) vtkMatrix4x4 *matrix = reader->GetPatientMatrix(); ~~~~~~~~ ## CT gantry tilt Certain CT scan protocols present a challenge for 3D image analysists because the slice orientation is tilted with respect to the scan direction, resulting in an acquisition volume that is a parallelepiped. This occurs because of the geometry of the CT scanner itself: traditionally, CT scanners were designed to acquire one slice at a time with the bed moving a few millimeters between slices. The CT gantry, and hence the slices, could be tilted to better align with anatomy, but tilting the bed of the scanner to match was undesirable for obvious reasons. Hence the direction in which the bed moved was not at a right angle to the slices. Volume rendering techniques and many 3D filtering techniques assume a uniform, orthonormal sampling of the data. It is therefore necessary to "un-tilt" or rectify these gantry-tilted CT images. This can be done with the vtkDICOMCTRectifier class, which rectifies tilted CT volumes and acts as a simple pass-through for volumes that are already rectilinear. The rectification is achieved through a simple in-plane translation and sinc interpolation of the slices. The resulting slices have the same orientation as the original slices. ~~~~~~~~{.cpp} vtkNew rectify; rectify->SetVolumeMatrix(reader->GetPatientMatrix()); rectify->SetInputConnection(reader->GetOutputPort()); rectify->Update(); // get the new PatientMatrix for the rectified volume vtkMatrix4x4 *matrix = rectify->GetRectifiedMatrix(); ~~~~~~~~ ## CT and PET rescaled values Another challenge with CT images is that the pixel intensity scaling, as recorded in the RescaleSlope and RescaleIntercept attributes of the file, can vary from slice to slice. This is done to make the best use of the limited dynamic range of the analog-to-digital converter in the scanner. By default, the vtkDICOMReader will automatically detect the changes in RescaleSlope and RescaleIntercept, and will then adjust the slices so that they are all the same. This is controlled with the AutoRescaleOn()/Off() method of the reader. In general, this automatic adjustment is safe for CT images, because usually it is only RescaleIntercept that varies, and it usually varies by a whole number. There is no loss of fidelity when the integer pixel value is adjusted by a whole number, as long as it remains within the range that can be represented by the datatype. For PET images, however, the RescaleSlope also varies and it is necessary to use floating-point values. If accurate pixel values are required (which is the case in most medical applications), it is recommended that AutoRescaleOff() is used. The rescaling of the pixel values to "real" values should be done with the vtkDICOMApplyRescale filter, which will produce pixel values as "double" (or, optionally, as "float") after applying the RescaleSlope and the RescaleIntercept for each slice. ~~~~~~~~{.cpp} vtkNew reader; reader->SetFileNames(fileNameArray); reader->SetMemoryRowOrderToFileNative(); reader->AutoRescaleOff(); vtkNew rescale; rescale->SetInputConnection(reader->GetOutputPort()); rescale->SetOutputScalarTypeToFloat(); rescale->Update(); ~~~~~~~~ The vtkDICOMReader provides the rescaling information, along with all the other meta data, via the VTK data pipeline (i.e. via GetOutputPort()). If you use this filter together with vtkDICOMCTRectifier in the same pipeline, it is recommened that this filter comes before the rectifier. ## Multi-dimensional images In addition to sorting slices by location, the reader attempts to detect multi-dimensional data sets. It recognizes up to 5 dimensions: *x*, *y*, *z*, *t*, and a vector dimension. This is best illustrated by example. If an MR raw-data DICOM series provides real and imaginary pixel data at each slice location, then the vtkImageData produced by the reader will have two components (real and imaginary). We interpret this as an image with a vector dimension of 2. When a time dimension is present, things become interesting. The default behavior of the reader is to store adjacent time points in adjacent vtkImageData slices. This works well when the images are to be displayed slice-by-slice. It is, however, inappropriate if the vtkImageData is to be displayed as a multi-planar reformat or as a volume. For this reason, the vtkDICOMReader has a method called TimeAsVectorOn() that will cause the reader to treat each voxel as a time vector. In other words, if the DICOM data has 10 individual time slots, then the vtkImageData will have 10 components per voxel (or 30 components in the case of RGB data). By selecting a specific component or range of components when displaying the data, one can display a specific point in time. Five dimensions come into play when the DICOM series has frames that are at the same location and within the same time slot. Going back to the (real,imaginary) example, if such a series of images is read after TimeAsVectorOn() is called, then the vtkImageData will have 20 components per voxel if there are 10 time slots. The 20 components can be thought of as 10 component blocks with 2 components per block. A filter like vtkImageExtractComponents can be used to extract a block of components that corresponds to a particular time slot. If the behavior described in the preceding paragraphs is not desirable, then one can use the SetDesiredTimeIndex(int) method to read just one time slot, and use a set of *N* readers to read the *N* time slots as *N* separate VTK data sets. ~~~~~~~~{.cpp} vtkNew reader; reader->SetFileNames(filenames); // read just the meta data, to get the time dimension reader->UpdateInformation(); int numberOfTimeSlots = reader->GetTimeDimension(); if (numberOfTimeSlots > 1) { // example: read only the final time slot reader->SetDesiredTimeIndex(numberOfTimeSlots-1); } // update the reader reader->Update(); ~~~~~~~~ ## Enhanced multi-frame and multi-stack files The DICOM standard allows for multiple slices (frames) per file, or even multiple stacks of slices per file. In the case of multi-frame files, each frame is assigned a position and a time slot and the frames are sorted according to the slice sorting method described in the previous section. In multi-stack files there are, as one might expect, more than one rectilinear (or perhaps non-rectilinear) volume. If sorting has been turned off with the SortingOff() method, then all the frames in the file are read sequentially into vtkImageData slices. If sorting is on, however, then the reader is only able to read one stack at a time. The method SetDesiredStackID() allows one of the stacks to be chosen by name. ~~~~~~~~{.cpp} // for this example, 'filename' is multi-frame, multi-stack file vtkNew reader; reader->SetFileName(filename); // read the meta data, get a list of stacks reader->UpdateInformation(); vtkStringArray *stackNames = reader->GetStackIDs(); // specify a stack, here we assume we know the name: reader->SetDesiredStackID("1"); ~~~~~~~~ ## Stacks in legacy files Even though the DICOM standard only describes the use of stacks in reference to enhanced multi-frame files, the concept is also useful when working with "legacy" files that only have one slice per file (such legacy files are, in fact, still the norm while the enhanced files described in the previous section are relatively uncommon). The reader defines a stack as a set of slices that have the same orientation, and whose corners are placed along straight lines in space. This allows for rectilinear and parallelepiped volumes, with the latter being necessary for the tilted-gantry CT scans discussed previously. If multiple stacks are required to capture all of the slices in series, the reader will automatically sort the slices into stacks and reader->GetStackIDs() will return an array with multiple values. In this case, the reader will name the stacks "0", "1", "2", etcetera. Generally, such multi-stack series only occur for locators or for scout series. For example, a MR scout series will often have a few images for each orientation, and will therefore result in three stacks. A CT locator will be identified as a single-slice stack that occurs before the main stack. ## Using DICOM with MINC or NIfTI For DICOM images of the head, chest, or abdomen the *x* coordinate increases from right to left, the *y* coordinate increases from anterior to posterior, and the *z* coordinate increases from inferior to superior. This is often referred to as the LPS coordinate system, and refers to the coordinates that are achieved after the image is been transformed via the PatientMatrix. The NIfTI and MINC file formats use a coordinate system where *x* increases to the right and *y* increases to the front (anterior). Hence, the coordinate system is rotated by 180 degrees as compared to DICOM. The vtkDICOMToRAS filter can adjust a DICOM image so that it shares the same coordinate system as MINC and NIfTI. It can also be used to do the reverse, and convert a NIfTI or MINC image to DICOM coordinates. ~~~~~~~~{.cpp} vtkNew converter; converter->SetInputConnection(reader->GetOutputPort()); converter->SetPatientMatrix(reader->GetPatientMatrix()); converter->SetAllowRowReordering(true); converter->SetAllowColumnReordering(false); converter->UpdateMatrix(); vtkMatrix4x4 *matrix = converter->GetRASMatrix(); converter->Update(); vtkImageData *image = converter->GetOutput(); ~~~~~~~~ vtk-dicom-0.8.12/Documents/ImageWriter.md000066400000000000000000000115101356440565500202140ustar00rootroot00000000000000## Image Writer {#imageWriter} @brief Details on how to write DICOM images. ## Overview The vtkDICOMWriter takes a vtkImageData object as input, and writes a series of DICOM image files to disk. Since the required meta data for an image varies from one modality to another, the writer delegates the creation of the meta data to another class called vtkDICOMGenerator. A short example of how this is done is as follows: ~~~~~~~~{.cpp} // Create a generator for MR images. vtkNew generator; // Create a meta data object with some desired attributes. vtkNew meta; meta->Set(DC::PatientName, "Doe^John"); meta->Set(DC::ScanningSequence, "GR"); // Gradient Recalled meta->Set(DC::SequenceVatiant, "SP"); // Spoiled meta->Set(DC::ScanOptions, ""); meta->Set(DC::MRAcquisitionType, "2D"); // Plug the generator and meta data into the writer. vtkNew writer; writer->SetInputConnection(lastFilter->GetOutputPort()); writer->SetMetaData(meta.GetPointer()); writer->SetGenerator(generator.GetPointer()); // Set the output filename format as a printf-style string. writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); // Set the directory to write the files into. writer->SetFilePrefix("/the/output/directory"); // Write the file. writer->Write(); ~~~~~~~~ The vtkDICOMMRGenerator assists with conformance by generating all the data set attributes that are required by the MR IOD. It will also scan through the vtkMetaData object that is provided to the writer, and use any of its attributes as long as 1) they are defined in the MR IOD, and 2) they are deemed to be valid for the image that is being written. A partial list of attributes that are never taken from the input meta data is as follows: 1. `SOPInstanceUID` (this is always re-generated to ensure its uniqueness) 2. `SeriesInstanceUID` (ditto) 3. `ImageType` (this is set to `DERIVED\SECONDARY\OTHER` by default) 4. `PixelSpacing` (this is set from the VTK image information) 5. `Rows` and `Columns` (ditto) 6. `ImagePositionPatient` and `ImageOrientationPatient` (these are set from the PatientMatrix) The generator always creates a new `SOPInstanceUID` for each file and a new `SeriesInstanceUID` for each series. There is no way to set these UIDs manually. The `ImageType` is set to `DERIVED` by default, because an image cannot be considered to be `ORIGINAL` if it was modified in any way after its original acquisition. Finally, all information related to the pixel values or the slice geometry is generated from the vtkImageData information and from the PatientMatrix. The vtkDICOMWriter allows several parameters, including `ImageType`, to be set when writing the file. These are demonstrated in the following example. ~~~~~~~~{.cpp} // Plug the generator and meta data into the writer. vtkNew writer; writer->SetInputConnection(lastFilter->GetOutputPort()); writer->SetMetaData(meta.GetPointer()); writer->SetGenerator(generator.GetPointer()); // Set the output filename format as a printf-style string. writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); // Set the directory to write the files into writer->SetFilePrefix("/the/output/directory"); // Set the image type to Multi-planar Reformat. // (forward slashes will be converted to backward slashes) writer->SetImageType("DERIVED/SECONDARY/MPR"); writer->SetSeriesDescription("Sagittal Multi-planar Reformat"); // Set the 4x4 matrix that gives the position and orientation. writer->SetPatientMatrix(patientMatrix); ~~~~~~~~ ## Customizing the generators At the present time, the vtkDICOMWriter has only three generators available: the vtkDICOMMRGenerator (for MR), the vtkDICOMCTGenerator (for CT), and the vtkDICOMSCGenerator (for Secondary Capture, e.g. screenshots). Writing a new generator class is the recommended method for adding support for a new modality to the vtkDICOM library, though that is beyond the scope of this document. ## Writing a raw pixel buffer to a DICOM file In addition to the vtkDICOMWriter, there is a class called the vtkDICOMCompiler that can write meta data and image data directly to a file without it being processed by a vtkDICOMGenerator. It can be used to efficiently perform such actions as changing the transfer syntax of the data or tweaking the meta data. By design, the vtkDICOMCompiler will take, as input, a meta data object that describes a series of images, and it will then write the files in the series one-by-one. ~~~~~~~~{.cpp} vtkNew compiler; compiler->SetMetaData(meta); int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { char outputFile[256]; sprintf(outputFile, "IM-0001-%04.4d.dcm", i+1); compiler->SetFileName(outputFile); compiler->SetIndex(i); compiler->WriteHeader(); compiler->WritePixelData(rawPixelBufferForFile); } ~~~~~~~~ vtk-dicom-0.8.12/Documents/Installation.md000066400000000000000000000067361356440565500204540ustar00rootroot00000000000000## Installation {#installation} @brief The different ways to install the package. ## Building as part of the VTK build If are building VTK 7 yourself, then vtk-dicom can be enabled as a VTK remote module. This will cause cmake to automatically download the vtk-dicom source code from Github and build it as part of the VTK build. To enable vtk-dicom, select the following when you configure VTK with cmake: Module_vtkDICOM:BOOL=ON After running cmake once, the following new options will become available: BUILD_DICOM_PROGRAMS:BOOL=ON USE_GDCM:BOOL=OFF USE_ITK_GDCM:BOOL=OFF USE_DCMTK:BOOL=OFF It is highly recommended that you turn the USE_GDCM option ON, otherwise vtk-dicom will not be able to read compressed dicom files. This requires [downloading GDCM from its project website](https://sourceforge.net/projects/gdcm/). The USE_ITK_GDCM option can be used as an alternative to USE_GDCM if you are building a program that uses ITK. With this option, it is not necessary to build GDCM separately. USE_DCMTK can be enabled if you cannot use GDCM, but still require the ability to read compressed files. Note that the default DCMTK build does not provide JPEG2000 support, though it can be purchased as an add-on. ## Building outside of VTK The following procedure can be used to build the vtkDICOM library, assuming that you have already built VTK with CMake. This example is for building the package on Linux or OS X in the bash shell. $ # specify the directory where you built VTK, this is an example $ export VTK_DIR=/Volumes/HD2/vtk-release-build/ $ unzip vtk-dicom-master.zip $ mkdir vtk-dicom-master-build $ cd vtk-dicom-master-build $ cmake -D CMAKE_BUILD_TYPE:STRING=Release ../vtk-dicom-master $ make Optionally, the following cmake variables can be set with ccmake or cmake-gui: BUILD_EXAMPLES ON BUILD_PROGRAMS ON BUILD_SHARED_LIBS OFF BUILD_TESTING ON USE_DCMTK OFF USE_GDCM OFF USE_ITK_GDCM OFF VTK_DIR /Volumes/HD2/vtk-release-build/ The USE_DCMTK and USE_GDCM variables allow you to add the image decompression capabilities of either of these packages (do not specify both!) to the vtkDICOMReader. If you do not specify one of these packages, then the vtkDICOMReader will only be able to read uncompressed files. See the section above for additional details on these variables. ## Configuring your own cmake project The easiest way to use the vtk-dicom library in your own project is to add the following command block to the main CMakeLists.txt file in your project: find_package(DICOM QUIET) if(DICOM_FOUND) include(${DICOM_USE_FILE}) endif() set(VTK_DICOM_LIBRARIES vtkDICOM) It is not recommended to try to use vtk-dicom (or VTK itself) within projects that are not built with cmake. ## Wrapper languages All of the vtk-dicom classes can be used with Python, as long as VTK was built with python wrapping enabled. A few of the classes, including the reader and writer, can be used though Java and Tcl. If you are already using the vtk .deb packages that came with your debian or ubuntu linux distribution, then you have the option of using the vtk-debian packages that were created by Mathieu Malaterre and that are maintained by the [neuro-debian team](http://neuro.debian.net/): sudo apt-get install python-vtk-dicom sudo apt-get install libvtkdicom-java vtk-dicom-0.8.12/Documents/License.md000066400000000000000000000030431356440565500173610ustar00rootroot00000000000000## License {#license} @brief The license for vtk-dicom is the 3-clause BSD license. Copyright (c) 2012-2019 David Gobbi All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of David Gobbi nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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. vtk-dicom-0.8.12/Documents/Main.md000066400000000000000000000022411356440565500166620ustar00rootroot00000000000000## DICOM for VTK {#mainpage} Copyright (c) 2012-2019, David Gobbi All rights reserved. See [license](license.html) for more details. This package contains a set of classes for managing DICOM files and metadata from within VTK, and some utility programs for interrogating and converting DICOM files. Note that if you download the zip file from github, all of the files will have unix-style line endings. Windows users should therefore clone the respository with git, instead of downloading the zip file, otherwise they might have difficulty viewing and compiling the source code. The source should compile on Windows, OS X, and Linux. CMake is required to build the source. Detailed build instructions are given on the last page of the pdf file listed below. More information can be found at the following pages: * http://dgobbi.github.io/vtk-dicom/ * http://dgobbi.github.io/vtk-dicom/doc/api/ * http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf * http://github.com/dgobbi/vtk-dicom/wiki/Command-Line-Tools A software quality dashboard is provided, with nightly builds on Linux (gcc 4.6) and Windows (Visual Studio 2015): * http://my.cdash.org/index.php?project=vtk-dicom vtk-dicom-0.8.12/Examples/000077500000000000000000000000001356440565500152725ustar00rootroot00000000000000vtk-dicom-0.8.12/Examples/CMakeLists.txt000066400000000000000000000050261356440565500200350ustar00rootroot00000000000000if(POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() include_directories(${DICOM_INCLUDE_DIRS}) if(NOT VTK_VERSION VERSION_LESS 6) set(VTK_RENDERING_LIBS) foreach(_lib RenderingImage InteractionStyle RenderingFreeType) list(APPEND VTK_RENDERING_LIBS ${VTK_TARGET_PREFIX}${_lib}) endforeach() foreach(_lib RenderingOpenGL RenderingFreeTypeOpenGL RenderingOpenGL2 RenderingFreeTypeOpenGL2) list(FIND VTK_LIBRARIES ${VTK_TARGET_PREFIX}${_lib} _index) if(_index GREATER -1) list(APPEND VTK_RENDERING_LIBS ${VTK_TARGET_PREFIX}${_lib}) endif() endforeach() else() set(VTK_RENDERING_LIBS vtkRendering) # VTK 5.x endif() set(BASE_LIBS ${VTK_DICOM_LINK_TARGET} ${VTK_LIBS}) add_executable(TestDICOMCompiler TestDICOMCompiler.cxx) target_link_libraries(TestDICOMCompiler ${BASE_LIBS}) add_executable(TestDICOMDirectory TestDICOMDirectory.cxx) target_link_libraries(TestDICOMDirectory ${BASE_LIBS}) add_executable(TestDICOMParser TestDICOMParser.cxx) target_link_libraries(TestDICOMParser ${BASE_LIBS}) add_executable(TestDICOMFileSorter TestDICOMFileSorter.cxx) target_link_libraries(TestDICOMFileSorter ${BASE_LIBS}) add_executable(TestDICOMReader TestDICOMReader.cxx) target_link_libraries(TestDICOMReader ${BASE_LIBS}) add_executable(TestDICOMWriter TestDICOMWriter.cxx) target_link_libraries(TestDICOMWriter ${BASE_LIBS}) add_executable(TestDICOMRealWorldValue TestDICOMRealWorldValue.cxx) target_link_libraries(TestDICOMRealWorldValue ${BASE_LIBS}) if(VTK_VERSION VERSION_GREATER 5.9) add_executable(TestDICOMDisplay TestDICOMDisplay.cxx) target_link_libraries(TestDICOMDisplay ${BASE_LIBS} ${VTK_RENDERING_LIBS}) if(NOT VTK_VERSION VERSION_LESS 8.90) vtk_module_autoinit(TARGETS TestDICOMDisplay MODULES ${VTK_RENDERING_LIBS}) endif() add_executable(TestDICOMOverlay TestDICOMOverlay.cxx) target_link_libraries(TestDICOMOverlay ${BASE_LIBS} ${VTK_RENDERING_LIBS}) if(NOT VTK_VERSION VERSION_LESS 8.90) vtk_module_autoinit(TARGETS TestDICOMOverlay MODULES ${VTK_RENDERING_LIBS}) endif() add_executable(TestNIFTIDisplay TestNIFTIDisplay.cxx) target_link_libraries(TestNIFTIDisplay ${BASE_LIBS} ${VTK_RENDERING_LIBS}) if(NOT VTK_VERSION VERSION_LESS 8.90) vtk_module_autoinit(TARGETS TestNIFTIDisplay MODULES ${VTK_RENDERING_LIBS}) endif() add_executable(TestScancoCTDisplay TestScancoCTDisplay.cxx) target_link_libraries(TestScancoCTDisplay ${BASE_LIBS} ${VTK_RENDERING_LIBS}) if(NOT VTK_VERSION VERSION_LESS 8.90) vtk_module_autoinit(TARGETS TestScancoCTDisplay MODULES ${VTK_RENDERING_LIBS}) endif() endif() vtk-dicom-0.8.12/Examples/TestDICOMCompiler.cxx000066400000000000000000000224411356440565500212070ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMParser.h" #include "vtkDICOMFile.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMCompiler.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include "vtkTypeInt64Array.h" #include #include #include // For compatibility with new VTK generic data arrays #ifdef vtkGenericDataArray_h #define SetTupleValue SetTypedTuple #define GetTupleValue GetTypedTuple #endif // remove path portion of filename static const char *fileBasename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // compute a 32-bit CRC static unsigned int crc32(unsigned int crc, unsigned char *buf, size_t l) { const unsigned int table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; if (l > 0) { do { crc = table[(crc ^ (*buf++)) & 0xff] ^ (crc >> 8); } while (--l); } return crc; } // This program read and write dicom files and check that the // crc32 of the written file is the same as for the original. int main(int argc, char *argv[]) { int rval = 0; if (argc < 2) { printf("usage: %s file1.dcm [file2.dcm ...]\n", fileBasename(argv[0])); return rval; } vtkSmartPointer files = vtkSmartPointer::New(); for (int argi = 1; argi < argc; argi++) { files->InsertNextValue(argv[argi]); } const char *outfile = "/tmp/%s"; // sort the files by study and series vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->RequirePixelDataOff(); sorter->SetInputFileNames(files); sorter->Update(); vtkSmartPointer parser = vtkSmartPointer::New(); vtkSmartPointer data = vtkSmartPointer::New(); parser->SetMetaData(data); vtkSmartPointer compiler = vtkSmartPointer::New(); compiler->SetMetaData(data); compiler->KeepOriginalPixelDataVROn(); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { vtkStringArray *a = sorter->GetFileNamesForSeries(k); int l = static_cast(a->GetNumberOfValues()); std::string fname = a->GetValue(0); data->Clear(); data->SetNumberOfInstances(static_cast(l)); vtkSmartPointer offsetArray = vtkSmartPointer::New(); offsetArray->SetNumberOfComponents(2); offsetArray->SetNumberOfTuples(l); for (int i = 0; i < l; i++) { // read the DICOM series with the parser fname = a->GetValue(i); parser->SetIndex(i); parser->SetFileName(fname.c_str()); parser->Update(); vtkTypeInt64 tp[2]; tp[0] = parser->GetFileOffset(); tp[1] = parser->GetFileSize(); offsetArray->SetTupleValue(i, tp); } for (int i = 0; i < l; i++) { // write the DICOM series with the compiler fname = a->GetValue(i); char outpath[128]; sprintf(outpath, outfile, fileBasename(fname.c_str())); compiler->SetFileName(outpath); const char *instanceUID = data->Get(i, DC::SOPInstanceUID).GetCharData(); if (instanceUID == 0) { instanceUID = data->Get(i, DC::MediaStorageSOPInstanceUID).GetCharData(); } compiler->SetSOPInstanceUID(instanceUID); compiler->SetTransferSyntaxUID( data->Get(i, DC::TransferSyntaxUID).GetCharData()); compiler->SetSeriesInstanceUID( data->Get(i, DC::SeriesInstanceUID).GetCharData()); compiler->SetImplementationClassUID( data->Get(i, DC::ImplementationClassUID).GetCharData()); compiler->SetImplementationVersionName( data->Get(i, DC::ImplementationVersionName).GetCharData()); compiler->SetSourceApplicationEntityTitle( data->Get(i, DC::SourceApplicationEntityTitle).GetCharData()); compiler->SetIndex(i); compiler->WriteHeader(); if (parser->GetPixelDataFound()) { vtkTypeInt64 tp[2]; offsetArray->GetTupleValue(i, tp); vtkDICOMFile::Size offset = tp[0]; vtkDICOMFile::Size size = tp[1]; vtkDICOMFile infile(fname.c_str(), vtkDICOMFile::In); infile.SetPosition(offset); unsigned char *buffer = new unsigned char[size-offset]; infile.Read(buffer, size-offset); infile.Close(); compiler->WritePixelData(buffer, size - offset); delete [] buffer; } compiler->Close(); // compare the crc32 hash unsigned int hash[2] = { 0, 0 }; for (int jj = 0; jj < 2; jj++) { const char *fileToHash = outpath; if (jj == 0) { fileToHash = fname.c_str(); } unsigned char hashbuf[8192]; vtkDICOMFile f(fileToHash, vtkDICOMFile::In); while (!f.EndOfFile() && !f.GetError()) { size_t c = f.Read(hashbuf, sizeof(hashbuf)); hash[jj] = crc32(hash[jj], hashbuf, c); } f.Close(); } if (hash[0] != hash[1]) { std::cerr << "Hash mismatch!\n"; std::cerr << hash[0] << " " << fname.c_str() << "\n"; std::cerr << hash[1] << " " << outpath << "\n"; } else { std::cerr << "Matched for " << fname.c_str() << "\n"; } } } } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMDirectory.cxx000066400000000000000000000054561356440565500214100ustar00rootroot00000000000000#include "vtkDICOMDirectory.h" #include "vtkDICOMItem.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMDictionary.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer ddir = vtkSmartPointer::New(); if (argc < 2 || argc > 3) { cout << "usage: " << exename << " [depth]" << endl; exit(0); } const char *dirname = argv[1]; int depth = 1; if (argc > 2) { depth = static_cast(atol(argv[2])); } ddir->SetDirectoryName(dirname); ddir->SetScanDepth(depth); ddir->Update(); int n = ddir->GetNumberOfPatients(); for (int i = 0; i < n; i++) { const vtkDICOMItem& patientItem = ddir->GetPatientRecord(i); cout << "Patient " << i << ": " << patientItem.Get(DC::PatientID).AsString() << "\n"; vtkIntArray *studies = ddir->GetStudiesForPatient(i); vtkIdType m = studies->GetMaxId() + 1; if (i == n-1 && m > 0) { TestAssert(studies->GetValue(m-1) == ddir->GetNumberOfStudies() - 1); } for (vtkIdType jj = 0; jj < m; jj++) { int j = studies->GetValue(jj); const vtkDICOMItem& studyItem = ddir->GetStudyRecord(j); const vtkDICOMItem& studyPItem = ddir->GetPatientRecordForStudy(j); cout << " Study " << j << ": \"" << studyItem.Get(DC::StudyDescription).AsString() << "\" \"" << studyPItem.Get(DC::PatientName).AsString() << "\" " << studyItem.Get(DC::StudyDate).AsString() << "\n"; int k0 = ddir->GetFirstSeriesForStudy(j); int k1 = ddir->GetLastSeriesForStudy(j); if (i == n-1 && jj == m-1) { TestAssert(k1 == ddir->GetNumberOfSeries() - 1); } for (int k = k0; k <= k1; k++) { const vtkDICOMItem& seriesItem = ddir->GetSeriesRecord(k); cout << " Series " << k << ": \"" << seriesItem.Get(DC::SeriesDescription).AsString() << "\" " << seriesItem.Get(DC::SeriesNumber).AsString() << " " << seriesItem.Get(DC::Modality).AsString() << "\n"; vtkStringArray *a = ddir->GetFileNamesForSeries(k); for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++) { cout << " " << a->GetValue(kk) << "\n"; } } } } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMDisplay.cxx000066400000000000000000000161601356440565500210430ustar00rootroot00000000000000// Test the vtkDICOMReader by displaying an image. #include "vtkDICOMMetaData.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMReader.h" #include "vtkDICOMCTRectifier.h" #include "vtkDICOMApplyPalette.h" #include "vtkRenderWindowInteractor.h" #include "vtkInteractorStyleImage.h" #include "vtkRenderWindow.h" #include "vtkRenderer.h" #include "vtkCamera.h" #include "vtkImageData.h" #include "vtkImageReslice.h" #include "vtkImageResliceMapper.h" #include "vtkImageProperty.h" #include "vtkImageSlice.h" #include "vtkImageReader2.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkMatrix4x4.h" #include "vtkMath.h" #include "vtkErrorCode.h" int main(int argc, char *argv[]) { vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer style = vtkSmartPointer::New(); style->SetInteractionModeToImage3D(); vtkSmartPointer renWin = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); vtkSmartPointer files = vtkSmartPointer::New(); const char *stackID = 0; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "--stack") == 0) { if (i+1 < argc) { stackID = argv[++i]; } } else { files->InsertNextValue(argv[i]); } } // find all DICOM files supplied by the user vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->RequirePixelDataOn(); sorter->SetScanDepth(1); sorter->SetInputFileNames(files); sorter->Update(); // find the series with the largest number of files int m = sorter->GetNumberOfStudies(); int seriesIdx = 0; int kmax = 0; for (int i = 0; i < m; i++) { int fj = sorter->GetFirstSeriesForStudy(i); int lj = sorter->GetLastSeriesForStudy(i); for (int j = fj; j <= lj; j++) { int k = sorter->GetFileNamesForSeries(j)->GetNumberOfValues(); if (k > kmax) { kmax = k; seriesIdx = j; } } } // exit if no files found if (kmax == 0) { fprintf(stderr, "No PixelData to display!\n"); return 1; } // display the longest series vtkStringArray *a = sorter->GetFileNamesForSeries(seriesIdx); vtkSmartPointer reslice = vtkSmartPointer::New(); vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetMemoryRowOrderToFileNative(); //reader->TimeAsVectorOn(); //reader->SetDesiredTimeIndex(5); if (stackID) { reader->SetDesiredStackID(stackID); } reader->SetFileNames(a); // update the meta data reader->UpdateInformation(); vtkDICOMMetaData *meta = reader->GetMetaData(); // check whether data has a palette bool hasPalette = false; if (meta->Get(DC::PhotometricInterpretation).Matches("PALETTE?COLOR") || meta->Get(DC::PixelPresentation).Matches("COLOR") || meta->Get(DC::PixelPresentation).Matches("MIXED") || meta->Get(DC::PixelPresentation).Matches("TRUE_COLOR")) { hasPalette = true; // palette maps stored values, not slope/intercept rescaled values reader->AutoRescaleOff(); } // update the data reader->Update(); if (reader->GetErrorCode() != vtkErrorCode::NoError) { return 1; } double range[2]; int extent[6]; reader->GetOutput()->GetScalarRange(range); reader->GetOutput()->GetExtent(extent); // get the output port to connect to the display pipeline vtkAlgorithmOutput *portToDisplay = reader->GetOutputPort(); vtkSmartPointer palette; if (hasPalette) { palette = vtkSmartPointer::New(); palette->SetInputConnection(reader->GetOutputPort()); palette->Update(); palette->GetOutput()->GetScalarRange(range); portToDisplay = palette->GetOutputPort(); } vtkSmartPointer rect; if (meta->Get(DC::Modality).Matches("CT")) { rect = vtkSmartPointer::New(); rect->SetVolumeMatrix(reader->GetPatientMatrix()); rect->SetInputConnection(portToDisplay); rect->Update(); portToDisplay = rect->GetOutputPort(); } static double viewport[3][4] = { { 0.67, 0.0, 1.0, 0.5 }, { 0.67, 0.5, 1.0, 1.0 }, { 0.0, 0.0, 0.67, 1.0 }, }; // check if image is 2D bool imageIs3D = (extent[5] > extent[4]); for (int i = 2*(imageIs3D == 0); i < 3; i++) { vtkSmartPointer imageMapper = vtkSmartPointer::New(); if (i < 3) { imageMapper->SetInputConnection(portToDisplay); } imageMapper->SliceFacesCameraOn(); imageMapper->SliceAtFocalPointOn(); imageMapper->ResampleToScreenPixelsOn(); vtkSmartPointer image = vtkSmartPointer::New(); image->SetMapper(imageMapper); image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5*(range[0] + range[1])); image->GetProperty()->SetInterpolationTypeToNearest(); vtkSmartPointer renderer = vtkSmartPointer::New(); renderer->AddViewProp(image); renderer->SetBackground(0.0, 0.0, 0.0); if (imageIs3D) { renderer->SetViewport(viewport[i]); } renWin->AddRenderer(renderer); // use center point to set camera double *bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5*(bounds[0] + bounds[1]); point[1] = 0.5*(bounds[2] + bounds[3]); point[2] = 0.5*(bounds[4] + bounds[5]); double maxdim = 0.0; for (int j = 0; j < 3; j++) { double s = 0.5*(bounds[2*j+1] - bounds[2*j]); maxdim = (s > maxdim ? s : maxdim); } vtkCamera *camera = renderer->GetActiveCamera(); camera->SetFocalPoint(point); point[i % 3] -= 500.0; camera->SetPosition(point); if ((i % 3) == 2) { camera->SetViewUp(0.0, -1.0, 0.0); } else { camera->SetViewUp(0.0, 0.0, +1.0); } camera->ParallelProjectionOn(); camera->SetParallelScale(maxdim); } if (imageIs3D) { renWin->SetSize(600, 400); } else { renWin->SetSize(400, 400); } renWin->Render(); vtkStringArray *sarray = reader->GetStackIDs(); if (sarray->GetNumberOfValues()) { cout << "StackIDs (choose one with --stack):"; for (vtkIdType ii = 0; ii < sarray->GetNumberOfValues(); ii++) { cout << " \"" << sarray->GetValue(ii) << "\""; } cout << "\n"; } if (reader->GetTimeDimension() > 1) { cout << "TimeDimension: " << reader->GetTimeDimension() << "\n"; cout << "TimeSpacing: " << reader->GetTimeSpacing() << "\n"; } if (reader->GetFileIndexArray()->GetNumberOfComponents() > 1) { cout << "VectorDimension: " << reader->GetFileIndexArray()->GetNumberOfComponents() << "\n"; } iren->Start(); // code for generating a regression image //int retVal = vtkRegressionTestImage( renWin ); //if ( retVal == vtkRegressionTester::DO_INTERACTOR ) // { // iren->Start(); // } // return !retVal; return 0; } vtk-dicom-0.8.12/Examples/TestDICOMFileSorter.cxx000066400000000000000000000026711356440565500215160ustar00rootroot00000000000000#include "vtkDICOMMetaData.h" #include "vtkDICOMFileSorter.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer sorter = vtkSmartPointer::New(); vtkSmartPointer files = vtkSmartPointer::New(); for (int i = 1; i < argc; i++) { files->InsertNextValue(argv[i]); } sorter->SetInputFileNames(files); sorter->Update(); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { cout << "Study " << j << ":\n"; int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { cout << " Series " << k << ":\n"; vtkStringArray *a = sorter->GetFileNamesForSeries(k); for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++) { cout << " " << a->GetValue(kk) << "\n"; } } } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMOverlay.cxx000066400000000000000000000227031356440565500210570ustar00rootroot00000000000000// Test the vtkDICOMReader by displaying an image. #include "vtkDICOMMetaData.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMReader.h" #include "vtkDICOMCTRectifier.h" #include "vtkDICOMApplyPalette.h" #include "vtkCommand.h" #include "vtkRenderWindowInteractor.h" #include "vtkInteractorStyleImage.h" #include "vtkRenderWindow.h" #include "vtkRenderer.h" #include "vtkCamera.h" #include "vtkImageMapToColors.h" #include "vtkImageData.h" #include "vtkImageReslice.h" #include "vtkImageResliceMapper.h" #include "vtkImageProperty.h" #include "vtkImageSlice.h" #include "vtkImageStack.h" #include "vtkImageReader2.h" #include "vtkLookupTable.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkMatrix4x4.h" #include "vtkMath.h" #include "vtkErrorCode.h" class vtkDICOMPrinter : public vtkCommand { public: static vtkDICOMPrinter *New() { return new vtkDICOMPrinter; } vtkTypeMacro(vtkDICOMPrinter,vtkCommand); void Execute(vtkObject *caller, unsigned long eventId, void *callData) VTK_DICOM_OVERRIDE; protected: vtkDICOMPrinter() {}; vtkDICOMPrinter(const vtkDICOMPrinter& c) : vtkCommand(c) {} void operator=(const vtkDICOMPrinter&) {} }; int main(int argc, char *argv[]) { vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer style = vtkSmartPointer::New(); style->SetInteractionModeToImageSlicing(); vtkSmartPointer renWin = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); vtkSmartPointer files = vtkSmartPointer::New(); const char *stackID = 0; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "--stack") == 0) { if (i+1 < argc) { stackID = argv[++i]; } } else { files->InsertNextValue(argv[i]); } } // find all DICOM files supplied by the user vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->RequirePixelDataOn(); sorter->SetScanDepth(1); sorter->SetInputFileNames(files); sorter->Update(); // find the series with the largest number of files int m = sorter->GetNumberOfStudies(); int seriesIdx = 0; int kmax = 0; for (int i = 0; i < m; i++) { int fj = sorter->GetFirstSeriesForStudy(i); int lj = sorter->GetLastSeriesForStudy(i); for (int j = fj; j <= lj; j++) { int k = sorter->GetFileNamesForSeries(j)->GetNumberOfValues(); if (k > kmax) { kmax = k; seriesIdx = j; } } } // exit if no files found if (kmax == 0) { fprintf(stderr, "No PixelData to display!\n"); return 1; } // display the longest series vtkStringArray *a = sorter->GetFileNamesForSeries(seriesIdx); vtkSmartPointer reslice = vtkSmartPointer::New(); vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetMemoryRowOrderToFileNative(); if (stackID) { reader->SetDesiredStackID(stackID); } reader->SetFileNames(a); // update the meta data reader->UpdateInformation(); vtkDICOMMetaData *meta = reader->GetMetaData(); // check whether data has a palette bool hasPalette = false; if (meta->Get(DC::PhotometricInterpretation).Matches("PALETTE?COLOR") || meta->Get(DC::PixelPresentation).Matches("COLOR") || meta->Get(DC::PixelPresentation).Matches("MIXED") || meta->Get(DC::PixelPresentation).Matches("TRUE_COLOR")) { hasPalette = true; // palette maps stored values, not slope/intercept rescaled values reader->AutoRescaleOff(); } // update the data reader->Update(); if (reader->GetErrorCode() != vtkErrorCode::NoError) { return 1; } // get the scalar range double range[2]; reader->GetOutput()->GetScalarRange(range); // get the extent int extent[6]; reader->GetOutput()->GetExtent(extent); // get the output port to connect to the display pipeline vtkAlgorithmOutput *portToDisplay = reader->GetOutputPort(); // apply a palette if the image has one vtkSmartPointer palette; if (hasPalette) { palette = vtkSmartPointer::New(); palette->SetInputConnection(reader->GetOutputPort()); palette->Update(); palette->GetOutput()->GetScalarRange(range); portToDisplay = palette->GetOutputPort(); } // lookup table for the overlay vtkSmartPointer table = vtkSmartPointer::New(); table->SetNumberOfColors(256); table->SetRange(0.0, 255.0); table->Build(); table->SetTableValue(0, 0.0, 0.0, 0.0, 0.0); // first overlay is yellow table->SetTableValue(1, 1.0, 1.0, 0.0, 1.0); // second overlay is cyan for (int c = 2; c < 4; c++) { table->SetTableValue(c, 0.0, 1.0, 1.0, 1.0); } // third overlay is magenta for (int c = 4; c < 8; c++) { table->SetTableValue(c, 1.0, 0.0, 1.0, 1.0); } // all other overlays are red for (int c = 8; c < 256; c++) { table->SetTableValue(c, 1.0, 0.0, 0.0, 1.0); } // convert overlay to RGBA prior to display vtkSmartPointer colorOverlay = vtkSmartPointer::New(); colorOverlay->SetLookupTable(table); colorOverlay->SetInputConnection(reader->GetOverlayOutputPort()); colorOverlay->SetOutputFormatToRGBA(); // check if image is 3D bool imageIs3D = (extent[5] > extent[4]); // use multiple viewports if image is 3D static double viewport[3][4] = { { 0.67, 0.0, 1.0, 0.5 }, { 0.67, 0.5, 1.0, 1.0 }, { 0.0, 0.0, 0.67, 1.0 }, }; for (int i = 2*(imageIs3D == 0); i < 3; i++) { // mapper for the image vtkSmartPointer imageMapper = vtkSmartPointer::New(); imageMapper->SetInputConnection(portToDisplay); imageMapper->SliceFacesCameraOn(); imageMapper->SliceAtFocalPointOn(); imageMapper->ResampleToScreenPixelsOn(); vtkSmartPointer image = vtkSmartPointer::New(); image->SetMapper(imageMapper); image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5*(range[0] + range[1])); image->GetProperty()->SetInterpolationTypeToNearest(); image->GetProperty()->SetLayerNumber(1); // mapper for the overlay vtkSmartPointer overlayMapper = vtkSmartPointer::New(); overlayMapper->SetInputConnection(colorOverlay->GetOutputPort()); overlayMapper->SliceFacesCameraOn(); overlayMapper->SliceAtFocalPointOn(); overlayMapper->ResampleToScreenPixelsOn(); vtkSmartPointer overlay = vtkSmartPointer::New(); overlay->SetMapper(overlayMapper); overlay->GetProperty()->SetInterpolationTypeToNearest(); overlay->GetProperty()->SetLayerNumber(2); // combine the image and the overlay vtkSmartPointer imageStack = vtkSmartPointer::New(); imageStack->AddImage(image); imageStack->AddImage(overlay); vtkSmartPointer renderer = vtkSmartPointer::New(); renderer->AddViewProp(imageStack); renderer->SetBackground(0.0, 0.0, 0.0); if (imageIs3D) { renderer->SetViewport(viewport[i]); } renWin->AddRenderer(renderer); // use center point to set camera double *bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5*(bounds[0] + bounds[1]); point[1] = 0.5*(bounds[2] + bounds[3]); point[2] = 0.5*(bounds[4] + bounds[5]); double maxdim = 0.0; for (int j = 0; j < 3; j++) { double s = 0.5*(bounds[2*j+1] - bounds[2*j]); maxdim = (s > maxdim ? s : maxdim); } vtkCamera *camera = renderer->GetActiveCamera(); camera->SetFocalPoint(point); point[i % 3] -= 500.0; camera->SetPosition(point); if ((i % 3) == 2) { camera->SetViewUp(0.0, -1.0, 0.0); } else { camera->SetViewUp(0.0, 0.0, +1.0); } camera->ParallelProjectionOn(); camera->SetParallelScale(maxdim); } // the preferred display size int xsize = extent[1] - extent[0] + 1; int ysize = extent[3] - extent[2] + 1; if (ysize < 400) { xsize *= 2; ysize *= 2; } if (ysize > 800) { xsize = xsize*800/ysize; ysize = 800; } if (xsize > 800) { xsize = 800; } if (imageIs3D) { renWin->SetSize(xsize + xsize/2, ysize); } else { renWin->SetSize(xsize, ysize); } renWin->Render(); vtkStringArray *sarray = reader->GetStackIDs(); if (sarray->GetNumberOfValues()) { cout << "StackIDs (choose one with --stack):"; for (vtkIdType ii = 0; ii < sarray->GetNumberOfValues(); ii++) { cout << " \"" << sarray->GetValue(ii) << "\""; } cout << "\n"; } if (reader->GetTimeDimension() > 1) { cout << "TimeDimension: " << reader->GetTimeDimension() << "\n"; cout << "TimeSpacing: " << reader->GetTimeSpacing() << "\n"; } if (reader->GetFileIndexArray()->GetNumberOfComponents() > 1) { cout << "VectorDimension: " << reader->GetFileIndexArray()->GetNumberOfComponents() << "\n"; } iren->Start(); // code for generating a regression image //int retVal = vtkRegressionTestImage( renWin ); //if ( retVal == vtkRegressionTester::DO_INTERACTOR ) // { // iren->Start(); // } // return !retVal; return 0; } vtk-dicom-0.8.12/Examples/TestDICOMParser.cxx000066400000000000000000000017551356440565500206760ustar00rootroot00000000000000#include "vtkDICOMParser.h" #include "vtkDICOMMetaData.h" #include "vtkSmartPointer.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer parser = vtkSmartPointer::New(); for (int i = 1; i < argc; i++) { cout << "=========== " << argv[i] << " =========\n"; vtkSmartPointer data = vtkSmartPointer::New(); parser->SetFileName(argv[i]); parser->SetMetaData(data); parser->Update(); } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMReader.cxx000066400000000000000000000047051356440565500206420ustar00rootroot00000000000000#include "vtkDICOMMetaData.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMReader.h" #include "vtkCommand.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } class ReaderProgress : public vtkCommand { public: vtkTypeMacro(ReaderProgress, vtkCommand); static ReaderProgress *New() { return new ReaderProgress; } void Execute(vtkObject *object, unsigned long event, void *data) VTK_DICOM_OVERRIDE; }; void ReaderProgress::Execute( vtkObject *object, unsigned long event, void *data) { if (event == vtkCommand::ProgressEvent) { if (data) { double progress = *static_cast(data); const char *text = ""; vtkAlgorithm *algorithm = vtkAlgorithm::SafeDownCast(object); if (algorithm) { text = algorithm->GetProgressText(); } if (text) { std::cout << text << ": "; } std::cout << static_cast(100.0*progress + 0.5) << std::endl; } } } int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer sorter = vtkSmartPointer::New(); vtkSmartPointer files = vtkSmartPointer::New(); for (int i = 1; i < argc; i++) { files->InsertNextValue(argv[i]); } sorter->SetInputFileNames(files); sorter->Update(); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { cout << "Study" << j << ":\n"; int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { cout << " Series " << k << ":\n"; vtkStringArray *a = sorter->GetFileNamesForSeries(k); vtkSmartPointer progressCommand = vtkSmartPointer::New(); vtkSmartPointer reader = vtkSmartPointer::New(); reader->AddObserver(vtkCommand::ProgressEvent, progressCommand); reader->SetFileNames(a); reader->Update(); } } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMRealWorldValue.cxx000066400000000000000000000103071356440565500223230ustar00rootroot00000000000000#include "vtkDICOMMetaData.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMReader.h" #include "vtkDICOMTagPath.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer sorter = vtkSmartPointer::New(); vtkSmartPointer files = vtkSmartPointer::New(); for (int i = 1; i < argc; i++) { files->InsertNextValue(argv[i]); } sorter->SetInputFileNames(files); sorter->Update(); vtkSmartPointer meta = vtkSmartPointer::New(); if (sorter->GetNumberOfSeries() > 0) { // read the meta data from the supplied image vtkStringArray *a = sorter->GetFileNamesForSeries(0); vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileNames(a); reader->UpdateInformation(); meta = reader->GetMetaData(); } else if (argc == 1) { // create a real world value mapping sequence by hand // 1) use Unified Code for Units of Measure (UCUM), version 1.9 // 2) the CodeMeaning should be a copy of CodeValue unless: // 2a) CodeValue=1, in which case use CodeMeaning=unity vtkDICOMItem unitsItem; unitsItem.Set(DC::CodeValue, "m2/s"); unitsItem.Set(DC::CodingSchemeDesignator, "UCUM"); unitsItem.Set(DC::CodingSchemeVersion, "1.9"); unitsItem.Set(DC::CodeMeaning, "m2/s"); vtkDICOMItem mappingItem; mappingItem.Set(DC::LUTExplanation, "Hot Metal"); mappingItem.Set(DC::MeasurementUnitsCodeSequence, vtkDICOMValue(vtkDICOMVR::SQ, unitsItem)); mappingItem.Set(DC::LUTLabel, "HOT_METAL"); // need to explicitly define the VR for these, because it depends // on whether the PixelRepresentation is signed or unsigned mappingItem.Set(DC::RealWorldValueFirstValueMapped, vtkDICOMValue(vtkDICOMVR::US, 0)); mappingItem.Set(DC::RealWorldValueLastValueMapped, vtkDICOMValue(vtkDICOMVR::US, 4095)); mappingItem.Set(DC::RealWorldValueIntercept, 0.234); mappingItem.Set(DC::RealWorldValueSlope, 0.438); meta->Set(DC::RealWorldValueMappingSequence, vtkDICOMValue(vtkDICOMVR::SQ, mappingItem)); } else { cout << "The provided file is not DICOM!" << endl; } if (meta->Has(DC::RealWorldValueMappingSequence)) { const vtkDICOMItem& mappingItem = meta->Get(DC::RealWorldValueMappingSequence).GetItem(0); std::string lutName = mappingItem.Get(DC::LUTLabel).AsString(); std::string units = mappingItem.Get(vtkDICOMTagPath( DC::MeasurementUnitsCodeSequence, 0, DC::CodeValue)).AsString(); double range[2]; range[0] = mappingItem.Get(DC::RealWorldValueFirstValueMapped).AsDouble(); range[1] = mappingItem.Get(DC::RealWorldValueLastValueMapped).AsDouble(); double slope = mappingItem.Get(DC::RealWorldValueSlope).AsDouble(); double inter = mappingItem.Get(DC::RealWorldValueIntercept).AsDouble(); cout << "Map pixel values in the range " << range[0] << ", " << range[1] << endl; cout << "through the equation y = " << slope << " * x + " << inter << endl; cout << "to real values with units of " << units << endl; cout << "and display the result with color table " << lutName << endl; if (argc == 1) { TestAssert(range[0] == 0); TestAssert(range[1] == 4095); TestAssert(fabs(slope - 0.438) < 1e-16); TestAssert(fabs(inter - 0.234) < 1e-16); TestAssert(units == "m2/s"); TestAssert(lutName == "HOT_METAL"); } } else { cout << "Image has no real world value mapping!" << endl; } return rval; } vtk-dicom-0.8.12/Examples/TestDICOMWriter.cxx000066400000000000000000000047711356440565500207170ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMMetaData.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMReader.h" #include "vtkDICOMWriter.h" #include "vtkDICOMMRGenerator.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include #include #include int main(int argc, char *argv[]) { int rval = 0; const char *exename = argv[0]; // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkSmartPointer sorter = vtkSmartPointer::New(); vtkSmartPointer files = vtkSmartPointer::New(); for (int i = 1; i < argc; i++) { files->InsertNextValue(argv[i]); } sorter->SetInputFileNames(files); sorter->Update(); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { cout << "Study" << j << ":\n"; int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { cout << " Series " << k << ":\n"; vtkStringArray *a = sorter->GetFileNamesForSeries(k); vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileNames(a); //reader->SetMemoryRowOrderToFileNative(); reader->UpdateInformation(); vtkDICOMMetaData *meta = reader->GetMetaData(); vtkSmartPointer generator = vtkSmartPointer::New(); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetInputConnection(reader->GetOutputPort()); writer->SetGenerator(generator); writer->SetPatientMatrix(reader->GetPatientMatrix()); writer->SetMetaData(meta); //writer->SetMemoryRowOrderToFileNative(); writer->SetFilePrefix("/tmp"); writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); writer->Write(); } } return rval; } vtk-dicom-0.8.12/Examples/TestNIFTIDisplay.cxx000066400000000000000000000103011356440565500210500ustar00rootroot00000000000000// Test the vtkNIFTIReader by displaying an image. #include "vtkNIFTIReader.h" #include "vtkRenderWindowInteractor.h" #include "vtkInteractorStyleImage.h" #include "vtkRenderWindow.h" #include "vtkRenderer.h" #include "vtkCamera.h" #include "vtkMatrix4x4.h" #include "vtkImageData.h" #include "vtkImageReslice.h" #include "vtkImageSliceMapper.h" #include "vtkImageProperty.h" #include "vtkImageSlice.h" #include "vtkImageReader2.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkErrorCode.h" int main(int argc, char *argv[]) { vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer style = vtkSmartPointer::New(); style->SetInteractionModeToImage3D(); vtkSmartPointer renWin = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); const char *filename = 0; if (argc > 1) { filename = argv[1]; } vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(filename); reader->Update(); if (reader->GetErrorCode() != vtkErrorCode::NoError) { return 1; } vtkSmartPointer matrix = vtkSmartPointer::New(); if (reader->GetQFormMatrix()) { matrix->DeepCopy(reader->GetQFormMatrix()); matrix->Invert(); } else if (reader->GetSFormMatrix()) { matrix->DeepCopy(reader->GetSFormMatrix()); matrix->Invert(); } vtkSmartPointer reslice = vtkSmartPointer::New(); reslice->SetInputConnection(reader->GetOutputPort()); reslice->SetResliceAxes(matrix); reslice->SetInterpolationModeToLinear(); reslice->Update(); double range[2]; int extent[6]; reslice->GetOutput()->GetScalarRange(range); reslice->GetOutput()->GetExtent(extent); static double viewport[3][4] = { { 0.67, 0.0, 1.0, 0.5 }, { 0.67, 0.5, 1.0, 1.0 }, { 0.0, 0.0, 0.67, 1.0 }, }; // check if image is 2D bool imageIs3D = (extent[5] > extent[4]); for (int i = 2*(imageIs3D == 0); i < 3; i++) { vtkSmartPointer imageMapper = vtkSmartPointer::New(); if (i < 3) { imageMapper->SetInputConnection(reslice->GetOutputPort()); } imageMapper->SetOrientation(i % 3); imageMapper->SliceAtFocalPointOn(); vtkSmartPointer image = vtkSmartPointer::New(); image->SetMapper(imageMapper); image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5*(range[0] + range[1])); image->GetProperty()->SetInterpolationTypeToNearest(); vtkSmartPointer renderer = vtkSmartPointer::New(); renderer->AddViewProp(image); renderer->SetBackground(0.0, 0.0, 0.0); if (imageIs3D) { renderer->SetViewport(viewport[i]); } renWin->AddRenderer(renderer); // use center point to set camera double *bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5*(bounds[0] + bounds[1]); point[1] = 0.5*(bounds[2] + bounds[3]); point[2] = 0.5*(bounds[4] + bounds[5]); double maxdim = 0.0; for (int j = 0; j < 3; j++) { double s = 0.5*(bounds[2*j+1] - bounds[2*j]); maxdim = (s > maxdim ? s : maxdim); } vtkCamera *camera = renderer->GetActiveCamera(); camera->SetFocalPoint(point); if (imageMapper->GetOrientation() == 2) { point[imageMapper->GetOrientation()] -= 500.0; camera->SetViewUp(0.0, +1.0, 0.0); } else { point[imageMapper->GetOrientation()] += 500.0; camera->SetViewUp(0.0, 0.0, +1.0); } camera->SetPosition(point); camera->ParallelProjectionOn(); camera->SetParallelScale(maxdim); } if (imageIs3D) { renWin->SetSize(600, 400); } else { renWin->SetSize(400, 400); } renWin->Render(); iren->Start(); // code for generating a regression image //int retVal = vtkRegressionTestImage( renWin ); //if ( retVal == vtkRegressionTester::DO_INTERACTOR ) // { // iren->Start(); // } // return !retVal; return 0; } vtk-dicom-0.8.12/Examples/TestScancoCTDisplay.cxx000066400000000000000000000071661356440565500216530ustar00rootroot00000000000000// Test the vtkScancoCTReader by displaying an image. #include "vtkScancoCTReader.h" #include "vtkRenderWindowInteractor.h" #include "vtkInteractorStyleImage.h" #include "vtkRenderWindow.h" #include "vtkRenderer.h" #include "vtkCamera.h" #include "vtkImageData.h" #include "vtkImageReslice.h" #include "vtkImageSliceMapper.h" #include "vtkImageProperty.h" #include "vtkImageSlice.h" #include "vtkImageReader2.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkErrorCode.h" int main(int argc, char *argv[]) { vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer style = vtkSmartPointer::New(); style->SetInteractionModeToImage3D(); vtkSmartPointer renWin = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); const char *filename = 0; if (argc > 1) { filename = argv[1]; } vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(filename); reader->Update(); if (reader->GetErrorCode() != vtkErrorCode::NoError) { return 1; } double range[2]; int extent[6]; reader->GetOutput()->GetScalarRange(range); reader->GetOutput()->GetExtent(extent); static double viewport[3][4] = { { 0.67, 0.0, 1.0, 0.5 }, { 0.67, 0.5, 1.0, 1.0 }, { 0.0, 0.0, 0.67, 1.0 }, }; // check if image is 2D bool imageIs3D = (extent[5] > extent[4]); for (int i = 2*(imageIs3D == 0); i < 3; i++) { vtkSmartPointer imageMapper = vtkSmartPointer::New(); if (i < 3) { imageMapper->SetInputConnection(reader->GetOutputPort()); } imageMapper->SetOrientation(i % 3); imageMapper->SliceAtFocalPointOn(); vtkSmartPointer image = vtkSmartPointer::New(); image->SetMapper(imageMapper); image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5*(range[0] + range[1])); image->GetProperty()->SetInterpolationTypeToNearest(); vtkSmartPointer renderer = vtkSmartPointer::New(); renderer->AddViewProp(image); renderer->SetBackground(0.0, 0.0, 0.0); if (imageIs3D) { renderer->SetViewport(viewport[i]); } renWin->AddRenderer(renderer); // use center point to set camera double *bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5*(bounds[0] + bounds[1]); point[1] = 0.5*(bounds[2] + bounds[3]); point[2] = 0.5*(bounds[4] + bounds[5]); double maxdim = 0.0; for (int j = 0; j < 3; j++) { double s = 0.5*(bounds[2*j+1] - bounds[2*j]); maxdim = (s > maxdim ? s : maxdim); } vtkCamera *camera = renderer->GetActiveCamera(); camera->SetFocalPoint(point); if ((i % 3) == 0) { point[i % 3] -= 500.0; } else { point[i % 3] += 500.0; } camera->SetPosition(point); if ((i % 3) == 2) { camera->SetViewUp(0.0, +1.0, 0.0); } else { camera->SetViewUp(0.0, 0.0, -1.0); } camera->ParallelProjectionOn(); camera->SetParallelScale(maxdim); } if (imageIs3D) { renWin->SetSize(600, 400); } else { renWin->SetSize(400, 400); } renWin->Render(); iren->Start(); // code for generating a regression image //int retVal = vtkRegressionTestImage( renWin ); //if ( retVal == vtkRegressionTester::DO_INTERACTOR ) // { // iren->Start(); // } // return !retVal; return 0; } vtk-dicom-0.8.12/Programs/000077500000000000000000000000001356440565500153065ustar00rootroot00000000000000vtk-dicom-0.8.12/Programs/CMakeLists.txt000066400000000000000000000022661356440565500200540ustar00rootroot00000000000000if(POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() include_directories( ${DICOM_INCLUDE_DIRS} ${DICOM_SOURCE_DIR}/DicomCli ${DICOM_BINARY_DIR}/DicomCli ) set(PROGRAM_SRCS dicomdump.cxx dicomfind.cxx dicompull.cxx dicomtocsv.cxx dicomtodicom.cxx dicomtonifti.cxx niftitodicom.cxx niftidump.cxx scancotodicom.cxx scancodump.cxx ) if(NOT VTK_VERSION VERSION_LESS 6) set(VTK_EXTRA_LIBS) foreach(_lib ImagingStatistics CommonSystem) list(APPEND VTK_EXTRA_LIBS ${VTK_TARGET_PREFIX}${_lib}) endforeach() else() set(VTK_EXTRA_LIBS) # VTK 5.x endif() set(BASE_LIBS ${VTK_DICOM_LINK_TARGET} ${VTK_LIBS}) set(CLI_LIBS dicomcli) foreach(src ${PROGRAM_SRCS}) string(REGEX REPLACE "\\.(cxx|c|mm|m)$" "" prog ${src}) add_executable(${prog} ${src}) target_link_libraries(${prog} ${BASE_LIBS} ${CLI_LIBS} ${VTK_EXTRA_LIBS}) list(APPEND PROGRAM_EXES ${prog}) endforeach() install(TARGETS ${PROGRAM_EXES} EXPORT DICOMTargets RUNTIME DESTINATION ${DICOM_RUNTIME_INSTALL_DEST} COMPONENT RuntimeLibraries LIBRARY DESTINATION ${DICOM_LIBRARY_INSTALL_DEST} COMPONENT RuntimeLibraries ARCHIVE DESTINATION ${DICOM_ARCHIVE_INSTALL_DEST} COMPONENT Development) vtk-dicom-0.8.12/Programs/dicomdump.cxx000066400000000000000000000403771356440565500200260ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMParser.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMItem.h" #include "vtkDICOMUtilities.h" // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" #include "readquery.h" #include "vtkSortFileNames.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include #define MAX_INDENT 24 #define INDENT_SIZE 2 #define MAX_LENGTH 120 // print the version void printVersion(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } // print the usage void printUsage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s file1.dcm [file2.dcm ...]\n\n", cp); fprintf(file, "options:\n" " -k tag Provide a key to be printed.\n" " -q Provide a file that lists which elements to print.\n" " --charset Charset to use if SpecificCharacterSet is missing.\n" " --help Print a brief help message.\n" " --version Print the software version.\n"); } // print the help void printHelp(FILE *file, const char *cp) { printUsage(file, cp); fprintf(file, "\n" "Dump the metadata from a DICOM series as text. If only a few\n" "attributes are to be dumped, then their tags can be given with \"-k\"\n" "(the \"-k\" option can be repeated as many times as needed). Tags can\n" "given in hexadecimal GGGG,EEEE format, or in text format as specified\n" "in the DICOM dictionary. Alternately, the tags can be listed in a\n" "query file given with the \"-q\" option (one tag per line).\n" "Attributes nested within sequences can be specified by giving a tag\n" "path e.g. \"-k Tag1/Tag2/Tag3\". Either a forward slash or a backslash\n" "can be used to separate the components of the path.\n\n"); } // remove path portion of filename const char *fileBasename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // Print out one data element void printElement( vtkDICOMMetaData *meta, const vtkDICOMItem *item, const vtkDICOMDataElementIterator &iter, int depth, unsigned int pixelDataVL) { vtkDICOMTag tag = iter->GetTag(); int g = tag.GetGroup(); int e = tag.GetElement(); vtkDICOMVR vr = iter->GetVR(); const char *name = ""; vtkDICOMDictEntry d; if (item) { d = item->FindDictEntry(tag); } else if (meta) { d = meta->FindDictEntry(tag); } if (d.IsValid()) { name = d.GetName(); if (d.GetVR() != vr && !(d.GetVR() == vtkDICOMVR::XS && (vr == vtkDICOMVR::SS || vr == vtkDICOMVR::US)) && !(d.GetVR() == vtkDICOMVR::OX && (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::OW))) { printf("VR mismatch! %s != %s %s\n", vr.GetText(), d.GetVR().GetText(), name); } } else if ((tag.GetGroup() & 0xFFFE) != 0 && tag.GetElement() == 0) { // group is even, element is zero name = "GroupLength"; } else if ((tag.GetGroup() & 0x0001) != 0 && (tag.GetElement() & 0xFF00) == 0) { // group is odd, element is a creator element name = "PrivateCreator"; } // allow multiple values (i.e. for each image in series) vtkDICOMValue v = iter->GetValue(); size_t vn = v.GetNumberOfValues(); const vtkDICOMValue *vp = v.GetMultiplexData(); if (vp == 0) { vp = &v; vn = 1; } // make an indentation string if (INDENT_SIZE*depth > MAX_INDENT) { depth = MAX_INDENT/INDENT_SIZE; } static const char spaces[MAX_INDENT+1] = " "; const char *indent = spaces + (MAX_INDENT - INDENT_SIZE*depth); for (size_t vi = 0; vi < vn; vi++) { v = vp[vi]; unsigned int vl = v.GetVL(); if (tag == DC::PixelData || tag == DC::FloatPixelData || tag == DC::DoubleFloatPixelData) { vl = (depth == 0 && vl == 0 ? pixelDataVL : v.GetVL()); } std::string s; if (vr == vtkDICOMVR::UN || vr == vtkDICOMVR::SQ) { // sequences are printed later s = (vl > 0 ? "..." : ""); } else if (vr == vtkDICOMVR::LT || vr == vtkDICOMVR::ST || vr == vtkDICOMVR::UT) { vtkDICOMCharacterSet cs = v.GetCharacterSet(); const char *cp = v.GetCharData(); size_t l = vl; bool truncated = false; while (l > 0 && cp[l-1] == ' ') { l--; } if (l > MAX_LENGTH) { l = MAX_LENGTH; truncated = true; } std::string utf8 = cs.ToSafeUTF8(cp, l); cp = utf8.data(); l = utf8.length(); if (l > MAX_LENGTH) { l = MAX_LENGTH-3; truncated = true; // remove possibly incomplete final character while (l > 1 && (cp[l-1] & 0xC0) == 0x80) { l--; } l--; } s.append(cp, l); if (truncated) { s.append("..."); } } else if (vr.HasTextValue()) { vtkDICOMCharacterSet cs = v.GetCharacterSet(); const char *cp = v.GetCharData(); const char *ep = cp + vl; size_t pos = 0; while (cp != ep && *cp != '\0') { size_t n = cs.NextBackslash(cp, ep); while (n > 0 && *cp == ' ') { cp++; n--; } size_t m = n; while (m > 0 && cp[m-1] == ' ') { m--; } s.append(cs.ToSafeUTF8(cp, m)); cp += n; if (cp != ep && *cp == '\\') { s.append(cp, 1); cp++; } if (s.size() > MAX_LENGTH-4) { s.resize(pos); s.append("..."); break; } pos = s.size(); } } else { // print any other VR via conversion to string size_t n = v.GetNumberOfValues(); size_t pos = 0; for (size_t i = 0; i < n; i++) { v.AppendValueToString(s, i); if (i < n - 1) { s.append("\\"); } if (s.size() > MAX_LENGTH-4) { s.resize(pos); s.append("..."); break; } pos = s.size(); } } if (meta && vi == 0) { printf("%s(%04X,%04X) %s \"%s\" :", indent, g, e, vr.GetText(), name); } if (meta && vn > 1) { printf("%s%s %4.4u", (vi == 0 ? " (multiple values)\n" : ""), indent, static_cast(vi + 1)); } if (vr == vtkDICOMVR::SQ) { size_t m = v.GetNumberOfValues(); const vtkDICOMItem *items = v.GetSequenceData(); printf(" (%u %s%s)\n", static_cast(m), (m == 1 ? "item" : "items"), (vl == 0xffffffffu ? ", delimited" : "")); for (size_t j = 0; j < m; j++) { printf("%s%s---- SQ Item %04u at offset %u ----\n", indent, spaces+(MAX_INDENT - INDENT_SIZE), static_cast(j+1), items[j].GetByteOffset()); vtkDICOMDataElementIterator siter = items[j].Begin(); vtkDICOMDataElementIterator siterEnd = items[j].End(); for (; siter != siterEnd; ++siter) { printElement(meta, &items[j], siter, depth+1, pixelDataVL); } } } else if (vl == 0xffffffffu) { if (tag == DC::PixelData || tag == DC::FloatPixelData || tag == DC::DoubleFloatPixelData) { printf(" [...] (compressed)\n"); } else { printf(" [...] (delimited)\n"); } } else { const char *uidName = ""; if (vr == vtkDICOMVR::UI) { uidName = vtkDICOMUtilities::GetUIDName(s.c_str()); } if (uidName[0] != '\0') { printf(" [%s] {%s} (%u bytes)\n", s.c_str(), uidName, vl); } else if (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::OW || vr == vtkDICOMVR::OF || vr == vtkDICOMVR::OD) { printf(" [%s] (%u bytes)\n", (vl == 0 ? "" : "..."), vl); } else { printf(" [%s] (%u bytes)\n", s.c_str(), vl); } } } } void printElementFromTagPathRecurse( const vtkDICOMItem *item, const vtkDICOMTagPath& tagPath, const vtkDICOMTagPath& fullPath, int *count) { vtkDICOMTag tag = tagPath.GetHead(); vtkDICOMDataElementIterator iter = item->Begin(); while (iter != item->End() && iter->GetTag() != tag) { ++iter; } if (iter != item->End()) { if (tagPath.HasTail()) { const vtkDICOMItem *items = iter->GetValue().GetSequenceData(); if (items) { size_t n = iter->GetValue().GetNumberOfValues(); for (size_t i = 0; i < n; i++) { printElementFromTagPathRecurse( &items[i], tagPath.GetTail(), fullPath, count); } } } else { ++(*count); fprintf(stdout, " %04d", *count); printElement(0, item, iter, 0, 0); } } } void printElementFromTagPath( vtkDICOMMetaData *data, const vtkDICOMTagPath& tagPath, unsigned int pixelDataVL) { int count = 0; vtkDICOMTag tag = tagPath.GetHead(); vtkDICOMDataElementIterator iter = data->Find(tag); if (iter != data->End()) { if (tagPath.HasTail()) { for (vtkDICOMTagPath p = tagPath; ; p = p.GetTail()) { int g = p.GetHead().GetGroup(); int e = p.GetHead().GetElement(); if (p.HasTail()) { printf("(%04X,%04X)\\", g, e); } else { vtkDICOMDictEntry entry = vtkDICOMDictionary::FindDictEntry(p.GetHead()); vtkDICOMVR vr = entry.GetVR(); const char *name = entry.GetName(); name = ((name && name[0]) ? name : "Unknown"); printf("(%04X,%04X) %s \"%s\" : (nested)\n", g, e, vr.GetText(), name); break; } } if (iter->IsPerInstance()) { for (int j = 0; j < iter->GetNumberOfInstances(); j++) { const vtkDICOMItem *items = iter->GetValue(j).GetSequenceData(); if (items) { size_t n = iter->GetValue(j).GetNumberOfValues(); for (size_t i = 0; i < n; i++) { printElementFromTagPathRecurse( &items[i], tagPath.GetTail(), tagPath, &count); } } } } else { const vtkDICOMItem *items = iter->GetValue().GetSequenceData(); if (items) { size_t n = iter->GetValue().GetNumberOfValues(); for (size_t i = 0; i < n; i++) { printElementFromTagPathRecurse( &items[i], tagPath.GetTail(), tagPath, &count); } } } } else { printElement(data, 0, iter, 0, pixelDataVL); } } } // This program will dump all the metadata in the given file int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; // for the optional query file QueryTagList qtlist; vtkDICOMItem query; // for the default character set vtkDICOMCharacterSet charset; if (argc < 2) { printUsage(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { printHelp(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { printVersion(stdout, fileBasename(argv[0])); return rval; } vtkSmartPointer files = vtkSmartPointer::New(); for (int argi = 1; argi < argc; argi++) { const char *arg = argv[argi]; if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "%s must be followed by a file.\n\n", arg); printUsage(stderr, fileBasename(argv[0])); return 1; } if (arg[1] == 'q') { const char *qfile = argv[++argi]; if (!dicomcli_readquery(qfile, &query, &qtlist)) { fprintf(stderr, "Can't read query file %s\n\n", qfile); return 1; } } else if (arg[1] == 'o') { fprintf(stderr, "unrecognized option %s.\n\n", arg); return 1; } } else if (strcmp(arg, "-k") == 0) { ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "%s must be followed by gggg,eeee=value " "where gggg,eeee is a DICOM tag.\n\n", arg); return 1; } if (!dicomcli_readkey(argv[argi], &query, &qtlist)) { return 1; } } else if (strcmp(arg, "--charset") == 0) { ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "%s must be followed by a valid character set\n\n", arg); return 1; } charset = vtkDICOMCharacterSet(argv[argi]); if (charset.GetKey() == vtkDICOMCharacterSet::Unknown) { fprintf(stderr, "%s %s is not a known character set\n\n", arg, argv[argi]); return 1; } } else if (arg[0] == '-') { fprintf(stderr, "unrecognized option %s.\n\n", arg); printUsage(stderr, fileBasename(argv[0])); return 1; } else { files->InsertNextValue(arg); } } // sort the files by study and series vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->RequirePixelDataOff(); sorter->SetScanDepth(0); sorter->IgnoreDicomdirOn(); sorter->SetFindQuery(query); sorter->SetInputFileNames(files); sorter->Update(); vtkSmartPointer parser = vtkSmartPointer::New(); parser->SetDefaultCharacterSet(charset); parser->SetQueryItem(query); vtkSmartPointer data = vtkSmartPointer::New(); parser->SetMetaData(data); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { vtkStringArray *a = sorter->GetFileNamesForSeries(k); vtkIdType l = a->GetNumberOfValues(); std::string fname = a->GetValue(0); if (l == 1) { printf("==== %s ====\n", fname.c_str()); } else { // print the first and last filenames (sorted) vtkSmartPointer fsort = vtkSmartPointer::New(); fsort->NumericSortOn(); fsort->IgnoreCaseOn(); fsort->GroupingOff(); fsort->SetInputFileNames(a); fsort->Update(); printf("==== %s .. %s (%d files) ====\n", fsort->GetFileNames()->GetValue(0).c_str(), fileBasename(fsort->GetFileNames()->GetValue(l-1).c_str()), static_cast(l)); } data->Clear(); data->SetNumberOfInstances(static_cast(l)); unsigned int pixelDataVL = 0; for (vtkIdType i = 0; i < l; i++) { fname = a->GetValue(i); parser->SetIndex(i); parser->SetFileName(fname.c_str()); parser->Update(); pixelDataVL = parser->GetPixelDataVL(); } if (query.GetNumberOfDataElements() > 0) { for (size_t i = 0; i < qtlist.size(); i++) { printElementFromTagPath(data, qtlist[i], pixelDataVL); } } else { vtkDICOMDataElementIterator iter = data->Begin(); vtkDICOMDataElementIterator iterEnd = data->End(); for (; iter != iterEnd; ++iter) { printElement(data, 0, iter, 0, pixelDataVL); } } } } return rval; } vtk-dicom-0.8.12/Programs/dicomfind.cxx000066400000000000000000000532211356440565500177710ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMItem.h" #include "vtkDICOMDataElement.h" #include "vtkDICOMMetaData.h" // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" #include "readquery.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #ifndef _WIN32 // includes for execvp #include #include #include #else // includes for spawn #include #include #include // include for getcwd #include #endif #include #include #include #include // print the version void dicomfind_version(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } // print the usage void dicomfind_usage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s [options] ...\n\n", cp); fprintf(file, "options:\n" " -L Follow symbolic links (default).\n" " -P Do not follow symbolic links.\n" " -k tag=value Provide an attribute to be queried and matched.\n" " -q Provide a file to describe the find query.\n" " -u Provide a file that contains a list of UIDs.\n" " -maxdepth n Set the maximum directory depth.\n" " -name pattern Set a pattern to match (with \"*\" or \"?\").\n" " -image Restrict the search to files with PixelData.\n" " -series Find all files in series if even one file matches.\n" " -print Print the filenames of all matched files (default).\n" " -print0 Print the filenames with terminating null, for xargs.\n" " -exec ... + Execute the given command for every series matched.\n" " -exec ... %s Execute the given command for every file matched.\n" " -execdir ... + Go to directory and execute command on every series.\n" " -execdir ... %s Go to directory and execute command on every file.\n" " --ignore-dicomdir Ignore the DICOMDIR file even if it is present.\n" " --charset Charset to use if SpecificCharacterSet is missing.\n" " --help Print a brief help message.\n" " --version Print the software version.\n", #ifndef _WIN32 "\\;", "\\;" #else "; ", "; " #endif ); } // print the help void dicomfind_help(FILE *file, const char *cp) { dicomfind_usage(file, cp); fprintf(file, "\n" "This command can be used to locate DICOM files. It shares many\n" "features with the UNIX \"find\" command. When searching for files\n" "with a specific attribute (with \"-k\"), the tag can be specified\n" "in the form GGGG,EEEE or with its canonical name e.g. Modality=MR\n" "from the DICOM dictionary. Alternately, the tags can be listed in a\n" "query file given with the \"-q\" option (one tag per line).\n" "Attributes nested within sequences can be specified by giving a tag\n" "path e.g. \"-k Tag1/Tag2/Tag3\". Either a forward slash or a backslash\n" "can be used to separate the components of the path. Private tags\n" "should be preceded by the private dictionary name in square brackets.\n" "\n" "The \"-exec\" and \"-execdir\" arguments cause dicomfind to run the\n" "specified program on the found files. For example, to dump each file\n" "one would use \"-exec dicomdump {} \\;\" where each instance of {} will\n" "be replaced by a found file, and \";\" indicates the end of the args\n" "to dicomdump. Alternately, if \"+\" is used to end the args, then the\n" "program will be run on each DICOM series and {} will be replaced by all\n" "files in the series. The \"-execdir\" argument is similar, except that\n" "it runs the program from within the directory of the file (or files),\n" "and {} is replaced by just the filenames instead of with the full paths.\n\n"); } // remove path portion of filename const char *dicomfind_basename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // get directory portion of filename std::string dicomfind_dirname(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename) { --cp; if (cp[0] == '\\' || cp[0] == '/') { break; } } return std::string(filename, cp - filename); } typedef vtkDICOMVR VR; // Execute a subprocess #ifndef _WIN32 bool execute_command(const char *command, char *argv[]) { // flush the output fflush(stdout); fflush(stderr); // fork a new process pid_t command_pid = fork(); if (command_pid == -1) { fprintf(stderr, "Unable to create subprocess: %s\n", argv[0]); } // if fork() returned a pid, then this is the original process if (command_pid != 0) { int command_status; while (waitpid(command_pid, &command_status, 0) == static_cast(-1)) { if (errno != EINTR) { fprintf(stderr, "Unknown error with subprocess: %s\n", argv[0]); return false; } } if (WIFEXITED(command_status)) { if (WEXITSTATUS(command_status) != 0) { fprintf(stderr, "Subprocess returned negative result: %s\n", argv[0]); } return true; } else { fprintf(stderr, "Abnormal subprocess termination: %s\n", argv[0]); } } else if (execvp(command, argv) == -1) { if (errno == ENOENT) { fprintf(stderr, "Executable not found: %s\n", argv[0]); } else if (errno == ENOEXEC) { fprintf(stderr, "File is not executable: %s\n", argv[0]); } else if (errno == EACCES) { fprintf(stderr, "Access (permission) error: %s\n", argv[0]); } else if (errno == E2BIG) { fprintf(stderr, "Command line to long for command: %s\n", argv[0]); } else if (errno == ENOMEM) { fprintf(stderr, "Out of memory while running command: %s\n", argv[0]); } else if (errno == EMFILE) { fprintf(stderr, "No more available file handles: %s\n", argv[0]); } else { fprintf(stderr, "Unknown error while running command: %s\n", argv[0]); } return false; } return true; } #else bool execute_command(const char *, char *argv[]) { bool rval = true; // flush the output fflush(stdout); fflush(stderr); int m = 0; while (argv[m] != 0) { m++; } wchar_t **wargv = new wchar_t *[m + 1]; for (int i = 0; i < m; i++) { int n = MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, NULL, 0); wargv[i] = new wchar_t[n]; MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, wargv[i], n); } wargv[m] = 0; if (_wspawnvp(_P_WAIT, wargv[0], wargv) != 0) { if (errno == ENOENT) { fprintf(stderr, "Executable not found: %s\n", argv[0]); } else if (errno == ENOEXEC) { fprintf(stderr, "File is not executable: %s\n", argv[0]); } else if (errno == E2BIG) { fprintf(stderr, "Command line to long for command: %s\n", argv[0]); } else if (errno == ENOMEM) { fprintf(stderr, "Out of memory while running command: %s\n", argv[0]); } else { fprintf(stderr, "Unknown error while running command: %s\n", argv[0]); } rval = false; } for (int i = 0; i < m; i++) { delete [] wargv[i]; } delete [] wargv; return rval; } #endif #ifndef _WIN32 int dicomfind_chdir(const char *dirname) { return chdir(dirname); } #else int dicomfind_chdir(const char *dirname) { // use _wchdir to allow paths longer than the 260 char limit int n = MultiByteToWideChar(CP_UTF8, 0, dirname, -1, NULL, 0); wchar_t *wp = new wchar_t[n]; MultiByteToWideChar(CP_UTF8, 0, dirname, -1, wp, n); int rval = _wchdir(wp); delete [] wp; return rval; } #endif #ifndef _WIN32 std::string dicomfind_getcwd() { char buffer[2048]; return getcwd(buffer, sizeof(buffer)); } #else std::string dicomfind_getcwd() { wchar_t wbuffer[2048]; wchar_t *wp = _wgetcwd(wbuffer, sizeof(wbuffer)/sizeof(wchar_t)); int n = WideCharToMultiByte( CP_UTF8, 0, wp, -1, NULL, 0, NULL, NULL); char *cp = new char[n]; WideCharToMultiByte( CP_UTF8, 0, wp, -1, cp, n, NULL, NULL); std::string s = cp; delete [] cp; return s; } #endif // The type used to store an operation struct Operation { Operation(const char *type) : Type(type) {} std::string Type; std::vector Args; }; // Apply the given operations to the given list of files void dicomfind_operations( std::vector& operationList, vtkStringArray *sa, const std::string& originalDir) { for (std::vector::iterator op = operationList.begin(); op != operationList.end(); ++op) { if (op->Type == "-print" || op->Type == "-print0") { char endchar = (op->Type == "-print0" ? '\0' : '\n'); for (int kk = 0; kk < sa->GetNumberOfValues(); kk++) { fprintf(stdout, "%s", sa->GetValue(kk).c_str()); fputc(endchar, stdout); } fflush(stdout); } else if (op->Type == "-exec" || op->Type == "-execdir") { bool execdir = (op->Type == "-execdir"); // Count the number of times {} appears in exec args size_t subcount = 0; for (size_t jj = 0; jj < op->Args.size(); jj++) { subcount += (op->Args[jj].find("{}") != std::string::npos); } // remember the current subdirectory std::string currentSubdir; if (op->Args.back() == ";") { // call program for each file for (int kk = 0; kk < sa->GetNumberOfValues(); kk++) { size_t sub_argc = op->Args.size() + subcount - 1; char **sub_argv = new char *[sub_argc+1]; std::vector temp_args(subcount); size_t subc = 0; size_t ii = 0; size_t nn = op->Args.size()-1; for (size_t jj = 0; jj < nn; jj++) { const std::string& arg = op->Args[jj]; size_t pos = arg.find("{}"); if (pos != std::string::npos) { const char *sub = sa->GetValue(kk).c_str(); if (execdir) { sub = dicomfind_basename(sub); } std::string& temp_arg = temp_args[subc++]; temp_arg = arg; do { temp_arg.replace(pos, 2, sub); pos = temp_arg.find("{}", pos + strlen(sub)); } while (pos != std::string::npos); sub_argv[ii++] = const_cast(temp_arg.c_str()); } else { sub_argv[ii++] = const_cast(arg.c_str()); } } sub_argv[ii] = 0; if (execdir) { std::string dirname = dicomfind_dirname(sa->GetValue(kk).c_str()); if (dirname != currentSubdir) { dicomfind_chdir(originalDir.c_str()); dicomfind_chdir(dirname.c_str()); } } if (!execute_command(sub_argv[0], sub_argv)) { fprintf(stderr, "failure!"); } delete [] sub_argv; } if (execdir && currentSubdir != "") { dicomfind_chdir(originalDir.c_str()); } } else { // call program for each series // for execdir, what if series is split across directories? // need to call executable once per directory, using only // the files in that directory. size_t sub_argc = op->Args.size() + subcount*sa->GetNumberOfTuples() - 1; char **sub_argv = new char *[sub_argc+1]; std::vector temp_args(subcount*sa->GetNumberOfValues()); size_t subc = 0; // for execdir, keep a list of directories that are done std::vector done_dirs; std::string doing_dir; bool notdone = true; while (notdone) { notdone = false; if (execdir) { bool foundDirToProcess = false; for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++) { std::string dirname = dicomfind_dirname(sa->GetValue(kk).c_str()); if (!foundDirToProcess) { bool dirIsDone = false; for (size_t ll = 0; ll < done_dirs.size(); ll++) { if (dirname == done_dirs[ll]) { dirIsDone = true; break; } } if (!dirIsDone) { foundDirToProcess = true; doing_dir = dirname; done_dirs.push_back(dirname); break; } } } if (foundDirToProcess) { notdone = true; } else { break; } } size_t ii = 0; size_t nn = op->Args.size()-1; for (size_t jj = 0; jj < nn; jj++) { const std::string& arg = op->Args[jj]; size_t pos = arg.find("{}"); if (pos != std::string::npos) { for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++) { const char *sub = sa->GetValue(kk).c_str(); if (execdir) { std::string dirname = dicomfind_dirname(sub); if (dirname != doing_dir) { continue; } sub = dicomfind_basename(sub); } std::string& temp_arg = temp_args[subc++]; temp_arg = arg; pos = temp_arg.find("{}"); do { temp_arg.replace(pos, 2, sub); pos = temp_arg.find("{}", pos + strlen(sub)); } while (pos != std::string::npos); sub_argv[ii++] = const_cast(temp_arg.c_str()); } } else { sub_argv[ii++] = const_cast(arg.c_str()); } } sub_argv[ii] = 0; if (execdir) { if (doing_dir != currentSubdir) { dicomfind_chdir(originalDir.c_str()); dicomfind_chdir(doing_dir.c_str()); } } if (!execute_command(sub_argv[0], sub_argv)) { fprintf(stderr, "failure!"); } } if (execdir && currentSubdir != "") { dicomfind_chdir(originalDir.c_str()); } delete [] sub_argv; } } } } // Delay wildcard expansion for -name option MAINMACRO_PASSTHROUGH(-name); // This program will dump all the metadata in the given file int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); std::vector operationList; int rval = 0; int scandepth = std::numeric_limits::max(); const char *pattern = ""; QueryTagList qtlist; vtkDICOMItem query; bool followSymlinks = true; bool ignoreDicomdir = false; bool requirePixelData = false; bool findSeries = false; vtkDICOMCharacterSet charset; vtkSmartPointer a = vtkSmartPointer::New(); // always query SpecificCharacterSet query.Set(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS)); // always query the functional sequences for advanced files query.Set(DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); query.Set(DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); if (argc < 2) { dicomfind_usage(stdout, dicomfind_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { dicomfind_help(stdout, dicomfind_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { dicomfind_version(stdout, dicomfind_basename(argv[0])); return rval; } for (int argi = 1; argi < argc; argi++) { const char *arg = argv[argi]; if (strcmp(arg, "-P") == 0) { followSymlinks = false; } else if (strcmp(arg, "-L") == 0) { followSymlinks = true; } else if (strcmp(arg, "-q") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "%s must be followed by a file.\n\n", arg); dicomfind_usage(stderr, dicomfind_basename(argv[0])); return 1; } const char *qfile = argv[++argi]; if (!dicomcli_readquery(qfile, &query, &qtlist)) { fprintf(stderr, "Can't read query file %s\n\n", qfile); return 1; } } else if (strcmp(arg, "-u") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg); dicomfind_usage(stderr, dicomfind_basename(argv[0])); return 1; } const char *qfile = argv[++argi]; if (!dicomcli_readuids(qfile, &query, &qtlist)) { fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile); return 1; } } else if (strcmp(arg, "-k") == 0) { vtkDICOMTag tag; ++argi; if (argi == argc) { fprintf(stderr, "%s must be followed by gggg,eeee=value " "where gggg,eeee is a DICOM tag.\n\n", arg); return 1; } if (!dicomcli_readkey(argv[argi], &query, &qtlist)) { return 1; } } else if (strcmp(arg, "-maxdepth") == 0) { ++argi; if (argi == argc) { fprintf(stderr, "%s must be followed by an argument.\n\n", arg); return 1; } scandepth = static_cast(atol(argv[argi])); } else if (strcmp(arg, "-name") == 0) { ++argi; if (argi == argc) { fprintf(stderr, "%s must be followed by an argument.\n\n", arg); return 1; } pattern = argv[argi]; } else if (strcmp(arg, "-image") == 0) { requirePixelData = true; } else if (strcmp(arg, "-series") == 0) { findSeries = true; } else if (strcmp(arg, "-print") == 0 || strcmp(arg, "-print0") == 0) { operationList.push_back(arg); } else if (strcmp(arg, "-exec") == 0 || strcmp(arg, "-execdir") == 0) { operationList.push_back(arg); int argj = ++argi; for (; argj < argc; argj++) { if (strcmp(argv[argj], ";") == 0 || strcmp(argv[argj], "+") == 0) { break; } } if (argj == argc) { fprintf(stderr, "%s must be terminated with + or \\; " "(plus or semicolon).\n\n", arg); return 1; } for (; argi <= argj; argi++) { operationList.back().Args.push_back(argv[argi]); } argi = argj; } else if (strcmp(arg, "--ignore-dicomdir") == 0) { ignoreDicomdir = true; } else if (strcmp(arg, "--charset") == 0) { ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "%s must be followed by a valid character set\n\n", arg); return 1; } charset = vtkDICOMCharacterSet(argv[argi]); if (charset.GetKey() == vtkDICOMCharacterSet::Unknown) { fprintf(stderr, "%s %s is not a known character set\n\n", arg, argv[argi]); return 1; } } else if (arg[0] == '-') { fprintf(stderr, "unrecognized option %s.\n\n", arg); dicomfind_usage(stderr, dicomfind_basename(argv[0])); return 1; } else { a->InsertNextValue(arg); } } // if no operations were specified, default to "print" if (operationList.empty()) { operationList.push_back("-print"); } // Remember the current directory std::string originalDir = dicomfind_getcwd(); // Write data for every input directory if (a->GetNumberOfTuples() > 0) { vtkSmartPointer finder = vtkSmartPointer::New(); finder->SetDefaultCharacterSet(charset); finder->SetInputFileNames(a); finder->SetFilePattern(pattern); finder->SetScanDepth(scandepth); finder->SetFindQuery(query); finder->SetIgnoreDicomdir(ignoreDicomdir); finder->SetFollowSymlinks(followSymlinks); finder->SetRequirePixelData(requirePixelData); finder->SetFindLevel( findSeries ? vtkDICOMDirectory::SERIES : vtkDICOMDirectory::IMAGE); finder->Update(); for (int j = 0; j < finder->GetNumberOfStudies(); j++) { int k0 = finder->GetFirstSeriesForStudy(j); int k1 = finder->GetLastSeriesForStudy(j); for (int k = k0; k <= k1; k++) { vtkStringArray *sa = finder->GetFileNamesForSeries(k); dicomfind_operations(operationList, sa, originalDir); } } } return rval; } vtk-dicom-0.8.12/Programs/dicompull.cxx000066400000000000000000000501221356440565500200220ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMItem.h" #include "vtkDICOMDataElement.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMFile.h" #include "vtkDICOMFilePath.h" #include "vtkDICOMFileDirectory.h" // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" #include "readquery.h" #include "progress.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include #include #include #include #include // print the version void dicompull_version(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } // print the usage void dicompull_usage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s [options] ...\n\n", cp); fprintf(file, "options:\n" " -L Follow symbolic links (default).\n" " -P Do not follow symbolic links.\n" " -k tag=value Provide an attribute to be queried and matched.\n" " -q Provide a file to describe the find query.\n" " -u Provide a file that contains a list of UIDs.\n" " -o Directory to place the files into.\n" " -maxdepth n Set the maximum directory depth.\n" " -name pattern Set file names to match (with \"*\" or \"?\").\n" " -image Restrict the search to files with PixelData.\n" " -series Find all files in series if even one file matches.\n" " --ignore-dicomdir Ignore the DICOMDIR file even if it is present.\n" " --charset Charset to use if SpecificCharacterSet is missing.\n" " --silent Do not report any progress information.\n" " --help Print a brief help message.\n" " --version Print the software version.\n" ); } // print the help void dicompull_help(FILE *file, const char *cp) { dicompull_usage(file, cp); fprintf(file, "\n" "Find dicom files in one directory and copy them to a new directory.\n" "\n" "The output directory given with \"-o\" can use DICOM attributes, by\n" "naming those attributes within curly braces. For example, consider\n" "\"{PatientID}/{StudyDescription}/{SeriesDescription}-{SeriesNumber}\"\n" "or something similar to produce a hierarchichal directory structure.\n" "\n" "The files to be copied are specified with search keys, which take the\n" "form \"-k key=value\" where keys can either use the standard names given\n" "in the DICOM dictionary, e.g. Modality or SeriesDescription, or can be\n" "in the form GGGG,EEEE with hexadecimal group and element values. The\n" "tags can also be listed in a query file with the \"-q\" option (one tag\n" "per line). Private tags should be preceded by the private dictionary\n" "name in square brackets.\n" "\n" "The values used for \"-k key=value\" can use the wildcards * and ?, and\n" "can also use date ranges of the form \"19990103-19990105\".\n" "\n" "The \"-u\" option can be used to provide a list of UIDs. Provide a file\n" "where the first line of the file is the key (e.g. SeriesInstanceUID) and\n" "the rest of the file is the UIDs to match, one UID per line.\n" "\n" ); } // remove path portion of filename const char *dicompull_basename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // get directory portion of filename std::string dicompull_dirname(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename) { --cp; if (cp[0] == '\\' || cp[0] == '/') { break; } } return std::string(filename, cp - filename); } typedef vtkDICOMVR VR; std::string dicompull_cleanup(const std::string& input) { std::string::const_iterator a = input.begin(); std::string::const_iterator b = a; std::string s; while (a != input.end()) { while (a != input.end() && ((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a)) { ++a; } s.append(b, a); b = a; while (a != input.end() && (((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a))) { ++a; } if (b != a && b != input.begin() && a != input.end()) { s.append("_"); } b = a; } return s; } std::string dicompull_basedir(const char *outdir) { std::string s; const char *lastslash = outdir; const char *cp = outdir; while (*cp != '\0') { while (*cp != '/' && *cp != '{' && *cp != '\0') { cp++; } if (*cp == '/') { cp++; lastslash = cp; } else if (*cp == '{') { cp = lastslash; break; } } if (cp == outdir) { s = "."; // current directory } else { s.append(outdir, cp); } return s; } void dicompull_checktags( vtkDICOMItem *query, QueryTagList *qtlist, const char *outdir) { std::string keytext; const char *cp = outdir; const char *bp = 0; while (*cp != '\0') { while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; } if (*cp == '}') { fprintf(stderr, "Error: Missing \'{\': %s\n", outdir); exit(1); } if (*cp == '{') { cp++; bp = cp; while (*cp != '}' && *cp != '\0') { cp++; } if (*cp != '}') { fprintf(stderr, "Error: Unmatched \'{\': %s\n", outdir); exit(1); } else { keytext.assign(bp, cp); cp++; if (!dicomcli_readkey(keytext.c_str(), query, qtlist)) { exit(1); } } } } } std::string dicompull_makedirname(vtkDICOMMetaData *meta, const char *outdir) { std::string s; std::string keytext; std::string val; vtkDICOMValue v; vtkDICOMItem query; QueryTagList qtlist; const char *cp = outdir; const char *dp = cp; const char *bp = 0; while (*cp != '\0') { while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; } if (*cp == '}') { fprintf(stderr, "Error: Missing \'{\': %s\n", outdir); exit(1); } if (*cp == '{') { bp = cp; while (*cp != '}' && *cp != '\0') { cp++; } if (*cp != '}') { fprintf(stderr, "Error: Unmatched \'{\': %s\n", outdir); exit(1); } else { s.append(dp, bp); bp++; keytext.assign(bp, cp); cp++; dp = cp; if (!dicomcli_readkey(keytext.c_str(), &query, &qtlist, false)) { exit(1); } const vtkDICOMTagPath& tagpath = qtlist.back(); val.clear(); v = meta->Get(tagpath); if (v.IsValid()) { val.assign(dicompull_cleanup(v.AsUTF8String())); } if (val.empty()) { val = "Empty"; } s.append(val); } } } s.append(dp, cp); return s; } // Delay wildcard expansion for -name option MAINMACRO_PASSTHROUGH(-name); // This program will find and copy dicom files int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; int scandepth = std::numeric_limits::max(); bool followSymlinks = true; const char *pattern = ""; QueryTagList qtlist; vtkDICOMItem query; bool requirePixelData = false; bool findSeries = false; bool ignoreDicomdir = false; vtkDICOMCharacterSet charset; bool silent = false; std::string outdir; vtkSmartPointer a = vtkSmartPointer::New(); // always query SpecificCharacterSet query.Set(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS)); // always query the functional sequences for advanced files query.Set(DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); query.Set(DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); if (argc < 2) { dicompull_usage(stdout, dicompull_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { dicompull_help(stdout, dicompull_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { dicompull_version(stdout, dicompull_basename(argv[0])); return rval; } for (int argi = 1; argi < argc; argi++) { const char *arg = argv[argi]; if (strcmp(arg, "-P") == 0) { followSymlinks = false; } else if (strcmp(arg, "-L") == 0) { followSymlinks = true; } else if (strcmp(arg, "-q") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg); dicompull_usage(stderr, dicompull_basename(argv[0])); return 1; } const char *qfile = argv[++argi]; if (!dicomcli_readquery(qfile, &query, &qtlist)) { fprintf(stderr, "Error: Can't read query file %s\n\n", qfile); return 1; } } else if (strcmp(arg, "-u") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg); dicompull_usage(stderr, dicompull_basename(argv[0])); return 1; } const char *qfile = argv[++argi]; if (!dicomcli_readuids(qfile, &query, &qtlist)) { fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile); return 1; } } else if (strcmp(arg, "-k") == 0) { vtkDICOMTag tag; ++argi; if (argi == argc) { fprintf(stderr, "Error: %s must be followed by gggg,eeee=value " "where gggg,eeee is a DICOM tag.\n\n", arg); return 1; } if (!dicomcli_readkey(argv[argi], &query, &qtlist)) { return 1; } } else if (strcmp(arg, "-o") == 0) { vtkDICOMTag tag; ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "Error: %s must be followed by output directory.\n\n", arg); return 1; } outdir = argv[argi]; } else if (strcmp(arg, "-maxdepth") == 0) { ++argi; if (argi == argc) { fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg); return 1; } scandepth = static_cast(atol(argv[argi])); } else if (strcmp(arg, "-name") == 0) { ++argi; if (argi == argc) { fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg); return 1; } pattern = argv[argi]; } else if (strcmp(arg, "-image") == 0) { requirePixelData = true; } else if (strcmp(arg, "-series") == 0) { findSeries = true; } else if (strcmp(arg, "--ignore-dicomdir") == 0) { ignoreDicomdir = true; } else if (strcmp(arg, "--charset") == 0) { ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "%s must be followed by a valid character set\n\n", arg); return 1; } charset = vtkDICOMCharacterSet(argv[argi]); if (charset.GetKey() == vtkDICOMCharacterSet::Unknown) { fprintf(stderr, "%s %s is not a known character set\n\n", arg, argv[argi]); return 1; } } else if (strcmp(arg, "--silent") == 0) { silent = true; } else if (arg[0] == '-') { fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg); dicompull_usage(stderr, dicompull_basename(argv[0])); return 1; } else { int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In); if (code == vtkDICOMFile::Good || code == vtkDICOMFile::FileIsDirectory) { a->InsertNextValue(arg); } else if (dicomcli_looks_like_key(arg)) { fprintf(stderr, "Error: Missing -k before %s.\n\n", arg); return 1; } else { fprintf(stderr, "Error: File not found: %s.\n\n", arg); return 1; } } } // output directory is mandatory if (outdir.empty()) { fprintf(stderr, "\nError: No output directory was specified (-o ).\n\n"); exit(1); } // check that the outdir string is valid dicompull_checktags(&query, NULL, outdir.c_str()); // check that the outdir is writable std::string basedir = dicompull_basedir(outdir.c_str()); vtkDICOMFilePath basepath(basedir); while (!basepath.IsRoot() && !basepath.IsEmpty()) { int code = vtkDICOMFileDirectory::Access(basepath.AsString().c_str(), vtkDICOMFileDirectory::In); if (code == 0) { // found a directory break; } else if (code == vtkDICOMFileDirectory::AccessDenied) { fprintf(stderr, "\nError: access to %s is denied.\n\n", basepath.AsString().c_str()); exit(1); } else if (code != vtkDICOMFileDirectory::FileNotFound) { fprintf(stderr, "\nError: %s is not a valid directory.\n\n", basepath.AsString().c_str()); exit(1); } basepath.PopBack(); } // see if we can write to the directory if (vtkDICOMFileDirectory::Access(basepath.AsString().c_str(), vtkDICOMFileDirectory::Out) != 0) { fprintf(stderr, "\nError: Cannot write to %s\n\n", basepath.AsString().c_str()); exit(1); } // Create a map of all directories written to. The count is the // number of series that have been written to the directory. std::map dircount; // Write data for every input directory if (a->GetNumberOfTuples() > 0) { const size_t bufsize = 8192; unsigned char *buffer = new unsigned char [bufsize]; vtkSmartPointer finder = vtkSmartPointer::New(); finder->SetDefaultCharacterSet(charset); finder->SetInputFileNames(a); finder->SetFilePattern(pattern); finder->SetScanDepth(scandepth); finder->SetFindQuery(query); finder->SetIgnoreDicomdir(ignoreDicomdir); finder->SetFollowSymlinks(followSymlinks); finder->SetRequirePixelData(requirePixelData); finder->SetFindLevel( findSeries ? vtkDICOMDirectory::SERIES : vtkDICOMDirectory::IMAGE); vtkSmartPointer p = vtkSmartPointer::New(); if (!silent) { p->SetText("Scanning"); finder->AddObserver(vtkCommand::ProgressEvent, p); finder->AddObserver(vtkCommand::StartEvent, p); finder->AddObserver(vtkCommand::EndEvent, p); } finder->Update(); vtkIdType count = 0; vtkIdType total = 0; if (!silent) { p->SetText("Copying"); p->Execute(NULL, vtkCommand::StartEvent, NULL); for (int k = 0; k < finder->GetNumberOfSeries(); k++) { total += finder->GetFileNamesForSeries(k)->GetNumberOfValues(); } } for (int j = 0; j < finder->GetNumberOfStudies(); j++) { int k0 = finder->GetFirstSeriesForStudy(j); int k1 = finder->GetLastSeriesForStudy(j); for (int k = k0; k <= k1; k++) { vtkStringArray *sa = finder->GetFileNamesForSeries(k); vtkDICOMMetaData *meta = finder->GetMetaDataForSeries(k); // create the directory name std::string dirname = dicompull_makedirname(meta, outdir.c_str()); std::map::iterator mi = dircount.find(dirname); int si = 1; if (mi != dircount.end()) { si = mi->second + 1; mi->second = si; } else { dircount[dirname] = si; int code = vtkDICOMFileDirectory::Create(dirname.c_str()); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Error: Cannot create directory: %s\n\n", dirname.c_str()); delete [] buffer; exit(1); } } vtkDICOMFilePath outpath(dirname); for (vtkIdType i = 0; i < sa->GetNumberOfValues(); i++) { // copy the file char fname[32]; sprintf(fname, "IM-%04d-%04d.dcm", si, static_cast(i+1)); const std::string& srcname = sa->GetValue(i); std::string fullname = outpath.Join(fname); if (!vtkDICOMFile::SameFile(srcname.c_str(), fullname.c_str())) { vtkDICOMFile infile(srcname.c_str(), vtkDICOMFile::In); if (infile.GetError()) { const char *message = "Missing file"; switch (infile.GetError()) { case vtkDICOMFile::AccessDenied: message = "Access denied for file"; break; case vtkDICOMFile::FileIsDirectory: message = "This file is a directory"; break; case vtkDICOMFile::ImpossiblePath: message = "Bad file path"; break; } dicomcli_error_helper(finder->GetMetaDataForSeries(k), i); fprintf(stderr, "Error: %s: %s\n\n", message, srcname.c_str()); } else if (infile.GetSize() == 0) { dicomcli_error_helper(finder->GetMetaDataForSeries(k), i); fprintf(stderr, "Error: File size is zero: %s\n\n", srcname.c_str()); } else { vtkDICOMFile outfile(fullname.c_str(), vtkDICOMFile::Out); if (outfile.GetError()) { const char *message = "Cannot write file"; switch (outfile.GetError()) { case vtkDICOMFile::AccessDenied: message = "Access denied for output file"; break; case vtkDICOMFile::FileIsDirectory: message = "This output is a directory"; break; case vtkDICOMFile::ImpossiblePath: message = "Bad file path"; break; } fprintf(stderr, "Error: %s: %s\n\n", message, fullname.c_str()); } else { // copy the file while (!infile.EndOfFile()) { size_t bytecount = infile.Read(buffer, bufsize); if (bytecount == 0 && infile.GetError()) { dicomcli_error_helper(finder->GetMetaDataForSeries(k), i); fprintf(stderr, "Error, incomplete read: %s\n\n", srcname.c_str()); vtkDICOMFile::Remove(fullname.c_str()); break; } if (bytecount > 0 && outfile.Write(buffer, bytecount) != bytecount) { fprintf(stderr, "Error: Incomplete write: %s\n\n", fullname.c_str()); vtkDICOMFile::Remove(fullname.c_str()); break; } } } } } if (!silent) { count++; double progress = (static_cast(count)/ static_cast(total)); p->Execute(NULL, vtkCommand::ProgressEvent, &progress); } } } } delete [] buffer; if (!silent) { p->Execute(NULL, vtkCommand::EndEvent, NULL); } } return rval; } vtk-dicom-0.8.12/Programs/dicomtocsv.cxx000066400000000000000000000746061356440565500202210ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMDirectory.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMItem.h" #include "vtkDICOMDataElement.h" #include "vtkDICOMParser.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMMetaDataAdapter.h" #include "vtkDICOMFile.h" // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" #include "readquery.h" #include "progress.h" #include "vtkCommand.h" #include "vtkTimerLog.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include #include #include #ifdef _WIN32 #include #endif namespace { // These correspond to certain command-line arguments enum ReductionType { None = 0, FirstNonzero, MinValue, MaxValue }; // print the version void dicomtocsv_version(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } // print the usage void dicomtocsv_usage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s [options] \n\n", cp); fprintf(file, "options:\n" " -k tag=value Provide a key to be queried and matched.\n" " -q Provide a file to describe the find query.\n" " -u Provide a file that contains a list of UIDs.\n" " -o Provide a file for the query results.\n" " --default Add to default query instead of replacing it.\n" " --first-nonzero Search series for first nonzero value of each key.\n" " --all-unique Report all unique values within each series.\n" " --min-value Report the minimum value within each series.\n" " --max-value Report the maximum value within each series.\n" " --directory-only Do not scan files if DICOMDIR is present.\n" " --ignore-dicomdir Ignore the DICOMDIR file even if it is present.\n" " --charset Charset to use if SpecificCharacterSet is missing.\n" " --images-only Only list files that have PixelData or equivalent.\n" " --noheader Do not print the csv header.\n" " --study Print one row for each study.\n" " --series Print one row for each series (default).\n" " --image Print one row for each image.\n" " --silent Do not report any progress information.\n" " --help Print a brief help message.\n" " --version Print the software version.\n"); } // print the help void dicomtocsv_help(FILE *file, const char *cp) { dicomtocsv_usage(file, cp); fprintf(file, "\n" "Dump selected metadata from a DICOM directory to a csv file.\n" "For each attribute to be extracted, the tag can be given with \"-k\"\n" "(the \"-k\" option can be repeated as many times as needed). Tags can\n" "given in hexadecimal GGGG,EEEE format, or in text format as specified\n" "in the DICOM dictionary. Alternately, the tags can be listed in a\n" "query file given with the \"-q\" option (one tag per line).\n" "Attributes nested within sequences can be specified by giving a tag\n" "path e.g. \"-k Tag1/Tag2/Tag3\". Either a forward slash or a backslash\n" "can be used to separate the components of the path. Private tags\n" "should be preceded by the private dictionary name in square brackets.\n" "\n" "If the same tag is given more than once with \"-k\" (or if the tag is\n" "listed multiple times in the query file, or appears in both the query\n" "file and as a \"-k\" option), then its first appearance will set the\n" "column number that it appears in. Also, with regards to the search,\n" "the value specified in the final appearance of the tag as an option\n" "will be the value used for the search.\n" "\n" "If no attributes are specified with either \"-k\" or \"-q\", then a\n" "default set of query attributes will be used.\n\n"); } // remove path portion of filename const char *dicomtocsv_basename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } typedef vtkDICOMVR VR; // Observer for DICOM errors class ErrorObserver : public vtkCommand { public: static ErrorObserver *New() { return new ErrorObserver(); } vtkTypeMacro(ErrorObserver,vtkCommand); void Execute( vtkObject *caller, unsigned long eventId, void *callData) VTK_DICOM_OVERRIDE; void SetMetaData(vtkDICOMMetaData *meta) { this->MetaData = meta; } protected: ErrorObserver() : MetaData(0) {} ErrorObserver(const ErrorObserver& c) : vtkCommand(c) {} void operator=(const ErrorObserver&) {} vtkDICOMMetaData *MetaData; }; void ErrorObserver::Execute(vtkObject *o, unsigned long e, void *data) { if (e == vtkCommand::ErrorEvent) { vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); if (parser) { dicomcli_error_helper(this->MetaData, parser->GetIndex()); } if (data) { fprintf(stderr, "%s", static_cast(data)); } } } // Create a default query for --image void dicomtocsv_image_default(vtkDICOMItem *query, QueryTagList *ql) { // these are the attributes that must be part of the query static const DC::EnumType defaultElements[] = { // patient-level information DC::PatientName, // 2 DC::PatientID, // 1 DC::PatientBirthDate, // 3 DC::PatientSex, // 3 // study-level information DC::StudyDate, // 1 DC::StudyTime, // 1 DC::StudyID, // 1 DC::AccessionNumber, // 2 DC::StudyDescription, // 2 DC::StudyInstanceUID, // 1 // series-level information DC::Modality, // 1 DC::SeriesNumber, // 1 DC::SeriesDescription, // 3 DC::SeriesInstanceUID, // 1 DC::Rows, // 3 DC::Columns, // 3 // image-level information DC::InstanceNumber, // 1 DC::SOPClassUID, // 1 DC::SOPInstanceUID, // 1 DC::ReferencedFileID, // special // delimiter to mark end of list DC::ItemDelimitationItem }; for (const DC::EnumType *tagPtr = defaultElements; *tagPtr != DC::ItemDelimitationItem; ++tagPtr) { VR vr = query->FindDictVR(*tagPtr); query->Set(*tagPtr, vtkDICOMValue(vr)); ql->push_back(vtkDICOMTagPath(*tagPtr)); } } // Create a default query for --series void dicomtocsv_series_default(vtkDICOMItem *query, QueryTagList *ql) { // these are the attributes that must be part of the query static const DC::EnumType defaultElements[] = { // patient-level information DC::PatientName, // 2 DC::PatientID, // 1 DC::PatientBirthDate, // 3 DC::PatientSex, // 3 // study-level information DC::StudyDate, // 1 DC::StudyTime, // 1 DC::StudyID, // 1 DC::AccessionNumber, // 2 DC::StudyDescription, // 2 DC::StudyInstanceUID, // 1 // series-level information DC::Modality, // 1 DC::SeriesNumber, // 1 DC::SeriesDescription, // 3 DC::SeriesInstanceUID, // 1 DC::Rows, // 3 DC::Columns, // 3 DC::NumberOfReferences, // special // delimiter to mark end of list DC::ItemDelimitationItem }; for (const DC::EnumType *tagPtr = defaultElements; *tagPtr != DC::ItemDelimitationItem; ++tagPtr) { VR vr = query->FindDictVR(*tagPtr); query->Set(*tagPtr, vtkDICOMValue(vr)); ql->push_back(vtkDICOMTagPath(*tagPtr)); } } // Create a default query for --study void dicomtocsv_study_default(vtkDICOMItem *query, QueryTagList *ql) { // these are the attributes that must be part of the query static const DC::EnumType defaultElements[] = { // patient-level information DC::PatientName, // 2 DC::PatientID, // 1 DC::PatientBirthDate, // 3 DC::PatientSex, // 3 // study-level information DC::StudyDate, // 1 DC::StudyTime, // 1 DC::StudyID, // 1 DC::AccessionNumber, // 2 DC::StudyDescription, // 2 DC::StudyInstanceUID, // 1 DC::NumberOfReferences, // special // delimiter to mark end of list DC::ItemDelimitationItem }; for (const DC::EnumType *tagPtr = defaultElements; *tagPtr != DC::ItemDelimitationItem; ++tagPtr) { VR vr = query->FindDictVR(*tagPtr); query->Set(*tagPtr, vtkDICOMValue(vr)); ql->push_back(vtkDICOMTagPath(*tagPtr)); } } // generate a default query void dicomtocsv_default(int level, vtkDICOMItem *query, QueryTagList *ql) { if (level == 2) { dicomtocsv_study_default(query, ql); } else if (level == 3) { dicomtocsv_series_default(query, ql); } else if (level == 4) { dicomtocsv_image_default(query, ql); } } // Write the header for a csv file void dicomtocsv_writeheader( const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp) { // print human-readable names for each tag for (size_t i = 0; i < ql->size(); i++) { if (i != 0) { fprintf(fp, "%s", ","); } const vtkDICOMItem *pitem = &query; vtkDICOMTagPath tagPath = ql->at(i); for (;;) { vtkDICOMTag tag = tagPath.GetHead(); vtkDICOMDictEntry e = pitem->FindDictEntry(tag); if (e.IsValid()) { const char *name = e.GetName(); name = ((name && name[0]) ? name : "Unknown"); fprintf(fp, "%s", name); } if (!tagPath.HasTail()) { break; } pitem = pitem->Get(tag).GetSequenceData(); tagPath = tagPath.GetTail(); fprintf(fp, "%s", "\\"); } } fprintf(fp, "%s", "\r\n"); } // Convert date to format YYYY-MM-DD HH:MM:SS std::string dicomtocsv_date(const std::string& dt, vtkDICOMVR vr) { if (vr == VR::TM && dt.length() >= 6) { return dt.substr(0,2) + ":" + dt.substr(2,2) + ":" + dt.substr(4,2); } else if (vr == VR::DA && dt.length() >= 8) { return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2); } else if (vr == VR::DT && dt.length() >= 14) { return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2) + " " + dt.substr(8,2) + ":" + dt.substr(10,2) + ":" + dt.substr(12,2); } return ""; } // Quote a string by doubling any double-quotes that are found // (this follows RFC 4180) std::string dicomtocsv_quote(const std::string& s) { size_t i = 0; std::string r; for (;;) { size_t j = s.find('\"', i); if (j < s.length()) { r += s.substr(i, j-i+1); r += "\""; i = j+1; } else { r += s.substr(i); break; } } return r; } // Check if value is a single binary value bool is_binary_number(const vtkDICOMValue& v) { return (v.GetNumberOfValues() == 1 && (v.GetVR() == VR::SS || v.GetVR() == VR::US || v.GetVR() == VR::SL || v.GetVR() == VR::UL || v.GetVR() == VR::FL || v.GetVR() == VR::FD)); } // Check if value is a date or time bool is_date_or_time(const vtkDICOMValue& v) { return (v.GetVR() == VR::DA || v.GetVR() == VR::TM || v.GetVR() == VR::DT); } // Convert an attribute value to a printable string std::string value_as_string(const vtkDICOMValue& v) { std::string s; if (is_binary_number(v)) { s = v.AsString(); } else if (is_date_or_time(v)) { size_t n = v.GetNumberOfValues(); for (size_t i = 0; i < n; i++) { if (i) { s.push_back('\\'); } s = dicomtocsv_date(v.GetString(i), v.GetVR()); } } else if (v.GetVR() == VR::SQ) { // how should a sequence be printed out to the csv file? } else if (v.GetVL() != 0 && v.GetVL() != 0xFFFFFFFF) { size_t n = v.GetNumberOfValues(); for (size_t i = 0; i < n; i++) { if (i) { s.push_back('\\'); } v.AppendValueToSafeUTF8String(s, i); } if (s.find('\"') < s.length()) { s = dicomtocsv_quote(s); } } return s; } // check to see if t appears in s already bool unique_value(const std::string& t, const std::string& s) { size_t pos = 0; size_t l = s.length(); size_t n = t.length(); while (pos < l && pos + n <= l) { if (s.compare(pos, n, t) == 0) { return false; } pos = s.find('\\', pos); if (pos < l) { pos++; } } return true; } // A helper struct for dicomtocsv_write struct SearchState { vtkDICOMTagPath p; const vtkDICOMItem *q; const vtkDICOMItem *m; const vtkDICOMItem *n; }; // Write out the results in csv format void dicomtocsv_write(vtkDICOMDirectory *finder, const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp, int level, ReductionType rt, bool allUnique, bool rescanFiles, vtkCommand *p) { // for keeping track of progress vtkIdType count = 0.0; vtkIdType total = 0.0; if (p) { for (int k = 0; k < finder->GetNumberOfSeries(); k++) { total += finder->GetFileNamesForSeries(k)->GetNumberOfValues(); } p->Execute(NULL, vtkCommand::StartEvent, NULL); } for (int j = 0; j < finder->GetNumberOfStudies(); j++) { int k0 = finder->GetFirstSeriesForStudy(j); int k1 = finder->GetLastSeriesForStudy(j); int numberOfFiles = 1; if (level < 3 && k1 > k0) { // if level is "study", only look at one series numberOfFiles = 0; for (int k = k0; k <= k1; k++) { vtkStringArray *a = finder->GetFileNamesForSeries(k); numberOfFiles += a->GetNumberOfValues(); } k1 = k0; } for (int k = k0; k <= k1; k++) { vtkStringArray *a = finder->GetFileNamesForSeries(k); if (a->GetNumberOfValues() == 0) { continue; } if (level == 3) { // at series level, this is the number of files numberOfFiles = a->GetNumberOfValues(); } vtkSmartPointer meta; if (!rescanFiles) { meta = finder->GetMetaDataForSeries(k); } else { meta = vtkSmartPointer::New(); if (level >= 4 || rt != None || allUnique) { // need to parse all files meta->SetNumberOfInstances(a->GetNumberOfValues()); } // need to go to the files for the meta data vtkSmartPointer parser = vtkSmartPointer::New(); vtkSmartPointer errorObserver = vtkSmartPointer::New(); errorObserver->SetMetaData(finder->GetMetaDataForSeries(k)); parser->AddObserver(vtkCommand::ErrorEvent, errorObserver); parser->SetQueryItem(query); parser->SetMetaData(meta); for (int ii = 0; ii < meta->GetNumberOfInstances(); ii++) { parser->SetIndex(ii); parser->SetFileName(a->GetValue(ii)); parser->Update(); } } // this loop is only for the "image" level int m = (level >= 4 ? meta->GetNumberOfInstances() : 1); for (int jj = 0; jj < m; jj++) { // print the value of each tag for (size_t i = 0; i < ql->size(); i++) { if (i != 0) { fprintf(fp, "%s", ","); } vtkDICOMTagPath tagPath = ql->at(i); std::string s; double d = 0.0; bool isNumber = true; bool found = false; bool done = false; // this loop is only needed if all images are to be checked int n = (m == 1 ? meta->GetNumberOfInstances() : 1); if (level >= 4) { // we will probe one instance (instance jj) n = jj+1; } else if (n > 1) { // do a quick check to see if value is same for all instances vtkDICOMTag tag = tagPath.GetHead(); if ((tag.GetGroup() & 0x0001) == 0) { vtkDICOMDataElementIterator iter = meta->Find(tag); n = ((iter == meta->End() || !iter->IsPerInstance()) ? 1 : n); } } for (int ii = jj; ii < n && !done; ii++) { // Create an adapter, which helps with extracting attributes from // the PerFrameFunctionalSequence of enhanced IODs. vtkDICOMMetaDataAdapter adapter(meta, ii); // Create a stack for searching the whole tree std::vector tstack(1); SearchState &head = tstack.back(); head.p = tagPath; head.q = &query; head.m = 0; head.n = head.m + 1; while (!tstack.empty()) { SearchState &top = tstack.back(); if (top.m == top.n) { tstack.pop_back(); continue; } const vtkDICOMTagPath& tpath = top.p; const vtkDICOMItem *qitem = top.q; const vtkDICOMItem *mitem = top.m++; vtkDICOMTag tag = tpath.GetHead(); std::string creator; if ((tag.GetGroup() & 0x0001) == 1) { vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8); creator = qitem->Get(ctag).AsString(); if (mitem) { tag = mitem->ResolvePrivateTag(tag, creator); } else { tag = adapter->ResolvePrivateTag(tag, creator); } } const vtkDICOMValue *vptr = 0; if (mitem) { vptr = &mitem->Get(tag); } else if (tag != DC::NumberOfFrames) { // vtkDICOMMetaDataAdapter hides NumberOfFrames, so it // will never be found if we check the adapter vptr = &adapter->Get(tag); } else { vptr = &meta->Get(ii, tag); } if (vptr && !vptr->IsValid()) { vptr = 0; } // check if we have reached the end of a tag path if (!tpath.HasTail()) { if (vptr != 0) { std::string t = value_as_string(*vptr); if (!is_binary_number(*vptr)) { isNumber = false; } if (rt != 0 && vptr->GetVR().HasNumericValue()) { double f = vptr->AsDouble(); if (!found) { d = f; s = t; found = true; } else if (rt == FirstNonzero && f != 0.0) { // if a non-zero value is found, then break s = t; done = true; break; } else if ((rt == MinValue && f < d) || (rt == MaxValue && f > d)) { d = f; s = t; } } else if (allUnique) { if (!found || unique_value(t, s)) { if (found) { s.push_back('\\'); isNumber = false; } found = true; s += t; } } else { // output the value s = t; found = true; if (rt == 0 || vptr->GetVL() != 0) { done = true; break; } } } } else if (vptr != 0) { // go one level deeper into the query qitem = qitem->Get(tpath.GetHead()).GetSequenceData(); // go one level deeper into the meta data mitem = vptr->GetSequenceData(); if (mitem) { tstack.resize(tstack.size()+1); SearchState &b = tstack.back(); b.p = tstack[tstack.size()-2].p.GetTail(); b.q = qitem; b.m = mitem; b.n = mitem + vptr->GetNumberOfValues(); continue; } } } } if (found) { // Print the found value(s) if (isNumber) { fprintf(fp, "%s", s.c_str()); } else { fprintf(fp, "\"%s\"", s.c_str()); } } else if (tagPath.GetHead() == DC::ReferencedFileID && !tagPath.HasTail()) { // ReferencedFileID (0004,1500) is meant to be used in DICOMDIR, // but we hijack it to report the first file in the series. s = dicomtocsv_quote(a->GetValue(jj)); fprintf(fp, "\"%s\"", s.c_str()); } else if (tagPath.GetHead() == DC::NumberOfReferences && !tagPath.HasTail()) { // NumberOfReferences (0004,1600) is a retired attribute meant // to count the number of references to a file, but we hijack // it and use it to report the number of files found for the // series. fprintf(fp, "\"%d\"", numberOfFiles); } } fprintf(fp, "%s", "\r\n"); // report progress if (p) { count += numberOfFiles; double progress = (static_cast(count)/ static_cast(total)); p->Execute(NULL, vtkCommand::ProgressEvent, &progress); } } } } if (p) { p->Execute(NULL, vtkCommand::EndEvent, NULL); } } } // end anonymous namespace // This program will dump all the metadata in the given file int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; int scandepth = std::numeric_limits::max(); QueryTagList qtlist; vtkDICOMItem query; std::vector oplist; ReductionType rt = None; bool allUnique = false; bool rescanFiles = false; bool onlyDicomdir = false; bool ignoreDicomdir = false; vtkDICOMCharacterSet charset; bool imagesOnly = false; bool noHeader = false; bool silent = false; int level = 3; // default to series level vtkSmartPointer a = vtkSmartPointer::New(); const char *ofile = 0; // always query SpecificCharacterSet query.Set(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS)); // always query the functional sequences for advanced files query.Set(DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); query.Set(DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ)); if (argc < 2) { dicomtocsv_usage(stdout, dicomtocsv_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { dicomtocsv_help(stdout, dicomtocsv_basename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { dicomtocsv_version(stdout, dicomtocsv_basename(argv[0])); return rval; } // need to check for query level first for (int argi = 1; argi < argc; argi++) { const char *arg = argv[argi]; if (strcmp(arg, "--study") == 0) { level = 2; } else if (strcmp(arg, "--series") == 0) { level = 3; } else if (strcmp(arg, "--image") == 0) { level = 4; } } for (int argi = 1; argi < argc; argi++) { const char *arg = argv[argi]; if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg); dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0])); return 1; } if (arg[1] == 'q') { const char *qfile = argv[++argi]; if (!dicomcli_readquery(qfile, &query, &qtlist)) { fprintf(stderr, "Error: Can't read query file %s\n\n", qfile); return 1; } } else if (arg[1] == 'o') { ofile = argv[++argi]; } } else if (strcmp(arg, "-u") == 0) { if (argi + 1 == argc || argv[argi+1][0] == '-') { fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg); dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0])); return 1; } const char *qfile = argv[++argi]; if (!dicomcli_readuids(qfile, &query, &qtlist)) { fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile); return 1; } } else if (strcmp(arg, "-k") == 0) { vtkDICOMTag tag; ++argi; if (argi == argc) { fprintf(stderr, "Error: %s must be followed by gggg,eeee=value " "where gggg,eeee is a DICOM tag.\n\n", arg); return 1; } if (!dicomcli_readkey(argv[argi], &query, &qtlist)) { return 1; } } else if (strcmp(arg, "--default") == 0) { dicomtocsv_default(level, &query, &qtlist); } else if (strcmp(arg, "--first-nonzero") == 0) { rt = FirstNonzero; } else if (strcmp(arg, "--min-value") == 0) { rt = MinValue; } else if (strcmp(arg, "--max-value") == 0) { rt = MaxValue; } else if (strcmp(arg, "--all-unique") == 0) { allUnique = true; } else if (strcmp(arg, "--directory-only") == 0) { onlyDicomdir = true; } else if (strcmp(arg, "--rescan") == 0) { rescanFiles = true; } else if (strcmp(arg, "--ignore-dicomdir") == 0) { ignoreDicomdir = true; } else if (strcmp(arg, "--charset") == 0) { ++argi; if (argi == argc || argv[argi][0] == '-') { fprintf(stderr, "%s must be followed by a valid character set\n\n", arg); return 1; } charset = vtkDICOMCharacterSet(argv[argi]); if (charset.GetKey() == vtkDICOMCharacterSet::Unknown) { fprintf(stderr, "%s %s is not a known character set\n\n", arg, argv[argi]); return 1; } } else if (strcmp(arg, "--images-only") == 0) { imagesOnly = true; } else if (strcmp(arg, "--noheader") == 0) { noHeader = true; } else if (strcmp(arg, "--silent") == 0) { silent = true; } else if (strcmp(arg, "--study") == 0 || strcmp(arg, "--series") == 0 || strcmp(arg, "--image") == 0) { // these were handled in first arg scan } else if (arg[0] == '-') { fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg); dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0])); return 1; } else { int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In); if (code == vtkDICOMFile::Good || code == vtkDICOMFile::FileIsDirectory) { a->InsertNextValue(arg); } else if (dicomcli_looks_like_key(arg)) { fprintf(stderr, "Error: Missing -k before %s.\n\n", arg); return 1; } else if (strlen(arg) > 4 && strcmp(&arg[strlen(arg) - 4], ".csv") == 0) { fprintf(stderr, "Error: Missing -o before %s.\n\n", arg); return 1; } else { fprintf(stderr, "Error: File not found: %s.\n\n", arg); return 1; } } } FILE *fp = stdout; FILE *fp1 = NULL; if (ofile) { #ifndef _WIN32 fp1 = fopen(ofile, "wb"); #else // use wide chars to avoid narrowing to local character set int n = MultiByteToWideChar(CP_UTF8, 0, ofile, -1, NULL, 0); wchar_t *wofile = new wchar_t[n]; MultiByteToWideChar(CP_UTF8, 0, ofile, -1, wofile, n); fp1 = _wfopen(wofile, L"wb"); delete [] wofile; #endif if (!fp1) { fprintf(stderr, "Error: Unable to open output file %s.\n", ofile); return 1; } fp = fp1; } else { // if output to stdout, then silence progress reporting silent = true; } // If no query specified, then use a default one if (qtlist.size() == 0) { dicomtocsv_default(level, &query, &qtlist); } // Write the header if (!noHeader) { dicomtocsv_writeheader(query, &qtlist, fp); fflush(fp); } // Write data for every input directory if (a->GetNumberOfTuples() > 0) { vtkSmartPointer p; // Set the default characte set vtkDICOMCharacterSet::SetGlobalDefault(charset); vtkSmartPointer finder = vtkSmartPointer::New(); finder->SetRequirePixelData(imagesOnly); if (level < 4) { finder->SetFindLevelToSeries(); } if (!silent) { p = vtkSmartPointer::New(); p->SetText("Scanning"); finder->AddObserver(vtkCommand::ProgressEvent, p); finder->AddObserver(vtkCommand::StartEvent, p); finder->AddObserver(vtkCommand::EndEvent, p); } finder->SetInputFileNames(a); finder->SetIgnoreDicomdir(ignoreDicomdir); if (onlyDicomdir) { finder->SetQueryFilesToNever(); } else { finder->SetQueryFilesToAlways(); } finder->SetScanDepth(scandepth); finder->SetFindQuery(query); finder->Update(); if (!silent) { p->SetText("Writing"); } dicomtocsv_write( finder, query, &qtlist, fp, level, rt, allUnique, rescanFiles, p); fflush(fp); } if (fp1) { fclose(fp1); } return rval; } vtk-dicom-0.8.12/Programs/dicomtodicom.cxx000066400000000000000000000516701356440565500205150ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMBuild.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMReader.h" #include "vtkDICOMWriter.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMMRGenerator.h" #include "vtkDICOMCTGenerator.h" #include "vtkDICOMToRAS.h" #include "vtkDICOMCTRectifier.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMFile.h" #include "vtkDICOMFileDirectory.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkImageReslice.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkSortFileNames.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" #if VTK_MAJOR_VERSION >= 6 || VTK_MINOR_VERSION >= 10 #include "vtkImageResize.h" #include "vtkImageSincInterpolator.h" #endif #include #include #include #include #include #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // Kinds of reformats enum MPREnum { MPRAxial = 1, MPRCoronal = 2, MPRSagittal = 3 }; static const char *dicomtodicom_description[] = { " NEW", " MPR Ax", " MPR Cor", " MPR Sag" }; // Simple structure for command-line options struct dicomtodicom_options { const char *modality; const char *series_description; const char *series_number; const char *uid_prefix; int mpr; bool resample; bool silent; bool verbose; const char *output; }; // Print the version void dicomtodicom_version(FILE *file, const char *command_name, bool verbose) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } if (!verbose) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } else { fprintf(file, "Head %8.8s, Built %s, %s\n", DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME); } } // Print the options void dicomtodicom_usage(FILE *file, const char *command_name) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } fprintf(file, "usage:\n" " %s -o directory file.dcm ...\n\n", cp); fprintf(file, "options:\n" " -o directory The output directory.\n" " -s --silent Do not print anything while executing.\n" " -v --verbose Verbose error reporting.\n" " --resample Resample to produce square pixels.\n" " --axial Produce axial slices.\n" " --coronal Produce coronal slices.\n" " --sagittal Produce sagittal slices.\n" " --series-description Textual description of the series.\n" " --series-number The series number to use.\n" " --modality The modality: MR or CT or SC.\n" " --uid-prefix A DICOM uid prefix (optional).\n" " --version Print the version and exit.\n" " --build-version Print source and build version.\n" " --help Documentation for dicomtodicom.\n" ); } // Print the help void dicomtodicom_help(FILE *file, const char *command_name) { dicomtodicom_usage(file, command_name); fprintf(file, "\n"); fprintf(file, "This program allows adjustment of a DICOM series.\n" "\n"); fprintf(file, "In its most basic functionality, this command reads a DICOM series and\n" "then writes it out with a new UID. It strips out any meta data that is\n" "not recognized as part of the SOP class that it is writing. In other\n" "words, its main purpose is to coerce the data to fit the requested SOP\n" "class.\n" "\n"); fprintf(file, "Currently, only three output SOP classes can be written: Secondary\n" "Capture, CT, and MR. Enhanced CT and Enhanced MR cannot be written,\n" "but they can be read, therefore this program can be used to convert\n" "enhanced single-file CT and MR DICOM into a series of DICOM files.\n" "\n"); fprintf(file, "The written data has the ImageType set to DERIVED\\SECONDARY\\OTHER\n" "and has a new series number and name. It isn't meant to replace the\n" "original data, it is simply meant to coerce the data into a format\n" "that might be more compatible with other software.\n" "\n"); fprintf(file, "Reformatting of the data (MPR) is permitted during the conversion.\n" "This is an experimental feature and causes much of the per-instance\n" "meta data to be discarded. Reformatting be combined with resampling\n" "to produce an output with square pixels via Lanczos interpolation.\n" "\n"); } // Print error void dicomtodicom_check_error(vtkObject *o) { vtkDICOMReader *reader = vtkDICOMReader::SafeDownCast(o); vtkDICOMFileSorter *sorter = vtkDICOMFileSorter::SafeDownCast(o); vtkDICOMWriter *writer = vtkDICOMWriter::SafeDownCast(o); vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); const char *filename = 0; unsigned long errorcode = 0; if (writer) { filename = writer->GetFileName(); errorcode = writer->GetErrorCode(); } else if (reader) { filename = reader->GetInternalFileName(); errorcode = reader->GetErrorCode(); } else if (sorter) { filename = sorter->GetInternalFileName(); errorcode = sorter->GetErrorCode(); } else if (parser) { filename = parser->GetFileName(); errorcode = parser->GetErrorCode(); } if (!filename) { filename = ""; } switch(errorcode) { case vtkErrorCode::NoError: return; case vtkErrorCode::FileNotFoundError: fprintf(stderr, "File not found: %s\n", filename); break; case vtkErrorCode::CannotOpenFileError: fprintf(stderr, "Cannot open file: %s\n", filename); break; case vtkErrorCode::UnrecognizedFileTypeError: fprintf(stderr, "Unrecognized file type: %s\n", filename); break; case vtkErrorCode::PrematureEndOfFileError: fprintf(stderr, "File is truncated: %s\n", filename); break; case vtkErrorCode::FileFormatError: fprintf(stderr, "Bad DICOM file: %s\n", filename); break; case vtkErrorCode::NoFileNameError: fprintf(stderr, "Output filename could not be used: %s\n", filename); break; case vtkErrorCode::OutOfDiskSpaceError: fprintf(stderr, "Out of disk space while writing file: %s\n", filename); break; default: fprintf(stderr, "An unknown error occurred.\n"); break; } exit(1); } // Read the options void dicomtodicom_read_options( int argc, char *argv[], dicomtodicom_options *options, vtkStringArray *files) { options->mpr = 0; options->modality = 0; options->series_description = 0; options->series_number = 0; options->uid_prefix = "2.25"; options->resample = false; options->silent = false; options->verbose = false; options->output = 0; // read the options from the command line int argi = 1; while (argi < argc) { const char *arg = argv[argi++]; if (arg[0] == '-') { if (strcmp(arg, "--") == 0) { // stop processing switches break; } else if (strcmp(arg, "--modality") == 0 || strcmp(arg, "--series-description") == 0 || strcmp(arg, "--series-number") == 0 || strcmp(arg, "--uid-prefix") == 0) { if (argi >= argc || argv[argi][0] == '-') { fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg); exit(1); } if (strcmp(arg, "--modality") == 0) { options->modality = argv[argi]; } else if (strcmp(arg, "--series-description") == 0) { options->series_description = argv[argi]; } else if (strcmp(arg, "--series-number") == 0) { options->series_number= argv[argi]; } else if (strcmp(arg, "--uid-prefix") == 0) { options->uid_prefix = argv[argi]; } argi++; } else if (strcmp(arg, "--axial") == 0) { options->mpr = MPRAxial; } else if (strcmp(arg, "--coronal") == 0) { options->mpr = MPRCoronal; } else if (strcmp(arg, "--sagittal") == 0) { options->mpr = MPRSagittal; } else if (strcmp(arg, "--resample") == 0) { options->resample = true; } else if (strcmp(arg, "--silent") == 0) { options->silent = true; } else if (strcmp(arg, "--verbose") == 0) { options->verbose = true; } else if (strcmp(arg, "--version") == 0) { dicomtodicom_version(stdout, argv[0], false); exit(0); } else if (strcmp(arg, "--build-version") == 0) { dicomtodicom_version(stdout, argv[0], true); exit(0); } else if (strcmp(arg, "--help") == 0) { dicomtodicom_help(stdout, argv[0]); exit(0); } else if (arg[0] == '-' && arg[1] == '-') { fprintf(stderr, "\nUnrecognized option %s\n\n", arg); dicomtodicom_usage(stderr, argv[0]); exit(1); } else if (arg[0] == '-' && arg[1] != '-') { for (int argj = 1; arg[argj] != '\0'; argj++) { if (arg[argj] == 's') { options->silent = true; } else if (arg[argj] == 'v') { options->verbose = true; } else if (arg[argj] == 'o') { if (arg[argj+1] != '\0') { arg += argj+1; } else { if (argi >= argc) { fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n"); dicomtodicom_usage(stderr, argv[0]); exit(1); } arg = argv[argi++]; } options->output = arg; break; } else { fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg); dicomtodicom_usage(stderr, argv[0]); exit(1); } } } } else { files->InsertNextValue(arg); } } while (argi < argc) { files->InsertNextValue(argv[argi++]); } } // Convert one DICOM series into another DICOM series void dicomtodicom_convert_one( const dicomtodicom_options *options, vtkStringArray *a, const char *outfile) { // read the files vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetMemoryRowOrderToFileNative(); reader->TimeAsVectorOn(); reader->SetFileNames(a); reader->Update(); dicomtodicom_check_error(reader); // get a handle for the reader's output vtkAlgorithmOutput *lastOutput = reader->GetOutputPort(); // The meta data object vtkSmartPointer meta = vtkSmartPointer::New(); meta->DeepCopy(reader->GetMetaData()); meta->Set(DC::SeriesNumber, meta->Get(DC::SeriesNumber).AsUnsignedInt() + 1000*(1 + options->mpr*100)); std::string seriesDescription = (meta->Get(DC::SeriesDescription).AsString() + dicomtodicom_description[options->mpr]); if (seriesDescription.size() < 64) { meta->Set(DC::SeriesDescription, seriesDescription); } // set the metadata supplied on the command line if (options->series_description) { meta->Set(DC::SeriesDescription, options->series_description); } if (options->series_number) { meta->Set(DC::SeriesNumber, options->series_number); } // get the matrix from the DICOM series vtkMatrix4x4 *inputMatrix = reader->GetPatientMatrix(); vtkSmartPointer matrix = vtkSmartPointer::New(); if (inputMatrix) { matrix->DeepCopy(inputMatrix); } // mpr reformat if requested vtkSmartPointer reformat = vtkSmartPointer::New(); vtkSmartPointer rectify = vtkSmartPointer::New(); #if VTK_MAJOR_VERSION >= 6 || VTK_MINOR_VERSION >= 10 vtkSmartPointer resample = vtkSmartPointer::New(); #endif vtkSmartPointer axes = vtkSmartPointer::New(); int permutation[3] = { 0, 1, 2 }; if (options->mpr) { // check for CT acquired with a tilted gantry if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(matrix)) > 1e-2) { // tilt is significant, so regrid as a rectangular volume rectify->SetInputConnection(lastOutput); rectify->SetVolumeMatrix(matrix); rectify->Update(); lastOutput = rectify->GetOutputPort(); matrix = rectify->GetRectifiedMatrix(); } // check if resampling was requested if (options->resample) { #if VTK_MAJOR_VERSION >= 6 || VTK_MINOR_VERSION >= 10 // generate cube voxels double spacing[3] = { 1.0, 1.0, 1.0 }; const vtkDICOMValue& v = meta->Get(DC::PixelSpacing); if (v.GetNumberOfValues() == 2) { v.GetValues(spacing, 2); double s = std::min(spacing[0], spacing[1]); spacing[0] = s; spacing[1] = s; spacing[2] = s; } resample->SetInputConnection(lastOutput); vtkSmartPointer interpolator = vtkSmartPointer::New(); interpolator->SetWindowFunctionToLanczos(); resample->SetInterpolator(interpolator); resample->SetResizeMethodToOutputSpacing(); resample->SetOutputSpacing(spacing); resample->InterpolateOn(); resample->BorderOn(); resample->Update(); lastOutput = resample->GetOutputPort(); #else fprintf(stderr, "\nTo use --resample, recompile with VTK 5.10 or later.\n\n"); #endif } // create a permutation matrix to make the slices axial axes->DeepCopy(matrix); axes->Invert(); int maxidx[3] = { -1, -1, -1 }; double value[3] = { 1.0, 1.0, 1.0 }; int prevmaxj = -1; int prevmaxi = -1; for (int kdim = 0; kdim < 2; kdim++) { int maxj = 0; int maxi = 0; double maxv = -0.0; for (int jdim = 0; jdim < 3; jdim++) { if (jdim == prevmaxj) { continue; } for (int idim = 0; idim < 3; idim++) { if (idim == prevmaxi) { continue; } double v = axes->GetElement(jdim, idim); if (v*v >= maxv) { maxi = idim; maxj = jdim; maxv = v*v; } } } maxidx[maxj] = maxi; value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0); prevmaxj = maxj; prevmaxi = maxi; } axes->Zero(); axes->SetElement(3, 3, 1.0); for (int jdim = 0; jdim < 3; jdim++) { int idim = maxidx[jdim]; if (idim < 0) { idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3]; maxidx[jdim] = idim; double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0); value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm; } permutation[jdim] = idim; axes->SetElement(jdim, idim, value[jdim]); } // change the permutation to the desired mpr if (options->mpr == MPRCoronal) { double cmatrix[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; vtkMatrix4x4::Multiply4x4(*axes->Element, cmatrix, *axes->Element); int tperm[3] = { permutation[0], permutation[1], permutation[2] }; permutation[0] = tperm[0]; permutation[1] = tperm[2]; permutation[2] = tperm[1]; } else if (options->mpr == MPRSagittal) { double smatrix[16] = { 0.0, 0.0,-1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; vtkMatrix4x4::Multiply4x4(*axes->Element, smatrix, *axes->Element); int tperm[3] = { permutation[0], permutation[1], permutation[2] }; permutation[0] = tperm[1]; permutation[1] = tperm[2]; permutation[2] = tperm[0]; } // reformat with the permuted axes reformat->SetResliceAxes(axes); reformat->SetInputConnection(lastOutput); lastOutput = reformat->GetOutputPort(); // factor out the permuted axes vtkMatrix4x4::Multiply4x4(matrix, axes, matrix); } // make the generator vtkSmartPointer mrgenerator = vtkSmartPointer::New(); vtkSmartPointer ctgenerator = vtkSmartPointer::New(); vtkDICOMGenerator *generator = 0; // get the generator from the supplied DICOM data std::string SOPClass = meta->Get(DC::SOPClassUID).AsString(); if (SOPClass == "1.2.840.10008.5.1.4.1.1.2" || SOPClass == "1.2.840.10008.5.1.4.1.1.2.1" || SOPClass == "1.2.840.10008.5.1.4.1.1.2.2") { generator = ctgenerator; } else if (SOPClass == "1.2.840.10008.5.1.4.1.1.4" || SOPClass == "1.2.840.10008.5.1.4.1.1.4.1" || SOPClass == "1.2.840.10008.5.1.4.1.1.4.4") { generator = mrgenerator; } // allow the user to override the generator if (options->modality) { if (strcmp(options->modality, "CT") == 0) { generator = ctgenerator; } else if (strcmp(options->modality, "MR") == 0 || strcmp(options->modality, "MRI") == 0) { generator = mrgenerator; } } // prepare the writer to write the image vtkSmartPointer writer = vtkSmartPointer::New(); if (generator) { writer->SetGenerator(generator); } writer->SetMetaData(meta); writer->SetFilePrefix(outfile); writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); writer->TimeAsVectorOn(); if (reader->GetTimeDimension() > 1) { writer->SetTimeDimension(reader->GetTimeDimension()); writer->SetTimeSpacing(reader->GetTimeSpacing()); } writer->SetPatientMatrix(matrix); if (reader->GetRescaleSlope() > 0) { writer->SetRescaleSlope(reader->GetRescaleSlope()); writer->SetRescaleIntercept(reader->GetRescaleIntercept()); } writer->SetInputConnection(lastOutput); writer->SetMemoryRowOrderToFileNative(); writer->Write(); dicomtodicom_check_error(writer); } // Process a list of files void dicomtodicom_convert_files( dicomtodicom_options *options, vtkStringArray *files, const char *outpath) { // sort the files by filename first, as a fallback vtkSmartPointer presorter = vtkSmartPointer::New(); presorter->NumericSortOn(); presorter->IgnoreCaseOn(); presorter->SetInputFileNames(files); presorter->Update(); // sort the files by study and series vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->SetInputFileNames(presorter->GetFileNames()); sorter->Update(); dicomtodicom_check_error(sorter); dicomtodicom_convert_one( options, sorter->GetOutputFileNames(), outpath); } // This program will convert DICOM to DICOM int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); // for the list of input DICOM files vtkSmartPointer files = vtkSmartPointer::New(); dicomtodicom_options options; dicomtodicom_read_options(argc, argv, &options, files); // whether to silence VTK warnings and errors vtkObject::SetGlobalWarningDisplay(options.verbose); // set the UID prefix if (options.uid_prefix) { vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix); } // make sure that input files were provided if (files->GetNumberOfValues() == 0) { fprintf(stderr, "\nNo input files were specified.\n\n"); dicomtodicom_usage(stderr, argv[0]); exit(1); } // the output const char *outpath = options.output; if (!outpath) { fprintf(stderr, "\nNo output directory was specified (\'-o\' ).\n\n"); dicomtodicom_usage(stderr, argv[0]); exit(1); } int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In); if (code != vtkDICOMFile::FileIsDirectory) { fprintf(stderr, "option -o must give a directory, not a file.\n"); exit(1); } code = vtkDICOMFileDirectory::Create(outpath); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Cannot create directory: %s\n", outpath); exit(1); } dicomtodicom_convert_files(&options, files, outpath); return 0; } vtk-dicom-0.8.12/Programs/dicomtonifti.cxx000066400000000000000000001137771356440565500205420ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMBuild.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMReader.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMSliceSorter.h" #include "vtkDICOMToRAS.h" #include "vtkDICOMCTRectifier.h" #include "vtkDICOMFile.h" #include "vtkDICOMFileDirectory.h" #include "vtkDICOMFilePath.h" #include "vtkNIFTIHeader.h" #include "vtkNIFTIWriter.h" #include "vtkVersion.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkImageReslice.h" #include "vtkImageCast.h" #include "vtkImageExtractComponents.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkSortFileNames.h" #include "vtkSmartPointer.h" #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) #include "vtkImageHistogramStatistics.h" #endif #include #include #include #include #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" #include "readquery.h" // Simple structure for command-line options struct dicomtonifti_options { bool compress; bool recurse; bool follow_symlinks; bool fsl; bool reformat_to_axial; bool no_slice_reordering; bool no_row_reordering; bool no_column_reordering; bool no_qform; bool no_sform; bool batch; bool silent; bool verbose; int volume; double time_delta; int time_units; vtkDICOMTagPath time_tagpath; vtkDICOMTagPath time_delta_tagpath; const char *output; unsigned int conversions_attempted; }; // Print the version void dicomtonifti_version(FILE *file, const char *command_name, bool verbose) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } if (!verbose) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } else { fprintf(file, "Head %8.8s, Built %s, %s\n", DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME); } } // Print the options void dicomtonifti_usage(FILE *file, const char *command_name) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } fprintf(file, "usage:\n" " %s -o file.nii file1.dcm [file2.dcm ...]\n\n" " %s -o directory --batch file1.dcm [file2.dcm ...]\n\n", cp, cp); fprintf(file, "options:\n" " -o The output file (or directory, if --batch).\n" " -z --compress Compress output files.\n" " -r --recurse Recurse into subdirectories.\n" " -b --batch Do multiple series at once.\n" " -s --silent Do not echo output filenames.\n" " -v --verbose Verbose error reporting.\n" " -L --follow-symlinks Follow symbolic links when recursing.\n" " --fsl Format axial image for use in FSL.\n" " --reformat-to-axial Reformat the image into axial orientation.\n" " --no-slice-reordering Never reorder the slices.\n" " --no-row-reordering Never reorder the rows.\n" " --no-column-reordering Never reorder the columns.\n" " --no-reordering Never reorder slices, rows, or columns.\n" " --no-qform Don't include a qform in the NIFTI file.\n" " --no-sform Don't include an sform in the NIFTI file.\n" " --time-tag Set the tag to use for time coordinate.\n" " --time-delta-tag Set the tag to use for time spacing.\n" " --time-delta Force the time spacing to be the given value.\n" " --volume N Set which volume to output (starts at 0).\n" " --version Print the version and exit.\n" " --build-version Print source and build version.\n" " --help Documentation for dicomtonifti.\n" ); } // Print the help void dicomtonifti_help(FILE *file, const char *command_name) { dicomtonifti_usage(file, command_name); fprintf(file, "\n"); fprintf(file, "This program will convert a DICOM series into a NIfTI file.\n" "\n"); fprintf(file, "It reads the DICOM Position and Orientation metadata, and uses this\n" "information to generate qform and sform entries for the NIfTI header,\n" "after doing a conversion from the DICOM coordinate system to the NIfTI\n" "coordinate system.\n" "\n"); fprintf(file, "By default, it will also reorder the columns of the image so that\n" "columns with higher indices are further to the patient\'s right (or\n" "in the case of sagittal images, further anterior). Likewise, rows\n" "will be rearranged so that rows with higher indices are superior (or\n" "anterior for axial images). Finally, it will reorder the slices\n" "so that the column direction, row direction, and slice direction\n" "follow the right-hand rule.\n" "\n"); fprintf(file, "It is also possible to reformat the images into the axial orientation\n" "via the --reformat-to-axial option This option is mutually exclusive\n" "with the no-reordering options. The resulting orientation matrix will\n" "be the identity matrix.\n" "\n"); fprintf(file, "If the output NIFTI files are to be used with the FMRIB FSL package,\n" "then use the --fsl option to reformat the images to match the standard\n" "FSL orientation: axial images with the slices arranged from inferior to\n" "superior, column number increasing from right to left, and row number\n" "increasing from posterior to anterior. This will also convert the data\n" "type from unsigned 16-bit to signed 16-bit if necessary.\n" "\n"); fprintf(file, "The --time-tag, --time-delta-tag, and --time-delta options can be used\n" "to tweak the time information. By default, tags such as TriggerTime,\n" "TemporalPositionIdentifier, or TriggerTime are used to perform\n" "temporal sorting, but --time-tag can be used to explicitly name a tag.\n" "The --time-delta-tag option can be used to set which tag gives temporal\n" "spacing, if there is no tag that gives the temporal coordinate.\n" "The --time-delta option will force the temporal spacing to be a specific\n" "value, e.g. 500ms, 2s, or 2600us.\n" "\n"); fprintf(file, "If batch mode is selected, the output file given with \"-o\" can be\n" "constructed from DICOM attributes, by providing the attribute names\n" "within curly braces. For example, consider the following:\n" "\"{PatientID}-{StudyDate}/{SeriesDescription}-{SeriesNumber}.nii\"\n" "or something similar to produce a hierarchichal directory structure.\n" "The attributes used in the path should be from the following list:\n" " PatientID, PatientName, PatientBirthDate, PatientSex,\n" " StudyID, StudyDescription, StudyDate, StudyTime, StudyInstanceUID,\n" " SeriesNumber, SeriesDescription, SeriesInstanceUID,\n" " Modality, AccessionNumber.\n" "\n" "Here is an example of batch mode that recurses into subdirectories\n" "and compresses the output files, putting the results in the current\n" "directory:\n" "\n" "%s -brz -o {SeriesDescription}-{SeriesNumber}.nii /path/to/dicom/files\n" "\n", command_name); } // Print error bool dicomtonifti_check_error(vtkObject *o) { vtkDICOMReader *reader = vtkDICOMReader::SafeDownCast(o); vtkDICOMFileSorter *sorter = vtkDICOMFileSorter::SafeDownCast(o); vtkNIFTIWriter *writer = vtkNIFTIWriter::SafeDownCast(o); vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); const char *filename = 0; unsigned long errorcode = 0; if (writer) { filename = writer->GetFileName(); errorcode = writer->GetErrorCode(); } else if (reader) { filename = reader->GetInternalFileName(); errorcode = reader->GetErrorCode(); } else if (sorter) { filename = sorter->GetInternalFileName(); errorcode = sorter->GetErrorCode(); } else if (parser) { filename = parser->GetFileName(); errorcode = parser->GetErrorCode(); } if (!filename) { filename = ""; } switch(errorcode) { case vtkErrorCode::NoError: return false; case vtkErrorCode::FileNotFoundError: fprintf(stderr, "File not found: %s\n", filename); break; case vtkErrorCode::CannotOpenFileError: fprintf(stderr, "Cannot open file: %s\n", filename); break; case vtkErrorCode::UnrecognizedFileTypeError: fprintf(stderr, "Unrecognized file type: %s\n", filename); break; case vtkErrorCode::PrematureEndOfFileError: fprintf(stderr, "File is truncated: %s\n", filename); break; case vtkErrorCode::FileFormatError: fprintf(stderr, "Bad DICOM file: %s\n", filename); break; case vtkErrorCode::NoFileNameError: fprintf(stderr, "Output filename could not be used: %s\n", filename); break; case vtkErrorCode::OutOfDiskSpaceError: fprintf(stderr, "Out of disk space while writing file: %s\n", filename); break; default: fprintf(stderr, "An unknown error occurred.\n"); break; } return true; } bool dicomtonifti_time_delta(const char *arg, dicomtonifti_options *options) { const char *unit_list[6] = { "s", "ms", "us", "Hz", "ppm", "rads" }; int unit_consts[6] = { 8, 16, 24, 32, 40, 48 // from NIFTI header }; char *units; double t = strtod(arg, &units); if (units == arg || t == 0.0) { fprintf(stderr, "Illegal value for --time-delta: %s\n", arg); return false; } options->time_delta = t; if (units[0] != '\0') { options->time_units = 0; for (int i = 0; i < 6; i++) { if (strcmp(units, unit_list[i]) == 0) { options->time_units = unit_consts[i]; break; } } if (options->time_units == 0) { fprintf(stderr, "Illegal value for --time-delta: %s\n", arg); fprintf(stderr, "Units must be s, ms, Hz, ppm, or rads.\n"); return false; } } return true; } // Read the options void dicomtonifti_read_options( int argc, char *argv[], dicomtonifti_options *options, vtkStringArray *files) { options->recurse = false; options->compress = false; options->follow_symlinks = false; options->fsl = false; options->reformat_to_axial = false; options->no_slice_reordering = false; options->no_row_reordering = false; options->no_column_reordering = false; options->no_qform = false; options->no_sform = false; options->batch = false; options->silent = false; options->verbose = false; options->volume = -1; options->time_delta = 0.0; options->time_units = 16; // default to msec options->time_tagpath = vtkDICOMTagPath(); options->time_delta_tagpath = vtkDICOMTagPath(); options->output = 0; options->conversions_attempted = 0; // read the options from the command line int argi = 1; while (argi < argc) { const char *arg = argv[argi++]; if (arg[0] == '-') { if (strcmp(arg, "--") == 0) { // stop processing switches break; } else if (strcmp(arg, "--recurse") == 0) { options->recurse = true; } else if (strcmp(arg, "--compress") == 0) { options->compress = true; } else if (strcmp(arg, "--follow-symlinks") == 0) { options->follow_symlinks = true; } else if (strcmp(arg, "--fsl") == 0) { options->fsl = true; } else if (strcmp(arg, "--reformat-to-axial") == 0) { options->reformat_to_axial = true; } else if (strcmp(arg, "--no-slice-reordering") == 0) { options->no_slice_reordering = true; } else if (strcmp(arg, "--no-row-reordering") == 0) { options->no_row_reordering = true; } else if (strcmp(arg, "--no-column-reordering") == 0) { options->no_column_reordering = true; } else if (strcmp(arg, "--no-reordering") == 0) { options->no_slice_reordering = true; options->no_row_reordering = true; options->no_column_reordering = true; } else if (strcmp(arg, "--no-qform") == 0) { options->no_qform = true; } else if (strcmp(arg, "--no-sform") == 0) { options->no_sform = true; } else if (strcmp(arg, "--time-delta") == 0 || strcmp(arg, "--time-delta-tag") == 0 || strcmp(arg, "--time-tag") == 0) { if (argi >= argc || argv[argi][0] == '-') { fprintf(stderr, "\nAn argument must follow \'%s\'\n\n", arg); dicomtonifti_usage(stderr, argv[0]); exit(1); } const char *optionarg = arg; arg = argv[argi++]; if (strcmp(optionarg, "--time-delta") == 0) { if (!dicomtonifti_time_delta(arg, options)) { exit(1); } } else { vtkDICOMItem data; QueryTagList qtlist; if (!dicomcli_readkey(arg, &data, &qtlist)) { exit(1); } if (strcmp(optionarg, "--time-delta-tag") == 0) { options->time_delta_tagpath = qtlist[0]; } else { options->time_tagpath = qtlist[0]; } } } else if (strcmp(arg, "--batch") == 0) { options->batch = true; } else if (strcmp(arg, "--silent") == 0) { options->silent = true; } else if (strcmp(arg, "--verbose") == 0) { options->verbose = true; } else if (strcmp(arg, "--volume") == 0) { if (argi >= argc || argv[argi][0] == '-') { fprintf(stderr, "\nA number must follow \'--volume\'\n\n"); dicomtonifti_usage(stderr, argv[0]); exit(1); } arg = argv[argi++]; options->volume = atoi(arg); } else if (strcmp(arg, "--version") == 0) { dicomtonifti_version(stdout, argv[0], false); exit(0); } else if (strcmp(arg, "--build-version") == 0) { dicomtonifti_version(stdout, argv[0], true); exit(0); } else if (strcmp(arg, "--help") == 0) { dicomtonifti_help(stdout, argv[0]); exit(0); } else if (arg[0] == '-' && arg[1] == '-') { fprintf(stderr, "\nUnrecognized option %s\n\n", arg); dicomtonifti_usage(stderr, argv[0]); exit(1); } else if (arg[0] == '-' && arg[1] != '-') { for (int argj = 1; arg[argj] != '\0'; argj++) { if (arg[argj] == 'z') { options->compress = true; } else if (arg[argj] == 'r') { options->recurse = true; } else if (arg[argj] == 'b') { options->batch = true; } else if (arg[argj] == 's') { options->silent = true; } else if (arg[argj] == 'v') { options->verbose = true; } else if (arg[argj] == 'L') { options->follow_symlinks = true; } else if (arg[argj] == 'o') { if (arg[argj+1] != '\0') { arg += argj+1; } else { if (argi >= argc) { fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n"); dicomtonifti_usage(stderr, argv[0]); exit(1); } arg = argv[argi++]; } options->output = arg; break; } else { fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg); dicomtonifti_usage(stderr, argv[0]); exit(1); } } } } else { files->InsertNextValue(arg); } } while (argi < argc) { files->InsertNextValue(argv[argi++]); } } // Remove all characters but A-Za-z0-9_ from a string std::string dicomtonifti_safe_string(const std::string& input) { std::string::const_iterator a = input.begin(); std::string::const_iterator b = a; std::string s; while (a != input.end()) { while (a != input.end() && ((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a)) { ++a; } s.append(b, a); b = a; while (a != input.end() && (((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a))) { ++a; } if (b != a && b != input.begin() && a != input.end()) { s.append("_"); } b = a; } return s; } // Generate an output filename from meta data std::string dicomtonifti_make_filename( const char *outfile, vtkDICOMMetaData *meta) { std::string s; std::string key; std::string val; vtkDICOMValue v; const char *cp = outfile; const char *dp = cp; const char *bp = 0; while (*cp != '\0') { while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; } if (*cp == '}') { fprintf(stderr, "Missing \'{\': %s\n", outfile); exit(1); } if (*cp == '{') { bp = cp; while (*cp != '}' && *cp != '\0') { cp++; } if (*cp != '}') { fprintf(stderr, "Unmatched \'{\': %s\n", outfile); exit(1); } else { s.append(dp, bp); bp++; key.assign(bp, cp); cp++; dp = cp; v.Clear(); vtkDICOMTag tag; if (key.length() > 0) { vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str()); if (de.IsValid()) { tag = de.GetTag(); } else { fprintf(stderr, "Unrecognized key %s\n", key.c_str()); exit(1); } } if (meta) { v = meta->Get(tag); } if (v.IsValid()) { val.assign(dicomtonifti_safe_string(v.AsUTF8String())); } else if (meta) { fprintf(stderr, "Sorry, key %s not found.\n", key.c_str()); exit(1); } if (val.empty()) { val = "Empty"; } s.append(val); } } } s.append(dp, cp); return s; } // Convert one DICOM series into one NIFTI file void dicomtonifti_convert_one( dicomtonifti_options *options, vtkStringArray *a, const char *outfile) { // make sure there are files to read if (a->GetNumberOfValues() == 0) { return; } // increment the number of conversions attempted options->conversions_attempted++; // read the files vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetMemoryRowOrderToFileNative(); reader->TimeAsVectorOn(); reader->SetFileNames(a); // check for user-supplied time info if (options->time_delta != 0.0 || options->time_delta_tagpath.GetSize() > 0) { reader->GetSorter()->RepeatsAsTimeOn(); } if (options->time_tagpath.GetSize() > 0) { vtkDICOMTagPath tagpath = options->time_tagpath; vtkDICOMTag tag = tagpath.GetHead(); while (tagpath.HasTail()) { reader->GetSorter()->SetTimeSequence(tag); tagpath = tagpath.GetTail(); tag = tagpath.GetHead(); } reader->GetSorter()->SetTimeTag(tag); } reader->Update(); if (dicomtonifti_check_error(reader)) { return; } // get the output and the orientation matrix vtkAlgorithmOutput *lastOutput = reader->GetOutputPort(); vtkMatrix4x4 *patientMatrix = reader->GetPatientMatrix(); // extract just one volume, if requested vtkSmartPointer extract = vtkSmartPointer::New(); extract->SetInputConnection(lastOutput); if (options->volume >= 0) { if (reader->GetOutput()->GetNumberOfScalarComponents() <= options->volume) { fprintf(stderr, "Only %d volumes, but --volume %d used.\n", reader->GetOutput()->GetNumberOfScalarComponents(), options->volume); return; } extract->SetComponents(options->volume); extract->Update(); lastOutput = extract->GetOutputPort(); } // check if slices were reordered by the reader vtkIntArray *fileIndices = reader->GetFileIndexArray(); vtkIntArray *frameIndices = reader->GetFrameIndexArray(); vtkIdType maxId = fileIndices->GetNumberOfTuples() - 1; int firstFile = fileIndices->GetComponent(0, 0); int lastFile = fileIndices->GetComponent(maxId, 0); int firstFrame = frameIndices->GetComponent(0, 0); int lastFrame = frameIndices->GetComponent(maxId, 0); bool slicesReordered = (lastFrame < firstFrame || lastFile < firstFile); // check for CT acquired with a tilted gantry vtkSmartPointer rectifier = vtkSmartPointer::New(); if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(patientMatrix)) > 1e-2) { // tilt is significant, so regrid as a rectangular volume rectifier->SetInputConnection(lastOutput); rectifier->SetVolumeMatrix(patientMatrix); rectifier->Update(); lastOutput = rectifier->GetOutputPort(); patientMatrix = rectifier->GetRectifiedMatrix(); } // convert to NIFTI coordinate system vtkSmartPointer converter = vtkSmartPointer::New(); converter->SetInputConnection(lastOutput); converter->SetPatientMatrix(patientMatrix); converter->SetAllowRowReordering(!options->no_row_reordering); converter->SetAllowColumnReordering(!options->no_column_reordering); converter->UpdateMatrix(); // check if slices have been reordered by vtkDICOMToRAS vtkSmartPointer checkMatrix = vtkSmartPointer::New(); checkMatrix->DeepCopy(patientMatrix); // undo the DICOM to NIFTI x = -x, y = -y conversion in check matrix for (int j = 0; j < 4; j++) { checkMatrix->Element[0][j] = -checkMatrix->Element[0][j]; checkMatrix->Element[1][j] = -checkMatrix->Element[1][j]; } checkMatrix->Invert(); // checkMatrix = PatientMatrix^(-1) * RASMatrix vtkMatrix4x4::Multiply4x4( checkMatrix, converter->GetRASMatrix(), checkMatrix); // if z is negative, slices were reordered by vtkDIOCOMToRAS slicesReordered ^= (checkMatrix->GetElement(2, 2) < -0.1); // get the orientation matrix vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->DeepCopy(converter->GetRASMatrix()); // reformat to axial if requested lastOutput = converter->GetOutputPort(); vtkSmartPointer reformat = vtkSmartPointer::New(); vtkSmartPointer axes = vtkSmartPointer::New(); int permutation[3] = { 0, 1, 2 }; if (options->reformat_to_axial || options->fsl) { // this becomes meaningless after reformatting slicesReordered = false; // create a permutation matrix axes->DeepCopy(matrix); axes->Invert(); int maxidx[3] = { -1, -1, -1 }; double value[3] = { 1.0, 1.0, 1.0 }; int prevmaxj = -1; int prevmaxi = -1; for (int kdim = 0; kdim < 2; kdim++) { int maxj = 0; int maxi = 0; double maxv = -0.0; for (int jdim = 0; jdim < 3; jdim++) { if (jdim == prevmaxj) { continue; } for (int idim = 0; idim < 3; idim++) { if (idim == prevmaxi) { continue; } double v = axes->GetElement(jdim, idim); if (v*v >= maxv) { maxi = idim; maxj = jdim; maxv = v*v; } } } maxidx[maxj] = maxi; value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0); prevmaxj = maxj; prevmaxi = maxi; } axes->Zero(); axes->SetElement(3, 3, 1.0); for (int jdim = 0; jdim < 3; jdim++) { int idim = maxidx[jdim]; if (idim < 0) { idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3]; maxidx[jdim] = idim; double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0); value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm; } permutation[jdim] = idim; axes->SetElement(jdim, idim, value[jdim]); } // if fsl, use the fsl orientation if (options->fsl) { double fslmat[16] = { -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; vtkMatrix4x4::Multiply4x4(*axes->Element, fslmat, *axes->Element); } // reformat with the permutated axes reformat->SetResliceAxes(axes); reformat->SetInputConnection(lastOutput); lastOutput = reformat->GetOutputPort(); // factor out the permuted axes vtkMatrix4x4::Multiply4x4(matrix, axes, matrix); } // convert to signed short if fsl int scalarType = reader->GetOutput()->GetScalarType(); vtkSmartPointer caster = vtkSmartPointer::New(); if (options->fsl && scalarType != VTK_UNSIGNED_CHAR && scalarType != VTK_SHORT && scalarType != VTK_FLOAT) { double outputType = scalarType; if (scalarType == VTK_UNSIGNED_SHORT || scalarType == VTK_CHAR || scalarType == VTK_SIGNED_CHAR) { outputType = VTK_SHORT; if (scalarType == VTK_UNSIGNED_SHORT) { // change to float if values greater than 32767 exist const unsigned short *sptr = static_cast( reader->GetOutput()->GetScalarPointer()); vtkIdType n = reader->GetOutput()->GetNumberOfPoints(); n *= reader->GetOutput()->GetNumberOfScalarComponents(); for (vtkIdType i = 0; i < n; i++) { if (*sptr++ > 32767) { outputType = VTK_FLOAT; break; } } } } else { outputType = VTK_FLOAT; } caster->SetInputConnection(lastOutput); caster->SetOutputScalarType(outputType); lastOutput = caster->GetOutputPort(); } // prepare the NIFTI header information vtkSmartPointer hdr = vtkSmartPointer::New(); vtkDICOMMetaData *meta = reader->GetMetaData(); // the descrip is the date followed by the series description and ID std::string date = meta->Get(DC::SeriesDate).AsString(); if (date.length() >= 8) { const char *months[13] = { "/ /", "/Jan/", "/Feb/", "/Mar/", "/Apr/", "/May/", "/Jun/", "/Jul/", "/Aug/", "/Sep/", "/Oct/", "/Nov/", "/Dec/" }; unsigned int month = (date[4] - '0')*10 + (date[5] - '0'); month = (month > 12 ? 0 : month); date = date.substr(6, 2) + months[month] + date.substr(0, 4); } std::string descrip = date + " " + meta->Get(DC::SeriesDescription).AsString() + " " + meta->Get(DC::StudyID).AsString(); descrip = descrip.substr(0, 79); // assume the units are millimetres/milliseconds hdr->SetXYZTUnits(0x02 + options->time_units); // get the phase encoding direction std::string phase = meta->Get( firstFile, firstFrame, vtkDICOMTag(0x0018,0x1312)).AsString(); if (phase == "COLUMN") { hdr->SetDimInfo((permutation[2] << 4) + (permutation[0] << 2) + (permutation[1])); } else if (phase == "ROW") { hdr->SetDimInfo((permutation[2] << 4) + (permutation[1] << 2) + (permutation[0])); } else if (phase == "OTHER") { hdr->SetDimInfo(permutation[2] << 4); } // get the scale information, if same for all slices if (meta->Get(firstFile, firstFrame, DC::RescaleSlope).IsValid()) { hdr->SetSclSlope(reader->GetRescaleSlope()); hdr->SetSclInter(reader->GetRescaleIntercept()); } // compute a cal_min, cal_max bool useWindowLevel = false; if (meta->Get(firstFile, firstFrame, DC::WindowWidth).IsValid()) { useWindowLevel = true; double w = meta->Get(firstFile, firstFrame, DC::WindowWidth).GetDouble(0); double l = meta->Get(firstFile, firstFrame, DC::WindowCenter).GetDouble(0); int n = fileIndices->GetNumberOfTuples(); for (int i = 1; i < n; i++) { int j = fileIndices->GetComponent(i, 0); int k = frameIndices->GetComponent(i, 0); double tw = meta->Get(j, k, DC::WindowWidth).GetDouble(0); double tl = meta->Get(j, k, DC::WindowCenter).GetDouble(0); if (tl != l || tw != w) { useWindowLevel = false; break; } } if (useWindowLevel) { double m = hdr->GetSclSlope(); double b = hdr->GetSclInter(); if (m == 0) { m = 1.0; b = 0.0; } hdr->SetCalMin((l - 0.5*w)*m + b); hdr->SetCalMax((l + 0.5*w)*m + b); } } #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) if (!useWindowLevel) { std::string photometric = meta->Get(DC::PhotometricInterpretation).AsString(); if (photometric == "MONOCHROME1" || photometric == "MONOCHROME2") { // compute range rather than using DICOM window/level setting vtkSmartPointer histo = vtkSmartPointer::New(); histo->SetInputConnection(lastOutput); histo->Update(); double hrange[2]; histo->GetAutoRange(hrange); if (hrange[0] < hrange[1]) { hdr->SetCalMin(hrange[0]); hdr->SetCalMax(hrange[1]); } } } #endif // prepare the writer to write the image vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetDescription(descrip.c_str()); writer->SetNIFTIHeader(hdr); writer->SetFileName(outfile); if (reader->GetTimeDimension() > 1 && options->volume < 0) { writer->SetTimeDimension(reader->GetTimeDimension()); writer->SetTimeSpacing(reader->GetTimeSpacing()); if (options->time_delta != 0.0) { // override if user gave --time-delta writer->SetTimeSpacing(options->time_delta); } else if (options->time_delta_tagpath.GetSize() > 0) { // override if user gave --time-delta-tag const vtkDICOMValue& tsv = meta->Get(firstFile, firstFrame, options->time_delta_tagpath); if (tsv.IsValid()) { writer->SetTimeSpacing(tsv.AsDouble()); } } } if ((options->no_slice_reordering && slicesReordered) || options->fsl) { // force NIFTI file to store images in original DICOM order writer->SetQFac(-1.0); } if (!options->no_qform) { writer->SetQFormMatrix(matrix); } if (!options->no_sform) { writer->SetSFormMatrix(matrix); } writer->SetInputConnection(lastOutput); writer->Write(); dicomtonifti_check_error(writer); } // Process a list of DICOM files void dicomtonifti_convert_files( dicomtonifti_options *options, vtkStringArray *files, const char *outpath, unsigned int depth) { // sort the files by filename first, as a fallback vtkSmartPointer presorter = vtkSmartPointer::New(); presorter->NumericSortOn(); presorter->IgnoreCaseOn(); presorter->SetInputFileNames(files); presorter->Update(); // sort the files by study and series vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->SetInputFileNames(presorter->GetFileNames()); sorter->Update(); if (dicomtonifti_check_error(sorter)) { exit(1); } if (!options->batch) { std::string outfile = outpath; if (options->compress) { size_t os = strlen(outpath); if (os < 3 || outpath[os-3] != '.' || tolower(outpath[os-2]) != 'g' || tolower(outpath[os-1]) != 'z') { outfile.append(".gz"); } } // if filenames given directly on command line, use them directly, // but files were found in a given directory, sort them first if (depth != 0) { files = sorter->GetOutputFileNames(); } dicomtonifti_convert_one( options, files, outfile.c_str()); } else { vtkSmartPointer parser = vtkSmartPointer::New(); vtkSmartPointer meta = vtkSmartPointer::New(); parser->SetMetaData(meta); int m = sorter->GetNumberOfStudies(); for (int j = 0; j < m; j++) { int k = sorter->GetFirstSeriesForStudy(j); int kl = sorter->GetLastSeriesForStudy(j); for (; k <= kl; k++) { // get metadata of first file vtkStringArray *a = sorter->GetFileNamesForSeries(k); std::string fname = a->GetValue(0); meta->Clear(); parser->SetFileName(fname.c_str()); parser->Update(); if (dicomtonifti_check_error(parser)) { continue; } // generate a filename from the meta data std::string outfile = dicomtonifti_make_filename(outpath, meta); size_t os = outfile.length(); if (options->compress && (os < 3 || outfile[os-3] != '.' || tolower(outfile[os-2]) != 'g' || tolower(outfile[os-1]) != 'z')) { outfile.append(".gz"); } // make the directory for the file if (k == sorter->GetFirstSeriesForStudy(j)) { vtkDICOMFilePath path(outfile); path.PopBack(); std::string dirname = path.AsString(); int code = vtkDICOMFileDirectory::Create(dirname.c_str()); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Cannot create directory: %s\n", dirname.c_str()); exit(1); } } if (!options->silent) { printf("%s\n", outfile.c_str()); } // convert the file dicomtonifti_convert_one(options, a, outfile.c_str()); } } } } // Process a list of files and directories void dicomtonifti_files_and_dirs( dicomtonifti_options *options, vtkStringArray *files, const char *outpath, std::set *pastdirs, unsigned int depth) { // look for directories among the files vtkSmartPointer directories = vtkSmartPointer::New(); vtkSmartPointer newfiles = vtkSmartPointer::New(); vtkIdType n = files->GetNumberOfValues(); for (vtkIdType i = 0; i < n; i++) { std::string fname = files->GetValue(i); vtkDICOMFilePath path(fname); size_t m = fname.size(); if ((m > 1 && (fname[m-1] == '/' || fname[m-1] == '\\')) || path.IsDirectory()) { if (pastdirs->size() == 0 || (options->recurse && (options->follow_symlinks || !path.IsSymlink()))) { directories->InsertNextValue(fname.c_str()); } } else { newfiles->InsertNextValue(fname.c_str()); } } if (newfiles->GetNumberOfValues() > 0) { dicomtonifti_convert_files(options, newfiles, outpath, depth); } n = directories->GetNumberOfValues(); for (vtkIdType i = 0; i < n; i++) { std::string dirname = directories->GetValue(i); vtkDICOMFilePath path(dirname); // avoid infinite recursion std::string realpath = path.GetRealPath(); if (pastdirs->count(realpath)) { continue; } pastdirs->insert(pastdirs->end(), realpath); vtkDICOMFileDirectory directory(dirname.c_str()); int code = directory.GetError(); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Could not open directory %s\n", dirname.c_str()); } else { files->Initialize(); unsigned long nf = directory.GetNumberOfEntries(); for (unsigned long j = 0; j < nf; j++) { const char *dirfile = directory.GetEntry(j); if (dirfile[0] != '.' || (dirfile[1] != '\0' && (dirfile[1] != '.' || dirfile[2] != '\0'))) { path.PushBack(dirfile); files->InsertNextValue(path.AsString()); path.PopBack(); } } dicomtonifti_files_and_dirs(options, files, outpath, pastdirs, depth+1); } } } // This program will convert DICOM to NIFTI int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); // for the list of input DICOM files vtkSmartPointer files = vtkSmartPointer::New(); dicomtonifti_options options; dicomtonifti_read_options(argc, argv, &options, files); // whether to silence VTK warnings and errors vtkObject::SetGlobalWarningDisplay(options.verbose); // the output (NIFTI file or directory) const char *outpath = options.output; if (!outpath) { fprintf(stderr, "\nNo output file was specified (\'-o\' ).\n\n"); dicomtonifti_usage(stderr, argv[0]); exit(1); } int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In); size_t l = strlen(outpath); vtkDICOMFilePath tmp(outpath); if (options.batch && code == vtkDICOMFile::FileIsDirectory) { tmp.PushBack( "{PatientID}-{StudyDate}-{SeriesDescription}-{SeriesNumber}.nii"); outpath = tmp.AsString().c_str(); } else if (!options.batch && (code == vtkDICOMFile::FileIsDirectory || (l > 0 && (outpath[l-1] == '/' || outpath[l-1] == '\\')))) { fprintf(stderr, "The -o option must give a file, not a directory.\n"); exit(1); } // make sure that input files were provided if (files->GetNumberOfValues() == 0) { fprintf(stderr, "\nNo input files were specified.\n\n"); dicomtonifti_usage(stderr, argv[0]); exit(1); } std::set pastdirs; dicomtonifti_files_and_dirs(&options, files, outpath, &pastdirs, 0); if (!options.batch && options.conversions_attempted == 0) { fprintf(stderr, "No input DICOM files were found!\n\n"); } return 0; } vtk-dicom-0.8.12/Programs/nifticenter.cxx000066400000000000000000000037171356440565500203540ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkNIFTIWriter.h" #include "vtkNIFTIReader.h" #include "vtkMatrix4x4.h" #include "vtkImageData.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // remove path portion of filename const char *basename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // This program will convert int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; if (argc < 2) { printf("usage: %s input.nii output.nii\n", basename(argv[0])); return rval; } vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(argv[1]); reader->Update(); double center[3]; reader->GetOutput()->GetCenter(center); vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->SetElement(0, 3, -center[0]); matrix->SetElement(1, 3, -center[1]); matrix->SetElement(2, 3, -center[2]); vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetInputConnection(reader->GetOutputPort()); writer->SetFileName(argv[2]); writer->SetSFormMatrix(matrix); writer->SetQFormMatrix(matrix); writer->Update(); return rval; } vtk-dicom-0.8.12/Programs/niftidump.cxx000066400000000000000000000234131356440565500200340ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkNIFTIReader.h" #include "vtkNIFTIHeader.h" #include "vtkNIFTIPrivate.h" #include "vtkMatrix4x4.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // print the version void printVersion(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } // print the help void printUsage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s file.nii[.gz]\n", cp); fprintf(file, "options:\n" " --help Print a brief help message.\n" " --version Print the software version.\n"); } // print the help void printHelp(FILE *file, const char *cp) { printUsage(file, cp); fprintf(file, "\n" "Dump the header from a NIfTI file.\n"); } // sanitize a string (remove unprintable characters) #define SANITIZE_BUFSIZE 82 const char *stringSanitize( char op[SANITIZE_BUFSIZE], const char *cp, size_t l) { if (l >= SANITIZE_BUFSIZE) { l = SANITIZE_BUFSIZE - 1; } size_t i; for (i = 0; i < l && cp[i] != '\0'; i++) { if (isprint(cp[i])) { op[i] = cp[i]; } else { op[i] = '?'; } } op[i] = '\0'; return op; } // remove path portion of filename const char *fileBasename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // This program will convert int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; if (argc < 2) { printUsage(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { printHelp(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { printVersion(stdout, fileBasename(argv[0])); return rval; } vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(argv[1]); reader->UpdateInformation(); nifti_2_header hdr; reader->GetNIFTIHeader()->GetHeader(&hdr); int version = 0; if (hdr.magic[2] >= '0' && hdr.magic[2] <= '9') { version = hdr.magic[2] - '0'; } const char *datatypeName = ""; switch (hdr.datatype) { case NIFTI_TYPE_UINT8: datatypeName = "uint8"; break; case NIFTI_TYPE_INT16: datatypeName = "int16"; break; case NIFTI_TYPE_INT32: datatypeName = "int32"; break; case NIFTI_TYPE_FLOAT32: datatypeName = "float32"; break; case NIFTI_TYPE_COMPLEX64: datatypeName = "complex64"; break; case NIFTI_TYPE_FLOAT64: datatypeName = "float64"; break; case NIFTI_TYPE_RGB24: datatypeName = "rgb24"; break; case NIFTI_TYPE_INT8: datatypeName = "int8"; break; case NIFTI_TYPE_UINT16: datatypeName = "uint16"; break; case NIFTI_TYPE_UINT32: datatypeName = "uint32"; break; case NIFTI_TYPE_INT64: datatypeName = "int64"; break; case NIFTI_TYPE_UINT64: datatypeName = "uint64"; break; case NIFTI_TYPE_FLOAT128: datatypeName = "float128"; break; case NIFTI_TYPE_COMPLEX128: datatypeName = "complex128"; break; case NIFTI_TYPE_COMPLEX256: datatypeName = "complex256"; break; case NIFTI_TYPE_RGBA32: datatypeName = "rgba32"; break; } static const char *intentCodes[25] = { "none", "unknown", "correl", "ttest", "ftest", "zscore", "chisq", "beta", "binom", "gamma", "poisson", "normal", "ftest_nonc", "chisq_nonc", "logistic", "laplace", "uniform", "ttest_nonc", "weibull", "chi", "invgauss", "extval", "pval", "logpval", "log10pval" }; static const char *intentCodes1000[] = { "unknown", "estimate", "label", "neuro_name", "gen_matrix", "sym_matrix", "disp_vect", "vector", "point_set", "triangle", "quaternion", "dimless" }; static const char *intentCodes2000[] = { "unknown", "time_series", "node_index", "rgb_vector", "rgba_vector", "shape" }; short ic = hdr.intent_code; const char *intentCode = "unknown"; if (ic >= 0 && ic <= 25) { intentCode = intentCodes[ic]; } else if (ic >= 1000 && ic <= 1011) { intentCode = intentCodes1000[ic-1000]; } else if (ic >= 2000 && ic <= 2005) { intentCode = intentCodes2000[ic-2000]; } const char *spaceUnits = "unknown"; switch (hdr.xyzt_units & 0x7) { case 1: spaceUnits = "meters"; break; case 2: spaceUnits = "millimeters"; break; case 3: spaceUnits = "microns"; break; } const char *timeUnits = "unknown"; switch (hdr.xyzt_units & 0x38) { case 8: timeUnits = "seconds"; break; case 16: timeUnits = "milliseconds"; break; case 24: timeUnits = "microseconds"; break; case 32: timeUnits = "hertz"; break; case 40: timeUnits = "ppm"; break; case 48: timeUnits = "radians"; break; } const char *sliceCode = "unknown"; switch (hdr.slice_code) { case 1: sliceCode = "seq_inc"; break; case 2: sliceCode = "seq_dec"; break; case 3: sliceCode = "alt_inc"; break; case 4: sliceCode = "alt_dec"; break; case 5: sliceCode = "alt_inc2"; break; case 6: sliceCode = "alt_dec2"; break; } const char *xformCode[2] = { "unknown", "unknown" }; short xc[2]; xc[0] = hdr.qform_code; xc[1] = hdr.sform_code; for (int i = 0; i < 2; i++) { switch (xc[i]) { case 1: xformCode[i] = "scanner_anat"; break; case 2: xformCode[i] = "aligned_anat"; break; case 3: xformCode[i] = "talairach"; break; case 4: xformCode[i] = "mni_152"; break; } } // temporary space char buf[SANITIZE_BUFSIZE]; printf("sizeof_hdr: %d\n", (version >= 2 ? vtkNIFTIHeader::Nifti2HeaderSize : vtkNIFTIHeader::Nifti1HeaderSize)); printf("vox_offset: %lld\n", hdr.vox_offset); //printf("data_type: %.10s\n", hdr.data_type); //printf("db_name: %.18s\n", hdr.db_name); //printf("extents: %d\n", hdr.extents); //printf("session_error: %d\n", hdr.session_error); //printf("regular: %d\n", hdr.regular); printf("dim_info: 0x%x", hdr.dim_info); if (hdr.dim_info == 0) { printf(" (unknown)\n"); } else { printf(" (freq_dim=%d, phase_dim=%d, slice_dim=%d)\n", (hdr.dim_info & 0x3), ((hdr.dim_info >> 2) & 0x3), ((hdr.dim_info >> 4) & 0x3)); } printf("dim:"); for (int i = 0; i < 8; i++) { printf(" %lld", hdr.dim[i]); } printf("\n"); printf("pixdim:"); for (int i = 0; i < 8; i++) { printf(" %g", hdr.pixdim[i]); } printf("\n"); printf("xyzt_units: 0x%x (%s, %s)\n", hdr.xyzt_units, spaceUnits, timeUnits); if (version > 0) { printf("intent_code: %d (%s)\n", hdr.intent_code, intentCode); printf("intent_name: \"%s\"\n", stringSanitize(buf, hdr.intent_name, sizeof(hdr.intent_name))); printf("intent_p1: %g\n", hdr.intent_p1); printf("intent_p2: %g\n", hdr.intent_p2); printf("intent_p3: %g\n", hdr.intent_p3); } printf("datatype: %d (%s)\n", hdr.datatype, datatypeName); printf("bitpix: %d\n", hdr.bitpix); if (version > 0) { printf("scl_slope: %g\n", hdr.scl_slope); printf("scl_inter: %g\n", hdr.scl_inter); printf("cal_max: %g\n", hdr.cal_max); printf("cal_min: %g\n", hdr.cal_min); printf("slice_code: %d (%s)\n", hdr.slice_code, sliceCode); printf("slice_start: %lld\n", hdr.slice_start); printf("slice_end: %lld\n", hdr.slice_end); printf("slice_duration: %g\n", hdr.slice_duration); printf("toffset: %g\n", hdr.toffset); } printf("descrip: \"%s\"\n", stringSanitize(buf, hdr.descrip, sizeof(hdr.descrip))); printf("aux_file: \"%s\"\n", stringSanitize(buf, hdr.aux_file, sizeof(hdr.aux_file))); if (version > 0) { printf("qform_code: %d (%s)\n", hdr.qform_code, xformCode[0]); printf("sform_code: %d (%s)\n", hdr.sform_code, xformCode[1]); printf("quatern_b: %g\n", hdr.quatern_b); printf("quatern_c: %g\n", hdr.quatern_c); printf("quatern_d: %g\n", hdr.quatern_d); printf("qoffset_x: %g\n", hdr.qoffset_x); printf("qoffset_y: %g\n", hdr.qoffset_y); printf("qoffset_z: %g\n", hdr.qoffset_z); printf("srow_x:"); for (int i = 0; i < 4; i++) { printf(" %g", hdr.srow_x[i]); } printf("\n"); printf("srow_y:"); for (int i = 0; i < 4; i++) { printf(" %g", hdr.srow_y[i]); } printf("\n"); printf("srow_z:"); for (int i = 0; i < 4; i++) { printf(" %g", hdr.srow_z[i]); } printf("\n"); printf("magic: \"%s\"\n", stringSanitize(buf, hdr.magic, sizeof(hdr.magic))); fflush(stdout); } return rval; } vtk-dicom-0.8.12/Programs/niftitodicom.cxx000066400000000000000000000657041356440565500205360ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMBuild.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMReader.h" #include "vtkDICOMWriter.h" #include "vtkDICOMFileSorter.h" #include "vtkDICOMMRGenerator.h" #include "vtkDICOMCTGenerator.h" #include "vtkDICOMSCGenerator.h" #include "vtkDICOMToRAS.h" #include "vtkDICOMCTRectifier.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMFileDirectory.h" #include "vtkNIFTIHeader.h" #include "vtkNIFTIReader.h" #include "vtkVersion.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkImageReslice.h" #include "vtkImageShiftScale.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkSortFileNames.h" #include "vtkSmartPointer.h" #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) #include "vtkImageHistogramStatistics.h" #endif #include #include #include #include #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // Kinds of reformats enum MPREnum { MPRAxial = 1, MPRCoronal = 2, MPRSagittal = 3 }; // Simple structure for command-line options struct niftitodicom_options { bool no_reordering; const char *modality; const char *series_description; const char *series_number; const char *uid_prefix; int mpr; bool silent; bool verbose; bool verbatim; const char *output; const char *input; }; // Print the version void niftitodicom_version(FILE *file, const char *command_name, bool verbose) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } if (!verbose) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } else { fprintf(file, "Head %8.8s, Built %s, %s\n", DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME); } } // Print the options void niftitodicom_usage(FILE *file, const char *command_name) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } fprintf(file, "usage:\n" " %s -o directory file.nii [file.dcm ...]\n\n", cp); fprintf(file, "options:\n" " -o directory The output directory.\n" " -s --silent Do not print anything while executing.\n" " -v --verbose Verbose error reporting.\n" " --verbatim Copy source metadata nearly verbatim.\n" " --no-reordering Never reorder slices, rows, or columns.\n" " --axial Produce axial slices.\n" " --coronal Produce coronal slices.\n" " --sagittal Produce sagittal slices.\n" " --series-description Textual description of the series.\n" " --series-number The series number to use.\n" " --modality The modality: MR or CT or SC.\n" " --uid-prefix A DICOM uid prefix (optional).\n" " --version Print the version and exit.\n" " --build-version Print source and build version.\n" " --help Documentation for niftitodicom.\n" ); } // Print the help void niftitodicom_help(FILE *file, const char *command_name) { niftitodicom_usage(file, command_name); fprintf(file, "\n"); fprintf(file, "This program will convert a NIfTI file into a DICOM series.\n" "\n"); fprintf(file, "It reads the NIfTI file header and does the best job that it can to\n" "generate a series of DICOM files. To help it along, you can provide\n" "a DICOM file from the same series on the command line after the NIfTI\n" "file, or even better, list all of the DICOM files that were used as\n" "the source of the data in the NIfTI file. Study-related meta data will\n" "be copied from these DICOM files into the output DICOM files.\n" "\n"); fprintf(file, "Unless the --no-reordering option is provided, it will ensure that\n" "the images are in the usual orientation (right is left, posterior is\n" "down) by reordering the columns or rows as compared to the NIFTI file.\n" "\n"); fprintf(file, "If the NIFTI file is floating-point, then the data might be rescaled\n" "when written to DICOM as 16-bit integers. If any data values are too\n" "large to fit into 16 bits, then all the data will be scaled down. If\n" "the data values all have a magnitude smaller than 2.05, then all the\n" "data will be scaled up by a factor of 1000.\n" "\n"); } // Print error void niftitodicom_check_error(vtkObject *o) { vtkNIFTIReader *reader = vtkNIFTIReader::SafeDownCast(o); vtkDICOMFileSorter *sorter = vtkDICOMFileSorter::SafeDownCast(o); vtkDICOMWriter *writer = vtkDICOMWriter::SafeDownCast(o); vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); const char *filename = 0; unsigned long errorcode = 0; if (writer) { filename = writer->GetFileName(); errorcode = writer->GetErrorCode(); } else if (reader) { filename = reader->GetInternalFileName(); errorcode = reader->GetErrorCode(); } else if (sorter) { filename = sorter->GetInternalFileName(); errorcode = sorter->GetErrorCode(); } else if (parser) { filename = parser->GetFileName(); errorcode = parser->GetErrorCode(); } if (!filename) { filename = ""; } switch(errorcode) { case vtkErrorCode::NoError: return; case vtkErrorCode::FileNotFoundError: fprintf(stderr, "File not found: %s\n", filename); break; case vtkErrorCode::CannotOpenFileError: fprintf(stderr, "Cannot open file: %s\n", filename); break; case vtkErrorCode::UnrecognizedFileTypeError: fprintf(stderr, "Unrecognized file type: %s\n", filename); break; case vtkErrorCode::PrematureEndOfFileError: fprintf(stderr, "File is truncated: %s\n", filename); break; case vtkErrorCode::FileFormatError: fprintf(stderr, "Bad DICOM file: %s\n", filename); break; case vtkErrorCode::NoFileNameError: fprintf(stderr, "Output filename could not be used: %s\n", filename); break; case vtkErrorCode::OutOfDiskSpaceError: fprintf(stderr, "Out of disk space while writing file: %s\n", filename); break; default: fprintf(stderr, "An unknown error occurred.\n"); break; } exit(1); } // Check that a file has a NIFTI name bool isNIFTIFileName(const char *f) { const char *suffixes[] = { ".nii", ".nii.gz", ".hdr", ".hdr.gz", ".img", ".img.gz", 0 }; size_t n = strlen(f); for (const char **s = suffixes; *s != 0; s++) { size_t m = strlen(*s); if (n > m && strcmp(f + n - m, *s) == 0) { return true; } } return false; } // Read the options void niftitodicom_read_options( int argc, char *argv[], niftitodicom_options *options, vtkStringArray *files) { options->mpr = 0; options->no_reordering = false; options->modality = 0; options->series_description = 0; options->series_number = 0; options->uid_prefix = "2.25"; options->silent = false; options->verbose = false; options->verbatim = false; options->output = 0; options->input = 0; // read the options from the command line int argi = 1; while (argi < argc) { const char *arg = argv[argi++]; if (arg[0] == '-') { if (strcmp(arg, "--") == 0) { // stop processing switches break; } else if (strcmp(arg, "--modality") == 0 || strcmp(arg, "--series-description") == 0 || strcmp(arg, "--series-number") == 0 || strcmp(arg, "--uid-prefix") == 0) { if (argi >= argc || argv[argi][0] == '-') { fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg); exit(1); } if (strcmp(arg, "--modality") == 0) { options->modality = argv[argi]; } else if (strcmp(arg, "--series-description") == 0) { options->series_description = argv[argi]; } else if (strcmp(arg, "--series-number") == 0) { options->series_number= argv[argi]; } else if (strcmp(arg, "--uid-prefix") == 0) { options->uid_prefix = argv[argi]; } argi++; } else if (strcmp(arg, "--axial") == 0) { options->mpr = MPRAxial; } else if (strcmp(arg, "--coronal") == 0) { options->mpr = MPRCoronal; } else if (strcmp(arg, "--sagittal") == 0) { options->mpr = MPRSagittal; } else if (strcmp(arg, "--no-reordering") == 0) { options->no_reordering = true; } else if (strcmp(arg, "--silent") == 0) { options->silent = true; } else if (strcmp(arg, "--verbose") == 0) { options->verbose = true; } else if (strcmp(arg, "--verbatim") == 0) { options->verbatim = true; } else if (strcmp(arg, "--version") == 0) { niftitodicom_version(stdout, argv[0], false); exit(0); } else if (strcmp(arg, "--build-version") == 0) { niftitodicom_version(stdout, argv[0], true); exit(0); } else if (strcmp(arg, "--help") == 0) { niftitodicom_help(stdout, argv[0]); exit(0); } else if (arg[0] == '-' && arg[1] == '-') { fprintf(stderr, "\nUnrecognized option %s\n\n", arg); niftitodicom_usage(stderr, argv[0]); exit(1); } else if (arg[0] == '-' && arg[1] != '-') { for (int argj = 1; arg[argj] != '\0'; argj++) { if (arg[argj] == 's') { options->silent = true; } else if (arg[argj] == 'v') { options->verbose = true; } else if (arg[argj] == 'o') { if (arg[argj+1] != '\0') { arg += argj+1; } else { if (argi >= argc) { fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n"); niftitodicom_usage(stderr, argv[0]); exit(1); } arg = argv[argi++]; } options->output = arg; break; } else { fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg); niftitodicom_usage(stderr, argv[0]); exit(1); } } } } else { files->InsertNextValue(arg); vtkIdType m = files->GetMaxId(); if (m >= 0) { const char *f = files->GetValue(m); if (isNIFTIFileName(f)) { if (options->input == 0) { options->input = arg; files->SetNumberOfValues(m); } else { fprintf(stderr, "\nAt most one NIFTI file can be specified.\n"); niftitodicom_usage(stderr, argv[0]); exit(1); } } } } } while (argi < argc) { files->InsertNextValue(argv[argi++]); vtkIdType m = files->GetMaxId(); if (m >= 0) { const char *f = files->GetValue(m); if (isNIFTIFileName(f)) { if (options->input == 0) { options->input = argv[argi-1]; files->SetNumberOfValues(m); } else { fprintf(stderr, "\nAt most one NIFTI file can be specified.\n"); niftitodicom_usage(stderr, argv[0]); exit(1); } } } } } // Convert one NIFTI file into a DICOM series void niftitodicom_convert_one( const niftitodicom_options *options, const char *filename, vtkStringArray *a, const char *outfile) { // The meta data object vtkSmartPointer meta = vtkSmartPointer::New(); // read the DICOM files, if provided vtkSmartPointer dicomReader = vtkSmartPointer::New(); dicomReader->TimeAsVectorOn(); dicomReader->SetFileNames(a); dicomReader->SetMemoryRowOrderToFileNative(); vtkMatrix4x4 *readerMatrix = 0; if (a->GetNumberOfValues() > 0) { dicomReader->UpdateInformation(); meta->DeepCopy(dicomReader->GetMetaData()); readerMatrix = dicomReader->GetPatientMatrix(); } // set the metadata supplied on the command line if (options->series_description) { meta->Set(DC::SeriesDescription, options->series_description); } if (options->series_number) { meta->Set(DC::SeriesNumber, options->series_number); } // read the NIFTI file vtkSmartPointer reader = vtkSmartPointer::New(); reader->TimeAsVectorOn(); reader->SetFileName(filename); reader->Update(); niftitodicom_check_error(reader); vtkAlgorithmOutput *lastOutput = reader->GetOutputPort(); // get the NIFTI header information vtkNIFTIHeader *hdr = reader->GetNIFTIHeader(); // check if slices were reordered by the reader bool slicesReordered = (reader->GetQFac() < 0); // get the matrix from the NIFTI file vtkMatrix4x4 *inputMatrix = 0; int xformCode = 0; if (reader->GetQFormMatrix()) { inputMatrix = reader->GetQFormMatrix(); xformCode = hdr->GetQFormCode(); } else if (reader->GetSFormMatrix()) { inputMatrix = reader->GetSFormMatrix(); xformCode = hdr->GetSFormCode(); } // convert from NIFTI coordinate system to DICOM coordinate system vtkSmartPointer converter = vtkSmartPointer::New(); converter->SetInputConnection(reader->GetOutputPort()); converter->SetRASToDICOM(1); converter->SetRASMatrix(inputMatrix); converter->SetAllowRowReordering(!options->no_reordering); converter->SetAllowColumnReordering(!options->no_reordering); converter->UpdateMatrix(); lastOutput = converter->GetOutputPort(); // check if slices have been reordered by vtkDICOMToRAS vtkSmartPointer checkMatrix = vtkSmartPointer::New(); if (inputMatrix) { checkMatrix->DeepCopy(inputMatrix); } // undo the NIFTI to DICOM x = -x, y = -y conversion in check matrix for (int j = 0; j < 4; j++) { checkMatrix->Element[0][j] = -checkMatrix->Element[0][j]; checkMatrix->Element[1][j] = -checkMatrix->Element[1][j]; } checkMatrix->Invert(); // checkMatrix = PatientMatrix^(-1) * RASMatrix vtkMatrix4x4::Multiply4x4( checkMatrix, converter->GetPatientMatrix(), checkMatrix); // if z is negative, slices were reordered by vtkDIOCOMToRAS slicesReordered ^= (checkMatrix->GetElement(2, 2) < -0.1); // get the orientation matrix vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->DeepCopy(converter->GetPatientMatrix()); // mpr reformat if requested vtkSmartPointer reformat = vtkSmartPointer::New(); vtkSmartPointer axes = vtkSmartPointer::New(); int permutation[3] = { 0, 1, 2 }; if (options->mpr) { // this becomes meaningless after reformatting slicesReordered = false; // create a permutation matrix to make the slices axial axes->DeepCopy(matrix); axes->Invert(); int maxidx[3] = { -1, -1, -1 }; double value[3] = { 1.0, 1.0, 1.0 }; int prevmaxj = -1; int prevmaxi = -1; for (int kdim = 0; kdim < 2; kdim++) { int maxj = 0; int maxi = 0; double maxv = -0.0; for (int jdim = 0; jdim < 3; jdim++) { if (jdim == prevmaxj) { continue; } for (int idim = 0; idim < 3; idim++) { if (idim == prevmaxi) { continue; } double v = axes->GetElement(jdim, idim); if (v*v >= maxv) { maxi = idim; maxj = jdim; maxv = v*v; } } } maxidx[maxj] = maxi; value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0); prevmaxj = maxj; prevmaxi = maxi; } axes->Zero(); axes->SetElement(3, 3, 1.0); for (int jdim = 0; jdim < 3; jdim++) { int idim = maxidx[jdim]; if (idim < 0) { idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3]; maxidx[jdim] = idim; double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0); value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm; } permutation[jdim] = idim; axes->SetElement(jdim, idim, value[jdim]); } // change the permutation to the desired mpr if (options->mpr == MPRCoronal) { double cmatrix[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; vtkMatrix4x4::Multiply4x4(*axes->Element, cmatrix, *axes->Element); int tperm[3] = { permutation[0], permutation[1], permutation[2] }; permutation[0] = tperm[0]; permutation[1] = tperm[2]; permutation[2] = tperm[1]; } else if (options->mpr == MPRSagittal) { double smatrix[16] = { 0.0, 0.0,-1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; vtkMatrix4x4::Multiply4x4(*axes->Element, smatrix, *axes->Element); int tperm[3] = { permutation[0], permutation[1], permutation[2] }; permutation[0] = tperm[1]; permutation[1] = tperm[2]; permutation[2] = tperm[0]; } // reformat with the permuted axes reformat->SetResliceAxes(axes); reformat->SetInputConnection(lastOutput); lastOutput = reformat->GetOutputPort(); // factor out the permuted axes vtkMatrix4x4::Multiply4x4(matrix, axes, matrix); } // convert to signed short if not short int scalarType = reader->GetOutput()->GetScalarType(); vtkSmartPointer caster = vtkSmartPointer::New(); // whether to allow 8-bit DICOM bool allowUnsignedChar = false; if (options->modality && strcmp(options->modality, "SC") == 0) { allowUnsignedChar = true; } if (scalarType != VTK_SHORT && scalarType != VTK_UNSIGNED_SHORT && (scalarType != VTK_UNSIGNED_CHAR || !allowUnsignedChar)) { #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) if (scalarType == VTK_FLOAT || scalarType == VTK_DOUBLE) { // compute range vtkSmartPointer histo = vtkSmartPointer::New(); histo->SetInputConnection(lastOutput); histo->Update(); double minVal = fabs(histo->GetMinimum()); double maxVal = fabs(histo->GetMaximum()); double autoRange[2]; histo->GetAutoRange(autoRange); if (minVal > 32768.0 || maxVal > 32767.0) { // scale down if out-of-range double v = (maxVal > minVal ? maxVal : minVal); caster->SetScale(32767.0/v); } else if (minVal < 2.047 && maxVal < 2.047) { // scale up by 1000 if values are very small caster->SetScale(1000.0); } else if (minVal < 20.47 && maxVal < 20.47) { // scale up by 100 if values are small caster->SetScale(100.0); } else if (minVal < 204.7 && maxVal < 204.7) { // scale up by 10 caster->SetScale(10.0); } } #endif caster->SetInputConnection(lastOutput); caster->SetOutputScalarType(VTK_SHORT); lastOutput = caster->GetOutputPort(); } // check if requested to write as a CT tilted-gantry series via the // series of files that were sent to the reader vtkSmartPointer rectifier = vtkSmartPointer::New(); if (readerMatrix && fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(readerMatrix)) > 0.01) { rectifier->SetInputConnection(lastOutput); rectifier->SetVolumeMatrix(readerMatrix); rectifier->ReverseOn(); rectifier->UpdateMatrix(); vtkSmartPointer testMatrix = vtkSmartPointer::New(); testMatrix->DeepCopy(rectifier->GetRectifiedMatrix()); testMatrix->Invert(); vtkMatrix4x4::Multiply4x4(testMatrix, matrix, testMatrix); bool isIdentity = true; for (int ii = 0; ii < 4; ii++) { for (int jj = 0; jj < 4; jj++) { double dd = testMatrix->GetElement(ii,jj) - (ii == jj); isIdentity &= (fabs(dd) < 1e-3); } } if (isIdentity) { // exactly the same orientation, so write like the reader's series rectifier->Update(); lastOutput = rectifier->GetOutputPort(); matrix = readerMatrix; } } // mix in the NIFTI header information if (xformCode == vtkNIFTIHeader::XFormTalairach) { meta->Set(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.1"); } else if (xformCode == vtkNIFTIHeader::XFormMNI152) { meta->Set(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.15"); } else if (xformCode != vtkNIFTIHeader::XFormScannerAnat) { meta->Erase(DC::FrameOfReferenceUID); } // the UIDs for the SOP classes we support const char *classUID_CT = "1.2.840.10008.5.1.4.1.1.2"; const char *classUID_MR = "1.2.840.10008.5.1.4.1.1.4"; const char *classUID_SC = "1.2.840.10008.5.1.4.1.1.7"; std::string sourceClassUID = meta->Get(DC::SOPClassUID).AsString(); std::string outputClassUID; // make the generator vtkSmartPointer mrgenerator = vtkSmartPointer::New(); vtkSmartPointer ctgenerator = vtkSmartPointer::New(); vtkSmartPointer scgenerator = vtkSmartPointer::New(); vtkSmartPointer verbgenerator = vtkSmartPointer::New(); vtkDICOMGenerator *generator = mrgenerator; if (options->verbatim) { generator = verbgenerator; } else if (options->modality) { if (strcmp(options->modality, "CT") == 0) { generator = ctgenerator; outputClassUID = classUID_CT; } else if (strcmp(options->modality, "MR") == 0 || strcmp(options->modality, "MRI") == 0) { generator = mrgenerator; outputClassUID = classUID_MR; } else if (strcmp(options->modality, "SC") == 0) { generator = scgenerator; outputClassUID = classUID_SC; } } else if (meta->Has(DC::SOPClassUID)) { if (sourceClassUID == classUID_CT && (scalarType == VTK_SHORT || scalarType == VTK_UNSIGNED_SHORT)) { generator = ctgenerator; outputClassUID = classUID_CT; } else if (sourceClassUID == classUID_MR && (scalarType == VTK_SHORT || scalarType == VTK_UNSIGNED_SHORT)) { generator = mrgenerator; outputClassUID = classUID_MR; } else if (sourceClassUID == classUID_SC) { generator = scgenerator; outputClassUID = classUID_SC; } } if (sourceClassUID == outputClassUID) { // if the source data has the same SOP base class as the data that we // are generating, then copy all attributes, otherwise only copy // attributes that are part of the output's SOP base class. generator->ExtendedOn(); } // prepare the writer to write the image vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetGenerator(generator); writer->SetMetaData(meta); if (options->verbatim) { writer->SetImageType(NULL); } writer->SetFilePrefix(outfile); writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); writer->TimeAsVectorOn(); if (reader->GetTimeDimension() > 1) { writer->SetTimeDimension(reader->GetTimeDimension()); writer->SetTimeSpacing(reader->GetTimeSpacing()); } writer->SetPatientMatrix(matrix); if (reader->GetRescaleSlope() > 0) { writer->SetRescaleSlope(reader->GetRescaleSlope()); writer->SetRescaleIntercept(reader->GetRescaleIntercept()); } writer->SetInputConnection(lastOutput); writer->SetMemoryRowOrderToFileNative(); writer->Write(); niftitodicom_check_error(writer); } // Process a list of files void niftitodicom_convert_files( niftitodicom_options *options, vtkStringArray *files, const char *outpath) { const char *filename = options->input; // sort the files by filename first, as a fallback vtkSmartPointer presorter = vtkSmartPointer::New(); presorter->NumericSortOn(); presorter->IgnoreCaseOn(); presorter->SetInputFileNames(files); presorter->Update(); // sort the files by study and series vtkSmartPointer sorter = vtkSmartPointer::New(); sorter->SetInputFileNames(presorter->GetFileNames()); sorter->Update(); niftitodicom_check_error(sorter); niftitodicom_convert_one( options, filename, sorter->GetOutputFileNames(), outpath); } // This program will convert NIFTI to DICOM int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); // for the list of input DICOM files vtkSmartPointer files = vtkSmartPointer::New(); niftitodicom_options options; niftitodicom_read_options(argc, argv, &options, files); // whether to silence VTK warnings and errors vtkObject::SetGlobalWarningDisplay(options.verbose); // set the UID prefix if (options.uid_prefix) { vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix); } // the output (NIFTI file or directory) const char *outpath = options.output; if (!outpath) { fprintf(stderr, "\nNo output directory was specified (\'-o\' ).\n\n"); niftitodicom_usage(stderr, argv[0]); exit(1); } if (!options.input) { fprintf(stderr, "\nNo input file was specified (.nii or .nii.gz).\n\n"); niftitodicom_usage(stderr, argv[0]); exit(1); } int code = vtkDICOMFileDirectory::Access(outpath, vtkDICOMFileDirectory::Out); if (code == vtkDICOMFileDirectory::AccessDenied) { fprintf(stderr, "Cannot write to directory: %s\n", outpath); exit(1); } else if (code == vtkDICOMFileDirectory::ImpossiblePath) { fprintf(stderr, "option -o must name a directory, not a file.\n"); exit(1); } else if (code == vtkDICOMFileDirectory::FileNotFound) { code = vtkDICOMFileDirectory::Create(outpath); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Cannot create directory: %s\n", outpath); exit(1); } } niftitodicom_convert_files(&options, files, outpath); return 0; } vtk-dicom-0.8.12/Programs/scancodump.cxx000066400000000000000000000122421356440565500201670ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkScancoCTReader.h" #include "vtkSmartPointer.h" #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // print the version void printVersion(FILE *file, const char *cp) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n" "\n"); } // print the help void printUsage(FILE *file, const char *cp) { fprintf(file, "usage:\n" " %s file\n", cp); fprintf(file, "options:\n" " --help Print a brief help message.\n" " --version Print the software version.\n\n"); } // print the help void printHelp(FILE *file, const char *cp) { printUsage(file, cp); fprintf(file, "Dump the header from a .isq, .rad, or .aim file.\n\n"); } // remove path portion of filename const char *fileBasename(const char *filename) { const char *cp = filename + strlen(filename); while (cp != filename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } return cp; } // This program will convert int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); int rval = 0; if (argc < 2) { printUsage(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { printHelp(stdout, fileBasename(argv[0])); return rval; } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { printVersion(stdout, fileBasename(argv[0])); return rval; } vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(argv[1]); reader->UpdateInformation(); double origin[3], spacing[3], dvec[3]; int extent[6], ivec[3]; reader->GetDataOrigin(origin); reader->GetDataSpacing(spacing); reader->GetDataExtent(extent); printf("Version: %s\n", reader->GetVersion()); printf("CreationDate: %s\n", reader->GetCreationDate()); if (strncmp(reader->GetVersion(), "AIMDATA", 7) == 0) { printf("ModificationDate: %s\n", reader->GetModificationDate()); printf("Position: %d %d %d\n", static_cast(origin[0]/spacing[0] + 0.5), static_cast(origin[1]/spacing[1] + 0.5), static_cast(origin[2]/spacing[2] + 0.5)); printf("Dimensions: %d %d %d\n", (extent[1] - extent[0] + 1), (extent[3] - extent[2] + 1), (extent[5] - extent[4] + 1)); printf("ElementSize: %g %g %g [mm]\n", spacing[0], spacing[1], spacing[2]); printf("DataType: %s\n", (reader->GetDataScalarType() == VTK_SHORT ? "short" : "byte")); } reader->GetScanDimensionsPixels(ivec); printf("ScanDimensionsPixels: %d %d %d\n", ivec[0], ivec[1], ivec[2]); reader->GetScanDimensionsPhysical(dvec); printf("ScanDimensionsPhysical: %g %g %g [mm]\n", dvec[0], dvec[1], dvec[2]); printf("PatientName: %s\n", reader->GetPatientName()); printf("PatientIndex: %d\n", reader->GetPatientIndex()); printf("MeasurementIndex: %d\n", reader->GetMeasurementIndex()); printf("Site: %d\n", reader->GetSite()); printf("ScannerID: %d\n", reader->GetScannerID()); printf("ScannerType: %d\n", reader->GetScannerType()); printf("PositionSlice1: %g [mm]\n", reader->GetStartPosition()); printf("ReferenceLine: %g [mm]\n", reader->GetReferenceLine()); printf("NumberOfSamples: %d\n", reader->GetNumberOfSamples()); printf("NumberOfProjections: %d\n", reader->GetNumberOfProjections()); printf("ScanDistance: %g [mm]\n", reader->GetScanDistance()); printf("SampleTime: %g [ms]\n", reader->GetSampleTime()); printf("SliceThickness: %g [mm]\n", reader->GetSliceThickness()); printf("SliceIncrement: %g [mm]\n", reader->GetSliceIncrement()); printf("ReconstructionAlg: %d\n", reader->GetReconstructionAlg()); printf("Energy: %g [kV]\n", reader->GetEnergy()); printf("Intensity: %g [mA]\n", reader->GetIntensity()); printf("MuScaling: %g [cm]\n", reader->GetMuScaling()); reader->GetDataRange(dvec); printf("DataRange: %g %g\n", dvec[0], dvec[1]); printf("CalibrationData: %s\n", reader->GetCalibrationData()); printf("RescaleType: %d\n", reader->GetRescaleType()); printf("RescaleUnits: %s\n", reader->GetRescaleUnits()); printf("RescaleSlope: %g\n", reader->GetRescaleSlope()); printf("RescaleIntercept: %g\n", reader->GetRescaleIntercept()); printf("MuWater: %g [cm^-1]\n", reader->GetMuWater()); printf("HeaderSize: %d\n", static_cast(reader->GetHeaderSize())); fflush(stdout); return 0; } vtk-dicom-0.8.12/Programs/scancotodicom.cxx000066400000000000000000000454651356440565500206750ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMConfig.h" #include "vtkDICOMBuild.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMReader.h" #include "vtkDICOMWriter.h" #include "vtkDICOMCTGenerator.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMFileDirectory.h" #include "vtkScancoCTReader.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkImageReslice.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkSmartPointer.h" #include #include #include #include #include #include #include #include // from dicomcli #include "vtkConsoleOutputWindow.h" #include "mainmacro.h" // The file types enum { SCANCO_ISQ, // standard CT scan SCANCO_RAD, // CT localizer scan SCANCO_AIM, // cropped CT scan SCANCO_AIM_SEG // any 8-bit data }; // Simple structure for command-line options struct scancotodicom_options { bool no_reordering; const char *series_description; const char *series_number; const char *uid_prefix; bool silent; bool verbose; const char *output; const char *input; }; // Print the version void scancotodicom_version(FILE *file, const char *command_name, bool verbose) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } if (!verbose) { fprintf(file, "%s %s\n", cp, DICOM_VERSION); fprintf(file, "\n" "Copyright (c) 2012-2019, David Gobbi.\n\n" "This software is distributed under an open-source license. See the\n" "Copyright.txt file that comes with the vtk-dicom source distribution.\n"); } else { fprintf(file, "Head %8.8s, Built %s, %s\n", DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME); } } // Print the options void scancotodicom_usage(FILE *file, const char *command_name) { const char *cp = command_name + strlen(command_name); while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; } fprintf(file, "usage:\n" " %s -o directory file.isq [sample.dcm ...]\n\n", cp); fprintf(file, "options:\n" " -o directory The output directory.\n" " -s --silent Do not print anything while executing.\n" " -v --verbose Verbose error reporting.\n" " --series-description Textual description of the series.\n" " --series-number The series number to use.\n" " --uid-prefix A DICOM uid prefix (optional).\n" " --version Print the version and exit.\n" " --build-version Print source and build version.\n" " --help Documentation for scancotodicom.\n" ); } // Print the help void scancotodicom_help(FILE *file, const char *command_name) { scancotodicom_usage(file, command_name); fprintf(file, "\n"); fprintf(file, "This program will convert a uCT file into a DICOM series.\n" "\n"); fprintf(file, "It reads the uCT file header and generates a series of DICOM files.\n" "If you are converting multiple files that belong to the same study,\n" "then after converting the first file, you should supply on the command\n" "line all of the DICOM files produced from that file. This allows the\n" "converter to keep all the study information consistent between all\n" "files that belong to the same study.\n" "\n"); } // Print error void scancotodicom_check_error(vtkObject *o) { vtkScancoCTReader *reader = vtkScancoCTReader::SafeDownCast(o); vtkDICOMWriter *writer = vtkDICOMWriter::SafeDownCast(o); vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); const char *filename = 0; unsigned long errorcode = 0; if (writer) { filename = writer->GetFileName(); errorcode = writer->GetErrorCode(); } else if (reader) { filename = reader->GetInternalFileName(); errorcode = reader->GetErrorCode(); } else if (parser) { filename = parser->GetFileName(); errorcode = parser->GetErrorCode(); } if (!filename) { filename = ""; } switch(errorcode) { case vtkErrorCode::NoError: return; case vtkErrorCode::FileNotFoundError: fprintf(stderr, "File not found: %s\n", filename); break; case vtkErrorCode::CannotOpenFileError: fprintf(stderr, "Cannot open file: %s\n", filename); break; case vtkErrorCode::UnrecognizedFileTypeError: fprintf(stderr, "Unrecognized file type: %s\n", filename); break; case vtkErrorCode::PrematureEndOfFileError: fprintf(stderr, "File is truncated: %s\n", filename); break; case vtkErrorCode::FileFormatError: fprintf(stderr, "Bad DICOM file: %s\n", filename); break; case vtkErrorCode::NoFileNameError: fprintf(stderr, "Output filename could not be used: %s\n", filename); break; case vtkErrorCode::OutOfDiskSpaceError: fprintf(stderr, "Out of disk space while writing file: %s\n", filename); break; default: fprintf(stderr, "An unknown error occurred.\n"); break; } exit(1); } // Convert a date to DICOM format (in-place conversion) void scancotodicom_convert_date(char date[32]) { // The input format is expected to be: // DD-MMM-YYYY hh:mm:ss.uuuuuu (MMM is JAN, FEB, etc) // The output format is: // YYYYMMDDhhmmss.uuuuuu const char *months[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; char *cp = date; unsigned int parts[7]; for (int i = 0; i < 7; i++) { while (*cp == ' ') { cp++; } int lead = 0; while (cp[0] == '0' && isdigit(cp[1])) { lead++; cp++; } parts[i] = strtoul(cp, &cp, 10); if (i == 1 && isalpha(*cp)) { for (int j = 0; j < 12; j++) { const char *month = months[j]; if (toupper(cp[0]) == month[0] && toupper(cp[1]) == month[1] && toupper(cp[2]) == month[2]) { parts[i] = j+1; break; } } while (isalpha(*cp)) { cp++; } } if (i == 6) { unsigned int denom = 10; while (denom <= parts[i]) { denom *= 10; } while (lead > 0) { lead--; denom *= 10; } if (denom > 1000000) { parts[i] /= (denom/1000000); } else { parts[i] *= (1000000/denom); } } if (*cp != '\0') { cp++; } } sprintf(date, "%04d%02d%02d%02d%02d%02d.%06d", parts[2] % 10000, parts[1] % 100, parts[0] % 100, parts[3] % 100, parts[4] % 100, parts[5] % 100, parts[6] % 1000000); } // Check that a file has a valid extension bool isScancoCTFileName(const char *f) { const char *suffixes[] = { ".isq", ".ISQ", ".rsq", ".RSQ", ".rad", ".RAD", ".aim", ".AIM", 0 }; size_t n = strlen(f); for (const char **s = suffixes; *s != 0; s++) { size_t m = strlen(*s); if (n > m && strcmp(f + n - m, *s) == 0) { return true; } } return false; } // Read the options void scancotodicom_read_options( int argc, char *argv[], scancotodicom_options *options, vtkStringArray *files) { options->no_reordering = false; options->series_description = 0; options->series_number = 0; options->uid_prefix = "2.25"; options->silent = false; options->verbose = false; options->output = 0; options->input = 0; // read the options from the command line int argi = 1; while (argi < argc) { const char *arg = argv[argi++]; if (arg[0] == '-') { if (strcmp(arg, "--") == 0) { // stop processing switches break; } else if (strcmp(arg, "--series-description") == 0 || strcmp(arg, "--series-number") == 0 || strcmp(arg, "--uid-prefix") == 0) { if (argi >= argc || argv[argi][0] == '-') { fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg); exit(1); } if (strcmp(arg, "--series-description") == 0) { options->series_description = argv[argi]; } else if (strcmp(arg, "--series-number") == 0) { options->series_number= argv[argi]; } else if (strcmp(arg, "--uid-prefix") == 0) { options->uid_prefix = argv[argi]; } argi++; } else if (strcmp(arg, "--silent") == 0) { options->silent = true; } else if (strcmp(arg, "--verbose") == 0) { options->verbose = true; } else if (strcmp(arg, "--version") == 0) { scancotodicom_version(stdout, argv[0], false); exit(0); } else if (strcmp(arg, "--build-version") == 0) { scancotodicom_version(stdout, argv[0], true); exit(0); } else if (strcmp(arg, "--help") == 0) { scancotodicom_help(stdout, argv[0]); exit(0); } else if (arg[0] == '-' && arg[1] == '-') { fprintf(stderr, "\nUnrecognized option %s\n\n", arg); scancotodicom_usage(stderr, argv[0]); exit(1); } else if (arg[0] == '-' && arg[1] != '-') { for (int argj = 1; arg[argj] != '\0'; argj++) { if (arg[argj] == 's') { options->silent = true; } else if (arg[argj] == 'v') { options->verbose = true; } else if (arg[argj] == 'o') { if (arg[argj+1] != '\0') { arg += argj+1; } else { if (argi >= argc) { fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n"); scancotodicom_usage(stderr, argv[0]); exit(1); } arg = argv[argi++]; } options->output = arg; break; } else { fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg); scancotodicom_usage(stderr, argv[0]); exit(1); } } } } else { files->InsertNextValue(arg); vtkIdType m = files->GetMaxId(); if (m >= 0) { const char *f = files->GetValue(m); if (isScancoCTFileName(f)) { if (options->input == 0) { options->input = arg; files->SetNumberOfValues(m); } else { fprintf(stderr, "\nAt most one uCT file can be specified.\n"); scancotodicom_usage(stderr, argv[0]); exit(1); } } } } } while (argi < argc) { files->InsertNextValue(argv[argi++]); vtkIdType m = files->GetMaxId(); if (m >= 0) { const char *f = files->GetValue(m); if (isScancoCTFileName(f)) { if (options->input == 0) { options->input = argv[argi-1]; files->SetNumberOfValues(m); } else { fprintf(stderr, "\nAt most one uCT file can be specified.\n"); scancotodicom_usage(stderr, argv[0]); exit(1); } } } } } // Convert one uCT file into a DICOM series void scancotodicom_convert_one( const scancotodicom_options *options, const char *filename, vtkStringArray *a, const char *outfile) { // read the Scanco file vtkSmartPointer reader = vtkSmartPointer::New(); reader->SetFileName(filename); reader->UpdateInformation(); scancotodicom_check_error(reader); // get info about the original scan dimensions int pixdim[3]; double physdim[3]; reader->GetScanDimensionsPixels(pixdim); reader->GetScanDimensionsPhysical(physdim); // get the file type int fileType = SCANCO_ISQ; const char *imageType = "ORIGINAL\\PRIMARY\\AXIAL"; const char *modality = "CT"; const char *version = reader->GetVersion(); if (strncmp(version, "AIM", 3) == 0) { fileType = SCANCO_AIM; imageType = "ORIGINAL\\SECONDARY\\AXIAL"; if (reader->GetDataScalarType() != VTK_SHORT) { modality = "SEG"; fileType = SCANCO_AIM_SEG; imageType = "DERIVED\\PRIMARY"; } } else if (physdim[2] == 0) { fileType = SCANCO_RAD; imageType = "ORIGINAL\\PRIMARY\\LOCALIZER"; } // The meta data object vtkSmartPointer meta = vtkSmartPointer::New(); // read meta data from the sample DICOM file, if provided if (a->GetNumberOfValues() > 0) { vtkSmartPointer dicomReader = vtkSmartPointer::New(); dicomReader->SetFileNames(a); if (fileType == SCANCO_RAD) { dicomReader->SetMemoryRowOrderToFileNative(); } else { dicomReader->SetMemoryRowOrderToBottomUp(); } dicomReader->UpdateInformation(); meta->DeepCopy(dicomReader->GetMetaData()); } // set metadata from the file header meta->Set(DC::Modality, modality); // meta->Set(DC::Laterality, /* "L" or "R" */); meta->Set(DC::ImageType, imageType); // DC::Manufacturer Scanco // DC::ManufacturerModelName reader->GetScannerType() // DC::DeviceSerialNumber reader->GetScannerID() double rescaleSlope = 1.0; double rescaleIntercept = 0.0; if (reader->GetMuScaling() != 0 && reader->GetMuWater() != 0) { // conversion to Hounsfield units rescaleIntercept = -1000.0; rescaleSlope = 1000.0/(reader->GetMuScaling()*reader->GetMuWater()); meta->Set(DC::RescaleIntercept, rescaleIntercept); meta->Set(DC::RescaleSlope, rescaleSlope); meta->Set(DC::RescaleType, "HU"); } meta->Set(DC::KVP, reader->GetEnergy()); meta->Set(DC::AcquisitionNumber, reader->GetMeasurementIndex()); meta->Set(DC::ExposureTime, reader->GetSampleTime()); meta->Set(DC::XRayTubeCurrentInuA, 1000*reader->GetIntensity()); if (fileType != SCANCO_RAD) { meta->Set(DC::SliceThickness, reader->GetSliceThickness()); meta->Set(DC::DataCollectionDiameter, physdim[0]); meta->Set(DC::ReconstructionDiameter, physdim[0]); } // date char date[32]; if (!meta->Has(DC::StudyDate)) { strncpy(date, reader->GetCreationDate(), 32); scancotodicom_convert_date(date); meta->Set(DC::StudyTime, &date[8]); meta->Set(DC::SeriesTime, &date[8]); date[8] = '\0'; meta->Set(DC::StudyDate, date); meta->Set(DC::SeriesDate, date); } if (fileType == SCANCO_AIM_SEG) { strncpy(date, reader->GetModificationDate(), 32); scancotodicom_convert_date(date); meta->Set(DC::CreationTime, &date[8]); date[8] = '\0'; meta->Set(DC::CreationDate, date); } // patient const char *patient = reader->GetPatientName(); meta->Set(DC::PatientName, patient); // set the metadata supplied on the command line if (options->series_description) { meta->Set(DC::SeriesDescription, options->series_description); } if (options->series_number) { meta->Set(DC::SeriesNumber, options->series_number); } // The DICOM orientation matrix vtkSmartPointer matrix = vtkSmartPointer::New(); // Use the center of the volume and distance from reference line double zoffset = 0.0; double center = 0.5*physdim[0]*(pixdim[0] - 1)/pixdim[0]; if (fileType == SCANCO_RAD) { // Convert localizer to DICOM coordinates (rotate) zoffset = reader->GetZPosition() - reader->GetReferenceLine(); double radToDICOM[16] = { 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, -center, 0.0, 1.0, 0.0, zoffset, 0.0, 0.0, 0.0, 1.0 }; matrix->DeepCopy(radToDICOM); } else { // Convert to DICOM patient coordinates as well as we can, // without knowing orientation of patient relative to scanner zoffset = reader->GetStartPosition() - reader->GetReferenceLine(); double rasToDICOM[16] = { -1.0, 0.0, 0.0, center, 0.0,-1.0, 0.0, center, 0.0, 0.0, 1.0, zoffset, 0.0, 0.0, 0.0, 1.0 }; matrix->DeepCopy(rasToDICOM); } // prepare the writer to write the image vtkSmartPointer writer = vtkSmartPointer::New(); writer->StreamingOn(); if (reader->GetDataScalarType() != VTK_SIGNED_CHAR) { vtkSmartPointer generator = vtkSmartPointer::New(); writer->SetGenerator(generator); } writer->SetMetaData(meta); writer->SetFilePrefix(outfile); writer->SetFilePattern("%s/IM-0001-%04.4d.dcm"); writer->SetPatientMatrix(matrix); writer->SetRescaleSlope(rescaleSlope); writer->SetRescaleIntercept(rescaleIntercept); writer->SetInputConnection(reader->GetOutputPort()); writer->SetFileSliceOrderToSame(); if (fileType == SCANCO_RAD) { writer->SetMemoryRowOrderToFileNative(); } else { writer->SetMemoryRowOrderToBottomUp(); } writer->Write(); scancotodicom_check_error(writer); } // This program will convert ScancoCT to DICOM int MAINMACRO(int argc, char *argv[]) { // redirect all VTK errors to stderr vtkConsoleOutputWindow::Install(); // for the list of input DICOM files vtkSmartPointer files = vtkSmartPointer::New(); scancotodicom_options options; scancotodicom_read_options(argc, argv, &options, files); // whether to silence VTK warnings and errors vtkObject::SetGlobalWarningDisplay(options.verbose); // set the UID prefix if (options.uid_prefix) { vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix); } // the output directory const char *outpath = options.output; if (!outpath) { fprintf(stderr, "\nNo output directory was specified (\'-o\' ).\n\n"); scancotodicom_usage(stderr, argv[0]); exit(1); } if (!options.input) { fprintf(stderr, "\nNo input file was specified.\n\n"); scancotodicom_usage(stderr, argv[0]); exit(1); } int code = vtkDICOMFileDirectory::Access(outpath, vtkDICOMFileDirectory::Out); if (code == vtkDICOMFileDirectory::AccessDenied) { fprintf(stderr, "Cannot write to directory: %s\n", outpath); exit(1); } else if (code == vtkDICOMFileDirectory::ImpossiblePath) { fprintf(stderr, "option -o must name a directory, not a file.\n"); exit(1); } else if (code == vtkDICOMFileDirectory::FileNotFound) { code = vtkDICOMFileDirectory::Create(outpath); if (code != vtkDICOMFileDirectory::Good) { fprintf(stderr, "Cannot create directory: %s\n", outpath); exit(1); } } scancotodicom_convert_one(&options, options.input, files, outpath); return 0; } vtk-dicom-0.8.12/Readme.txt000066400000000000000000000022071356440565500154530ustar00rootroot00000000000000DICOM for VTK Copyright (c) 2012-2019, David Gobbi All rights reserved. See Copyright.txt for more details. This package contains a set of classes for managing DICOM files and metadata from within VTK, and some utility programs for interrogating and converting DICOM files. Note that if you download the zip file from github, all of the files will have unix-style line endings. Windows users should therefore clone the respository with git, instead of downloading the zip file, otherwise they might have difficulty viewing and compiling the source code. The source should compile on Windows, OS X, and Linux. CMake is required to build the source. Detailed build instructions are given on the last page of the pdf file listed below. More information can be found on the following pages: http://dgobbi.github.io/vtk-dicom/ http://dgobbi.github.io/vtk-dicom/doc/api/pages.html http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf http://github.com/dgobbi/vtk-dicom/wiki/Command-Line-Tools A software quality dashboard is provided, with nightly builds on Linux (gcc 4.6) and Windows (Visual Studio 2015): http://my.cdash.org/index.php?project=vtk-dicom vtk-dicom-0.8.12/Source/000077500000000000000000000000001356440565500147545ustar00rootroot00000000000000vtk-dicom-0.8.12/Source/CMakeLists.txt000066400000000000000000000366641356440565500175330ustar00rootroot00000000000000# GDCM or DCMTK are required for reading compressed DICOM images option(USE_ITK_GDCM "Use ITK's GDCM for image decompression" OFF) option(USE_GDCM "Use GDCM for image decompression" OFF) option(USE_DCMTK "Use DCMTK for image decompression" OFF) # Check for sqlite3 for reading OsiriX databases set(USE_SQLITE_DEFAULT OFF) if(APPLE) set(USE_SQLITE_DEFAULT ON) endif() option(USE_SQLITE "Use SQLite for OsiriX databases" ${USE_SQLITE_DEFAULT}) # Configuration header set(DICOM_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) set(DICOM_BUILD_TESTING ${BUILD_TESTING}) set(DICOM_USE_GDCM ${USE_GDCM}) set(DICOM_USE_DCMTK ${USE_DCMTK}) set(DICOM_USE_SQLITE ${USE_SQLITE}) if(VTK_VERSION VERSION_LESS 7.0) set(DICOM_OVERRIDE "") set(DICOM_DELETE "") elseif(VTK_VERSION VERSION_LESS 7.1) set(DICOM_OVERRIDE " VTK_OVERRIDE") set(DICOM_DELETE "") elseif(VTK_VERSION VERSION_LESS 8.90) set(DICOM_OVERRIDE " VTK_OVERRIDE") set(DICOM_DELETE " VTK_DELETE_FUNCTION") else() set(DICOM_OVERRIDE " override") set(DICOM_DELETE " = delete") endif() configure_file(${DICOM_CMAKE_DIR}/vtkDICOMConfig.h.in "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMConfig.h" @ONLY) configure_file(${DICOM_CMAKE_DIR}/vtkDICOMBuild.h.in "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMBuild.h" @ONLY) # Include directories include_directories(${DICOM_INCLUDE_DIRS}) # Create the main library set(LIB_NAME vtkDICOM) if(WIN32) set(REFCOUNT_SRC vtkDICOMReferenceCount.cxx) else() set(REFCOUNT_HDR vtkDICOMReferenceCount.h) endif() # Sources in the current directory (library sources only!) set(LIB_SRCS vtkDICOMMetaData.cxx vtkDICOMDictionary.cxx vtkDICOMFilePath.cxx vtkDICOMFile.cxx vtkDICOMFileDirectory.cxx vtkDICOMTag.cxx vtkDICOMTagPath.cxx vtkDICOMVR.cxx vtkDICOMVM.cxx vtkDICOMCharacterSet.cxx vtkDICOMCharacterSetTables.cxx vtkDICOMDataElement.cxx vtkDICOMDictHash.cxx vtkDICOMDictEntry.cxx vtkDICOMDictPrivate.cxx vtkDICOMDirectory.cxx vtkDICOMFileSorter.cxx vtkDICOMGenerator.cxx vtkDICOMImageCodec.cxx vtkDICOMSCGenerator.cxx vtkDICOMCTGenerator.cxx vtkDICOMMRGenerator.cxx vtkDICOMParser.cxx vtkDICOMCompiler.cxx vtkDICOMReader.cxx vtkDICOMSliceSorter.cxx vtkDICOMSequence.cxx vtkDICOMItem.cxx vtkDICOMSorter.cxx ${REFCOUNT_SRC} vtkDICOMUtilities.cxx vtkDICOMUtilitiesUIDTable.cxx vtkDICOMValue.cxx vtkDICOMWriter.cxx vtkDICOMAlgorithm.cxx vtkDICOMLookupTable.cxx vtkDICOMApplyPalette.cxx vtkDICOMApplyRescale.cxx vtkDICOMToRAS.cxx vtkDICOMCTRectifier.cxx vtkDICOMMetaDataAdapter.cxx vtkDICOMUIDGenerator.cxx vtkNIFTIHeader.cxx vtkNIFTIReader.cxx vtkNIFTIWriter.cxx vtkScancoCTReader.cxx ) # Headers without a matching .cxx file are listed here set(LIB_HDRS ${REFCOUNT_HDR} vtkNIFTIPrivate.h ${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMBuild.h ${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMConfig.h ${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMModule.h ) # Internal headers (not installed) set(LIB_PRIVATE_HDRS vtkNIFTIPrivate.h ${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMBuild.h ) # Sources that are abstract set(LIB_ABSTRACT vtkDICOMGenerator.cxx ) # Sources that are not vtkObjects set(LIB_SPECIAL vtkDICOMFile.cxx vtkDICOMFileDirectory.cxx vtkDICOMFilePath.cxx vtkDICOMTag.cxx vtkDICOMTagPath.cxx vtkDICOMVR.cxx vtkDICOMVM.cxx vtkDICOMCharacterSet.cxx vtkDICOMCharacterSetTables.cxx vtkDICOMDictEntry.cxx vtkDICOMDictHash.cxx vtkDICOMDictionary.cxx vtkDICOMDictPrivate.cxx vtkDICOMDataElement.cxx vtkDICOMImageCodec.cxx ${REFCOUNT_SRC} vtkDICOMSequence.cxx vtkDICOMItem.cxx vtkDICOMValue.cxx vtkDICOMMetaDataAdapter.cxx vtkDICOMUtilitiesUIDTable.cxx ) set_source_files_properties(${LIB_HDRS} ${LIB_SPECIAL} PROPERTIES WRAP_EXCLUDE ON) set_source_files_properties(${LIB_ABSTRACT} PROPERTIES ABSTRACT ON) set_source_files_properties(${LIB_PRIVATE_HDRS} PROPERTIES SKIP_HEADER_INSTALL ON) # Third party library dependencies if(USE_ITK_GDCM) # To avoid conflicts, we might want to use ITK's GDCM find_package(ITK REQUIRED) if(ITK_FOUND) include(${ITK_USE_FILE}) set(GDCM_LIBS gdcmMSFF gdcmIOD gdcmDSED gdcmDICT) set(GDCM_FOUND 1) set(USE_GDCM ON CACHE BOOL "Use GDCM for image decompression" FORCE) endif() elseif(USE_GDCM) find_package(GDCM) if(NOT GDCM_DIR) message(FATAL_ERROR "Please set GDCM_DIR.") endif() if(GDCM_FOUND) include(${GDCM_USE_FILE}) set(GDCM_LIBS gdcmMSFF gdcmIOD gdcmDSED gdcmDICT) endif() endif() set(DCMTK_LIBS) if(USE_DCMTK) find_package(DCMTK) if(NOT DCMTK_FOUND) message(FATAL_ERROR "DCMTK not found or incomplete.") endif() if(${DCMTK_charls_LIBRARY}) set(DCMTK_LIBS ${DCMTK_LIBRARIES} ${DCMTK_charls_LIBRARY}) else() set(DCMTK_LIBS ${DCMTK_LIBRARIES}) endif() if(APPLE) list(APPEND DCMTK_LIBS iconv) endif() include_directories(${DCMTK_INCLUDE_DIRS}) endif() set(SQLITE_LIBS) if(USE_SQLITE) set(SQLITE_LIBS sqlite3) endif() # Create the library if(DEFINED VTK_MODULE_ENABLE_VTK_DICOM) # When building as a module for VTK 8.90 or later set(LIB_SRC_HDRS) foreach(_src ${LIB_SRCS}) get_filename_component(_base ${_src} NAME_WE) list(APPEND LIB_SRC_HDRS ${_base}.h) endforeach() vtk_module_add_module(VTK::DICOM SOURCES ${LIB_SRCS} HEADERS ${LIB_SRC_HDRS} ${LIB_HDRS}) vtk_module_link(VTK::DICOM PRIVATE ${GDCM_LIBS} ${DCMTK_LIBS} ${SQLITE_LIBS}) elseif(Module_vtkDICOM) # When building as a remote module for older versions of VTK vtk_module_library(vtkDICOM ${LIB_SRCS} ${LIB_HDRS}) target_link_libraries(${LIB_NAME} LINK_PRIVATE ${GDCM_LIBS} ${DCMTK_LIBS} ${SQLITE_LIBS}) else() # The remainder of the file is for old, non-modular builds configure_file(${DICOM_CMAKE_DIR}/vtkDICOMModule.h.in "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMModule.h" COPYONLY) # Automatically find the header for each cxx file foreach(arg ${LIB_SRCS}) get_filename_component(src "${arg}" ABSOLUTE) string(REGEX REPLACE "\\.(cxx|c|mm|m)$" ".h" hdr "${src}") if("${hdr}" MATCHES "\\.h$" AND EXISTS "${hdr}") list(APPEND LIB_HDRS "${hdr}") endif() endforeach() # Create the hierarchy file if(${VTK_VERSION} VERSION_GREATER 5) if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS) set_source_files_properties(${LIB_SPECIAL} PROPERTIES WRAP_SPECIAL ON) set(MODULE_HIERARCHY_NAME ${LIB_NAME}Hierarchy) # _LINK_DEPENDS is a variable suffix from the VTK 6 module macros set(${LIB_NAME}_LINK_DEPENDS ${VTK_LIBS} ${ZLIB_LIBS}) include(vtkWrapHierarchy) vtk_wrap_hierarchy(${LIB_NAME} ${CMAKE_CURRENT_BINARY_DIR} "${LIB_SRCS}") set(KIT_HIERARCHY_FILE ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.txt) set(LIB_HIERARCHY_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.stamp.txt) endif() endif() # Set the library name suffix for VTK 6 libraries set(LIB_NAME_SUFFIX "-${VTK_VERSION}") if(DEFINED VTK_CUSTOM_LIBRARY_SUFFIX) set(LIB_NAME_SUFFIX "${VTK_CUSTOM_LIBRARY_SUFFIX}") endif() # Create the library add_library(${LIB_NAME} ${LIB_SRCS} ${LIB_HIERARCHY_STAMP}) if(VTK_VERSION VERSION_GREATER 5) set_target_properties(${LIB_NAME} PROPERTIES OUTPUT_NAME ${LIB_NAME}${LIB_NAME_SUFFIX}) endif() set_target_properties(${LIB_NAME} PROPERTIES VERSION "${PROJECT_VERSION}" SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}") if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS AND NOT (CMAKE_VERSION VERSION_LESS 2.8)) set_target_properties(${LIB_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() target_link_libraries(${LIB_NAME} LINK_PUBLIC ${VTK_LIBS}) target_link_libraries(${LIB_NAME} LINK_PRIVATE ${ZLIB_LIBS} ${GDCM_LIBS} ${DCMTK_LIBS} ${SQLITE_LIBS}) # Wrappers if(BUILD_PYTHON_WRAPPERS) set(MODULE_PYTHON_NAME ${LIB_NAME}Python) set(${LIB_NAME}_WRAP_DEPENDS ${VTK_LIBS}) if(VTK_VERSION VERSION_GREATER 5) include(vtkWrapPython) include_directories(${vtkPython_INCLUDE_DIRS}) set(VTK_PYTHON_LIBRARIES ${vtkPython_LIBRARIES}) set(LIB_PYTHON_LIBS vtkWrappingPythonCore) else() # Tell vtkWrapPython to locate the python libraries for us. set(VTK_WRAP_PYTHON_FIND_LIBS ON) include(vtkWrapPython) if(VTK_PYTHON_INCLUDE_DIR) include_directories("${VTK_PYTHON_INCLUDE_DIR}") endif() set(LIB_PYTHON_LIBS vtkPythonCore) endif() vtk_wrap_python3(${MODULE_PYTHON_NAME} LIB_PYTHON_SRCS "${LIB_SRCS}") if(DICOM_PYTHON_LIBRARIES) # do things the old way, with PythonD libraries set(XY) # Get python version, e.g. 27 for python 2.7 if(vtkPython_LIBRARIES) list(GET vtkPython_LIBRARIES 0 TMP_LIB_NAME) get_filename_component(TMP_NAME "${TMP_LIB_NAME}" NAME) string(REGEX REPLACE "^[^0-9]*([0-9])\\.*([0-9]).*$" "\\1\\2" XY "${TMP_NAME}") if(NOT XY) set(XY) endif() endif() set(LIB_PYTHON_NAME ${LIB_NAME}PythonD) set(LIB_PYTHON_OUTPUT_NAME ${LIB_NAME}Python${XY}D) if(VTK_VERSION VERSION_GREATER 5) set(LIB_PYTHON_OUTPUT_NAME ${LIB_PYTHON_OUTPUT_NAME}${LIB_NAME_SUFFIX}) endif() foreach(TMP_LIB ${VTK_LIBS}) set(LIB_PYTHON_LIBS ${LIB_PYTHON_LIBS} ${TMP_LIB}PythonD) endforeach() add_library(${LIB_PYTHON_NAME} ${LIB_PYTHON_SRCS} ${LIB_PYTHON_EXTRA_SRCS}) if(NOT (CMAKE_VERSION VERSION_LESS 2.8)) set_target_properties(${LIB_PYTHON_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() set_target_properties(${LIB_PYTHON_NAME} PROPERTIES VERSION "${PROJECT_VERSION}" SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}" OUTPUT_NAME "${LIB_PYTHON_OUTPUT_NAME}") target_link_libraries(${LIB_PYTHON_NAME} LINK_PUBLIC ${LIB_NAME} ${LIB_PYTHON_LIBS}) # On Win32 and Mac, link python library non-private if(WIN32 OR APPLE) target_link_libraries(${LIB_PYTHON_NAME} LINK_PUBLIC ${VTK_PYTHON_LIBRARIES}) else() target_link_libraries(${LIB_PYTHON_NAME} LINK_PRIVATE ${VTK_PYTHON_LIBRARIES}) endif() if(KIT_PYTHON_DEPS) add_dependencies(${LIB_PYTHON_NAME} ${KIT_PYTHON_DEPS}) endif() add_library(${MODULE_PYTHON_NAME} MODULE ${MODULE_PYTHON_NAME}Init.cxx) target_link_libraries(${MODULE_PYTHON_NAME} ${LIB_PYTHON_NAME}) else() # do things the new way, without PythonD libraries add_library(${MODULE_PYTHON_NAME} MODULE ${MODULE_PYTHON_NAME}Init.cxx ${LIB_PYTHON_SRCS} ${LIB_PYTHON_EXTRA_SRCS}) target_link_libraries(${MODULE_PYTHON_NAME} LINK_PRIVATE ${LIB_NAME} ${LIB_PYTHON_LIBS} ${VTK_PYTHON_LIBRARIES}) if(KIT_PYTHON_DEPS) add_dependencies(${MODULE_PYTHON_NAME} ${KIT_PYTHON_DEPS}) endif() endif() set_target_properties(${MODULE_PYTHON_NAME} PROPERTIES PREFIX "") if(WIN32 AND NOT CYGWIN) set_target_properties(${MODULE_PYTHON_NAME} PROPERTIES SUFFIX ".pyd") endif() if(CMAKE_VERSION VERSION_GREATER 2.8.8) set_target_properties(${MODULE_PYTHON_NAME} PROPERTIES NO_SONAME 1) endif() endif() if(BUILD_TCL_WRAPPERS) set(LIB_TCL_NAME ${LIB_NAME}TCL) string(TOLOWER ${LIB_NAME} MODULE_TCL_NAME) set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME}) if(VTK_VERSION VERSION_GREATER 5) set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME}${LIB_NAME_SUFFIX}) endif() set(LIB_TCL_LIBS) foreach(TMP_LIB ${VTK_LIBS}) set(LIB_TCL_LIBS ${LIB_TCL_LIBS} ${TMP_LIB}TCL) endforeach() if(VTK_TCL_INCLUDE_DIR) include_directories("${VTK_TCL_INCLUDE_DIR}") endif() include(vtkWrapTcl) vtk_wrap_tcl3(${LIB_TCL_NAME} LIB_TCL_SRCS "${LIB_SRCS}" "") add_library(${LIB_TCL_NAME} ${LIB_TCL_SRCS} ${LIB_TCL_EXTRA_SRCS} ${LIB_HIERARCHY_STAMP}) target_link_libraries(${LIB_TCL_NAME} LINK_PUBLIC ${LIB_NAME} ${LIB_TCL_LIBS}) if(KIT_TCL_DEPS) add_dependencies(${LIB_TCL_NAME} ${KIT_TCL_DEPS}) endif() set_target_properties(${LIB_TCL_NAME} PROPERTIES OUTPUT_NAME ${LIB_TCL_OUTPUT_NAME}) # create the pkgIndex.tcl file if(CMAKE_CONFIGURATION_TYPES) foreach(config ${CMAKE_CONFIGURATION_TYPES}) set(MODULE_TCL_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}") configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}/pkgIndex.tcl" @ONLY) endforeach() else() set(MODULE_TCL_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgIndex.tcl" @ONLY) endif() set(MODULE_TCL_PATH ${DICOM_LIBRARY_INSTALL_DEST}) configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in "${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl" @ONLY) endif() if(BUILD_JAVA_WRAPPERS) set(VTK_WRAP_JAVA3_INIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(VTK_JAVA_HOME ${CMAKE_CURRENT_BINARY_DIR}/java/vtk) set(VTK_JAVA_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/java/manifest.txt) make_directory(${VTK_JAVA_HOME}) make_directory(${CMAKE_CURRENT_BINARY_DIR}/javajar/vtk) set(LIB_JAVA_NAME ${LIB_NAME}Java) set(LIB_JAVA_LIBS) foreach(TMP_LIB ${VTK_LIBS}) set(LIB_JAVA_LIBS ${LIB_JAVA_LIBS} ${TMP_LIB}Java) endforeach() if(VTK_JAVA_INCLUDE_DIR) include_directories("${VTK_JAVA_INCLUDE_DIR}") else() include_directories("${JAVA_INCLUDE_PATH}" "${JAVA_INCLUDE_PATH2}") endif() include(vtkWrapJava) vtk_wrap_java3(${LIB_JAVA_NAME} LIB_JAVA_SRCS "${LIB_SRCS}") add_library(${LIB_JAVA_NAME} SHARED ${LIB_JAVA_SRCS} ${LIB_JAVA_EXTRA_SRCS}) if(APPLE) set_target_properties(${LIB_JAVA_NAME} PROPERTIES SUFFIX ".jnilib") endif() if(CMAKE_VERSION VERSION_GREATER 2.8.8) set_target_properties(${LIB_JAVA_NAME} PROPERTIES NO_SONAME 1) endif() target_link_libraries(${LIB_JAVA_NAME} ${LIB_NAME} ${LIB_JAVA_LIBS}) add_dependencies(${LIB_JAVA_NAME} ${LIB_NAME}) if(KIT_JAVA_DEPS) add_dependencies(${LIB_JAVA_NAME} ${KIT_JAVA_DEPS}) endif() set(_sep ":") if(WIN32) set(_sep "\\;") endif() add_custom_target(${LIB_NAME}JavaJar ALL DEPENDS ${VTK_JAR_PATH}/vtkdicom.jar) add_custom_target(${LIB_NAME}JavaClasses ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/java/javac_stamp.txt) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/java/javac_stamp.txt DEPENDS ${VTK_JAVA_DEPENDENCIES} COMMAND ${JAVA_COMPILE} ${JAVAC_OPTIONS} -source ${VTK_JAVA_SOURCE_VERSION} -target ${VTK_JAVA_TARGET_VERSION} -classpath ${VTK_JAVA_JAR}${_sep}${VTK_DIR}/java -sourcepath ${VTK_DIR}/java/vtk/ -d ${CMAKE_CURRENT_BINARY_DIR}/javajar ${CMAKE_CURRENT_BINARY_DIR}/java/vtk/*.java COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/java/javac_stamp.txt COMMENT "Compiling Java Classes" ) file(WRITE ${VTK_JAVA_MANIFEST} "Class-Path: vtk.jar\n") add_custom_command( COMMAND ${JAVA_ARCHIVE} -cvfm "${VTK_JAR_PATH}/vtkdicom.jar" ${VTK_JAVA_MANIFEST} -C ${CMAKE_CURRENT_BINARY_DIR}/javajar vtk DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/java/javac_stamp.txt ${JAVA_LIBRARIES} OUTPUT ${VTK_JAR_PATH}/vtkdicom.jar COMMENT "Java Archive" ) endif() # Set the install rules for the library install(TARGETS ${LIB_NAME} ${LIB_PYTHON_NAME} ${MODULE_PYTHON_NAME} ${LIB_TCL_NAME} ${LIB_JAVA_NAME} EXPORT DICOMTargets RUNTIME DESTINATION ${DICOM_RUNTIME_INSTALL_DEST} COMPONENT RuntimeLibraries LIBRARY DESTINATION ${DICOM_LIBRARY_INSTALL_DEST} COMPONENT RuntimeLibraries ARCHIVE DESTINATION ${DICOM_ARCHIVE_INSTALL_DEST} COMPONENT Development) if(BUILD_TCL_WRAPPERS) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl DESTINATION ${DICOM_TCL_INSTALL_DEST}) endif() if(BUILD_JAVA_WRAPPERS) install(FILES ${VTK_JAR_PATH}/vtkdicom.jar DESTINATION ${DICOM_JAVA_INSTALL_DEST}) endif() install(FILES ${LIB_HDRS} DESTINATION ${DICOM_INCLUDE_INSTALL_DEST} COMPONENT Development) endif() vtk-dicom-0.8.12/Source/JavaDependencies.cmake.in000066400000000000000000000002211356440565500215460ustar00rootroot00000000000000# This file is automatically generated by CMake VTK_WRAP_JAVA SET(VTK_JAVA_DEPENDENCIES ${VTK_JAVA_DEPENDENCIES} @VTK_JAVA_DEPENDENCIES_FILE@ ) vtk-dicom-0.8.12/Source/dicom.module000066400000000000000000000004111356440565500172520ustar00rootroot00000000000000NAME VTK::DICOM LIBRARY_NAME vtkDICOM GROUPS StandAlone DEPENDS VTK::CommonCore VTK::CommonDataModel VTK::CommonExecutionModel VTK::IOImage PRIVATE_DEPENDS VTK::CommonMisc VTK::ImagingCore VTK::IOCore VTK::zlib TEST_DEPENDS VTK::TestingCore vtk-dicom-0.8.12/Source/vtkDICOMAlgorithm.cxx000066400000000000000000000132171356440565500207330ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMAlgorithm.h" #include "vtkDICOMMetaData.h" #include "vtkObjectFactory.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkInformationDataObjectKey.h" #include "vtkInformationDoubleVectorKey.h" #include "vtkImageData.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkMatrix4x4.h" #include "vtkAlgorithmOutput.h" #include "vtkTrivialProducer.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" vtkStandardNewMacro(vtkDICOMAlgorithm); vtkInformationKeyMacro(vtkDICOMAlgorithm, PATIENT_MATRIX, DoubleVector); vtkInformationKeyMacro(vtkDICOMAlgorithm, META_DATA, DataObject); //---------------------------------------------------------------------------- vtkDICOMAlgorithm::vtkDICOMAlgorithm() { } //---------------------------------------------------------------------------- vtkDICOMAlgorithm::~vtkDICOMAlgorithm() { } //---------------------------------------------------------------------------- void vtkDICOMAlgorithm::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- vtkInformation *vtkDICOMAlgorithm::GetMetaDataInformation( vtkInformationVector** inputVector, int inputPort, int inputConnection) { vtkInformation *inInfo = inputVector[inputPort]->GetInformationObject(inputConnection); // If SetInputConnection was used, meta data is attached to inInfo vtkInformation *metaInfo = inInfo; // If SetInputData was used, the meta data is attached to the data vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0); if (sourceConnection) { // SetInputData causes a vtkTrivialProducer to be used vtkAlgorithm *producer = sourceConnection->GetProducer(); if (producer && vtkTrivialProducer::SafeDownCast(producer)) { vtkDataObject *inputData = producer->GetOutputDataObject(0); if (inputData) { metaInfo = inputData->GetInformation(); } } } return metaInfo; } //---------------------------------------------------------------------------- void vtkDICOMAlgorithm::CopyMetaDataToOutputInformation( vtkInformationVector** inputVector, int inputPort, int inputConnection, vtkInformationVector* outputVector, int outputPort) { // If SetInputConnection was used, meta data is attached to inInfo vtkInformation *metaInfo = this->GetMetaDataInformation( inputVector, inputPort, inputConnection); // Set the output port to copy the meta data to int firstPort = outputPort; int lastPort = outputPort; if (outputPort < 0) { firstPort = 0; lastPort = this->GetNumberOfOutputPorts() - 1; } // Copy the meta data downstream for (int port = firstPort; port <= lastPort; port++) { vtkInformation *outInfo = outputVector->GetInformationObject(port); // Matrix is stored as a vector of 16 doubles outInfo->CopyEntry(metaInfo, PATIENT_MATRIX()); // MetaData object must be shallow-copied vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast( metaInfo->Get(META_DATA())); if (meta) { vtkSmartPointer outMeta = vtkSmartPointer::New(); outMeta->ShallowCopy(meta); outInfo->Set(META_DATA(), outMeta); } } } //---------------------------------------------------------------------------- void vtkDICOMAlgorithm::CopyMetaDataToOutputData( vtkInformation *info, vtkDataObject *data) { vtkInformation *dataInfo = data->GetInformation(); dataInfo->CopyEntry(info, META_DATA()); dataInfo->CopyEntry(info, PATIENT_MATRIX()); } //---------------------------------------------------------------------------- int vtkDICOMAlgorithm::RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // Copy the meta data to the output information if (this->GetNumberOfInputPorts() > 0 && this->GetNumberOfInputConnections(0) > 0) { this->CopyMetaDataToOutputInformation( inputVector, 0, 0, outputVector, -1); } return this->Superclass::RequestInformation( request, inputVector, outputVector); } //---------------------------------------------------------------------------- int vtkDICOMAlgorithm::RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // Copy the meta data downstream int numPorts = this->GetNumberOfOutputPorts(); for (int port = 0; port < numPorts; port++) { vtkInformation *outInfo = outputVector->GetInformationObject(port); vtkImageData *outData = vtkImageData::SafeDownCast( outInfo->Get(vtkDataObject::DATA_OBJECT())); if (outData) { this->CopyMetaDataToOutputData(outInfo, outData); } } return this->Superclass::RequestData(request, inputVector, outputVector); } //---------------------------------------------------------------------------- void vtkDICOMAlgorithm::ThreadedRequestData( vtkInformation *, vtkInformationVector **, vtkInformationVector *, vtkImageData ***, vtkImageData **, int [6], int) { vtkWarningMacro("ThreadedRequestData: This method was not implemented in " << this->GetClassName()); } vtk-dicom-0.8.12/Source/vtkDICOMAlgorithm.h000066400000000000000000000067541356440565500203700ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMAlgorithm * \brief Superclass for DICOM image filters * * This class allows the DICOM meta data to be carried by the VTK pipeline. * Subclasses should always call Superclass::RequestInformation() and * Superclass::RequestData within their own RequestInformation and * RequestData methods. */ #ifndef vtkDICOMAlgorithm_h #define vtkDICOMAlgorithm_h #include "vtkThreadedImageAlgorithm.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkLookupTable; class vtkInformationDataObjectKey; class vtkInformationDoubleVectorKey; class vtkDICOMMetaData; class vtkDICOMPerFilePalette; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMAlgorithm : public vtkThreadedImageAlgorithm { public: vtkTypeMacro(vtkDICOMAlgorithm, vtkThreadedImageAlgorithm); //@{ //! Static method for construction. static vtkDICOMAlgorithm *New(); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@} //@{ //! The information key for the meta data. static vtkInformationDataObjectKey *META_DATA(); //! A key to get the patient matrix from the VTK pipeline. static vtkInformationDoubleVectorKey *PATIENT_MATRIX(); //@} protected: vtkDICOMAlgorithm(); ~vtkDICOMAlgorithm(); //@{ //! Get the information object that holds the meta data for the given input. vtkInformation *GetMetaDataInformation( vtkInformationVector** inputVector, int inputPort, int inputConnection); //! Copy the meta data from an input connection to an output port. /*! * This is called by RequestInformation. To copy the meta data to * all output ports, use "-1" as the output port. */ virtual void CopyMetaDataToOutputInformation( vtkInformationVector** inputVector, int inputPort, int inputConnection, vtkInformationVector* outputVector, int outputPort); //! Copy the meta data from the output information to the output data. /*! * This is called by RequestData. */ virtual void CopyMetaDataToOutputData( vtkInformation *outInfo, vtkDataObject *outData); //@} int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; void ThreadedRequestData( vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***inData, vtkImageData **outData, int ext[6], int id) VTK_DICOM_OVERRIDE; private: #ifdef VTK_DICOM_DELETE vtkDICOMAlgorithm(const vtkDICOMAlgorithm&) VTK_DICOM_DELETE; void operator=(const vtkDICOMAlgorithm&) VTK_DICOM_DELETE; #else vtkDICOMAlgorithm(const vtkDICOMAlgorithm&) = delete; void operator=(const vtkDICOMAlgorithm&) = delete; #endif }; #endif // vtkDICOMAlgorithm_h vtk-dicom-0.8.12/Source/vtkDICOMApplyPalette.cxx000066400000000000000000000321021356440565500214030ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMApplyPalette.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMLookupTable.h" #include "vtkObjectFactory.h" #include "vtkDataSetAttributes.h" #include "vtkImageData.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkIntArray.h" #include "vtkPointData.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" #include "vtkTemplateAliasMacro.h" // turn off types that never occur in DICOM palette images # undef VTK_USE_INT64 # define VTK_USE_INT64 0 # undef VTK_USE_UINT64 # define VTK_USE_UINT64 0 # undef VTK_USE_INT32 # define VTK_USE_INT32 0 # undef VTK_USE_UINT32 # define VTK_USE_UINT32 0 # undef VTK_USE_FLOAT64 # define VTK_USE_FLOAT64 0 # undef VTK_USE_FLOAT32 # define VTK_USE_FLOAT32 0 #include #include vtkStandardNewMacro(vtkDICOMApplyPalette); class vtkDICOMPerFilePalette : public std::vector > { }; //---------------------------------------------------------------------------- vtkDICOMApplyPalette::vtkDICOMApplyPalette() { this->Palette = 0; this->IsSupplemental = false; } //---------------------------------------------------------------------------- vtkDICOMApplyPalette::~vtkDICOMApplyPalette() { delete this->Palette; } //---------------------------------------------------------------------------- void vtkDICOMApplyPalette::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- namespace { template void vtkDICOMApplyPaletteExecute( vtkDICOMApplyPalette *self, vtkImageData *inData, T *inPtr0, vtkImageData *outData, unsigned char *outPtr0, int extent[6], vtkDICOMPerFilePalette *palette, bool supplemental, int id) { vtkInformation *dataInfo = outData->GetInformation(); vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast( dataInfo->Get(vtkDICOMAlgorithm::META_DATA())); vtkIdType inIncX, inIncY, inIncZ; inData->GetIncrements(inIncX, inIncY, inIncZ); vtkIdType outIncX, outIncY, outIncZ; outData->GetIncrements(outIncX, outIncY, outIncZ); int inputComponents = inData->GetNumberOfScalarComponents(); int outputComponents = outData->GetNumberOfScalarComponents(); // target for progress tracking vtkIdType target = inputComponents; target *= extent[5] - extent[4] + 1; target *= extent[3] - extent[2] + 1; vtkIdType progress = 0; for (int c = 0; c < inputComponents; c++) { T *inPtrC = inPtr0 + c; unsigned char *outPtrC = outPtr0 + 3*c; for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++) { int i = meta->GetFileIndex(zIdx, c, inputComponents); int f = meta->GetFrameIndex(zIdx, c, inputComponents); i = (i >= 0 ? i : 0); vtkDICOMLookupTable *table = (*(palette))[i]; double range[2]; table->GetTableRange(range); int firstValueMapped = static_cast(range[0]); int maxIdx = static_cast(range[1]) - firstValueMapped; if (maxIdx >= table->GetNumberOfColors()) { maxIdx = table->GetNumberOfColors() - 1; } const unsigned char *rgba = table->GetPointer(0); T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ; unsigned char *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ; // for monochrome mapping when palette is supplemental bool monochrome = false; double windowCenter = 0.0; double windowWidth = 1.0; double slope = 1.0; double inter = 0.0; bool isSigmoid = false; bool isLinearExact = false; if (supplemental) { // check if this frame is specifically monochrome monochrome = meta->Get(i, f, DC::PixelPresentation).Matches( "MONOCHROME*"); // use the window that is suggested in the data const vtkDICOMValue& wc = meta->Get(i, f, DC::WindowCenter); const vtkDICOMValue& ww = meta->Get(i, f, DC::WindowWidth); if (wc.IsValid() && ww.IsValid()) { windowCenter = wc.AsDouble(); windowWidth = ww.AsDouble(); } // check which function to apply const vtkDICOMValue& wf = meta->Get(i, f, DC::VOILUTFunction); if (wf.IsValid()) { isLinearExact = wf.Matches("LINEAR_EXACT"); isSigmoid = wf.Matches("SIGMOID"); } // for CT images, the rescaling must be taken into account const vtkDICOMValue& rs = meta->Get(i, f, DC::RescaleSlope); const vtkDICOMValue& ri = meta->Get(i, f, DC::RescaleIntercept); if (rs.IsValid() && ri.IsValid()) { slope = rs.AsDouble(); inter = ri.AsDouble(); if (slope == 0.0) { slope = 1.0; } } } // these values are used to compute the VOI LUT (DICOM PS3.3 C.11.2.1) double ww = windowWidth; double wc = windowCenter; if (!isLinearExact && !isSigmoid) { ww -= 1.0; wc -= 0.5; } ww = ww/slope; wc = (wc - inter)/slope; if (ww < 0.0) { ww = 0.0; } double ws = (isSigmoid ? -4.0 : 255.0); if (ww != 0.0) { ws /= ww; } else { ws = 1.0; isSigmoid = false; } double wl = wc - 0.5*ww; double wh = wc + 0.5*ww; // loop through slices for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++) { T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]); unsigned char *outPtr = outPtrZ + outIncY*(yIdx - extent[2]); // in base thread, report progress every 2% of the way to 100% if (id == 0) { ++progress; vtkIdType icount = progress*50/target; if (progress == icount*target/50) { self->UpdateProgress(progress*1.0/target); } } for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++) { int idx = inPtr[0] - firstValueMapped; if (monochrome || (supplemental && idx < 0)) { double fidx = inPtr[0]; if (isSigmoid) { fidx = 255.0/(1.0 + exp((fidx - wc)*ws)); } else if (fidx <= wl) { fidx = 0.0; } else if (fidx > wh) { fidx = 255.0; } else { fidx = (fidx - wc)*ws + 127.5; fidx = (fidx >= 0.0 ? fidx : 0.0); fidx = (fidx <= 255.0 ? fidx : 255.0); } int gray = static_cast(fidx + 0.5); outPtr[0] = gray; outPtr[1] = gray; outPtr[2] = gray; } else { // use color idx = (idx >= 0 ? idx : 0); idx = (idx <= maxIdx ? idx : maxIdx); const unsigned char *rgb = rgba + 4*idx; outPtr[0] = rgb[0]; outPtr[1] = rgb[1]; outPtr[2] = rgb[2]; } inPtr += inputComponents; outPtr += outputComponents; } } } } } } // end anonymous namespace //---------------------------------------------------------------------------- int vtkDICOMApplyPalette::RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { this->Superclass::RequestInformation(request, inputVector, outputVector); // Get the scalar information vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation(inInfo, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get(vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); // Get the meta data vtkInformation *metaInfo = this->GetMetaDataInformation(inputVector, 0, 0); vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast( metaInfo->Get(vtkDICOMAlgorithm::META_DATA())); // Bypass unless there is a palette to apply delete this->Palette; this->Palette = 0; this->IsSupplemental = 0; bool hasPalette = false; if (meta && meta->Get(DC::SamplesPerPixel).Matches(1)) { // Check if PhotometricInterpretation is PALETTE COLOR const vtkDICOMValue& u = meta->Get(DC::PhotometricInterpretation); hasPalette = u.Matches("PALETTE?COLOR"); // Check the PixelPresentation (enhanced files) const vtkDICOMValue& v = meta->Get(DC::PixelPresentation); this->IsSupplemental = (v.Matches("COLOR") || v.Matches("MIXED") || v.Matches("TRUE_COLOR")); hasPalette |= this->IsSupplemental; } // Modify the information if (hasPalette) { // By setting Palette, we let RequestData know that there is a palette this->Palette = new vtkDICOMPerFilePalette; scalarType = VTK_UNSIGNED_CHAR; numComponents *= 3; // Set the output information. vtkInformation* outInfo = outputVector->GetInformationObject(0); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, scalarType, numComponents); // Modify the meta data, the image has become an RGB image vtkDICOMMetaData *outMeta = vtkDICOMMetaData::SafeDownCast( outInfo->Get(vtkDICOMAlgorithm::META_DATA())); outMeta->Set(DC::SamplesPerPixel, 3); outMeta->Set(DC::PhotometricInterpretation, "RGB"); outMeta->Set(DC::PixelRepresentation, 0); outMeta->Set(DC::BitsAllocated, 8); outMeta->Set(DC::BitsStored, 8); outMeta->Set(DC::HighBit, 7); outMeta->Erase(DC::RedPaletteColorLookupTableDescriptor); outMeta->Erase(DC::GreenPaletteColorLookupTableDescriptor); outMeta->Erase(DC::BluePaletteColorLookupTableDescriptor); outMeta->Erase(DC::RedPaletteColorLookupTableData); outMeta->Erase(DC::GreenPaletteColorLookupTableData); outMeta->Erase(DC::BluePaletteColorLookupTableData); outMeta->Erase(DC::SegmentedRedPaletteColorLookupTableData); outMeta->Erase(DC::SegmentedGreenPaletteColorLookupTableData); outMeta->Erase(DC::SegmentedBluePaletteColorLookupTableData); } return 1; } //---------------------------------------------------------------------------- int vtkDICOMApplyPalette::RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // Get the meta data vtkInformation *metaInfo = this->GetMetaDataInformation(inputVector, 0, 0); vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast( metaInfo->Get(vtkDICOMAlgorithm::META_DATA())); // Passthrough if there is no palette to apply if (meta == 0 || this->Palette == 0) { vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkImageData *inData = vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkImageData *outData = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); outData->CopyStructure(inData); outData->GetPointData()->PassData(inData->GetPointData()); return 1; } // Build the lookup tables for all files that make up the volume int n = meta->GetNumberOfInstances(); this->Palette->resize(n); for (int i = 0; i < n; i++) { (*(this->Palette))[i] = vtkSmartPointer::New(); (*(this->Palette))[i]->BuildImagePalette(meta, i); } // Allow the superclass to call the ThreadedRequestData method int rval = this->Superclass::RequestData( request, inputVector, outputVector); this->Palette->clear(); return rval; } //---------------------------------------------------------------------------- void vtkDICOMApplyPalette::ThreadedRequestData( vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***, vtkImageData **, int extent[6], int id) { vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkImageData *inData = vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkImageData *outData = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); int scalarType = inData->GetScalarType(); void *inVoidPtr = inData->GetScalarPointerForExtent(extent); void *outVoidPtr = outData->GetScalarPointerForExtent(extent); switch (scalarType) { vtkTemplateAliasMacro( vtkDICOMApplyPaletteExecute( this, inData, static_cast(inVoidPtr), outData, static_cast(outVoidPtr), extent, this->Palette, this->IsSupplemental, id)); } } vtk-dicom-0.8.12/Source/vtkDICOMApplyPalette.h000066400000000000000000000053631356440565500210410ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMApplyPalette * \brief Apply palette to PALETTE COLOR images * * If an image contains a palette LUT, then this filter will apply that * LUT to the image and produce an RGB image. Images without a palette * LUT will pass through unchanged. If the image uses a supplemental * palette that only applies to a specific range of pixel values, then * pixel values outside of that range will be mapped to greyscale via * the WindowWidth and WindowCenter specified in the image. * * \warning If this filter is used, then AutoRescaleOff() should be set on * the reader to ensure that the reader does not rescale the data. */ #ifndef vtkDICOMApplyPalette_h #define vtkDICOMApplyPalette_h #include "vtkDICOMAlgorithm.h" #include "vtkDICOMModule.h" // For export macro class vtkDICOMMetaData; class vtkDICOMPerFilePalette; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMApplyPalette : public vtkDICOMAlgorithm { public: static vtkDICOMApplyPalette *New(); vtkTypeMacro(vtkDICOMApplyPalette, vtkDICOMAlgorithm); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; protected: vtkDICOMApplyPalette(); ~vtkDICOMApplyPalette(); int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; void ThreadedRequestData( vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***inData, vtkImageData **outData, int ext[6], int id) VTK_DICOM_OVERRIDE; //! Container for the lookup tables used. vtkDICOMPerFilePalette *Palette; //! True if palette is supplemental. bool IsSupplemental; private: #ifdef VTK_DICOM_DELETE vtkDICOMApplyPalette(const vtkDICOMApplyPalette&) VTK_DICOM_DELETE; void operator=(const vtkDICOMApplyPalette&) VTK_DICOM_DELETE; #else vtkDICOMApplyPalette(const vtkDICOMApplyPalette&) = delete; void operator=(const vtkDICOMApplyPalette&) = delete; #endif }; #endif // vtkDICOMApplyPalette_h vtk-dicom-0.8.12/Source/vtkDICOMApplyRescale.cxx000066400000000000000000000301221356440565500213630ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMApplyRescale.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMItem.h" #include "vtkObjectFactory.h" #include "vtkImageData.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkIntArray.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkDataSetAttributes.h" #include "vtkPointData.h" #include "vtkSmartPointer.h" #include "vtkTypeTraits.h" #include "vtkVersion.h" #include "vtkTemplateAliasMacro.h" // turn off unused input types # undef VTK_USE_INT64 # define VTK_USE_INT64 0 # undef VTK_USE_UINT64 # define VTK_USE_UINT64 0 # undef VTK_USE_INT32 # define VTK_USE_INT32 0 # undef VTK_USE_UINT32 # define VTK_USE_UINT32 0 # undef VTK_USE_FLOAT64 # define VTK_USE_FLOAT64 0 # undef VTK_USE_FLOAT32 # define VTK_USE_FLOAT32 0 #include #include vtkStandardNewMacro(vtkDICOMApplyRescale); //---------------------------------------------------------------------------- // A struct to hold the mapping class vtkDICOMRealWorldMapping { public: int First; int Last; double Slope; double Intercept; const double *Map; }; //---------------------------------------------------------------------------- vtkDICOMApplyRescale::vtkDICOMApplyRescale() { this->OutputScalarType = VTK_DOUBLE; this->Mapping = 0; } //---------------------------------------------------------------------------- vtkDICOMApplyRescale::~vtkDICOMApplyRescale() { delete [] this->Mapping; } //---------------------------------------------------------------------------- void vtkDICOMApplyRescale::SetOutputScalarType(int t) { if (t != this->OutputScalarType && (t == VTK_DOUBLE || t == VTK_FLOAT)) { this->OutputScalarType = t; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMApplyRescale::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << this->OutputScalarType << "\n"; } //---------------------------------------------------------------------------- namespace { template void vtkDICOMApplyRescaleExecute( vtkDICOMApplyRescale *self, vtkImageData *inData, T *inPtr0, vtkImageData *outData, F *outPtr0, vtkDICOMRealWorldMapping *mapArray, int extent[6], int id) { vtkIdType inIncX, inIncY, inIncZ; inData->GetIncrements(inIncX, inIncY, inIncZ); vtkIdType outIncX, outIncY, outIncZ; outData->GetIncrements(outIncX, outIncY, outIncZ); int numComponents = inData->GetNumberOfScalarComponents(); int wholeExtent[6]; outData->GetExtent(wholeExtent); // target for progress tracking vtkIdType target = numComponents; target *= extent[5] - extent[4] + 1; target *= extent[3] - extent[2] + 1; vtkIdType progress = 0; for (int c = 0; c < numComponents; c++) { T *inPtrC = inPtr0 + c; F *outPtrC = outPtr0 + c; for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++) { vtkDICOMRealWorldMapping *mapping = 0; T first = vtkTypeTraits::Min(); T last = vtkTypeTraits::Max(); if (mapArray) { mapping = &mapArray[(zIdx - wholeExtent[4])*numComponents + c]; if (mapping->First > static_cast(first)) { first = static_cast(mapping->First); } if (mapping->Last < static_cast(last)) { last = static_cast(mapping->Last); } } T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ; F *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ; for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++) { T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]); F *outPtr = outPtrZ + outIncY*(yIdx - extent[2]); // in base thread, report progress every 2% of the way to 100% if (id == 0) { ++progress; vtkIdType icount = progress*50/target; if (progress == icount*target/50) { self->UpdateProgress(progress*1.0/target); } } if (mapping == 0) { // no mapping to apply for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++) { *outPtr = *inPtr; inPtr += numComponents; outPtr += numComponents; } } else if (mapping->Map) { // apply lookup table const double *table = mapping->Map; for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++) { if (*inPtr >= first && *inPtr <= last) { *outPtr = table[*inPtr - first]; } else { *outPtr = 0; } inPtr += numComponents; outPtr += numComponents; } } else { // apply slope and intercept double m = mapping->Slope; double b = mapping->Intercept; for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++) { if (*inPtr >= first && *inPtr <= last) { *outPtr = *inPtr*m + b; } else { *outPtr = 0; } inPtr += numComponents; outPtr += numComponents; } } } } } } } // end anonymous namespace //---------------------------------------------------------------------------- int vtkDICOMApplyRescale::RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { this->Superclass::RequestInformation(request, inputVector, outputVector); // Get the scalar information vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation(inInfo, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get(vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); // Modify the information scalarType = this->OutputScalarType; // Set the output information. vtkInformation* outInfo = outputVector->GetInformationObject(0); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, scalarType, numComponents); return 1; } //---------------------------------------------------------------------------- int vtkDICOMApplyRescale::RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // Get the scalar information vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation(inInfo, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get(vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); // Get the whole extent from the output port int extent[6]; vtkInformation *outInfo = outputVector->GetInformationObject(0); outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); // Get the meta data vtkInformation *metaInfo = this->GetMetaDataInformation(inputVector, 0, 0); vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast( metaInfo->Get(vtkDICOMAlgorithm::META_DATA())); if (meta) { size_t sz = (static_cast(numComponents)* static_cast(extent[5] - extent[4] + 1)); this->Mapping = new vtkDICOMRealWorldMapping[sz]; bool hasMapping = false; for (int c = 0; c < numComponents; c++) { for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++) { vtkDICOMRealWorldMapping *mapping = &this->Mapping[(zIdx - extent[4])*numComponents + c]; mapping->First = VTK_INT_MIN; mapping->Last = VTK_INT_MAX; mapping->Slope = 1.0; mapping->Intercept = 0.0; mapping->Map = 0; int i = meta->GetFileIndex(zIdx, c, numComponents); int j = meta->GetFrameIndex(zIdx, c, numComponents); const vtkDICOMValue& rwvms = meta->Get(i, j, DC::RealWorldValueMappingSequence); const vtkDICOMItem *rwvmi = rwvms.GetSequenceData(); if (rwvmi) { // use the real world value mapping first item mapping->First = rwvmi->Get(DC::RealWorldValueFirstValueMapped).AsInt(); mapping->Last = rwvmi->Get(DC::RealWorldValueLastValueMapped).AsInt(); mapping->Slope = rwvmi->Get(DC::RealWorldValueSlope).AsDouble(); mapping->Intercept = rwvmi->Get(DC::RealWorldValueIntercept).AsDouble(); // use lookup table if present const vtkDICOMValue &v = rwvmi->Get(DC::RealWorldValueLUTData); if (v.GetNumberOfValues() >= static_cast(mapping->Last - mapping->First + 1)) { mapping->Map = v.GetDoubleData(); } hasMapping = true; } else { // use the slope and intercept instead const vtkDICOMValue& u = meta->Get(i, j, DC::RescaleSlope); const vtkDICOMValue& v = meta->Get(i, j, DC::RescaleIntercept); if (u.IsValid() && v.IsValid()) { mapping->Slope = u.AsDouble(); mapping->Intercept = v.AsDouble(); hasMapping = true; } } // zero slope means slope wasn't found if (mapping->Slope == 0) { mapping->Slope = 1.0; } } } if (!hasMapping) { delete [] this->Mapping; this->Mapping = 0; } } // Passthrough if data is already floating-point int rval = 1; if (scalarType == VTK_DOUBLE || scalarType == VTK_FLOAT) { vtkImageData *inData = vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkImageData *outData = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); outData->CopyStructure(inData); outData->GetPointData()->PassData(inData->GetPointData()); } else { // Allow the superclass to call the ThreadedRequestData method rval = this->Superclass::RequestData( request, inputVector, outputVector); } delete [] this->Mapping; this->Mapping = 0; return rval; } //---------------------------------------------------------------------------- void vtkDICOMApplyRescale::ThreadedRequestData( vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***, vtkImageData **, int extent[6], int id) { vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkImageData *inData = vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkImageData *outData = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); int scalarType = inData->GetScalarType(); void *inVoidPtr = inData->GetScalarPointerForExtent(extent); void *outVoidPtr = outData->GetScalarPointerForExtent(extent); int outScalarType = outData->GetScalarType(); if (outScalarType == VTK_FLOAT) { switch (scalarType) { vtkTemplateAliasMacro( vtkDICOMApplyRescaleExecute( this, inData, static_cast(inVoidPtr), outData, static_cast(outVoidPtr), this->Mapping, extent, id)); } } else if (outScalarType == VTK_DOUBLE) { switch (scalarType) { vtkTemplateAliasMacro( vtkDICOMApplyRescaleExecute( this, inData, static_cast(inVoidPtr), outData, static_cast(outVoidPtr), this->Mapping, extent, id)); } } } vtk-dicom-0.8.12/Source/vtkDICOMApplyRescale.h000066400000000000000000000056131356440565500210170ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMApplyRescale * \brief Convert pixels to real-world values. * * This filter uses the information in the DICOM meta data to convert the * pixel values to real-world values with known units. It uses the DICOM * RealWorldValueMapping attributes, if present, otherwise it uses the * RescaleSlope and RescaleIntercept. If no mapping information is present, * then the pixels are simply converted to floating-point. * * \warning If this filter is used, then AutoRescaleOff() should be set on * the reader to ensure that the reader does not rescale the data. */ #ifndef vtkDICOMApplyRescale_h #define vtkDICOMApplyRescale_h #include "vtkDICOMAlgorithm.h" #include "vtkDICOMModule.h" // For export macro class vtkDICOMRealWorldMapping; class VTKDICOM_EXPORT vtkDICOMApplyRescale : public vtkDICOMAlgorithm { public: vtkTypeMacro(vtkDICOMApplyRescale, vtkDICOMAlgorithm); //! Static method for construction. static vtkDICOMApplyRescale *New(); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set the output data type to float or double (default is double). void SetOutputScalarType(int t); void SetOutputScalarTypeToFloat() { this->SetOutputScalarType(VTK_FLOAT); } void SetOutputScalarTypeToDouble() { this->SetOutputScalarType(VTK_DOUBLE); } int GetOutputScalarType() { return this->OutputScalarType; } //@} protected: vtkDICOMApplyRescale(); ~vtkDICOMApplyRescale(); int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; void ThreadedRequestData( vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***inData, vtkImageData **outData, int ext[6], int id) VTK_DICOM_OVERRIDE; vtkDICOMRealWorldMapping *Mapping; int OutputScalarType; private: #ifdef VTK_DICOM_DELETE vtkDICOMApplyRescale(const vtkDICOMApplyRescale&) VTK_DICOM_DELETE; void operator=(const vtkDICOMApplyRescale&) VTK_DICOM_DELETE; #else vtkDICOMApplyRescale(const vtkDICOMApplyRescale&) = delete; void operator=(const vtkDICOMApplyRescale&) = delete; #endif }; #endif // vtkDICOMApplyRescale_h vtk-dicom-0.8.12/Source/vtkDICOMCTGenerator.cxx000066400000000000000000000140361356440565500211620ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMCTGenerator.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkObjectFactory.h" #include "vtkDataSetAttributes.h" #include "vtkInformation.h" vtkStandardNewMacro(vtkDICOMCTGenerator); //---------------------------------------------------------------------------- vtkDICOMCTGenerator::vtkDICOMCTGenerator() { } //---------------------------------------------------------------------------- vtkDICOMCTGenerator::~vtkDICOMCTGenerator() { } //---------------------------------------------------------------------------- void vtkDICOMCTGenerator::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- bool vtkDICOMCTGenerator::GenerateCTSeriesModule(vtkDICOMMetaData *source) { vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::Modality, "CT"); // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::ReferencedPerformedProcedureStepSequence, // 1C DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMCTGenerator::GenerateCTImageModule(vtkDICOMMetaData *source) { // ImageType is specialized from GeneralImageModule, // by adding a third value that is specific to CT: // AXIAL or LOCALIZER const char *it = 0; if (source) { it = source->Get(DC::ImageType).GetCharData(); } if (it == 0 || it[0] == '\0') { it = "DERIVED\\SECONDARY\\AXIAL"; } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::ImageType, it); // These specialized from ImagePixelModule: // SamplesPerPixel must be 1 // PhotometricInterpretation must be MONOCHROME1 or MONOCHROME2 // BitsAllocated must be 16 // BitsStored must be 12 to 16 // these are mandatory meta->Set(DC::RescaleIntercept, this->RescaleIntercept); meta->Set(DC::RescaleSlope, this->RescaleSlope); // SpacingBetweenSlices is not part of the CT IOD, but it is a // frequently used extended attribute. If it is present we want to // ensure that it is correct. If absent, we don't set it. if (meta->Has(DC::SpacingBetweenSlices)) { meta->Set(DC::SpacingBetweenSlices, this->Spacing[2]); } // required items: use simple read/write validation DC::EnumType required[] = { DC::KVP, DC::AcquisitionNumber, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::RescaleType, // 1C DC::ScanOptions, DC::DataCollectionDiameter, DC::DataCollectionCenterPatient, DC::ReconstructionDiameter, DC::ReconstructionTargetCenterPatient, DC::DistanceSourceToDetector, DC::DistanceSourceToPatient, DC::GantryDetectorTilt, DC::TableHeight, DC::RotationDirection, DC::ExposureTime, DC::XRayTubeCurrent, DC::Exposure, DC::ExposureInuAs, DC::FilterType, DC::GeneratorPower, DC::FocalSpots, DC::ConvolutionKernel, DC::RevolutionTime, DC::SingleCollimationWidth, DC::TotalCollimationWidth, DC::TableSpeed, DC::TableFeedPerRotation, DC::SpiralPitchFactor, DC::ExposureModulationType, DC::EstimatedDoseSaving, DC::CTDIvol, DC::CTDIPhantomTypeCodeSequence, DC::AnatomicRegionSequence, DC::PrimaryAnatomicStructureSequence, DC::CalciumScoringMassFactorPatient, DC::CalciumScoringMassFactorDevice, DC::EnergyWeightingFactor, // 1C DC::CTAdditionalXRaySourceSequence, DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMCTGenerator::GenerateCTInstance(vtkInformation *info) { this->SetPixelRestrictions( RepresentationSigned | RepresentationUnsigned, BitsStored12 | BitsStored16, 1); const char *SOPClass = "1.2.840.10008.5.1.4.1.1.2"; this->InitializeMetaData(info); vtkDICOMMetaData *source = this->SourceMetaData; if (!this->GenerateSOPCommonModule(source, SOPClass) || !this->GeneratePatientModule(source) || !this->GenerateClinicalTrialSubjectModule(source) || !this->GenerateGeneralStudyModule(source) || !this->GeneratePatientStudyModule(source) || !this->GenerateClinicalTrialStudyModule(source) || !this->GenerateGeneralSeriesModule(source) || !this->GenerateFrameOfReferenceModule(source) || !this->GenerateClinicalTrialSeriesModule(source) || !this->GenerateGeneralEquipmentModule(source) || !this->GenerateGeneralImageModule(source) || !this->GenerateImagePlaneModule(source) || !this->GenerateImagePixelModule(source) || !this->GenerateContrastBolusModule(source) || !this->GenerateDeviceModule(source) || !this->GenerateSpecimenModule(source) || !this->GenerateCTSeriesModule(source) || !this->GenerateCTImageModule(source) || !this->GenerateOverlayPlaneModule(source) || !this->GenerateVOILUTModule(source)) { return false; } return true; } //---------------------------------------------------------------------------- bool vtkDICOMCTGenerator::GenerateInstance(vtkInformation *info) { if (this->MultiFrame) { vtkErrorMacro("Enhanced Multi-Frame CT is not yet supported."); return false; } return this->GenerateCTInstance(info); } vtk-dicom-0.8.12/Source/vtkDICOMCTGenerator.h000066400000000000000000000045141356440565500206070ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMCTGenerator_h #define vtkDICOMCTGenerator_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMGenerator.h" //! Generate DICOM data objects for CT images. /*! * Generate a DICOM data set belonging to one of the CT SOP classes. * The assumption is that images have been read into VTK as CT, and * are being written out as derived images after being processed. * The specific IOD classes supported are as follows: * - CT Image, 1.2.840.10008.5.1.4.1.1.2 */ class VTKDICOM_EXPORT vtkDICOMCTGenerator : public vtkDICOMGenerator { public: //! Static method for construction. static vtkDICOMCTGenerator *New(); vtkTypeMacro(vtkDICOMCTGenerator, vtkDICOMGenerator); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //! Generate an instance of one of the supported classes. /*! * This is the primary interface method of this class. Given the * information for a vtkImageData object, it will populate the * attributes of the supplied vtkDICOMMetaData object. */ bool GenerateInstance(vtkInformation *info) VTK_DICOM_OVERRIDE; protected: vtkDICOMCTGenerator(); ~vtkDICOMCTGenerator(); //! Generate the Series Module. virtual bool GenerateCTSeriesModule(vtkDICOMMetaData *source); //! Generate the Image Module. virtual bool GenerateCTImageModule(vtkDICOMMetaData *source); //! Instantiate a DICOM Secondary Capture Image object. virtual bool GenerateCTInstance(vtkInformation *info); private: #ifdef VTK_DICOM_DELETE vtkDICOMCTGenerator(const vtkDICOMCTGenerator&) VTK_DICOM_DELETE; void operator=(const vtkDICOMCTGenerator&) VTK_DICOM_DELETE; #else vtkDICOMCTGenerator(const vtkDICOMCTGenerator&) = delete; void operator=(const vtkDICOMCTGenerator&) = delete; #endif }; #endif // vtkDICOMCTGenerator_h vtk-dicom-0.8.12/Source/vtkDICOMCTRectifier.cxx000066400000000000000000000267271356440565500211620ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMCTRectifier.h" #include "vtkDICOMMetaData.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkMath.h" #include "vtkPointData.h" #include "vtkInformation.h" #include "vtkImageReslice.h" #include "vtkInformationVector.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkObjectFactory.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) #include "vtkImageSincInterpolator.h" #endif vtkStandardNewMacro(vtkDICOMCTRectifier); vtkCxxSetObjectMacro(vtkDICOMCTRectifier, VolumeMatrix, vtkMatrix4x4); //---------------------------------------------------------------------------- vtkDICOMCTRectifier::vtkDICOMCTRectifier() { this->VolumeMatrix = 0; this->RectifiedMatrix = vtkMatrix4x4::New(); this->Matrix = vtkMatrix4x4::New(); this->Reverse = 0; this->InterpolationMode = WindowedSinc; } //---------------------------------------------------------------------------- vtkDICOMCTRectifier::~vtkDICOMCTRectifier() { if (this->RectifiedMatrix) { this->RectifiedMatrix->Delete(); } if (this->VolumeMatrix) { this->VolumeMatrix->Delete(); } if (this->Matrix) { this->Matrix->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "VolumeMatrix:"; if (this->VolumeMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->VolumeMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "RectifiedMatrix:"; if (this->RectifiedMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->RectifiedMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "Reverse: " << this->Reverse << "\n"; os << indent << "InterpolationMode: " << this->InterpolationMode << "\n"; } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::SetReverse(int val) { val = (val != 0); if (val != this->Reverse) { this->Reverse = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::SetInterpolationMode(int val) { if (val < 0) { val = 0; } else if (val > WindowedSinc) { val = WindowedSinc; } if (val != this->InterpolationMode) { this->InterpolationMode = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::ComputeMatrix( const double volumeMatrix[16], const int extent[6], double spacing[3], double origin[3]) { if (volumeMatrix == 0) { this->RectifiedMatrix->Identity(); this->Matrix->Identity(); return; } // get the first two columns of the volume matrix double xvec[4] = { 1.0, 0.0, 0.0, 0.0 }; double yvec[4] = { 0.0, 1.0, 0.0, 0.0 }; vtkMatrix4x4::MultiplyPoint(volumeMatrix, xvec, xvec); vtkMatrix4x4::MultiplyPoint(volumeMatrix, yvec, yvec); // create the rectified matrix double normal[3]; vtkMath::Cross(xvec, yvec, normal); this->RectifiedMatrix->DeepCopy(volumeMatrix); this->RectifiedMatrix->SetElement(0, 2, normal[0]); this->RectifiedMatrix->SetElement(1, 2, normal[1]); this->RectifiedMatrix->SetElement(2, 2, normal[2]); // compute the shear matrix vtkMatrix4x4 *matrix = this->Matrix; if (this->Reverse) { matrix->DeepCopy(this->RectifiedMatrix); matrix->Invert(); double elements[16]; vtkMatrix4x4::Multiply4x4(*matrix->Element, volumeMatrix, elements); matrix->DeepCopy(elements); } else { matrix->DeepCopy(volumeMatrix); matrix->Invert(); vtkMatrix4x4::Multiply4x4(matrix, this->RectifiedMatrix, matrix); } // compute the shear parameters for the volume double zdn = matrix->GetElement(2, 2); double xshear = matrix->GetElement(0, 2)/zdn; double yshear = matrix->GetElement(1, 2)/zdn; // adjust the spacing if necessary spacing[2] *= zdn; origin[2] *= zdn; // adjust the position to center the new volume on the old volume double zcenter = 0.5*spacing[2]*(extent[5] - extent[4]); double pos[4] = { -xshear*zcenter, -yshear*zcenter, 0.0, 1.0 }; matrix->SetElement(0, 3, pos[0]); matrix->SetElement(1, 3, pos[1]); matrix->SetElement(2, 3, pos[2]); if (this->Reverse) { pos[0] = -pos[0]; pos[1] = -pos[1]; pos[2] = -pos[2]; } vtkMatrix4x4::MultiplyPoint(volumeMatrix, pos, pos); this->RectifiedMatrix->SetElement(0, 3, pos[0]); this->RectifiedMatrix->SetElement(1, 3, pos[1]); this->RectifiedMatrix->SetElement(2, 3, pos[2]); } //---------------------------------------------------------------------------- double vtkDICOMCTRectifier::GetGantryDetectorTilt(vtkMatrix4x4 *matrix) { double xvec[4] = { 1.0, 0.0, 0.0, 0.0 }; double yvec[4] = { 0.0, 1.0, 0.0, 0.0 }; double zvec[4] = { 0.0, 0.0, 1.0, 0.0 }; matrix->MultiplyPoint(xvec, xvec); matrix->MultiplyPoint(yvec, yvec); matrix->MultiplyPoint(zvec, zvec); double normal[3], checkvec[3]; vtkMath::Cross(xvec, yvec, normal); vtkMath::Cross(normal, zvec, checkvec); double angle = atan2(vtkMath::Norm(checkvec), vtkMath::Dot(normal, zvec)); return vtkMath::DegreesFromRadians(angle); } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::UpdateMatrix() { this->UpdateInformation(); } //---------------------------------------------------------------------------- int vtkDICOMCTRectifier::RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { this->Superclass::RequestInformation(request, inputVector, outputVector); vtkInformation *metaInfo = this->GetMetaDataInformation(inputVector, 0, 0); vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); int extent[6]; double spacing[3], origin[3]; inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); inInfo->Get(vtkDataObject::SPACING(), spacing); inInfo->Get(vtkDataObject::ORIGIN(), origin); double *volumeMatrix; if (this->VolumeMatrix) { // If a VolumeMatrix was provided, then use it. volumeMatrix = *this->VolumeMatrix->Element; } else { // Otherwise, try to get the patient matrix from the pipeline. volumeMatrix = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX()); } // Compute the shear matrix and the new spacing and origin. this->ComputeMatrix(volumeMatrix, extent, spacing, origin); // Write the new patient matrix to the pipeline. double *outMatrix = *this->RectifiedMatrix->Element; if (this->Reverse) { outMatrix = volumeMatrix; } if (outMatrix) { outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), outMatrix, 16); } // The spacing and origin may have changed. outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6); outInfo->Set(vtkDataObject::SPACING(), spacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), origin, 3); // Note that, after execution, the ImagePositionPatient in the META_DATA // will no longer be correct, but we assume that it will be ignored because, // within VTK, the PatientMatrix, Extent, Spacing, and Origin are used to // describe the geometry of the volume. The writer, for example, always // re-generates the ImagePositionPatient from the VTK volume information. return 1; } //---------------------------------------------------------------------------- int vtkDICOMCTRectifier::RequestUpdateExtent( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* outputVector) { vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); int wholeExt[6], outExt[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), outExt); inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExt); int inExt[6]; inExt[0] = wholeExt[0]; inExt[1] = wholeExt[1]; inExt[2] = wholeExt[2]; inExt[3] = wholeExt[3]; inExt[4] = outExt[4]; inExt[5] = outExt[5]; inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), inExt, 6); return 1; } //---------------------------------------------------------------------------- int vtkDICOMCTRectifier::RequestData( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* outputVector) { vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkImageData *inData = vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkImageData *outData = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); this->CopyMetaDataToOutputData(outInfo, outData); vtkSmartPointer image = vtkSmartPointer::New(); image->CopyStructure(inData); image->GetPointData()->PassData(inData->GetPointData()); int extent[6]; double spacing[3], origin[3]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), extent); outInfo->Get(vtkDataObject::SPACING(), spacing); outInfo->Get(vtkDataObject::ORIGIN(), origin); vtkSmartPointer reslice = vtkSmartPointer::New(); reslice->SetNumberOfThreads(this->GetNumberOfThreads()); reslice->SetResliceAxes(this->Matrix); reslice->SetOutputSpacing(spacing); reslice->SetOutputOrigin(origin); reslice->SetOutputExtent(extent); if (this->InterpolationMode == Nearest) { reslice->SetInterpolationModeToNearestNeighbor(); } else if (this->InterpolationMode == Linear) { reslice->SetInterpolationModeToLinear(); } else if (this->InterpolationMode == Cubic) { reslice->SetInterpolationModeToCubic(); } else { #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9) vtkSmartPointer interpolator = vtkSmartPointer::New(); interpolator->SetWindowFunctionToBlackman(); reslice->SetInterpolator(interpolator); #else reslice->SetInterpolationModeToCubic(); #endif } #if (VTK_MAJOR_VERSION > 5) reslice->SetInputData(image); this->AllocateOutputData(outData, outInfo, extent); reslice->SetOutput(outData); reslice->Update(); #else reslice->SetInput(image); reslice->Update(); outData->CopyStructure(reslice->GetOutput()); outData->GetPointData()->PassData(reslice->GetOutput()->GetPointData()); #endif return 1; } //---------------------------------------------------------------------------- void vtkDICOMCTRectifier::ThreadedRequestData( vtkInformation *, vtkInformationVector **, vtkInformationVector *, vtkImageData ***, vtkImageData **, int [6], int) { vtkErrorMacro("ThreadedRequestData should never be called for this filter."); } vtk-dicom-0.8.12/Source/vtkDICOMCTRectifier.h000066400000000000000000000120641356440565500205740ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMCTRectifier * \brief Prepare a CT for 3D processing * * This class will identify gantry-tilted CT images and resample them * into a rectangular volume. This is often a necessary step prior to * volume rendering or other forms of 3D rendering. */ #ifndef vtkDICOMCTRectifier_h #define vtkDICOMCTRectifier_h #include "vtkDICOMAlgorithm.h" #include "vtkDICOMModule.h" // For export macro class vtkMatrix4x4; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMCTRectifier : public vtkDICOMAlgorithm { public: //! Static method for construction. static vtkDICOMCTRectifier *New(); vtkTypeMacro(vtkDICOMCTRectifier, vtkDICOMAlgorithm); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Interpolation constants. enum { Nearest, Linear, Cubic, WindowedSinc }; //@} //@{ //! Reverse the default operation. /*! * When this option is set, the filter takes a rectangular volume * as input, and produces a volume whose geometry matches the * VolumeMatrix. */ void SetReverse(int v); void ReverseOn() { this->SetReverse(1); } void ReverseOff() { this->SetReverse(0); } int GetReverse() { return this->Reverse; } //@} //@{ //! Set the matrix that describes the CT volume geometry. /*! * This should be set to the PatientMatrix that comes from the * vtkDICOMReader. */ void SetVolumeMatrix(vtkMatrix4x4 *matrix); vtkMatrix4x4 *GetVolumeMatrix() { return this->VolumeMatrix; } //@} //@{ //! Set the interpolation method for resampling the data. /*! * The default interpolation method is WindowedSinc, which gives the * highest quality output. Linear interpolation is much faster and * will give satisfactory results in most situations. */ void SetInterpolationMode(int t); void SetInterpolationModeToNearest() { this->SetInterpolationMode(Nearest); } void SetInterpolationModeToLinear() { this->SetInterpolationMode(Linear); } void SetInterpolationModeToCubic() { this->SetInterpolationMode(Cubic); } void SetInterpolationModeToWindowedSinc() { this->SetInterpolationMode(WindowedSinc); } int GetInterpolationMode() { return this->InterpolationMode; } //@} //@{ //! Get the matrix that describes the rectified geometry. /*! * This matrix is generated when any of these methods is called: * Update(), UpdateInformation(), or UpdateMatrix(). */ vtkMatrix4x4 *GetRectifiedMatrix() { return this->RectifiedMatrix; } //@} //@{ //! Update the RectifiedMatrix without updating the output data. /*! * The input data must be set before this is called. */ void UpdateMatrix(); //@} //@{ //! A static method to measure the tilt from a matrix. /*! * This can be used to see whether it is necessary to rectify the * volume. It returns the Gantry Detector Tilt angle, in degrees, * as computed from the shear in the volume matrix. */ static double GetGantryDetectorTilt(vtkMatrix4x4 *volumeMatrix); //@} protected: vtkDICOMCTRectifier(); ~vtkDICOMCTRectifier(); //! Compute the rectified matrix from the given volume matrix. /*! * The extent, spacing, and origin of the image must also be given, * and they will be adjusted as necessary. */ void ComputeMatrix( const double matrix[16], const int extent[6], double spacing[3], double origin[3]); int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestUpdateExtent( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; void ThreadedRequestData( vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***inData, vtkImageData **outData, int ext[6], int id) VTK_DICOM_OVERRIDE; vtkMatrix4x4 *VolumeMatrix; vtkMatrix4x4 *RectifiedMatrix; vtkMatrix4x4 *Matrix; int Reverse; int InterpolationMode; private: #ifdef VTK_DICOM_DELETE vtkDICOMCTRectifier(const vtkDICOMCTRectifier&) VTK_DICOM_DELETE; void operator=(const vtkDICOMCTRectifier&) VTK_DICOM_DELETE; #else vtkDICOMCTRectifier(const vtkDICOMCTRectifier&) = delete; void operator=(const vtkDICOMCTRectifier&) = delete; #endif }; #endif // vtkDICOMCTRectifier_h vtk-dicom-0.8.12/Source/vtkDICOMCharacterSet.cxx000066400000000000000000002761431356440565500213660ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMCharacterSet.h" #include "vtkDICOMCharacterSetTables.h" #include #include unsigned char vtkDICOMCharacterSet::GlobalDefault = vtkDICOMCharacterSet::ISO_IR_6; bool vtkDICOMCharacterSet::GlobalOverride = false; //---------------------------------------------------------------------------- namespace { struct CharsetInfo { unsigned char Key; unsigned char Flags; // 1=replace previous, 2=combine with previous const char *DefinedTerm; const char *DefinedTermExt; const char *EscapeCode; const char **Names; }; //! This is a class for compressed lookup tables. class CompressedTable { public: CompressedTable(const unsigned short *table) : M(table[0]), N(table[M+1]), HTable(table+1), LTable(HTable + M+1) {} //! Use table to convert "x", return RCHAR if "x" not in table. unsigned short operator[](unsigned short x) { // uptr will indicate the table range that "x" sits within, // i.e. we want uptr[0] <= x < uptr[1] const unsigned short *uptr; // check "hot" parts of the lookup table first with HTable for (size_t k = 0; k < M; k++) { uptr = LTable + HTable[k]; if (x >= *uptr) { uptr++; if (uptr == LTable+N || x < *uptr) { // if found, skip the std::upper_bound() search goto found; } } } // use upper_bound to search LTable uptr = std::upper_bound(LTable, LTable+N, x); found: // we have uptr+1, where uptr[0] <= x < uptr[1] uptr--; // check if "x" is within a linearly compressed range unsigned short y = uptr[N]; if (y != RCHAR) { // this part of the table is compressed as a linear offset y += x - *uptr; } else { // check if "x" is within an uncompressed range y = uptr[2*N]; if (y != RCHAR) { // this part of the table is uncompressed, use DTable y += x - *uptr; y = LTable[3*N + y]; } } return y; } //! Get the sub-table that starts at index "x" (no checks) const unsigned short *GetBlock(unsigned short x) { const unsigned short *uptr = 0; for (size_t k = 0; k < M; k++) { uptr = LTable + HTable[k]; if (*uptr == x) { break; } } unsigned short y = uptr[2*N] + (x - uptr[0]); return <able[3*N + y]; } private: size_t M; // number of "hot" ranges declared for table size_t N; // total number of regions declared for table const unsigned short *HTable; // list of M values to define hot regions const unsigned short *LTable; // list of all regions }; // For reversed tables, accept an "unsigned int" index, since unicode // is too large for "unsigned short". class CompressedTableR { public: CompressedTableR(const unsigned short *table) : Table(table) {} unsigned short operator[](unsigned int x); private: CompressedTable Table; }; unsigned short CompressedTableR::operator[](unsigned int x) { if (x <= 0xFFFD) { return this->Table[static_cast(x)]; } return 0xFFFD; } // For reversed JIS X 0208/0212 table, include one compatibility // code that is beyond the BMP class CompressedTableJISXR { public: CompressedTableJISXR(const unsigned short *table) : Table(table) {} unsigned short operator[](unsigned int x); private: CompressedTable Table; }; unsigned short CompressedTableJISXR::operator[](unsigned int x) { if (x <= 0xFFFD) { return this->Table[static_cast(x)]; } if (x == 0x20B9F) // jouyou kanji that is outside BMP { return 2561; } return 0xFFFD; } static const char *ISO_IR_6_Names[] = { "ansi_x3.4-1968", "ansi_x3.4-1986", "ascii", "iso-ir-6", "iso646-us", "us-ascii", NULL }; static const char *ISO_IR_100_Names[] = { "cp819", "csisolatin1", "ibm819", "iso-8859-1", "iso-ir-100", "iso8859-1", "iso88591", "iso_8859-1", "iso_8859-1:1987", "l1", "latin1", NULL }; static const char *ISO_IR_101_Names[] = { "csisolatin2", "iso-8859-2", "iso-ir-101", "iso8859-2", "iso88592", "iso_8859-2", "iso_8859-2:1987", "l2", "latin2", NULL }; static const char *ISO_IR_109_Names[] = { "csisolatin3", "iso-8859-3", "iso-ir-109", "iso8859-3", "iso88593", "iso_8859-3", "iso_8859-3:1988", "l3", "latin3", NULL }; static const char *ISO_IR_110_Names[] = { "csisolatin4", "iso-8859-4", "iso-ir-110", "iso8859-4", "iso88594", "iso_8859-4", "iso_8859-4:1988", "l4", "latin4", NULL }; static const char *ISO_IR_144_Names[] = { "csisolatincyrillic", "cyrillic", "iso-8859-5", "iso-ir-144", "iso8859-5", "iso88595", "iso_8859-5", "iso_8859-5:1988", NULL }; static const char *ISO_IR_127_Names[] = { "arabic", "asmo-708", "csiso88596e", "csiso88596i", "csisolatinarabic", "ecma-114", "iso-8859-6", "iso-8859-6-e", "iso-8859-6-i", "iso-ir-127", "iso8859-6", "iso88596", "iso_8859-6", "iso_8859-6:1987", NULL }; static const char *ISO_IR_126_Names[] = { "csisolatingreek", "ecma-118", "elot_928", "greek", "greek8", "iso-8859-7", "iso-ir-126", "iso8859-7", "iso88597", "iso_8859-7", "iso_8859-7:1987", "sun_eu_greek", NULL }; static const char *ISO_IR_138_Names[] = { "csiso88598e", "csisolatinhebrew", "hebrew", "iso-8859-8", "iso-8859-8-e", "iso-ir-138", "iso8859-8", "iso88598", "iso_8859-8", "iso_8859-8:1988", NULL }; static const char *ISO_IR_148_Names[] = { "csisolatin5", "iso-8859-9", "iso-ir-148", "iso8859-9", "iso88599", "iso_8859-9", "iso_8859-9:1989", "l5", "latin5", NULL }; static const char *ISO_IR_166_Names[] = { "dos-874", "iso-8859-11", "iso-ir-166", "iso8859-11", "iso885911", "tis-620", NULL }; static const char *ISO_IR_13_Names[] = { "iso-ir-13", "iso-ir-14", "jis_x0201", "x0201", NULL }; static const char *ISO_2022_Names[] = { "iso-2022", NULL }; static const char *LATIN6_Names[] = { "csisolatin6", "iso-8859-10", "iso-ir-157", "iso8859-10", "iso885910", "iso_8859-10", "l6", "latin6", NULL }; static const char *LATIN7_Names[] = { "csisolatin7", "iso-8859-13", "iso-ir-179", "iso8859-13", "iso885913", "iso_8859-13", "l7", "latin7", NULL }; static const char *LATIN8_Names[] = { "csisolatin8", "iso-8859-14", "iso-ir-199", "iso8859-14", "iso885914", "iso_8859-14", "l8", "latin8", NULL }; static const char *LATIN9_Names[] = { "csisolatin9", "iso-8859-15", "iso-ir-203", "iso8859-15", "iso885915", "iso_8859-15", "l9", "latin9", NULL }; static const char *LATIN10_Names[] = { "csisolatin10", "iso-8859-16", "iso-ir-226", "iso8859-16", "iso885916", "iso_8859-16", "l10", "latin10", NULL }; static const char *ISO_IR_192_Names[] = { "iso-ir-192", "unicode-1-1-utf-8", "utf-8", "utf8", NULL }; static const char *GB18030_Names[] = { "gb18030", NULL }; static const char *GBK_Names[] = { "chinese", "gbk", "x-gbk", NULL }; static const char *ISO_IR_58_Names[] = { "csgb2312", "csiso58gb231280", "gb2312", "gb_2312", "gb_2312-80", "iso-ir-58", NULL }; static const char *EUCKR_Names[] = { "cseuckr", "euc-kr", "windows-949", NULL }; static const char *ISO_IR_149_Names[] = { "csksc56011987", "iso-2022-kr", "iso-ir-149", "iso2022_kr", "korean", "ks_c_5601-1987", "ks_c_5601-1989", "ksc5601", "ksc_5601", NULL }; static const char *ISO_IR_87_Names[] = { "csiso2022jp", "iso-2022-jp", "iso-ir-87", "iso2022_jp", "jis", NULL }; static const char *ISO_IR_159_Names[] = { "iso-2022-jp-1", "iso-2022-jp-2", "iso-ir-159", "iso2022_jp_1", "iso2022_jp_2", NULL }; static const char *CP874_Names[] = { "windows-874", NULL }; static const char *CP1250_Names[] = { "cp1250", "windows-1250", "x-cp1250", NULL }; static const char *CP1251_Names[] = { "cp1251", "windows-1251", "x-cp1251", NULL }; static const char *CP1252_Names[] = { "cp1252", "windows-1252", "x-cp1252", NULL }; static const char *CP1253_Names[] = { "cp1253", "windows-1253", "x-cp1253", NULL }; static const char *CP1254_Names[] = { "cp1254", "windows-1254", "x-cp1254", NULL }; static const char *CP1255_Names[] = { "cp1255", "windows-1255", "x-cp1255", NULL }; static const char *CP1256_Names[] = { "cp1256", "windows-1256", "x-cp1256", NULL }; static const char *CP1257_Names[] = { "cp1257", "windows-1257", "x-cp1257", NULL }; static const char *BIG5_Names[] = { "b5", "big5", "big5-eten", "cn-big5", "csbig5", "x-x-big5", NULL }; static const char *SJIS_Names[] = { "csshiftjis", "ms932", "ms_kanji", "shift-jis", "shift_jis", "sjis", "windows-31j", "x-sjis", NULL }; static const char *EUCJP_Names[] = { "cseucpkdfmtjapanese", "euc-jp", "x-euc-jp", NULL }; static const char *KOI8_Names[] = { "koi", "koi8", NULL }; // This table gives the character sets that are defined in DICOM 2011-3.3 // The first two columns are the possible CS values of character set in the // SpecificCharacterSet attribute of a DICOM data set. If the second form // of the name appears in SpecificCharacterSet, then iso-2022 escape codes // can be used to switch between character sets. The escape codes to switch // to the character set are given in the third column. const int CHARSET_TABLE_SIZE = 45; static CharsetInfo Charsets[45] = { { vtkDICOMCharacterSet::ISO_IR_6, 0, // ascii "ISO_IR 6", "ISO 2022 IR 6", "", ISO_IR_6_Names }, { vtkDICOMCharacterSet::ISO_IR_100, 0, // iso-8859-1, western europe "ISO_IR 100", "ISO 2022 IR 100", "-A", ISO_IR_100_Names }, { vtkDICOMCharacterSet::ISO_IR_101, 0, // iso-8859-2, central europe "ISO_IR 101", "ISO 2022 IR 101", "-B", ISO_IR_101_Names }, { vtkDICOMCharacterSet::ISO_IR_109, 0, // iso-8859-3, maltese "ISO_IR 109", "ISO 2022 IR 109", "-C", ISO_IR_109_Names }, { vtkDICOMCharacterSet::ISO_IR_110, 0, // iso-8859-4, baltic "ISO_IR 110", "ISO 2022 IR 110", "-D", ISO_IR_110_Names }, { vtkDICOMCharacterSet::ISO_IR_144, 0, // iso-8859-5, cyrillic "ISO_IR 144", "ISO 2022 IR 144", "-L", ISO_IR_144_Names }, { vtkDICOMCharacterSet::ISO_IR_127, 0, // iso-8859-6, arabic "ISO_IR 127", "ISO 2022 IR 127", "-G", ISO_IR_127_Names }, { vtkDICOMCharacterSet::ISO_IR_126, 0, // iso-8859-7, greek "ISO_IR 126", "ISO 2022 IR 126", "-F", ISO_IR_126_Names }, { vtkDICOMCharacterSet::ISO_IR_138, 0, // iso-8859-8, hebrew "ISO_IR 138", "ISO 2022 IR 138", "-H", ISO_IR_138_Names }, { vtkDICOMCharacterSet::ISO_IR_148, 0, // iso-8859-9, latin5, turkish "ISO_IR 148", "ISO 2022 IR 148", "-M", ISO_IR_148_Names }, { vtkDICOMCharacterSet::ISO_IR_166, 0, // iso-8859-11, thai "ISO_IR 166", "ISO 2022 IR 166", "-T", ISO_IR_166_Names }, // character sets for ISO 2022 encodings of JIS { vtkDICOMCharacterSet::ISO_IR_13, 0, // JIS X 0201, katakana "ISO_IR 13", "ISO 2022 IR 13", ")I", ISO_IR_13_Names }, { vtkDICOMCharacterSet::ISO_IR_13, 0, // JIS X 0201, romaji "ISO_IR 14", "ISO 2022 IR 14", "(J", NULL }, { vtkDICOMCharacterSet::ISO_IR_13, 0, // obsolete escape code "ISO_IR 14", "ISO 2022 IR 14", "(H", NULL }, { vtkDICOMCharacterSet::ISO_2022_IR_6, 0, // ascii "ISO_IR 6", "ISO 2022 IR 6", "(B", ISO_2022_Names }, { vtkDICOMCharacterSet::ISO_2022_IR_13, 0, // JIS X 0201, katakana in G0 "ISO_IR 13", "ISO 2022 IR 13", "(I", NULL }, { vtkDICOMCharacterSet::ISO_2022_IR_87, 2, // JIS X 0208, japanese "ISO_IR 87", "ISO 2022 IR 87", "$B" , ISO_IR_87_Names }, { vtkDICOMCharacterSet::ISO_2022_IR_87, 2, // obsolete escape code "ISO_IR 87", "ISO 2022 IR 87", "$@", NULL }, { vtkDICOMCharacterSet::ISO_2022_IR_159, 2,// JIS X 0212, japanese "ISO_IR 159", "ISO 2022 IR 159","$(D", ISO_IR_159_Names }, // other character sets that can be used with ISO 2022 { vtkDICOMCharacterSet::ISO_2022_IR_58, 1, // GB2312, chinese "ISO_IR 58", "ISO 2022 IR 58", "$A", ISO_IR_58_Names }, { vtkDICOMCharacterSet::ISO_2022_IR_58, 1, // compat escape code "ISO_IR 58", "ISO 2022 IR 58", "$(A", NULL }, { vtkDICOMCharacterSet::X_GB2312, 1, // GB2312, chinese (in G1) "ISO_IR 58", "ISO 2022 IR 58", "$)A", NULL }, { vtkDICOMCharacterSet::ISO_2022_IR_149, 1,// KS X 1001, korean "ISO_IR 149", "ISO 2022 IR 149","$(C", ISO_IR_149_Names }, { vtkDICOMCharacterSet::X_EUCKR, 1, // KS X 1001, korean (in G1) "ISO_IR 149", "ISO 2022 IR 149","$)C", EUCKR_Names }, // character sets that are not used with ISO 2022 { vtkDICOMCharacterSet::ISO_IR_192, 0, // utf-8 "ISO_IR 192", "", "", ISO_IR_192_Names }, { vtkDICOMCharacterSet::GB18030, 0, // chinese multibyte "GB18030", "", "", GB18030_Names }, { vtkDICOMCharacterSet::GBK, 0, // subset of GB18030 "GBK", "", "", GBK_Names }, // The remainder of these are not DICOM standard { vtkDICOMCharacterSet::X_LATIN6, 0, "latin6", "", "-V", LATIN6_Names }, { vtkDICOMCharacterSet::X_LATIN7, 0, "latin7", "", "-Y", LATIN7_Names }, { vtkDICOMCharacterSet::X_LATIN8, 0, "latin8", "", "-_", LATIN8_Names }, { vtkDICOMCharacterSet::X_LATIN9, 0, "latin9", "", "-b", LATIN9_Names }, { vtkDICOMCharacterSet::X_LATIN10, 0, "latin10", "", "-f", LATIN10_Names }, { vtkDICOMCharacterSet::X_CP874, 0, "cp874", "", "", CP874_Names }, { vtkDICOMCharacterSet::X_CP1250, 0, "cp1250", "", "", CP1250_Names }, { vtkDICOMCharacterSet::X_CP1251, 0, "cp1251", "", "", CP1251_Names }, { vtkDICOMCharacterSet::X_CP1252, 0, "cp1252", "", "", CP1252_Names }, { vtkDICOMCharacterSet::X_CP1253, 0, "cp1253", "", "", CP1253_Names }, { vtkDICOMCharacterSet::X_CP1254, 0, "cp1254", "", "", CP1254_Names }, { vtkDICOMCharacterSet::X_CP1255, 0, "cp1255", "", "", CP1255_Names }, { vtkDICOMCharacterSet::X_CP1256, 0, "cp1256", "", "", CP1256_Names }, { vtkDICOMCharacterSet::X_CP1257, 0, "cp1257", "", "", CP1257_Names }, { vtkDICOMCharacterSet::X_BIG5, 0, "big5", "", "", BIG5_Names }, { vtkDICOMCharacterSet::X_SJIS, 0, "sjis", "", "", SJIS_Names }, { vtkDICOMCharacterSet::X_EUCJP, 0, "euc-jp", "", "", EUCJP_Names }, { vtkDICOMCharacterSet::X_KOI8, 0, "koi8", "", "", KOI8_Names }, }; // Convert a unicode code point to UTF-8 inline void UnicodeToUTF8(unsigned int code, std::string *s) { if (code <= 0x007F) { s->push_back(code); } else if (code <= 0x07FF) { s->push_back(0xC0 | (code >> 6)); s->push_back(0x80 | (code & 0x3F)); } else if (code <= 0xFFFF) { s->push_back(0xE0 | (code >> 12)); s->push_back(0x80 | ((code >> 6) & 0x3F)); s->push_back(0x80 | (code & 0x3F)); } else if (code <= 0x10FFFF) { s->push_back(0xF0 | (code >> 18)); s->push_back(0x80 | ((code >> 12) & 0x3F)); s->push_back(0x80 | ((code >> 6) & 0x3F)); s->push_back(0x80 | (code & 0x3F)); } else { // indicate bad code with U+FFFD s->push_back(0xEF); s->push_back(0xBF); s->push_back(0xBD); } } // Convert one UTF8-encoded character to Unicode. // If UTF8 sequence is malformed, return 0xFFFF. // If UTF8 sequence at end of input is incomplete, return 0xFFFE. // Paired encoded UTF-16 surrogates are combined to create one code. unsigned int UTF8ToUnicode(const char **cpp, const char *cpEnd) { const unsigned char *cp = reinterpret_cast(*cpp); const unsigned char *ep = reinterpret_cast(cpEnd); unsigned int code = 0; if (cp != ep) { code = *cp++; } // check for non-ASCII if ((code & 0x80) != 0) { ptrdiff_t good = 0; if ((code & 0xE0) == 0xC0) { // 2 bytes, 0x0080 to 0x07FF code &= 0x1F; code <<= 6; good = ((code & 0x0780) != 0); if (good) { good = -1; if (cp != ep) { unsigned int s = *cp; good = ((s & 0xC0) == 0x80); cp += good; code |= (s & 0x3F); } } } else if ((code & 0xF0) == 0xE0) { // 3 bytes, 0x0800 to 0xFFFF good = -1; if (cp != ep) { code &= 0x0F; code <<= 6; unsigned int s = *cp; good = ((code | (s & 0x20)) != 0); good &= ((s & 0xC0) == 0x80); if (good) { good = -1; cp++; code |= (s & 0x3F); code <<= 6; if (cp != ep) { s = *cp; good = ((s & 0xC0) == 0x80); cp += good; code |= (s & 0x3F); // is this a high surrogate? if ((code & 0xFC00) == 0xD800 && good) { good = 0; // is it followed by a low surrogate? if (cp == ep) { good = -1; } else if (cp[0] == 0xED) { if (cp+1 == ep) { good = -1; } else if ((cp[1] & 0xF0) == 0xB0) { if (cp+2 == ep) { good = -1; } else if ((cp[2] & 0xC0) == 0x80) { good = 1; code &= 0x03FF; code <<= 4; code |= cp[1] & 0x0F; code <<= 6; code |= cp[2] & 0x3F; code += 0x010000; cp += 3; } } } } } } } } else if ((code & 0xF8) == 0xF0) { // 4 bytes, 0x010000 to 0x10FFFF good = -1; if (cp != ep) { code &= 0x07; code <<= 6; unsigned int s = *cp; good = ((code | (s & 0x30)) != 0); good &= ((s & 0xC0) == 0x80); if (good) { good = -1; cp++; if (cp != ep) { code |= (s & 0x3F); code <<= 6; s = *cp; good = ((s & 0xC0) == 0x80); if (good) { good = -1; cp++; if (cp != ep) { code |= (s & 0x3F); code <<= 6; s = *cp; good = ((s & 0xC0) == 0x80); cp += good; code |= (s & 0x3F); good &= (code <= 0x10FFFF); } } } } } } if (good == 0) { // improperly formed character code = 0xFFFF; } else if (good < 0) { // premature termination of string code = 0xFFFE; } } *cpp = reinterpret_cast(cp); return code; } // Different ways to handle failed conversions enum { UTF8_IGNORE, UTF8_REPLACE, UTF8_ESCAPE }; // This is a handler for incorrectly encoded characters void BadCharsToUTF8(const char *cp, const char *ep, std::string *s, int mode) { if (mode == UTF8_REPLACE) { // Replace each bad sequence with the replacement character const unsigned int code = 0xFFFD; UnicodeToUTF8(code, s); } else if (mode == UTF8_ESCAPE) { // Store unconvertible characters as UTF-16 low surrogates. // These surrogates are invalid UTF-8 codes, but they can be // recognized and used for diagnostic purposes. while (cp != ep) { unsigned int code = 0xDC00 + static_cast(*cp); UnicodeToUTF8(code, s); cp++; } } } // Convert a string to its lower-case equivalent. void CaseFoldUnicode(unsigned int code, std::string *s) { // This has been tested against the Unicode CaseFolding.txt // published on 2015-01-13 for Unicode 8. unsigned int code2 = 0; unsigned int code3 = 0; if (code <= 0x7f) { if (code >= 'A' && code <= 'Z') { // ascii uppercase -> ascii lowercase code += 0x20; } } else if (code <= 0xff) { if (code >= 0xC0 && code <= 0xDE && code != 0xD7) { // latin1 uppercase -> latin1 lowercase code += 0x20; } else if (code == 0xDF) { // latin1 s-sharp -> lowercase ss code = 's'; code2 = 's'; } else if (code == 0xB5) { // latin1 micron -> greek lowercase mu code = 0x03BC; } } else if (code <= 0x017f) { if (code >= 0x0100 && code <= 0x012F) { // various accented latin characters code |= 0x0001; } else if (code == 0x0130) { // I with dot becomes lowercase i code = 'i'; code2 = 0x0307; } else if (code >= 0x0132 && code <= 0x0137) { // IJ and various accented latin characters code |= 0x0001; } else if (code >= 0x139 && code <= 0x148) { // various accented latin characters code += (code & 0x0001); } else if (code == 0x0149) { // 'n -> two separate characters code = 0x02BC; code2 = 'n'; } else if (code >= 0x014A && code <= 0x0177) { // eng and various accented latin characters code |= 0x0001; } else if (code == 0x0178) { // uppercase y with diaeresis becomes lowercase y with diaeresis code = 0xFF; } else if (code >= 0x0179 && code <= 0x017E) { // various accented latin characters code += (code & 0x0001); } else if (code == 0x017F) { // long s -> lowercase s code = 's'; } } else if (code <= 0x036f) { // yet more latin with accents if (code >= 0x0180 && code <= 0x01CA) { const static unsigned short table[75] = { 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, 0x01A1, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x0280, 0x01A8, 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01B0, 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01C9, 0x01CC }; code = table[code - 0x0180]; } else if (code >= 0x01CB && code <= 0x01DC) { code += (code & 0x0001); } else if (code >= 0x01DE && code <= 0x01EF) { code |= 0x0001; } else if (code == 0x01F0) { code = 0x006A; code2 = 0x030C; } else if (code >= 0x01F0 && code <= 0x024F) { const static unsigned short table[96] = { 0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F5, 0x01F5, 0x0195, 0x01BF, 0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, 0x0209, 0x0209, 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, 0x019E, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, 0x022B, 0x022B, 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x2C65, 0x023C, 0x023C, 0x019A, 0x2C66, 0x023F, 0x0240, 0x0242, 0x0242, 0x0180, 0x0289, 0x028C, 0x0247, 0x0247, 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x024F }; code = table[code - 0x01F0]; } else if (code == 0x0345) { // combining greek ypogegrammeni code = 0x03B9; } } else if (code <= 0x03ff) { // greek characters if (code >= 0x0370 && code <= 0x038F) { const static unsigned short table[32] = { 0x0371, 0x0371, 0x0373, 0x0373, 0x0374, 0x0375, 0x0377, 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x03F3, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x03AC, 0x0387, 0x03AD, 0x03AE, 0x03AF, 0x038B, 0x03CC, 0x038D, 0x03CD, 0x03CE }; code = table[code - 0x0370]; } else if ((code >= 0x0391 && code <= 0x03A1) || (code >= 0x03A3 && code <= 0x03AB)) { code += 0x20; } else if (code == 0x0390) { code = 0x03B9; code2 = 0x0308; code3 = 0x0301; } else if (code == 0x03B0) { code = 0x03C5; code2 = 0x0308; code3 = 0x0301; } else if (code == 0x03C2) { code += 0x01; } else if (code >= 0x03CF && code <= 0x03D6) { const static unsigned short table[8] = { 0x03D7, 0x03B2, 0x03B8, 0x03D2, 0x03D3, 0x03D4, 0x03C6, 0x03C0 }; code = table[code - 0x03CF]; } else if (code >= 0x03D8 && code <= 0x03EF) { code |= 0x0001; } else if (code >= 0x03F0 && code <= 0x03FF) { const static unsigned short table[16] = { 0x03BA, 0x03C1, 0x03F2, 0x03F3, 0x03B8, 0x03B5, 0x03F6, 0x03F8, 0x03F8, 0x03F2, 0x03FB, 0x03FB, 0x03FC, 0x037B, 0x037C, 0x037D }; code = table[code - 0x03F0]; } } else if (code <= 0x052f) { // cyrillic if (code >= 0x0400 && code <= 0x040F) { code += 0x50; } else if (code >= 0x0410 && code <= 0x042F) { code += 0x20; } else if ((code >= 0x0460 && code <= 0x0481) || (code >= 0x048A && code <= 0x04BF)) { code |= 0x0001; } else if (code == 0x04C0) { code = 0x04CF; } else if (code >= 0x04C1 && code <= 0x04CE) { code += (code & 0x0001); } else if (code >= 0x04D0 && code <= 0x052F) { code |= 0x0001; } } else if (code <= 0x1000) { // armenian if (code >= 0x0531 && code <= 0x0556) { code += 0x30; } else if (code == 0x0587) { code = 0x0565; code2 = 0x0582; } } else if (code <= 0x13ff) { if ((code >= 0x10A0 && code <= 0x10C5) || code == 0x10C7 || code == 0x10CD) { // georgian code += 0x1C60; } else if (code >= 0x13F8 && code <= 0x13FD) { // cherokee code -= 0x08; } } else if (code <= 0x1eff) { // vietnamese and other latin if (code >= 0x1E00 && code <= 0x1E95) { code |= 0x0001; } else if (code >= 0x1E96 && code <= 0x1E9B) { const static unsigned short table[6] = { 'h', 't', 'w', 'y', 'a', 0x1E61 }; const static unsigned short table2[6] = { 0x0331, 0x0308, 0x030A, 0x030A, 0x02BE, 0, }; code2 = table2[code - 0x1E96]; code = table[code - 0x1E96]; } else if (code == 0x1E9E) { // capital s-sharp -> ss code = 's'; code2 = 's'; } else if (code >= 0x1EA0 && code <= 0x1EFE) { code |= 0x0001; } } else if (code <= 0x1fff) { // rare greek if ((code >= 0x1F08 && code <= 0x1F0F) || (code >= 0x1F18 && code <= 0x1F1D) || (code >= 0x1F28 && code <= 0x1F2F) || (code >= 0x1F38 && code <= 0x1F3F) || (code >= 0x1F48 && code <= 0x1F4D)) { code -= 0x08; } else if (code >= 0x1F50 && code <= 0x1F56 && (code & 0x1) == 0) { const static unsigned short table3[7] = { 0, 0, 0x0300, 0, 0x0301, 0, 0x0342 }; code3 = table3[code - 0x1F50]; code2 = 0x0313; code = 0x03C5; } else if ((code >= 0x1F59 && code <= 0x1F5F && (code & 0x1) != 0) || (code >= 0x1F68 && code <= 0x1F6F)) { code -= 0x08; } else if (code >= 0x1F80 && code <= 0x1FAF) { code2 = 0x03B9; if (code <= 0x1F87) { code -= 0x80; } else if (code <= 0x1F8F) { code -= 0x88; } else if (code <= 0x1F97) { code -= 0x70; } else if (code <= 0x1F9F) { code -= 0x78; } else if (code <= 0x1FA7) { code -= 0x40; } else { code -= 0x48; } } else if (code >= 0x1FB2 && code <= 0x1FFC) { const static unsigned short table[75] = { 0x1F70, 0x03B1, 0x03AC, 0x1FB5, 0x03B1, 0x03B1, 0x1FB0, 0x1FB1, 0x1F70, 0x1F71, 0x03B1, 0x1FBD, 0x03B9, 0x1FBF, 0x1FC0, 0x1FC1, 0x1F74, 0x03B7, 0x03AE, 0x1FC5, 0x03B7, 0x03B7, 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x03B7, 0x1FCD, 0x1FCE, 0x1FCF, 0x1FD0, 0x1FD1, 0x03B9, 0x03B9, 0x1FD4, 0x1FD5, 0x03B9, 0x03B9, 0x1FD0, 0x1FD1, 0x1F76, 0x1F77, 0x1FDC, 0x1FDD, 0x1FDE, 0x1FDF, 0x1FE0, 0x1FE1, 0x03C5, 0x03C5, 0x03C1, 0x1FE5, 0x03C5, 0x03C5, 0x1FE0, 0x1FE1, 0x1F7A, 0x1F7B, 0x1FE5, 0x1FED, 0x1FEE, 0x1FEF, 0x1FF0, 0x1FF1, 0x1F7C, 0x03C9, 0x03CE, 0x1FF5, 0x03C9, 0x03C9, 0x1F78, 0x1F79, 0x1F7C, 0x1F7D, 0x03C9 }; if (code <= 0x1FB4 || code == 0x1FBC || (code >= 0x1FC2 && code <= 0x1FC4) || code == 0x1FCC || (code >= 0x1FF2 && code <= 0x1FF4) || code == 0x1FFC) { code2 = 0x03B9; } else if (code == 0x1FB6 || code == 0x1FC6 || code == 0x1FD6 || code == 0x1FE6 || code == 0x1FF6) { code2 = 0x0342; } else if (code == 0x1FB6 || code == 0x1FB7 || code == 0x1FC7 || code == 0x1FF7) { code2 = 0x0342; code3 = 0x03B9; } else if (code >= 0x1FD2 && code <= 0x1FD3) { code2 = 0x0308; code3 = code - (0x1FD2 - 0x0300); } else if (code == 0x1FD7 || code == 0x1FE7) { code2 = 0x0308; code3 = 0x0342; } else if (code >= 0x1FE2 && code <= 0x1FE3) { code2 = 0x0308; code3 = code - (0x1FE2 - 0x0300); } else if (code == 0x1FE4) { code2 = 0x0313; } code = table[code - 0x1FB2]; } } else if (code <= 0x24ff) { // symbols if (code == 0x2126) { // Ohm symbol becomes omega code = 0x03C9; } else if (code == 0x212A) { // Kelvin symbol becomes k code = 'k'; } else if (code == 0x212B) { // Angstrom symbol becomes a with circle code = 0xE5; } else if (code == 0x2132) { code = 0x214E; } else if (code >= 0x2160 && code <= 0x216F) { code += 0x10; } else if (code == 0x2183) { code += 0x01; } else if (code >= 0x24B6 && code <= 0x24CF) { code += 0x1a; } } else if (code <= 0x2cff) { if (code >= 0x2C00 && code <= 0x2C2E) { // glagolitic code += 0x30; } else if (code >= 0x2C60 && code <= 0x2C7F) { // rare latin const static unsigned short table[32] = { 0x2C61, 0x2C61, 0x026B, 0x1D7D, 0x027D, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, 0x2C6C, 0x2C6C, 0x0251, 0x0271, 0x0250, 0x0252, 0x2C71, 0x2C73, 0x2C73, 0x2C74, 0x2C76, 0x2C76, 0x2C77, 0x2C78, 0x2C79, 0x2C7A, 0x2C7B, 0x2C7C, 0x2C7D, 0x023F, 0x0240 }; code = table[code - 0x2C60]; } else if (code >= 0x2C80 && code <= 0x2CF3) { // coptic if (code <= 0x2CE3) { code |= 0x0001; } else if (code == 0x2CEB || code == 0x2CED || code == 0x2CF2) { code += 0x0001; } } } else if (code <= 0x9fff) { // cjk ideograms } else if (code <= 0xabff) { if ((code >= 0xA640 && code <= 0xA66D) || (code >= 0xA680 && code <= 0xA69B)) { // rare cyrillic code |= 0x0001; } else if (code >= 0xA722 && code <= 0xA76F && code != 0xA730) { // rare latin code |= 0x0001; } else if (code >= 0xA779 && code <= 0xA77C) { code += (code & 0x0001); } else if (code == 0xA77D) { code = 0x1D79; } else if (code >= 0xA77E && code <= 0xA787) { code |= 0x0001; } else if (code == 0xA78B) { code += 0x0001; } else if (code == 0xA78D) { code = 0x0265; } else if (code >= 0xA790 && code <= 0xA7A9 && code != 0xA794) { code |= 0x0001; } else if (code >= 0xA7AA && code <= 0xA7B6) { const static unsigned short table[13] = { 0x0266, 0x025C, 0x0261, 0x026C, 0xA7AE, 0xA7AF, 0x029E, 0x0287, 0x029D, 0xAB53, 0xA7B5, 0xA7B5, 0xA7B7 }; code = table[code - 0xA7AA]; } else if (code >= 0xAB70 && code <= 0xABBF) { // cherokee code -= 0x97D0; } } else if (code <= 0xfaff) { // hangul, cjk, private use } else if (code <= 0xfbff) { if (code >= 0xFB00 && code <= 0xFB06) { // latin ligatures if (code <= 0xFB04) { if (code == 0xFB01) { code2 = 'i'; } else if (code == 0xFB02) { code2 = 'l'; } else { code2 = 'f'; if (code == 0xFB03) { code3 = 'i'; } else if (code == 0xFB04) { code3 = 'l'; } } code = 'f'; } else if (code <= 0xFB06) { code = 's'; code2 = 't'; } } else if (code >= 0xFB13 && code <= 0xFB17) { // armenian ligatures const static unsigned short table[5] = { 0x0574, 0x0574, 0x0574, 0x057E, 0x0574 }; const static unsigned short table2[5] = { 0x0576, 0x0565, 0x056B, 0x0576, 0x056D }; code2 = table2[code - 0xFB13]; code = table[code - 0xFB13]; } } else if (code <= 0xffff) { if (code >= 0xFF21 && code <= 0xFF3A) { // wide latin uppercase -> wide latin lowercase code += 0x20; } } else { if (code >= 0x10400 && code <= 0x10427 ) { code += 0x28; } else if (code >= 0x10C80 && code <= 0x10CB2) { code += 0x40; } else if (code >= 0x118A0 && code <= 0x118BF) { code += 0x20; } } UnicodeToUTF8(code, s); if (code2) { UnicodeToUTF8(code2, s); if (code3) { UnicodeToUTF8(code3, s); } } } //---------------------------------------------------------------------------- // Check an ISO-2022 escape code (without the leading escape) to see if it // designates G0 (the character range usually used for ASCII) to either a // single-byte code or a multi-byte code. If it does neither, then the // value of the "multibyte" parameter is left unchanged. The return value // is the number of octets consumed while reading the escape code. size_t CheckForMultiByteG0(const char *cp, size_t n, bool *multibyte) { size_t l = 0; while (l < n && static_cast(cp[l]) >= 0x20 && static_cast(cp[l]) <= 0x2f) { l++; } if (l < n && static_cast(cp[l]) >= 0x40 && static_cast(cp[l]) <= 0x7e) { l++; if ((l == 2 && cp[0] == '$') || (l == 3 && cp[0] == '$' && cp[1] == '(')) { // G0 is designated to multibyte *multibyte = true; } else if (l == 2 && cp[0] == '(') { // G0 is designated to single byte *multibyte = false; } } else { l = 0; } return l; } //---------------------------------------------------------------------------- size_t UTF8ToUTF8(const char *text, size_t l, std::string *s, int mode) { // convert to unicode and back, this will insert U+FFFD // wherever a bad utf-8 sequence occurs const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); size_t n = cp - lastpos; // check for 0xFFFE and 0xFFFF invalid characters that were not present // in the original string, these are the error indicators if (code >= 0xFFFE && code <= 0xFFFF && !(n == 3 && static_cast(lastpos[0]) == 0xef && static_cast(lastpos[1]) == 0xbf && static_cast(lastpos[2]) == (code ^ 0xFF40))) { if (code == 0xFFFF) { BadCharsToUTF8(lastpos, cp, s, mode); } errpos = (errpos ? errpos : lastpos); } else { // check for paired utf-16 surrogates and lone surrogates if (n == 6 || (code & 0xF800) == 0xD800) { // surrogates pass through, but are marked as utf-8 errors errpos = (errpos ? errpos : lastpos); } UnicodeToUTF8(code, s); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t ASCIIToUTF8(const char *text, size_t l, std::string *s, int mode) { // count the number of bad characters const char *errpos = 0; size_t m = 0; for (size_t i = 0; i < l; i++) { m += static_cast(text[i]) >> 7; } if (m == 0) { // pure ASCII is valid utf-8 s->append(text, l); } else { // codes > 0x7f s->reserve(s->size() + l + 2*m); for (size_t i = 0; i < l; i++) { char c = text[i]; if (static_cast(c) <= 0x7f) { s->push_back(c); } else { BadCharsToUTF8(&text[i], &text[i+1], s, mode); errpos = (errpos ? errpos : &text[i]); } } } return (errpos ? errpos-text : l); } //---------------------------------------------------------------------------- size_t UnknownToUTF8(const char *text, size_t l, std::string *s, int mode) { // assumes an iso2022 94-character replacement set size_t i = 0; while (i < l) { unsigned int code = static_cast(text[i++]); if ((code >= 0x21 && code < 0x7F) || code > 0x7F) { BadCharsToUTF8(&text[i], &text[i+1], s, mode); } else { UnicodeToUTF8(code, s); } } return 0; } //---------------------------------------------------------------------------- bool LastChanceConversion(std::string *s, const char *cp, const char *ep) { // the goal of this function is to replace things like smart quotes // with regular quotes unsigned int code = UTF8ToUnicode(&cp, ep); bool success = true; const char *replacement; if (code == 0xA0 || (code >= 0x2000 && code <= 0x200A) || code == 0x202F) { // various flavors of "space" become ASCII space replacement = " "; } else if (code == 0xAD || (code >= 0x200B && code <= 0x200D) || code == 0x2060) { // soft hyphen and zero-width spaces vanish without a trace replacement = ""; } else if (code >= 0x2010 && code <= 0x2014) { // various dashes become hyphen/minus replacement = "-"; } else if (code == 0x2015) { // horizontal bar becomes double-dash replacement = "--"; } else if (code >= 0x2018 && code <= 0x201B) { // smart quotes to apostrophe replacement = "\'"; } else if (code >= 0x201C && code <= 0x201F) { // smart quotes to regular quotes replacement = "\""; } else if (code == 0x2026) { // ellipsis replacement = "..."; } else if (code == 0x2044) { // fraction separator replacement = "/"; } else if (code == 0x2053) { // swung dash replacement = "~"; } else if (code == 0xFFFE) { // we use 0xFFFE to mark early termination of UTF string replacement = ""; success = false; } else { replacement = "?"; success = false; } s->append(replacement); return success; } // print a character escape code void OctalCharCode(std::string *s, unsigned char c) { char text[4]; text[0] = '\\'; text[1] = '0' + (c >> 6); text[2] = '0' + ((c >> 3) & 7); text[3] = '0' + (c & 7); s->append(text, 4); } } // end anonymous namespace //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToSJIS( const char *text, size_t l, std::string *s) { // windows-31j (shift-jis) CompressedTableJISXR table(vtkDICOMCharacterSet::Reverse[X_EUCJP]); CompressedTableR table2(vtkDICOMCharacterSet::Reverse[X_SJIS]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } else if (code >= 0xFF61 && code <= 0xFF9F) { // half-width katakana s->push_back(static_cast(code - 0xFEC0)); continue; } else { unsigned short t = table[code]; if (t >= 8836) { // check for CP932 compatibility t = table2[code]; } if (t < 11280) { unsigned char x = static_cast(t / 94); unsigned char y = static_cast(t % 94); if ((x & 1) == 0) { y += 0x40; if (y >= 0x7f) { y++; } } else { y += 0x9f; } x = 0x81 + x/2; if (x >= 0xa0) { x += 64; } s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } } if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::SJISToUTF8( const char *text, size_t l, std::string *s, int mode) { // use the JIS X 0208 table with EUDC and CP 932 extensions CompressedTable table(vtkDICOMCharacterSet::Table[X_SJIS]); // windows-31j (shift-jis) const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); // ascii } else { unsigned int code = 0xFFFD; unsigned short x = static_cast(c); if (x >= 0xA1 && x <= 0xDF) { code = x + 0xFEC0; // half-width katakana } else if (x != 0x80 && x != 0xA0 && x <= 0xFC && cp != ep) { // get second byte of a two-byte Shift-JIS sequence unsigned short y = static_cast(*cp); if (y >= 0x40 && y <= 0xFC && y != 0x7F) { unsigned short a, b; if (y < 0x9F) { a = 0; b = y - (y < 0x7F ? 0x40 : 0x41); } else { a = 1; b = y - 0x9F; } if (x <= 0x9F) { a += (x - 0x81)*2; } else { a += (x - 0xC1)*2; } code = table[a*94+b]; cp++; if (x == 0x81) { // substitutions to get correct code page 932 values switch (y) { case 0x5C: code = 0x2015; break; // HORIZONTAL BAR case 0x5F: code = 0xFF3C; break; // FULLWIDTH REVERSE SOLIDUS case 0x60: code = 0xFF5E; break; // FULLWIDTH TILDE case 0x61: code = 0x2225; break; // PARALLEL TO case 0x7C: code = 0xFF0D; break; // FULLWIDTH HYPHEN-MINUS case 0x91: code = 0xFFE0; break; // FULLWIDTH CENT SIGN case 0x92: code = 0xFFE1; break; // FULLWIDTH POUND SIGN case 0xCA: code = 0xFFE2; break; // FULLWIDTH NOT SIGN } } } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToEUCJP( const char *text, size_t l, std::string *s) { CompressedTableJISXR table(vtkDICOMCharacterSet::Reverse[X_EUCJP]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } else if (code >= 0xFF61 && code <= 0xFF9F) { // half-width katakana s->push_back(0x8e); s->push_back(static_cast(code - 0xFEC0)); continue; } else { unsigned short t = table[code]; if (t < 2*8836) { if (t >= 8836) { // JIS X 0212 s->push_back(0x8f); t -= 8836; } s->push_back(static_cast(0xA1 + t / 94)); s->push_back(static_cast(0xA1 + t % 94)); continue; } } if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::EUCJPToUTF8( const char *text, size_t l, std::string *s, int mode) { // UNIX encoding of JIS X 0201, JIS X 0208, and JIS X 0212 CompressedTable jisx0208(vtkDICOMCharacterSet::Table[ISO_2022_IR_87]); CompressedTable jisx0212(vtkDICOMCharacterSet::Table[ISO_2022_IR_159]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); // ascii } else { unsigned int code = 0xFFFD; unsigned short x = static_cast(c); if (x >= 0x80 && x < 0xFF && cp != ep) { unsigned short y = static_cast(*cp); if (y >= 0xA1 && y < 0xFF) { if (x >= 0xA1 && x < 0xFF) // JIS X 0208 { code = jisx0208[(x - 0xA1)*94 + (y - 0xA1)]; cp++; } else if (x == 0x8F) // JIS X 0212 { if (cp+1 == ep) { break; } x = y; y = static_cast(cp[1]); if (y >= 0xA1 && y < 0xFF) { code = jisx0212[(x - 0xA1)*94 + (y - 0xA1)]; cp += 2; } } else if (x == 0x8E && y <= 0xDF) // JIS X 0201 { code = y + 0xFEC0; // half-width katakana cp++; } } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToBig5( const char *text, size_t l, std::string *s) { // traditional Chinese CompressedTableR table(vtkDICOMCharacterSet::Reverse[X_BIG5]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); } else { unsigned short t = table[code]; if (t >= 0xFFFD) switch (code) { case 0x200CC: t = 11205; break; case 0x2008A: t = 11207; break; case 0x27607: t = 11213; break; } if (t < 19782) { unsigned char x = static_cast(0x81 + t / 157); unsigned char y = static_cast(0x40 + t % 157); if (y >= 0x7f) { y += 0x22; } s->push_back(static_cast(x)); s->push_back(static_cast(y)); } else if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::Big5ToUTF8( const char *text, size_t l, std::string *s, int mode) { // traditional Chinese, Big5 + ETEN extensions CompressedTable table(vtkDICOMCharacterSet::Table[X_BIG5]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); } else { unsigned int code = 0xFFFD; unsigned short x = static_cast(c); if (x >= 0x81 && x <= 0xFE && cp != ep) { unsigned short y = static_cast(*cp); if ((y >= 0x40 && y <= 0x7E) || (y >= 0xA1 && y <= 0xFE)) { cp++; unsigned short offset = (y < 0x7F ? 0x40 : 0x62); unsigned short t = (x - 0x81)*157 + (y - offset); switch (t) { case 11205: code = 0x200CC; break; case 11207: code = 0x2008A; break; case 11213: code = 0x27607; break; default: code = table[t]; } } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToGBK( const char *text, size_t l, std::string *s) { // Chinese national encoding standard CompressedTableR table(vtkDICOMCharacterSet::Reverse[GB18030]); CompressedTableR table2(vtkDICOMCharacterSet::Reverse[GBK]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } else { unsigned short t = table[code]; if (t >= 0xFFFD) switch (code) { // compatibility mappings beyond the BMP case 0x20087: t = 23767; break; case 0x20089: t = 23768; break; case 0x200CC: t = 23769; break; case 0x215D7: t = 23794; break; case 0x2298F: t = 23804; break; case 0x241FE: t = 23830; break; default: t = 23940; } if (t > 23940) { // try additional compatibility mappings t = table2[code]; } if (t < 23940) { unsigned char x; unsigned char y; if (t < 8836) { // GB2312 x = static_cast(0xA1 + t / 94); y = static_cast(0xA1 + t % 94); } else if (t < 8836 + 6080) { // GBK region 3 t -= 8836; x = static_cast(0x81 + t / 190); y = static_cast(0x40 + t % 190); if (y >= 0x7f) { y++; } } else { // GBK regions 4 & 5 t -= 8836 + 6080; x = static_cast(0xA1 + t / 96); y = static_cast(0x40 + t % 96); if (y >= 0x7f) { y++; } } s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } } if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::GBKToUTF8( const char *text, size_t l, std::string *s, int mode) { // Windows code page for simplified Chinese CompressedTable table(vtkDICOMCharacterSet::Table[GBK]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); } else { unsigned int code = 0xFFFD; unsigned short a = static_cast(c); if (a > 0x80 && a < 0xFF && cp != ep) { unsigned short b = static_cast(*cp); if (b >= 0x40 && b < 0xFF && b != 0x7F) { // two-byte character if (a < 0xA1) { // GBK region 3 if (b > 0x7F) { b--; } a = (a - 0x81)*190 + (b - 0x40) + 8836; } else if (b < 0xA1) { // GBK regions 4 & 5 if (b > 0x7F) { b--; } a = (a - 0xA1)*96 + (b - 0x40) + 8836 + 6080; } else { // GBK regions 1 & 2 (GB2312) a = (a - 0xA1)*94 + (b - 0xA1); } code = table[a]; cp++; } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToGB18030( const char *text, size_t l, std::string *s) { // Chinese national encoding standard CompressedTableR table(vtkDICOMCharacterSet::Reverse[GB18030]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } unsigned int t; if (code <= 0xFFFD) { t = table[code]; if (t < 23940) { unsigned char x; unsigned char y; if (t < 8836) { // GB2312 x = static_cast(0xA1 + t / 94); y = static_cast(0xA1 + t % 94); } else if (t < 8836 + 6080) { // GBK region 3 t -= 8836; x = static_cast(0x81 + t / 190); y = static_cast(0x40 + t % 190); if (y >= 0x7f) { y++; } } else { // GBK regions 4 & 5 t -= 8836 + 6080; x = static_cast(0xA1 + t / 96); y = static_cast(0x40 + t % 96); if (y >= 0x7f) { y++; } } s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } else { // other BMP codes -> 4 byte GB18030 code t -= 23940; } } else if (code >= 0x10000) { // non-BMP codes -> 4 byte GB18030 code t = code - 0x10000 + 150*1260; } else { // for handling of 0xFFFE and 0xFFFF if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } continue; } // four bytes unsigned int a = t / 1260; unsigned int b = t % 1260; s->push_back(static_cast(0x81 + a / 10)); s->push_back(static_cast(0x30 + a % 10)); s->push_back(static_cast(0x81 + b / 10)); s->push_back(static_cast(0x30 + b % 10)); } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::GB18030ToUTF8( const char *text, size_t l, std::string *s, int mode) { // Chinese national encoding standard CompressedTable table(vtkDICOMCharacterSet::Table[GB18030]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); } else { if (cp == ep) { errpos = (errpos ? errpos : lastpos); break; } unsigned int code = 0xFFFD; unsigned short a = static_cast(c); if (a > 0x80 && a < 0xFF && cp != ep) { unsigned short b = static_cast(*cp); if (b >= 0x30 && b < 0xFF && b != 0x7F) { cp++; if (b >= 0x40) { // two-byte character if (a < 0xA1) { // GBK region 3 if (b > 0x7F) { b--; } a = (a - 0x81)*190 + (b - 0x40) + 8836; } else if (b < 0xA1) { // GBK regions 4 & 5 if (b > 0x7F) { b--; } a = (a - 0xA1)*96 + (b - 0x40) + (8836 + 6080); } else { // GBK regions 1 & 2 (GB2312) a = (a - 0xA1)*94 + (b - 0xA1); } code = table[a]; } else if (cp != ep && cp+1 != ep) { // start of a four-byte code if (static_cast(cp[0]) > 0x80 && static_cast(cp[0]) < 0xFF && cp[1] >= '0' && cp[1] <= '9') { // four-byte GB18030 character unsigned short x = static_cast(*cp++); unsigned short y = static_cast(*cp++); a = (a - 0x81)*10 + (b - '0'); b = (x - 0x81)*10 + (y - '0'); if (a < 32) { // for unicode within the BMP a = a*1260 + b + 23940; code = table[a]; } else if (a >= 150) { // for unicode beyond the BMP a -= 150; unsigned int g = a*1260 + b; if (g <= 0xFFFFF) { code = g + 0x10000; } } } } } } // the 4-byte code 0x84,0x31,0xA4,0x37 is the valid code for 0xFFFD if (code == 0xFFFD && !(cp-lastpos >= 4 && lastpos[0] == '\x84' && lastpos[1] == '1' && lastpos[2] == '\xa4' && lastpos[3] == '7')) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToGB2312( const char *text, size_t l, std::string *s) { // Chinese national encoding standard CompressedTableR table(vtkDICOMCharacterSet::Reverse[GB18030]); CompressedTableR table2(vtkDICOMCharacterSet::Reverse[X_GB2312]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } else { unsigned short t = table[code]; if (t >= 8836) { // try additional compatibility mappings t = table2[code]; } if (t < 8836) { unsigned char x = static_cast(0xA1 + t / 94); unsigned char y = static_cast(0xA1 + t % 94); s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } } if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::GB2312ToUTF8( const char *text, size_t l, std::string *s, int mode) { // GB2312 chinese encoding CompressedTable table(vtkDICOMCharacterSet::Table[X_GB2312]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); } else { unsigned int code = 0xFFFD; unsigned short a = static_cast(c); if (a >= 0xA1 && a < 0xFF && cp != ep) { unsigned short b = static_cast(*cp); // default to replacement character code = 0xFFFD; if (b >= 0xA1 && b < 0xFF) { a = (a - 0xA1)*94 + (b - 0xA1); code = table[a]; cp++; } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToJISX( int charset, const char *text, size_t l, std::string *s) { // table for JIS X 0208 and JIS X 0212 CompressedTableJISXR table(vtkDICOMCharacterSet::Reverse[X_EUCJP]); // table for JIS X 0208 compatibility mappings CompressedTableR table2(vtkDICOMCharacterSet::Reverse[X_SJIS]); bool hasJISX0201 = ((charset & ISO_IR_13) == ISO_IR_13); bool hasJISX0208 = ((charset & ISO_2022_IR_87) == ISO_2022_IR_87); bool hasJISX0212 = ((charset & ISO_2022_IR_159) == ISO_2022_IR_159); const char *escBase = (hasJISX0201 ? "\033(J" : "\033(B"); const char *esc0208 = "\033$B"; const char *esc0212 = "\033$(D"; int state = 0; const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (hasJISX0201) { if (code >= 0xFF61 && code <= 0xFF9F) { // half-width katakana s->push_back(static_cast(code - 0xFEC0)); continue; } // JIS X 0201 is an ugly mapping, because it lacks backslash // and tilde, which were put into the official JIS X 0212 page. if (code == '\\' && hasJISX0208) { code = 0xFF3C; // FULLWIDTH REVERSE SOLIDUS } else if (code == '~' && hasJISX0212) { code = 0xFF5E; // FULLWIDTH TILDE } else if (code == 0xA5 && !hasJISX0208) // YEN SIGN { code = '\\'; } else if (code == 0x203E && !hasJISX0212) // MACRON { code = '~'; } } if (code < 0x80) { if (state != 0) { s->append(escBase); state = 0; } s->push_back(static_cast(code)); continue; } if (hasJISX0208 || hasJISX0212) { unsigned short t = table[code]; if (t >= 8836 && t < 2*8836 && hasJISX0212) { t -= 8836; if (state != 2) { s->append(esc0212); state = 2; } } else if (hasJISX0208) { if (t >= 8836 && ((code >= 0xFF61 && code <= 0xFF9F) || // JIS X 0201 katakana code == 0xFF5E || // fullwidth tilde from JIS X 0212 code == 0x5861 || code == 0x9830)) // JIS X 0212 { // JIS X 0208 compatibility mappings t = table2[code]; } if (t < 8836 && state != 1) { s->append(esc0208); state = 1; } } if (t < 8836) { unsigned char x = static_cast(0x21 + t / 94); unsigned char y = static_cast(0x21 + t % 94); s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } } // conversion of character failed size_t lastsize = s->size(); s->append(escBase); if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } if (s->size() == lastsize + 3) { s->resize(lastsize); } else { state = 0; } } if (state != 0) { s->append(escBase); } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::JISXToUTF8( int csGL, int csGR, const char *text, size_t l, std::string *s, int mode) { // this is a helper method for iso-2022-jp-2 decoding CompressedTable table(vtkDICOMCharacterSet::Table[csGL]); bool multibyte = (csGL == ISO_2022_IR_87 || csGL == ISO_2022_IR_159 || csGL == ISO_2022_IR_149 || csGL == ISO_2022_IR_58); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = 0xFFFD; unsigned short a = static_cast(*cp++); if (a >= 0x21 && a < 0x7F) { bool good = true; if (multibyte) { if (cp != ep && *cp >= 0x21 && *cp < 0x7F) { // convert double-byte to character unsigned short b = static_cast(*cp++); a = (a - 0x21)*94 + (b - 0x21); } else { good = false; } } else if (csGL == ISO_2022_IR_13) { // shift to put half-width katakana in GL a += 0x80; } if (good) { code = table[a]; } } else if (a <= 0x7F) { // control codes, space, or delete code = a; } else if (csGR == ISO_IR_13 && a >= 0xA1 && a <= 0xDF) { // half-width katakana in GR code = a + 0xFEC0; } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToEUCKR( const char *text, size_t l, std::string *s) { // EUC-KR encoding of KS X 1001 (and CP949 for compatibility) CompressedTableR table(vtkDICOMCharacterSet::Reverse[X_EUCKR]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); if (code < 0x80) { s->push_back(static_cast(code)); continue; } else { unsigned short t = table[code]; if (t < 8836) { unsigned char x = static_cast(0xA1 + t / 94); unsigned char y = static_cast(0xA1 + t % 94); s->push_back(static_cast(x)); s->push_back(static_cast(y)); continue; } else if (code >= 0xAC00 && code <= 0xD7A3) // hangul block { // table for leading consonant static const unsigned char tableL[19] = { 0, 1, 3, 6, 7, 8,16,17,18,20,21,22,23,24,25,26, 27,28,29 }; // table for trailing consonant static const unsigned char tableT[28] = { 51, 0, 1, 2, 3, 4, 5, 6, 8, 9,10,11,12,13,14,15, 16,17,19,20,21,22,23,25,26,27,28,29 }; // use 8-byte jamo code for hangul that aren't in KS X 1001 unsigned int z = code - 0xAC00; unsigned int T = z % 28; z /= 28; unsigned int V = z % 21; unsigned int L = z / 21; s->push_back(0xA4); s->push_back(0xD4); s->push_back(0xA4); s->push_back(0xA1 + tableL[L]); s->push_back(0xA4); s->push_back(0xBF + V); s->push_back(0xA4); s->push_back(0xA1 + tableT[T]); continue; } } if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::EUCKRToUTF8( const char *text, size_t l, std::string *s, int mode) { // EUC-KR encoding of KS X 1001 (and CP949 for compatibility) CompressedTable table(vtkDICOMCharacterSet::Table[X_EUCKR]); // Get the hangul block in KS X 1001 (codes 1410 to 3759) const unsigned short *hangul = table.GetBlock(1410); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = 0xFFFD; unsigned short x = static_cast(*cp++); if (x <= 0x7F) { code = x; } else if (x >= 0x81 && x < 0xFF && cp != ep) { // convert two bytes into unicode unsigned short y = static_cast(*cp); if (x >= 0xA1 && y >= 0xA1 && y < 0xFF) { unsigned short a = x - 0xA1; unsigned short b = y - 0xA1; a = a*94 + b; code = table[a]; cp++; // check for hangul encoded as 8-byte jamo sequence if (x == 0xA4 && y == 0xD4 && ep - cp >= 6 && static_cast(cp[0]) == 0xA4 && static_cast(cp[1]) >= 0xA1 && static_cast(cp[2]) == 0xA4 && static_cast(cp[3]) >= 0xA1 && static_cast(cp[4]) == 0xA4 && static_cast(cp[5]) >= 0xA1) { // table to convert leading consonant to an index static const unsigned char tableL[52] = { 1, 2, 0, 3, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0,10,11,12,13,14,15,16,17,18,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 }; // table to convert trailing consonant to an index static const unsigned char tableT[52] = { 2, 3, 4, 5, 6, 7, 8, 0, 9,10,11,12,13,14,15, 16,17,18, 0,19,20,21,22,23, 0,24,25,26,27,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; // get the leading consonant, vowel, and trailing consonant unsigned short y1 = static_cast(cp[1]); unsigned short y2 = static_cast(cp[3]); unsigned short y3 = static_cast(cp[5]); // check whether the sequence is valid if (y1 >= 0xA1 && y1 <= 0xD4 && tableL[y1-0xA1] != 0 && y2 >= 0xBF && y2 <= 0xD4 && y3 >= 0xA1 && y3 <= 0xD4 && tableT[y3-0xA1] != 0) { cp += 6; unsigned short L = tableL[y1-0xA1]-1; unsigned short V = y2 - 0xBF; unsigned short T = tableT[y3-0xA1]-1; if (L < 19 && V < 21) { // compute the composed unicode hangul code = 0xAC00 + (L*21 + V)*28 + T; // ensure this hangul is absent from KS X 1001 if (std::binary_search(hangul, hangul+2350, code)) { // if hangul has a precomposed form in KS X 1001, // ignore the composition and write out the sequence // using the Hangul Jamo Compatibility Block so // that it will round-trip back to KS X 1001 UnicodeToUTF8(0x3164, s); UnicodeToUTF8(0x3090 + y1, s); UnicodeToUTF8(0x3090 + y2, s); code = 0x3090 + y3; } } else if (L < 19 || V < 21 || T > 0) { // produce decomposed hangul with filler code = (L < 19 ? 0x1100 + L : 0x115F); UnicodeToUTF8(code, s); code = (V < 21 ? 0x1161 + V : 0x1160); if (T > 0) { UnicodeToUTF8(code, s); code = 0x11A7 + T; } } else { // all components are filler, so a syllable cannot be // created: write the sequence as compatibility codes UnicodeToUTF8(0x3164, s); UnicodeToUTF8(0x3164, s); UnicodeToUTF8(0x3164, s); code = 0x3164; } } } } else if ((y >= 0x41 && y <= 0x5A) || (y >= 0x61 && y <= 0x7A) || (y >= 0x81 && y < 0xFF)) { // possibly CP949 hangul extensions unsigned short a = x - 0x81; unsigned short b = y - 0x41; if (b >= 26) { b -= 6; if (b >= 52) { b -= 6; } } a = (a < 32 ? a*178 + b : a*84 + b + 3008); if (a < 8822) { code = table[a + 8836]; cp++; } } } if (code == 0xFFFD) { BadCharsToUTF8(lastpos, cp, s, mode); errpos = (errpos ? errpos : lastpos); } else { UnicodeToUTF8(code, s); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- unsigned char vtkDICOMCharacterSet::KeyFromString(const char *name, size_t nl) { const char *cp = name; const char *ep = name; int key = Unknown; bool found = false; if (cp) { ep += nl; } // Loop over backslash-separated defined terms for (int n = 0; cp != ep && *cp != '\0'; n++) { // strip leading spaces while (cp != ep && *cp == ' ') { cp++; } // search for end of value const char *dp = cp; while (dp != ep && *dp != '\\' && *dp != '\0') { dp++; } // find length of value (strip trailing spaces) size_t l = dp - cp; while (l > 0 && cp[l-1] == ' ') { l--; } if (l == 0) { found = true; key = ISO_IR_6; } else { found = false; unsigned char iso2022flag = 0; for (int i = 0; i < CHARSET_TABLE_SIZE && !found; i++) { if (l == strlen(Charsets[i].DefinedTerm) && strncmp(Charsets[i].DefinedTerm, cp, l) == 0) { found = true; } else if (l == strlen(Charsets[i].DefinedTermExt) && strncmp(Charsets[i].DefinedTermExt, cp, l) == 0) { found = true; iso2022flag = ISO_2022; } if (found) { if (n == 0) { // set key from first value of SpecificCharacterSet key = Charsets[i].Key | iso2022flag; } else if (Charsets[i].Flags == 1) // replace previous { // set key from 2nd value of SpecificCharacterSet key = Charsets[i].Key | ISO_2022; } else if (Charsets[i].Flags == 2) // combine with previous { // combine key with 2nd, 3rd value of SpecificCharacterSet // (specific to ISO_2022_IR_87 and ISO_2022_IR_159, which // combine with ISO_2022_IR_13 and with each other) key = (key & ISO_2022_JP_BASE) | Charsets[i].Key | ISO_2022; } } } } cp = dp; if (cp != ep && *cp == '\\') { cp++; } } // if no defined terms matched, look for common character set names if (!found && name && *name) { // use lowercase comparison for case insensitivity vtkDICOMCharacterSet cs; std::string lowername = cs.CaseFoldedUTF8(name, nl); for (int i = 0; i < CHARSET_TABLE_SIZE && !found; i++) { for (const char **names = Charsets[i].Names; names && *names && !found; names++) { if (lowername == *names) { found = true; key = Charsets[i].Key; // always activate JISX0208 if JISX0212 is active if (key == ISO_2022_IR_159) { key |= ISO_2022_IR_87; } } } } } return static_cast(key); } //---------------------------------------------------------------------------- std::string vtkDICOMCharacterSet::GetCharacterSetString() const { unsigned char key = this->Key; std::string value; for (int i = 0; i < CHARSET_TABLE_SIZE && key != 0; i++) { bool match = false; if (key == (key & (ISO_2022_JP_BASE | ISO_2022)) && key != ISO_2022) { // ISO_2022_IR_13, ISO_2022_IR_87 and ISO_2022_IR_159 can combine if ((Charsets[i].Key & key) == Charsets[i].Key && (Charsets[i].Key | ISO_2022) != ISO_2022) { match = true; // remove the bit for the matched charset key ^= Charsets[i].Key & ~ISO_2022; key = (key == ISO_2022 ? 0 : key); } } else if (Charsets[i].Flags == 0 && value.empty()) { if (this->IsISO2022()) { match = (Charsets[i].Key == (key & ISO_2022_BASE)); } else { match = (Charsets[i].Key == key); } key = (match ? 0 : key); } else if (Charsets[i].Flags == 1 && value.empty()) { // ISO_2022_IR_58 and ISO_2022_IR_149 match = (Charsets[i].Key == (key | ISO_2022)); key = (match ? 0 : key); } if (match) { if (this->IsISO2022()) { if (Charsets[i].Flags == 1 || Charsets[i].Flags == 2) { // always put ISO 2022 multibyte in second value value += "\\"; } value += Charsets[i].DefinedTermExt; } else { value += Charsets[i].DefinedTerm; } } } return value; } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::SingleByteToUTF8( const char *text, size_t l, std::string *s, int mode) const { const unsigned short *tptr = vtkDICOMCharacterSet::Table[this->Key]; if (tptr == 0) { tptr = vtkDICOMCharacterSet::Table[ISO_IR_6]; } CompressedTable table(tptr); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { unsigned short x = static_cast(*cp); unsigned int code = table[x]; if (code == 0xFFFD) { errpos = (errpos ? errpos : cp); BadCharsToUTF8(cp, cp+1, s, mode); } else { UnicodeToUTF8(code, s); } cp++; } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToSingleByte( const char *text, size_t l, std::string *s) const { const unsigned short *tptr = vtkDICOMCharacterSet::Reverse[this->Key]; tptr = (tptr ? tptr : vtkDICOMCharacterSet::Reverse[ISO_IR_6]); CompressedTableR table(tptr); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; unsigned int code = UTF8ToUnicode(&cp, ep); unsigned short t = table[code]; if (t < 0xFFFD) { s->push_back(static_cast(t)); } else if (!LastChanceConversion(s, lastpos, ep)) { errpos = (errpos ? errpos : lastpos); } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::ISO8859ToUTF8( const char *text, size_t l, std::string *s, int mode) const { // for compatibility with strings that were encoded with Windows code // pages, allow Windows extensions for codes 0x80 to 0x9F static const unsigned short wincodes[32] = { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD, 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178 }; // bitfield to say which of the 32 codes are to be used unsigned int wincodesUsed = 0; switch (this->Key) { case vtkDICOMCharacterSet::ISO_IR_100: // CP1252 latin1 wincodesUsed = 0xDFFE5FFD; break; case vtkDICOMCharacterSet::ISO_IR_148: // CP1254 turkish wincodesUsed = 0x9FFE1FFD; break; case vtkDICOMCharacterSet::ISO_IR_166: // CP874 thai wincodesUsed = 0x00FE0021; break; default: break; } CompressedTable table(vtkDICOMCharacterSet::Table[this->Key]); const char *errpos = 0; const char *cp = text; const char *ep = text + l; while (cp != ep) { const char *lastpos = cp; char c = *cp++; if ((c & 0x80) == 0) { s->push_back(c); // ascii } else { unsigned short x = static_cast(c); unsigned int code = table[x]; // check for Windows extensions if (x < 0xA0) { x -= 0x80; if (((1u << x) & wincodesUsed) != 0) { code = wincodes[x]; } } if (code == 0xFFFD) { errpos = (errpos ? errpos : lastpos); BadCharsToUTF8(lastpos, cp, s, mode); } else { UnicodeToUTF8(code, s); } } } return (errpos ? errpos-text : cp-text); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::UTF8ToISO2022( const char *text, size_t l, std::string *s) const { // check for iso-2022-jp encoding if ((this->Key & (ISO_2022_JP_BASE|ISO_2022)) == this->Key) { return UTF8ToJISX(this->Key, text, l, s); } // check for multi-byte encodings that use G1 if (this->Key == ISO_2022_IR_149 || this->Key == ISO_2022_IR_58) { const char *escCode = "\033$)C"; if (this->Key == ISO_2022_IR_58) { escCode = "\033$)A"; } // loop over all the lines in the string const char *cp = text; const char *ep = cp + l; while (cp != ep) { const char *dp = cp; char checkAscii = 0; // loop until the end of the current line while (dp != ep && (*dp < '\n' || *dp > '\r')) { checkAscii |= *dp; dp++; } while (dp != ep && *dp >= '\n' && *dp <= '\r') { dp++; } size_t m = dp - cp; if ((checkAscii & 0x80) == 0) { // segment between delims is pure ascii s->append(cp, m); } else { // add the escape code and write the encoded text s->append(escCode); size_t n; if (this->Key == ISO_2022_IR_58) { n = this->UTF8ToGB2312(cp, m, s); } else { n = this->UTF8ToEUCKR(cp, m, s); } // check for conversion error if (n < m) { n += cp - text; l = (l < n ? l : n); } } cp = dp; } return l; } // don't write escape codes for single-byte character sets vtkDICOMCharacterSet cs(this->Key ^ ISO_2022); return cs.UTF8ToSingleByte(text, l, s); } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::ISO2022ToUTF8( const char *text, size_t l, std::string *s, int mode) const { // Uses ISO-2022 escape codes to switch character sets. // Mask to get the charset that is active before the first escape code. unsigned char charset = (this->Key & ISO_2022_BASE); unsigned char charsetG1 = charset; unsigned char charsetG2 = 0; // if Japanese, only ISO_IR_13 is active at the start if (charset <= ISO_2022_JP_BASE) { charset &= ISO_IR_13; charsetG1 = charset; } // this will be set when decoding a multibyte charset in G0 bool multibyteG0 = false; // loop through the string, looking for iso-2022 escape codes, // and when an escape code is found, change the charset size_t m; size_t n = l; size_t i = 0; while (i < l) { // search for the next escape size_t j = i; for (; j < l; j++) { if (text[j] == '\033') { break; } } if ((charset & ISO_2022) == 0) { // convert characters up to the next escape code charsetG1 = charset; vtkDICOMCharacterSet cs(charset); m = cs.AnyToUTF8(&text[i], j-i, s, mode); } else if (charset == ISO_2022_IR_6 || charset == ISO_2022_IR_13 || charset == ISO_2022_IR_58 || charset == ISO_2022_IR_87 || charset == ISO_2022_IR_149 || charset == ISO_2022_IR_159) { m = JISXToUTF8(charset, charsetG1, &text[i], j-i, s, mode); } else if (multibyteG0) { // any control codes such as carriage return, newline, and space // will be emitted while everything else is treated as invalid m = UnknownToUTF8(&text[i], j-i, s, mode); } else { // any octets in [0x00,0x7F] will be assumed to be ASCII, // while all other octets will be treated as invalid m = ASCIIToUTF8(&text[i], j-i, s, mode); } // check for decoding errors if (m != j-i && n == l) { n = i + m; // record position of error } // Make sure we are at the escape code (or the end of string) i = j; // Get the escape code for the next segment if (text[i] == '\033') { i++; const char *escapeCode = &text[i]; size_t escapeLen = CheckForMultiByteG0(&text[i], l-i, &multibyteG0); // DICOM only uses ISO 2022 codes that designate G0 and G1 if ((escapeLen == 2 && (escapeCode[0] == '(' || escapeCode[0] == ')' || escapeCode[0] == '-' || escapeCode[0] == '$')) || (escapeLen == 3 && escapeCode[0] == '$' && (escapeCode[1] == '(' || escapeCode[1] == ')' || escapeCode[1] == '-'))) { // advance past the escape sequence i += escapeLen; unsigned char oldcharset = charset; charset = 0xFF; // indicate none found yet // look through single-byte charset escape codes for (unsigned char k = 0; k < CHARSET_TABLE_SIZE; k++) { const char *escapeTry = Charsets[k].EscapeCode; size_t le = strlen(escapeTry); if (le == escapeLen && strncmp(escapeCode, escapeTry, le) == 0) { charset = Charsets[k].Key; if (charset == ISO_IR_13 && Charsets[k].EscapeCode[0] == ')' && (oldcharset == ISO_2022_IR_6 || oldcharset == ISO_2022_IR_13 || oldcharset == ISO_2022_IR_58 || oldcharset == ISO_2022_IR_87 || oldcharset == ISO_2022_IR_149 || oldcharset == ISO_2022_IR_159)) { // The ISO_IR_13 katakana go in G1, so let's keep the // currently active kanji charset in G0. charsetG1 = charset; charset = oldcharset; } break; } } } else if (escapeLen == 2 && escapeCode[0] == '.') { // advance past the escape sequence i += escapeLen; // assign character set to G2, default to "Unknown" charsetG2 = 0xFF; // search for the matching character set for (unsigned char k = 0; k < CHARSET_TABLE_SIZE; k++) { const char *escapeTry = Charsets[k].EscapeCode; size_t le = strlen(escapeTry); if (le == 2 && escapeTry[0] == '-' && escapeTry[1] == escapeCode[1]) { charsetG2 = Charsets[k].Key; break; } } } else if (escapeLen == 1 && escapeCode[0] == 'N') { // single shift G2, convert one character i += escapeLen; char g2char = (text[i++] | 0x80); vtkDICOMCharacterSet cs(charsetG2); cs.AnyToUTF8(&g2char, 1, s, mode); } else if (escapeLen == 2 && escapeCode[0] == '&' && escapeCode[1] == '@') { // obsolete JIS code to switch versions of JIS X 0208 i += escapeLen; } else if (escapeLen) { // write any other escape sequences verbatim to the output s->push_back('\033'); while (escapeLen) { s->push_back(text[i++]); --escapeLen; } } else { // record position of error if (n == l) { n = i - 1; } } } } return n; } //---------------------------------------------------------------------------- std::string vtkDICOMCharacterSet::FromUTF8( const char *text, size_t l, size_t *lp) const { std::string s; if (this->IsISO2022()) { l = this->UTF8ToISO2022(text, l, &s); } else switch (this->Key) { case X_EUCKR: l = UTF8ToEUCKR(text, l, &s); break; case X_GB2312: l = UTF8ToGB2312(text, l, &s); break; case ISO_IR_192: // UTF-8 l = UTF8ToUTF8(text, l, &s, UTF8_REPLACE); break; case GB18030: l = UTF8ToGB18030(text, l, &s); break; case GBK: l = UTF8ToGBK(text, l, &s); break; case X_BIG5: l = UTF8ToBig5(text, l, &s); break; case X_EUCJP: l = UTF8ToEUCJP(text, l, &s); break; case X_SJIS: l = UTF8ToSJIS(text, l, &s); break; default: l = this->UTF8ToSingleByte(text, l, &s); break; } if (lp) { *lp = l; } return s; } //---------------------------------------------------------------------------- std::string vtkDICOMCharacterSet::ToUTF8( const char *text, size_t l, size_t *lp) const { std::string s; l = this->AnyToUTF8(text, l, &s, UTF8_REPLACE); if (lp) { *lp = l; } return s; } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::AnyToUTF8( const char *text, size_t l, std::string *s, int mode) const { if (this->Key == ISO_IR_6) { l = ASCIIToUTF8(text, l, s, mode); } else if (this->IsISO2022()) { l = ISO2022ToUTF8(text, l, s, mode); } else if (this->IsISO8859()) { l = ISO8859ToUTF8(text, l, s, mode); } else switch (this->Key) { case X_EUCKR: l = EUCKRToUTF8(text, l, s, mode); break; case X_GB2312: l = GB2312ToUTF8(text, l, s, mode); break; case ISO_IR_192: // UTF-8 l = UTF8ToUTF8(text, l, s, mode); break; case GB18030: l = GB18030ToUTF8(text, l, s, mode); break; case GBK: l = GBKToUTF8(text, l, s, mode); break; case X_BIG5: l = Big5ToUTF8(text, l, s, mode); break; case X_EUCJP: l = EUCJPToUTF8(text, l, s, mode); break; case X_SJIS: l = SJISToUTF8(text, l, s, mode); break; default: l = SingleByteToUTF8(text, l, s, mode); break; } return l; } //---------------------------------------------------------------------------- // Obsolete method, kept for backwards compatibility std::string vtkDICOMCharacterSet::ConvertToUTF8( const char *text, size_t l) const { return ToUTF8(text, l); } //---------------------------------------------------------------------------- std::string vtkDICOMCharacterSet::ToSafeUTF8( const char *text, size_t l) const { std::string s; this->AnyToUTF8(text, l, &s, UTF8_ESCAPE); std::string t; // scan the string for codes that are unsafe to print to a console const char *lp = s.data(); const char *cp = lp; const char *ep = lp + s.length(); while (cp != ep) { const char *dp = cp; unsigned char a = static_cast(*cp++); if (a < 0x20 || a == 0x7f || a == '\\') { // C0 control code and backslash t.append(lp, dp); OctalCharCode(&t, a); lp = cp; } else if ((a & 0xC0) == 0xC0 && cp != ep) { unsigned char b = static_cast(*cp++); if (a == 0xC2 && b < 0xA0) { // C1 control code t.append(lp, dp); OctalCharCode(&t, b); lp = cp; } else if ((a & 0xE0) == 0xE0 && cp != ep) { unsigned char c = static_cast(*cp++); if (a == 0xED && (b & 0xF0) == 0xB0) { // UTF-16 low surrogate used to store bad char unsigned short d = ((b & 0x0F) << 6) | (c & 0x3F); if (d <= 0xFF) { t.append(lp, dp); OctalCharCode(&t, static_cast(d)); lp = cp; } } else if ((a & 0xF0) == 0xF0 && cp != ep) { cp++; } } } } // if scan didn't find anything to change, return the string if (lp == s.data()) { return s; } // return the safetied string t.append(lp, ep); return t; } //---------------------------------------------------------------------------- std::string vtkDICOMCharacterSet::CaseFoldedUTF8( const char *text, size_t l) const { std::string s; std::string t; const char *cp = text; const char *ep = text + l; if (this->Key != ISO_IR_192) // UTF-8 { t = this->ToUTF8(text, l); cp = t.data(); ep = cp + t.length(); } while (cp != ep) { unsigned int code = UTF8ToUnicode(&cp, ep); if (code == 0xFFFF) { // Since 0xFFFF is not permitted, convert to 0xFFFD code = 0xFFFD; } if (code != 0xFFFE) { CaseFoldUnicode(code, &s); } } return s; } //---------------------------------------------------------------------------- size_t vtkDICOMCharacterSet::NextBackslash( const char *text, const char *ep) const { const char *cp = text; if (this->Key == GB18030 || this->Key == GBK) { // ensure backslash isn't second part of a multi-byte character while (cp != ep && *cp != '\0') { if (static_cast(*cp) >= 0x81) { cp++; if (cp != ep && static_cast(*cp) >= 0x21) { cp++; } } else if (*cp != '\\') { cp++; } else { break; } } } else if (this->Key == X_SJIS) { // ensure backslash isn't second part of a Shift-JIS character while (cp != ep && *cp != '\0') { unsigned char x = static_cast(*cp); if ((x >= 0x81 && x <= 0x9F) || (x >= 0xE0 && x <= 0xFC)) { cp++; if (cp != ep && static_cast(*cp) >= 0x40 && static_cast(*cp) <= 0xFC && static_cast(*cp) != 0x7F) { cp++; } } else if (*cp != '\\') { cp++; } else { break; } } } else if (this->Key == X_BIG5) { // ensure backslash isn't second part of a Big5 character while (cp != ep && *cp != '\0') { unsigned char x = static_cast(*cp); if ((x >= 0x81 && x <= 0xFE)) { cp++; if (cp != ep && ((static_cast(*cp) >= 0x40 && static_cast(*cp) <= 0x7E) || ((static_cast(*cp) >= 0xA1 && static_cast(*cp) <= 0xFE)))) { cp++; } } else if (*cp != '\\') { cp++; } else { break; } } } else if (this->IsISO2022()) { // ensure backslash isn't part of a G0 multi-byte code bool multibyte = false; bool sshift = false; while (cp != ep && *cp != '\0') { // look for iso 2022 escape code if (*cp == '\033') { cp++; size_t l = CheckForMultiByteG0(cp, ep-cp, &multibyte); // check for SS2, which designates GL for next byte sshift = (l == 1 && *cp == 'N'); // do not advance past backslashes in the escape sequence for (size_t i = 0; i < l; i++) { if (*cp == '\\') { break; } cp++; } } else if (multibyte || sshift || *cp != '\\') { sshift = false; cp++; } else { break; } } } else { // no special encoding, so backslash is backslash while (cp != ep && *cp != '\0') { if (*cp == '\\') { break; } cp++; } } return (cp - text); } //---------------------------------------------------------------------------- unsigned int vtkDICOMCharacterSet::CountBackslashes( const char *text, size_t l) const { unsigned int count = 0; const char *cp = text; const char *ep = text + l; while (cp != ep && *cp != '\0') { cp += this->NextBackslash(cp, ep); if (cp != ep && *cp == '\\') { cp++; count++; } } return count; } //---------------------------------------------------------------------------- ostream& operator<<(ostream& o, const vtkDICOMCharacterSet& a) { std::string s = a.GetCharacterSetString(); if (s.length() == 0) { s = (a.GetKey() == vtkDICOMCharacterSet::ISO_IR_6 ? "ISO_IR 6" : "Unknown"); } else if (s[0] == '\\') { s.insert(0, "ISO 2022 IR 6"); } return o << s.c_str(); } vtk-dicom-0.8.12/Source/vtkDICOMCharacterSet.h000066400000000000000000000365771356440565500210200ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMCharacterSet_h #define vtkDICOMCharacterSet_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include //! Character sets. /*! * This class provides the means to convert the various international * text encodings used by DICOM to the popular UTF-8 encoding. It does * not at this time provide the means to convert to any encoding other * than UTF-8. * * During conversion to UTF-8, any codes in the original encoding that * cannot be converted to Unicode are replaced by "REPLACEMENT CHARACTER", * which is a question mark in a black diamond. For instance, if the * original encoding is ISO_IR_6, any octets with the 8th bit set will * be replaced. * * DICOM supports a fairly small number of single-byte and multi-byte * character sets. The only VRs that support these character sets are * PN, LO, SH, ST, LT, and ST (all other text VRs must be ASCII). In * total, there is one 7-bit encoding (ASCII), eleven 8-bit single-byte * encodings, three variable-length encodings (UTF-8, GB18030, GBK), and * three iso-2022 multi-byte encodings. It is possible to use iso-2022 * escape codes to switch between most of the encodings, with UTF-8 and * GB18030/GBK as the most noteworthy exceptions. * * In some DICOM data sets, especially old ones, the SpecificCharacterSet * attribute will be missing and it might be necessary to manually specify * a character set for the application to use. Use SetGlobalDefault() to * do so. The vtkDICOMCharacterSet constructor can take the desired * character encoding as a string, where the following encodings are * allowed: 'ascii', 'latin1', 'latin2', 'latin3', 'latin4', 'latin5' * 'latin7', 'latin9', 'cyrillic' (iso-8859-5), 'arabic' (iso-8859-6), * 'greek' (iso-8859-7), 'hebrew' (iso-8859-8), 'tis-620', 'shift-jis', * 'euc-jp', 'iso-2022-jp', 'korean' (euc-kr), 'chinese' (gbk), 'gb18030', * 'big5', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', * 'cp1256', 'cp1257', and 'utf-8'. Common aliases of these character * sets can also be used. */ class VTKDICOM_EXPORT vtkDICOMCharacterSet { public: enum EnumType { ISO_IR_6 = 0, // US_ASCII ISO_IR_13 = 1, // JIS X 0201, japanese romaji + katakana ISO_IR_100 = 8, // ISO-8859-1, latin1, western europe ISO_IR_101 = 9, // ISO-8859-2, latin2, central europe ISO_IR_109 = 10, // ISO-8859-3, latin3, maltese ISO_IR_110 = 11, // ISO-8859-4, latin4, baltic ISO_IR_144 = 12, // ISO-8859-5, cyrillic ISO_IR_127 = 13, // ISO-8859-6, arabic ISO_IR_126 = 14, // ISO-8859-7, greek ISO_IR_138 = 15, // ISO-8859-8, hebrew ISO_IR_148 = 16, // ISO-8859-9, latin5, turkish X_LATIN6 = 17, // ISO-8859-10, latin6, nordic ISO_IR_166 = 18, // ISO-8859-11, thai X_LATIN7 = 19, // ISO-8859-13, latin7, baltic rim X_LATIN8 = 20, // ISO-8859-14, latin8, celtic X_LATIN9 = 21, // ISO-8859-15, latin9, western europe X_LATIN10 = 22, // ISO-8859-16, latin10, southeastern europe X_EUCKR = 24, // euc-kr, ISO_IR_149 without escape codes X_GB2312 = 25, // gb2312, ISO_IR_58 without escape codes ISO_2022_IR_6 = 32, // US_ASCII ISO_2022_IR_13 = 33, // JIS X 0201, japanese katakana ISO_2022_IR_87 = 34, // JIS X 0208, japanese 94x94 primary ISO_2022_IR_159 = 36, // JIS X 0212, japanese 94x94 secondary ISO_2022_IR_100 = 40, // ISO-8859-1, latin1, western europe ISO_2022_IR_101 = 41, // ISO-8859-2, latin2, central europe ISO_2022_IR_109 = 42, // ISO-8859-3, latin3, maltese ISO_2022_IR_110 = 43, // ISO-8859-4, latin4, baltic ISO_2022_IR_144 = 44, // ISO-8859-5, cyrillic ISO_2022_IR_127 = 45, // ISO-8859-6, arabic ISO_2022_IR_126 = 46, // ISO-8859-7, greek ISO_2022_IR_138 = 47, // ISO-8859-8, hebrew ISO_2022_IR_148 = 48, // ISO-8859-9, latin5, turkish ISO_2022_IR_166 = 50, // ISO-8859-11, thai ISO_2022_IR_149 = 56, // the KS X 1001 part of ISO-2022-KR ISO_2022_IR_58 = 57, // the GB2312 part of ISO-2022-CN ISO_IR_192 = 64, // UTF-8, unicode GB18030 = 65, // gb18030, chinese with full unicode mapping GBK = 66, // gbk, chinese X_BIG5 = 67, // big5 + ETEN, traditional chinese X_EUCJP = 69, // euc-jp, unix encoding for japanese X_SJIS = 70, // windows-31j, aka shift-jis, code page 932 X_CP874 = 76, // cp1162, thai (windows-874) X_CP1250 = 80, // cp1250, central europe X_CP1251 = 81, // cp1251, cyrillic X_CP1252 = 82, // cp1252, western europe X_CP1253 = 83, // cp1253, greek X_CP1254 = 84, // cp1254, turkish X_CP1255 = 85, // cp1255, hebrew X_CP1256 = 86, // cp1256, arabic X_CP1257 = 87, // cp1257, baltic rim X_KOI8 = 90, // koi8, cyrillic Unknown = 255 // signifies unknown character set }; //@{ //! Construct an object that describes the default (ASCII) character set. vtkDICOMCharacterSet() : Key(0) {} //! Construct a character set object from a given code. /*! * The code can be any of the enumerated code values. The ISO_2022 flag * can be added to any of the ISO-8859 codes to indicate that the character * set allows the use of escape codes. Also note that ISO_2022_IR_87 and * ISO_2022_IR_159 are combining codes that can be added to each other and * to ISO_IR_13. Specifying any other codes in combination can lead to * undefined results, for example "ISO_2022_IR_100 | ISO_2022_IR_101" is * not permitted and "ISO_2022_IR_100" must be used instead. */ vtkDICOMCharacterSet(int k) : Key(static_cast(k)) {} //! Construct a character set object from a SpecificCharacterSet value. /*! * This generates an 8-bit code that uniquely identifies a DICOM * character set plus its code extensions. */ explicit vtkDICOMCharacterSet(const std::string& name) { this->Key = KeyFromString(name.data(), name.length()); } vtkDICOMCharacterSet(const char *name, size_t nl) { this->Key = KeyFromString(name, nl); } //@} //@{ //! Set the character set to use if SpecificCharacterSet is missing. /*! * Some DICOM files do not list a SpecificCharacterSet attribute, but * nevertheless use a non-ASCII character encoding. This method can be * used to specify the character set in absence of SpecificCharacterSet. * If SpecificCharacterSet is present, the default will not override it * unless OverrideCharacterSet is true. */ static void SetGlobalDefault(vtkDICOMCharacterSet cs) { GlobalDefault = cs.GetKey(); } static vtkDICOMCharacterSet GetGlobalDefault() { return GlobalDefault; } //! Override the value stored in SpecificCharacterSet with the default. /*! * This method can be used if the SpecificCharacterSet attribute of a * file is incorrect. It forces the use of the character set that * was set with SetGlobalDefault. */ static void SetGlobalOverride(bool b) { GlobalOverride = b; } static void GlobalOverrideOn() { GlobalOverride = true; } static void GlobalOverrideOff() { GlobalOverride = false; } static bool GetGlobalOverride() { return GlobalOverride; } //@} //@{ //! Generate SpecificCharacterSet code values (diagnostic only). /*! * Attempt to generate SpecificCharacterSet code values. If ISO 2022 * encoding is not used, then a single code value is returned. If * ISO 2022 encoding is used with the single-byte character sets, then * only the code value for first character set will be returned (due to * limitations in the way this class stores the information). However, * if ISO 2022 encoding is used with the multi-byte character sets, * the result is a set of backslash-separated code values, where * the first value will be empty if the initial coding is ASCII. */ std::string GetCharacterSetString() const; //! Get the numerical code for this character set object. unsigned char GetKey() const { return this->Key; } //@} //@{ //! Convert text from UTF-8 to this encoding. /*! * Attempt to convert from UTF-8 to this character set. Every * non-convertible character will be replaced with '?'. If you * pass a non-null value for the "lp" parameter, it will return * the position in the input UTF-8 string where the first conversion * error occurred. If a successful conversion was returned, then * lp will be set to the length of the input string. */ std::string FromUTF8(const char *text, size_t l, size_t *lp=0) const; std::string FromUTF8(const std::string& text) const { return FromUTF8(text.data(), text.length()); } //! Convert text from this encoding to UTF-8. /*! * This will convert text to UTF-8, which is generally a lossless * process for western languages but not for the CJK languages. * Characters that cannot be mapped to unicode, or whose place in * unicode is not known, will be printed as unicode U+FFFD which * appears as a question mark in a diamond. If you pass a non-null * value for the "lp" parameter, it will return the position in the * input string where the first conversion error occurred. If a * successful conversion was returned, then lp will be set to the * length of the input string. */ std::string ToUTF8(const char *text, size_t l, size_t *lp=0) const; std::string ToUTF8(const std::string& text) const { return ToUTF8(text.data(), text.length()); } //! Obsolete method for converting to UTF8. std::string ConvertToUTF8(const char *text, size_t l) const; //! Convert text to UTF-8 that is safe to print to the console. /*! * All control characters or unconvertible characters will be replaced * by four-byte octal codes, e.g. '\033'. Backslashes will be replaced * by '\134' to avoid any potential ambiguity. */ std::string ToSafeUTF8(const char *text, size_t l) const; std::string ToSafeUTF8(const std::string& text) const { return ToSafeUTF8(text.data(), text.length()); } //! Convert text into a form suitable for case-insensitive matching. /*! * This function will perform case normalization on a string by * converting it to lowercase, and by normalizing the forms of * lowercase characters that do not have an exact uppercase * equivalent. In some cases, it might increase the length of * the string. It covers modern European scripts (including Greek * and Cyrillic) and latin characters used in East Asian languages. */ std::string CaseFoldedUTF8(const char *text, size_t l) const; std::string CaseFoldedUTF8(const std::string& text) const { return CaseFoldedUTF8(text.data(), text.length()); } //! Returns true if ISO 2022 escape codes are used. /*! * If this method returns true, then escape codes can be used to * switch between character sets. */ bool IsISO2022() const { return ((this->Key & (ISO_2022 + ISO_2022 - 1)) == (this->Key | ISO_2022)); } //! Returns true if this uses an ISO 8859 code page. bool IsISO8859() const { return (this->Key >= ISO_IR_100 && this->Key <= X_LATIN10); } //! Check for bidirectional character sets. /*! * This is used to check for character sets that are likely to * contain characters that print right-to-left, specifically Hebrew * and Arabic. Note that even though some parts of unicode fall * into this category, this flag is off for unicode and GB18030/GBK. */ bool IsBiDirectional() const { return (this->Key == ISO_IR_127 || this->Key == ISO_IR_138 || this->Key == X_CP1255 || this->Key == X_CP1256); } //@} //@{ //! Count the number of backslashes in an encoded string. /*! * The backslash byte is sometimes present as half of a multibyte * character in the Japanese and Chinese encodings. This method * skips these false backslashes and counts only real backslashes. */ unsigned int CountBackslashes(const char *text, size_t l) const; //! Get the offset to the next backslash, or to the end of the string. /*! * In order to work properly, this method requires that its input is * either at the beginning of the string or just after a backslash. */ size_t NextBackslash(const char *text, const char *end) const; //@} //@{ bool operator==(vtkDICOMCharacterSet b) const { return (this->Key == b.Key); } bool operator!=(vtkDICOMCharacterSet b) const { return (this->Key != b.Key); } bool operator<=(vtkDICOMCharacterSet a) const { return (this->Key <= a.Key); } bool operator>=(vtkDICOMCharacterSet a) const { return (this->Key >= a.Key); } bool operator<(vtkDICOMCharacterSet a) const { return (this->Key < a.Key); } bool operator>(vtkDICOMCharacterSet a) const { return (this->Key > a.Key); } //@} private: size_t AnyToUTF8(const char *t, size_t l, std::string *s, int m) const; size_t UTF8ToSingleByte(const char *t, size_t l, std::string *s) const; size_t SingleByteToUTF8(const char *t, size_t l, std::string *s, int m) const; size_t ISO8859ToUTF8(const char *t, size_t l, std::string *s, int) const; size_t UTF8ToISO2022(const char *t, size_t l, std::string *s) const; size_t ISO2022ToUTF8(const char *t, size_t l, std::string *s, int m) const; static size_t UTF8ToEUCKR(const char *t, size_t l, std::string *s); static size_t EUCKRToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToGB2312(const char *t, size_t l, std::string *s); static size_t GB2312ToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToGB18030(const char *t, size_t l, std::string *s); static size_t GB18030ToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToGBK(const char *t, size_t l, std::string *s); static size_t GBKToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToBig5(const char *t, size_t l, std::string *s); static size_t Big5ToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToEUCJP(const char *t, size_t l, std::string *s); static size_t EUCJPToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToSJIS(const char *t, size_t l, std::string *s); static size_t SJISToUTF8(const char *t, size_t l, std::string *s, int m); static size_t UTF8ToJISX( int charset, const char *t, size_t l, std::string *s); static size_t JISXToUTF8( int csGL, int csGR, const char *t, size_t l, std::string *s, int m); static unsigned char KeyFromString(const char *name, size_t nl); unsigned char Key; enum { ISO_2022_JP_BASE = 7, ISO_2022_BASE = 31, ISO_2022 = 32 }; static unsigned char GlobalDefault; static bool GlobalOverride; public: static const unsigned short *Table[256]; static const unsigned short *Reverse[256]; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMCharacterSet& a); #endif /* vtkDICOMCharacterSet_h */ // VTK-HeaderTest-Exclude: vtkDICOMCharacterSet.h vtk-dicom-0.8.12/Source/vtkDICOMCharacterSetTables.cxx000066400000000000000000055377711356440565500225350ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/ #include "vtkDICOMCharacterSetTables.h" // ASCII const unsigned short CodePageASCII[9] = { // hot segments (indexes into segment table) 1, 0, // number of segments 2, // segment table 0, 128, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 }; // Reverse const unsigned short CodePageASCII_R[9] = { // hot segments (indexes into segment table) 1, 0, // number of segments 2, // segment table 0x0000, 0x0080, // compressed segments 0, RCHAR, // uncompressed segments RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 }; // JIS X 0201 const unsigned short CodePageJISX0201[23] = { // hot segments (indexes into segment table) 0, // number of segments 7, // segment table 0, 92, 93, 126, 127, 161, 224, // compressed segments 0x0000, 0x00A5, 0x005D, 0x203E, 0x007F, 0xFF61, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 91] -> [0x0000,0x005B] # seg 0 // [ 92, 92] -> [0x00A5,0x00A5] # seg 1 // [ 93, 125] -> [0x005D,0x007D] # seg 2 // [ 126, 126] -> [0x203E,0x203E] # seg 3 // [ 127, 160] -> [0x007F,0x00A0] # seg 4 // [ 161, 223] -> [0xFF61,0xFF9F] # seg 5 }; // Reverse const unsigned short CodePageJISX0201_R[165] = { // hot segments (indexes into segment table) 0, // number of segments 16, // segment table 0x0000, 0x00A1, 0x00A5, 0x00A6, 0x203E, 0x203F, 0x3000, 0x300E, 0x309B, 0x30FD, 0xFF01, 0xFF5F, 0xFF61, 0xFFA0, 0xFFE3, 0xFFE6, // compressed segments 0, RCHAR, 92, RCHAR, 126, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 33, RCHAR, 161, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0, RCHAR, 14, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 112, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A5,0x00A5] -> [ 92, 92] # seg 2 // [0x203E,0x203E] -> [ 126, 126] # seg 4 // [0x3000,0x300D] -v # seg 6 at pos 0 32, 164, 161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 162, 163, // [0x309B,0x30FC] -v # seg 8 at pos 14 222, 223, RCHAR, RCHAR, RCHAR, RCHAR, 167, 177, 168, 178, 169, 179, 170, 180, 171, 181, 182, RCHAR, 183, RCHAR, 184, RCHAR, 185, RCHAR, 186, RCHAR, 187, RCHAR, 188, RCHAR, 189, RCHAR, 190, RCHAR, 191, RCHAR, 192, RCHAR, 193, RCHAR, 175, 194, RCHAR, 195, RCHAR, 196, RCHAR, 197, 198, 199, 200, 201, 202, RCHAR, RCHAR, 203, RCHAR, RCHAR, 204, RCHAR, RCHAR, 205, RCHAR, RCHAR, 206, RCHAR, RCHAR, 207, 208, 209, 210, 211, 172, 212, 173, 213, 174, 214, 215, 216, 217, 218, 219, RCHAR, 220, RCHAR, RCHAR, 166, 221, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 165, 176, // [0xFF01,0xFF5E] -> [ 33, 126] # seg 10 // [0xFF61,0xFF9F] -> [ 161, 223] # seg 12 // [0xFFE3,0xFFE5] -v # seg 14 at pos 112 126, RCHAR, 92, }; // Latin1, Western Europe const unsigned short CodePageISO8859_1[6] = { // hot segments (indexes into segment table) 1, 0, // number of segments 1, // segment table 0, // compressed segments 0x0000, // uncompressed segments RCHAR, // [ 0, 255] -> [0x0000,0x00FF] # seg 0 }; // Reverse const unsigned short CodePageISO8859_1_R[9] = { // hot segments (indexes into segment table) 1, 0, // number of segments 2, // segment table 0x0000, 0x0100, // compressed segments 0, RCHAR, // uncompressed segments RCHAR, RCHAR, // [0x0000,0x00FF] -> [ 0, 255] # seg 0 }; // Latin2, Central Europe const unsigned short CodePageISO8859_2[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, }; // Reverse const unsigned short CodePageISO8859_2_R[229] = { // hot segments (indexes into segment table) 1, 0, // number of segments 10, // segment table 0x0000, 0x00A1, 0x00A4, 0x011C, 0x0139, 0x017F, 0x02C7, 0x02C8, 0x02D8, 0x02DE, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 183, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 120, RCHAR, RCHAR, RCHAR, 190, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A4,0x011B] -v # seg 2 at pos 0 164, RCHAR, RCHAR, 167, 168, RCHAR, RCHAR, RCHAR, RCHAR, 173, RCHAR, RCHAR, 176, RCHAR, RCHAR, RCHAR, 180, RCHAR, RCHAR, RCHAR, 184, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 193, 194, RCHAR, 196, RCHAR, RCHAR, 199, RCHAR, 201, RCHAR, 203, RCHAR, 205, 206, RCHAR, RCHAR, RCHAR, RCHAR, 211, 212, RCHAR, 214, 215, RCHAR, RCHAR, 218, RCHAR, 220, 221, RCHAR, 223, RCHAR, 225, 226, RCHAR, 228, RCHAR, RCHAR, 231, RCHAR, 233, RCHAR, 235, RCHAR, 237, 238, RCHAR, RCHAR, RCHAR, RCHAR, 243, 244, RCHAR, 246, 247, RCHAR, RCHAR, 250, RCHAR, 252, 253, RCHAR, RCHAR, RCHAR, RCHAR, 195, 227, 161, 177, 198, 230, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, 207, 239, 208, 240, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 202, 234, 204, 236, // [0x0139,0x017E] -v # seg 4 at pos 120 197, 229, RCHAR, RCHAR, 165, 181, RCHAR, RCHAR, 163, 179, 209, 241, RCHAR, RCHAR, 210, 242, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 213, 245, RCHAR, RCHAR, 192, 224, RCHAR, RCHAR, 216, 248, 166, 182, RCHAR, RCHAR, 170, 186, 169, 185, 222, 254, 171, 187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, 219, 251, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 172, 188, 175, 191, 174, 190, // [0x02C7,0x02C7] -> [ 183, 183] # seg 6 // [0x02D8,0x02DD] -v # seg 8 at pos 190 162, 255, RCHAR, 178, RCHAR, 189, }; // Latin3, Maltese const unsigned short CodePageISO8859_3[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, RCHAR, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, RCHAR, 0x017B, 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, RCHAR, 0x017C, 0x00C0, 0x00C1, 0x00C2, RCHAR, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, RCHAR, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, 0x00E0, 0x00E1, 0x00E2, RCHAR, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, RCHAR, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9, }; // Reverse const unsigned short CodePageISO8859_3_R[199] = { // hot segments (indexes into segment table) 1, 0, // number of segments 10, // segment table 0x0000, 0x00A1, 0x00A3, 0x010C, 0x011C, 0x0136, 0x015C, 0x017D, 0x02D8, 0x02DA, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 105, RCHAR, 131, RCHAR, 164, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A3,0x010B] -v # seg 2 at pos 0 163, 164, RCHAR, RCHAR, 167, 168, RCHAR, RCHAR, RCHAR, RCHAR, 173, RCHAR, RCHAR, 176, RCHAR, 178, 179, 180, 181, RCHAR, 183, 184, RCHAR, RCHAR, RCHAR, RCHAR, 189, RCHAR, RCHAR, 192, 193, 194, RCHAR, 196, RCHAR, RCHAR, 199, 200, 201, 202, 203, 204, 205, 206, 207, RCHAR, 209, 210, 211, 212, RCHAR, 214, 215, RCHAR, 217, 218, 219, 220, RCHAR, RCHAR, 223, 224, 225, 226, RCHAR, 228, RCHAR, RCHAR, 231, 232, 233, 234, 235, 236, 237, 238, 239, RCHAR, 241, 242, 243, 244, RCHAR, 246, 247, RCHAR, 249, 250, 251, 252, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 198, 230, 197, 229, // [0x011C,0x0135] -v # seg 4 at pos 105 216, 248, 171, 187, 213, 245, RCHAR, RCHAR, 166, 182, 161, 177, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 169, 185, RCHAR, RCHAR, 172, 188, // [0x015C,0x017C] -v # seg 6 at pos 131 222, 254, 170, 186, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 221, 253, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 175, 191, // [0x02D8,0x02D9] -v # seg 8 at pos 164 162, 255, }; // Latin4, Northern Europe const unsigned short CodePageISO8859_4[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9, }; // Reverse const unsigned short CodePageISO8859_4_R[249] = { // hot segments (indexes into segment table) 1, 0, // number of segments 8, // segment table 0x0000, 0x00A1, 0x00A4, 0x017F, 0x02C7, 0x02C8, 0x02D9, 0x02DC, // compressed segments 0, RCHAR, RCHAR, RCHAR, 183, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, 219, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A4,0x017E] -v # seg 2 at pos 0 164, RCHAR, RCHAR, 167, 168, RCHAR, RCHAR, RCHAR, RCHAR, 173, RCHAR, 175, 176, RCHAR, RCHAR, RCHAR, 180, RCHAR, RCHAR, RCHAR, 184, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 193, 194, 195, 196, 197, 198, RCHAR, RCHAR, 201, RCHAR, 203, RCHAR, 205, 206, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 212, 213, 214, 215, 216, RCHAR, 218, 219, 220, RCHAR, RCHAR, 223, RCHAR, 225, 226, 227, 228, 229, 230, RCHAR, RCHAR, 233, RCHAR, 235, RCHAR, 237, 238, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 244, 245, 246, 247, 248, RCHAR, 250, 251, 252, RCHAR, RCHAR, RCHAR, 192, 224, RCHAR, RCHAR, 161, 177, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, RCHAR, RCHAR, 208, 240, 170, 186, RCHAR, RCHAR, 204, 236, 202, 234, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 171, 187, RCHAR, RCHAR, RCHAR, RCHAR, 165, 181, 207, 239, RCHAR, RCHAR, 199, 231, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 211, 243, 162, RCHAR, RCHAR, 166, 182, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 209, 241, RCHAR, RCHAR, RCHAR, 189, 191, 210, 242, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 163, 179, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 169, 185, RCHAR, RCHAR, RCHAR, RCHAR, 172, 188, 221, 253, 222, 254, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 174, 190, // [0x02C7,0x02C7] -> [ 183, 183] # seg 4 // [0x02D9,0x02DB] -v # seg 6 at pos 219 255, RCHAR, 178, }; // Cyrillic const unsigned short CodePageISO8859_5[27] = { // hot segments (indexes into segment table) 1, 0, // number of segments 8, // segment table 0, 161, 173, 174, 240, 241, 253, 254, // compressed segments 0x0000, 0x0401, 0x00AD, 0x040E, 0x2116, 0x0451, 0x00A7, 0x045E, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 160] -> [0x0000,0x00A0] # seg 0 // [ 161, 172] -> [0x0401,0x040C] # seg 1 // [ 173, 173] -> [0x00AD,0x00AD] # seg 2 // [ 174, 239] -> [0x040E,0x044F] # seg 3 // [ 240, 240] -> [0x2116,0x2116] # seg 4 // [ 241, 252] -> [0x0451,0x045C] # seg 5 // [ 253, 253] -> [0x00A7,0x00A7] # seg 6 // [ 254, 255] -> [0x045E,0x045F] # seg 7 }; // Reverse const unsigned short CodePageISO8859_5_R[51] = { // hot segments (indexes into segment table) 1, 0, // number of segments 16, // segment table 0x0000, 0x00A1, 0x00A7, 0x00A8, 0x00AD, 0x00AE, 0x0401, 0x040D, 0x040E, 0x0450, 0x0451, 0x045D, 0x045E, 0x0460, 0x2116, 0x2117, // compressed segments 0, RCHAR, 253, RCHAR, 173, RCHAR, 161, RCHAR, 174, RCHAR, 241, RCHAR, 254, RCHAR, 240, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A7,0x00A7] -> [ 253, 253] # seg 2 // [0x00AD,0x00AD] -> [ 173, 173] # seg 4 // [0x0401,0x040C] -> [ 161, 172] # seg 6 // [0x040E,0x044F] -> [ 174, 239] # seg 8 // [0x0451,0x045C] -> [ 241, 252] # seg 10 // [0x045E,0x045F] -> [ 254, 255] # seg 12 // [0x2116,0x2116] -> [ 240, 240] # seg 14 }; // Arabic const unsigned short CodePageISO8859_6[48] = { // hot segments (indexes into segment table) 1, 0, // number of segments 15, // segment table 0, 161, 164, 165, 172, 173, 174, 187, 188, 191, 192, 193, 219, 224, 243, // compressed segments 0x0000, RCHAR, 0x00A4, RCHAR, 0x060C, 0x00AD, RCHAR, 0x061B, RCHAR, 0x061F, RCHAR, 0x0621, RCHAR, 0x0640, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 160] -> [0x0000,0x00A0] # seg 0 // [ 164, 164] -> [0x00A4,0x00A4] # seg 2 // [ 172, 172] -> [0x060C,0x060C] # seg 4 // [ 173, 173] -> [0x00AD,0x00AD] # seg 5 // [ 187, 187] -> [0x061B,0x061B] # seg 7 // [ 191, 191] -> [0x061F,0x061F] # seg 9 // [ 193, 218] -> [0x0621,0x063A] # seg 11 // [ 224, 242] -> [0x0640,0x0652] # seg 13 }; // Reverse const unsigned short CodePageISO8859_6_R[51] = { // hot segments (indexes into segment table) 1, 0, // number of segments 16, // segment table 0x0000, 0x00A1, 0x00A4, 0x00A5, 0x00AD, 0x00AE, 0x060C, 0x060D, 0x061B, 0x061C, 0x061F, 0x0620, 0x0621, 0x063B, 0x0640, 0x0653, // compressed segments 0, RCHAR, 164, RCHAR, 173, RCHAR, 172, RCHAR, 187, RCHAR, 191, RCHAR, 193, RCHAR, 224, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A4,0x00A4] -> [ 164, 164] # seg 2 // [0x00AD,0x00AD] -> [ 173, 173] # seg 4 // [0x060C,0x060C] -> [ 172, 172] # seg 6 // [0x061B,0x061B] -> [ 187, 187] # seg 8 // [0x061F,0x061F] -> [ 191, 191] # seg 10 // [0x0621,0x063A] -> [ 193, 218] # seg 12 // [0x0640,0x0652] -> [ 224, 242] # seg 14 }; // Greek const unsigned short CodePageISO8859_7[66] = { // hot segments (indexes into segment table) 1, 0, // number of segments 21, // segment table 0, 161, 163, 164, 165, 166, 170, 171, 174, 175, 176, 180, 183, 184, 187, 188, 189, 190, 210, 211, 255, // compressed segments 0x0000, 0x2018, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x037A, 0x00AB, RCHAR, 0x2015, 0x00B0, 0x0384, 0x00B7, 0x0388, 0x00BB, 0x038C, 0x00BD, 0x038E, RCHAR, 0x03A3, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 160] -> [0x0000,0x00A0] # seg 0 // [ 161, 162] -> [0x2018,0x2019] # seg 1 // [ 163, 163] -> [0x00A3,0x00A3] # seg 2 // [ 164, 164] -> [0x20AC,0x20AC] # seg 3 // [ 165, 165] -> [0x20AF,0x20AF] # seg 4 // [ 166, 169] -> [0x00A6,0x00A9] # seg 5 // [ 170, 170] -> [0x037A,0x037A] # seg 6 // [ 171, 173] -> [0x00AB,0x00AD] # seg 7 // [ 175, 175] -> [0x2015,0x2015] # seg 9 // [ 176, 179] -> [0x00B0,0x00B3] # seg 10 // [ 180, 182] -> [0x0384,0x0386] # seg 11 // [ 183, 183] -> [0x00B7,0x00B7] # seg 12 // [ 184, 186] -> [0x0388,0x038A] # seg 13 // [ 187, 187] -> [0x00BB,0x00BB] # seg 14 // [ 188, 188] -> [0x038C,0x038C] # seg 15 // [ 189, 189] -> [0x00BD,0x00BD] # seg 16 // [ 190, 209] -> [0x038E,0x03A1] # seg 17 // [ 211, 254] -> [0x03A3,0x03CE] # seg 19 }; // Reverse const unsigned short CodePageISO8859_7_R[111] = { // hot segments (indexes into segment table) 1, 0, // number of segments 36, // segment table 0x0000, 0x00A1, 0x00A3, 0x00A4, 0x00A6, 0x00AA, 0x00AB, 0x00AE, 0x00B0, 0x00B4, 0x00B7, 0x00B8, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x037A, 0x037B, 0x0384, 0x0387, 0x0388, 0x038B, 0x038C, 0x038D, 0x038E, 0x03A2, 0x03A3, 0x03CF, 0x2015, 0x2016, 0x2018, 0x201A, 0x20AC, 0x20AD, 0x20AF, 0x20B0, // compressed segments 0, RCHAR, 163, RCHAR, 166, RCHAR, 171, RCHAR, 176, RCHAR, 183, RCHAR, 187, RCHAR, 189, RCHAR, 170, RCHAR, 180, RCHAR, 184, RCHAR, 188, RCHAR, 190, RCHAR, 211, RCHAR, 175, RCHAR, 161, RCHAR, 164, RCHAR, 165, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A3,0x00A3] -> [ 163, 163] # seg 2 // [0x00A6,0x00A9] -> [ 166, 169] # seg 4 // [0x00AB,0x00AD] -> [ 171, 173] # seg 6 // [0x00B0,0x00B3] -> [ 176, 179] # seg 8 // [0x00B7,0x00B7] -> [ 183, 183] # seg 10 // [0x00BB,0x00BB] -> [ 187, 187] # seg 12 // [0x00BD,0x00BD] -> [ 189, 189] # seg 14 // [0x037A,0x037A] -> [ 170, 170] # seg 16 // [0x0384,0x0386] -> [ 180, 182] # seg 18 // [0x0388,0x038A] -> [ 184, 186] # seg 20 // [0x038C,0x038C] -> [ 188, 188] # seg 22 // [0x038E,0x03A1] -> [ 190, 209] # seg 24 // [0x03A3,0x03CE] -> [ 211, 254] # seg 26 // [0x2015,0x2015] -> [ 175, 175] # seg 28 // [0x2018,0x2019] -> [ 161, 162] # seg 30 // [0x20AC,0x20AC] -> [ 164, 164] # seg 32 // [0x20AF,0x20AF] -> [ 165, 165] # seg 34 }; // Hebrew const unsigned short CodePageISO8859_8[42] = { // hot segments (indexes into segment table) 1, 0, // number of segments 13, // segment table 0, 161, 162, 170, 171, 186, 187, 191, 223, 224, 251, 253, 255, // compressed segments 0x0000, RCHAR, 0x00A2, 0x00D7, 0x00AB, 0x00F7, 0x00BB, RCHAR, 0x2017, 0x05D0, RCHAR, 0x200E, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 160] -> [0x0000,0x00A0] # seg 0 // [ 162, 169] -> [0x00A2,0x00A9] # seg 2 // [ 170, 170] -> [0x00D7,0x00D7] # seg 3 // [ 171, 185] -> [0x00AB,0x00B9] # seg 4 // [ 186, 186] -> [0x00F7,0x00F7] # seg 5 // [ 187, 190] -> [0x00BB,0x00BE] # seg 6 // [ 223, 223] -> [0x2017,0x2017] # seg 8 // [ 224, 250] -> [0x05D0,0x05EA] # seg 9 // [ 253, 254] -> [0x200E,0x200F] # seg 11 }; // Reverse const unsigned short CodePageISO8859_8_R[57] = { // hot segments (indexes into segment table) 1, 0, // number of segments 18, // segment table 0x0000, 0x00A1, 0x00A2, 0x00AA, 0x00AB, 0x00BA, 0x00BB, 0x00BF, 0x00D7, 0x00D8, 0x00F7, 0x00F8, 0x05D0, 0x05EB, 0x200E, 0x2010, 0x2017, 0x2018, // compressed segments 0, RCHAR, 162, RCHAR, 171, RCHAR, 187, RCHAR, 170, RCHAR, 186, RCHAR, 224, RCHAR, 253, RCHAR, 223, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A2,0x00A9] -> [ 162, 169] # seg 2 // [0x00AB,0x00B9] -> [ 171, 185] # seg 4 // [0x00BB,0x00BE] -> [ 187, 190] # seg 6 // [0x00D7,0x00D7] -> [ 170, 170] # seg 8 // [0x00F7,0x00F7] -> [ 186, 186] # seg 10 // [0x05D0,0x05EA] -> [ 224, 250] # seg 12 // [0x200E,0x200F] -> [ 253, 254] # seg 14 // [0x2017,0x2017] -> [ 223, 223] # seg 16 }; // Latin5, Turkish const unsigned short CodePageISO8859_9[36] = { // hot segments (indexes into segment table) 1, 0, // number of segments 11, // segment table 0, 208, 209, 221, 222, 223, 240, 241, 253, 254, 255, // compressed segments 0x0000, 0x011E, 0x00D1, 0x0130, 0x015E, 0x00DF, 0x011F, 0x00F1, 0x0131, 0x015F, 0x00FF, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 207] -> [0x0000,0x00CF] # seg 0 // [ 208, 208] -> [0x011E,0x011E] # seg 1 // [ 209, 220] -> [0x00D1,0x00DC] # seg 2 // [ 221, 221] -> [0x0130,0x0130] # seg 3 // [ 222, 222] -> [0x015E,0x015E] # seg 4 // [ 223, 239] -> [0x00DF,0x00EF] # seg 5 // [ 240, 240] -> [0x011F,0x011F] # seg 6 // [ 241, 252] -> [0x00F1,0x00FC] # seg 7 // [ 253, 253] -> [0x0131,0x0131] # seg 8 // [ 254, 254] -> [0x015F,0x015F] # seg 9 // [ 255, 255] -> [0x00FF,0x00FF] # seg 10 }; // Reverse const unsigned short CodePageISO8859_9_R[60] = { // hot segments (indexes into segment table) 1, 0, // number of segments 19, // segment table 0x0000, 0x00D0, 0x00D1, 0x00DD, 0x00DF, 0x00F0, 0x00F1, 0x00FD, 0x00FF, 0x0100, 0x011E, 0x011F, 0x0120, 0x0130, 0x0131, 0x0132, 0x015E, 0x015F, 0x0160, // compressed segments 0, RCHAR, 209, RCHAR, 223, RCHAR, 241, RCHAR, 255, RCHAR, 208, 240, RCHAR, 221, 253, RCHAR, 222, 254, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00CF] -> [ 0, 207] # seg 0 // [0x00D1,0x00DC] -> [ 209, 220] # seg 2 // [0x00DF,0x00EF] -> [ 223, 239] # seg 4 // [0x00F1,0x00FC] -> [ 241, 252] # seg 6 // [0x00FF,0x00FF] -> [ 255, 255] # seg 8 // [0x011E,0x011E] -> [ 208, 208] # seg 10 // [0x011F,0x011F] -> [ 240, 240] # seg 11 // [0x0130,0x0130] -> [ 221, 221] # seg 13 // [0x0131,0x0131] -> [ 253, 253] # seg 14 // [0x015E,0x015E] -> [ 222, 222] # seg 16 // [0x015F,0x015F] -> [ 254, 254] # seg 17 }; // Latin6, Nordic Europe const unsigned short CodePageISO8859_10[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138, }; // Reverse const unsigned short CodePageISO8859_10_R[225] = { // hot segments (indexes into segment table) 1, 0, // number of segments 8, // segment table 0x0000, 0x00A1, 0x00A7, 0x014E, 0x0160, 0x017F, 0x2015, 0x2016, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 189, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 167, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A7,0x014D] -v # seg 2 at pos 0 167, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 173, RCHAR, RCHAR, 176, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 183, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 193, 194, 195, 196, 197, 198, RCHAR, RCHAR, 201, RCHAR, 203, RCHAR, 205, 206, 207, 208, RCHAR, RCHAR, 211, 212, 213, 214, RCHAR, 216, RCHAR, 218, 219, 220, 221, 222, 223, RCHAR, 225, 226, 227, 228, 229, 230, RCHAR, RCHAR, 233, RCHAR, 235, RCHAR, 237, 238, 239, 240, RCHAR, RCHAR, 243, 244, 245, 246, RCHAR, 248, RCHAR, 250, 251, 252, 253, 254, RCHAR, 192, 224, RCHAR, RCHAR, 161, 177, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, RCHAR, RCHAR, 169, 185, 162, 178, RCHAR, RCHAR, 204, 236, 202, 234, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 163, 179, RCHAR, RCHAR, RCHAR, RCHAR, 165, 181, 164, 180, RCHAR, RCHAR, 199, 231, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 166, 182, 255, RCHAR, RCHAR, 168, 184, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 209, 241, RCHAR, RCHAR, RCHAR, 175, 191, 210, 242, // [0x0160,0x017E] -v # seg 4 at pos 167 170, 186, RCHAR, RCHAR, RCHAR, RCHAR, 171, 187, 215, 247, 174, 190, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 172, 188, // [0x2015,0x2015] -> [ 189, 189] # seg 6 }; // Thai, from TIS-620 const unsigned short CodePageISO8859_11[18] = { // hot segments (indexes into segment table) 1, 0, // number of segments 5, // segment table 0, 161, 219, 223, 252, // compressed segments 0x0000, 0x0E01, RCHAR, 0x0E3F, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 160] -> [0x0000,0x00A0] # seg 0 // [ 161, 218] -> [0x0E01,0x0E3A] # seg 1 // [ 223, 251] -> [0x0E3F,0x0E5B] # seg 3 }; // Reverse const unsigned short CodePageISO8859_11_R[21] = { // hot segments (indexes into segment table) 1, 0, // number of segments 6, // segment table 0x0000, 0x00A1, 0x0E01, 0x0E3B, 0x0E3F, 0x0E5C, // compressed segments 0, RCHAR, 161, RCHAR, 223, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x0E01,0x0E3A] -> [ 161, 218] # seg 2 // [0x0E3F,0x0E5B] -> [ 223, 251] # seg 4 }; // Latin7, Baltic Rim const unsigned short CodePageISO8859_13[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019, }; // Reverse const unsigned short CodePageISO8859_13_R[248] = { // hot segments (indexes into segment table) 1, 0, // number of segments 6, // segment table 0x0000, 0x00A1, 0x00A2, 0x017F, 0x2019, 0x201F, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 221, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A2,0x017E] -v # seg 2 at pos 0 162, 163, 164, RCHAR, 166, 167, RCHAR, 169, RCHAR, 171, 172, 173, 174, RCHAR, 176, 177, 178, 179, RCHAR, 181, 182, 183, RCHAR, 185, RCHAR, 187, 188, 189, 190, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 196, 197, 175, RCHAR, RCHAR, 201, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 211, RCHAR, 213, 214, 215, 168, RCHAR, RCHAR, RCHAR, 220, RCHAR, RCHAR, 223, RCHAR, RCHAR, RCHAR, RCHAR, 228, 229, 191, RCHAR, RCHAR, 233, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 243, RCHAR, 245, 246, 247, 184, RCHAR, RCHAR, RCHAR, 252, RCHAR, RCHAR, RCHAR, 194, 226, RCHAR, RCHAR, 192, 224, 195, 227, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, RCHAR, RCHAR, RCHAR, RCHAR, 199, 231, RCHAR, RCHAR, 203, 235, 198, 230, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 204, 236, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 206, 238, RCHAR, RCHAR, 193, 225, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 205, 237, RCHAR, RCHAR, RCHAR, 207, 239, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, 209, 241, 210, 242, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 212, 244, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 170, 186, RCHAR, RCHAR, 218, 250, RCHAR, RCHAR, RCHAR, RCHAR, 208, 240, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 219, 251, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 216, 248, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 202, 234, 221, 253, 222, 254, // [0x2019,0x201E] -v # seg 4 at pos 221 255, RCHAR, RCHAR, 180, 161, 165, }; // Latin8, Celtic const unsigned short CodePageISO8859_14[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF, }; // Reverse const unsigned short CodePageISO8859_14_R[204] = { // hot segments (indexes into segment table) 1, 0, // number of segments 23, // segment table 0x0000, 0x00A1, 0x00A3, 0x00DF, 0x00F0, 0x00F1, 0x010C, 0x0120, 0x0122, 0x0174, 0x0179, 0x1E02, 0x1E0C, 0x1E1E, 0x1E20, 0x1E40, 0x1E42, 0x1E56, 0x1E6C, 0x1E80, 0x1E86, 0x1EF2, 0x1EF4, // compressed segments 0, RCHAR, RCHAR, 223, RCHAR, RCHAR, RCHAR, 178, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 176, RCHAR, 180, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, 60, RCHAR, RCHAR, RCHAR, 87, RCHAR, 92, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 102, RCHAR, 124, RCHAR, 130, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A3,0x00DE] -v # seg 2 at pos 0 163, RCHAR, RCHAR, RCHAR, 167, RCHAR, 169, RCHAR, RCHAR, RCHAR, 173, 174, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 182, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, RCHAR, 209, 210, 211, 212, 213, 214, RCHAR, 216, 217, 218, 219, 220, 221, RCHAR, // [0x00DF,0x00EF] -> [ 223, 239] # seg 3 // [0x00F1,0x010B] -v # seg 5 at pos 60 241, 242, 243, 244, 245, 246, RCHAR, 248, 249, 250, 251, 252, 253, RCHAR, 255, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 164, 165, // [0x0120,0x0121] -> [ 178, 179] # seg 7 // [0x0174,0x0178] -v # seg 9 at pos 87 208, 240, 222, 254, 175, // [0x1E02,0x1E0B] -v # seg 11 at pos 92 161, 162, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 166, 171, // [0x1E1E,0x1E1F] -> [ 176, 177] # seg 13 // [0x1E40,0x1E41] -> [ 180, 181] # seg 15 // [0x1E56,0x1E6B] -v # seg 17 at pos 102 183, 185, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 187, 191, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 215, 247, // [0x1E80,0x1E85] -v # seg 19 at pos 124 168, 184, 170, 186, 189, 190, // [0x1EF2,0x1EF3] -v # seg 21 at pos 130 172, 188, }; // Latin9, Euro 1 const unsigned short CodePageISO8859_15[45] = { // hot segments (indexes into segment table) 1, 0, // number of segments 14, // segment table 0, 164, 165, 166, 167, 168, 169, 180, 181, 184, 185, 188, 190, 191, // compressed segments 0x0000, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x017D, 0x00B5, 0x017E, 0x00B9, 0x0152, 0x0178, 0x00BF, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 163] -> [0x0000,0x00A3] # seg 0 // [ 164, 164] -> [0x20AC,0x20AC] # seg 1 // [ 165, 165] -> [0x00A5,0x00A5] # seg 2 // [ 166, 166] -> [0x0160,0x0160] # seg 3 // [ 167, 167] -> [0x00A7,0x00A7] # seg 4 // [ 168, 168] -> [0x0161,0x0161] # seg 5 // [ 169, 179] -> [0x00A9,0x00B3] # seg 6 // [ 180, 180] -> [0x017D,0x017D] # seg 7 // [ 181, 183] -> [0x00B5,0x00B7] # seg 8 // [ 184, 184] -> [0x017E,0x017E] # seg 9 // [ 185, 187] -> [0x00B9,0x00BB] # seg 10 // [ 188, 189] -> [0x0152,0x0153] # seg 11 // [ 190, 190] -> [0x0178,0x0178] # seg 12 // [ 191, 255] -> [0x00BF,0x00FF] # seg 13 }; // Reverse const unsigned short CodePageISO8859_15_R[81] = { // hot segments (indexes into segment table) 1, 0, // number of segments 26, // segment table 0x0000, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00B4, 0x00B5, 0x00B8, 0x00B9, 0x00BC, 0x00BF, 0x0100, 0x0152, 0x0154, 0x0160, 0x0161, 0x0162, 0x0178, 0x0179, 0x017D, 0x017E, 0x017F, 0x20AC, 0x20AD, // compressed segments 0, RCHAR, 165, RCHAR, 167, RCHAR, 169, RCHAR, 181, RCHAR, 185, RCHAR, 191, RCHAR, 188, RCHAR, 166, 168, RCHAR, 190, RCHAR, 180, 184, RCHAR, 164, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A3] -> [ 0, 163] # seg 0 // [0x00A5,0x00A5] -> [ 165, 165] # seg 2 // [0x00A7,0x00A7] -> [ 167, 167] # seg 4 // [0x00A9,0x00B3] -> [ 169, 179] # seg 6 // [0x00B5,0x00B7] -> [ 181, 183] # seg 8 // [0x00B9,0x00BB] -> [ 185, 187] # seg 10 // [0x00BF,0x00FF] -> [ 191, 255] # seg 12 // [0x0152,0x0153] -> [ 188, 189] # seg 14 // [0x0160,0x0160] -> [ 166, 166] # seg 16 // [0x0161,0x0161] -> [ 168, 168] # seg 17 // [0x0178,0x0178] -> [ 190, 190] # seg 19 // [0x017D,0x017D] -> [ 180, 180] # seg 21 // [0x017E,0x017E] -> [ 184, 184] # seg 22 // [0x20AC,0x20AC] -> [ 164, 164] # seg 24 }; // Latin10, Euro 2 const unsigned short CodePageISO8859_16[106] = { // hot segments (indexes into segment table) 2, 0, 1, // number of segments 2, // segment table 0, 160, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 159] -> [0x0000,0x009F] # seg 0 // [ 160, 255] -v # seg 1 at pos 0 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF, }; // Reverse const unsigned short CodePageISO8859_16_R[222] = { // hot segments (indexes into segment table) 1, 0, // number of segments 12, // segment table 0x0000, 0x00A1, 0x00A7, 0x011A, 0x0141, 0x017F, 0x0218, 0x021C, 0x201D, 0x201F, 0x20AC, 0x20AD, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 164, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 115, RCHAR, 177, RCHAR, 181, RCHAR, RCHAR, RCHAR, // [0x0000,0x00A0] -> [ 0, 160] # seg 0 // [0x00A7,0x0119] -v # seg 2 at pos 0 167, RCHAR, 169, RCHAR, 171, RCHAR, 173, RCHAR, RCHAR, 176, 177, RCHAR, RCHAR, RCHAR, RCHAR, 182, 183, RCHAR, RCHAR, RCHAR, 187, RCHAR, RCHAR, RCHAR, RCHAR, 192, 193, 194, RCHAR, 196, RCHAR, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, RCHAR, RCHAR, 210, 211, 212, RCHAR, 214, RCHAR, RCHAR, 217, 218, 219, 220, RCHAR, RCHAR, 223, 224, 225, 226, RCHAR, 228, RCHAR, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, RCHAR, RCHAR, 242, 243, 244, RCHAR, 246, RCHAR, RCHAR, 249, 250, 251, 252, RCHAR, RCHAR, 255, RCHAR, RCHAR, 195, 227, 161, 162, 197, 229, RCHAR, RCHAR, RCHAR, RCHAR, 178, 185, RCHAR, RCHAR, 208, 240, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 221, 253, // [0x0141,0x017E] -v # seg 4 at pos 115 163, 179, 209, 241, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 213, 245, 188, 189, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 215, 247, RCHAR, RCHAR, RCHAR, RCHAR, 166, 168, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 216, 248, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 190, 172, 174, 175, 191, 180, 184, // [0x0218,0x021B] -v # seg 6 at pos 177 170, 186, 222, 254, // [0x201D,0x201E] -v # seg 8 at pos 181 181, 165, // [0x20AC,0x20AC] -> [ 164, 164] # seg 10 }; // Korean KS X 1001:1998(codes over 8836 are for CP949 compatibility) const unsigned short CodePageKSX1001[13389] = { // hot segments (indexes into segment table) 2, 0, 43, // number of segments 358, // segment table 0, 164, 165, 188, 247, 248, 281, 282, 376, 386, 391, 401, 408, 425, 432, 440, 457, 538, 564, 574, 584, 594, 604, 643, 658, 674, 702, 728, 743, 768, 796, 822, 837, 846, 929, 940, 1026, 1034, 1041, 1067, 1082, 1089, 1115, 1410, 3760, 3854, 4650, 4661, 8742, 8836, 8870, 8880, 8893, 8912, 9103, 9114, 9120, 9138, 9146, 9173, 9192, 9210, 9237, 9294, 9341, 9361, 9372, 9387, 9397, 9403, 9430, 9453, 9464, 9470, 9489, 9517, 9544, 9569, 9580, 9620, 9630, 9657, 9671, 9701, 9767, 9801, 9857, 9880, 9903, 9914, 9949, 10011, 10030, 10037, 10064, 10077, 10087, 10131, 10150, 10197, 10252, 10291, 10302, 10311, 10334, 10355, 10374, 10393, 10422, 10449, 10469, 10488, 10495, 10515, 10584, 10611, 10659, 10721, 10756, 10775, 10810, 10815, 10827, 10840, 10859, 10886, 10889, 10940, 10955, 10989, 11016, 11032, 11066, 11099, 11109, 11167, 11181, 11182, 11216, 11276, 11288, 11320, 11336, 11362, 11432, 11451, 11458, 11485, 11542, 11571, 11628, 11640, 11674, 11715, 11725, 11730, 11757, 11778, 11793, 11827, 11909, 11936, 11942, 11961, 11999, 12035, 12083, 12095, 12133, 12190, 12213, 12235, 12250, 12257, 12276, 12295, 12305, 12308, 12331, 12353, 12364, 12371, 12398, 12403, 12415, 12456, 12492, 12545, 12559, 12598, 12617, 12637, 12643, 12657, 12658, 12692, 12707, 12769, 12796, 12816, 12837, 12927, 12947, 12966, 13004, 13157, 13169, 13197, 13209, 13295, 13314, 13398, 13432, 13481, 13508, 13542, 13567, 13618, 13641, 13662, 13677, 13684, 13703, 13723, 13733, 13760, 13781, 13800, 13807, 13834, 13837, 13881, 13897, 13907, 13920, 13931, 14013, 14023, 14123, 14134, 14392, 14411, 14470, 14497, 14535, 14554, 14583, 14599, 14623, 14642, 14649, 14676, 14710, 14721, 14735, 14769, 14823, 14839, 14873, 14892, 14912, 14918, 14937, 14972, 14997, 15008, 15015, 15034, 15054, 15085, 15112, 15131, 15165, 15192, 15219, 15234, 15237, 15271, 15342, 15376, 15418, 15433, 15443, 15459, 15491, 15503, 15537, 15558, 15573, 15584, 15604, 15623, 15633, 15656, 15714, 15748, 15805, 15824, 15858, 15916, 15943, 15985, 16005, 16018, 16037, 16064, 16090, 16102, 16108, 16128, 16167, 16178, 16193, 16227, 16284, 16304, 16338, 16379, 16394, 16404, 16427, 16449, 16472, 16499, 16502, 16516, 16523, 16550, 16570, 16589, 16596, 16623, 16699, 16709, 16764, 16818, 16922, 16942, 16976, 16979, 17002, 17043, 17063, 17097, 17156, 17192, 17250, 17270, 17304, 17376, 17386, 17409, 17419, 17428, 17442, 17541, 17553, 17658, // compressed segments RCHAR, 0x00AE, RCHAR, 0xFF01, 0xFFE6, 0xFF3D, 0xFFE3, 0x3131, 0x2170, RCHAR, 0x2160, RCHAR, 0x0391, 0x03A3, RCHAR, 0x03B1, RCHAR, RCHAR, RCHAR, 0x3399, RCHAR, 0x33B0, RCHAR, RCHAR, RCHAR, 0x3260, 0x24D0, 0x2460, RCHAR, 0x3200, 0x249C, 0x2474, RCHAR, 0x3041, RCHAR, 0x30A1, RCHAR, RCHAR, 0x0416, RCHAR, RCHAR, 0x0436, RCHAR, RCHAR, RCHAR, RCHAR, 0xF939, RCHAR, RCHAR, RCHAR, 0xAC41, RCHAR, 0xAC5D, RCHAR, 0xAD91, 0xAD9E, 0xADA5, 0xADB8, RCHAR, 0xADE5, RCHAR, 0xAE15, RCHAR, 0xAE8D, RCHAR, 0xAEDD, RCHAR, 0xAEFD, RCHAR, 0xAF11, RCHAR, 0xAF51, 0xAF5E, 0xAF66, RCHAR, 0xAF9D, RCHAR, 0xAFDD, RCHAR, 0xB01E, 0xB029, RCHAR, 0xB05E, RCHAR, 0xB0E6, RCHAR, 0xB161, RCHAR, 0xB19D, 0xB1A9, RCHAR, 0xB221, 0xB235, 0xB23D, RCHAR, 0xB26A, RCHAR, 0xB2B5, RCHAR, 0xB31D, RCHAR, 0xB395, RCHAR, 0xB3AD, RCHAR, 0xB3E9, 0xB3FD, RCHAR, 0xB435, RCHAR, 0xB46D, 0xB481, 0xB489, RCHAR, 0xB4F9, RCHAR, 0xB562, RCHAR, 0xB5D9, 0xB5ED, RCHAR, 0xB619, RCHAR, 0xB635, 0xB649, 0xB665, 0xB669, RCHAR, 0xB6B2, 0xB6D5, RCHAR, 0xB706, RCHAR, 0xB756, RCHAR, 0xB7B9, 0xB7C8, 0xB7CA, RCHAR, 0xB845, RCHAR, 0xB87D, 0xB88E, RCHAR, 0xB905, 0xB919, 0xB921, RCHAR, 0xB98F, RCHAR, 0xBA09, 0xBA16, RCHAR, 0xBA79, RCHAR, 0xBA8D, RCHAR, 0xBAC9, 0xBADA, RCHAR, 0xBB6D, RCHAR, 0xBB91, RCHAR, 0xBBD4, RCHAR, 0xBC51, 0xBC5E, RCHAR, 0xBCDD, RCHAR, 0xBD15, 0xBD25, 0xBD2D, RCHAR, 0xBD5A, 0xBD65, 0xBD69, RCHAR, 0xBDA5, 0xBDB1, 0xBDB9, RCHAR, 0xBDDD, RCHAR, 0xBE20, RCHAR, 0xBE9A, 0xBEA9, RCHAR, 0xBEED, 0xBF02, 0xBF0A, 0xBF1A, 0xBF1E, RCHAR, 0xBF56, 0xBF95, 0xBFB1, RCHAR, 0xBFE2, 0xC03D, RCHAR, 0xC06A, RCHAR, 0xC179, RCHAR, 0xC1B1, RCHAR, 0xC235, RCHAR, 0xC2BA, RCHAR, 0xC32A, 0xC346, RCHAR, 0xC38D, 0xC3C1, RCHAR, 0xC3F9, 0xC409, 0xC411, RCHAR, 0xC43E, 0xC449, RCHAR, 0xC481, 0xC495, 0xC49D, 0xC4B9, 0xC4BD, RCHAR, 0xC502, RCHAR, 0xC51D, RCHAR, 0xC5AA, RCHAR, 0xC661, RCHAR, 0xC7ED, RCHAR, 0xC855, RCHAR, 0xC8A9, RCHAR, 0xC8E5, RCHAR, 0xC919, 0xC92D, 0xC935, RCHAR, 0xC97D, RCHAR, 0xC99E, RCHAR, 0xCA19, 0xCA2A, RCHAR, 0xCA69, 0xCA7E, 0xCA85, 0xCA99, RCHAR, 0xCAE1, 0xCAED, 0xCAF5, RCHAR, 0xCB22, RCHAR, 0xCB65, 0xCB7A, 0xCB9D, 0xCBB9, 0xCBD5, RCHAR, 0xCBEA, RCHAR, 0xCC76, RCHAR, 0xCCD5, RCHAR, 0xCCF1, RCHAR, 0xCD2D, 0xCD3A, RCHAR, 0xCD79, 0xCD89, RCHAR, 0xCDB1, RCHAR, 0xCDD1, RCHAR, 0xCE36, RCHAR, 0xCEAE, 0xCEC2, RCHAR, 0xCF39, RCHAR, 0xCF8D, RCHAR, 0xCFB1, 0xCFC5, RCHAR, 0xD005, 0xD012, 0xD019, RCHAR, 0xD061, RCHAR, 0xD082, RCHAR, 0xD0F9, 0xD10E, RCHAR, 0xD16D, RCHAR, 0xD189, RCHAR, 0xD1C1, 0xD1D9, 0xD1F5, 0xD1F9, RCHAR, 0xD211, RCHAR, 0xD249, 0xD25D, 0xD265, RCHAR, 0xD2E6, RCHAR, 0xD346, RCHAR, 0xD409, 0xD41E, 0xD441, 0xD445, RCHAR, 0xD495, 0xD4AA, RCHAR, 0xD518, RCHAR, 0xD591, 0xD5A6, RCHAR, 0xD62E, RCHAR, 0xD65D, RCHAR, 0xD675, RCHAR, 0xD705, RCHAR, RCHAR, // uncompressed segments 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x09D2, RCHAR, 0x0A23, RCHAR, 0x0A2D, RCHAR, 0x0A37, RCHAR, 0x0A5E, RCHAR, RCHAR, RCHAR, 0x0A6E, RCHAR, RCHAR, RCHAR, 0x0A87, RCHAR, RCHAR, RCHAR, RCHAR, 0x0A90, RCHAR, RCHAR, 0x0A97, RCHAR, RCHAR, 0x00A4, RCHAR, 0x0A9E, RCHAR, 0x0DBA, RCHAR, 0x1DAB, RCHAR, 0x1DCD, RCHAR, 0x1DDA, RCHAR, RCHAR, RCHAR, RCHAR, 0x1E99, RCHAR, 0x1EB4, RCHAR, 0x1EC6, RCHAR, 0x1EFF, RCHAR, 0x1F13, RCHAR, 0x1F22, RCHAR, 0x1F28, RCHAR, RCHAR, RCHAR, 0x1F3F, RCHAR, 0x1F5B, RCHAR, 0x1F74, RCHAR, RCHAR, 0x1F9C, RCHAR, 0x1FAA, RCHAR, 0x1FEC, RCHAR, 0x2024, RCHAR, RCHAR, 0x203B, RCHAR, RCHAR, RCHAR, 0x2079, RCHAR, 0x2086, RCHAR, 0x20B2, RCHAR, 0x20E1, RCHAR, 0x2108, RCHAR, 0x2111, RCHAR, RCHAR, 0x2126, RCHAR, 0x2143, RCHAR, RCHAR, RCHAR, 0x2157, RCHAR, 0x219C, RCHAR, 0x21CC, RCHAR, RCHAR, 0x21EF, RCHAR, 0x21F4, RCHAR, RCHAR, RCHAR, RCHAR, 0x2201, RCHAR, RCHAR, 0x2210, RCHAR, 0x2220, RCHAR, 0x2241, RCHAR, RCHAR, RCHAR, 0x227B, RCHAR, 0x22B7, RCHAR, RCHAR, 0x22D7, RCHAR, RCHAR, RCHAR, 0x231D, RCHAR, 0x2356, RCHAR, RCHAR, 0x238F, RCHAR, 0x23B8, RCHAR, 0x23BD, RCHAR, RCHAR, 0x23D2, RCHAR, 0x2424, RCHAR, 0x242A, RCHAR, 0x2450, RCHAR, RCHAR, 0x2480, RCHAR, 0x24B9, RCHAR, RCHAR, RCHAR, 0x24CF, RCHAR, RCHAR, RCHAR, 0x24E2, RCHAR, RCHAR, RCHAR, 0x24F8, RCHAR, 0x24FD, RCHAR, 0x2526, RCHAR, RCHAR, 0x255B, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x256E, RCHAR, RCHAR, RCHAR, 0x257D, RCHAR, RCHAR, 0x2592, RCHAR, 0x25A5, RCHAR, 0x263E, RCHAR, 0x265A, RCHAR, 0x26B0, RCHAR, 0x2704, RCHAR, RCHAR, 0x2735, RCHAR, RCHAR, 0x274E, RCHAR, RCHAR, RCHAR, 0x2763, RCHAR, RCHAR, 0x2777, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x278C, RCHAR, 0x279C, RCHAR, 0x27A9, RCHAR, 0x27FB, RCHAR, 0x285F, RCHAR, 0x2961, RCHAR, 0x299C, RCHAR, 0x29C2, RCHAR, 0x29DF, RCHAR, RCHAR, RCHAR, 0x29F7, RCHAR, 0x2A19, RCHAR, 0x2A27, RCHAR, RCHAR, 0x2A5D, RCHAR, RCHAR, RCHAR, RCHAR, 0x2A70, RCHAR, RCHAR, RCHAR, 0x2A89, RCHAR, 0x2A9D, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2AB8, RCHAR, 0x2ABB, RCHAR, 0x2B02, RCHAR, 0x2B2C, RCHAR, 0x2B36, RCHAR, RCHAR, 0x2B56, RCHAR, RCHAR, 0x2B6B, RCHAR, 0x2B7F, RCHAR, 0x2B89, RCHAR, 0x2BC3, RCHAR, RCHAR, 0x2BFC, RCHAR, 0x2C36, RCHAR, 0x2C60, RCHAR, RCHAR, 0x2C6D, RCHAR, RCHAR, RCHAR, 0x2C87, RCHAR, 0x2CAE, RCHAR, 0x2CBD, RCHAR, RCHAR, 0x2CF6, RCHAR, 0x2D1F, RCHAR, 0x2D29, RCHAR, RCHAR, RCHAR, RCHAR, 0x2D3F, RCHAR, 0x2D46, RCHAR, RCHAR, RCHAR, 0x2D5A, RCHAR, 0x2DA6, RCHAR, 0x2DDD, RCHAR, RCHAR, RCHAR, RCHAR, 0x2E45, RCHAR, RCHAR, 0x2E6E, RCHAR, 0x2EA9, RCHAR, RCHAR, 0x2EE3, RCHAR, 0x2F2B, RCHAR, 0x2F42, RCHAR, 0x2F4B, RCHAR, 0x2FAE, RCHAR, // [ 0, 163] -v # seg 0 at pos 0 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF, 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121, 0x20AC, // [ 164, 164] -> [0x00AE,0x00AE] # seg 1 // [ 188, 246] -> [0xFF01,0xFF3B] # seg 3 // [ 247, 247] -> [0xFFE6,0xFFE6] # seg 4 // [ 248, 280] -> [0xFF3D,0xFF5D] # seg 5 // [ 281, 281] -> [0xFFE3,0xFFE3] # seg 6 // [ 282, 375] -> [0x3131,0x318E] # seg 7 // [ 376, 385] -> [0x2170,0x2179] # seg 8 // [ 391, 400] -> [0x2160,0x2169] # seg 10 // [ 408, 424] -> [0x0391,0x03A1] # seg 12 // [ 425, 431] -> [0x03A3,0x03A9] # seg 13 // [ 440, 456] -> [0x03B1,0x03C1] # seg 15 // [ 594, 603] -> [0x33B0,0x33B9] # seg 21 // [ 1041, 1066] -> [0x0416,0x042F] # seg 38 // [ 1089, 1114] -> [0x0436,0x044F] # seg 41 // [ 1410, 3759] -v # seg 43 at pos 164 0xAC00, 0xAC01, 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B, 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30, 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54, 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A, 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0, 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8, 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC, 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA, 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC, 0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11, 0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35, 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54, 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82, 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7, 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC, 0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01, 0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34, 0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46, 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C, 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C, 0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85, 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD, 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB, 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10, 0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F, 0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D, 0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91, 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8, 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9, 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C, 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048, 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059, 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F, 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1, 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF, 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0, 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113, 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125, 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140, 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158, 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188, 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C, 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8, 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205, 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220, 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274, 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294, 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6, 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0, 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3, 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF, 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314, 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C, 0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E, 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384, 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC, 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4, 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8, 0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B, 0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463, 0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC, 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5, 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED, 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C, 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531, 0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B, 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560, 0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0, 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0, 0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC, 0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648, 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC, 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705, 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B, 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768, 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784, 0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797, 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC, 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED, 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807, 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D, 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838, 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860, 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D, 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5, 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9, 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918, 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951, 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D, 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989, 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC, 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE, 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5, 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15, 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B, 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64, 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78, 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB, 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4, 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F, 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35, 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45, 0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61, 0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC, 0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8, 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B, 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25, 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40, 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50, 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94, 0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7, 0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD, 0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8, 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05, 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48, 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80, 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91, 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8, 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8, 0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C, 0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54, 0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64, 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B, 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90, 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7, 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08, 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41, 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5, 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C, 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091, 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD, 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD, 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0, 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8, 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108, 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123, 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131, 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B, 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165, 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C, 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F, 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4, 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8, 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C, 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220, 0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234, 0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C, 0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288, 0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8, 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD, 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1, 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309, 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324, 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370, 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C, 0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8, 0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424, 0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465, 0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C, 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA, 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528, 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544, 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553, 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560, 0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, 0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607, 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624, 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634, 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648, 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC, 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C, 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728, 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768, 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783, 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790, 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4, 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC, 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800, 0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815, 0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F, 0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D, 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881, 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894, 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8, 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4, 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C, 0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951, 0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974, 0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B, 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0, 0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD, 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0, 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B, 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50, 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D, 0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD, 0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4, 0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48, 0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78, 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C, 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27, 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B, 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54, 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68, 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9, 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4, 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0, 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B, 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64, 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95, 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4, 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB, 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21, 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59, 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D, 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89, 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4, 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB, 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01, 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20, 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54, 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70, 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8, 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1, 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D, 0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049, 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074, 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4, 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9, 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0, 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D, 0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143, 0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D, 0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0, 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA, 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210, 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241, 0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290, 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8, 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB, 0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4, 0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E, 0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321, 0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B, 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384, 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C, 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC, 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3, 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401, 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D, 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488, 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4, 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD, 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D, 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559, 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574, 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589, 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8, 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4, 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610, 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D, 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B, 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669, 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690, 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9, 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7, 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD, 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728, 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744, 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758, 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770, 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790, 0xD798, 0xD799, 0xD79B, 0xD79D, // [ 457, 537] -v # seg 16 at pos 2514 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, // [ 564, 573] -v # seg 18 at pos 2595 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, // [ 574, 583] -> [0x3399,0x33A2] # seg 19 // [ 584, 593] -v # seg 20 at pos 2605 0x33CA, 0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, // [ 604, 642] -v # seg 22 at pos 2615 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0x33C6, // [ 658, 673] -v # seg 24 at pos 2654 0x00C6, 0x00D0, 0x00AA, 0x0126, RCHAR, 0x0132, RCHAR, 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, RCHAR, // [ 674, 701] -> [0x3260,0x327B] # seg 25 // [ 702, 727] -> [0x24D0,0x24E9] # seg 26 // [ 728, 742] -> [0x2460,0x246E] # seg 27 // [ 743, 767] -v # seg 28 at pos 2670 0x00BD, 0x2153, 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, // [ 768, 795] -> [0x3200,0x321B] # seg 29 // [ 796, 821] -> [0x249C,0x24B5] # seg 30 // [ 822, 836] -> [0x2474,0x2482] # seg 31 // [ 837, 845] -v # seg 32 at pos 2695 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083, 0x2084, // [ 846, 928] -> [0x3041,0x3093] # seg 33 // [ 940, 1025] -> [0x30A1,0x30F6] # seg 35 // [ 1034, 1040] -v # seg 37 at pos 2704 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, // [ 1082, 1088] -v # seg 40 at pos 2711 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, // [ 3854, 4649] -v # seg 45 at pos 2718 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB, 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3, 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902, 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68, 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5, 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3, 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4, 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6, 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912, 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE, 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E, 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F, 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925, 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928, 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948, 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974, 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934, 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, // [ 4650, 4660] -> [0xF939,0xF943] # seg 46 // [ 4661, 8741] -v # seg 47 at pos 3514 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947, 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, 0x7D10, 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, 0x80FD, 0xF958, 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336, 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9, 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82, 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9, 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4, 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F, 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D, 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A, 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF, 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C, 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73, 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6, 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F, 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A, 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E, 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9, 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500, 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4, 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4, 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF, 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66, 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577, 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714, 0xF96A, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525, 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, 0x6D89, 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210, 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187, 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07, 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2, 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F, 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB, 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD, 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5, 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A, 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C, 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38, 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668, 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA, 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931, 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE, 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A, 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A, 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982, 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985, 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987, 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B, 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990, 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93, 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3, 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996, 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B, 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, 0xF99F, 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2, 0xF9A3, 0xF9A4, 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276, 0x82D2, 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1, 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71, 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD, 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0, 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3, 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713, 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433, 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9, 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA, 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0x5BE5, 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE, 0xF9BE, 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464, 0xF9C1, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2, 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076, 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A, 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991, 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047, 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED, 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5, 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4, 0x67DA, 0xF9C9, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38, 0xF9CB, 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD, 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149, 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089, 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8, 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE, 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0, 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD, 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351, 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4, 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A, 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2, 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9, 0x6041, 0xF9F4, 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165, 0x5344, 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750, 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1, 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47, 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E, 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35, 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019, 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458, 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA, 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE, 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF, 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, 0x5243, 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258, 0xFA02, 0x64E2, 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016, 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832, 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B, 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206, 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A, 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2, 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0, 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107, 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70, // [ 8836, 8869] -v # seg 49 at pos 7595 0xAC02, 0xAC03, 0xAC05, 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E, 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28, 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35, 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, // [ 8870, 8879] -> [0xAC41,0xAC4A] # seg 50 // [ 8880, 8892] -v # seg 51 at pos 7629 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, 0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, // [ 8893, 8911] -> [0xAC5D,0xAC6F] # seg 52 // [ 8912, 9102] -v # seg 53 at pos 7642 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3, 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0, 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB, 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4, 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED, 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08, 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14, 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E, 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27, 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32, 0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E, 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53, 0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72, 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F, // [ 9103, 9113] -> [0xAD91,0xAD9B] # seg 54 // [ 9114, 9119] -> [0xAD9E,0xADA3] # seg 55 // [ 9120, 9137] -> [0xADA5,0xADB6] # seg 56 // [ 9138, 9145] -> [0xADB8,0xADBF] # seg 57 // [ 9146, 9172] -v # seg 58 at pos 7833 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7, 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2, 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB, 0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, // [ 9173, 9191] -> [0xADE5,0xADF7] # seg 59 // [ 9192, 9209] -v # seg 60 at pos 7860 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04, 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10, 0xAE11, 0xAE12, 0xAE13, // [ 9210, 9236] -> [0xAE15,0xAE2F] # seg 61 // [ 9237, 9293] -v # seg 62 at pos 7878 0xAE32, 0xAE33, 0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F, 0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51, 0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B, 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75, 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82, 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, // [ 9294, 9340] -> [0xAE8D,0xAEBB] # seg 63 // [ 9341, 9360] -v # seg 64 at pos 7935 0xAEBF, 0xAEC1, 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA, 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7, 0xAEDA, 0xAEDB, // [ 9361, 9371] -> [0xAEDD,0xAEE7] # seg 65 // [ 9372, 9386] -v # seg 66 at pos 7955 0xAEE9, 0xAEEA, 0xAEEC, 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, // [ 9387, 9396] -> [0xAEFD,0xAF06] # seg 67 // [ 9397, 9402] -v # seg 68 at pos 7970 0xAF09, 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, // [ 9403, 9429] -> [0xAF11,0xAF2B] # seg 69 // [ 9430, 9452] -v # seg 70 at pos 7976 0xAF2E, 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39, 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, // [ 9453, 9463] -> [0xAF51,0xAF5B] # seg 71 // [ 9464, 9469] -> [0xAF5E,0xAF63] # seg 72 // [ 9470, 9488] -> [0xAF66,0xAF78] # seg 73 // [ 9489, 9516] -v # seg 74 at pos 7999 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F, 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94, 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, // [ 9517, 9543] -> [0xAF9D,0xAFB7] # seg 75 // [ 9544, 9568] -v # seg 76 at pos 8027 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA, 0xAFDB, // [ 9569, 9579] -> [0xAFDD,0xAFE7] # seg 77 // [ 9580, 9619] -v # seg 78 at pos 8052 0xAFEA, 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7, 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002, 0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016, 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, // [ 9620, 9629] -> [0xB01E,0xB027] # seg 79 // [ 9630, 9656] -> [0xB029,0xB043] # seg 80 // [ 9657, 9670] -v # seg 81 at pos 8092 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F, 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C, // [ 9671, 9700] -> [0xB05E,0xB07B] # seg 82 // [ 9701, 9766] -v # seg 83 at pos 8106 0xB07E, 0xB07F, 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095, 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5, 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9, 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2, 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF, 0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, // [ 9767, 9800] -> [0xB0E6,0xB107] # seg 84 // [ 9801, 9856] -v # seg 85 at pos 8172 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114, 0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E, 0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B, 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146, 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D, 0xB15E, 0xB15F, // [ 9857, 9879] -> [0xB161,0xB177] # seg 86 // [ 9880, 9902] -v # seg 87 at pos 8228 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183, 0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B, // [ 9903, 9913] -> [0xB19D,0xB1A7] # seg 88 // [ 9914, 9948] -> [0xB1A9,0xB1CB] # seg 89 // [ 9949, 10010] -v # seg 90 at pos 8251 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE, 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7, 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202, 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, // [ 10011, 10029] -> [0xB221,0xB233] # seg 91 // [ 10030, 10036] -> [0xB235,0xB23B] # seg 92 // [ 10037, 10063] -> [0xB23D,0xB257] # seg 93 // [ 10064, 10076] -v # seg 94 at pos 8313 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, // [ 10077, 10086] -> [0xB26A,0xB273] # seg 95 // [ 10087, 10130] -v # seg 96 at pos 8326 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E, 0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288, 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293, 0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F, 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, // [ 10131, 10149] -> [0xB2B5,0xB2C7] # seg 97 // [ 10150, 10196] -v # seg 98 at pos 8370 0xB2CA, 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5, 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1, 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6, 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307, 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312, 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, // [ 10197, 10251] -> [0xB31D,0xB353] # seg 99 // [ 10252, 10290] -v # seg 100 at pos 8417 0xB357, 0xB359, 0xB35A, 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A, 0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377, 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E, 0xB38F, 0xB391, 0xB392, 0xB393, // [ 10291, 10301] -> [0xB395,0xB39F] # seg 101 // [ 10302, 10310] -v # seg 102 at pos 8456 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB, // [ 10311, 10333] -> [0xB3AD,0xB3C3] # seg 103 // [ 10334, 10354] -v # seg 104 at pos 8465 0xB3C6, 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3, 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2, 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, // [ 10355, 10373] -> [0xB3E9,0xB3FB] # seg 105 // [ 10374, 10392] -> [0xB3FD,0xB40F] # seg 106 // [ 10393, 10421] -v # seg 107 at pos 8486 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421, 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C, 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, // [ 10422, 10448] -> [0xB435,0xB44F] # seg 108 // [ 10449, 10468] -v # seg 109 at pos 8515 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459, 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464, 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, // [ 10469, 10487] -> [0xB46D,0xB47F] # seg 110 // [ 10488, 10494] -> [0xB481,0xB487] # seg 111 // [ 10495, 10514] -> [0xB489,0xB49C] # seg 112 // [ 10515, 10583] -v # seg 113 at pos 8535 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB, 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4, 0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF, 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE, 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA, 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6, 0xB4F7, // [ 10584, 10610] -> [0xB4F9,0xB513] # seg 114 // [ 10611, 10658] -v # seg 115 at pos 8604 0xB516, 0xB517, 0xB519, 0xB51A, 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526, 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535, 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E, 0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E, 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55E, // [ 10659, 10720] -> [0xB562,0xB59F] # seg 116 // [ 10721, 10755] -v # seg 117 at pos 8652 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9, 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, // [ 10756, 10774] -> [0xB5D9,0xB5EB] # seg 118 // [ 10775, 10809] -> [0xB5ED,0xB60F] # seg 119 // [ 10810, 10814] -v # seg 120 at pos 8687 0xB612, 0xB613, 0xB615, 0xB616, 0xB617, // [ 10815, 10826] -> [0xB619,0xB624] # seg 121 // [ 10827, 10839] -v # seg 122 at pos 8692 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632, 0xB633, // [ 10840, 10858] -> [0xB635,0xB647] # seg 123 // [ 10859, 10885] -> [0xB649,0xB663] # seg 124 // [ 10886, 10888] -> [0xB665,0xB667] # seg 125 // [ 10889, 10939] -> [0xB669,0xB69B] # seg 126 // [ 10940, 10954] -v # seg 127 at pos 8705 0xB69E, 0xB69F, 0xB6A1, 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA, 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, // [ 10955, 10988] -> [0xB6B2,0xB6D3] # seg 128 // [ 10989, 11015] -> [0xB6D5,0xB6EF] # seg 129 // [ 11016, 11031] -v # seg 130 at pos 8720 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9, 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703, 0xB704, // [ 11032, 11065] -> [0xB706,0xB727] # seg 131 // [ 11066, 11098] -v # seg 132 at pos 8736 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731, 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C, 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745, 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F, 0xB750, 0xB751, 0xB752, 0xB753, // [ 11099, 11108] -> [0xB756,0xB75F] # seg 133 // [ 11109, 11166] -v # seg 134 at pos 8769 0xB761, 0xB762, 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783, 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E, 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA, 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7, // [ 11167, 11180] -> [0xB7B9,0xB7C6] # seg 135 // [ 11181, 11181] -> [0xB7C8,0xB7C8] # seg 136 // [ 11182, 11215] -> [0xB7CA,0xB7EB] # seg 137 // [ 11216, 11275] -v # seg 138 at pos 8827 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803, 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F, 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A, 0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826, 0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, // [ 11276, 11287] -> [0xB845,0xB850] # seg 139 // [ 11288, 11319] -v # seg 140 at pos 8887 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870, 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A, 0xB87B, // [ 11320, 11335] -> [0xB87D,0xB88C] # seg 141 // [ 11336, 11361] -> [0xB88E,0xB8A7] # seg 142 // [ 11362, 11431] -v # seg 143 at pos 8919 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7, 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2, 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED, 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902, 0xB903, // [ 11432, 11450] -> [0xB905,0xB917] # seg 144 // [ 11451, 11457] -> [0xB919,0xB91F] # seg 145 // [ 11458, 11484] -> [0xB921,0xB93B] # seg 146 // [ 11485, 11541] -v # seg 147 at pos 8989 0xB93E, 0xB93F, 0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A, 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976, 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980, 0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, // [ 11542, 11570] -> [0xB98F,0xB9AB] # seg 148 // [ 11571, 11627] -v # seg 149 at pos 9046 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2, 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB, 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7, 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7, 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9, 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2, 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02, 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, // [ 11628, 11639] -> [0xBA09,0xBA14] # seg 150 // [ 11640, 11673] -> [0xBA16,0xBA37] # seg 151 // [ 11674, 11714] -v # seg 152 at pos 9103 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F, 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C, 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A, 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72, 0xBA73, 0xBA75, 0xBA76, 0xBA77, // [ 11715, 11724] -> [0xBA79,0xBA82] # seg 153 // [ 11725, 11729] -v # seg 154 at pos 9144 0xBA86, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, // [ 11730, 11756] -> [0xBA8D,0xBAA7] # seg 155 // [ 11757, 11777] -v # seg 156 at pos 9149 0xBAAA, 0xBAAD, 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7, 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, 0xBAC5, 0xBAC6, 0xBAC7, // [ 11778, 11792] -> [0xBAC9,0xBAD7] # seg 157 // [ 11793, 11826] -> [0xBADA,0xBAFB] # seg 158 // [ 11827, 11908] -v # seg 159 at pos 9170 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01, 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A, 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15, 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F, 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28, 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32, 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42, 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51, 0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, // [ 11909, 11935] -> [0xBB6D,0xBB87] # seg 160 // [ 11936, 11941] -v # seg 161 at pos 9252 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, // [ 11942, 11960] -> [0xBB91,0xBBA3] # seg 162 // [ 11961, 11998] -v # seg 163 at pos 9258 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB, 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5, 0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9, 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2, // [ 11999, 12034] -> [0xBBD4,0xBBF7] # seg 164 // [ 12035, 12082] -v # seg 165 at pos 9296 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE, 0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E, 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22, 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F, 0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48, 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, // [ 12083, 12094] -> [0xBC51,0xBC5C] # seg 166 // [ 12095, 12132] -> [0xBC5E,0xBC83] # seg 167 // [ 12133, 12189] -v # seg 168 at pos 9344 0xBC86, 0xBC87, 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2, 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2, 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, // [ 12190, 12212] -> [0xBCDD,0xBCF3] # seg 169 // [ 12213, 12234] -v # seg 170 at pos 9401 0xBCF7, 0xBCF9, 0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02, 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E, 0xBD0F, 0xBD11, 0xBD12, 0xBD13, // [ 12235, 12249] -> [0xBD15,0xBD23] # seg 171 // [ 12250, 12256] -> [0xBD25,0xBD2B] # seg 172 // [ 12257, 12275] -> [0xBD2D,0xBD3F] # seg 173 // [ 12276, 12294] -v # seg 174 at pos 9423 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, // [ 12295, 12304] -> [0xBD5A,0xBD63] # seg 175 // [ 12305, 12307] -> [0xBD65,0xBD67] # seg 176 // [ 12308, 12330] -> [0xBD69,0xBD7F] # seg 177 // [ 12331, 12352] -v # seg 178 at pos 9442 0xBD82, 0xBD83, 0xBD85, 0xBD86, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96, 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1, 0xBDA2, 0xBDA3, // [ 12353, 12363] -> [0xBDA5,0xBDAF] # seg 179 // [ 12364, 12370] -> [0xBDB1,0xBDB7] # seg 180 // [ 12371, 12397] -> [0xBDB9,0xBDD3] # seg 181 // [ 12398, 12402] -v # seg 182 at pos 9464 0xBDD6, 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, // [ 12403, 12414] -> [0xBDDD,0xBDE8] # seg 183 // [ 12415, 12455] -v # seg 184 at pos 9469 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2, 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12, 0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B, 0xBE1E, // [ 12456, 12491] -> [0xBE20,0xBE43] # seg 185 // [ 12492, 12544] -v # seg 186 at pos 9510 0xBE46, 0xBE47, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63, 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E, 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E, 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95, 0xBE96, 0xBE97, // [ 12545, 12558] -> [0xBE9A,0xBEA7] # seg 187 // [ 12559, 12597] -> [0xBEA9,0xBECF] # seg 188 // [ 12598, 12616] -v # seg 189 at pos 9563 0xBED2, 0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, 0xBEEB, // [ 12617, 12636] -> [0xBEED,0xBF00] # seg 190 // [ 12637, 12642] -> [0xBF02,0xBF07] # seg 191 // [ 12643, 12656] -> [0xBF0A,0xBF17] # seg 192 // [ 12657, 12657] -> [0xBF1A,0xBF1A] # seg 193 // [ 12658, 12691] -> [0xBF1E,0xBF3F] # seg 194 // [ 12692, 12706] -v # seg 195 at pos 9582 0xBF42, 0xBF43, 0xBF45, 0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF52, 0xBF53, 0xBF54, // [ 12707, 12768] -> [0xBF56,0xBF93] # seg 196 // [ 12769, 12795] -> [0xBF95,0xBFAF] # seg 197 // [ 12796, 12815] -> [0xBFB1,0xBFC4] # seg 198 // [ 12816, 12836] -v # seg 199 at pos 9597 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE, 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, // [ 12837, 12926] -> [0xBFE2,0xC03B] # seg 200 // [ 12927, 12946] -> [0xC03D,0xC050] # seg 201 // [ 12947, 12965] -v # seg 202 at pos 9618 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F, 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, // [ 12966, 13003] -> [0xC06A,0xC08F] # seg 203 // [ 13004, 13156] -v # seg 204 at pos 9637 0xC092, 0xC093, 0xC095, 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E, 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA, 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA, 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA, 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4, 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8, 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102, 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C, 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125, 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134, 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141, 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159, 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162, 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, // [ 13157, 13168] -> [0xC179,0xC184] # seg 205 // [ 13169, 13196] -v # seg 206 at pos 9790 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199, 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6, 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, // [ 13197, 13208] -> [0xC1B1,0xC1BC] # seg 207 // [ 13209, 13294] -v # seg 208 at pos 9818 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9, 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7, 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202, 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B, 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224, 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233, // [ 13295, 13313] -> [0xC235,0xC247] # seg 209 // [ 13314, 13397] -v # seg 210 at pos 9904 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D, 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259, 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262, 0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, 0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283, 0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296, 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE, 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, // [ 13398, 13431] -> [0xC2BA,0xC2DB] # seg 211 // [ 13432, 13480] -v # seg 212 at pos 9988 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302, 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E, 0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A, 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323, 0xC326, 0xC327, // [ 13481, 13507] -> [0xC32A,0xC344] # seg 213 // [ 13508, 13541] -> [0xC346,0xC367] # seg 214 // [ 13542, 13566] -v # seg 215 at pos 10037 0xC36A, 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375, 0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B, // [ 13567, 13617] -> [0xC38D,0xC3BF] # seg 216 // [ 13618, 13640] -> [0xC3C1,0xC3D7] # seg 217 // [ 13641, 13661] -v # seg 218 at pos 10062 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3, 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE, 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, // [ 13662, 13676] -> [0xC3F9,0xC407] # seg 219 // [ 13677, 13683] -> [0xC409,0xC40F] # seg 220 // [ 13684, 13702] -> [0xC411,0xC423] # seg 221 // [ 13703, 13722] -v # seg 222 at pos 10083 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D, 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A, 0xC43B, // [ 13723, 13732] -> [0xC43E,0xC447] # seg 223 // [ 13733, 13759] -> [0xC449,0xC463] # seg 224 // [ 13760, 13780] -v # seg 225 at pos 10103 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478, 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, // [ 13781, 13799] -> [0xC481,0xC493] # seg 226 // [ 13800, 13806] -> [0xC495,0xC49B] # seg 227 // [ 13807, 13833] -> [0xC49D,0xC4B7] # seg 228 // [ 13834, 13836] -> [0xC4B9,0xC4BB] # seg 229 // [ 13837, 13880] -> [0xC4BD,0xC4E8] # seg 230 // [ 13881, 13896] -v # seg 231 at pos 10124 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF, 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC, 0xC4FD, 0xC4FE, // [ 13897, 13906] -> [0xC502,0xC50B] # seg 232 // [ 13907, 13919] -v # seg 233 at pos 10140 0xC50D, 0xC50E, 0xC50F, 0xC511, 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A, 0xC51B, // [ 13920, 13930] -> [0xC51D,0xC527] # seg 234 // [ 13931, 14012] -v # seg 235 at pos 10153 0xC52A, 0xC52B, 0xC52D, 0xC52E, 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537, 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543, 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556, 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566, 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F, 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E, 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589, 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596, 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, // [ 14013, 14022] -> [0xC5AA,0xC5B3] # seg 236 // [ 14023, 14122] -v # seg 237 at pos 10235 0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3, 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7, 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2, 0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF, 0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB, 0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E, 0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617, 0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623, 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632, 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642, 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659, 0xC65A, 0xC65B, 0xC65E, 0xC65F, // [ 14123, 14133] -> [0xC661,0xC66B] # seg 238 // [ 14134, 14391] -v # seg 239 at pos 10335 0xC66D, 0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677, 0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A, 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3, 0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD, 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF, 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB, 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B, 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716, 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722, 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739, 0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745, 0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759, 0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777, 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786, 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799, 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3, 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE, 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB, 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA, 0xC7EB, // [ 14392, 14410] -> [0xC7ED,0xC7FF] # seg 240 // [ 14411, 14469] -v # seg 241 at pos 10593 0xC802, 0xC803, 0xC805, 0xC806, 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812, 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F, 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829, 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835, 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A, 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, // [ 14470, 14496] -> [0xC855,0xC86F] # seg 242 // [ 14497, 14534] -v # seg 243 at pos 10652 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879, 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888, 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C, 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7, // [ 14535, 14553] -> [0xC8A9,0xC8BB] # seg 244 // [ 14554, 14582] -v # seg 245 at pos 10690 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2, 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8, 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3, // [ 14583, 14598] -> [0xC8E5,0xC8F4] # seg 246 // [ 14599, 14622] -v # seg 247 at pos 10719 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF, 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B, 0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, // [ 14623, 14641] -> [0xC919,0xC92B] # seg 248 // [ 14642, 14648] -> [0xC92D,0xC933] # seg 249 // [ 14649, 14675] -> [0xC935,0xC94F] # seg 250 // [ 14676, 14709] -v # seg 251 at pos 10743 0xC952, 0xC953, 0xC955, 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969, 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973, 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, // [ 14710, 14720] -> [0xC97D,0xC987] # seg 252 // [ 14721, 14734] -v # seg 253 at pos 10777 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C, // [ 14735, 14768] -> [0xC99E,0xC9BF] # seg 254 // [ 14769, 14822] -v # seg 255 at pos 10791 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB, 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8, 0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8, 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01, 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E, 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17, // [ 14823, 14838] -> [0xCA19,0xCA28] # seg 256 // [ 14839, 14872] -> [0xCA2A,0xCA4B] # seg 257 // [ 14873, 14891] -v # seg 258 at pos 10845 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, // [ 14892, 14911] -> [0xCA69,0xCA7C] # seg 259 // [ 14912, 14917] -> [0xCA7E,0xCA83] # seg 260 // [ 14918, 14936] -> [0xCA85,0xCA97] # seg 261 // [ 14937, 14971] -> [0xCA99,0xCABB] # seg 262 // [ 14972, 14996] -v # seg 263 at pos 10864 0xCABE, 0xCABF, 0xCAC1, 0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, // [ 14997, 15007] -> [0xCAE1,0xCAEB] # seg 264 // [ 15008, 15014] -> [0xCAED,0xCAF3] # seg 265 // [ 15015, 15033] -> [0xCAF5,0xCB07] # seg 266 // [ 15034, 15053] -v # seg 267 at pos 10889 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, // [ 15054, 15084] -> [0xCB22,0xCB40] # seg 268 // [ 15085, 15111] -v # seg 269 at pos 10909 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62, 0xCB63, // [ 15112, 15130] -> [0xCB65,0xCB77] # seg 270 // [ 15131, 15164] -> [0xCB7A,0xCB9B] # seg 271 // [ 15165, 15191] -> [0xCB9D,0xCBB7] # seg 272 // [ 15192, 15218] -> [0xCBB9,0xCBD3] # seg 273 // [ 15219, 15233] -> [0xCBD5,0xCBE3] # seg 274 // [ 15234, 15236] -v # seg 275 at pos 10936 0xCBE5, 0xCBE6, 0xCBE8, // [ 15237, 15270] -> [0xCBEA,0xCC0B] # seg 276 // [ 15271, 15341] -v # seg 277 at pos 10939 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17, 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23, 0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31, 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F, 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A, 0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53, 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61, 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, // [ 15342, 15375] -> [0xCC76,0xCC97] # seg 278 // [ 15376, 15417] -v # seg 279 at pos 11010 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA, 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3, 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, 0xCCD1, 0xCCD2, 0xCCD3, // [ 15418, 15432] -> [0xCCD5,0xCCE3] # seg 280 // [ 15433, 15442] -v # seg 281 at pos 11052 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, // [ 15443, 15458] -> [0xCCF1,0xCD00] # seg 282 // [ 15459, 15490] -v # seg 283 at pos 11062 0xCD02, 0xCD03, 0xCD04, 0xCD05, 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11, 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C, 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26, 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, // [ 15491, 15502] -> [0xCD2D,0xCD38] # seg 284 // [ 15503, 15536] -> [0xCD3A,0xCD5B] # seg 285 // [ 15537, 15557] -v # seg 286 at pos 11094 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63, 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E, 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, // [ 15558, 15572] -> [0xCD79,0xCD87] # seg 287 // [ 15573, 15583] -> [0xCD89,0xCD93] # seg 288 // [ 15584, 15603] -v # seg 289 at pos 11115 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E, 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA, 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, // [ 15604, 15622] -> [0xCDB1,0xCDC3] # seg 290 // [ 15623, 15632] -v # seg 291 at pos 11135 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD, 0xCDCE, 0xCDCF, // [ 15633, 15655] -> [0xCDD1,0xCDE7] # seg 292 // [ 15656, 15713] -v # seg 293 at pos 11145 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1, 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC, 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06, 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10, 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25, 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E, 0xCE2F, 0xCE32, 0xCE34, // [ 15714, 15747] -> [0xCE36,0xCE57] # seg 294 // [ 15748, 15804] -v # seg 295 at pos 11203 0xCE5A, 0xCE5B, 0xCE5D, 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A, 0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76, 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97, 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2, 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, // [ 15805, 15823] -> [0xCEAE,0xCEC0] # seg 296 // [ 15824, 15857] -> [0xCEC2,0xCEE3] # seg 297 // [ 15858, 15915] -v # seg 298 at pos 11260 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05, 0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E, 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, // [ 15916, 15942] -> [0xCF39,0xCF53] # seg 299 // [ 15943, 15984] -v # seg 300 at pos 11318 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76, 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F, 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, // [ 15985, 16004] -> [0xCF8D,0xCFA0] # seg 301 // [ 16005, 16017] -v # seg 302 at pos 11360 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, 0xCFAF, // [ 16018, 16036] -> [0xCFB1,0xCFC3] # seg 303 // [ 16037, 16063] -> [0xCFC5,0xCFDF] # seg 304 // [ 16064, 16089] -v # seg 305 at pos 11373 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA, 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6, 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF, 0xD001, 0xD002, 0xD003, // [ 16090, 16101] -> [0xD005,0xD010] # seg 306 // [ 16102, 16107] -> [0xD012,0xD017] # seg 307 // [ 16108, 16127] -> [0xD019,0xD02C] # seg 308 // [ 16128, 16166] -v # seg 309 at pos 11399 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036, 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040, 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C, 0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056, 0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F, // [ 16167, 16177] -> [0xD061,0xD06B] # seg 310 // [ 16178, 16192] -v # seg 311 at pos 11438 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E, 0xD07F, 0xD080, // [ 16193, 16226] -> [0xD082,0xD0A3] # seg 312 // [ 16227, 16283] -v # seg 313 at pos 11453 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA, 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3, 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF, 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9, 0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2, 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, // [ 16284, 16303] -> [0xD0F9,0xD10C] # seg 314 // [ 16304, 16337] -> [0xD10E,0xD12F] # seg 315 // [ 16338, 16378] -v # seg 316 at pos 11510 0xD132, 0xD133, 0xD135, 0xD136, 0xD137, 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151, 0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A, 0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0xD169, 0xD16A, 0xD16B, // [ 16379, 16393] -> [0xD16D,0xD17B] # seg 317 // [ 16394, 16403] -v # seg 318 at pos 11551 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, // [ 16404, 16426] -> [0xD189,0xD19F] # seg 319 // [ 16427, 16448] -v # seg 320 at pos 11561 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6, 0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD, 0xD1BE, 0xD1BF, // [ 16449, 16471] -> [0xD1C1,0xD1D7] # seg 321 // [ 16472, 16498] -> [0xD1D9,0xD1F3] # seg 322 // [ 16499, 16501] -> [0xD1F5,0xD1F7] # seg 323 // [ 16502, 16515] -> [0xD1F9,0xD206] # seg 324 // [ 16516, 16522] -v # seg 325 at pos 11583 0xD208, 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, 0xD20F, // [ 16523, 16549] -> [0xD211,0xD22B] # seg 326 // [ 16550, 16569] -v # seg 327 at pos 11590 0xD22E, 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238, 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, // [ 16570, 16588] -> [0xD249,0xD25B] # seg 328 // [ 16589, 16595] -> [0xD25D,0xD263] # seg 329 // [ 16596, 16622] -> [0xD265,0xD27F] # seg 330 // [ 16623, 16698] -v # seg 331 at pos 11610 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296, 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F, 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE, 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC, 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, // [ 16699, 16708] -> [0xD2E6,0xD2EF] # seg 332 // [ 16709, 16763] -v # seg 333 at pos 11686 0xD2F2, 0xD2F3, 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317, 0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324, 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, // [ 16764, 16817] -> [0xD346,0xD37B] # seg 334 // [ 16818, 16921] -v # seg 335 at pos 11741 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E, 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B, 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB, 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6, 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4, 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE, 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8, 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404, 0xD405, 0xD406, 0xD407, // [ 16922, 16941] -> [0xD409,0xD41C] # seg 336 // [ 16942, 16975] -> [0xD41E,0xD43F] # seg 337 // [ 16976, 16978] -> [0xD441,0xD443] # seg 338 // [ 16979, 17001] -> [0xD445,0xD45B] # seg 339 // [ 17002, 17042] -v # seg 340 at pos 11845 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462, 0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, // [ 17043, 17062] -> [0xD495,0xD4A8] # seg 341 // [ 17063, 17096] -> [0xD4AA,0xD4CB] # seg 342 // [ 17097, 17155] -v # seg 343 at pos 11886 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3, 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD, 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6, 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1, 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA, 0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505, 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F, 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, // [ 17156, 17191] -> [0xD518,0xD53B] # seg 344 // [ 17192, 17249] -v # seg 345 at pos 11945 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D, 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567, 0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, 0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C, 0xD58D, 0xD58E, 0xD58F, // [ 17250, 17269] -> [0xD591,0xD5A4] # seg 346 // [ 17270, 17303] -> [0xD5A6,0xD5C7] # seg 347 // [ 17304, 17375] -v # seg 348 at pos 12003 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3, 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF, 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA, 0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3, 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF, 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B, 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618, 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622, 0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B, 0xD62C, // [ 17376, 17385] -> [0xD62E,0xD637] # seg 349 // [ 17386, 17408] -v # seg 350 at pos 12075 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F, 0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C, 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659, 0xD65A, 0xD65B, // [ 17409, 17418] -> [0xD65D,0xD666] # seg 351 // [ 17419, 17427] -v # seg 352 at pos 12098 0xD668, 0xD66A, 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, // [ 17428, 17441] -> [0xD675,0xD682] # seg 353 // [ 17442, 17540] -v # seg 354 at pos 12107 0xD684, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E, 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9, 0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3, 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD, 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7, 0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2, 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7, 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, // [ 17541, 17552] -> [0xD705,0xD710] # seg 355 // [ 17553, 17657] -v # seg 356 at pos 12206 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717, 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723, 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F, 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A, 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743, 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A, 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775, 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F, 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A, 0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0, 0xD7A1, 0xD7A2, 0xD7A3, }; // Reverse const unsigned short CodePageKSX1001_R[27587] = { // hot segments (indexes into segment table) 2, 109, 1484, // number of segments 1497, // segment table 0x0000, 0x00A1, 0x00C7, 0x00D0, 0x00E7, 0x00F0, 0x00FF, 0x0111, 0x0112, 0x0126, 0x0128, 0x0131, 0x0154, 0x0166, 0x0168, 0x02C7, 0x02C8, 0x02D0, 0x02D1, 0x02D8, 0x02DE, 0x0391, 0x03A2, 0x03A3, 0x03AA, 0x03B1, 0x03C2, 0x03C3, 0x03CA, 0x0401, 0x0402, 0x0410, 0x0416, 0x0430, 0x0436, 0x0450, 0x0451, 0x0452, 0x2015, 0x2027, 0x2030, 0x2034, 0x203B, 0x203C, 0x2074, 0x2075, 0x207F, 0x2085, 0x20AC, 0x20AD, 0x2103, 0x210A, 0x2113, 0x2117, 0x2121, 0x212C, 0x2153, 0x2160, 0x216A, 0x2170, 0x217A, 0x2190, 0x219A, 0x21D2, 0x21D5, 0x2200, 0x2212, 0x221A, 0x223E, 0x2252, 0x2253, 0x2260, 0x226C, 0x2282, 0x2288, 0x2299, 0x229A, 0x22A5, 0x22A6, 0x2312, 0x2313, 0x2460, 0x246F, 0x2474, 0x2483, 0x249C, 0x24B6, 0x24D0, 0x24EA, 0x2500, 0x2504, 0x250C, 0x254C, 0x2592, 0x2593, 0x25A0, 0x25AA, 0x25B2, 0x25D2, 0x2605, 0x2607, 0x260E, 0x2610, 0x261C, 0x261F, 0x2640, 0x2643, 0x2660, 0x266E, 0x3000, 0x3020, 0x3041, 0x3094, 0x30A1, 0x30F7, 0x3131, 0x318F, 0x3200, 0x321C, 0x321D, 0x3260, 0x327C, 0x327F, 0x3280, 0x3380, 0x3399, 0x33A3, 0x33B0, 0x33BA, 0x33DE, 0x4E00, 0x4E1F, 0x4E2D, 0x4E60, 0x4E6B, 0x4EAF, 0x4EB6, 0x4EE6, 0x4EF0, 0x4F02, 0x4F09, 0x4F12, 0x4F2F, 0x4F5D, 0x4F69, 0x4F9E, 0x4FAE, 0x4FB7, 0x4FBF, 0x4FE2, 0x4FEE, 0x4FFB, 0x5002, 0x502E, 0x503B, 0x503C, 0x5043, 0x505D, 0x5065, 0x5066, 0x5074, 0x5079, 0x5080, 0x5086, 0x508D, 0x509A, 0x50AC, 0x50EE, 0x50F9, 0x510A, 0x5112, 0x5113, 0x511F, 0x5122, 0x512A, 0x512B, 0x5132, 0x5153, 0x515C, 0x5198, 0x51A0, 0x51AD, 0x51B6, 0x51CE, 0x51DC, 0x51E2, 0x51F0, 0x523C, 0x5243, 0x5262, 0x5269, 0x5276, 0x527D, 0x5293, 0x529B, 0x52AC, 0x52BE, 0x52E5, 0x52F3, 0x5330, 0x5339, 0x5385, 0x5393, 0x53AE, 0x53BB, 0x53BC, 0x53C3, 0x53F9, 0x5403, 0x5412, 0x541B, 0x542C, 0x5433, 0x5452, 0x5468, 0x5491, 0x54A4, 0x54CA, 0x54E1, 0x54F3, 0x54FA, 0x54FB, 0x5504, 0x5511, 0x551C, 0x551D, 0x552F, 0x5536, 0x553E, 0x5547, 0x554F, 0x5557, 0x555E, 0x5564, 0x557C, 0x558B, 0x5598, 0x559E, 0x55A7, 0x55AF, 0x55C5, 0x55C8, 0x55D4, 0x55E5, 0x55FD, 0x55FF, 0x5606, 0x560A, 0x5614, 0x5618, 0x562F, 0x5637, 0x5653, 0x5654, 0x5668, 0x566C, 0x5674, 0x5675, 0x5686, 0x5687, 0x56A5, 0x56B5, 0x56BC, 0x56BD, 0x56CA, 0x56D2, 0x56DA, 0x56E1, 0x56F0, 0x56F1, 0x56F9, 0x56FB, 0x5703, 0x5720, 0x5728, 0x5731, 0x573B, 0x5752, 0x5761, 0x578C, 0x5793, 0x5794, 0x57A0, 0x57A4, 0x57C3, 0x57CF, 0x57DF, 0x57E1, 0x57F0, 0x580B, 0x581E, 0x583B, 0x584A, 0x5865, 0x5875, 0x588A, 0x5893, 0x5894, 0x589C, 0x58A0, 0x58A8, 0x58F0, 0x58F9, 0x58FE, 0x590F, 0x598B, 0x5993, 0x599A, 0x59A5, 0x59AD, 0x59B9, 0x59DE, 0x59E6, 0x59EF, 0x59F8, 0x5A04, 0x5A11, 0x5A2A, 0x5A36, 0x5A4A, 0x5A5A, 0x5A5B, 0x5A62, 0x5A67, 0x5A92, 0x5A93, 0x5A9A, 0x5A9C, 0x5AA4, 0x5AA5, 0x5AC1, 0x5ACD, 0x5AE1, 0x5AEA, 0x5B05, 0x5B0D, 0x5B16, 0x5B17, 0x5B2A, 0x5B2B, 0x5B40, 0x5B44, 0x5B50, 0x5B7D, 0x5B85, 0x5C1A, 0x5C24, 0x5C29, 0x5C31, 0x5C72, 0x5C79, 0x5C7A, 0x5C90, 0x5C92, 0x5CA1, 0x5CA2, 0x5CA9, 0x5CC1, 0x5CD9, 0x5CE1, 0x5CE8, 0x5CFE, 0x5D07, 0x5D1A, 0x5D27, 0x5D2A, 0x5D4B, 0x5D51, 0x5D69, 0x5D70, 0x5D87, 0x5D8C, 0x5D9D, 0x5DA3, 0x5DAA, 0x5DAB, 0x5DB8, 0x5DBE, 0x5DCD, 0x5E1E, 0x5E25, 0x5E4D, 0x5E55, 0x5E56, 0x5E5F, 0x5E64, 0x5E72, 0x5EAE, 0x5EB5, 0x5EE4, 0x5EEC, 0x5F2A, 0x5F31, 0x5F3D, 0x5F48, 0x5F4F, 0x5F56, 0x5FCE, 0x5FD6, 0x5FE1, 0x5FEB, 0x5FEC, 0x5FF5, 0x5FF6, 0x5FFD, 0x6000, 0x600F, 0x6030, 0x6041, 0x6044, 0x604D, 0x6071, 0x6085, 0x60A8, 0x60B0, 0x60BE, 0x60C5, 0x60C8, 0x60D1, 0x60D2, 0x60DA, 0x60E2, 0x60F0, 0x6120, 0x6127, 0x6128, 0x6130, 0x6183, 0x618A, 0x619B, 0x61A4, 0x61CC, 0x61E6, 0x61E7, 0x61F2, 0x6222, 0x622A, 0x6237, 0x623E, 0x6259, 0x626E, 0x629C, 0x62AB, 0x62DD, 0x62EC, 0x630A, 0x6311, 0x6312, 0x632B, 0x6330, 0x633A, 0x633F, 0x6349, 0x6356, 0x6367, 0x63AB, 0x63C0, 0x63C7, 0x63CF, 0x63E2, 0x63ED, 0x63F8, 0x640D, 0x6423, 0x642C, 0x642E, 0x643A, 0x643F, 0x6458, 0x6459, 0x6460, 0x6461, 0x6469, 0x6470, 0x6478, 0x647B, 0x6488, 0x6489, 0x6491, 0x64B3, 0x64BB, 0x6505, 0x6518, 0x65D8, 0x65E0, 0x6616, 0x661E, 0x6650, 0x6659, 0x667B, 0x6684, 0x66A3, 0x66AB, 0x66CA, 0x66D6, 0x66E7, 0x66F0, 0x673E, 0x6746, 0x6760, 0x676D, 0x6780, 0x6787, 0x679E, 0x67AF, 0x67C5, 0x67CF, 0x67DE, 0x67E9, 0x67FF, 0x6812, 0x6818, 0x6821, 0x6823, 0x682A, 0x6830, 0x6838, 0x6855, 0x686D, 0x686E, 0x6876, 0x6877, 0x687F, 0x6886, 0x688F, 0x68B7, 0x68C4, 0x6906, 0x690D, 0x6913, 0x6927, 0x6928, 0x6930, 0x6931, 0x693D, 0x6940, 0x694A, 0x694B, 0x6953, 0x697A, 0x6995, 0x699D, 0x69A5, 0x69C4, 0x69CB, 0x69D1, 0x69E8, 0x69EB, 0x69FB, 0x6A03, 0x6A0A, 0x6A24, 0x6A35, 0x6A62, 0x6A6B, 0x6A6C, 0x6A80, 0x6A8F, 0x6A97, 0x6AA4, 0x6AB3, 0x6AB4, 0x6ABB, 0x6AC4, 0x6AD3, 0x6ADC, 0x6AF6, 0x6AFC, 0x6B04, 0x6B17, 0x6B20, 0x6B24, 0x6B32, 0x6B33, 0x6B3A, 0x6B3F, 0x6B46, 0x6B51, 0x6B5F, 0x6B6B, 0x6B72, 0x6B8B, 0x6B96, 0x6B9F, 0x6BAE, 0x6BDC, 0x6BEB, 0x6BED, 0x6C08, 0x6C14, 0x6C23, 0x6C24, 0x6C34, 0x6C43, 0x6C4E, 0x6C61, 0x6C68, 0x6C9C, 0x6CAB, 0x6CF4, 0x6D0B, 0x6D2B, 0x6D32, 0x6D42, 0x6D59, 0x6D96, 0x6DAF, 0x6DB6, 0x6DC0, 0x6DFC, 0x6E17, 0x6E4E, 0x6E56, 0x6E60, 0x6E67, 0x6E7B, 0x6E90, 0x6EBB, 0x6EC2, 0x6ED5, 0x6EEF, 0x6F07, 0x6F0F, 0x6F16, 0x6F20, 0x6F24, 0x6F2B, 0x6F42, 0x6F51, 0x6F65, 0x6F6D, 0x6F71, 0x6F7A, 0x6F98, 0x6FA3, 0x6FCB, 0x6FD5, 0x6FF2, 0x6FFE, 0x7030, 0x7037, 0x703F, 0x704C, 0x7064, 0x706B, 0x7071, 0x7078, 0x707E, 0x7085, 0x70BA, 0x70C8, 0x70D0, 0x70D8, 0x70E0, 0x70F1, 0x70F2, 0x70F9, 0x710D, 0x7119, 0x7127, 0x7130, 0x7137, 0x7147, 0x716F, 0x717D, 0x71A3, 0x71AC, 0x71B2, 0x71B9, 0x71D6, 0x71DF, 0x71EF, 0x71FB, 0x7207, 0x7210, 0x7211, 0x721B, 0x721C, 0x722A, 0x726A, 0x7272, 0x7282, 0x72A2, 0x72B0, 0x72C0, 0x72C5, 0x72CE, 0x72DA, 0x72E1, 0x72E2, 0x72E9, 0x72EA, 0x72F8, 0x72FE, 0x730A, 0x730B, 0x7316, 0x731E, 0x7325, 0x732C, 0x7336, 0x7346, 0x7350, 0x7358, 0x7368, 0x737C, 0x7384, 0x73A0, 0x73A7, 0x73EE, 0x73F7, 0x740A, 0x7413, 0x7414, 0x741B, 0x744C, 0x7455, 0x7470, 0x747E, 0x748C, 0x7498, 0x74E7, 0x74EE, 0x74EF, 0x74F7, 0x74F8, 0x7501, 0x7505, 0x7511, 0x753B, 0x7547, 0x7592, 0x759D, 0x759E, 0x75A5, 0x75E3, 0x75F0, 0x7601, 0x760D, 0x760E, 0x7619, 0x7627, 0x763B, 0x7643, 0x764C, 0x7657, 0x7661, 0x7694, 0x76AE, 0x76AF, 0x76BA, 0x76CB, 0x76D2, 0x770C, 0x771E, 0x7721, 0x7729, 0x772A, 0x7737, 0x7741, 0x774D, 0x774E, 0x775B, 0x776C, 0x7779, 0x7780, 0x778B, 0x7792, 0x779E, 0x77B4, 0x77BB, 0x77C0, 0x77D7, 0x77F4, 0x7802, 0x7803, 0x7812, 0x7813, 0x7825, 0x7835, 0x7845, 0x7846, 0x784F, 0x7850, 0x785D, 0x785E, 0x786B, 0x7870, 0x787C, 0x7898, 0x78A3, 0x78AA, 0x78BA, 0x78D1, 0x78E8, 0x7902, 0x790E, 0x790F, 0x7916, 0x7917, 0x792A, 0x792D, 0x793A, 0x796E, 0x797A, 0x7982, 0x798D, 0x7992, 0x79A6, 0x79C2, 0x79C9, 0x79EA, 0x79FB, 0x7A21, 0x7A2E, 0x7A4F, 0x7A57, 0x7A58, 0x7A61, 0x7A89, 0x7A92, 0x7AA0, 0x7AA9, 0x7AB0, 0x7ABA, 0x7ABB, 0x7AC4, 0x7ACC, 0x7AD7, 0x7B00, 0x7B0F, 0x7B12, 0x7B19, 0x7B2E, 0x7B39, 0x7B3A, 0x7B46, 0x7B57, 0x7B60, 0x7B61, 0x7B6C, 0x7B76, 0x7B7D, 0x7B7E, 0x7B87, 0x7BA2, 0x7BAD, 0x7BB9, 0x7BC0, 0x7BCA, 0x7BD2, 0x7BD3, 0x7BE0, 0x7BEA, 0x7C07, 0x7C08, 0x7C12, 0x7C13, 0x7C1E, 0x7C2C, 0x7C3D, 0x7C44, 0x7C4C, 0x7C4E, 0x7C60, 0x7C65, 0x7C6C, 0x7C74, 0x7C83, 0x7C8A, 0x7C92, 0x7CBF, 0x7CCA, 0x7CCB, 0x7CD6, 0x7CD7, 0x7CDE, 0x7CE8, 0x7CFB, 0x7D23, 0x7D2B, 0x7D3B, 0x7D42, 0x7D47, 0x7D50, 0x7D51, 0x7D5E, 0x7D80, 0x7D8E, 0x7D94, 0x7D9C, 0x7DA3, 0x7DAC, 0x7DC0, 0x7DC7, 0x7DCC, 0x7DD6, 0x7DFC, 0x7E09, 0x7E0B, 0x7E15, 0x7E24, 0x7E2B, 0x7E48, 0x7E52, 0x7E56, 0x7E5E, 0x7E62, 0x7E69, 0x7E71, 0x7E79, 0x7E83, 0x7E8C, 0x7E9D, 0x7F36, 0x7F3B, 0x7F4C, 0x7F56, 0x7F6A, 0x7F7A, 0x7F85, 0x7FAA, 0x7FB2, 0x7FD6, 0x7FDF, 0x7FE2, 0x7FE9, 0x7FF1, 0x7FF9, 0x8019, 0x802D, 0x804B, 0x8056, 0x805F, 0x806F, 0x808D, 0x8096, 0x80BB, 0x80C3, 0x80C5, 0x80CC, 0x80CF, 0x80DA, 0x80E6, 0x80F1, 0x810B, 0x8118, 0x811C, 0x8123, 0x8130, 0x8139, 0x813F, 0x814B, 0x8156, 0x8165, 0x8181, 0x8188, 0x8190, 0x819A, 0x81A9, 0x81B3, 0x81CE, 0x81D8, 0x8213, 0x821B, 0x8222, 0x822A, 0x822D, 0x8235, 0x8248, 0x8259, 0x825A, 0x8264, 0x8267, 0x826E, 0x827F, 0x828B, 0x82C0, 0x82D1, 0x82E8, 0x82F1, 0x82F2, 0x82FD, 0x830A, 0x8317, 0x8318, 0x8328, 0x8353, 0x8373, 0x837C, 0x8389, 0x838F, 0x8396, 0x83AC, 0x83BD, 0x83DD, 0x83E9, 0x840F, 0x8429, 0x843E, 0x8449, 0x844A, 0x8457, 0x847B, 0x8490, 0x84A2, 0x84B2, 0x84D2, 0x84DA, 0x84DB, 0x84EC, 0x84F5, 0x84FC, 0x84FD, 0x8511, 0x8530, 0x853D, 0x855A, 0x8563, 0x856E, 0x8584, 0x8588, 0x858F, 0x859C, 0x85A6, 0x85B1, 0x85BA, 0x85C2, 0x85C9, 0x85EB, 0x85F7, 0x860B, 0x8616, 0x861B, 0x862D, 0x862E, 0x863F, 0x8640, 0x864E, 0x8660, 0x8667, 0x8668, 0x8679, 0x867A, 0x868A, 0x8694, 0x86A3, 0x86AA, 0x86C7, 0x86CC, 0x86D4, 0x86E5, 0x86ED, 0x86EE, 0x86FE, 0x8709, 0x8718, 0x871D, 0x874E, 0x8758, 0x875F, 0x8769, 0x8774, 0x8779, 0x8782, 0x8783, 0x878D, 0x878E, 0x879F, 0x87A3, 0x87B3, 0x87BB, 0x87C4, 0x87C5, 0x87E0, 0x87E1, 0x87EC, 0x8806, 0x881F, 0x8824, 0x8831, 0x889F, 0x88AB, 0x88AC, 0x88B4, 0x88B5, 0x88C1, 0x88C3, 0x88CF, 0x88E9, 0x88F3, 0x88FE, 0x8907, 0x8908, 0x8910, 0x891A, 0x8925, 0x892B, 0x8936, 0x8945, 0x895F, 0x896B, 0x8972, 0x8973, 0x897F, 0x8997, 0x89A1, 0x89A2, 0x89A9, 0x89AB, 0x89B2, 0x89B3, 0x89BA, 0x89C1, 0x89D2, 0x89D3, 0x89E3, 0x89E4, 0x89F4, 0x89F9, 0x8A00, 0x8A3C, 0x8A50, 0x8A7A, 0x8A85, 0x8B05, 0x8B0E, 0x8B21, 0x8B28, 0x8B3A, 0x8B41, 0x8B42, 0x8B49, 0x8B50, 0x8B58, 0x8B5D, 0x8B66, 0x8B81, 0x8B8A, 0x8B9B, 0x8C37, 0x8C38, 0x8C3F, 0x8C4D, 0x8C55, 0x8C62, 0x8C6A, 0x8C6C, 0x8C79, 0x8C7B, 0x8C82, 0x8C83, 0x8C8A, 0x8C8D, 0x8C9D, 0x8D17, 0x8D64, 0x8D78, 0x8D85, 0x8D8B, 0x8D99, 0x8D9A, 0x8DA3, 0x8DA9, 0x8DB3, 0x8DBF, 0x8DC6, 0x8DD0, 0x8DDB, 0x8DF4, 0x8E0A, 0x8E11, 0x8E1E, 0x8E1F, 0x8E2A, 0x8E36, 0x8E42, 0x8E4B, 0x8E59, 0x8E61, 0x8E74, 0x8E77, 0x8E81, 0x8E8E, 0x8EAA, 0x8EAD, 0x8EC0, 0x8EC1, 0x8ECA, 0x8ED3, 0x8EDF, 0x8EE0, 0x8EEB, 0x8EEC, 0x8EF8, 0x8F0A, 0x8F12, 0x8F4F, 0x8F5D, 0x8F63, 0x8F9B, 0x8FB3, 0x8FC2, 0x8FC6, 0x8FCE, 0x8FD5, 0x8FE6, 0x9024, 0x902E, 0x909A, 0x90A2, 0x90B9, 0x90C1, 0x90C2, 0x90CA, 0x90CB, 0x90DE, 0x90EE, 0x90F5, 0x90F6, 0x90FD, 0x9103, 0x9112, 0x911A, 0x9127, 0x9133, 0x9149, 0x9153, 0x9162, 0x916D, 0x9175, 0x9179, 0x9187, 0x9193, 0x919C, 0x919D, 0x91AB, 0x91B6, 0x91C0, 0x91EB, 0x91F5, 0x91F6, 0x920D, 0x921F, 0x9234, 0x924A, 0x9257, 0x9267, 0x9280, 0x9286, 0x9291, 0x929D, 0x92B3, 0x92BA, 0x92CC, 0x92D3, 0x92E4, 0x92EB, 0x92F8, 0x92FD, 0x9304, 0x9305, 0x9310, 0x9311, 0x9318, 0x9330, 0x9348, 0x935C, 0x936E, 0x937F, 0x938C, 0x938D, 0x9394, 0x939B, 0x93A3, 0x93B1, 0x93C3, 0x93C4, 0x93D1, 0x93D2, 0x93DE, 0x93E5, 0x93F6, 0x93F7, 0x9404, 0x9405, 0x9418, 0x9419, 0x9425, 0x942C, 0x9435, 0x9439, 0x9444, 0x9445, 0x9451, 0x9453, 0x945B, 0x945C, 0x947D, 0x9480, 0x9577, 0x9578, 0x9580, 0x9599, 0x95A3, 0x95B2, 0x95BB, 0x95BD, 0x95C7, 0x95CB, 0x95D4, 0x95E3, 0x961C, 0x9622, 0x962A, 0x9633, 0x963B, 0x9651, 0x965B, 0x967E, 0x9685, 0x9708, 0x9711, 0x971F, 0x9727, 0x9728, 0x9730, 0x9749, 0x9751, 0x977B, 0x978B, 0x9790, 0x97A0, 0x97A1, 0x97A8, 0x97AE, 0x97C6, 0x97CC, 0x97D3, 0x97D4, 0x97DC, 0x97DD, 0x97F3, 0x9819, 0x982D, 0x9831, 0x9838, 0x983C, 0x9846, 0x9870, 0x98A8, 0x98B2, 0x98C4, 0x98C8, 0x98DB, 0x98E3, 0x98ED, 0x98F5, 0x98FC, 0x9921, 0x9928, 0x9929, 0x9945, 0x9958, 0x9996, 0x999E, 0x99A5, 0x99BA, 0x99C1, 0x99C2, 0x99D0, 0x99E0, 0x99ED, 0x99F2, 0x99FF, 0x9A10, 0x9A19, 0x9A1A, 0x9A2B, 0x9A38, 0x9A40, 0x9A46, 0x9A4D, 0x9A4E, 0x9A55, 0x9A6B, 0x9AA8, 0x9AA9, 0x9AB8, 0x9AB9, 0x9AD3, 0x9AD9, 0x9AE5, 0x9AE6, 0x9AEE, 0x9AEF, 0x9B1A, 0x9B1B, 0x9B27, 0x9B32, 0x9B3C, 0x9B46, 0x9B4F, 0x9B5B, 0x9B6F, 0x9B70, 0x9B8E, 0x9B92, 0x9B9F, 0x9BA0, 0x9BAB, 0x9BAF, 0x9BC9, 0x9BCA, 0x9BD6, 0x9BD7, 0x9BE4, 0x9BE9, 0x9C0D, 0x9C16, 0x9C25, 0x9C26, 0x9C32, 0x9C33, 0x9C3B, 0x9C3C, 0x9C47, 0x9C4A, 0x9C57, 0x9C58, 0x9CE5, 0x9CEA, 0x9CF3, 0x9CF7, 0x9D09, 0x9D0A, 0x9D1B, 0x9D1C, 0x9D26, 0x9D29, 0x9D3B, 0x9D3C, 0x9D51, 0x9D52, 0x9D5D, 0x9D62, 0x9D6C, 0x9D73, 0x9DA9, 0x9DB5, 0x9DC4, 0x9DC5, 0x9DD7, 0x9DD8, 0x9DF2, 0x9DFB, 0x9E1A, 0x9E1F, 0x9E75, 0x9E80, 0x9E92, 0x9EA6, 0x9EB4, 0x9EC4, 0x9ECD, 0x9EDF, 0x9EE8, 0x9EE9, 0x9EF4, 0x9EF5, 0x9F07, 0x9F14, 0x9F20, 0x9F21, 0x9F3B, 0x9F3C, 0x9F4A, 0x9F53, 0x9F5F, 0x9F6D, 0x9F77, 0x9F78, 0x9F8D, 0x9F9D, 0xAC00, 0xD7A4, 0xF900, 0xF939, 0xF944, 0xFA0C, 0xFF01, 0xFF3C, 0xFF3D, 0xFF5E, 0xFF5F, 0xFFE0, 0xFFE7, // compressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 753, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 100, RCHAR, 109, RCHAR, RCHAR, RCHAR, 408, RCHAR, 425, RCHAR, 440, RCHAR, 457, RCHAR, 1040, RCHAR, 1034, 1041, 1082, 1089, RCHAR, 1088, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 55, RCHAR, 840, RCHAR, RCHAR, RCHAR, 163, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 391, RCHAR, 376, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 53, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 126, RCHAR, 48, RCHAR, 49, RCHAR, 728, RCHAR, 822, RCHAR, 796, RCHAR, 702, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 131, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 846, RCHAR, 940, RCHAR, 282, RCHAR, 768, 156, RCHAR, 674, RCHAR, 155, RCHAR, RCHAR, 574, RCHAR, 594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6397, RCHAR, RCHAR, RCHAR, 4024, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6928, RCHAR, RCHAR, RCHAR, 6815, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4006, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8229, RCHAR, RCHAR, RCHAR, 5206, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8403, RCHAR, RCHAR, RCHAR, 5675, RCHAR, 8640, RCHAR, RCHAR, RCHAR, 7179, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4196, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8372, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5318, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8529, RCHAR, RCHAR, RCHAR, 5227, RCHAR, RCHAR, RCHAR, 6227, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8215, RCHAR, 5747, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8710, RCHAR, RCHAR, RCHAR, 3957, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6476, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5182, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8054, RCHAR, 4628, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8526, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4284, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4566, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4790, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7292, RCHAR, 7931, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5027, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7658, RCHAR, 8133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5270, RCHAR, 6402, RCHAR, RCHAR, RCHAR, 6428, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8637, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5750, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6783, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4519, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4103, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5032, RCHAR, 4907, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4303, RCHAR, 6122, RCHAR, RCHAR, RCHAR, 6636, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6718, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6696, RCHAR, 7165, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5835, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6434, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8282, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8428, RCHAR, RCHAR, RCHAR, 8429, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5800, RCHAR, 5726, RCHAR, RCHAR, RCHAR, 4426, RCHAR, 6543, RCHAR, 7901, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7903, RCHAR, 6491, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4427, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6026, RCHAR, RCHAR, RCHAR, 4438, RCHAR, RCHAR, RCHAR, 6677, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6260, RCHAR, RCHAR, RCHAR, 7499, RCHAR, 7741, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8512, RCHAR, 4755, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4072, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7784, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6619, RCHAR, RCHAR, RCHAR, 5274, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6587, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6139, RCHAR, RCHAR, RCHAR, 5075, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4908, RCHAR, 4888, RCHAR, RCHAR, RCHAR, 8695, RCHAR, 8545, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7697, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4931, RCHAR, 7010, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8051, RCHAR, 5443, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8283, RCHAR, 4180, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5605, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6212, RCHAR, RCHAR, RCHAR, 4056, RCHAR, RCHAR, RCHAR, 4461, RCHAR, RCHAR, RCHAR, 3892, RCHAR, 8381, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8559, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4194, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7911, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7490, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4017, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4361, RCHAR, RCHAR, RCHAR, 6552, RCHAR, 7679, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6851, RCHAR, 4313, RCHAR, RCHAR, RCHAR, 6839, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7956, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7798, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5047, RCHAR, 7957, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4080, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7501, RCHAR, 7312, RCHAR, RCHAR, RCHAR, 7708, RCHAR, 8638, RCHAR, 7523, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7568, RCHAR, 3945, RCHAR, 4275, RCHAR, RCHAR, RCHAR, 7237, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5349, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4374, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8330, RCHAR, 4816, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4258, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5421, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8207, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8651, RCHAR, RCHAR, RCHAR, 4208, RCHAR, 8386, RCHAR, RCHAR, RCHAR, 6582, RCHAR, 5456, RCHAR, 6158, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5040, RCHAR, RCHAR, RCHAR, 6350, RCHAR, RCHAR, RCHAR, 5154, RCHAR, 7878, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8584, RCHAR, 6680, RCHAR, 5205, RCHAR, RCHAR, RCHAR, 5162, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6325, RCHAR, 6897, RCHAR, RCHAR, RCHAR, 8547, RCHAR, 4068, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4149, RCHAR, 4369, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4757, RCHAR, 5386, RCHAR, RCHAR, RCHAR, 5930, RCHAR, 5745, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6340, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4650, RCHAR, RCHAR, 188, 11, 248, 99, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, 11204, RCHAR, 11242, RCHAR, 11265, RCHAR, RCHAR, RCHAR, 11280, RCHAR, 11282, RCHAR, 11317, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11319, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11325, RCHAR, 11343, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11347, RCHAR, RCHAR, RCHAR, 11353, RCHAR, 11360, RCHAR, 11364, RCHAR, 11375, RCHAR, RCHAR, RCHAR, RCHAR, 11388, RCHAR, 11398, RCHAR, 11401, RCHAR, 11419, RCHAR, RCHAR, RCHAR, 11455, RCHAR, 11467, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11473, RCHAR, 11477, RCHAR, RCHAR, RCHAR, 11541, RCHAR, 11551, RCHAR, 11583, RCHAR, 11585, RCHAR, 11587, RCHAR, 11590, RCHAR, 11593, RCHAR, 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11607, RCHAR, 11632, RCHAR, 11645, RCHAR, 11681, RCHAR, 11712, RCHAR, 11763, RCHAR, 11831, RCHAR, 11879, RCHAR, 11897, RCHAR, 11906, RCHAR, 11952, RCHAR, 12005, RCHAR, 12014, RCHAR, 12049, RCHAR, 12062, RCHAR, RCHAR, RCHAR, 12106, RCHAR, RCHAR, RCHAR, 12132, RCHAR, 12137, RCHAR, 12143, RCHAR, 12156, RCHAR, 12222, RCHAR, RCHAR, RCHAR, 12239, RCHAR, RCHAR, RCHAR, 12242, RCHAR, 12275, RCHAR, 12335, RCHAR, 12348, RCHAR, 12372, RCHAR, 12378, RCHAR, 12454, RCHAR, 12485, RCHAR, 12498, RCHAR, 12520, RCHAR, 12537, RCHAR, 12576, RCHAR, 12637, RCHAR, 12713, RCHAR, RCHAR, RCHAR, 12740, RCHAR, 12794, RCHAR, 12809, RCHAR, 12826, RCHAR, 12857, RCHAR, 12898, RCHAR, 12936, RCHAR, RCHAR, RCHAR, 12954, RCHAR, RCHAR, RCHAR, 12967, RCHAR, 12974, RCHAR, 12983, RCHAR, 12991, RCHAR, 12997, RCHAR, 13012, RCHAR, 13018, RCHAR, 13026, RCHAR, 13029, RCHAR, 13046, RCHAR, 13048, RCHAR, 13052, RCHAR, 13056, RCHAR, RCHAR, RCHAR, 13064, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13068, RCHAR, RCHAR, RCHAR, 13084, RCHAR, 13092, RCHAR, RCHAR, RCHAR, 13099, RCHAR, 13101, RCHAR, 13130, RCHAR, 13139, RCHAR, 13162, RCHAR, RCHAR, RCHAR, 13205, RCHAR, 13209, RCHAR, 13221, RCHAR, 13223, RCHAR, 13250, RCHAR, 13279, RCHAR, 13306, RCHAR, RCHAR, RCHAR, 13327, RCHAR, 13331, RCHAR, 13403, RCHAR, 13408, RCHAR, 13532, RCHAR, 13539, RCHAR, 13547, RCHAR, 13584, RCHAR, 13593, RCHAR, 13605, RCHAR, 13630, RCHAR, RCHAR, RCHAR, 13650, RCHAR, RCHAR, RCHAR, 13655, RCHAR, RCHAR, RCHAR, 13657, RCHAR, 13669, RCHAR, 13678, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13686, RCHAR, 13690, RCHAR, 13735, RCHAR, 13884, RCHAR, 13889, RCHAR, RCHAR, RCHAR, 13954, RCHAR, RCHAR, RCHAR, 13956, RCHAR, 13980, RCHAR, 13988, RCHAR, 14010, RCHAR, 14029, RCHAR, 14032, RCHAR, 14038, RCHAR, 14045, RCHAR, 14050, RCHAR, RCHAR, RCHAR, 14056, RCHAR, 14062, RCHAR, 14143, RCHAR, RCHAR, RCHAR, 14183, RCHAR, 14188, RCHAR, 14248, RCHAR, 14295, RCHAR, 14357, RCHAR, 14369, RCHAR, 14376, RCHAR, 14496, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14507, RCHAR, 14510, RCHAR, 14543, RCHAR, 14546, RCHAR, 14582, RCHAR, 14617, RCHAR, 14631, RCHAR, RCHAR, RCHAR, 14634, RCHAR, 14642, RCHAR, RCHAR, RCHAR, 14690, RCHAR, 14773, RCHAR, 14790, RCHAR, RCHAR, RCHAR, 14830, RCHAR, 14878, RCHAR, 14891, RCHAR, 14918, RCHAR, 14964, RCHAR, 15014, RCHAR, RCHAR, RCHAR, 15044, RCHAR, 15049, RCHAR, 15054, RCHAR, 15067, RCHAR, 15135, RCHAR, 15142, RCHAR, 15161, RCHAR, 15172, RCHAR, 15194, RCHAR, 15196, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15201, RCHAR, 15208, RCHAR, RCHAR, RCHAR, 15211, RCHAR, 15245, RCHAR, 15319, RCHAR, 15511, RCHAR, 15565, RCHAR, 15615, RCHAR, 15649, RCHAR, 15680, RCHAR, 15711, RCHAR, 15728, RCHAR, 15806, RCHAR, 15832, RCHAR, 15851, RCHAR, 15874, RCHAR, 15896, RCHAR, 15911, RCHAR, 15933, RCHAR, 15939, RCHAR, 15941, RCHAR, 15947, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15976, RCHAR, 15983, RCHAR, 16023, RCHAR, 16089, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16095, RCHAR, RCHAR, RCHAR, 16098, RCHAR, 16137, RCHAR, 16145, RCHAR, 16176, RCHAR, 16182, RCHAR, 16185, RCHAR, 16193, RCHAR, 16219, RCHAR, RCHAR, RCHAR, 16264, RCHAR, 16279, RCHAR, RCHAR, RCHAR, 16292, RCHAR, 16301, RCHAR, 16310, RCHAR, 16316, RCHAR, 16335, RCHAR, RCHAR, RCHAR, 16339, RCHAR, 16344, RCHAR, 16355, RCHAR, 16367, RCHAR, 16392, RCHAR, 16401, RCHAR, 16447, RCHAR, 16449, RCHAR, RCHAR, RCHAR, 16461, RCHAR, 16476, RCHAR, 16495, RCHAR, 16547, RCHAR, 16620, RCHAR, 16652, RCHAR, 16668, RCHAR, 16729, RCHAR, 16736, RCHAR, 16796, RCHAR, 16851, RCHAR, 16861, RCHAR, 16881, RCHAR, 16924, RCHAR, 16943, RCHAR, 16967, RCHAR, 16974, RCHAR, 16978, RCHAR, 17001, RCHAR, 17021, RCHAR, 17025, RCHAR, 17055, RCHAR, 17095, RCHAR, 17124, RCHAR, 17174, RCHAR, 17182, RCHAR, 17206, RCHAR, 17212, RCHAR, 17218, RCHAR, 17271, RCHAR, 17279, RCHAR, RCHAR, RCHAR, 17287, RCHAR, 17307, RCHAR, 17321, RCHAR, 17328, RCHAR, 17368, RCHAR, 17406, RCHAR, 17412, RCHAR, 17441, RCHAR, 17457, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17469, RCHAR, 17533, RCHAR, 17549, RCHAR, 17563, RCHAR, 17568, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17580, RCHAR, RCHAR, RCHAR, 17586, RCHAR, 17594, RCHAR, 17601, RCHAR, 17617, RCHAR, 17625, RCHAR, 17645, RCHAR, 17673, RCHAR, 17744, RCHAR, RCHAR, RCHAR, 17763, RCHAR, 17812, RCHAR, 17839, RCHAR, 17853, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17932, RCHAR, 17936, RCHAR, 17978, RCHAR, RCHAR, RCHAR, 18053, RCHAR, 18115, RCHAR, RCHAR, RCHAR, 18132, RCHAR, 18146, RCHAR, 18154, RCHAR, 18165, RCHAR, RCHAR, RCHAR, 18216, RCHAR, 18233, RCHAR, 18291, RCHAR, RCHAR, RCHAR, 18294, RCHAR, RCHAR, RCHAR, 18304, RCHAR, 18321, RCHAR, 18328, RCHAR, 18335, RCHAR, 18357, RCHAR, 18362, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18391, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18407, RCHAR, 18412, RCHAR, 18440, RCHAR, 18447, RCHAR, 18470, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18496, RCHAR, 18499, RCHAR, 18551, RCHAR, 18559, RCHAR, 18564, RCHAR, 18592, RCHAR, 18625, RCHAR, 18663, RCHAR, RCHAR, RCHAR, 18696, RCHAR, 18736, RCHAR, 18750, RCHAR, RCHAR, RCHAR, 18757, RCHAR, 18765, RCHAR, 18806, RCHAR, 18809, RCHAR, RCHAR, RCHAR, 18830, RCHAR, RCHAR, RCHAR, 18847, RCHAR, RCHAR, RCHAR, 18857, RCHAR, 18884, RCHAR, 18896, RCHAR, RCHAR, RCHAR, 18906, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18916, RCHAR, 18930, RCHAR, 18937, RCHAR, 18939, RCHAR, 18944, RCHAR, 18952, RCHAR, 18959, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 19004, RCHAR, 19014, RCHAR, 19054, RCHAR, 19070, RCHAR, RCHAR, RCHAR, 19075, RCHAR, 19109, RCHAR, 19115, RCHAR, 19122, RCHAR, 19142, RCHAR, 19147, RCHAR, 19185, RCHAR, 19187, RCHAR, 19202, RCHAR, 19231, RCHAR, 19235, RCHAR, 19239, RCHAR, 19247, RCHAR, 19257, RCHAR, 19274, RCHAR, 19279, RCHAR, 19289, RCHAR, 19305, RCHAR, 19342, RCHAR, 19378, RCHAR, 19381, RCHAR, 19389, RCHAR, 19421, RCHAR, 19451, RCHAR, 19460, RCHAR, 19490, RCHAR, 19527, RCHAR, 19529, RCHAR, 19532, RCHAR, 19544, RCHAR, 19570, RCHAR, 19574, RCHAR, 19587, RCHAR, 19593, RCHAR, 19604, RCHAR, 19632, RCHAR, 19640, RCHAR, 19655, RCHAR, 19682, RCHAR, 19741, RCHAR, 19748, RCHAR, 19751, RCHAR, RCHAR, RCHAR, 19770, RCHAR, 19773, RCHAR, 19790, RCHAR, 19843, RCHAR, RCHAR, RCHAR, 19866, RCHAR, RCHAR, RCHAR, 19879, RCHAR, 19922, RCHAR, 19931, RCHAR, 19937, RCHAR, 19959, RCHAR, 19991, RCHAR, 20029, RCHAR, RCHAR, RCHAR, 20050, RCHAR, 20086, RCHAR, 20104, RCHAR, RCHAR, RCHAR, 20136, RCHAR, RCHAR, RCHAR, 20145, RCHAR, 20176, RCHAR, 20205, RCHAR, 20216, RCHAR, 20220, RCHAR, 20233, RCHAR, 20244, RCHAR, 20252, RCHAR, 20286, RCHAR, 20306, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20311, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20329, RCHAR, 20339, RCHAR, 20346, RCHAR, 20351, RCHAR, RCHAR, RCHAR, 20368, RCHAR, 20379, RCHAR, 20384, RCHAR, 20394, RCHAR, 20404, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20409, RCHAR, 20413, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20421, RCHAR, 20447, RCHAR, 20452, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20562, RCHAR, 20564, RCHAR, 20590, RCHAR, RCHAR, RCHAR, 20601, RCHAR, 20611, RCHAR, 20617, RCHAR, 20632, RCHAR, RCHAR, RCHAR, 20644, RCHAR, RCHAR, RCHAR, 20668, RCHAR, RCHAR, RCHAR, 20670, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20677, RCHAR, 20682, RCHAR, 20742, RCHAR, 20784, RCHAR, 20912, RCHAR, 20931, RCHAR, RCHAR, RCHAR, 20949, RCHAR, 20956, RCHAR, 20961, RCHAR, 20988, RCHAR, RCHAR, RCHAR, 21005, RCHAR, 21019, RCHAR, 21032, RCHAR, 21034, RCHAR, RCHAR, RCHAR, 21036, RCHAR, 21039, RCHAR, 21161, RCHAR, 21181, RCHAR, RCHAR, RCHAR, 21187, RCHAR, 21193, RCHAR, 21205, RCHAR, 21215, RCHAR, 21240, RCHAR, RCHAR, RCHAR, 21247, RCHAR, 21259, RCHAR, 21268, RCHAR, 21276, RCHAR, 21279, RCHAR, 21292, RCHAR, RCHAR, RCHAR, 21295, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21304, RCHAR, 21322, RCHAR, 21383, RCHAR, 21389, RCHAR, 21413, RCHAR, 21417, RCHAR, 21424, RCHAR, 21486, RCHAR, 21594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21617, RCHAR, RCHAR, RCHAR, 21633, RCHAR, 21639, RCHAR, 21647, RCHAR, 21659, RCHAR, 21669, RCHAR, 21680, RCHAR, 21684, RCHAR, RCHAR, RCHAR, 21696, RCHAR, 21707, RCHAR, RCHAR, RCHAR, 21750, RCHAR, 21768, RCHAR, 21790, RCHAR, 21806, RCHAR, 21812, RCHAR, 21824, RCHAR, 21831, RCHAR, 21838, RCHAR, 21845, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21850, RCHAR, 21874, RCHAR, 21894, RCHAR, RCHAR, RCHAR, 21911, RCHAR, 21918, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21932, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21939, RCHAR, 21946, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21950, RCHAR, RCHAR, RCHAR, 21953, RCHAR, 21978, RCHAR, 21993, RCHAR, 21995, RCHAR, 21999, RCHAR, 22014, RCHAR, 22020, RCHAR, 22029, RCHAR, 22051, RCHAR, 22086, RCHAR, 22217, RCHAR, RCHAR, RCHAR, 22231, RCHAR, 22256, RCHAR, 22298, RCHAR, RCHAR, RCHAR, 22303, RCHAR, 22309, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22315, RCHAR, 22353, RCHAR, 22357, RCHAR, 22361, RCHAR, 22403, RCHAR, 22413, RCHAR, 22417, RCHAR, 22425, RCHAR, 22433, RCHAR, RCHAR, RCHAR, 22470, RCHAR, 22489, RCHAR, 22497, RCHAR, RCHAR, RCHAR, 22518, RCHAR, 22534, RCHAR, 22539, RCHAR, RCHAR, RCHAR, 22556, RCHAR, 22569, RCHAR, RCHAR, RCHAR, 22575, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22597, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22603, RCHAR, 22614, RCHAR, 22624, RCHAR, RCHAR, RCHAR, 22636, RCHAR, RCHAR, RCHAR, 22640, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22644, RCHAR, 22649, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22658, RCHAR, RCHAR, RCHAR, 22661, RCHAR, 22666, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22670, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22673, RCHAR, 22678, RCHAR, 22685, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22697, RCHAR, 22706, RCHAR, 22711, RCHAR, 22722, RCHAR, 22742, RCHAR, 22758, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22776, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22789, RCHAR, 22798, RCHAR, RCHAR, RCHAR, 22812, RCHAR, 32, RCHAR, 22828, RCHAR, 22885, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 23085, RCHAR, // [0x0111,0x0111] -> [ 753, 753] # seg 7 // [0x0416,0x042F] -> [ 1041, 1066] # seg 32 // [0x0436,0x044F] -> [ 1089, 1114] # seg 34 // [0x0451,0x0451] -> [ 1088, 1088] # seg 36 // [0x203B,0x203B] -> [ 55, 55] # seg 42 // [0x2074,0x2074] -> [ 840, 840] # seg 44 // [0x20AC,0x20AC] -> [ 163, 163] # seg 48 // [0x2160,0x2169] -> [ 391, 400] # seg 57 // [0x3000,0x301F] -v # seg 109 at pos 0 0, 1, 2, 7, RCHAR, RCHAR, RCHAR, RCHAR, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, RCHAR, 74, 17, 18, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x30A1,0x30F6] -> [ 940, 1025] # seg 113 // [0x3131,0x318E] -> [ 282, 375] # seg 115 // [0x3200,0x321B] -> [ 768, 795] # seg 117 // [0x3399,0x33A2] -> [ 574, 583] # seg 125 // [0x33B0,0x33B9] -> [ 594, 603] # seg 127 // [0xAC00,0xD7A3] -v # seg 1484 at pos 32 1410, 1411, 8836, 8837, 1412, 8838, 8839, 1413, 1414, 1415, 1416, 8840, 8841, 8842, 8843, 8844, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 8845, 1425, 1426, 1427, 1428, 1429, 8846, 8847, 1430, 8848, 8849, 8850, 1431, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 1432, 1433, 8858, 1434, 1435, 1436, 8859, 8860, 8861, 8862, 8863, 8864, 1437, 1438, 8865, 8866, 1439, 8867, 8868, 8869, 1440, 8870, 8871, 8872, 8873, 8874, 8875, 8876, 8877, 8878, 8879, 1441, 8880, 1442, 8881, 8882, 8883, 8884, 8885, 8886, 1443, 8887, 8888, 8889, 1444, 8890, 8891, 8892, 1445, 8893, 8894, 8895, 8896, 8897, 8898, 8899, 8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, 8909, 8910, 8911, 1446, 1447, 8912, 8913, 1448, 8914, 8915, 1449, 1450, 8916, 1451, 8917, 8918, 8919, 8920, 8921, 1452, 1453, 8922, 1454, 1455, 1456, 1457, 8923, 8924, 1458, 1459, 1460, 1461, 8925, 8926, 8927, 1462, 8928, 8929, 8930, 1463, 8931, 8932, 8933, 8934, 8935, 8936, 8937, 1464, 1465, 8938, 1466, 1467, 1468, 8939, 8940, 8941, 8942, 8943, 8944, 1469, 1470, 1471, 8945, 1472, 8946, 8947, 1473, 1474, 8948, 8949, 8950, 8951, 8952, 8953, 8954, 1475, 1476, 8955, 1477, 1478, 1479, 8956, 8957, 8958, 1480, 8959, 8960, 1481, 8961, 8962, 8963, 1482, 8964, 8965, 8966, 1483, 8967, 8968, 8969, 8970, 8971, 8972, 8973, 8974, 1484, 8975, 1485, 8976, 8977, 8978, 8979, 8980, 8981, 8982, 8983, 1486, 1487, 8984, 8985, 1488, 8986, 8987, 1489, 1490, 8988, 1491, 8989, 1492, 8990, 8991, 1493, 1494, 1495, 8992, 1496, 8993, 1497, 1498, 8994, 8995, 8996, 8997, 8998, 1499, 1500, 8999, 9000, 1501, 9001, 9002, 9003, 1502, 9004, 1503, 9005, 9006, 9007, 9008, 9009, 1504, 1505, 9010, 1506, 9011, 1507, 9012, 9013, 9014, 9015, 9016, 9017, 1508, 9018, 9019, 9020, 1509, 9021, 9022, 9023, 1510, 9024, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 1511, 9032, 9033, 1512, 1513, 9034, 9035, 9036, 9037, 9038, 9039, 1514, 1515, 9040, 9041, 1516, 9042, 9043, 9044, 1517, 9045, 9046, 9047, 9048, 9049, 9050, 9051, 1518, 1519, 9052, 1520, 9053, 1521, 9054, 9055, 9056, 9057, 9058, 9059, 1522, 9060, 9061, 9062, 1523, 9063, 9064, 9065, 1524, 9066, 9067, 9068, 9069, 9070, 9071, 9072, 9073, 1525, 9074, 1526, 9075, 9076, 9077, 9078, 9079, 9080, 9081, 9082, 1527, 1528, 9083, 9084, 1529, 9085, 9086, 1530, 1531, 1532, 1533, 9087, 9088, 9089, 9090, 1534, 1535, 1536, 9091, 1537, 9092, 1538, 1539, 9093, 9094, 9095, 9096, 9097, 1540, 1541, 9098, 9099, 1542, 9100, 9101, 9102, 1543, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 1544, 1545, 9114, 9115, 9116, 9117, 9118, 9119, 1546, 9120, 9121, 9122, 9123, 9124, 9125, 9126, 9127, 9128, 9129, 9130, 9131, 9132, 9133, 9134, 9135, 9136, 9137, 1547, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 1548, 1549, 9146, 9147, 1550, 9148, 9149, 9150, 1551, 9151, 9152, 9153, 9154, 9155, 9156, 9157, 1552, 1553, 9158, 1554, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 1555, 9167, 9168, 9169, 1556, 9170, 9171, 9172, 1557, 9173, 9174, 9175, 9176, 9177, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 1558, 1559, 9192, 9193, 1560, 9194, 9195, 1561, 1562, 1563, 9196, 9197, 9198, 9199, 9200, 9201, 1564, 1565, 9202, 1566, 9203, 1567, 9204, 9205, 9206, 9207, 9208, 9209, 1568, 9210, 9211, 9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 9234, 9235, 9236, 1569, 1570, 9237, 9238, 1571, 9239, 9240, 1572, 1573, 9241, 1574, 9242, 9243, 9244, 9245, 9246, 1575, 1576, 9247, 1577, 9248, 1578, 1579, 9249, 9250, 9251, 1580, 9252, 1581, 1582, 1583, 9253, 1584, 9254, 9255, 9256, 1585, 9257, 1586, 9258, 9259, 9260, 9261, 9262, 1587, 1588, 9263, 1589, 1590, 1591, 9264, 9265, 9266, 1592, 9267, 9268, 1593, 1594, 9269, 9270, 1595, 9271, 9272, 9273, 1596, 9274, 9275, 9276, 9277, 9278, 9279, 9280, 1597, 1598, 9281, 1599, 1600, 1601, 9282, 9283, 9284, 9285, 9286, 9287, 1602, 1603, 9288, 9289, 9290, 9291, 9292, 9293, 1604, 9294, 9295, 9296, 9297, 9298, 9299, 9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 1605, 1606, 1607, 9341, 1608, 9342, 9343, 9344, 1609, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 1610, 1611, 9352, 1612, 1613, 1614, 9353, 9354, 9355, 9356, 9357, 9358, 1615, 1616, 9359, 9360, 1617, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, 9370, 9371, 1618, 9372, 9373, 1619, 9374, 1620, 9375, 9376, 9377, 9378, 9379, 9380, 1621, 9381, 9382, 9383, 1622, 9384, 9385, 9386, 1623, 9387, 9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 1624, 1625, 9397, 9398, 9399, 9400, 1626, 9401, 9402, 1627, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423, 9424, 9425, 9426, 9427, 9428, 9429, 1628, 1629, 9430, 9431, 1630, 9432, 1631, 9433, 1632, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 1633, 1634, 9441, 1635, 9442, 1636, 1637, 1638, 9443, 9444, 9445, 9446, 1639, 1640, 9447, 9448, 9449, 9450, 9451, 9452, 1641, 9453, 9454, 9455, 9456, 9457, 9458, 9459, 9460, 9461, 9462, 9463, 1642, 1643, 9464, 9465, 9466, 9467, 9468, 9469, 1644, 1645, 9470, 9471, 9472, 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, 1646, 9489, 9490, 9491, 9492, 9493, 9494, 1647, 9495, 9496, 9497, 1648, 9498, 9499, 9500, 1649, 9501, 9502, 9503, 9504, 9505, 9506, 9507, 1650, 1651, 9508, 9509, 9510, 1652, 9511, 9512, 9513, 9514, 9515, 9516, 1653, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, 9543, 1654, 1655, 9544, 9545, 1656, 9546, 9547, 9548, 1657, 9549, 9550, 9551, 9552, 9553, 9554, 1658, 1659, 1660, 9555, 1661, 9556, 1662, 1663, 9557, 9558, 9559, 9560, 9561, 1664, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 1665, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 1666, 1667, 9580, 9581, 9582, 9583, 9584, 9585, 1668, 1669, 9586, 9587, 1670, 9588, 9589, 9590, 1671, 9591, 9592, 9593, 9594, 9595, 9596, 9597, 1672, 1673, 9598, 9599, 1674, 9600, 9601, 9602, 9603, 9604, 9605, 9606, 1675, 9607, 9608, 9609, 1676, 9610, 9611, 9612, 1677, 9613, 9614, 9615, 9616, 9617, 9618, 9619, 1678, 1679, 9620, 9621, 9622, 9623, 9624, 9625, 9626, 9627, 9628, 9629, 1680, 9630, 9631, 9632, 9633, 9634, 9635, 9636, 9637, 9638, 9639, 9640, 9641, 9642, 9643, 9644, 9645, 9646, 9647, 9648, 9649, 9650, 9651, 9652, 9653, 9654, 9655, 9656, 1681, 1682, 9657, 9658, 1683, 9659, 1684, 9660, 1685, 9661, 1686, 9662, 9663, 9664, 9665, 1687, 1688, 1689, 9666, 1690, 9667, 1691, 9668, 9669, 9670, 1692, 9671, 9672, 9673, 9674, 9675, 9676, 9677, 9678, 9679, 9680, 9681, 9682, 9683, 9684, 9685, 9686, 9687, 9688, 9689, 9690, 9691, 9692, 9693, 9694, 9695, 9696, 9697, 9698, 9699, 9700, 1693, 1694, 9701, 9702, 1695, 9703, 9704, 9705, 1696, 9706, 9707, 9708, 9709, 9710, 9711, 9712, 1697, 1698, 9713, 1699, 9714, 1700, 9715, 9716, 9717, 9718, 9719, 9720, 1701, 1702, 1703, 9721, 1704, 9722, 9723, 1705, 1706, 1707, 1708, 9724, 9725, 9726, 9727, 9728, 1709, 1710, 9729, 1711, 1712, 1713, 1714, 1715, 9730, 1716, 9731, 1717, 1718, 1719, 9732, 9733, 1720, 9734, 9735, 9736, 1721, 9737, 9738, 9739, 9740, 9741, 9742, 9743, 1722, 1723, 9744, 1724, 1725, 1726, 9745, 9746, 9747, 9748, 9749, 9750, 1727, 1728, 9751, 9752, 1729, 9753, 9754, 9755, 1730, 9756, 9757, 9758, 9759, 9760, 9761, 9762, 1731, 9763, 9764, 9765, 9766, 1732, 9767, 9768, 9769, 9770, 9771, 9772, 9773, 9774, 9775, 9776, 9777, 9778, 9779, 9780, 9781, 9782, 9783, 9784, 9785, 9786, 9787, 9788, 9789, 9790, 9791, 9792, 9793, 9794, 9795, 9796, 9797, 9798, 9799, 9800, 1733, 1734, 9801, 1735, 1736, 9802, 9803, 9804, 1737, 9805, 1738, 1739, 9806, 9807, 9808, 9809, 1740, 1741, 9810, 1742, 1743, 1744, 9811, 9812, 9813, 9814, 9815, 1745, 1746, 1747, 9816, 9817, 1748, 9818, 9819, 9820, 1749, 9821, 9822, 9823, 9824, 9825, 9826, 9827, 1750, 1751, 9828, 1752, 1753, 1754, 9829, 9830, 9831, 9832, 9833, 9834, 1755, 1756, 9835, 9836, 1757, 9837, 9838, 9839, 1758, 9840, 9841, 9842, 9843, 9844, 9845, 9846, 1759, 1760, 9847, 9848, 1761, 1762, 9849, 9850, 1763, 9851, 9852, 9853, 1764, 9854, 9855, 9856, 1765, 9857, 9858, 9859, 9860, 9861, 9862, 9863, 9864, 9865, 9866, 9867, 9868, 9869, 9870, 9871, 9872, 9873, 9874, 9875, 9876, 9877, 9878, 9879, 1766, 1767, 9880, 9881, 1768, 9882, 9883, 9884, 1769, 9885, 1770, 9886, 9887, 9888, 9889, 9890, 1771, 1772, 9891, 1773, 9892, 1774, 9893, 9894, 9895, 9896, 1775, 1776, 1777, 9897, 9898, 9899, 1778, 9900, 9901, 9902, 1779, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 1780, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9933, 9934, 9935, 9936, 9937, 9938, 9939, 9940, 9941, 9942, 9943, 9944, 9945, 9946, 9947, 9948, 1781, 9949, 9950, 9951, 1782, 9952, 9953, 9954, 1783, 9955, 9956, 9957, 9958, 9959, 9960, 9961, 1784, 1785, 9962, 1786, 9963, 9964, 9965, 9966, 9967, 9968, 9969, 9970, 1787, 1788, 9971, 9972, 1789, 9973, 9974, 9975, 1790, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 1791, 9984, 1792, 9985, 1793, 9986, 9987, 9988, 9989, 9990, 9991, 1794, 1795, 9992, 9993, 1796, 9994, 9995, 1797, 1798, 9996, 9997, 9998, 9999, 10000, 10001, 10002, 1799, 1800, 10003, 1801, 10004, 1802, 10005, 10006, 10007, 10008, 10009, 10010, 1803, 10011, 10012, 10013, 10014, 10015, 10016, 10017, 10018, 10019, 10020, 10021, 10022, 10023, 10024, 10025, 10026, 10027, 10028, 10029, 1804, 10030, 10031, 10032, 10033, 10034, 10035, 10036, 1805, 10037, 10038, 10039, 10040, 10041, 10042, 10043, 10044, 10045, 10046, 10047, 10048, 10049, 10050, 10051, 10052, 10053, 10054, 10055, 10056, 10057, 10058, 10059, 10060, 10061, 10062, 10063, 1806, 10064, 10065, 10066, 1807, 10067, 10068, 10069, 1808, 10070, 10071, 10072, 10073, 10074, 10075, 10076, 1809, 1810, 10077, 10078, 10079, 10080, 10081, 10082, 10083, 10084, 10085, 10086, 1811, 1812, 10087, 10088, 10089, 10090, 10091, 10092, 1813, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 1814, 1815, 10100, 10101, 10102, 1816, 10103, 10104, 10105, 10106, 10107, 10108, 1817, 1818, 10109, 10110, 1819, 10111, 10112, 10113, 1820, 1821, 1822, 10114, 10115, 10116, 10117, 10118, 1823, 1824, 10119, 1825, 10120, 1826, 1827, 10121, 10122, 10123, 1828, 10124, 1829, 10125, 10126, 10127, 1830, 10128, 10129, 10130, 1831, 10131, 10132, 10133, 10134, 10135, 10136, 10137, 10138, 10139, 10140, 10141, 10142, 10143, 10144, 10145, 10146, 10147, 10148, 10149, 1832, 1833, 10150, 10151, 1834, 10152, 10153, 10154, 1835, 10155, 1836, 10156, 10157, 10158, 10159, 10160, 1837, 1838, 10161, 1839, 10162, 1840, 10163, 10164, 10165, 10166, 1841, 10167, 1842, 1843, 1844, 10168, 1845, 10169, 10170, 1846, 1847, 1848, 1849, 1850, 10171, 10172, 10173, 1851, 1852, 1853, 10174, 1854, 1855, 1856, 1857, 1858, 10175, 10176, 10177, 1859, 1860, 1861, 10178, 10179, 1862, 10180, 10181, 10182, 1863, 10183, 10184, 10185, 10186, 10187, 10188, 10189, 1864, 1865, 10190, 1866, 1867, 1868, 10191, 10192, 10193, 10194, 10195, 10196, 1869, 10197, 10198, 10199, 10200, 10201, 10202, 10203, 10204, 10205, 10206, 10207, 10208, 10209, 10210, 10211, 10212, 10213, 10214, 10215, 10216, 10217, 10218, 10219, 10220, 10221, 10222, 10223, 10224, 10225, 10226, 10227, 10228, 10229, 10230, 10231, 10232, 10233, 10234, 10235, 10236, 10237, 10238, 10239, 10240, 10241, 10242, 10243, 10244, 10245, 10246, 10247, 10248, 10249, 10250, 10251, 1870, 1871, 1872, 10252, 1873, 10253, 10254, 1874, 1875, 10255, 1876, 1877, 10256, 10257, 10258, 10259, 1878, 1879, 10260, 1880, 10261, 1881, 10262, 1882, 10263, 10264, 1883, 10265, 1884, 1885, 10266, 10267, 1886, 10268, 10269, 10270, 1887, 10271, 10272, 10273, 10274, 10275, 10276, 10277, 1888, 1889, 10278, 1890, 1891, 1892, 10279, 10280, 10281, 10282, 10283, 10284, 1893, 10285, 10286, 10287, 1894, 10288, 10289, 10290, 1895, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 10298, 10299, 10300, 10301, 1896, 1897, 10302, 10303, 10304, 10305, 10306, 10307, 1898, 10308, 10309, 10310, 1899, 10311, 10312, 10313, 10314, 10315, 10316, 10317, 10318, 10319, 10320, 10321, 10322, 10323, 10324, 10325, 10326, 10327, 10328, 10329, 10330, 10331, 10332, 10333, 1900, 1901, 10334, 10335, 1902, 10336, 10337, 1903, 1904, 10338, 1905, 10339, 1906, 10340, 10341, 10342, 1907, 1908, 10343, 1909, 10344, 1910, 10345, 1911, 10346, 1912, 10347, 10348, 1913, 10349, 10350, 10351, 1914, 10352, 10353, 10354, 1915, 10355, 10356, 10357, 10358, 10359, 10360, 10361, 10362, 10363, 10364, 10365, 10366, 10367, 10368, 10369, 10370, 10371, 10372, 10373, 1916, 10374, 10375, 10376, 10377, 10378, 10379, 10380, 10381, 10382, 10383, 10384, 10385, 10386, 10387, 10388, 10389, 10390, 10391, 10392, 1917, 10393, 10394, 10395, 10396, 10397, 10398, 10399, 1918, 10400, 10401, 10402, 1919, 10403, 10404, 10405, 1920, 10406, 10407, 10408, 10409, 10410, 10411, 10412, 1921, 1922, 10413, 1923, 10414, 10415, 10416, 10417, 10418, 10419, 10420, 10421, 1924, 10422, 10423, 10424, 10425, 10426, 10427, 10428, 10429, 10430, 10431, 10432, 10433, 10434, 10435, 10436, 10437, 10438, 10439, 10440, 10441, 10442, 10443, 10444, 10445, 10446, 10447, 10448, 1925, 1926, 10449, 10450, 1927, 10451, 10452, 10453, 1928, 10454, 10455, 10456, 10457, 10458, 10459, 10460, 1929, 1930, 10461, 1931, 10462, 1932, 10463, 10464, 10465, 10466, 10467, 10468, 1933, 10469, 10470, 10471, 10472, 10473, 10474, 10475, 10476, 10477, 10478, 10479, 10480, 10481, 10482, 10483, 10484, 10485, 10486, 10487, 1934, 10488, 10489, 10490, 10491, 10492, 10493, 10494, 1935, 10495, 10496, 10497, 10498, 10499, 10500, 10501, 10502, 10503, 10504, 10505, 10506, 10507, 10508, 10509, 10510, 10511, 10512, 10513, 10514, 1936, 10515, 10516, 10517, 10518, 10519, 10520, 1937, 10521, 10522, 10523, 1938, 10524, 10525, 10526, 1939, 10527, 10528, 10529, 10530, 10531, 10532, 10533, 10534, 1940, 10535, 1941, 10536, 1942, 10537, 10538, 10539, 10540, 10541, 10542, 1943, 10543, 10544, 10545, 1944, 10546, 10547, 10548, 1945, 10549, 10550, 10551, 10552, 10553, 10554, 10555, 1946, 10556, 10557, 10558, 10559, 1947, 10560, 10561, 10562, 10563, 10564, 10565, 1948, 1949, 10566, 10567, 1950, 10568, 10569, 1951, 1952, 10570, 1953, 10571, 10572, 10573, 10574, 10575, 1954, 1955, 10576, 1956, 10577, 1957, 10578, 10579, 10580, 10581, 10582, 10583, 1958, 10584, 10585, 10586, 10587, 10588, 10589, 10590, 10591, 10592, 10593, 10594, 10595, 10596, 10597, 10598, 10599, 10600, 10601, 10602, 10603, 10604, 10605, 10606, 10607, 10608, 10609, 10610, 1959, 1960, 10611, 10612, 1961, 10613, 10614, 1962, 1963, 10615, 10616, 10617, 10618, 10619, 10620, 10621, 1964, 1965, 10622, 1966, 1967, 1968, 1969, 10623, 10624, 10625, 10626, 10627, 1970, 1971, 10628, 10629, 1972, 10630, 10631, 10632, 1973, 10633, 10634, 10635, 10636, 10637, 10638, 10639, 1974, 1975, 10640, 1976, 1977, 1978, 10641, 10642, 10643, 10644, 10645, 1979, 1980, 1981, 10646, 10647, 1982, 10648, 10649, 10650, 1983, 10651, 10652, 10653, 10654, 10655, 10656, 10657, 1984, 1985, 10658, 1986, 1987, 1988, 10659, 10660, 10661, 10662, 10663, 10664, 10665, 10666, 10667, 10668, 10669, 10670, 10671, 10672, 10673, 10674, 10675, 10676, 10677, 10678, 10679, 10680, 10681, 10682, 10683, 10684, 10685, 10686, 10687, 10688, 10689, 10690, 10691, 10692, 10693, 10694, 10695, 10696, 10697, 10698, 10699, 10700, 10701, 10702, 10703, 10704, 10705, 10706, 10707, 10708, 10709, 10710, 10711, 10712, 10713, 10714, 10715, 10716, 10717, 10718, 10719, 10720, 1989, 1990, 10721, 10722, 1991, 10723, 10724, 10725, 1992, 10726, 1993, 1994, 10727, 10728, 10729, 10730, 1995, 1996, 10731, 1997, 1998, 1999, 10732, 10733, 10734, 10735, 10736, 2000, 2001, 2002, 10737, 10738, 2003, 10739, 10740, 10741, 2004, 10742, 10743, 10744, 10745, 10746, 10747, 10748, 2005, 2006, 10749, 2007, 2008, 2009, 10750, 10751, 10752, 10753, 10754, 10755, 2010, 10756, 10757, 10758, 10759, 10760, 10761, 10762, 10763, 10764, 10765, 10766, 10767, 10768, 10769, 10770, 10771, 10772, 10773, 10774, 2011, 10775, 10776, 10777, 10778, 10779, 10780, 10781, 10782, 10783, 10784, 10785, 10786, 10787, 10788, 10789, 10790, 10791, 10792, 10793, 10794, 10795, 10796, 10797, 10798, 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, 10807, 10808, 10809, 2012, 2013, 10810, 10811, 2014, 10812, 10813, 10814, 2015, 10815, 10816, 10817, 10818, 10819, 10820, 10821, 10822, 10823, 10824, 10825, 10826, 2016, 10827, 10828, 10829, 10830, 10831, 10832, 2017, 10833, 10834, 10835, 10836, 10837, 10838, 10839, 2018, 10840, 10841, 10842, 10843, 10844, 10845, 10846, 10847, 10848, 10849, 10850, 10851, 10852, 10853, 10854, 10855, 10856, 10857, 10858, 2019, 10859, 10860, 10861, 10862, 10863, 10864, 10865, 10866, 10867, 10868, 10869, 10870, 10871, 10872, 10873, 10874, 10875, 10876, 10877, 10878, 10879, 10880, 10881, 10882, 10883, 10884, 10885, 2020, 10886, 10887, 10888, 2021, 10889, 10890, 10891, 10892, 10893, 10894, 10895, 10896, 10897, 10898, 10899, 10900, 10901, 10902, 10903, 10904, 10905, 10906, 10907, 10908, 10909, 10910, 10911, 10912, 10913, 10914, 10915, 10916, 10917, 10918, 10919, 10920, 10921, 10922, 10923, 10924, 10925, 10926, 10927, 10928, 10929, 10930, 10931, 10932, 10933, 10934, 10935, 10936, 10937, 10938, 10939, 2022, 2023, 10940, 10941, 2024, 10942, 10943, 10944, 2025, 10945, 10946, 10947, 10948, 10949, 10950, 2026, 2027, 10951, 10952, 10953, 10954, 2028, 10955, 10956, 10957, 10958, 10959, 10960, 10961, 10962, 10963, 10964, 10965, 10966, 10967, 10968, 10969, 10970, 10971, 10972, 10973, 10974, 10975, 10976, 10977, 10978, 10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986, 10987, 10988, 2029, 10989, 10990, 10991, 10992, 10993, 10994, 10995, 10996, 10997, 10998, 10999, 11000, 11001, 11002, 11003, 11004, 11005, 11006, 11007, 11008, 11009, 11010, 11011, 11012, 11013, 11014, 11015, 2030, 11016, 11017, 11018, 2031, 11019, 11020, 11021, 2032, 11022, 11023, 11024, 11025, 11026, 11027, 11028, 2033, 2034, 11029, 11030, 11031, 2035, 11032, 11033, 11034, 11035, 11036, 11037, 11038, 11039, 11040, 11041, 11042, 11043, 11044, 11045, 11046, 11047, 11048, 11049, 11050, 11051, 11052, 11053, 11054, 11055, 11056, 11057, 11058, 11059, 11060, 11061, 11062, 11063, 11064, 11065, 2036, 2037, 11066, 11067, 2038, 11068, 11069, 2039, 2040, 11070, 11071, 11072, 11073, 11074, 11075, 11076, 2041, 2042, 11077, 2043, 11078, 11079, 11080, 11081, 11082, 11083, 11084, 11085, 2044, 11086, 11087, 11088, 2045, 11089, 11090, 11091, 2046, 11092, 11093, 11094, 11095, 11096, 11097, 11098, 2047, 2048, 11099, 11100, 11101, 11102, 11103, 11104, 11105, 11106, 11107, 11108, 2049, 11109, 11110, 11111, 2050, 11112, 11113, 11114, 2051, 11115, 11116, 11117, 11118, 11119, 11120, 11121, 2052, 2053, 11122, 2054, 11123, 2055, 11124, 11125, 11126, 11127, 11128, 11129, 2056, 2057, 11130, 11131, 2058, 11132, 11133, 11134, 2059, 11135, 11136, 11137, 11138, 11139, 11140, 11141, 2060, 2061, 11142, 2062, 2063, 2064, 2065, 11143, 11144, 11145, 2066, 2067, 2068, 2069, 11146, 11147, 2070, 11148, 11149, 11150, 2071, 11151, 11152, 11153, 11154, 11155, 11156, 11157, 2072, 2073, 11158, 2074, 2075, 2076, 11159, 11160, 11161, 11162, 11163, 11164, 2077, 2078, 11165, 11166, 2079, 11167, 11168, 11169, 11170, 11171, 11172, 11173, 11174, 11175, 11176, 11177, 11178, 11179, 11180, 2080, 11181, 2081, 11182, 11183, 11184, 11185, 11186, 11187, 11188, 11189, 11190, 11191, 11192, 11193, 11194, 11195, 11196, 11197, 11198, 11199, 11200, 11201, 11202, 11203, 11204, 11205, 11206, 11207, 11208, 11209, 11210, 11211, 11212, 11213, 11214, 11215, 2082, 2083, 11216, 11217, 2084, 11218, 11219, 11220, 2085, 11221, 11222, 11223, 11224, 11225, 11226, 11227, 2086, 2087, 11228, 2088, 2089, 2090, 11229, 11230, 11231, 11232, 11233, 2091, 2092, 2093, 11234, 11235, 2094, 11236, 11237, 11238, 2095, 11239, 11240, 11241, 11242, 11243, 11244, 11245, 2096, 2097, 11246, 2098, 11247, 2099, 11248, 11249, 11250, 11251, 11252, 11253, 2100, 2101, 11254, 11255, 2102, 11256, 11257, 11258, 2103, 11259, 11260, 11261, 11262, 11263, 11264, 11265, 2104, 2105, 11266, 2106, 2107, 2108, 11267, 11268, 11269, 11270, 11271, 11272, 2109, 11273, 11274, 11275, 2110, 11276, 11277, 11278, 11279, 11280, 11281, 11282, 11283, 11284, 11285, 11286, 11287, 2111, 11288, 2112, 11289, 11290, 11291, 11292, 11293, 11294, 11295, 11296, 2113, 2114, 11297, 11298, 2115, 11299, 11300, 11301, 2116, 11302, 11303, 11304, 11305, 11306, 11307, 11308, 2117, 2118, 11309, 2119, 11310, 2120, 11311, 11312, 11313, 11314, 11315, 11316, 2121, 11317, 11318, 11319, 2122, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 2123, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11360, 11361, 2124, 11362, 11363, 11364, 11365, 11366, 11367, 11368, 2125, 11369, 11370, 11371, 2126, 11372, 11373, 11374, 2127, 11375, 11376, 11377, 11378, 11379, 11380, 11381, 2128, 2129, 11382, 2130, 11383, 2131, 11384, 11385, 11386, 11387, 11388, 11389, 2132, 11390, 11391, 11392, 2133, 11393, 11394, 11395, 2134, 11396, 11397, 11398, 11399, 11400, 11401, 11402, 11403, 2135, 11404, 2136, 11405, 2137, 11406, 11407, 11408, 11409, 11410, 11411, 2138, 2139, 11412, 11413, 2140, 11414, 11415, 11416, 2141, 11417, 11418, 11419, 11420, 11421, 11422, 11423, 2142, 2143, 11424, 2144, 11425, 2145, 11426, 11427, 11428, 11429, 11430, 11431, 2146, 11432, 11433, 11434, 11435, 11436, 11437, 11438, 11439, 11440, 11441, 11442, 11443, 11444, 11445, 11446, 11447, 11448, 11449, 11450, 2147, 11451, 11452, 11453, 11454, 11455, 11456, 11457, 2148, 11458, 11459, 11460, 11461, 11462, 11463, 11464, 11465, 11466, 11467, 11468, 11469, 11470, 11471, 11472, 11473, 11474, 11475, 11476, 11477, 11478, 11479, 11480, 11481, 11482, 11483, 11484, 2149, 2150, 11485, 11486, 2151, 11487, 11488, 11489, 2152, 11490, 11491, 11492, 11493, 11494, 11495, 11496, 2153, 11497, 11498, 2154, 11499, 2155, 11500, 11501, 11502, 11503, 11504, 11505, 2156, 2157, 11506, 11507, 2158, 11508, 11509, 11510, 2159, 11511, 11512, 11513, 11514, 11515, 11516, 11517, 2160, 2161, 11518, 2162, 11519, 2163, 11520, 11521, 11522, 11523, 11524, 11525, 2164, 2165, 11526, 11527, 2166, 11528, 11529, 11530, 2167, 11531, 11532, 11533, 11534, 11535, 11536, 11537, 2168, 2169, 11538, 2170, 11539, 2171, 2172, 11540, 11541, 2173, 2174, 11542, 11543, 11544, 11545, 11546, 11547, 11548, 11549, 11550, 11551, 11552, 11553, 11554, 11555, 11556, 11557, 11558, 11559, 11560, 11561, 11562, 11563, 11564, 11565, 11566, 11567, 11568, 11569, 11570, 2175, 2176, 11571, 11572, 2177, 11573, 11574, 11575, 2178, 11576, 11577, 11578, 11579, 11580, 11581, 11582, 2179, 2180, 11583, 2181, 11584, 2182, 11585, 11586, 11587, 11588, 11589, 11590, 2183, 2184, 11591, 11592, 2185, 11593, 2186, 2187, 2188, 2189, 2190, 11594, 11595, 11596, 11597, 11598, 2191, 2192, 11599, 2193, 11600, 2194, 2195, 11601, 11602, 2196, 11603, 2197, 2198, 2199, 11604, 11605, 2200, 11606, 11607, 11608, 2201, 11609, 11610, 11611, 11612, 11613, 11614, 11615, 2202, 2203, 11616, 2204, 2205, 2206, 2207, 11617, 11618, 11619, 11620, 11621, 2208, 2209, 11622, 11623, 11624, 11625, 11626, 11627, 2210, 11628, 11629, 11630, 11631, 11632, 11633, 11634, 11635, 11636, 11637, 11638, 11639, 2211, 11640, 11641, 11642, 11643, 11644, 11645, 11646, 11647, 11648, 11649, 11650, 11651, 11652, 11653, 11654, 11655, 11656, 11657, 11658, 11659, 11660, 11661, 11662, 11663, 11664, 11665, 11666, 11667, 11668, 11669, 11670, 11671, 11672, 11673, 2212, 2213, 11674, 11675, 2214, 11676, 11677, 11678, 2215, 11679, 2216, 11680, 11681, 11682, 11683, 11684, 2217, 2218, 11685, 2219, 11686, 2220, 2221, 11687, 11688, 11689, 11690, 2222, 2223, 2224, 11691, 11692, 2225, 11693, 11694, 11695, 2226, 11696, 11697, 11698, 11699, 11700, 11701, 11702, 2227, 2228, 11703, 2229, 2230, 2231, 11704, 11705, 11706, 11707, 11708, 11709, 2232, 2233, 11710, 11711, 2234, 11712, 11713, 11714, 2235, 11715, 11716, 11717, 11718, 11719, 11720, 11721, 11722, 11723, 11724, 2236, 2237, 2238, 11725, 2239, 11726, 11727, 11728, 11729, 2240, 11730, 11731, 11732, 11733, 11734, 11735, 11736, 11737, 11738, 11739, 11740, 11741, 11742, 11743, 11744, 11745, 11746, 11747, 11748, 11749, 11750, 11751, 11752, 11753, 11754, 11755, 11756, 2241, 2242, 11757, 2243, 2244, 11758, 11759, 11760, 2245, 11761, 2246, 11762, 11763, 11764, 11765, 11766, 2247, 2248, 11767, 2249, 11768, 2250, 11769, 11770, 11771, 11772, 11773, 11774, 2251, 11775, 11776, 11777, 2252, 11778, 11779, 11780, 11781, 11782, 11783, 11784, 11785, 11786, 11787, 11788, 11789, 11790, 11791, 11792, 2253, 2254, 11793, 11794, 11795, 11796, 11797, 11798, 11799, 11800, 11801, 11802, 11803, 11804, 11805, 11806, 11807, 11808, 11809, 11810, 11811, 11812, 11813, 11814, 11815, 11816, 11817, 11818, 11819, 11820, 11821, 11822, 11823, 11824, 11825, 11826, 2255, 11827, 11828, 11829, 2256, 11830, 11831, 11832, 2257, 11833, 11834, 11835, 11836, 11837, 11838, 11839, 11840, 2258, 11841, 2259, 11842, 2260, 11843, 11844, 11845, 11846, 11847, 11848, 2261, 11849, 11850, 11851, 2262, 11852, 11853, 11854, 2263, 11855, 11856, 11857, 11858, 11859, 11860, 11861, 11862, 2264, 11863, 2265, 11864, 11865, 11866, 11867, 11868, 11869, 11870, 11871, 2266, 2267, 2268, 11872, 2269, 11873, 11874, 2270, 2271, 2272, 2273, 11875, 11876, 11877, 11878, 11879, 2274, 2275, 11880, 2276, 11881, 2277, 11882, 11883, 11884, 2278, 11885, 2279, 2280, 11886, 11887, 11888, 2281, 11889, 11890, 11891, 2282, 11892, 11893, 11894, 11895, 11896, 11897, 11898, 11899, 2283, 11900, 2284, 11901, 11902, 11903, 11904, 11905, 11906, 11907, 11908, 2285, 11909, 11910, 11911, 11912, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, 11921, 11922, 11923, 11924, 11925, 11926, 11927, 11928, 11929, 11930, 11931, 11932, 11933, 11934, 11935, 2286, 11936, 11937, 11938, 2287, 11939, 11940, 11941, 2288, 11942, 11943, 11944, 11945, 11946, 11947, 11948, 11949, 11950, 11951, 11952, 11953, 11954, 11955, 11956, 11957, 11958, 11959, 11960, 2289, 11961, 11962, 11963, 2290, 11964, 11965, 11966, 2291, 11967, 11968, 11969, 11970, 11971, 11972, 11973, 2292, 11974, 11975, 2293, 11976, 11977, 11978, 11979, 11980, 11981, 11982, 11983, 2294, 11984, 11985, 11986, 2295, 11987, 11988, 11989, 2296, 11990, 11991, 11992, 11993, 11994, 11995, 11996, 2297, 11997, 11998, 2298, 11999, 12000, 12001, 12002, 12003, 12004, 12005, 12006, 12007, 12008, 12009, 12010, 12011, 12012, 12013, 12014, 12015, 12016, 12017, 12018, 12019, 12020, 12021, 12022, 12023, 12024, 12025, 12026, 12027, 12028, 12029, 12030, 12031, 12032, 12033, 12034, 2299, 2300, 12035, 12036, 2301, 12037, 12038, 2302, 2303, 12039, 2304, 12040, 12041, 12042, 12043, 12044, 2305, 2306, 12045, 2307, 2308, 2309, 12046, 2310, 12047, 2311, 12048, 12049, 2312, 2313, 2314, 2315, 2316, 12050, 12051, 2317, 2318, 2319, 2320, 2321, 12052, 12053, 12054, 12055, 2322, 2323, 12056, 2324, 12057, 2325, 12058, 12059, 12060, 2326, 12061, 12062, 2327, 2328, 12063, 12064, 2329, 12065, 12066, 12067, 2330, 12068, 12069, 12070, 12071, 12072, 12073, 12074, 2331, 2332, 12075, 2333, 2334, 2335, 12076, 12077, 12078, 2336, 12079, 12080, 2337, 2338, 12081, 12082, 2339, 12083, 12084, 12085, 12086, 12087, 12088, 12089, 12090, 12091, 12092, 12093, 12094, 2340, 12095, 12096, 12097, 12098, 12099, 12100, 12101, 12102, 12103, 12104, 12105, 12106, 12107, 12108, 12109, 12110, 12111, 12112, 12113, 12114, 12115, 12116, 12117, 12118, 12119, 12120, 12121, 12122, 12123, 12124, 12125, 12126, 12127, 12128, 12129, 12130, 12131, 12132, 2341, 2342, 12133, 12134, 2343, 12135, 12136, 2344, 2345, 12137, 2346, 12138, 12139, 12140, 12141, 12142, 2347, 2348, 12143, 2349, 12144, 2350, 2351, 12145, 12146, 12147, 12148, 12149, 2352, 2353, 12150, 12151, 2354, 12152, 12153, 2355, 2356, 12154, 12155, 12156, 12157, 12158, 12159, 12160, 2357, 2358, 12161, 2359, 2360, 2361, 12162, 12163, 12164, 12165, 12166, 12167, 2362, 2363, 12168, 12169, 2364, 12170, 12171, 12172, 2365, 12173, 12174, 12175, 12176, 12177, 12178, 12179, 12180, 2366, 12181, 2367, 2368, 2369, 12182, 12183, 12184, 2370, 12185, 12186, 2371, 12187, 12188, 12189, 2372, 12190, 12191, 12192, 12193, 12194, 12195, 12196, 12197, 12198, 12199, 12200, 12201, 12202, 12203, 12204, 12205, 12206, 12207, 12208, 12209, 12210, 12211, 12212, 2373, 2374, 2375, 12213, 2376, 12214, 12215, 12216, 2377, 12217, 12218, 12219, 12220, 12221, 12222, 12223, 2378, 2379, 12224, 2380, 12225, 2381, 12226, 12227, 12228, 12229, 12230, 12231, 2382, 12232, 12233, 12234, 2383, 12235, 12236, 12237, 12238, 12239, 12240, 12241, 12242, 12243, 12244, 12245, 12246, 12247, 12248, 12249, 2384, 12250, 12251, 12252, 12253, 12254, 12255, 12256, 2385, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 2386, 12276, 12277, 12278, 12279, 12280, 12281, 12282, 2387, 2388, 12283, 12284, 2389, 12285, 12286, 12287, 2390, 12288, 12289, 12290, 12291, 12292, 12293, 12294, 2391, 2392, 12295, 12296, 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 2393, 12305, 12306, 12307, 2394, 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317, 12318, 12319, 12320, 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12330, 2395, 2396, 12331, 12332, 2397, 12333, 12334, 2398, 2399, 2400, 2401, 12335, 12336, 12337, 12338, 12339, 2402, 2403, 12340, 2404, 12341, 2405, 12342, 12343, 12344, 2406, 2407, 12345, 2408, 12346, 12347, 12348, 12349, 12350, 12351, 12352, 2409, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, 12361, 12362, 12363, 2410, 12364, 12365, 12366, 12367, 12368, 12369, 12370, 2411, 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, 12397, 2412, 2413, 12398, 12399, 2414, 12400, 12401, 12402, 2415, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 2416, 12415, 12416, 12417, 12418, 12419, 12420, 2417, 12421, 12422, 12423, 2418, 12424, 12425, 12426, 2419, 12427, 12428, 12429, 12430, 12431, 12432, 12433, 2420, 12434, 12435, 2421, 12436, 2422, 12437, 12438, 12439, 12440, 12441, 12442, 2423, 2424, 12443, 12444, 2425, 12445, 12446, 12447, 2426, 12448, 12449, 12450, 12451, 12452, 12453, 12454, 2427, 2428, 12455, 2429, 12456, 12457, 12458, 12459, 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 2430, 2431, 12492, 12493, 2432, 12494, 12495, 12496, 2433, 12497, 2434, 12498, 12499, 12500, 12501, 12502, 2435, 2436, 12503, 2437, 12504, 2438, 2439, 2440, 12505, 12506, 12507, 12508, 2441, 2442, 12509, 12510, 2443, 12511, 12512, 12513, 2444, 12514, 2445, 12515, 12516, 12517, 12518, 12519, 2446, 2447, 12520, 2448, 2449, 2450, 12521, 12522, 12523, 12524, 12525, 2451, 2452, 2453, 12526, 12527, 2454, 12528, 12529, 12530, 2455, 12531, 12532, 12533, 12534, 12535, 12536, 12537, 2456, 2457, 12538, 2458, 2459, 2460, 12539, 12540, 12541, 12542, 12543, 12544, 2461, 2462, 12545, 12546, 12547, 12548, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, 2463, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 12586, 12587, 12588, 12589, 12590, 12591, 12592, 12593, 12594, 12595, 12596, 12597, 2464, 2465, 12598, 12599, 2466, 12600, 12601, 2467, 2468, 12602, 12603, 12604, 12605, 12606, 12607, 12608, 2469, 12609, 12610, 2470, 2471, 2472, 12611, 12612, 12613, 12614, 12615, 12616, 2473, 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, 2474, 12637, 12638, 12639, 12640, 12641, 12642, 2475, 2476, 12643, 12644, 12645, 12646, 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, 2477, 2478, 12657, 2479, 2480, 2481, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, 12687, 12688, 12689, 12690, 12691, 2482, 2483, 12692, 12693, 2484, 12694, 12695, 12696, 2485, 12697, 12698, 12699, 12700, 12701, 12702, 12703, 2486, 2487, 12704, 12705, 12706, 2488, 12707, 12708, 12709, 12710, 12711, 12712, 12713, 12714, 12715, 12716, 12717, 12718, 12719, 12720, 12721, 12722, 12723, 12724, 12725, 12726, 12727, 12728, 12729, 12730, 12731, 12732, 12733, 12734, 12735, 12736, 12737, 12738, 12739, 12740, 12741, 12742, 12743, 12744, 12745, 12746, 12747, 12748, 12749, 12750, 12751, 12752, 12753, 12754, 12755, 12756, 12757, 12758, 12759, 12760, 12761, 12762, 12763, 12764, 12765, 12766, 12767, 12768, 2489, 12769, 12770, 12771, 12772, 12773, 12774, 12775, 12776, 12777, 12778, 12779, 12780, 12781, 12782, 12783, 12784, 12785, 12786, 12787, 12788, 12789, 12790, 12791, 12792, 12793, 12794, 12795, 2490, 12796, 12797, 12798, 12799, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 2491, 12816, 12817, 12818, 12819, 12820, 12821, 2492, 2493, 12822, 12823, 2494, 12824, 12825, 12826, 2495, 12827, 12828, 12829, 12830, 12831, 12832, 12833, 2496, 12834, 12835, 2497, 12836, 2498, 12837, 12838, 12839, 12840, 12841, 12842, 12843, 12844, 12845, 12846, 12847, 12848, 12849, 12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12858, 12859, 12860, 12861, 12862, 12863, 12864, 12865, 12866, 12867, 12868, 12869, 12870, 12871, 12872, 12873, 12874, 12875, 12876, 12877, 12878, 12879, 12880, 12881, 12882, 12883, 12884, 12885, 12886, 12887, 12888, 12889, 12890, 12891, 12892, 12893, 12894, 12895, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, 12924, 12925, 12926, 2499, 12927, 12928, 12929, 12930, 12931, 12932, 12933, 12934, 12935, 12936, 12937, 12938, 12939, 12940, 12941, 12942, 12943, 12944, 12945, 12946, 2500, 12947, 12948, 12949, 12950, 12951, 12952, 2501, 12953, 12954, 12955, 2502, 12956, 12957, 12958, 2503, 12959, 12960, 12961, 12962, 12963, 12964, 12965, 2504, 2505, 12966, 12967, 12968, 12969, 12970, 12971, 12972, 12973, 12974, 12975, 12976, 12977, 12978, 12979, 12980, 12981, 12982, 12983, 12984, 12985, 12986, 12987, 12988, 12989, 12990, 12991, 12992, 12993, 12994, 12995, 12996, 12997, 12998, 12999, 13000, 13001, 13002, 13003, 2506, 2507, 13004, 13005, 2508, 13006, 13007, 13008, 2509, 13009, 13010, 13011, 13012, 13013, 13014, 13015, 2510, 2511, 13016, 2512, 13017, 2513, 13018, 13019, 13020, 13021, 13022, 13023, 2514, 2515, 13024, 2516, 2517, 13025, 13026, 2518, 2519, 2520, 2521, 13027, 13028, 13029, 13030, 13031, 2522, 2523, 13032, 2524, 2525, 2526, 13033, 13034, 13035, 2527, 13036, 13037, 2528, 2529, 13038, 13039, 2530, 13040, 13041, 13042, 2531, 13043, 13044, 13045, 13046, 13047, 13048, 13049, 2532, 2533, 13050, 2534, 2535, 2536, 13051, 13052, 13053, 13054, 13055, 13056, 2537, 2538, 13057, 13058, 2539, 13059, 13060, 13061, 2540, 13062, 13063, 13064, 13065, 13066, 13067, 13068, 2541, 2542, 13069, 2543, 13070, 2544, 13071, 13072, 13073, 13074, 13075, 13076, 2545, 13077, 13078, 13079, 2546, 13080, 13081, 13082, 2547, 13083, 13084, 13085, 13086, 13087, 13088, 13089, 2548, 13090, 13091, 13092, 13093, 2549, 13094, 13095, 13096, 13097, 13098, 13099, 2550, 2551, 2552, 2553, 2554, 13100, 13101, 2555, 2556, 13102, 2557, 2558, 13103, 13104, 13105, 13106, 2559, 2560, 13107, 2561, 2562, 2563, 13108, 13109, 13110, 13111, 2564, 13112, 2565, 2566, 13113, 13114, 2567, 13115, 13116, 13117, 2568, 13118, 13119, 13120, 13121, 13122, 13123, 13124, 2569, 2570, 13125, 2571, 2572, 2573, 13126, 13127, 13128, 13129, 13130, 13131, 2574, 2575, 13132, 13133, 2576, 13134, 13135, 13136, 2577, 13137, 13138, 13139, 13140, 13141, 13142, 13143, 2578, 2579, 13144, 2580, 2581, 2582, 13145, 13146, 13147, 13148, 13149, 13150, 2583, 13151, 13152, 13153, 2584, 13154, 13155, 13156, 2585, 13157, 13158, 13159, 13160, 13161, 13162, 13163, 13164, 13165, 13166, 13167, 13168, 2586, 13169, 13170, 13171, 13172, 13173, 13174, 2587, 2588, 2589, 13175, 2590, 13176, 13177, 13178, 2591, 13179, 2592, 13180, 13181, 13182, 13183, 13184, 2593, 2594, 13185, 2595, 13186, 2596, 13187, 13188, 13189, 2597, 13190, 13191, 2598, 2599, 13192, 13193, 2600, 13194, 13195, 13196, 2601, 13197, 13198, 13199, 13200, 13201, 13202, 13203, 13204, 13205, 13206, 13207, 13208, 2602, 13209, 13210, 13211, 13212, 13213, 13214, 2603, 13215, 13216, 13217, 2604, 13218, 13219, 13220, 2605, 13221, 13222, 13223, 13224, 13225, 13226, 13227, 2606, 13228, 13229, 2607, 2608, 13230, 13231, 13232, 13233, 13234, 13235, 13236, 2609, 13237, 13238, 13239, 2610, 13240, 13241, 13242, 2611, 13243, 13244, 13245, 13246, 13247, 13248, 13249, 2612, 2613, 13250, 2614, 13251, 13252, 13253, 13254, 13255, 13256, 13257, 13258, 2615, 2616, 13259, 13260, 2617, 13261, 13262, 13263, 2618, 13264, 13265, 13266, 13267, 13268, 13269, 13270, 2619, 2620, 13271, 2621, 13272, 2622, 13273, 13274, 13275, 13276, 13277, 13278, 2623, 2624, 13279, 13280, 2625, 13281, 13282, 2626, 2627, 13283, 13284, 13285, 13286, 13287, 13288, 13289, 2628, 2629, 13290, 2630, 13291, 2631, 13292, 2632, 13293, 2633, 2634, 13294, 2635, 13295, 13296, 13297, 13298, 13299, 13300, 13301, 13302, 13303, 13304, 13305, 13306, 13307, 13308, 13309, 13310, 13311, 13312, 13313, 2636, 13314, 13315, 13316, 13317, 13318, 13319, 13320, 2637, 2638, 13321, 13322, 2639, 13323, 13324, 13325, 2640, 13326, 13327, 13328, 13329, 13330, 13331, 13332, 2641, 13333, 13334, 13335, 13336, 2642, 13337, 13338, 13339, 13340, 13341, 13342, 2643, 2644, 13343, 13344, 2645, 13345, 13346, 13347, 2646, 13348, 13349, 13350, 13351, 13352, 13353, 13354, 2647, 2648, 13355, 2649, 13356, 2650, 13357, 13358, 13359, 13360, 13361, 13362, 2651, 2652, 13363, 13364, 13365, 13366, 13367, 13368, 2653, 13369, 13370, 13371, 13372, 13373, 13374, 13375, 2654, 13376, 13377, 2655, 13378, 2656, 13379, 13380, 13381, 13382, 13383, 13384, 2657, 2658, 13385, 13386, 2659, 13387, 13388, 13389, 2660, 2661, 13390, 13391, 13392, 13393, 13394, 13395, 2662, 2663, 13396, 2664, 13397, 2665, 13398, 13399, 13400, 13401, 13402, 13403, 13404, 13405, 13406, 13407, 13408, 13409, 13410, 13411, 13412, 13413, 13414, 13415, 13416, 13417, 13418, 13419, 13420, 13421, 13422, 13423, 13424, 13425, 13426, 13427, 13428, 13429, 13430, 13431, 2666, 2667, 13432, 13433, 2668, 13434, 13435, 2669, 2670, 13436, 13437, 13438, 13439, 13440, 13441, 2671, 2672, 2673, 13442, 2674, 13443, 2675, 13444, 13445, 13446, 13447, 2676, 13448, 2677, 2678, 13449, 2679, 2680, 13450, 13451, 13452, 2681, 13453, 13454, 13455, 13456, 13457, 13458, 13459, 2682, 2683, 13460, 13461, 2684, 2685, 13462, 13463, 13464, 13465, 13466, 2686, 2687, 2688, 13467, 13468, 2689, 13469, 13470, 13471, 2690, 13472, 13473, 13474, 13475, 13476, 13477, 13478, 2691, 2692, 13479, 13480, 2693, 2694, 13481, 13482, 13483, 13484, 13485, 13486, 13487, 13488, 13489, 13490, 13491, 13492, 13493, 13494, 13495, 13496, 13497, 13498, 13499, 13500, 13501, 13502, 13503, 13504, 13505, 13506, 13507, 2695, 13508, 13509, 13510, 13511, 13512, 13513, 13514, 13515, 13516, 13517, 13518, 13519, 13520, 13521, 13522, 13523, 13524, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13532, 13533, 13534, 13535, 13536, 13537, 13538, 13539, 13540, 13541, 2696, 2697, 13542, 13543, 2698, 13544, 13545, 13546, 2699, 13547, 2700, 13548, 13549, 13550, 13551, 13552, 2701, 2702, 13553, 13554, 2703, 2704, 13555, 13556, 13557, 13558, 13559, 13560, 2705, 13561, 13562, 13563, 2706, 13564, 13565, 13566, 2707, 13567, 13568, 13569, 13570, 13571, 13572, 13573, 13574, 13575, 13576, 13577, 13578, 13579, 13580, 13581, 13582, 13583, 13584, 13585, 13586, 13587, 13588, 13589, 13590, 13591, 13592, 13593, 13594, 13595, 13596, 13597, 13598, 13599, 13600, 13601, 13602, 13603, 13604, 13605, 13606, 13607, 13608, 13609, 13610, 13611, 13612, 13613, 13614, 13615, 13616, 13617, 2708, 13618, 13619, 13620, 13621, 13622, 13623, 13624, 13625, 13626, 13627, 13628, 13629, 13630, 13631, 13632, 13633, 13634, 13635, 13636, 13637, 13638, 13639, 13640, 2709, 2710, 13641, 13642, 2711, 13643, 13644, 2712, 2713, 13645, 2714, 13646, 13647, 13648, 13649, 13650, 2715, 2716, 13651, 13652, 13653, 2717, 13654, 13655, 13656, 13657, 13658, 13659, 2718, 2719, 13660, 13661, 2720, 13662, 13663, 13664, 13665, 13666, 13667, 13668, 13669, 13670, 13671, 13672, 13673, 13674, 13675, 13676, 2721, 13677, 13678, 13679, 13680, 13681, 13682, 13683, 2722, 13684, 13685, 13686, 13687, 13688, 13689, 13690, 13691, 13692, 13693, 13694, 13695, 13696, 13697, 13698, 13699, 13700, 13701, 13702, 2723, 13703, 13704, 13705, 13706, 13707, 13708, 13709, 2724, 13710, 13711, 13712, 2725, 13713, 13714, 13715, 2726, 13716, 13717, 13718, 13719, 13720, 13721, 13722, 2727, 2728, 13723, 13724, 13725, 13726, 13727, 13728, 13729, 13730, 13731, 13732, 2729, 13733, 13734, 13735, 13736, 13737, 13738, 13739, 13740, 13741, 13742, 13743, 13744, 13745, 13746, 13747, 13748, 13749, 13750, 13751, 13752, 13753, 13754, 13755, 13756, 13757, 13758, 13759, 2730, 2731, 13760, 13761, 2732, 13762, 13763, 13764, 2733, 13765, 13766, 13767, 13768, 13769, 13770, 13771, 2734, 2735, 13772, 13773, 13774, 2736, 13775, 13776, 13777, 13778, 13779, 13780, 2737, 13781, 13782, 13783, 13784, 13785, 13786, 13787, 13788, 13789, 13790, 13791, 13792, 13793, 13794, 13795, 13796, 13797, 13798, 13799, 2738, 13800, 13801, 13802, 13803, 13804, 13805, 13806, 2739, 13807, 13808, 13809, 13810, 13811, 13812, 13813, 13814, 13815, 13816, 13817, 13818, 13819, 13820, 13821, 13822, 13823, 13824, 13825, 13826, 13827, 13828, 13829, 13830, 13831, 13832, 13833, 2740, 13834, 13835, 13836, 2741, 13837, 13838, 13839, 13840, 13841, 13842, 13843, 13844, 13845, 13846, 13847, 13848, 13849, 13850, 13851, 13852, 13853, 13854, 13855, 13856, 13857, 13858, 13859, 13860, 13861, 13862, 13863, 13864, 13865, 13866, 13867, 13868, 13869, 13870, 13871, 13872, 13873, 13874, 13875, 13876, 13877, 13878, 13879, 13880, 2742, 13881, 13882, 13883, 13884, 13885, 13886, 2743, 2744, 13887, 13888, 2745, 13889, 13890, 13891, 2746, 13892, 2747, 13893, 13894, 13895, 13896, 2748, 2749, 2750, 13897, 13898, 13899, 13900, 13901, 13902, 13903, 13904, 13905, 13906, 2751, 13907, 13908, 13909, 2752, 13910, 13911, 13912, 2753, 13913, 13914, 13915, 13916, 13917, 13918, 13919, 2754, 13920, 13921, 13922, 13923, 13924, 13925, 13926, 13927, 13928, 13929, 13930, 2755, 2756, 13931, 13932, 2757, 13933, 13934, 13935, 2758, 13936, 13937, 13938, 13939, 13940, 13941, 13942, 2759, 2760, 13943, 2761, 13944, 2762, 13945, 13946, 13947, 13948, 13949, 13950, 2763, 2764, 13951, 13952, 2765, 2766, 2767, 13953, 2768, 2769, 2770, 13954, 13955, 13956, 13957, 2771, 2772, 2773, 13958, 2774, 2775, 2776, 13959, 13960, 13961, 2777, 2778, 13962, 2779, 2780, 13963, 13964, 2781, 13965, 13966, 13967, 2782, 13968, 13969, 13970, 13971, 13972, 13973, 13974, 2783, 2784, 13975, 2785, 2786, 2787, 13976, 13977, 13978, 13979, 13980, 13981, 2788, 2789, 13982, 13983, 2790, 13984, 13985, 13986, 2791, 13987, 13988, 2792, 13989, 13990, 13991, 13992, 2793, 2794, 13993, 2795, 13994, 2796, 13995, 13996, 13997, 2797, 13998, 2798, 2799, 13999, 14000, 14001, 2800, 14002, 14003, 14004, 2801, 14005, 14006, 14007, 14008, 14009, 14010, 14011, 14012, 2802, 14013, 14014, 14015, 14016, 14017, 14018, 14019, 14020, 14021, 14022, 2803, 2804, 14023, 14024, 2805, 2806, 14025, 2807, 2808, 2809, 2810, 14026, 14027, 14028, 14029, 14030, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 14031, 2818, 14032, 2819, 14033, 2820, 2821, 14034, 14035, 2822, 14036, 14037, 14038, 2823, 14039, 14040, 14041, 14042, 14043, 14044, 14045, 2824, 2825, 14046, 2826, 14047, 2827, 14048, 14049, 14050, 14051, 14052, 14053, 2828, 2829, 2830, 14054, 2831, 14055, 14056, 14057, 2832, 14058, 2833, 2834, 14059, 14060, 14061, 14062, 2835, 2836, 2837, 2838, 2839, 2840, 14063, 14064, 14065, 2841, 2842, 2843, 2844, 14066, 14067, 14068, 2845, 14069, 14070, 14071, 2846, 14072, 14073, 14074, 14075, 14076, 14077, 14078, 2847, 2848, 14079, 2849, 2850, 14080, 14081, 14082, 14083, 14084, 14085, 14086, 2851, 2852, 14087, 14088, 2853, 14089, 14090, 14091, 2854, 2855, 2856, 14092, 2857, 14093, 14094, 2858, 2859, 2860, 14095, 2861, 14096, 2862, 14097, 2863, 14098, 14099, 14100, 14101, 2864, 2865, 14102, 14103, 2866, 14104, 14105, 14106, 2867, 14107, 14108, 14109, 14110, 14111, 14112, 14113, 2868, 2869, 14114, 2870, 2871, 2872, 14115, 14116, 14117, 14118, 14119, 14120, 2873, 2874, 14121, 14122, 2875, 14123, 14124, 14125, 14126, 14127, 14128, 14129, 14130, 14131, 14132, 14133, 2876, 14134, 14135, 2877, 14136, 2878, 14137, 14138, 14139, 14140, 14141, 14142, 2879, 2880, 14143, 14144, 2881, 14145, 14146, 14147, 2882, 14148, 14149, 14150, 14151, 14152, 14153, 14154, 2883, 2884, 14155, 2885, 14156, 2886, 14157, 14158, 14159, 14160, 14161, 14162, 2887, 2888, 14163, 14164, 2889, 14165, 14166, 14167, 2890, 14168, 14169, 14170, 14171, 14172, 14173, 14174, 2891, 2892, 14175, 2893, 14176, 2894, 14177, 14178, 14179, 14180, 14181, 14182, 2895, 2896, 14183, 14184, 2897, 14185, 14186, 14187, 2898, 2899, 2900, 14188, 14189, 14190, 14191, 14192, 2901, 2902, 14193, 2903, 14194, 2904, 14195, 14196, 14197, 14198, 14199, 14200, 2905, 2906, 14201, 14202, 2907, 14203, 14204, 14205, 2908, 14206, 14207, 14208, 14209, 14210, 14211, 14212, 2909, 2910, 14213, 14214, 2911, 2912, 14215, 14216, 14217, 14218, 14219, 14220, 2913, 2914, 14221, 14222, 2915, 14223, 14224, 14225, 2916, 14226, 14227, 14228, 14229, 14230, 14231, 14232, 2917, 2918, 14233, 14234, 14235, 2919, 14236, 14237, 14238, 14239, 14240, 14241, 2920, 2921, 14242, 14243, 2922, 14244, 14245, 14246, 2923, 14247, 14248, 14249, 14250, 14251, 14252, 14253, 2924, 2925, 14254, 2926, 14255, 2927, 14256, 14257, 14258, 14259, 14260, 14261, 2928, 2929, 14262, 14263, 2930, 14264, 14265, 14266, 2931, 14267, 14268, 14269, 14270, 14271, 14272, 14273, 2932, 2933, 14274, 2934, 14275, 2935, 14276, 2936, 14277, 14278, 14279, 14280, 2937, 2938, 14281, 14282, 2939, 14283, 14284, 14285, 2940, 14286, 14287, 14288, 14289, 14290, 2941, 14291, 2942, 2943, 14292, 2944, 14293, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 14294, 14295, 14296, 2953, 14297, 14298, 14299, 2954, 14300, 14301, 14302, 14303, 14304, 14305, 14306, 2955, 14307, 14308, 2956, 14309, 14310, 14311, 14312, 14313, 14314, 14315, 14316, 2957, 2958, 14317, 14318, 2959, 14319, 14320, 14321, 2960, 2961, 2962, 14322, 14323, 14324, 14325, 2963, 2964, 2965, 14326, 2966, 2967, 2968, 2969, 14327, 14328, 14329, 2970, 14330, 2971, 2972, 14331, 14332, 2973, 14333, 2974, 2975, 2976, 14334, 2977, 14335, 14336, 14337, 14338, 14339, 2978, 2979, 14340, 2980, 2981, 2982, 2983, 14341, 14342, 14343, 14344, 14345, 2984, 2985, 14346, 14347, 2986, 14348, 14349, 14350, 2987, 14351, 14352, 14353, 14354, 14355, 14356, 14357, 2988, 2989, 14358, 2990, 2991, 2992, 14359, 14360, 14361, 14362, 14363, 14364, 2993, 2994, 14365, 14366, 2995, 14367, 2996, 14368, 2997, 14369, 14370, 14371, 14372, 14373, 14374, 14375, 2998, 14376, 14377, 14378, 14379, 2999, 14380, 14381, 14382, 14383, 14384, 14385, 3000, 14386, 14387, 14388, 3001, 14389, 14390, 14391, 3002, 14392, 14393, 14394, 14395, 14396, 14397, 14398, 14399, 14400, 14401, 14402, 14403, 14404, 14405, 14406, 14407, 14408, 14409, 14410, 3003, 3004, 14411, 14412, 3005, 14413, 14414, 14415, 3006, 14416, 3007, 14417, 14418, 14419, 14420, 14421, 3008, 3009, 14422, 3010, 14423, 3011, 3012, 14424, 14425, 14426, 14427, 14428, 3013, 3014, 14429, 14430, 3015, 14431, 14432, 14433, 3016, 14434, 14435, 14436, 14437, 14438, 14439, 14440, 3017, 3018, 14441, 3019, 14442, 3020, 14443, 14444, 14445, 14446, 14447, 14448, 3021, 14449, 14450, 14451, 3022, 14452, 14453, 14454, 3023, 14455, 14456, 14457, 14458, 14459, 14460, 14461, 3024, 3025, 14462, 14463, 3026, 3027, 14464, 14465, 14466, 14467, 14468, 14469, 3028, 14470, 14471, 14472, 14473, 14474, 14475, 14476, 14477, 14478, 14479, 14480, 14481, 14482, 14483, 14484, 14485, 14486, 14487, 14488, 14489, 14490, 14491, 14492, 14493, 14494, 14495, 14496, 3029, 3030, 14497, 14498, 3031, 14499, 14500, 14501, 3032, 14502, 3033, 14503, 14504, 14505, 14506, 14507, 3034, 3035, 14508, 3036, 14509, 3037, 3038, 3039, 14510, 14511, 14512, 3040, 3041, 3042, 14513, 14514, 14515, 14516, 14517, 14518, 3043, 14519, 14520, 14521, 14522, 14523, 14524, 14525, 14526, 3044, 14527, 3045, 14528, 3046, 14529, 14530, 14531, 14532, 14533, 14534, 3047, 14535, 14536, 14537, 14538, 14539, 14540, 14541, 14542, 14543, 14544, 14545, 14546, 14547, 14548, 14549, 14550, 14551, 14552, 14553, 3048, 3049, 14554, 14555, 14556, 14557, 14558, 14559, 3050, 14560, 14561, 14562, 3051, 14563, 14564, 14565, 3052, 14566, 14567, 14568, 14569, 14570, 14571, 14572, 3053, 3054, 14573, 3055, 14574, 3056, 14575, 14576, 14577, 14578, 14579, 14580, 3057, 3058, 14581, 14582, 3059, 14583, 14584, 14585, 14586, 14587, 14588, 14589, 14590, 14591, 14592, 14593, 14594, 14595, 14596, 14597, 14598, 3060, 14599, 14600, 14601, 14602, 14603, 14604, 3061, 3062, 14605, 14606, 3063, 14607, 14608, 14609, 3064, 3065, 3066, 14610, 14611, 14612, 14613, 14614, 3067, 3068, 14615, 3069, 14616, 3070, 14617, 14618, 14619, 14620, 14621, 14622, 3071, 14623, 14624, 14625, 14626, 14627, 14628, 14629, 14630, 14631, 14632, 14633, 14634, 14635, 14636, 14637, 14638, 14639, 14640, 14641, 3072, 14642, 14643, 14644, 14645, 14646, 14647, 14648, 3073, 14649, 14650, 14651, 14652, 14653, 14654, 14655, 14656, 14657, 14658, 14659, 14660, 14661, 14662, 14663, 14664, 14665, 14666, 14667, 14668, 14669, 14670, 14671, 14672, 14673, 14674, 14675, 3074, 3075, 14676, 14677, 3076, 14678, 14679, 14680, 3077, 14681, 14682, 14683, 14684, 14685, 14686, 14687, 3078, 3079, 14688, 3080, 14689, 14690, 14691, 14692, 14693, 14694, 14695, 14696, 3081, 14697, 14698, 14699, 3082, 14700, 14701, 14702, 3083, 14703, 14704, 14705, 14706, 14707, 14708, 14709, 3084, 14710, 14711, 14712, 14713, 14714, 14715, 14716, 14717, 14718, 14719, 14720, 3085, 3086, 14721, 14722, 3087, 14723, 14724, 14725, 3088, 14726, 14727, 14728, 14729, 14730, 14731, 14732, 3089, 3090, 14733, 3091, 14734, 3092, 14735, 14736, 14737, 14738, 14739, 14740, 14741, 14742, 14743, 14744, 14745, 14746, 14747, 14748, 14749, 14750, 14751, 14752, 14753, 14754, 14755, 14756, 14757, 14758, 14759, 14760, 14761, 14762, 14763, 14764, 14765, 14766, 14767, 14768, 3093, 3094, 14769, 14770, 3095, 14771, 14772, 3096, 3097, 14773, 3098, 14774, 14775, 14776, 14777, 14778, 3099, 3100, 14779, 3101, 14780, 3102, 3103, 14781, 14782, 3104, 3105, 14783, 3106, 3107, 14784, 14785, 3108, 14786, 3109, 14787, 3110, 14788, 14789, 3111, 14790, 14791, 14792, 14793, 3112, 3113, 14794, 3114, 3115, 3116, 14795, 14796, 14797, 14798, 14799, 14800, 3117, 3118, 14801, 14802, 3119, 14803, 14804, 14805, 3120, 14806, 14807, 14808, 14809, 14810, 14811, 14812, 3121, 3122, 14813, 3123, 3124, 3125, 14814, 14815, 14816, 14817, 14818, 14819, 3126, 14820, 14821, 14822, 3127, 14823, 14824, 14825, 14826, 14827, 14828, 14829, 14830, 14831, 14832, 14833, 14834, 14835, 14836, 14837, 14838, 3128, 14839, 14840, 14841, 14842, 14843, 14844, 14845, 14846, 14847, 14848, 14849, 14850, 14851, 14852, 14853, 14854, 14855, 14856, 14857, 14858, 14859, 14860, 14861, 14862, 14863, 14864, 14865, 14866, 14867, 14868, 14869, 14870, 14871, 14872, 3129, 3130, 14873, 14874, 3131, 14875, 14876, 14877, 3132, 14878, 14879, 14880, 14881, 14882, 14883, 14884, 3133, 3134, 14885, 3135, 3136, 3137, 14886, 14887, 14888, 14889, 14890, 14891, 3138, 14892, 14893, 14894, 14895, 14896, 14897, 14898, 14899, 14900, 14901, 14902, 14903, 14904, 14905, 14906, 14907, 14908, 14909, 14910, 14911, 3139, 14912, 14913, 14914, 14915, 14916, 14917, 3140, 14918, 14919, 14920, 14921, 14922, 14923, 14924, 14925, 14926, 14927, 14928, 14929, 14930, 14931, 14932, 14933, 14934, 14935, 14936, 3141, 14937, 14938, 14939, 14940, 14941, 14942, 14943, 14944, 14945, 14946, 14947, 14948, 14949, 14950, 14951, 14952, 14953, 14954, 14955, 14956, 14957, 14958, 14959, 14960, 14961, 14962, 14963, 14964, 14965, 14966, 14967, 14968, 14969, 14970, 14971, 3142, 3143, 14972, 14973, 3144, 14974, 14975, 14976, 3145, 14977, 14978, 14979, 14980, 14981, 14982, 14983, 3146, 3147, 14984, 3148, 14985, 3149, 14986, 3150, 14987, 14988, 14989, 14990, 3151, 3152, 14991, 14992, 14993, 14994, 14995, 14996, 3153, 14997, 14998, 14999, 15000, 15001, 15002, 15003, 15004, 15005, 15006, 15007, 3154, 15008, 15009, 15010, 15011, 15012, 15013, 15014, 3155, 15015, 15016, 15017, 15018, 15019, 15020, 15021, 15022, 15023, 15024, 15025, 15026, 15027, 15028, 15029, 15030, 15031, 15032, 15033, 3156, 15034, 15035, 15036, 15037, 15038, 15039, 15040, 3157, 15041, 15042, 15043, 3158, 15044, 15045, 15046, 3159, 15047, 15048, 15049, 15050, 15051, 15052, 15053, 3160, 3161, 15054, 15055, 15056, 15057, 15058, 15059, 15060, 15061, 15062, 15063, 15064, 15065, 15066, 15067, 15068, 15069, 15070, 15071, 15072, 15073, 15074, 15075, 15076, 15077, 15078, 15079, 15080, 15081, 15082, 15083, 15084, 3162, 15085, 15086, 15087, 15088, 15089, 15090, 3163, 3164, 15091, 15092, 3165, 15093, 15094, 15095, 3166, 15096, 15097, 15098, 15099, 15100, 15101, 15102, 3167, 3168, 15103, 15104, 15105, 3169, 15106, 15107, 15108, 15109, 15110, 15111, 3170, 15112, 15113, 15114, 15115, 15116, 15117, 15118, 15119, 15120, 15121, 15122, 15123, 15124, 15125, 15126, 15127, 15128, 15129, 15130, 3171, 3172, 15131, 15132, 15133, 15134, 15135, 15136, 15137, 15138, 15139, 15140, 15141, 15142, 15143, 15144, 15145, 15146, 15147, 15148, 15149, 15150, 15151, 15152, 15153, 15154, 15155, 15156, 15157, 15158, 15159, 15160, 15161, 15162, 15163, 15164, 3173, 15165, 15166, 15167, 15168, 15169, 15170, 15171, 15172, 15173, 15174, 15175, 15176, 15177, 15178, 15179, 15180, 15181, 15182, 15183, 15184, 15185, 15186, 15187, 15188, 15189, 15190, 15191, 3174, 15192, 15193, 15194, 15195, 15196, 15197, 15198, 15199, 15200, 15201, 15202, 15203, 15204, 15205, 15206, 15207, 15208, 15209, 15210, 15211, 15212, 15213, 15214, 15215, 15216, 15217, 15218, 3175, 15219, 15220, 15221, 15222, 15223, 15224, 15225, 15226, 15227, 15228, 15229, 15230, 15231, 15232, 15233, 3176, 15234, 15235, 3177, 15236, 3178, 15237, 15238, 15239, 15240, 15241, 15242, 15243, 15244, 15245, 15246, 15247, 15248, 15249, 15250, 15251, 15252, 15253, 15254, 15255, 15256, 15257, 15258, 15259, 15260, 15261, 15262, 15263, 15264, 15265, 15266, 15267, 15268, 15269, 15270, 3179, 3180, 15271, 15272, 3181, 15273, 15274, 15275, 3182, 15276, 15277, 15278, 15279, 15280, 15281, 15282, 3183, 3184, 15283, 15284, 15285, 3185, 3186, 15286, 15287, 15288, 15289, 3187, 3188, 3189, 15290, 15291, 3190, 15292, 3191, 15293, 3192, 15294, 15295, 15296, 15297, 15298, 15299, 15300, 3193, 3194, 15301, 3195, 3196, 3197, 3198, 15302, 15303, 15304, 15305, 15306, 3199, 3200, 15307, 15308, 3201, 15309, 15310, 15311, 3202, 15312, 15313, 15314, 15315, 15316, 15317, 15318, 3203, 3204, 15319, 3205, 3206, 3207, 15320, 15321, 15322, 15323, 15324, 15325, 3208, 15326, 15327, 15328, 3209, 15329, 3210, 15330, 3211, 15331, 15332, 15333, 15334, 15335, 15336, 15337, 3212, 15338, 15339, 15340, 15341, 3213, 15342, 15343, 15344, 15345, 15346, 15347, 15348, 15349, 15350, 15351, 15352, 15353, 15354, 15355, 15356, 15357, 15358, 15359, 15360, 15361, 15362, 15363, 15364, 15365, 15366, 15367, 15368, 15369, 15370, 15371, 15372, 15373, 15374, 15375, 3214, 3215, 15376, 15377, 3216, 15378, 15379, 15380, 3217, 15381, 15382, 15383, 15384, 15385, 15386, 15387, 3218, 3219, 15388, 3220, 3221, 3222, 15389, 15390, 15391, 15392, 15393, 15394, 3223, 3224, 15395, 15396, 3225, 15397, 15398, 15399, 3226, 15400, 15401, 15402, 15403, 15404, 15405, 15406, 3227, 3228, 15407, 3229, 15408, 3230, 15409, 15410, 15411, 15412, 15413, 15414, 3231, 15415, 15416, 15417, 3232, 15418, 15419, 15420, 15421, 15422, 15423, 15424, 15425, 15426, 15427, 15428, 15429, 15430, 15431, 15432, 3233, 15433, 15434, 15435, 15436, 15437, 15438, 15439, 3234, 15440, 15441, 15442, 3235, 15443, 15444, 15445, 15446, 15447, 15448, 15449, 15450, 15451, 15452, 15453, 15454, 15455, 15456, 15457, 15458, 3236, 15459, 15460, 15461, 15462, 15463, 15464, 3237, 3238, 15465, 15466, 3239, 15467, 15468, 15469, 3240, 15470, 15471, 15472, 15473, 15474, 15475, 15476, 3241, 3242, 15477, 3243, 15478, 3244, 15479, 15480, 15481, 15482, 15483, 15484, 3245, 15485, 15486, 15487, 3246, 15488, 15489, 15490, 3247, 15491, 15492, 15493, 15494, 15495, 15496, 15497, 15498, 15499, 15500, 15501, 15502, 3248, 15503, 15504, 15505, 15506, 15507, 15508, 15509, 15510, 15511, 15512, 15513, 15514, 15515, 15516, 15517, 15518, 15519, 15520, 15521, 15522, 15523, 15524, 15525, 15526, 15527, 15528, 15529, 15530, 15531, 15532, 15533, 15534, 15535, 15536, 3249, 15537, 15538, 15539, 3250, 15540, 15541, 15542, 3251, 15543, 15544, 15545, 15546, 15547, 15548, 15549, 3252, 3253, 15550, 3254, 15551, 3255, 15552, 15553, 15554, 15555, 15556, 15557, 3256, 15558, 15559, 15560, 15561, 15562, 15563, 15564, 15565, 15566, 15567, 15568, 15569, 15570, 15571, 15572, 3257, 15573, 15574, 15575, 15576, 15577, 15578, 15579, 15580, 15581, 15582, 15583, 3258, 3259, 15584, 15585, 3260, 15586, 15587, 15588, 3261, 15589, 15590, 15591, 15592, 15593, 15594, 15595, 3262, 3263, 15596, 3264, 15597, 3265, 15598, 15599, 15600, 15601, 15602, 15603, 3266, 15604, 15605, 15606, 15607, 15608, 15609, 15610, 15611, 15612, 15613, 15614, 15615, 15616, 15617, 15618, 15619, 15620, 15621, 15622, 3267, 15623, 15624, 15625, 15626, 15627, 15628, 15629, 3268, 15630, 15631, 15632, 3269, 15633, 15634, 15635, 15636, 15637, 15638, 15639, 15640, 15641, 15642, 15643, 15644, 15645, 15646, 15647, 15648, 15649, 15650, 15651, 15652, 15653, 15654, 15655, 3270, 15656, 15657, 15658, 3271, 15659, 15660, 15661, 3272, 15662, 15663, 15664, 15665, 15666, 15667, 15668, 3273, 3274, 15669, 3275, 15670, 3276, 15671, 15672, 15673, 15674, 15675, 15676, 3277, 15677, 15678, 15679, 3278, 15680, 15681, 15682, 3279, 15683, 15684, 15685, 15686, 15687, 15688, 15689, 3280, 15690, 15691, 15692, 15693, 3281, 15694, 15695, 15696, 15697, 15698, 15699, 3282, 3283, 15700, 15701, 3284, 15702, 15703, 15704, 3285, 15705, 15706, 15707, 15708, 15709, 15710, 15711, 3286, 3287, 15712, 3288, 15713, 3289, 15714, 15715, 15716, 15717, 15718, 15719, 15720, 15721, 15722, 15723, 15724, 15725, 15726, 15727, 15728, 15729, 15730, 15731, 15732, 15733, 15734, 15735, 15736, 15737, 15738, 15739, 15740, 15741, 15742, 15743, 15744, 15745, 15746, 15747, 3290, 3291, 15748, 15749, 3292, 15750, 15751, 3293, 3294, 3295, 15752, 15753, 15754, 15755, 15756, 15757, 3296, 3297, 15758, 3298, 15759, 3299, 15760, 15761, 15762, 15763, 15764, 15765, 3300, 3301, 15766, 15767, 3302, 15768, 15769, 15770, 3303, 15771, 15772, 15773, 15774, 15775, 15776, 15777, 3304, 3305, 15778, 3306, 15779, 3307, 15780, 15781, 15782, 15783, 15784, 15785, 3308, 3309, 15786, 15787, 3310, 15788, 15789, 15790, 3311, 15791, 15792, 15793, 15794, 15795, 15796, 15797, 3312, 3313, 15798, 3314, 3315, 3316, 15799, 15800, 15801, 15802, 15803, 15804, 3317, 3318, 15805, 15806, 15807, 15808, 15809, 15810, 15811, 15812, 15813, 15814, 15815, 15816, 15817, 15818, 15819, 15820, 15821, 15822, 15823, 3319, 15824, 15825, 15826, 15827, 15828, 15829, 15830, 15831, 15832, 15833, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, 15843, 15844, 15845, 15846, 15847, 15848, 15849, 15850, 15851, 15852, 15853, 15854, 15855, 15856, 15857, 3320, 3321, 15858, 15859, 3322, 15860, 15861, 3323, 3324, 15862, 15863, 15864, 15865, 15866, 15867, 15868, 3325, 3326, 15869, 3327, 3328, 3329, 15870, 15871, 15872, 15873, 15874, 15875, 3330, 3331, 15876, 15877, 3332, 15878, 15879, 15880, 3333, 15881, 15882, 15883, 15884, 15885, 15886, 15887, 3334, 3335, 15888, 3336, 15889, 3337, 15890, 15891, 15892, 15893, 15894, 15895, 3338, 15896, 15897, 15898, 3339, 15899, 15900, 15901, 3340, 15902, 15903, 15904, 15905, 15906, 15907, 15908, 3341, 3342, 15909, 3343, 3344, 3345, 15910, 15911, 15912, 15913, 15914, 15915, 3346, 15916, 15917, 15918, 15919, 15920, 15921, 15922, 15923, 15924, 15925, 15926, 15927, 15928, 15929, 15930, 15931, 15932, 15933, 15934, 15935, 15936, 15937, 15938, 15939, 15940, 15941, 15942, 3347, 3348, 15943, 15944, 3349, 15945, 15946, 15947, 3350, 15948, 15949, 15950, 15951, 15952, 15953, 15954, 3351, 3352, 15955, 3353, 15956, 3354, 15957, 15958, 15959, 15960, 15961, 15962, 3355, 3356, 15963, 15964, 3357, 15965, 15966, 15967, 3358, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 3359, 15975, 15976, 15977, 15978, 3360, 15979, 15980, 15981, 15982, 15983, 15984, 3361, 15985, 15986, 15987, 15988, 15989, 15990, 15991, 15992, 15993, 15994, 15995, 15996, 15997, 15998, 15999, 16000, 16001, 16002, 16003, 16004, 3362, 16005, 16006, 16007, 16008, 16009, 16010, 3363, 16011, 16012, 16013, 16014, 16015, 16016, 16017, 3364, 16018, 16019, 16020, 16021, 16022, 16023, 16024, 16025, 16026, 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, 16036, 3365, 16037, 16038, 16039, 16040, 16041, 16042, 16043, 16044, 16045, 16046, 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, 16056, 16057, 16058, 16059, 16060, 16061, 16062, 16063, 3366, 3367, 16064, 16065, 3368, 16066, 16067, 16068, 3369, 16069, 16070, 16071, 16072, 16073, 16074, 16075, 3370, 3371, 16076, 3372, 16077, 3373, 16078, 16079, 16080, 16081, 16082, 16083, 3374, 16084, 16085, 16086, 3375, 16087, 16088, 16089, 3376, 16090, 16091, 16092, 16093, 16094, 16095, 16096, 16097, 16098, 16099, 16100, 16101, 3377, 16102, 16103, 16104, 16105, 16106, 16107, 3378, 16108, 16109, 16110, 16111, 16112, 16113, 16114, 16115, 16116, 16117, 16118, 16119, 16120, 16121, 16122, 16123, 16124, 16125, 16126, 16127, 3379, 16128, 16129, 16130, 16131, 16132, 16133, 3380, 3381, 16134, 16135, 3382, 16136, 16137, 16138, 3383, 16139, 16140, 16141, 16142, 16143, 16144, 16145, 3384, 3385, 16146, 3386, 16147, 3387, 16148, 16149, 16150, 16151, 16152, 16153, 3388, 16154, 16155, 16156, 3389, 16157, 16158, 16159, 3390, 16160, 16161, 16162, 16163, 16164, 16165, 16166, 3391, 16167, 16168, 16169, 16170, 16171, 16172, 16173, 16174, 16175, 16176, 16177, 3392, 3393, 16178, 16179, 3394, 16180, 16181, 16182, 3395, 16183, 16184, 16185, 16186, 16187, 16188, 16189, 3396, 3397, 16190, 16191, 16192, 3398, 16193, 16194, 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, 16203, 16204, 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16213, 16214, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, 16223, 16224, 16225, 16226, 3399, 3400, 16227, 16228, 3401, 16229, 16230, 16231, 3402, 16232, 16233, 16234, 16235, 16236, 16237, 16238, 3403, 3404, 16239, 3405, 16240, 3406, 16241, 16242, 16243, 16244, 16245, 16246, 3407, 3408, 16247, 16248, 3409, 16249, 16250, 16251, 3410, 3411, 16252, 16253, 16254, 16255, 16256, 16257, 3412, 3413, 16258, 3414, 3415, 3416, 16259, 16260, 16261, 16262, 16263, 16264, 3417, 3418, 16265, 16266, 3419, 16267, 16268, 16269, 3420, 16270, 16271, 16272, 16273, 16274, 16275, 16276, 3421, 3422, 16277, 3423, 3424, 3425, 16278, 16279, 16280, 16281, 16282, 16283, 3426, 16284, 16285, 16286, 16287, 16288, 16289, 16290, 16291, 16292, 16293, 16294, 16295, 16296, 16297, 16298, 16299, 16300, 16301, 16302, 16303, 3427, 16304, 16305, 16306, 16307, 16308, 16309, 16310, 16311, 16312, 16313, 16314, 16315, 16316, 16317, 16318, 16319, 16320, 16321, 16322, 16323, 16324, 16325, 16326, 16327, 16328, 16329, 16330, 16331, 16332, 16333, 16334, 16335, 16336, 16337, 3428, 3429, 16338, 16339, 3430, 16340, 16341, 16342, 3431, 16343, 3432, 16344, 16345, 16346, 16347, 16348, 3433, 3434, 16349, 3435, 3436, 3437, 16350, 16351, 16352, 16353, 16354, 16355, 3438, 3439, 16356, 16357, 3440, 16358, 16359, 16360, 3441, 16361, 16362, 16363, 16364, 16365, 16366, 16367, 3442, 3443, 16368, 3444, 16369, 3445, 16370, 16371, 16372, 16373, 16374, 16375, 3446, 16376, 16377, 16378, 3447, 16379, 16380, 16381, 16382, 16383, 16384, 16385, 16386, 16387, 16388, 16389, 16390, 16391, 16392, 16393, 3448, 16394, 16395, 16396, 16397, 16398, 16399, 16400, 3449, 16401, 16402, 16403, 3450, 16404, 16405, 16406, 16407, 16408, 16409, 16410, 16411, 16412, 16413, 16414, 16415, 16416, 16417, 16418, 16419, 16420, 16421, 16422, 16423, 16424, 16425, 16426, 3451, 3452, 16427, 16428, 3453, 16429, 16430, 16431, 3454, 16432, 16433, 16434, 16435, 16436, 16437, 16438, 3455, 3456, 16439, 3457, 16440, 3458, 16441, 16442, 16443, 16444, 3459, 16445, 3460, 16446, 16447, 16448, 3461, 16449, 16450, 16451, 16452, 16453, 16454, 16455, 16456, 16457, 16458, 16459, 16460, 16461, 16462, 16463, 16464, 16465, 16466, 16467, 16468, 16469, 16470, 16471, 3462, 16472, 16473, 16474, 16475, 16476, 16477, 16478, 16479, 16480, 16481, 16482, 16483, 16484, 16485, 16486, 16487, 16488, 16489, 16490, 16491, 16492, 16493, 16494, 16495, 16496, 16497, 16498, 3463, 16499, 16500, 16501, 3464, 16502, 16503, 16504, 16505, 16506, 16507, 16508, 16509, 16510, 16511, 16512, 16513, 16514, 16515, 3465, 16516, 3466, 16517, 16518, 16519, 16520, 16521, 16522, 3467, 16523, 16524, 16525, 16526, 16527, 16528, 16529, 16530, 16531, 16532, 16533, 16534, 16535, 16536, 16537, 16538, 16539, 16540, 16541, 16542, 16543, 16544, 16545, 16546, 16547, 16548, 16549, 3468, 3469, 16550, 16551, 3470, 16552, 16553, 16554, 3471, 16555, 16556, 16557, 16558, 16559, 16560, 16561, 3472, 3473, 16562, 3474, 16563, 3475, 16564, 16565, 16566, 16567, 16568, 16569, 3476, 16570, 16571, 16572, 16573, 16574, 16575, 16576, 16577, 16578, 16579, 16580, 16581, 16582, 16583, 16584, 16585, 16586, 16587, 16588, 3477, 16589, 16590, 16591, 16592, 16593, 16594, 16595, 3478, 16596, 16597, 16598, 16599, 16600, 16601, 16602, 16603, 16604, 16605, 16606, 16607, 16608, 16609, 16610, 16611, 16612, 16613, 16614, 16615, 16616, 16617, 16618, 16619, 16620, 16621, 16622, 3479, 3480, 16623, 16624, 3481, 16625, 16626, 16627, 3482, 16628, 16629, 16630, 16631, 16632, 16633, 16634, 3483, 3484, 16635, 16636, 16637, 3485, 16638, 16639, 16640, 16641, 16642, 16643, 3486, 16644, 16645, 16646, 3487, 16647, 16648, 16649, 3488, 16650, 16651, 16652, 16653, 16654, 16655, 16656, 3489, 16657, 16658, 16659, 16660, 3490, 16661, 16662, 16663, 16664, 16665, 16666, 3491, 3492, 16667, 16668, 3493, 16669, 16670, 3494, 3495, 16671, 3496, 16672, 16673, 16674, 16675, 16676, 3497, 3498, 16677, 3499, 16678, 16679, 16680, 16681, 16682, 16683, 16684, 16685, 3500, 16686, 16687, 16688, 3501, 16689, 16690, 16691, 3502, 16692, 16693, 16694, 16695, 16696, 16697, 16698, 3503, 3504, 16699, 16700, 16701, 16702, 16703, 16704, 16705, 16706, 16707, 16708, 3505, 3506, 16709, 16710, 3507, 16711, 16712, 16713, 3508, 16714, 16715, 16716, 16717, 16718, 16719, 16720, 3509, 3510, 16721, 3511, 16722, 3512, 16723, 16724, 16725, 16726, 16727, 16728, 3513, 3514, 3515, 16729, 3516, 16730, 16731, 16732, 3517, 16733, 3518, 16734, 16735, 16736, 16737, 16738, 3519, 3520, 16739, 3521, 3522, 3523, 16740, 16741, 16742, 3524, 16743, 16744, 3525, 3526, 16745, 16746, 3527, 16747, 16748, 16749, 3528, 16750, 16751, 16752, 16753, 16754, 16755, 16756, 3529, 3530, 16757, 3531, 3532, 3533, 16758, 16759, 16760, 16761, 16762, 16763, 3534, 3535, 16764, 16765, 16766, 16767, 16768, 16769, 16770, 16771, 16772, 16773, 16774, 16775, 16776, 16777, 16778, 16779, 16780, 16781, 16782, 16783, 16784, 16785, 16786, 16787, 16788, 16789, 16790, 16791, 16792, 16793, 16794, 16795, 16796, 16797, 16798, 16799, 16800, 16801, 16802, 16803, 16804, 16805, 16806, 16807, 16808, 16809, 16810, 16811, 16812, 16813, 16814, 16815, 16816, 16817, 3536, 3537, 16818, 16819, 3538, 16820, 16821, 16822, 3539, 16823, 16824, 16825, 16826, 16827, 16828, 16829, 3540, 3541, 16830, 3542, 3543, 3544, 16831, 16832, 16833, 16834, 16835, 16836, 3545, 3546, 16837, 16838, 3547, 16839, 16840, 16841, 3548, 16842, 16843, 16844, 16845, 16846, 16847, 16848, 3549, 3550, 16849, 3551, 16850, 3552, 16851, 16852, 16853, 16854, 16855, 16856, 3553, 16857, 16858, 16859, 3554, 16860, 16861, 16862, 3555, 16863, 16864, 16865, 16866, 16867, 16868, 16869, 3556, 3557, 16870, 16871, 3558, 3559, 16872, 16873, 16874, 16875, 16876, 16877, 3560, 16878, 16879, 16880, 16881, 16882, 16883, 16884, 3561, 16885, 16886, 16887, 16888, 16889, 16890, 16891, 16892, 3562, 16893, 3563, 16894, 16895, 16896, 16897, 16898, 16899, 16900, 16901, 3564, 3565, 16902, 16903, 3566, 16904, 16905, 16906, 3567, 16907, 16908, 16909, 16910, 16911, 16912, 16913, 3568, 3569, 16914, 3570, 16915, 3571, 16916, 16917, 16918, 16919, 16920, 16921, 3572, 16922, 16923, 16924, 16925, 16926, 16927, 16928, 16929, 16930, 16931, 16932, 16933, 16934, 16935, 16936, 16937, 16938, 16939, 16940, 16941, 3573, 16942, 16943, 16944, 16945, 16946, 16947, 16948, 16949, 16950, 16951, 16952, 16953, 16954, 16955, 16956, 16957, 16958, 16959, 16960, 16961, 16962, 16963, 16964, 16965, 16966, 16967, 16968, 16969, 16970, 16971, 16972, 16973, 16974, 16975, 3574, 16976, 16977, 16978, 3575, 16979, 16980, 16981, 16982, 16983, 16984, 16985, 16986, 16987, 16988, 16989, 16990, 16991, 16992, 16993, 16994, 16995, 16996, 16997, 16998, 16999, 17000, 17001, 3576, 17002, 17003, 17004, 3577, 17005, 17006, 17007, 3578, 17008, 17009, 17010, 17011, 17012, 17013, 17014, 17015, 3579, 17016, 3580, 17017, 17018, 17019, 17020, 17021, 17022, 17023, 17024, 3581, 3582, 17025, 17026, 3583, 17027, 17028, 3584, 3585, 17029, 3586, 17030, 17031, 17032, 17033, 17034, 3587, 3588, 17035, 3589, 17036, 3590, 17037, 17038, 17039, 17040, 17041, 17042, 3591, 17043, 17044, 17045, 17046, 17047, 17048, 17049, 17050, 17051, 17052, 17053, 17054, 17055, 17056, 17057, 17058, 17059, 17060, 17061, 17062, 3592, 17063, 17064, 17065, 17066, 17067, 17068, 17069, 17070, 17071, 17072, 17073, 17074, 17075, 17076, 17077, 17078, 17079, 17080, 17081, 17082, 17083, 17084, 17085, 17086, 17087, 17088, 17089, 17090, 17091, 17092, 17093, 17094, 17095, 17096, 3593, 17097, 17098, 17099, 3594, 17100, 17101, 17102, 3595, 17103, 17104, 17105, 17106, 17107, 17108, 17109, 3596, 17110, 17111, 3597, 17112, 17113, 17114, 17115, 17116, 17117, 17118, 17119, 3598, 17120, 17121, 17122, 3599, 17123, 17124, 17125, 3600, 17126, 17127, 17128, 17129, 17130, 17131, 17132, 3601, 17133, 17134, 3602, 17135, 3603, 17136, 17137, 17138, 17139, 17140, 17141, 3604, 17142, 17143, 17144, 3605, 17145, 17146, 17147, 3606, 17148, 17149, 17150, 17151, 17152, 17153, 17154, 3607, 3608, 17155, 3609, 17156, 17157, 17158, 17159, 17160, 17161, 17162, 17163, 17164, 17165, 17166, 17167, 17168, 17169, 17170, 17171, 17172, 17173, 17174, 17175, 17176, 17177, 17178, 17179, 17180, 17181, 17182, 17183, 17184, 17185, 17186, 17187, 17188, 17189, 17190, 17191, 3610, 3611, 17192, 17193, 3612, 17194, 17195, 17196, 3613, 17197, 17198, 17199, 17200, 17201, 17202, 17203, 3614, 3615, 17204, 3616, 17205, 3617, 17206, 17207, 17208, 17209, 17210, 17211, 3618, 3619, 17212, 17213, 3620, 17214, 17215, 17216, 3621, 17217, 17218, 17219, 17220, 3622, 17221, 17222, 3623, 3624, 17223, 3625, 17224, 3626, 17225, 17226, 17227, 17228, 17229, 17230, 3627, 3628, 17231, 17232, 3629, 17233, 17234, 17235, 3630, 17236, 17237, 17238, 17239, 17240, 17241, 17242, 3631, 3632, 17243, 3633, 3634, 3635, 17244, 17245, 17246, 17247, 17248, 17249, 3636, 17250, 17251, 17252, 17253, 17254, 17255, 17256, 17257, 17258, 17259, 17260, 17261, 17262, 17263, 17264, 17265, 17266, 17267, 17268, 17269, 3637, 17270, 17271, 17272, 17273, 17274, 17275, 17276, 17277, 17278, 17279, 17280, 17281, 17282, 17283, 17284, 17285, 17286, 17287, 17288, 17289, 17290, 17291, 17292, 17293, 17294, 17295, 17296, 17297, 17298, 17299, 17300, 17301, 17302, 17303, 3638, 3639, 17304, 17305, 3640, 17306, 17307, 17308, 3641, 17309, 3642, 17310, 17311, 17312, 17313, 17314, 3643, 3644, 17315, 3645, 17316, 3646, 17317, 17318, 17319, 17320, 17321, 17322, 3647, 3648, 17323, 17324, 3649, 17325, 17326, 17327, 3650, 17328, 17329, 17330, 17331, 17332, 17333, 17334, 3651, 3652, 17335, 3653, 17336, 3654, 17337, 17338, 17339, 17340, 17341, 17342, 3655, 3656, 17343, 17344, 3657, 17345, 17346, 17347, 3658, 17348, 17349, 17350, 17351, 17352, 17353, 17354, 3659, 3660, 17355, 3661, 3662, 3663, 17356, 17357, 17358, 17359, 17360, 17361, 3664, 17362, 17363, 17364, 3665, 17365, 17366, 17367, 3666, 17368, 17369, 17370, 17371, 17372, 17373, 17374, 17375, 3667, 17376, 17377, 17378, 17379, 17380, 17381, 17382, 17383, 17384, 17385, 3668, 3669, 17386, 17387, 3670, 17388, 17389, 17390, 3671, 17391, 17392, 17393, 17394, 3672, 17395, 17396, 3673, 3674, 17397, 3675, 17398, 3676, 17399, 17400, 17401, 3677, 17402, 17403, 3678, 3679, 17404, 17405, 3680, 17406, 17407, 17408, 3681, 17409, 17410, 17411, 17412, 17413, 17414, 17415, 17416, 17417, 17418, 3682, 17419, 3683, 17420, 17421, 17422, 17423, 17424, 17425, 3684, 3685, 17426, 17427, 3686, 17428, 17429, 17430, 17431, 17432, 17433, 17434, 17435, 17436, 17437, 17438, 17439, 17440, 17441, 3687, 17442, 3688, 17443, 17444, 17445, 17446, 17447, 17448, 3689, 3690, 17449, 17450, 3691, 17451, 17452, 17453, 3692, 17454, 17455, 17456, 17457, 17458, 17459, 17460, 17461, 3693, 17462, 3694, 17463, 3695, 17464, 17465, 17466, 17467, 17468, 17469, 3696, 17470, 17471, 17472, 3697, 17473, 17474, 17475, 3698, 17476, 17477, 17478, 17479, 17480, 17481, 17482, 17483, 3699, 17484, 3700, 17485, 17486, 17487, 17488, 17489, 17490, 17491, 17492, 3701, 3702, 17493, 17494, 3703, 17495, 17496, 17497, 3704, 17498, 17499, 17500, 17501, 3705, 17502, 17503, 3706, 17504, 17505, 3707, 17506, 3708, 17507, 17508, 17509, 17510, 17511, 17512, 3709, 17513, 17514, 17515, 3710, 17516, 17517, 17518, 3711, 17519, 17520, 17521, 17522, 17523, 17524, 17525, 3712, 17526, 17527, 17528, 17529, 3713, 17530, 17531, 17532, 17533, 17534, 17535, 3714, 3715, 17536, 17537, 3716, 17538, 17539, 17540, 3717, 17541, 17542, 17543, 17544, 17545, 17546, 17547, 17548, 17549, 17550, 17551, 17552, 3718, 17553, 17554, 17555, 17556, 17557, 17558, 3719, 3720, 17559, 17560, 3721, 17561, 17562, 17563, 3722, 17564, 17565, 17566, 17567, 17568, 17569, 17570, 3723, 3724, 17571, 3725, 17572, 3726, 17573, 17574, 17575, 17576, 17577, 17578, 3727, 3728, 17579, 17580, 3729, 17581, 17582, 17583, 3730, 17584, 17585, 17586, 17587, 17588, 17589, 17590, 3731, 17591, 17592, 3732, 17593, 3733, 17594, 17595, 17596, 17597, 17598, 17599, 3734, 3735, 17600, 17601, 3736, 17602, 3737, 3738, 3739, 3740, 17603, 17604, 17605, 17606, 17607, 17608, 3741, 3742, 17609, 3743, 17610, 3744, 17611, 17612, 17613, 3745, 17614, 17615, 3746, 17616, 17617, 17618, 3747, 17619, 17620, 17621, 3748, 17622, 17623, 17624, 17625, 17626, 17627, 17628, 3749, 3750, 17629, 17630, 17631, 3751, 17632, 17633, 17634, 17635, 17636, 17637, 3752, 3753, 17638, 17639, 3754, 17640, 17641, 17642, 3755, 17643, 17644, 17645, 17646, 17647, 17648, 17649, 3756, 3757, 17650, 3758, 17651, 3759, 17652, 17653, 17654, 17655, 17656, 17657, // [0x00A1,0x00C6] -v # seg 1 at pos 11204 107, RCHAR, RCHAR, 113, RCHAR, RCHAR, 54, 6, RCHAR, 660, RCHAR, RCHAR, 8, 164, RCHAR, 37, 29, 838, 839, 98, RCHAR, 143, 3, 105, 837, 669, RCHAR, 746, 743, 747, 108, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 658, // [0x00D0,0x00E6] -v # seg 3 at pos 11242 659, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 30, 667, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 670, 763, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 752, // [0x00F0,0x00FE] -v # seg 5 at pos 11265 754, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 31, 761, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 764, // [0x0126,0x0127] -v # seg 9 at pos 11280 661, 755, // [0x0131,0x0153] -v # seg 11 at pos 11282 756, 663, 757, RCHAR, RCHAR, RCHAR, RCHAR, 758, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 665, 759, 666, 760, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 767, 672, 766, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 668, 762, // [0x0166,0x0167] -v # seg 13 at pos 11317 671, 765, // [0x02C7,0x02C7] -> [ 100, 100] # seg 15 // [0x02D0,0x02D0] -> [ 109, 109] # seg 17 // [0x02D8,0x02DD] -v # seg 19 at pos 11319 101, 104, 103, 106, RCHAR, 102, // [0x0391,0x03A1] -> [ 408, 424] # seg 21 // [0x03A3,0x03A9] -> [ 425, 431] # seg 23 // [0x03B1,0x03C1] -> [ 440, 456] # seg 25 // [0x03C3,0x03C9] -> [ 457, 463] # seg 27 // [0x0401,0x0401] -> [ 1040, 1040] # seg 29 // [0x0410,0x0415] -> [ 1034, 1039] # seg 31 // [0x0430,0x0435] -> [ 1082, 1087] # seg 33 // [0x2015,0x2026] -v # seg 38 at pos 11325 9, RCHAR, RCHAR, 13, 14, RCHAR, RCHAR, 15, 16, RCHAR, RCHAR, 144, 145, RCHAR, RCHAR, RCHAR, 4, 5, // [0x2030,0x2033] -v # seg 40 at pos 11343 115, RCHAR, 38, 39, // [0x207F,0x2084] -v # seg 46 at pos 11347 841, RCHAR, 842, 843, 844, 845, // [0x2103,0x2109] -v # seg 50 at pos 11353 40, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 114, // [0x2113,0x2116] -v # seg 52 at pos 11360 567, RCHAR, RCHAR, 157, // [0x2121,0x212B] -v # seg 54 at pos 11364 162, 159, RCHAR, RCHAR, RCHAR, 620, RCHAR, RCHAR, RCHAR, RCHAR, 41, // [0x2153,0x215F] -v # seg 56 at pos 11375 744, 745, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 748, 749, 750, 751, RCHAR, // [0x2170,0x2179] -> [ 376, 385] # seg 59 // [0x2190,0x2199] -v # seg 61 at pos 11388 70, 71, 69, 72, 73, 146, 149, 147, 150, 148, // [0x21D2,0x21D4] -v # seg 63 at pos 11398 94, RCHAR, 95, // [0x2200,0x2211] -v # seg 65 at pos 11401 96, RCHAR, 50, 97, RCHAR, RCHAR, RCHAR, 51, 83, RCHAR, RCHAR, 84, RCHAR, RCHAR, RCHAR, 112, RCHAR, 111, // [0x221A,0x223D] -v # seg 67 at pos 11419 77, RCHAR, RCHAR, 79, 35, RCHAR, 47, RCHAR, RCHAR, RCHAR, RCHAR, 10, RCHAR, 91, 92, 90, 89, 81, 82, RCHAR, 110, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 36, 80, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12, 78, // [0x2252,0x2252] -> [ 53, 53] # seg 69 // [0x2260,0x226B] -v # seg 71 at pos 11455 32, 52, RCHAR, RCHAR, 33, 34, RCHAR, RCHAR, RCHAR, RCHAR, 75, 76, // [0x2282,0x2287] -v # seg 73 at pos 11467 87, 88, RCHAR, RCHAR, 85, 86, // [0x2299,0x2299] -> [ 126, 126] # seg 75 // [0x22A5,0x22A5] -> [ 48, 48] # seg 77 // [0x2312,0x2312] -> [ 49, 49] # seg 79 // [0x2460,0x246E] -> [ 728, 742] # seg 81 // [0x2474,0x2482] -> [ 822, 836] # seg 83 // [0x249C,0x24B5] -> [ 796, 821] # seg 85 // [0x24D0,0x24E9] -> [ 702, 727] # seg 87 // [0x2500,0x2503] -v # seg 89 at pos 11473 470, 481, 471, 482, // [0x250C,0x254B] -v # seg 91 at pos 11477 472, 509, 508, 483, 473, 503, 502, 484, 475, 507, 506, 486, 474, 505, 504, 485, 476, 497, 510, 511, 492, 512, 513, 487, 478, 499, 514, 515, 494, 516, 517, 489, 477, 518, 519, 493, 498, 520, 521, 488, 479, 522, 523, 495, 500, 524, 525, 490, 480, 526, 527, 496, 528, 529, 501, 530, 531, 532, 533, 534, 535, 536, 537, 491, // [0x2592,0x2592] -> [ 131, 131] # seg 93 // [0x25A0,0x25A9] -v # seg 95 at pos 11541 64, 63, RCHAR, 128, 132, 133, 136, 135, 134, 137, // [0x25B2,0x25D1] -v # seg 97 at pos 11551 66, 65, RCHAR, RCHAR, 119, 118, RCHAR, RCHAR, RCHAR, RCHAR, 68, 67, RCHAR, RCHAR, 117, 116, RCHAR, RCHAR, RCHAR, RCHAR, 62, 61, 127, RCHAR, RCHAR, 58, RCHAR, RCHAR, 60, 59, 129, 130, // [0x2605,0x2606] -v # seg 99 at pos 11583 57, 56, // [0x260E,0x260F] -v # seg 101 at pos 11585 140, 139, // [0x261C,0x261E] -v # seg 103 at pos 11587 141, RCHAR, 142, // [0x2640,0x2642] -v # seg 105 at pos 11590 46, RCHAR, 45, // [0x2660,0x266D] -v # seg 107 at pos 11593 121, 122, RCHAR, 125, 120, 123, RCHAR, 124, 138, 152, 153, RCHAR, 154, 151, // [0x3041,0x3093] -> [ 846, 928] # seg 111 // [0x321C,0x321C] -> [ 156, 156] # seg 118 // [0x3260,0x327B] -> [ 674, 701] # seg 120 // [0x327F,0x327F] -> [ 155, 155] # seg 122 // [0x3380,0x3398] -v # seg 124 at pos 11607 604, 605, 606, 607, 608, RCHAR, RCHAR, RCHAR, 589, 590, 623, 624, 625, 585, 586, 587, 615, 616, 617, 618, 619, 564, 565, 566, 568, // [0x33A3,0x33AF] -v # seg 126 at pos 11632 570, 571, 572, 573, 592, 593, 632, 633, 634, 635, 628, 629, 630, // [0x33BA,0x33DD] -v # seg 128 at pos 11645 609, 610, 611, 612, 613, 614, 621, 622, 160, 639, 569, 627, 642, 158, 591, 640, 584, RCHAR, RCHAR, RCHAR, RCHAR, 588, 637, RCHAR, RCHAR, 638, RCHAR, RCHAR, 626, RCHAR, 161, RCHAR, RCHAR, 631, 641, 636, // [0x4E00,0x4E1E] -v # seg 130 at pos 11681 7122, 7374, RCHAR, 8039, RCHAR, RCHAR, RCHAR, 5187, 7202, 5845, 5857, 8298, RCHAR, 5629, RCHAR, RCHAR, RCHAR, 7963, RCHAR, RCHAR, 7713, 5703, 6021, RCHAR, 4317, 5561, RCHAR, RCHAR, RCHAR, RCHAR, 6213, // [0x4E2D,0x4E5F] -v # seg 132 at pos 11712 7592, RCHAR, RCHAR, RCHAR, RCHAR, 4225, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8568, 4700, RCHAR, 7530, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6628, 4617, RCHAR, 4318, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7612, RCHAR, 5764, 8485, 8296, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4279, RCHAR, 6214, 7019, RCHAR, RCHAR, RCHAR, 4319, 4034, 6396, // [0x4E6B,0x4EAE] -v # seg 134 at pos 11763 3918, RCHAR, 4837, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6926, RCHAR, RCHAR, 5612, 5840, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4022, RCHAR, RCHAR, RCHAR, 4902, RCHAR, RCHAR, RCHAR, 5066, RCHAR, 6479, RCHAR, RCHAR, 5765, 7052, RCHAR, 6812, RCHAR, 6868, 6853, 8486, RCHAR, 6652, 7375, RCHAR, RCHAR, 4487, RCHAR, RCHAR, 5766, RCHAR, RCHAR, 6309, RCHAR, RCHAR, 5213, 8352, RCHAR, 4292, 8369, 6503, RCHAR, 8456, RCHAR, RCHAR, 8394, 4081, 7376, 4940, // [0x4EB6,0x4EE5] -v # seg 136 at pos 11831 4701, RCHAR, RCHAR, RCHAR, 7098, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6304, 7099, RCHAR, RCHAR, 8006, RCHAR, RCHAR, 4320, RCHAR, RCHAR, 4466, 3978, RCHAR, 7147, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7151, 5767, 8055, 7203, 5630, 5946, RCHAR, RCHAR, RCHAR, 4839, RCHAR, 7822, RCHAR, RCHAR, RCHAR, 4758, 5002, 7053, // [0x4EF0,0x4F01] -v # seg 138 at pos 11879 6367, RCHAR, 7593, RCHAR, RCHAR, RCHAR, 4023, 3979, RCHAR, RCHAR, RCHAR, 7131, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4491, // [0x4F09,0x4F11] -v # seg 140 at pos 11897 8353, 7054, 4480, RCHAR, 6653, 4492, 5594, 5524, 8691, // [0x4F2F,0x4F5C] -v # seg 142 at pos 11906 5506, RCHAR, RCHAR, RCHAR, RCHAR, 5422, RCHAR, 5003, RCHAR, 6266, RCHAR, 5768, RCHAR, 5769, 3854, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7313, RCHAR, RCHAR, 4702, 7260, 8224, RCHAR, RCHAR, RCHAR, RCHAR, 6901, 7261, 7531, 7524, 6813, RCHAR, RCHAR, RCHAR, 8299, RCHAR, RCHAR, RCHAR, 6480, 7123, 5693, 7177, // [0x4F69,0x4F9D] -v # seg 144 at pos 11952 8182, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6417, 5507, RCHAR, RCHAR, 3855, RCHAR, RCHAR, 4556, RCHAR, RCHAR, RCHAR, 7314, RCHAR, RCHAR, RCHAR, 7124, 5770, RCHAR, 6267, RCHAR, 3894, 7686, RCHAR, 4933, RCHAR, 8011, RCHAR, 4263, 5020, RCHAR, 6223, RCHAR, 7532, RCHAR, 6927, RCHAR, RCHAR, RCHAR, RCHAR, 5109, RCHAR, 7714, RCHAR, RCHAR, 4209, RCHAR, 7033, // [0x4FAE,0x4FB6] -v # seg 146 at pos 12005 5281, 8652, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8042, 4953, // [0x4FBF,0x4FE1] -v # seg 148 at pos 12014 8198, RCHAR, RCHAR, 4126, 7916, 6310, RCHAR, RCHAR, RCHAR, RCHAR, 6654, 7572, RCHAR, RCHAR, RCHAR, 7452, RCHAR, RCHAR, 6788, RCHAR, 4082, 8418, RCHAR, RCHAR, 6067, RCHAR, RCHAR, 5129, RCHAR, RCHAR, 5578, RCHAR, 5771, 8444, 6268, // [0x4FEE,0x4FFA] -v # seg 150 at pos 12049 6098, 5631, RCHAR, 4321, RCHAR, 5487, RCHAR, 8258, RCHAR, RCHAR, 5613, RCHAR, 6470, // [0x5002,0x502D] -v # seg 152 at pos 12062 5562, RCHAR, RCHAR, RCHAR, 4941, RCHAR, RCHAR, 7765, RCHAR, 3980, RCHAR, 5486, RCHAR, RCHAR, RCHAR, 5353, 4777, RCHAR, RCHAR, RCHAR, 8389, RCHAR, RCHAR, 8653, 7034, RCHAR, 7807, RCHAR, 4083, 7715, RCHAR, 7766, RCHAR, 5458, 8012, RCHAR, 4393, 7507, 4005, RCHAR, 6629, 5110, 8069, 6735, // [0x503B,0x503B] -> [ 6397, 6397] # seg 154 // [0x5043,0x505C] -v # seg 156 at pos 12106 6462, RCHAR, RCHAR, RCHAR, 3856, 4048, 6902, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8199, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8370, RCHAR, RCHAR, RCHAR, RCHAR, 7533, RCHAR, 7377, // [0x5065,0x5065] -> [ 4024, 4024] # seg 158 // [0x5074,0x5078] -v # seg 160 at pos 12132 8005, 7378, 6814, RCHAR, 8145, // [0x5080,0x5085] -v # seg 162 at pos 12137 4280, RCHAR, RCHAR, RCHAR, RCHAR, 5632, // [0x508D,0x5099] -v # seg 164 at pos 12143 5459, RCHAR, RCHAR, RCHAR, 4035, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5828, 5704, // [0x50AC,0x50ED] -v # seg 166 at pos 12156 7937, 6789, RCHAR, RCHAR, RCHAR, RCHAR, 6655, 7315, RCHAR, 7787, RCHAR, 5858, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4084, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4450, RCHAR, RCHAR, RCHAR, 7851, 5947, RCHAR, RCHAR, RCHAR, RCHAR, 5859, RCHAR, 4293, RCHAR, RCHAR, RCHAR, 5595, 8721, RCHAR, RCHAR, RCHAR, 5067, RCHAR, RCHAR, RCHAR, 6903, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6746, RCHAR, 6215, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7755, // [0x50F9,0x5109] -v # seg 168 at pos 12222 3857, RCHAR, 5539, RCHAR, RCHAR, RCHAR, 5772, 7035, 7573, RCHAR, RCHAR, 6457, RCHAR, 4085, RCHAR, RCHAR, 4038, // [0x5112,0x5112] -> [ 6928, 6928] # seg 170 // [0x511F,0x5121] -v # seg 172 at pos 12239 5860, RCHAR, 5058, // [0x512A,0x512A] -> [ 6815, 6815] # seg 174 // [0x5132,0x5152] -v # seg 176 at pos 12242 7262, RCHAR, RCHAR, RCHAR, RCHAR, 4954, RCHAR, RCHAR, 4562, RCHAR, 6471, RCHAR, RCHAR, RCHAR, 6693, 6990, RCHAR, 6871, 8457, 7981, 7453, 8699, 5948, 4264, RCHAR, 4443, 8109, 5252, 8128, RCHAR, RCHAR, RCHAR, 6311, // [0x515C,0x5197] -v # seg 178 at pos 12275 4856, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4488, RCHAR, RCHAR, 7142, RCHAR, 4619, 7316, 4942, 6929, 8179, 4210, 5106, 8476, RCHAR, RCHAR, 4211, RCHAR, RCHAR, RCHAR, 5563, 4493, 4322, 7317, RCHAR, RCHAR, RCHAR, 4075, RCHAR, RCHAR, RCHAR, 4494, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6478, RCHAR, RCHAR, RCHAR, 7799, RCHAR, RCHAR, 7239, RCHAR, RCHAR, RCHAR, RCHAR, 5282, RCHAR, RCHAR, 5253, RCHAR, 6790, // [0x51A0,0x51AC] -v # seg 180 at pos 12335 4243, RCHAR, RCHAR, RCHAR, RCHAR, 5265, RCHAR, RCHAR, RCHAR, RCHAR, 5250, RCHAR, 4840, // [0x51B6,0x51CD] -v # seg 182 at pos 12348 6398, 4937, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4990, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7803, RCHAR, 7574, RCHAR, RCHAR, 4943, RCHAR, 7454, 5123, 4841, // [0x51DC,0x51E1] -v # seg 184 at pos 12372 5122, 7029, 8722, RCHAR, RCHAR, 5528, // [0x51F0,0x523B] -v # seg 186 at pos 12378 8590, 3981, RCHAR, RCHAR, RCHAR, RCHAR, 8700, RCHAR, 7841, 6747, 7978, RCHAR, RCHAR, 8333, RCHAR, RCHAR, 4778, RCHAR, RCHAR, 7100, RCHAR, RCHAR, 5673, 7354, 6631, RCHAR, 3895, RCHAR, RCHAR, RCHAR, 5354, RCHAR, RCHAR, 8458, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4991, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7889, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8170, 5557, RCHAR, RCHAR, RCHAR, 5130, 5829, RCHAR, RCHAR, RCHAR, 4259, RCHAR, 4779, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7429, 6091, 4394, 7750, 7152, 3883, // [0x5243,0x5261] -v # seg 188 at pos 12454 7880, RCHAR, RCHAR, RCHAR, 8035, RCHAR, RCHAR, 5824, 4444, 4910, 7318, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7809, RCHAR, 5633, RCHAR, RCHAR, RCHAR, RCHAR, 3954, RCHAR, 5403, RCHAR, RCHAR, RCHAR, 5991, // [0x5269,0x5275] -v # seg 190 at pos 12485 7148, 7319, RCHAR, RCHAR, RCHAR, RCHAR, 5634, RCHAR, RCHAR, 8331, RCHAR, RCHAR, 7767, // [0x527D,0x5292] -v # seg 192 at pos 12498 8259, RCHAR, 7890, RCHAR, RCHAR, RCHAR, 8634, RCHAR, RCHAR, RCHAR, 4445, 5540, 5092, RCHAR, RCHAR, RCHAR, 4039, RCHAR, RCHAR, RCHAR, 7430, 4040, // [0x529B,0x52AB] -v # seg 194 at pos 12520 4971, RCHAR, RCHAR, RCHAR, 4212, 3858, RCHAR, RCHAR, 4992, 4451, RCHAR, RCHAR, RCHAR, RCHAR, 7455, 4634, 4045, // [0x52BE,0x52E4] -v # seg 196 at pos 12537 8387, RCHAR, RCHAR, 4086, RCHAR, 5447, RCHAR, 8036, RCHAR, 6791, RCHAR, 5254, RCHAR, RCHAR, RCHAR, 4087, RCHAR, RCHAR, RCHAR, RCHAR, 5120, RCHAR, RCHAR, 4842, 6844, RCHAR, 3928, 5329, RCHAR, 8665, RCHAR, 6216, 5025, 5283, RCHAR, RCHAR, 6022, 7288, 4452, // [0x52F3,0x532F] -v # seg 198 at pos 12576 8666, RCHAR, 4955, RCHAR, RCHAR, 4395, RCHAR, 7178, 4435, RCHAR, RCHAR, 4323, 5365, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8225, RCHAR, RCHAR, 8701, RCHAR, RCHAR, RCHAR, RCHAR, 8226, RCHAR, 8227, 5596, RCHAR, RCHAR, RCHAR, RCHAR, 5705, 8548, 5672, RCHAR, 6224, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7204, 4265, RCHAR, 3948, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5706, RCHAR, RCHAR, RCHAR, RCHAR, 8614, // [0x5339,0x5384] -v # seg 200 at pos 12637 8286, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4696, 4324, 6305, RCHAR, 7823, 7143, RCHAR, RCHAR, 6217, 6656, 8680, 5423, RCHAR, RCHAR, 5188, RCHAR, RCHAR, RCHAR, 5707, 7504, 8070, 8445, RCHAR, RCHAR, 4596, RCHAR, RCHAR, 5404, RCHAR, 5597, RCHAR, 5551, RCHAR, 7362, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4276, RCHAR, 5978, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5317, 7101, 6904, RCHAR, RCHAR, 3884, 4903, RCHAR, 4396, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7596, RCHAR, 4088, RCHAR, RCHAR, RCHAR, RCHAR, 6385, // [0x5393,0x53AD] -v # seg 202 at pos 12713 6374, RCHAR, RCHAR, RCHAR, RCHAR, 5131, RCHAR, 8654, RCHAR, RCHAR, RCHAR, RCHAR, 6872, 8007, RCHAR, RCHAR, RCHAR, RCHAR, 4403, 8300, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6569, // [0x53BB,0x53BB] -> [ 4006, 4006] # seg 204 // [0x53C3,0x53F8] -v # seg 206 at pos 12740 7756, RCHAR, RCHAR, RCHAR, RCHAR, 6816, 7716, 4481, 6817, RCHAR, 5424, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6159, RCHAR, 7991, 6099, RCHAR, RCHAR, RCHAR, 5425, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6632, 7926, 4325, 4150, 4326, RCHAR, RCHAR, RCHAR, 4151, 7613, 4420, 6030, 8180, RCHAR, 3859, 8110, 7687, 5773, 6818, RCHAR, RCHAR, RCHAR, RCHAR, 5774, // [0x5403,0x5411] -v # seg 208 at pos 12794 8709, 3885, RCHAR, RCHAR, RCHAR, 8345, 4557, 7289, RCHAR, 4843, 5266, 8655, 5132, 8129, 8395, // [0x541B,0x542B] -v # seg 210 at pos 12809 4377, RCHAR, 5155, RCHAR, 7020, 8214, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5635, RCHAR, RCHAR, 5674, RCHAR, 8334, // [0x5433,0x5451] -v # seg 212 at pos 12826 6658, RCHAR, RCHAR, RCHAR, RCHAR, 8716, 7992, RCHAR, 5355, 8656, RCHAR, 6657, RCHAR, RCHAR, RCHAR, 4956, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7379, RCHAR, 4152, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8085, // [0x5468,0x5490] -v # seg 214 at pos 12857 7537, RCHAR, 7536, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4153, RCHAR, 5368, RCHAR, 3860, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6269, 8487, 5267, RCHAR, RCHAR, 7263, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8228, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8549, RCHAR, 4327, RCHAR, 5636, // [0x54A4,0x54C9] -v # seg 216 at pos 12898 8056, RCHAR, RCHAR, RCHAR, 7153, RCHAR, RCHAR, 7614, 4294, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8371, RCHAR, RCHAR, RCHAR, RCHAR, 8335, RCHAR, RCHAR, RCHAR, RCHAR, 7103, RCHAR, RCHAR, 6375, 8272, RCHAR, RCHAR, 8538, RCHAR, RCHAR, RCHAR, 8346, 7240, // [0x54E1,0x54F2] -v # seg 218 at pos 12936 6873, RCHAR, RCHAR, RCHAR, 3861, RCHAR, RCHAR, 7891, RCHAR, RCHAR, RCHAR, RCHAR, 4189, 8639, RCHAR, RCHAR, RCHAR, 7842, // [0x54FA,0x54FA] -> [ 8229, 8229] # seg 220 // [0x5504,0x5510] -v # seg 222 at pos 12954 8183, RCHAR, 5775, 7651, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5133, RCHAR, 4747, // [0x551C,0x551C] -> [ 5206, 5206] # seg 224 // [0x552F,0x5535] -v # seg 226 at pos 12967 6931, RCHAR, 7768, RCHAR, RCHAR, RCHAR, 6355, // [0x553E,0x5546] -v # seg 228 at pos 12974 8057, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8071, RCHAR, 5861, // [0x554F,0x5556] -v # seg 230 at pos 12983 5356, RCHAR, RCHAR, RCHAR, 4127, RCHAR, RCHAR, 4725, // [0x555E,0x5563] -v # seg 232 at pos 12991 6312, RCHAR, RCHAR, RCHAR, RCHAR, 8336, // [0x557C,0x558A] -v # seg 234 at pos 12997 7431, RCHAR, RCHAR, RCHAR, 3998, RCHAR, RCHAR, RCHAR, 5949, RCHAR, 7843, 4883, RCHAR, 8657, 8337, // [0x5598,0x559D] -v # seg 236 at pos 13012 7824, 8681, 8569, RCHAR, 8723, 3919, // [0x55A7,0x55AE] -v # seg 238 at pos 13018 8676, RCHAR, 6932, 5862, 4561, 4295, RCHAR, 4703, // [0x55C5,0x55C7] -v # seg 240 at pos 13026 8658, RCHAR, 5891, // [0x55D4,0x55E4] -v # seg 242 at pos 13029 7652, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6659, RCHAR, 4495, RCHAR, RCHAR, 7717, RCHAR, RCHAR, RCHAR, 5776, 8013, // [0x55FD,0x55FE] -v # seg 244 at pos 13046 6100, 7538, // [0x5606,0x5609] -v # seg 246 at pos 13048 8086, RCHAR, RCHAR, 3862, // [0x5614,0x5617] -v # seg 248 at pos 13052 4328, RCHAR, RCHAR, 5863, // [0x562F,0x5636] -v # seg 250 at pos 13056 6031, RCHAR, RCHAR, 7456, RCHAR, 7993, RCHAR, 6225, // [0x5653,0x5653] -> [ 8403, 8403] # seg 252 // [0x5668,0x566B] -v # seg 254 at pos 13064 4496, RCHAR, RCHAR, 8724, // [0x5674,0x5674] -> [ 5675, 5675] # seg 256 // [0x5686,0x5686] -> [ 8640, 8640] # seg 258 // [0x56A5,0x56B4] -v # seg 260 at pos 13068 6516, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5746, RCHAR, 8396, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6472, // [0x56BC,0x56BC] -> [ 7179, 7179] # seg 262 // [0x56CA,0x56D1] -v # seg 264 at pos 13084 4610, RCHAR, RCHAR, 8725, RCHAR, RCHAR, RCHAR, 7917, // [0x56DA,0x56E0] -v # seg 266 at pos 13092 6101, 5777, RCHAR, RCHAR, 8615, RCHAR, 7104, // [0x56F0,0x56F0] -> [ 4196, 4196] # seg 268 // [0x56F9,0x56FA] -v # seg 270 at pos 13099 5004, 4154, // [0x5703,0x571F] -v # seg 272 at pos 13101 8230, 6447, RCHAR, RCHAR, RCHAR, 4397, RCHAR, RCHAR, 4371, RCHAR, 6905, RCHAR, RCHAR, RCHAR, RCHAR, 6875, 6874, RCHAR, RCHAR, 4780, RCHAR, 4704, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8130, // [0x5728,0x5730] -v # seg 274 at pos 13130 7241, RCHAR, RCHAR, RCHAR, RCHAR, 4421, RCHAR, RCHAR, 7615, // [0x573B,0x5751] -v # seg 276 at pos 13139 4497, RCHAR, RCHAR, RCHAR, RCHAR, 7616, RCHAR, 8171, RCHAR, RCHAR, RCHAR, RCHAR, 4436, RCHAR, RCHAR, 5460, RCHAR, RCHAR, 4726, 3929, RCHAR, 7525, 4000, // [0x5761,0x578B] -v # seg 278 at pos 13162 8154, RCHAR, RCHAR, 4197, RCHAR, 8087, RCHAR, RCHAR, RCHAR, 8209, RCHAR, RCHAR, RCHAR, 4760, RCHAR, 4089, RCHAR, RCHAR, RCHAR, RCHAR, 4329, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8072, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6102, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4759, RCHAR, RCHAR, 8459, // [0x5793,0x5793] -> [ 8372, 8372] # seg 280 // [0x57A0,0x57A3] -v # seg 282 at pos 13205 7012, RCHAR, 4330, 6876, // [0x57C3,0x57CE] -v # seg 284 at pos 13209 6376, RCHAR, RCHAR, RCHAR, 6792, 7575, RCHAR, RCHAR, 5225, RCHAR, RCHAR, 6003, // [0x57DF,0x57E0] -v # seg 286 at pos 13221 6505, 5637, // [0x57F0,0x580A] -v # seg 288 at pos 13223 7788, RCHAR, RCHAR, RCHAR, 6251, RCHAR, RCHAR, 7704, RCHAR, 5489, 4498, RCHAR, 4499, RCHAR, RCHAR, RCHAR, 4383, RCHAR, 4748, RCHAR, RCHAR, 4058, 8139, RCHAR, 3955, 6983, 6327, // [0x581E,0x583A] -v # seg 290 at pos 13250 7861, RCHAR, RCHAR, 5579, RCHAR, RCHAR, 7432, RCHAR, RCHAR, 6517, RCHAR, RCHAR, 3930, RCHAR, RCHAR, RCHAR, RCHAR, 6748, 6463, 5580, RCHAR, RCHAR, 7205, 4781, RCHAR, RCHAR, RCHAR, RCHAR, 4128, // [0x584A,0x5864] -v # seg 292 at pos 13279 4281, 6590, RCHAR, RCHAR, RCHAR, 3982, RCHAR, 6032, RCHAR, RCHAR, 8101, RCHAR, RCHAR, 4782, 4749, RCHAR, 7927, RCHAR, RCHAR, RCHAR, 5888, RCHAR, RCHAR, 7320, 6660, RCHAR, 8667, // [0x5875,0x5889] -v # seg 294 at pos 13306 7653, RCHAR, RCHAR, RCHAR, 7757, RCHAR, RCHAR, 7321, RCHAR, 6160, RCHAR, RCHAR, RCHAR, RCHAR, 4090, RCHAR, 5901, RCHAR, RCHAR, RCHAR, 6793, // [0x5893,0x5893] -> [ 5318, 5318] # seg 296 // [0x589C,0x589F] -v # seg 298 at pos 13327 7940, RCHAR, 7601, 8404, // [0x58A8,0x58EF] -v # seg 300 at pos 13331 5351, 4827, RCHAR, RCHAR, RCHAR, RCHAR, 8058, RCHAR, RCHAR, RCHAR, RCHAR, 5676, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6661, 7206, RCHAR, RCHAR, 3896, RCHAR, RCHAR, 5541, RCHAR, RCHAR, RCHAR, 6694, RCHAR, 4705, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8668, RCHAR, RCHAR, 8312, RCHAR, 6363, RCHAR, 8488, RCHAR, RCHAR, 5079, 4266, RCHAR, RCHAR, RCHAR, RCHAR, 4282, 5051, RCHAR, RCHAR, RCHAR, RCHAR, 6420, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5778, 7132, RCHAR, RCHAR, 7207, // [0x58F9,0x58FD] -v # seg 302 at pos 13403 7125, 8489, 5902, RCHAR, 6103, // [0x590F,0x598A] -v # seg 304 at pos 13408 8301, RCHAR, RCHAR, RCHAR, RCHAR, 4500, 5931, 6739, RCHAR, RCHAR, 6161, 4698, RCHAR, 6399, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5314, RCHAR, RCHAR, RCHAR, RCHAR, 4761, RCHAR, 7825, 8111, 5638, RCHAR, 6749, 6368, RCHAR, RCHAR, 6290, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7057, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8446, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6473, RCHAR, RCHAR, 4501, 4620, 5614, RCHAR, RCHAR, RCHAR, RCHAR, 4422, 7539, 8570, 4129, RCHAR, RCHAR, 5677, 8414, RCHAR, 8146, RCHAR, RCHAR, 8373, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7322, RCHAR, 5779, RCHAR, RCHAR, RCHAR, RCHAR, 6662, RCHAR, RCHAR, 8095, 6991, 7208, 5932, 5678, RCHAR, RCHAR, RCHAR, RCHAR, 4624, 4636, RCHAR, RCHAR, RCHAR, 3897, RCHAR, RCHAR, RCHAR, RCHAR, 8490, RCHAR, RCHAR, RCHAR, RCHAR, 6484, 5708, 5214, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7133, // [0x5993,0x5999] -v # seg 306 at pos 13532 4502, RCHAR, RCHAR, 6750, 4467, RCHAR, 5319, // [0x59A5,0x59AC] -v # seg 308 at pos 13539 8059, RCHAR, RCHAR, 5461, RCHAR, RCHAR, RCHAR, 8147, // [0x59B9,0x59DD] -v # seg 310 at pos 13547 5226, RCHAR, 7804, RCHAR, RCHAR, 7862, RCHAR, RCHAR, RCHAR, RCHAR, 7380, RCHAR, RCHAR, 5284, RCHAR, RCHAR, 7154, RCHAR, 6226, RCHAR, RCHAR, RCHAR, RCHAR, 7264, 4155, RCHAR, 6004, 6906, RCHAR, RCHAR, RCHAR, RCHAR, 7134, 6751, RCHAR, 3956, 7534, // [0x59E6,0x59EE] -v # seg 312 at pos 13584 3898, RCHAR, 7058, RCHAR, 7688, RCHAR, 8726, RCHAR, 8354, // [0x59F8,0x5A03] -v # seg 314 at pos 13593 6518, RCHAR, RCHAR, 7105, RCHAR, RCHAR, RCHAR, 7155, RCHAR, 6907, RCHAR, 6736, // [0x5A11,0x5A29] -v # seg 316 at pos 13605 5780, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4611, RCHAR, RCHAR, 6663, 4565, RCHAR, RCHAR, 6519, 6270, RCHAR, RCHAR, RCHAR, RCHAR, 6313, RCHAR, RCHAR, RCHAR, 5189, // [0x5A36,0x5A49] -v # seg 318 at pos 13630 7994, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7769, RCHAR, RCHAR, RCHAR, RCHAR, 5080, RCHAR, RCHAR, RCHAR, RCHAR, 8155, RCHAR, RCHAR, 6711, // [0x5A5A,0x5A5A] -> [ 8529, 8529] # seg 320 // [0x5A62,0x5A66] -v # seg 322 at pos 13650 5709, RCHAR, RCHAR, RCHAR, 5639, // [0x5A92,0x5A92] -> [ 5227, 5227] # seg 324 // [0x5A9A,0x5A9B] -v # seg 326 at pos 13655 5369, 6877, // [0x5AA4,0x5AA4] -> [ 6227, 6227] # seg 328 // [0x5AC1,0x5ACC] -v # seg 330 at pos 13657 3863, 6104, RCHAR, 6878, RCHAR, RCHAR, RCHAR, RCHAR, 7689, RCHAR, RCHAR, 8443, // [0x5AE1,0x5AE9] -v # seg 332 at pos 13669 7290, RCHAR, RCHAR, RCHAR, RCHAR, 8355, RCHAR, RCHAR, 4681, // [0x5B05,0x5B0C] -v # seg 334 at pos 13678 8550, RCHAR, RCHAR, RCHAR, 8727, RCHAR, 5950, 4296, // [0x5B16,0x5B16] -> [ 8215, 8215] # seg 336 // [0x5B2A,0x5B2A] -> [ 5747, 5747] # seg 338 // [0x5B40,0x5B43] -v # seg 340 at pos 13686 5864, RCHAR, RCHAR, 6421, // [0x5B50,0x5B7C] -v # seg 342 at pos 13690 7156, 8439, RCHAR, RCHAR, 4213, 7149, RCHAR, 7157, 7502, RCHAR, 5640, RCHAR, 7158, 8641, RCHAR, 5244, RCHAR, RCHAR, RCHAR, 4130, 4156, RCHAR, RCHAR, RCHAR, RCHAR, 8374, RCHAR, 6076, RCHAR, RCHAR, RCHAR, RCHAR, 6162, 7190, RCHAR, RCHAR, RCHAR, 5641, RCHAR, RCHAR, 8313, RCHAR, 6933, RCHAR, 6468, // [0x5B85,0x5C19] -v # seg 344 at pos 13735 4774, RCHAR, 6819, 6105, 6341, RCHAR, 6083, 6712, RCHAR, RCHAR, 4288, RCHAR, RCHAR, RCHAR, 5598, RCHAR, 8104, 8636, 7508, 4244, 7540, 7381, 6713, 7036, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3999, 5951, 6291, 6934, 8571, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6005, RCHAR, 4387, RCHAR, 7242, RCHAR, RCHAR, 8375, 6520, 6033, 3864, RCHAR, 6271, 6794, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6163, 7789, RCHAR, 7291, 6879, 4503, 7106, 5400, 4331, RCHAR, RCHAR, RCHAR, RCHAR, 5642, RCHAR, RCHAR, RCHAR, 5228, RCHAR, 8317, 6820, 6252, RCHAR, RCHAR, 4633, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5181, 7751, RCHAR, 4226, 8043, RCHAR, 6664, 6752, 6292, 4632, 7790, 6294, RCHAR, 5781, 4245, RCHAR, 5068, 7576, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7928, 5581, RCHAR, 7922, RCHAR, 5782, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5615, RCHAR, RCHAR, 5783, RCHAR, RCHAR, 7209, 7323, 6908, 7503, 6295, RCHAR, 4762, 4783, 6034, RCHAR, 6035, RCHAR, RCHAR, RCHAR, RCHAR, 7852, RCHAR, RCHAR, 5865, // [0x5C24,0x5C28] -v # seg 346 at pos 13884 6821, RCHAR, RCHAR, RCHAR, 5462, // [0x5C31,0x5C71] -v # seg 348 at pos 13889 7995, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6228, 6992, 7810, 4157, 4694, RCHAR, 5370, 4672, 4372, RCHAR, RCHAR, RCHAR, RCHAR, 4007, 4131, RCHAR, 4384, RCHAR, RCHAR, 6682, RCHAR, 6230, 6229, RCHAR, RCHAR, 5979, RCHAR, RCHAR, RCHAR, 7324, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5564, RCHAR, RCHAR, RCHAR, RCHAR, 4784, RCHAR, 5081, RCHAR, 8010, 5134, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6068, RCHAR, RCHAR, 4867, RCHAR, 5830, // [0x5C79,0x5C79] -> [ 8710, 8710] # seg 350 // [0x5C90,0x5C91] -v # seg 352 at pos 13954 4504, 7195, // [0x5CA1,0x5CA1] -> [ 3957, 3957] # seg 354 // [0x5CA9,0x5CC0] -v # seg 356 at pos 13956 6356, RCHAR, 6106, 3949, RCHAR, RCHAR, RCHAR, RCHAR, 4763, RCHAR, 6328, RCHAR, 8491, RCHAR, 5387, 6342, RCHAR, 5006, RCHAR, RCHAR, RCHAR, 7363, RCHAR, 6107, // [0x5CD9,0x5CE0] -v # seg 358 at pos 13980 8014, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5866, // [0x5CE8,0x5CFD] -v # seg 360 at pos 13988 6314, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5616, 5617, RCHAR, RCHAR, RCHAR, 8419, RCHAR, 4785, RCHAR, RCHAR, RCHAR, RCHAR, 7577, RCHAR, 8447, // [0x5D07,0x5D19] -v # seg 362 at pos 14010 6202, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4934, 4505, RCHAR, RCHAR, 4198, RCHAR, RCHAR, 7938, RCHAR, 6377, 3958, RCHAR, 5111, // [0x5D27,0x5D29] -v # seg 364 at pos 14029 6203, RCHAR, 5697, // [0x5D4B,0x5D50] -v # seg 366 at pos 14032 5371, 3931, RCHAR, RCHAR, RCHAR, 4912, // [0x5D69,0x5D6F] -v # seg 368 at pos 14038 6204, RCHAR, RCHAR, 6740, RCHAR, RCHAR, 7718, // [0x5D87,0x5D8B] -v # seg 370 at pos 14045 4332, RCHAR, RCHAR, RCHAR, 4786, // [0x5D9D,0x5DA2] -v # seg 372 at pos 14050 4874, RCHAR, RCHAR, 4297, RCHAR, 6755, // [0x5DAA,0x5DAA] -> [ 6476, 6476] # seg 374 // [0x5DB8,0x5DBD] -v # seg 376 at pos 14056 6593, RCHAR, 5007, RCHAR, 5903, 6329, // [0x5DCD,0x5E1D] -v # seg 378 at pos 14062 6741, RCHAR, RCHAR, RCHAR, RCHAR, 5190, RCHAR, RCHAR, RCHAR, 6357, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7826, 7541, RCHAR, RCHAR, 6171, 6036, RCHAR, RCHAR, 4214, 7526, 4298, 4008, RCHAR, RCHAR, 5330, RCHAR, RCHAR, 7719, RCHAR, RCHAR, 4506, 7060, 5784, 8156, RCHAR, RCHAR, 8356, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6077, 4025, RCHAR, RCHAR, RCHAR, 6231, 8231, RCHAR, RCHAR, 5529, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8728, RCHAR, RCHAR, RCHAR, RCHAR, 8105, RCHAR, RCHAR, RCHAR, RCHAR, 7863, RCHAR, RCHAR, 7690, RCHAR, 5508, RCHAR, 7433, // [0x5E25,0x5E4C] -v # seg 380 at pos 14143 6108, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5785, RCHAR, 5933, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7210, RCHAR, RCHAR, 4764, RCHAR, 5867, RCHAR, RCHAR, RCHAR, RCHAR, 5285, RCHAR, 8659, 7382, RCHAR, RCHAR, RCHAR, 6330, 8252, RCHAR, 5463, RCHAR, RCHAR, RCHAR, RCHAR, 8591, // [0x5E55,0x5E55] -> [ 5182, 5182] # seg 382 // [0x5E5F,0x5E63] -v # seg 384 at pos 14183 8015, RCHAR, 5514, 4750, 8216, // [0x5E72,0x5EAD] -v # seg 386 at pos 14188 3899, 8210, 4625, RCHAR, RCHAR, 5565, 8390, 3900, RCHAR, 8572, 6935, 6936, 4507, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7211, RCHAR, RCHAR, 5710, RCHAR, RCHAR, 5868, RCHAR, RCHAR, RCHAR, RCHAR, 5904, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7265, RCHAR, 7364, RCHAR, RCHAR, 4091, RCHAR, 5643, RCHAR, RCHAR, RCHAR, 5869, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4787, 7527, RCHAR, RCHAR, RCHAR, 4158, RCHAR, 7383, // [0x5EB5,0x5EE3] -v # seg 388 at pos 14248 6358, 5905, 3959, 6795, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6937, RCHAR, RCHAR, RCHAR, 5870, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8302, 4996, 4925, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4333, RCHAR, RCHAR, 4238, RCHAR, RCHAR, 5069, RCHAR, RCHAR, RCHAR, 7542, 7325, RCHAR, RCHAR, RCHAR, 5320, 7770, RCHAR, 8217, 4267, // [0x5EEC,0x5F29] -v # seg 390 at pos 14295 4957, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7871, RCHAR, RCHAR, 6522, 7384, RCHAR, RCHAR, 4026, 8616, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5552, RCHAR, RCHAR, 5052, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8218, RCHAR, RCHAR, RCHAR, RCHAR, 6253, RCHAR, 6232, RCHAR, 4388, 7457, 7107, RCHAR, 5694, 8539, RCHAR, RCHAR, 7061, RCHAR, RCHAR, RCHAR, 7434, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8420, 8492, RCHAR, 4637, // [0x5F31,0x5F3C] -v # seg 392 at pos 14357 6407, RCHAR, RCHAR, RCHAR, 7212, RCHAR, RCHAR, RCHAR, RCHAR, 3960, RCHAR, 8287, // [0x5F48,0x5F4E] -v # seg 394 at pos 14369 8088, RCHAR, 3961, RCHAR, 5372, RCHAR, 5191, // [0x5F56,0x5FCD] -v # seg 396 at pos 14376 4706, 8477, RCHAR, 8683, RCHAR, 7062, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8460, RCHAR, RCHAR, RCHAR, 6464, 6845, RCHAR, 7791, 8260, 7458, 5748, 8193, RCHAR, RCHAR, 7771, 6594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5464, RCHAR, 6506, RCHAR, RCHAR, 8279, RCHAR, RCHAR, 5695, 6730, 7385, RCHAR, RCHAR, RCHAR, 4765, RCHAR, 6172, RCHAR, RCHAR, 8617, 5115, 8660, RCHAR, RCHAR, RCHAR, 5906, 4092, 4788, RCHAR, RCHAR, RCHAR, RCHAR, 4873, 5490, 5786, RCHAR, RCHAR, RCHAR, RCHAR, 7509, RCHAR, 4935, 6448, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8592, 5599, 6173, RCHAR, RCHAR, RCHAR, 5373, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7710, RCHAR, 4775, RCHAR, 7844, RCHAR, RCHAR, RCHAR, 8684, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6296, RCHAR, 8288, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4508, 7108, // [0x5FD6,0x5FE0] -v # seg 398 at pos 14496 7923, 7617, 5215, 5216, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7982, // [0x5FEB,0x5FEB] -> [ 8054, 8054] # seg 400 // [0x5FF5,0x5FF5] -> [ 4628, 4628] # seg 402 // [0x5FFD,0x5FFF] -v # seg 404 at pos 14507 8535, RCHAR, 5679, // [0x600F,0x602F] -v # seg 406 at pos 14510 6369, RCHAR, RCHAR, 4638, RCHAR, RCHAR, RCHAR, 8232, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5008, 5787, RCHAR, RCHAR, 8112, 7063, RCHAR, RCHAR, RCHAR, 4482, RCHAR, 6006, 6880, RCHAR, 4283, RCHAR, RCHAR, RCHAR, RCHAR, 4046, // [0x6041,0x6043] -v # seg 408 at pos 14543 7135, 6174, 6233, // [0x604D,0x6070] -v # seg 410 at pos 14546 8593, RCHAR, RCHAR, 4215, RCHAR, 8357, RCHAR, RCHAR, 5907, RCHAR, RCHAR, RCHAR, 6422, RCHAR, RCHAR, RCHAR, 4260, RCHAR, RCHAR, RCHAR, RCHAR, 8618, 7159, 8696, 8016, RCHAR, RCHAR, 8318, 7013, 3886, RCHAR, 4629, 4216, RCHAR, 6254, 8717, // [0x6085,0x60A7] -v # seg 412 at pos 14582 6562, RCHAR, RCHAR, RCHAR, 6293, RCHAR, RCHAR, 7435, 8319, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8619, RCHAR, 8184, RCHAR, RCHAR, RCHAR, 6084, 7326, RCHAR, RCHAR, RCHAR, 6665, 6938, RCHAR, RCHAR, 8573, 7929, RCHAR, RCHAR, 5135, // [0x60B0,0x60BD] -v # seg 414 at pos 14617 7510, RCHAR, 5711, 4776, 7987, RCHAR, 5388, RCHAR, 4132, RCHAR, RCHAR, RCHAR, 4789, 7805, // [0x60C5,0x60C7] -v # seg 416 at pos 14631 7386, RCHAR, 4828, // [0x60D1,0x60D1] -> [ 8526, 8526] # seg 418 // [0x60DA,0x60E1] -v # seg 420 at pos 14634 8536, RCHAR, 5934, RCHAR, RCHAR, 6939, 8478, 6331, // [0x60F0,0x611F] -v # seg 422 at pos 14642 8060, 4666, RCHAR, 5871, RCHAR, RCHAR, 8594, RCHAR, RCHAR, 6400, 6007, 8008, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6109, RCHAR, RCHAR, RCHAR, RCHAR, 4027, RCHAR, 6940, 6941, RCHAR, RCHAR, RCHAR, 5389, 8197, 7037, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6332, RCHAR, RCHAR, RCHAR, RCHAR, 6822, 6378, RCHAR, RCHAR, RCHAR, 3932, // [0x6127,0x6127] -> [ 4284, 4284] # seg 424 // [0x6130,0x6182] -v # seg 426 at pos 14690 8595, RCHAR, RCHAR, RCHAR, 7772, RCHAR, RCHAR, 3983, RCHAR, RCHAR, RCHAR, RCHAR, 6272, RCHAR, 3984, 6881, RCHAR, RCHAR, 6796, RCHAR, 5116, RCHAR, RCHAR, 7014, 7160, RCHAR, 4076, 8113, 8596, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8261, RCHAR, 5286, RCHAR, RCHAR, 7758, 7759, RCHAR, RCHAR, RCHAR, 8151, RCHAR, 8132, RCHAR, RCHAR, 5192, 4246, 3887, RCHAR, RCHAR, 8479, 3985, RCHAR, RCHAR, 7511, RCHAR, RCHAR, 4958, RCHAR, 6909, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4093, 3962, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7811, 6782, RCHAR, RCHAR, 7930, 6823, // [0x618A,0x619A] -v # seg 428 at pos 14773 5712, RCHAR, RCHAR, RCHAR, 7602, RCHAR, 4978, 5760, RCHAR, RCHAR, 7892, RCHAR, RCHAR, RCHAR, 8730, 8729, 8089, // [0x61A4,0x61CB] -v # seg 430 at pos 14790 5680, RCHAR, RCHAR, 4844, RCHAR, 4049, RCHAR, 5390, 4094, RCHAR, 5331, RCHAR, RCHAR, RCHAR, 8407, RCHAR, RCHAR, RCHAR, 6458, RCHAR, RCHAR, RCHAR, 4727, RCHAR, RCHAR, RCHAR, 3933, RCHAR, RCHAR, RCHAR, RCHAR, 4453, RCHAR, RCHAR, RCHAR, 3901, 8376, 7030, 6667, 5332, // [0x61E6,0x61E6] -> [ 4566, 4566] # seg 432 // [0x61F2,0x6221] -v # seg 434 at pos 14830 7711, RCHAR, RCHAR, RCHAR, 4884, 8620, 8421, RCHAR, 7760, RCHAR, 4334, RCHAR, RCHAR, 7038, 4979, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4751, 4227, RCHAR, 5333, RCHAR, 6198, 6110, 7007, RCHAR, 6008, 6315, 4133, RCHAR, RCHAR, RCHAR, 8527, RCHAR, RCHAR, RCHAR, 7812, RCHAR, RCHAR, RCHAR, RCHAR, 4446, RCHAR, 3934, // [0x622A,0x6236] -v # seg 436 at pos 14878 7355, RCHAR, RCHAR, RCHAR, 5107, RCHAR, 7327, 8731, RCHAR, RCHAR, 4766, RCHAR, 8493, // [0x623E,0x6258] -v # seg 438 at pos 14891 4959, 5465, 6037, 8200, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5952, 8494, 5713, RCHAR, 6111, RCHAR, 7243, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8061, RCHAR, RCHAR, RCHAR, RCHAR, 8074, // [0x626E,0x629B] -v # seg 440 at pos 14918 5681, RCHAR, RCHAR, 4483, RCHAR, RCHAR, RCHAR, RCHAR, 5645, RCHAR, RCHAR, 5714, RCHAR, RCHAR, 6386, RCHAR, RCHAR, 6218, 4509, RCHAR, RCHAR, RCHAR, 7893, RCHAR, RCHAR, RCHAR, RCHAR, 4069, 8157, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6459, 5908, RCHAR, RCHAR, 8148, RCHAR, 8358, 7356, RCHAR, RCHAR, 8233, // [0x62AB,0x62DC] -v # seg 442 at pos 14964 8280, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8234, RCHAR, RCHAR, RCHAR, 7266, RCHAR, RCHAR, RCHAR, 5207, RCHAR, RCHAR, 6364, 7941, RCHAR, RCHAR, RCHAR, RCHAR, 5696, RCHAR, RCHAR, RCHAR, RCHAR, 5334, 4630, 4922, RCHAR, RCHAR, 5426, 5405, RCHAR, 4568, 4285, RCHAR, 4009, 7813, 5448, RCHAR, 8062, 6756, 4335, 7505, RCHAR, 7894, 5491, // [0x62EC,0x6309] -v # seg 444 at pos 15014 4261, 6255, 4558, 7604, RCHAR, 4217, RCHAR, 4398, RCHAR, RCHAR, RCHAR, 4159, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6209, 4569, RCHAR, 7618, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7619, RCHAR, 6343, // [0x6311,0x6311] -> [ 4790, 4790] # seg 446 // [0x632B,0x632F] -v # seg 448 at pos 15044 7528, RCHAR, RCHAR, RCHAR, 7654, // [0x633A,0x633E] -v # seg 450 at pos 15049 7387, 6526, RCHAR, 5193, 8448, // [0x6349,0x6355] -v # seg 452 at pos 15054 7728, RCHAR, RCHAR, 8181, RCHAR, RCHAR, 4594, 6525, RCHAR, RCHAR, RCHAR, RCHAR, 8235, // [0x6367,0x63AA] -v # seg 454 at pos 15067 5618, 5788, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4010, RCHAR, RCHAR, RCHAR, 4399, RCHAR, RCHAR, RCHAR, RCHAR, 7864, RCHAR, RCHAR, 4595, 4631, RCHAR, RCHAR, RCHAR, 5909, RCHAR, RCHAR, RCHAR, 6038, RCHAR, RCHAR, RCHAR, RCHAR, 6112, 4791, RCHAR, RCHAR, 7213, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5492, RCHAR, RCHAR, RCHAR, 6387, RCHAR, 4385, RCHAR, RCHAR, 4277, RCHAR, RCHAR, RCHAR, RCHAR, 4938, 7792, 8097, RCHAR, RCHAR, 7371, RCHAR, 4218, 7942, 6474, 7459, // [0x63C0,0x63C6] -v # seg 456 at pos 15135 3902, RCHAR, RCHAR, RCHAR, 6942, RCHAR, 4423, // [0x63CF,0x63E1] -v # seg 458 at pos 15142 5321, 7436, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7026, RCHAR, RCHAR, RCHAR, 6423, 8574, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6333, // [0x63ED,0x63F7] -v # seg 460 at pos 15161 4050, 8685, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6882, RCHAR, 6401, 5853, // [0x640D,0x6422] -v # seg 462 at pos 15172 6078, RCHAR, 5406, RCHAR, RCHAR, RCHAR, RCHAR, 6039, RCHAR, 6757, 4792, RCHAR, RCHAR, RCHAR, RCHAR, 6113, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7655, // [0x642C,0x642D] -v # seg 464 at pos 15194 5427, 8102, // [0x643A,0x643E] -v # seg 466 at pos 15196 8692, RCHAR, RCHAR, RCHAR, 7729, // [0x6458,0x6458] -> [ 7292, 7292] # seg 468 // [0x6460,0x6460] -> [ 7931, 7931] # seg 470 // [0x6469,0x646F] -v # seg 472 at pos 15201 5173, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7620, // [0x6478,0x647A] -v # seg 474 at pos 15208 5287, 5288, 7372, // [0x6488,0x6488] -> [ 5027, 5027] # seg 476 // [0x6491,0x64B2] -v # seg 478 at pos 15211 8126, 5841, 6758, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4626, RCHAR, RCHAR, RCHAR, 4752, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7845, 5449, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5335, RCHAR, 8158, 7936, RCHAR, 7735, RCHAR, 5407, // [0x64BB,0x6504] -v # seg 480 at pos 15245 4720, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6695, RCHAR, RCHAR, 5028, 7827, RCHAR, 8124, RCHAR, RCHAR, 4051, RCHAR, RCHAR, 7460, 4095, RCHAR, RCHAR, RCHAR, 4468, RCHAR, 4728, RCHAR, RCHAR, RCHAR, 5542, RCHAR, 4011, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4767, 8076, RCHAR, RCHAR, 4913, 7752, 4012, RCHAR, RCHAR, RCHAR, RCHAR, 7039, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7814, RCHAR, 8563, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8159, RCHAR, RCHAR, RCHAR, 6759, RCHAR, 5428, RCHAR, RCHAR, RCHAR, 8127, // [0x6518,0x65D7] -v # seg 482 at pos 15319 6424, RCHAR, RCHAR, RCHAR, RCHAR, 5999, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4980, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4299, 8564, 4914, RCHAR, RCHAR, 7621, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6114, 4160, 6943, 3986, RCHAR, 4219, RCHAR, RCHAR, 5466, 7388, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4161, RCHAR, RCHAR, 8642, RCHAR, RCHAR, RCHAR, RCHAR, 5910, 4300, 5391, RCHAR, 4336, RCHAR, RCHAR, RCHAR, RCHAR, 6668, 8185, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7773, RCHAR, RCHAR, RCHAR, 3935, 5831, RCHAR, RCHAR, 4829, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4096, 6425, RCHAR, RCHAR, RCHAR, RCHAR, 4162, RCHAR, 7389, 7293, RCHAR, 5646, 6115, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5953, RCHAR, RCHAR, RCHAR, 4997, 8219, RCHAR, 8643, RCHAR, 5357, RCHAR, RCHAR, RCHAR, RCHAR, 5749, RCHAR, RCHAR, RCHAR, 5715, 5429, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4857, RCHAR, 5070, RCHAR, 4190, 5789, RCHAR, RCHAR, 7701, RCHAR, 6351, RCHAR, RCHAR, 4454, 7815, RCHAR, 5647, RCHAR, RCHAR, RCHAR, 7180, 7761, RCHAR, RCHAR, 5790, 6273, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4707, RCHAR, 5467, RCHAR, RCHAR, 6449, 6234, RCHAR, RCHAR, RCHAR, 5468, RCHAR, RCHAR, RCHAR, 4960, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5954, 7390, RCHAR, RCHAR, 7498, RCHAR, RCHAR, 5093, RCHAR, RCHAR, RCHAR, RCHAR, 4510, // [0x65E0,0x6615] -v # seg 484 at pos 15511 5336, RCHAR, RCHAR, 4511, RCHAR, 7126, 4708, RCHAR, 7622, 7461, RCHAR, RCHAR, 6175, 6846, RCHAR, RCHAR, RCHAR, 8320, RCHAR, RCHAR, 6824, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6731, 5392, 5393, 4830, RCHAR, 6669, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4199, 6219, RCHAR, 5469, 8495, RCHAR, 7774, RCHAR, 5268, 8530, 5682, 4469, RCHAR, 6507, 5935, 8705, // [0x661E,0x664F] -v # seg 486 at pos 15565 5566, 6009, 6596, RCHAR, RCHAR, RCHAR, RCHAR, 7975, RCHAR, 5229, 7181, RCHAR, RCHAR, RCHAR, RCHAR, 6040, RCHAR, 6235, 8303, 6847, RCHAR, RCHAR, 5322, RCHAR, 7775, RCHAR, RCHAR, RCHAR, 5567, 6370, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7462, 6236, 8597, 8598, RCHAR, RCHAR, RCHAR, RCHAR, 7656, RCHAR, 7657, RCHAR, RCHAR, RCHAR, 6344, // [0x6659,0x667A] -v # seg 488 at pos 15615 7578, RCHAR, 8422, RCHAR, 7543, 8732, 6010, RCHAR, RCHAR, RCHAR, RCHAR, 6670, 8576, 8621, 8496, 6274, 5194, RCHAR, 8077, RCHAR, RCHAR, 5582, 4097, RCHAR, RCHAR, RCHAR, 5936, 7872, RCHAR, 7391, 4415, 7392, RCHAR, 7623, // [0x6684,0x66A2] -v # seg 490 at pos 15649 8677, RCHAR, RCHAR, 3865, 8674, 8686, RCHAR, RCHAR, RCHAR, RCHAR, 6597, RCHAR, 6910, 5911, RCHAR, RCHAR, RCHAR, RCHAR, 4587, 6359, 6426, RCHAR, RCHAR, RCHAR, RCHAR, 5269, RCHAR, RCHAR, 4163, RCHAR, 7776, // [0x66AB,0x66C9] -v # seg 492 at pos 15680 7196, RCHAR, RCHAR, 5289, RCHAR, RCHAR, RCHAR, 7214, 8480, 8253, RCHAR, RCHAR, RCHAR, RCHAR, 5992, RCHAR, 4098, RCHAR, RCHAR, 4831, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6584, RCHAR, 4972, 4729, RCHAR, 8644, // [0x66D6,0x66E6] -v # seg 494 at pos 15711 6379, RCHAR, RCHAR, 5912, RCHAR, RCHAR, 6761, 8254, RCHAR, RCHAR, 4268, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8733, // [0x66F0,0x673D] -v # seg 496 at pos 15728 6729, RCHAR, 4191, 6633, 4099, RCHAR, RCHAR, 3920, 5913, 7464, 7463, RCHAR, 5195, RCHAR, 7603, 7881, 7939, RCHAR, RCHAR, 8622, RCHAR, RCHAR, RCHAR, RCHAR, 6898, 6944, RCHAR, 5698, RCHAR, 5600, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5826, 7702, RCHAR, 4926, RCHAR, RCHAR, RCHAR, 5217, RCHAR, 7465, 4512, 4513, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5315, 5053, 5305, RCHAR, 5374, 5208, 5611, 7753, 7979, RCHAR, RCHAR, 7544, RCHAR, RCHAR, 5408, RCHAR, 8063, RCHAR, RCHAR, RCHAR, 4408, RCHAR, RCHAR, 8661, // [0x6746,0x675F] -v # seg 498 at pos 15806 3903, RCHAR, RCHAR, 5847, RCHAR, RCHAR, RCHAR, RCHAR, 5136, 8391, 7244, 7924, RCHAR, 8262, RCHAR, RCHAR, 7215, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4858, RCHAR, 4514, 6069, // [0x676D,0x677F] -v # seg 500 at pos 15832 8359, RCHAR, 5493, 4036, 4845, RCHAR, 5323, RCHAR, 7267, RCHAR, 8160, RCHAR, RCHAR, RCHAR, 4683, RCHAR, RCHAR, 6085, 8172, // [0x6787,0x679D] -v # seg 502 at pos 15851 5716, RCHAR, 6732, RCHAR, 5470, RCHAR, RCHAR, RCHAR, 4598, 5937, RCHAR, RCHAR, 4859, RCHAR, 8044, RCHAR, 5164, RCHAR, RCHAR, 5230, RCHAR, 4228, 7624, // [0x67AF,0x67C4] -v # seg 504 at pos 15874 4164, 8211, RCHAR, RCHAR, 7625, RCHAR, RCHAR, 3866, 3867, 4337, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6237, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5568, // [0x67CF,0x67DD] -v # seg 506 at pos 15896 5509, 5290, 3936, 8040, 6573, 6946, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6947, RCHAR, RCHAR, 8078, // [0x67E9,0x67FE] -v # seg 508 at pos 15911 4338, RCHAR, RCHAR, 3904, RCHAR, RCHAR, 3868, 4621, 7545, RCHAR, 5094, 6238, 7800, 5791, RCHAR, RCHAR, RCHAR, RCHAR, 5792, RCHAR, RCHAR, 7393, // [0x6812,0x6817] -v # seg 510 at pos 15933 6176, 7328, RCHAR, RCHAR, 5914, 5117, // [0x6821,0x6822] -v # seg 512 at pos 15939 4301, 5510, // [0x682A,0x682F] -v # seg 514 at pos 15941 7546, RCHAR, RCHAR, RCHAR, RCHAR, 6848, // [0x6838,0x6854] -v # seg 516 at pos 15947 8388, 4455, RCHAR, RCHAR, 4052, 7245, RCHAR, RCHAR, 4037, 8360, 4134, 4793, RCHAR, RCHAR, RCHAR, RCHAR, 6345, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7691, RCHAR, 4846, 5872, RCHAR, 8577, 4559, // [0x686D,0x686D] -> [ 7658, 7658] # seg 518 // [0x6876,0x6876] -> [ 8133, 8133] # seg 520 // [0x687F,0x6885] -v # seg 522 at pos 15976 3905, RCHAR, 4944, RCHAR, RCHAR, RCHAR, 5231, // [0x688F,0x68B6] -v # seg 524 at pos 15983 4192, RCHAR, RCHAR, RCHAR, 7246, 8017, RCHAR, RCHAR, 4100, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7466, RCHAR, 8645, RCHAR, 6714, 7895, RCHAR, RCHAR, RCHAR, RCHAR, 6671, 5137, RCHAR, RCHAR, RCHAR, RCHAR, 5793, RCHAR, 7437, 4135, 4200, RCHAR, 6041, RCHAR, 5530, 5375, // [0x68C4,0x6905] -v # seg 526 at pos 16023 4516, 5569, RCHAR, RCHAR, RCHAR, 5255, RCHAR, 4515, RCHAR, 4201, RCHAR, RCHAR, RCHAR, RCHAR, 5619, RCHAR, RCHAR, 7512, RCHAR, 7467, 4447, RCHAR, 5699, RCHAR, RCHAR, RCHAR, RCHAR, 4847, 4753, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7191, 4136, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5848, RCHAR, RCHAR, RCHAR, 5915, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4794, 4247, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6715, RCHAR, RCHAR, RCHAR, RCHAR, 7040, // [0x690D,0x6912] -v # seg 528 at pos 16089 6256, 7943, RCHAR, RCHAR, RCHAR, 7896, // [0x6927,0x6927] -> [ 5270, 5270] # seg 530 // [0x6930,0x6930] -> [ 6402, 6402] # seg 532 // [0x693D,0x693F] -v # seg 534 at pos 16095 6528, RCHAR, 7976, // [0x694A,0x694A] -> [ 6428, 6428] # seg 536 // [0x6953,0x6979] -v # seg 538 at pos 16098 8274, 5980, 8064, RCHAR, 4028, RCHAR, 5337, 7897, RCHAR, RCHAR, RCHAR, 5124, RCHAR, 4599, 6949, 6950, 5376, RCHAR, RCHAR, RCHAR, RCHAR, 7394, RCHAR, RCHAR, 7598, RCHAR, 6477, 7268, 6177, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4448, RCHAR, 8377, 7944, 6598, // [0x6995,0x699C] -v # seg 540 at pos 16137 6797, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7659, 5471, // [0x69A5,0x69C3] -v # seg 542 at pos 16145 8599, RCHAR, 5717, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6599, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5095, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8103, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4165, RCHAR, 5430, // [0x69CB,0x69D0] -v # seg 544 at pos 16176 4339, 8140, 7777, RCHAR, RCHAR, 4286, // [0x69E8,0x69EA] -v # seg 546 at pos 16182 4239, RCHAR, 3987, // [0x69FB,0x6A02] -v # seg 548 at pos 16185 4424, RCHAR, 7468, RCHAR, 4456, RCHAR, RCHAR, 6334, // [0x6A0A,0x6A23] -v # seg 550 at pos 16193 5515, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4945, RCHAR, 5082, RCHAR, RCHAR, RCHAR, 7269, RCHAR, 8263, RCHAR, RCHAR, RCHAR, RCHAR, 7945, 7216, RCHAR, 5291, RCHAR, 6429, // [0x6A35,0x6A61] -v # seg 552 at pos 16219 7898, RCHAR, RCHAR, 5409, 6116, 8551, RCHAR, RCHAR, 7579, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3937, RCHAR, RCHAR, RCHAR, 6763, RCHAR, RCHAR, 4302, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6855, 6178, RCHAR, RCHAR, RCHAR, RCHAR, 4442, 4875, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4517, RCHAR, 5873, // [0x6A6B,0x6A6B] -> [ 8637, 8637] # seg 554 // [0x6A80,0x6A8E] -v # seg 556 at pos 16264 4709, RCHAR, RCHAR, RCHAR, 4053, RCHAR, RCHAR, RCHAR, RCHAR, 7395, RCHAR, RCHAR, RCHAR, 6460, 4470, // [0x6A97,0x6AA3] -v # seg 558 at pos 16279 5543, RCHAR, RCHAR, RCHAR, RCHAR, 8623, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4041, 7217, // [0x6AB3,0x6AB3] -> [ 5750, 5750] # seg 560 // [0x6ABB,0x6AC3] -v # seg 562 at pos 16292 8338, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4795, 4409, // [0x6AD3,0x6ADB] -v # seg 564 at pos 16301 5029, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4961, 7597, // [0x6AF6,0x6AFB] -v # seg 566 at pos 16310 8408, RCHAR, RCHAR, RCHAR, RCHAR, 6392, // [0x6B04,0x6B16] -v # seg 568 at pos 16316 4904, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4400, RCHAR, 7218, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4905, RCHAR, RCHAR, RCHAR, 4915, // [0x6B20,0x6B23] -v # seg 570 at pos 16335 8713, 7720, RCHAR, 8706, // [0x6B32,0x6B32] -> [ 6783, 6783] # seg 572 // [0x6B3A,0x6B3E] -v # seg 574 at pos 16339 4518, RCHAR, RCHAR, 8714, 4248, // [0x6B46,0x6B50] -v # seg 576 at pos 16344 8715, 8411, RCHAR, RCHAR, RCHAR, RCHAR, 3869, RCHAR, 8090, RCHAR, 4340, // [0x6B5F,0x6B6A] -v # seg 578 at pos 16355 6487, RCHAR, 8575, 7626, 7396, 7721, 5583, 5338, RCHAR, RCHAR, RCHAR, 6737, // [0x6B72,0x6B8A] -v # seg 580 at pos 16367 6023, RCHAR, RCHAR, RCHAR, RCHAR, 4973, 4416, RCHAR, RCHAR, 5794, RCHAR, RCHAR, RCHAR, 5312, RCHAR, RCHAR, RCHAR, 6371, 7660, RCHAR, 8114, RCHAR, RCHAR, 6179, 6117, // [0x6B96,0x6B9E] -v # seg 582 at pos 16392 6257, RCHAR, 7192, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6856, // [0x6BAE,0x6BDB] -v # seg 584 at pos 16401 4998, 5751, RCHAR, RCHAR, 5993, RCHAR, RCHAR, 4710, RCHAR, 7015, RCHAR, RCHAR, 5842, RCHAR, 3888, RCHAR, RCHAR, 7329, RCHAR, 8682, RCHAR, RCHAR, RCHAR, 7041, 4341, RCHAR, RCHAR, RCHAR, RCHAR, 5339, RCHAR, 5292, RCHAR, 5232, RCHAR, RCHAR, 4817, 6985, 5718, RCHAR, 5719, 5720, 5721, RCHAR, RCHAR, 5293, // [0x6BEB,0x6BEC] -v # seg 586 at pos 16447 8497, 4342, // [0x6C08,0x6C13] -v # seg 588 at pos 16449 7330, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6308, RCHAR, 5394, RCHAR, 5245, // [0x6C23,0x6C23] -> [ 4519, 4519] # seg 590 // [0x6C34,0x6C42] -v # seg 592 at pos 16461 6118, RCHAR, RCHAR, 5761, 6600, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5531, RCHAR, 7397, 7599, 4343, // [0x6C4E,0x6C60] -v # seg 594 at pos 16476 5532, RCHAR, 5938, RCHAR, RCHAR, RCHAR, RCHAR, 5832, RCHAR, 8321, RCHAR, RCHAR, 6672, RCHAR, RCHAR, 6488, 8540, 3963, 7627, // [0x6C68,0x6C9B] -v # seg 596 at pos 16495 4206, RCHAR, 6733, RCHAR, RCHAR, 6634, RCHAR, RCHAR, 8115, RCHAR, 4484, RCHAR, RCHAR, RCHAR, 5358, RCHAR, RCHAR, RCHAR, 4070, RCHAR, RCHAR, 4520, 5683, RCHAR, RCHAR, 6297, 4521, 6683, RCHAR, 6883, 8361, 6529, 8045, RCHAR, RCHAR, RCHAR, 4832, RCHAR, RCHAR, RCHAR, 5306, RCHAR, 5313, 4742, 5256, 5366, 7983, RCHAR, RCHAR, 5795, 7628, 8186, // [0x6CAB,0x6CF3] -v # seg 598 at pos 16547 5209, RCHAR, RCHAR, 7270, RCHAR, RCHAR, RCHAR, RCHAR, 8304, RCHAR, RCHAR, RCHAR, RCHAR, 5722, 6951, RCHAR, 8018, 6042, 4166, 7853, 6530, RCHAR, 8600, 8461, RCHAR, 5981, RCHAR, RCHAR, RCHAR, RCHAR, 7828, 5410, RCHAR, 8289, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8541, RCHAR, 5537, RCHAR, 5796, RCHAR, RCHAR, RCHAR, 5533, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8237, 8161, 7027, RCHAR, 4695, RCHAR, RCHAR, 7547, RCHAR, RCHAR, 8423, RCHAR, RCHAR, 5431, 5395, 8116, RCHAR, RCHAR, 6601, // [0x6D0B,0x6D2A] -v # seg 600 at pos 16620 6430, 4993, RCHAR, RCHAR, RCHAR, RCHAR, 5584, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6024, RCHAR, 6119, RCHAR, 4893, RCHAR, RCHAR, 4848, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7661, RCHAR, 6952, RCHAR, 5982, 8542, // [0x6D32,0x6D41] -v # seg 602 at pos 16652 7548, RCHAR, RCHAR, 6180, 8702, RCHAR, 4269, 6884, RCHAR, 8585, RCHAR, 8718, 8162, RCHAR, RCHAR, 5096, // [0x6D59,0x6D95] -v # seg 604 at pos 16668 7357, 7580, RCHAR, 5752, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6716, RCHAR, RCHAR, 8238, RCHAR, RCHAR, 8498, 4927, RCHAR, 5138, RCHAR, 5648, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6784, RCHAR, RCHAR, 8378, 8046, 8449, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6563, RCHAR, 4101, 6043, 6000, RCHAR, RCHAR, 6798, 8646, 6531, RCHAR, RCHAR, 6070, RCHAR, 6532, RCHAR, 7882, // [0x6DAF,0x6DB5] -v # seg 606 at pos 16729 6380, RCHAR, RCHAR, 6388, RCHAR, RCHAR, 8339, // [0x6DC0,0x6DFB] -v # seg 608 at pos 16736 7398, RCHAR, RCHAR, 4401, 8019, 5939, 8647, 4522, RCHAR, RCHAR, RCHAR, 5165, RCHAR, RCHAR, RCHAR, 8499, RCHAR, 6164, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4796, 7513, 5083, RCHAR, RCHAR, RCHAR, 6086, RCHAR, RCHAR, 4730, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7399, RCHAR, 5112, 7021, RCHAR, RCHAR, 8624, RCHAR, RCHAR, 6299, RCHAR, 6181, RCHAR, 6533, RCHAR, 8531, 7873, 6475, 7829, 7854, // [0x6E17,0x6E4D] -v # seg 610 at pos 16796 5849, RCHAR, 8578, 7271, 3938, RCHAR, RCHAR, RCHAR, 7400, 4013, 4797, RCHAR, 5797, 5450, 6335, 6703, RCHAR, RCHAR, RCHAR, RCHAR, 5983, 8009, 6911, RCHAR, 8362, RCHAR, RCHAR, 5955, RCHAR, 3921, RCHAR, 6602, RCHAR, 6954, RCHAR, 5324, RCHAR, 5377, 7247, 8532, RCHAR, RCHAR, RCHAR, RCHAR, 5494, 5378, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7549, RCHAR, RCHAR, 4711, // [0x6E56,0x6E5F] -v # seg 612 at pos 16851 8500, RCHAR, 5874, RCHAR, RCHAR, 4731, 6258, RCHAR, 7401, 8601, // [0x6E67,0x6E7A] -v # seg 614 at pos 16861 6799, RCHAR, RCHAR, RCHAR, 7946, RCHAR, RCHAR, 7109, 8106, RCHAR, RCHAR, 6885, 4600, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5585, // [0x6E90,0x6EBA] -v # seg 616 at pos 16881 6886, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7581, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5097, 4344, RCHAR, 5271, RCHAR, RCHAR, 7127, RCHAR, RCHAR, 5649, RCHAR, RCHAR, RCHAR, RCHAR, 4137, 6687, RCHAR, RCHAR, RCHAR, 6044, RCHAR, 7662, RCHAR, RCHAR, RCHAR, RCHAR, 6800, RCHAR, RCHAR, RCHAR, 4697, // [0x6EC2,0x6ED4] -v # seg 618 at pos 16924 5472, RCHAR, 7778, 5263, RCHAR, RCHAR, RCHAR, 8602, RCHAR, 7161, 7816, RCHAR, 8462, RCHAR, RCHAR, 8586, RCHAR, 7248, 4798, // [0x6EEF,0x6F06] -v # seg 620 at pos 16943 7883, RCHAR, RCHAR, RCHAR, RCHAR, 7294, RCHAR, RCHAR, RCHAR, 8501, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4202, 5196, RCHAR, 6450, 8264, RCHAR, RCHAR, RCHAR, 8041, // [0x6F0F,0x6F15] -v # seg 622 at pos 16967 5084, RCHAR, 3988, RCHAR, RCHAR, 6534, 7469, // [0x6F20,0x6F23] -v # seg 624 at pos 16974 5183, RCHAR, 8322, 4981, // [0x6F2B,0x6F41] -v # seg 626 at pos 16978 5197, 7629, RCHAR, RCHAR, RCHAR, RCHAR, 6120, 7779, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7365, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7219, RCHAR, 6603, // [0x6F51,0x6F64] -v # seg 628 at pos 17001 5451, RCHAR, RCHAR, 4071, RCHAR, RCHAR, 7705, 5432, RCHAR, 6165, 7197, RCHAR, RCHAR, 5030, 5940, RCHAR, RCHAR, 8603, RCHAR, 6995, // [0x6F6D,0x6F70] -v # seg 630 at pos 17021 4732, 7470, RCHAR, 4410, // [0x6F7A,0x6F97] -v # seg 632 at pos 17025 7193, RCHAR, 4849, 5586, 5156, RCHAR, RCHAR, 5854, RCHAR, RCHAR, 7712, RCHAR, RCHAR, RCHAR, 7846, RCHAR, RCHAR, RCHAR, RCHAR, 7550, 8194, RCHAR, 6857, RCHAR, RCHAR, RCHAR, 8502, RCHAR, RCHAR, 3906, // [0x6FA3,0x6FCA] -v # seg 634 at pos 17055 8323, 8125, RCHAR, RCHAR, 5021, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8625, 7736, RCHAR, 7331, RCHAR, 6673, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4733, RCHAR, RCHAR, RCHAR, RCHAR, 4721, RCHAR, 4054, 8079, 4999, 4661, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6635, // [0x6FD5,0x6FF1] -v # seg 636 at pos 17095 6208, RCHAR, RCHAR, RCHAR, RCHAR, 6604, RCHAR, RCHAR, RCHAR, RCHAR, 7438, 8503, 6956, RCHAR, RCHAR, 4799, RCHAR, RCHAR, RCHAR, RCHAR, 8504, RCHAR, 4916, 7582, RCHAR, RCHAR, 8080, RCHAR, 5753, // [0x6FFE,0x702F] -v # seg 638 at pos 17124 4962, RCHAR, RCHAR, 6431, RCHAR, RCHAR, RCHAR, 8463, 4818, RCHAR, RCHAR, 5798, RCHAR, 6300, RCHAR, RCHAR, RCHAR, 5098, RCHAR, 8255, RCHAR, RCHAR, RCHAR, 5754, RCHAR, RCHAR, 5031, RCHAR, 8324, 6605, 7008, 4974, 7402, 6045, RCHAR, RCHAR, RCHAR, 8379, RCHAR, RCHAR, RCHAR, 5054, 5059, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6606, // [0x7037,0x703E] -v # seg 640 at pos 17174 7092, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4906, // [0x704C,0x7063] -v # seg 642 at pos 17182 4249, RCHAR, RCHAR, RCHAR, 8464, 6093, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8091, RCHAR, RCHAR, RCHAR, RCHAR, 8505, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5198, // [0x706B,0x7070] -v # seg 644 at pos 17206 8552, RCHAR, RCHAR, RCHAR, RCHAR, 8626, // [0x7078,0x707D] -v # seg 646 at pos 17212 4345, RCHAR, RCHAR, RCHAR, 7182, 7249, // [0x7085,0x70B9] -v # seg 648 at pos 17218 4102, RCHAR, RCHAR, RCHAR, RCHAR, 7996, RCHAR, RCHAR, RCHAR, 6575, RCHAR, RCHAR, RCHAR, 7899, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8707, 7162, 4270, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7403, RCHAR, RCHAR, 6046, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8424, 4014, 8092, RCHAR, 8465, RCHAR, RCHAR, RCHAR, 5570, RCHAR, RCHAR, RCHAR, 7551, 7183, 7366, // [0x70C8,0x70CF] -v # seg 650 at pos 17271 4994, RCHAR, RCHAR, 8693, RCHAR, RCHAR, RCHAR, 6674, // [0x70D8,0x70DF] -v # seg 652 at pos 17279 8543, 4894, RCHAR, RCHAR, RCHAR, 7605, RCHAR, 6536, // [0x70F1,0x70F1] -> [ 4103, 4103] # seg 654 // [0x70F9,0x710C] -v # seg 656 at pos 17287 8195, RCHAR, RCHAR, RCHAR, 5620, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8669, RCHAR, RCHAR, RCHAR, RCHAR, 6465, RCHAR, RCHAR, 7583, // [0x7119,0x7126] -v # seg 658 at pos 17307 5495, 5684, RCHAR, RCHAR, RCHAR, 4833, RCHAR, RCHAR, 5340, RCHAR, RCHAR, RCHAR, RCHAR, 7900, // [0x7130,0x7136] -v # seg 660 at pos 17321 6576, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6537, // [0x7147,0x716E] -v # seg 662 at pos 17328 8687, RCHAR, 4982, 8678, RCHAR, 8604, RCHAR, 7332, RCHAR, 6607, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4589, RCHAR, RCHAR, 6538, RCHAR, RCHAR, 6849, RCHAR, 5843, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5233, 8579, 8662, 7471, RCHAR, 5516, RCHAR, RCHAR, 6432, RCHAR, 7163, // [0x717D,0x71A2] -v # seg 664 at pos 17368 5956, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6259, RCHAR, RCHAR, RCHAR, RCHAR, 6858, 6869, RCHAR, RCHAR, RCHAR, RCHAR, 8670, RCHAR, RCHAR, 8466, RCHAR, 6801, RCHAR, RCHAR, RCHAR, RCHAR, 8734, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6166, RCHAR, RCHAR, 5621, // [0x71AC,0x71B1] -v # seg 666 at pos 17406 6675, RCHAR, RCHAR, RCHAR, RCHAR, 6565, // [0x71B9,0x71D5] -v # seg 668 at pos 17412 8735, 8736, RCHAR, RCHAR, RCHAR, 8020, RCHAR, RCHAR, 6586, RCHAR, 6540, RCHAR, RCHAR, RCHAR, RCHAR, 4876, 4834, RCHAR, RCHAR, RCHAR, RCHAR, 5071, RCHAR, 5157, RCHAR, 6047, RCHAR, 5517, 6541, // [0x71DF,0x71EE] -v # seg 670 at pos 17441 6608, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7472, 7737, 6121, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7918, 6001, // [0x71FB,0x7206] -v # seg 672 at pos 17457 8671, 6275, RCHAR, 4800, 6765, 8415, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8256, // [0x7210,0x7210] -> [ 5032, 5032] # seg 674 // [0x721B,0x721B] -> [ 4907, 4907] # seg 676 // [0x722A,0x7269] -v # seg 678 at pos 17469 7473, RCHAR, 8163, 7256, RCHAR, RCHAR, 6887, RCHAR, 6912, RCHAR, RCHAR, 7184, 5650, RCHAR, RCHAR, RCHAR, 6403, 8648, RCHAR, 5875, 7068, RCHAR, 5876, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7220, 8201, 8173, RCHAR, RCHAR, RCHAR, 8188, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7865, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4819, 6316, RCHAR, 6825, RCHAR, 5755, RCHAR, 5294, RCHAR, 5295, 5060, RCHAR, RCHAR, RCHAR, RCHAR, 5307, RCHAR, 5367, // [0x7272,0x7281] -v # seg 680 at pos 17533 5896, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8152, RCHAR, RCHAR, RCHAR, 4059, RCHAR, RCHAR, 5916, 5139, // [0x72A2,0x72AF] -v # seg 682 at pos 17549 4820, RCHAR, RCHAR, RCHAR, RCHAR, 8737, RCHAR, RCHAR, RCHAR, RCHAR, 4060, RCHAR, RCHAR, 5534, // [0x72C0,0x72C4] -v # seg 684 at pos 17563 5877, RCHAR, 4271, RCHAR, 7295, // [0x72CE,0x72D9] -v # seg 686 at pos 17568 6365, RCHAR, 8506, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4346, RCHAR, 7272, // [0x72E1,0x72E1] -> [ 4303, 4303] # seg 688 // [0x72E9,0x72E9] -> [ 6122, 6122] # seg 690 // [0x72F8,0x72FD] -v # seg 692 at pos 17580 5140, 8450, RCHAR, RCHAR, 4928, 8189, // [0x730A,0x730A] -> [ 6636, 6636] # seg 694 // [0x7316,0x731D] -v # seg 696 at pos 17586 7780, RCHAR, RCHAR, RCHAR, RCHAR, 5246, 6239, 7506, // [0x7325,0x732B] -v # seg 698 at pos 17594 6742, RCHAR, RCHAR, RCHAR, 6011, 7273, 5325, // [0x7336,0x7345] -v # seg 700 at pos 17601 6957, 6958, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8587, 6888, RCHAR, RCHAR, RCHAR, RCHAR, 6684, 5799, // [0x7350,0x7357] -v # seg 702 at pos 17617 7222, RCHAR, 6676, RCHAR, RCHAR, RCHAR, RCHAR, 4404, // [0x7368,0x737B] -v # seg 704 at pos 17625 4821, RCHAR, 8627, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6609, RCHAR, 8635, RCHAR, RCHAR, 5001, RCHAR, RCHAR, 6123, RCHAR, 4722, 8409, // [0x7384,0x739F] -v # seg 706 at pos 17645 8425, RCHAR, 7164, 6082, RCHAR, 6685, RCHAR, 6734, RCHAR, RCHAR, 7404, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7830, RCHAR, 4347, 6826, 4523, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5396, // [0x73A7,0x73ED] -v # seg 708 at pos 17673 6996, RCHAR, 6717, RCHAR, RCHAR, RCHAR, 5756, RCHAR, RCHAR, RCHAR, RCHAR, 5009, 4768, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8426, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5411, RCHAR, 3870, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5397, 5833, RCHAR, 8290, 7663, RCHAR, 3889, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4272, RCHAR, RCHAR, 4220, RCHAR, RCHAR, RCHAR, 8663, 4895, RCHAR, 7552, RCHAR, RCHAR, 6182, 5587, 7069, 8397, RCHAR, RCHAR, 8467, 4425, RCHAR, RCHAR, 5433, // [0x73F7,0x7409] -v # seg 710 at pos 17744 5341, RCHAR, 6012, RCHAR, RCHAR, RCHAR, 7405, 8427, RCHAR, RCHAR, 5957, RCHAR, 4348, RCHAR, 4929, 5141, 6124, RCHAR, 5099, // [0x7413,0x7413] -> [ 6718, 6718] # seg 712 // [0x741B,0x744B] -v # seg 714 at pos 17763 8047, RCHAR, RCHAR, RCHAR, RCHAR, 7333, 6167, 8081, RCHAR, RCHAR, 8507, 4524, RCHAR, 4203, RCHAR, 4525, 5622, 6719, RCHAR, 7514, 4250, 6577, RCHAR, RCHAR, 5166, 4471, 5724, 8164, RCHAR, 8082, RCHAR, 5538, RCHAR, RCHAR, RCHAR, RCHAR, 8533, 6827, 5296, RCHAR, 7977, 5958, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6913, // [0x7455,0x746F] -v # seg 716 at pos 17812 8305, RCHAR, 6889, RCHAR, 4642, 8508, 6611, 6960, RCHAR, 5917, 6205, 5100, RCHAR, 6802, RCHAR, 6766, 6688, RCHAR, RCHAR, 7664, 8468, 5174, RCHAR, RCHAR, RCHAR, RCHAR, 4930, // [0x747E,0x748B] -v # seg 718 at pos 17839 4457, RCHAR, RCHAR, RCHAR, 4526, 5142, RCHAR, RCHAR, RCHAR, 5959, RCHAR, 4983, RCHAR, 7223, // [0x7498,0x74E6] -v # seg 720 at pos 17853 5158, RCHAR, RCHAR, RCHAR, 8605, RCHAR, 5412, 4104, RCHAR, 7665, RCHAR, 4527, RCHAR, 4105, RCHAR, 5544, 7738, RCHAR, 7474, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8580, RCHAR, 6125, RCHAR, RCHAR, 6490, RCHAR, RCHAR, RCHAR, 6168, RCHAR, RCHAR, RCHAR, 5889, RCHAR, 5960, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7692, RCHAR, RCHAR, RCHAR, 4106, RCHAR, RCHAR, RCHAR, RCHAR, 5055, RCHAR, RCHAR, RCHAR, RCHAR, 6613, RCHAR, RCHAR, RCHAR, 4251, RCHAR, 7739, RCHAR, 4229, RCHAR, RCHAR, RCHAR, 8509, RCHAR, 8265, 8174, RCHAR, RCHAR, 6704, // [0x74EE,0x74EE] -> [ 6696, 6696] # seg 722 // [0x74F7,0x74F7] -> [ 7165, 7165] # seg 724 // [0x7501,0x7504] -v # seg 726 at pos 17932 5571, RCHAR, RCHAR, 4061, // [0x7511,0x753A] -v # seg 728 at pos 17936 7606, RCHAR, RCHAR, RCHAR, 6697, RCHAR, RCHAR, 3939, RCHAR, 6301, 7855, RCHAR, RCHAR, RCHAR, 5897, RCHAR, RCHAR, RCHAR, 5834, RCHAR, 5898, 6048, RCHAR, 6803, RCHAR, RCHAR, 5588, 6804, RCHAR, RCHAR, RCHAR, 7334, 6961, 3950, 6276, RCHAR, RCHAR, RCHAR, 4602, 7335, RCHAR, 7406, // [0x7547,0x7591] -v # seg 730 at pos 17978 4437, RCHAR, RCHAR, RCHAR, RCHAR, 4138, RCHAR, RCHAR, 6743, RCHAR, 7336, RCHAR, 4743, 5434, RCHAR, RCHAR, RCHAR, RCHAR, 5101, RCHAR, 7666, 7964, 5342, RCHAR, RCHAR, RCHAR, RCHAR, 8291, RCHAR, RCHAR, 4939, 8694, RCHAR, RCHAR, RCHAR, 5518, RCHAR, RCHAR, RCHAR, RCHAR, 7584, 7071, RCHAR, RCHAR, RCHAR, RCHAR, 8553, 4754, RCHAR, 4528, RCHAR, 3964, RCHAR, RCHAR, RCHAR, RCHAR, 4529, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3965, 7553, RCHAR, RCHAR, 7866, 8292, RCHAR, RCHAR, 6050, 6049, RCHAR, 7042, // [0x759D,0x759D] -> [ 5835, 5835] # seg 732 // [0x75A5,0x75E2] -v # seg 734 at pos 18053 3989, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6510, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8239, 8281, 3940, RCHAR, 7166, RCHAR, RCHAR, 4723, 7667, RCHAR, RCHAR, 4850, 7274, 7693, RCHAR, RCHAR, RCHAR, 3871, RCHAR, RCHAR, 5572, RCHAR, 7607, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7072, RCHAR, RCHAR, RCHAR, RCHAR, 6433, RCHAR, 8021, 8708, RCHAR, RCHAR, 4860, 4107, RCHAR, 8135, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5144, // [0x75F0,0x7600] -v # seg 736 at pos 18115 4734, RCHAR, 5175, RCHAR, 8022, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5725, RCHAR, 4167, RCHAR, RCHAR, RCHAR, 6451, // [0x760D,0x760D] -> [ 6434, 6434] # seg 738 // [0x7619,0x7626] -v # seg 740 at pos 18132 6051, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6689, 7817, 7781, 5435, RCHAR, 5102, RCHAR, 6126, // [0x763B,0x7642] -v # seg 742 at pos 18146 5085, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5072, // [0x764C,0x7656] -v # seg 744 at pos 18154 6360, RCHAR, 3907, RCHAR, RCHAR, RCHAR, 6963, RCHAR, RCHAR, RCHAR, 5545, // [0x7661,0x7693] -v # seg 746 at pos 18165 8023, RCHAR, RCHAR, 7358, RCHAR, RCHAR, RCHAR, RCHAR, 4886, RCHAR, RCHAR, 5961, RCHAR, RCHAR, RCHAR, 6698, RCHAR, 7337, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4139, RCHAR, RCHAR, 4877, 5452, 5511, 5512, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7297, RCHAR, 3990, 8606, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4304, RCHAR, 4168, RCHAR, RCHAR, 8510, // [0x76AE,0x76AE] -> [ 8282, 8282] # seg 748 // [0x76BA,0x76CA] -v # seg 750 at pos 18216 7947, RCHAR, RCHAR, RCHAR, RCHAR, 5272, RCHAR, RCHAR, 6828, 5496, RCHAR, RCHAR, 5685, RCHAR, 6614, RCHAR, 7093, // [0x76D2,0x770B] -v # seg 752 at pos 18233 8347, RCHAR, RCHAR, RCHAR, 3991, RCHAR, RCHAR, RCHAR, RCHAR, 6013, 4801, RCHAR, 7194, 5248, RCHAR, 7668, RCHAR, 3941, 5436, RCHAR, RCHAR, 5033, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5308, RCHAR, RCHAR, RCHAR, 5247, RCHAR, 7646, RCHAR, RCHAR, RCHAR, 5878, RCHAR, RCHAR, RCHAR, 5437, RCHAR, 6183, RCHAR, RCHAR, 6014, RCHAR, RCHAR, 5257, RCHAR, RCHAR, RCHAR, 8098, 5379, RCHAR, 3908, // [0x771E,0x7720] -v # seg 754 at pos 18291 7669, RCHAR, 5258, // [0x7729,0x7729] -> [ 8428, 8428] # seg 756 // [0x7737,0x7740] -v # seg 758 at pos 18294 4402, 5297, RCHAR, 7475, RCHAR, 6346, RCHAR, RCHAR, RCHAR, 7730, // [0x774D,0x774D] -> [ 8429, 8429] # seg 760 // [0x775B,0x776B] -v # seg 762 at pos 18304 7407, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6127, RCHAR, 4822, RCHAR, RCHAR, 5309, RCHAR, RCHAR, RCHAR, RCHAR, 7867, // [0x7779,0x777F] -v # seg 764 at pos 18321 4802, RCHAR, RCHAR, RCHAR, RCHAR, 4169, 6637, // [0x778B,0x7791] -v # seg 766 at pos 18328 7670, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5273, // [0x779E,0x77B3] -v # seg 768 at pos 18335 5199, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5558, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6184, 5073, RCHAR, RCHAR, 3942, RCHAR, RCHAR, 4851, // [0x77BB,0x77BF] -v # seg 770 at pos 18357 7856, 4042, RCHAR, RCHAR, 4349, // [0x77D7,0x77F3] -v # seg 772 at pos 18362 7919, RCHAR, RCHAR, RCHAR, 5298, 4489, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6240, 7043, RCHAR, 7630, RCHAR, RCHAR, RCHAR, 4350, RCHAR, RCHAR, RCHAR, 4712, 6738, 4305, RCHAR, RCHAR, RCHAR, 5941, // [0x7802,0x7802] -> [ 5800, 5800] # seg 774 // [0x7812,0x7812] -> [ 5726, 5726] # seg 776 // [0x7825,0x7834] -v # seg 778 at pos 18391 7631, 7793, 8048, RCHAR, RCHAR, RCHAR, RCHAR, 5169, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8240, RCHAR, 8165, // [0x7845,0x7845] -> [ 4426, 4426] # seg 780 // [0x784F,0x784F] -> [ 6543, 6543] # seg 782 // [0x785D,0x785D] -> [ 7901, 7901] # seg 784 // [0x786B,0x786F] -v # seg 786 at pos 18407 5103, 4108, RCHAR, RCHAR, 6544, // [0x787C,0x7897] -v # seg 788 at pos 18412 5700, RCHAR, RCHAR, RCHAR, RCHAR, 4530, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7408, RCHAR, RCHAR, RCHAR, RCHAR, 5043, 6381, 6094, RCHAR, RCHAR, 5727, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6720, // [0x78A3,0x78A9] -v # seg 790 at pos 18440 3922, RCHAR, RCHAR, RCHAR, 5546, RCHAR, 5942, // [0x78BA,0x78D0] -v # seg 792 at pos 18447 8565, 8566, 5176, RCHAR, RCHAR, RCHAR, RCHAR, 7167, RCHAR, RCHAR, RCHAR, 5473, RCHAR, RCHAR, RCHAR, RCHAR, 5061, 7722, RCHAR, RCHAR, 4140, RCHAR, 5438, // [0x78E8,0x7901] -v # seg 794 at pos 18470 5177, RCHAR, RCHAR, RCHAR, 4109, RCHAR, RCHAR, 4531, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3909, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5439, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7902, // [0x790E,0x790E] -> [ 7903, 7903] # seg 796 // [0x7916,0x7916] -> [ 6491, 6491] # seg 798 // [0x792A,0x792C] -v # seg 800 at pos 18496 4963, 4975, 5440, // [0x793A,0x796D] -v # seg 802 at pos 18499 6241, RCHAR, RCHAR, RCHAR, 5801, RCHAR, 5802, 4532, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4533, 4534, 7632, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6829, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7476, 7633, RCHAR, RCHAR, 7477, 4015, 8511, 7965, 6277, RCHAR, 5803, RCHAR, RCHAR, RCHAR, RCHAR, 5879, RCHAR, RCHAR, 8266, RCHAR, RCHAR, RCHAR, RCHAR, 7439, // [0x797A,0x7981] -v # seg 804 at pos 18551 4535, RCHAR, RCHAR, RCHAR, RCHAR, 5044, RCHAR, 4472, // [0x798D,0x7991] -v # seg 806 at pos 18559 8554, 7409, 5601, RCHAR, 6830, // [0x79A6,0x79C1] -v # seg 808 at pos 18564 6452, 8738, RCHAR, RCHAR, 5962, RCHAR, RCHAR, RCHAR, 5022, RCHAR, RCHAR, 4803, RCHAR, 6435, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6831, RCHAR, RCHAR, RCHAR, 4473, 8555, 4823, 6128, 5804, // [0x79C9,0x79E9] -v # seg 810 at pos 18592 5573, 4627, 7948, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4230, 7904, RCHAR, RCHAR, 5728, RCHAR, RCHAR, 5729, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7478, RCHAR, RCHAR, RCHAR, RCHAR, 8052, RCHAR, 7671, 6372, RCHAR, 7694, // [0x79FB,0x7A20] -v # seg 812 at pos 18625 7074, RCHAR, RCHAR, RCHAR, RCHAR, 8739, RCHAR, RCHAR, RCHAR, RCHAR, 6025, RCHAR, RCHAR, 3910, RCHAR, RCHAR, 7410, RCHAR, 7905, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7138, RCHAR, RCHAR, 8190, RCHAR, 7647, 8024, RCHAR, 5125, RCHAR, RCHAR, 8273, 7479, // [0x7A2E,0x7A4E] -v # seg 814 at pos 18663 7515, RCHAR, RCHAR, 8053, RCHAR, RCHAR, RCHAR, RCHAR, 6850, 7648, RCHAR, RCHAR, RCHAR, 4804, 3872, 4141, RCHAR, 4170, 4193, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5310, RCHAR, RCHAR, 8025, RCHAR, RCHAR, RCHAR, 7298, 6615, // [0x7A57,0x7A57] -> [ 6129, 6129] # seg 816 // [0x7A61,0x7A88] -v # seg 818 at pos 18696 5893, 6638, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6690, RCHAR, 8567, RCHAR, RCHAR, RCHAR, RCHAR, 6436, RCHAR, RCHAR, RCHAR, 8440, RCHAR, 4351, RCHAR, RCHAR, 4389, 4221, RCHAR, RCHAR, 7411, RCHAR, 7831, RCHAR, 4838, RCHAR, RCHAR, 7731, RCHAR, RCHAR, RCHAR, 6768, // [0x7A92,0x7A9F] -v # seg 820 at pos 18736 7695, 7782, RCHAR, 7480, RCHAR, RCHAR, 4378, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4386, // [0x7AA9,0x7AAF] -v # seg 822 at pos 18750 6705, 6706, RCHAR, RCHAR, RCHAR, 4390, 6769, // [0x7ABA,0x7ABA] -> [ 4427, 4427] # seg 824 // [0x7AC4,0x7ACB] -v # seg 826 at pos 18757 7740, 4428, RCHAR, 4861, RCHAR, RCHAR, 7359, 5170, // [0x7AD7,0x7AFF] -v # seg 828 at pos 18765 5326, RCHAR, 7762, RCHAR, RCHAR, RCHAR, 5574, RCHAR, 4110, 7224, RCHAR, RCHAR, 7585, RCHAR, 4852, RCHAR, RCHAR, RCHAR, RCHAR, 6130, RCHAR, RCHAR, 3923, RCHAR, 4713, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4111, RCHAR, RCHAR, 7570, 7966, RCHAR, RCHAR, RCHAR, RCHAR, 3911, // [0x7B0F,0x7B11] -v # seg 830 at pos 18806 8537, RCHAR, 6052, // [0x7B19,0x7B2D] -v # seg 832 at pos 18809 5900, RCHAR, 7299, RCHAR, RCHAR, 8117, RCHAR, 5171, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5651, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7440, 5010, // [0x7B39,0x7B39] -> [ 6026, 6026] # seg 834 // [0x7B46,0x7B56] -v # seg 836 at pos 18830 8293, RCHAR, RCHAR, 4878, RCHAR, 4458, 7338, 6185, RCHAR, 5525, 4273, 7967, 8136, RCHAR, 4744, RCHAR, 7801, // [0x7B60,0x7B60] -> [ 4438, 4438] # seg 838 // [0x7B6C,0x7B75] -v # seg 840 at pos 18847 6015, RCHAR, 5918, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6546, // [0x7B7D,0x7B7D] -> [ 6677, 6677] # seg 842 // [0x7B87,0x7BA1] -v # seg 844 at pos 18857 3992, RCHAR, RCHAR, RCHAR, 7339, RCHAR, RCHAR, RCHAR, 7257, RCHAR, RCHAR, RCHAR, RCHAR, 5413, 4536, RCHAR, 5836, RCHAR, RCHAR, 7723, RCHAR, RCHAR, 4077, RCHAR, RCHAR, RCHAR, 4252, // [0x7BAD,0x7BB8] -v # seg 846 at pos 18884 7340, RCHAR, RCHAR, RCHAR, 5880, RCHAR, RCHAR, 7198, RCHAR, RCHAR, RCHAR, 7275, // [0x7BC0,0x7BC9] -v # seg 848 at pos 18896 7360, 8607, RCHAR, RCHAR, 5535, RCHAR, 7341, 8202, RCHAR, 7968, // [0x7BD2,0x7BD2] -> [ 6260, 6260] # seg 850 // [0x7BE0,0x7BE9] -v # seg 852 at pos 18906 6053, RCHAR, RCHAR, RCHAR, 4824, RCHAR, RCHAR, RCHAR, RCHAR, 5805, // [0x7C07,0x7C07] -> [ 7499, 7499] # seg 854 // [0x7C12,0x7C12] -> [ 7741, 7741] # seg 856 // [0x7C1E,0x7C2B] -v # seg 858 at pos 18916 4714, RCHAR, RCHAR, 3912, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8608, RCHAR, RCHAR, 7199, 6054, // [0x7C3D,0x7C43] -v # seg 860 at pos 18930 7857, 5000, 5652, RCHAR, RCHAR, RCHAR, 4917, // [0x7C4C,0x7C4D] -v # seg 862 at pos 18937 7554, 7300, // [0x7C60,0x7C64] -v # seg 864 at pos 18939 5056, RCHAR, RCHAR, RCHAR, 7858, // [0x7C6C,0x7C73] -v # seg 866 at pos 18944 5145, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5380, // [0x7C83,0x7C89] -v # seg 868 at pos 18952 5730, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5686, // [0x7C92,0x7CBE] -v # seg 870 at pos 18959 5172, RCHAR, RCHAR, 5414, RCHAR, 7481, 7367, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6071, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7571, RCHAR, 7225, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4946, RCHAR, RCHAR, 4947, 7743, 4002, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6131, RCHAR, RCHAR, RCHAR, RCHAR, 7412, // [0x7CCA,0x7CCA] -> [ 8512, 8512] # seg 872 // [0x7CD6,0x7CD6] -> [ 4755, 4755] # seg 874 // [0x7CDE,0x7CE7] -v # seg 876 at pos 19004 5687, 7482, 3966, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4948, // [0x7CFB,0x7D22] -v # seg 878 at pos 19014 4142, RCHAR, RCHAR, 4429, RCHAR, 4537, RCHAR, 7555, RCHAR, 6410, 8544, 6832, 8711, 8581, RCHAR, 5359, 5360, RCHAR, 4606, RCHAR, RCHAR, 4684, RCHAR, RCHAR, RCHAR, 6186, RCHAR, RCHAR, 5806, 4289, 7634, 4485, 5688, RCHAR, RCHAR, RCHAR, RCHAR, 6055, 5474, 5894, // [0x7D2B,0x7D3A] -v # seg 880 at pos 19054 7168, 7556, RCHAR, 7754, 5086, 6027, RCHAR, RCHAR, 6278, RCHAR, 7276, RCHAR, RCHAR, RCHAR, 6056, 3943, // [0x7D42,0x7D46] -v # seg 882 at pos 19070 7516, 8430, 7483, 4112, 5441, // [0x7D50,0x7D50] -> [ 4072, 4072] # seg 884 // [0x7D5E,0x7D7F] -v # seg 886 at pos 19075 4306, RCHAR, RCHAR, 4896, 8431, RCHAR, RCHAR, RCHAR, 4486, RCHAR, 7009, RCHAR, 7112, RCHAR, RCHAR, RCHAR, 5919, RCHAR, RCHAR, 8137, 5807, 3967, RCHAR, RCHAR, 7361, RCHAR, RCHAR, 4062, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4352, // [0x7D8E,0x7D93] -v # seg 888 at pos 19109 7413, 6132, RCHAR, RCHAR, RCHAR, 4113, // [0x7D9C,0x7DA2] -v # seg 890 at pos 19115 7517, RCHAR, RCHAR, RCHAR, 5045, RCHAR, 7557, // [0x7DAC,0x7DBF] -v # seg 892 at pos 19122 6133, 6966, RCHAR, RCHAR, RCHAR, 3968, 5218, RCHAR, 7847, 7794, RCHAR, RCHAR, 5113, RCHAR, 4538, 8093, RCHAR, 7185, 5126, 5259, // [0x7DC7,0x7DCB] -v # seg 894 at pos 19142 8026, RCHAR, RCHAR, 4555, 5731, // [0x7DD6,0x7DFB] -v # seg 896 at pos 19147 5920, RCHAR, 8340, RCHAR, 5963, RCHAR, RCHAR, 7706, 4715, RCHAR, 7884, 5398, RCHAR, 6547, RCHAR, RCHAR, RCHAR, RCHAR, 8203, 6721, RCHAR, RCHAR, 5260, RCHAR, RCHAR, 6914, RCHAR, RCHAR, RCHAR, RCHAR, 4984, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8027, // [0x7E09,0x7E0A] -v # seg 898 at pos 19185 7672, 6389, // [0x7E15,0x7E23] -v # seg 900 at pos 19187 6691, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5415, RCHAR, 7673, 8513, 6785, RCHAR, 7250, RCHAR, 8432, // [0x7E2B,0x7E47] -v # seg 902 at pos 19202 5623, RCHAR, RCHAR, 7969, 6549, RCHAR, 7518, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5087, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7932, 7301, RCHAR, RCHAR, 5520, RCHAR, 5701, RCHAR, RCHAR, 5343, 6770, // [0x7E52,0x7E55] -v # seg 904 at pos 19231 7608, RCHAR, 7649, 5964, // [0x7E5E,0x7E61] -v # seg 906 at pos 19235 6771, RCHAR, RCHAR, 6134, // [0x7E69,0x7E70] -v # seg 908 at pos 19239 6220, 8628, 4143, RCHAR, 4063, RCHAR, RCHAR, 7484, // [0x7E79,0x7E82] -v # seg 910 at pos 19247 6511, RCHAR, RCHAR, 4144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7742, // [0x7E8C,0x7E9C] -v # seg 912 at pos 19257 6072, RCHAR, RCHAR, 7342, RCHAR, RCHAR, RCHAR, 6616, RCHAR, RCHAR, 5994, RCHAR, 7744, RCHAR, RCHAR, 4825, 4918, // [0x7F36,0x7F3A] -v # seg 914 at pos 19274 5653, RCHAR, 8363, RCHAR, 4073, // [0x7F4C,0x7F55] -v # seg 916 at pos 19279 6393, RCHAR, RCHAR, RCHAR, 4253, RCHAR, RCHAR, RCHAR, 5219, 8325, // [0x7F6A,0x7F79] -v # seg 918 at pos 19289 7529, 4278, RCHAR, RCHAR, 8028, RCHAR, 5526, RCHAR, 5921, RCHAR, RCHAR, 5234, RCHAR, 8166, RCHAR, 5146, // [0x7F85,0x7FA9] -v # seg 920 at pos 19305 4887, RCHAR, RCHAR, 4539, RCHAR, 6438, RCHAR, 3969, RCHAR, 5381, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4171, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5011, RCHAR, RCHAR, RCHAR, 6135, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4379, RCHAR, RCHAR, RCHAR, 5965, 7044, // [0x7FB2,0x7FD5] -v # seg 922 at pos 19342 8740, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5147, 4003, RCHAR, RCHAR, RCHAR, 6833, RCHAR, RCHAR, RCHAR, 6699, RCHAR, RCHAR, RCHAR, 6242, RCHAR, RCHAR, RCHAR, RCHAR, 7094, RCHAR, 7095, RCHAR, 5012, RCHAR, RCHAR, RCHAR, 6210, RCHAR, 5881, 8719, // [0x7FDF,0x7FE1] -v # seg 924 at pos 19378 7302, 7997, 5732, // [0x7FE9,0x7FF0] -v # seg 926 at pos 19381 8204, RCHAR, 6722, RCHAR, RCHAR, RCHAR, RCHAR, 8326, // [0x7FF9,0x8018] -v # seg 928 at pos 19389 4307, RCHAR, RCHAR, 7096, RCHAR, RCHAR, RCHAR, 6772, 5034, RCHAR, 4172, RCHAR, 7169, 4540, RCHAR, RCHAR, 4353, RCHAR, RCHAR, 7076, RCHAR, RCHAR, RCHAR, 4622, RCHAR, RCHAR, RCHAR, RCHAR, 4114, RCHAR, 5299, 6859, // [0x802D,0x804A] -v # seg 930 at pos 19421 4541, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7077, RCHAR, RCHAR, 6404, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8099, RCHAR, 4115, RCHAR, RCHAR, RCHAR, 4735, RCHAR, RCHAR, 5013, RCHAR, RCHAR, RCHAR, 5074, // [0x8056,0x805E] -v # seg 932 at pos 19451 6016, RCHAR, 5762, RCHAR, 7998, RCHAR, RCHAR, RCHAR, 5361, // [0x806F,0x808C] -v # seg 934 at pos 19460 4985, 7933, RCHAR, 6017, 6805, RCHAR, RCHAR, RCHAR, 7650, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7874, 5057, 7006, RCHAR, RCHAR, RCHAR, RCHAR, 7078, 6169, 5808, 7485, RCHAR, 6986, RCHAR, 5121, 4542, // [0x8096,0x80BA] -v # seg 936 at pos 19490 7906, RCHAR, RCHAR, RCHAR, RCHAR, 8364, RCHAR, 3913, RCHAR, RCHAR, RCHAR, 4173, 7635, RCHAR, RCHAR, 5733, RCHAR, RCHAR, RCHAR, 4064, 5475, RCHAR, RCHAR, RCHAR, RCHAR, 4490, RCHAR, 4290, 6987, RCHAR, 8649, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8220, // [0x80C3,0x80C4] -v # seg 938 at pos 19527 6915, 7535, // [0x80CC,0x80CE] -v # seg 940 at pos 19529 5497, RCHAR, 8118, // [0x80DA,0x80E5] -v # seg 942 at pos 19532 5498, 3951, RCHAR, RCHAR, 8241, RCHAR, RCHAR, 8514, RCHAR, RCHAR, 6997, 5922, // [0x80F1,0x810A] -v # seg 944 at pos 19544 4274, RCHAR, RCHAR, 4853, RCHAR, RCHAR, RCHAR, 8703, RCHAR, RCHAR, RCHAR, RCHAR, 4691, RCHAR, RCHAR, RCHAR, RCHAR, 7636, RCHAR, RCHAR, 8451, 7999, 8452, 5239, RCHAR, 7818, // [0x8118,0x811B] -v # seg 946 at pos 19570 6723, RCHAR, 3890, 4116, // [0x8123,0x812F] -v # seg 948 at pos 19574 6187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6136, RCHAR, 8096, RCHAR, RCHAR, RCHAR, 8242, // [0x8139,0x813E] -v # seg 950 at pos 19587 7783, RCHAR, RCHAR, RCHAR, RCHAR, 5734, // [0x814B,0x8155] -v # seg 952 at pos 19593 6390, RCHAR, RCHAR, 6279, RCHAR, 5654, 5655, RCHAR, RCHAR, 3970, 6724, // [0x8165,0x8180] -v # seg 954 at pos 19604 6018, 4669, RCHAR, RCHAR, RCHAR, RCHAR, 7519, RCHAR, RCHAR, RCHAR, RCHAR, 6773, 4029, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7226, 5602, 5966, RCHAR, RCHAR, RCHAR, RCHAR, 8141, 5476, // [0x8188,0x818F] -v # seg 956 at pos 19632 4055, RCHAR, 5416, RCHAR, RCHAR, RCHAR, RCHAR, 4174, // [0x819A,0x81A8] -v # seg 958 at pos 19640 5656, RCHAR, 5184, 6206, RCHAR, RCHAR, 4308, RCHAR, RCHAR, 7696, RCHAR, RCHAR, RCHAR, RCHAR, 8196, // [0x81B3,0x81CD] -v # seg 960 at pos 19655 5967, RCHAR, 7988, RCHAR, RCHAR, RCHAR, RCHAR, 7031, RCHAR, RCHAR, 4736, 8629, 4664, 4868, RCHAR, 5735, RCHAR, RCHAR, RCHAR, 6461, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7441, // [0x81D8,0x8212] -v # seg 962 at pos 19682 4923, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7227, RCHAR, RCHAR, RCHAR, 6280, RCHAR, 6707, RCHAR, 7228, 5167, RCHAR, 7170, RCHAR, RCHAR, 8000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7637, 8029, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4769, 7674, 4354, RCHAR, 6967, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4355, RCHAR, 6493, 8720, RCHAR, 4356, RCHAR, 5984, 5809, RCHAR, RCHAR, RCHAR, RCHAR, 5923, // [0x821B,0x8221] -v # seg 964 at pos 19741 7832, 6188, RCHAR, 5344, 7558, RCHAR, 3971, // [0x822A,0x822C] -v # seg 966 at pos 19748 8365, 5477, 5442, // [0x8235,0x8247] -v # seg 968 at pos 19751 8065, 5417, 8433, RCHAR, 5968, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5657, RCHAR, RCHAR, RCHAR, RCHAR, 6494, RCHAR, 7414, // [0x8259,0x8259] -> [ 7784, 7784] # seg 970 // [0x8264,0x8266] -v # seg 972 at pos 19770 7045, RCHAR, 8341, // [0x826E,0x827E] -v # seg 974 at pos 19773 3914, 4949, RCHAR, 3915, 5895, RCHAR, RCHAR, RCHAR, 6578, RCHAR, 7907, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6382, // [0x828B,0x82BF] -v # seg 976 at pos 19790 6834, RCHAR, 7186, 4391, RCHAR, RCHAR, RCHAR, 5220, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5658, 4869, RCHAR, RCHAR, 7638, RCHAR, 5850, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3993, 8515, RCHAR, RCHAR, 4474, RCHAR, RCHAR, 5689, 8167, 6639, 6302, RCHAR, 8556, RCHAR, 5478, RCHAR, RCHAR, RCHAR, 7639, 6860, 4459, RCHAR, 7949, 5300, 6317, RCHAR, 7150, // [0x82D1,0x82E7] -v # seg 978 at pos 19843 6890, 6579, RCHAR, 8119, 7908, RCHAR, 5327, RCHAR, RCHAR, RCHAR, 3873, RCHAR, RCHAR, 8243, 4357, RCHAR, 7079, RCHAR, RCHAR, RCHAR, 6411, 4175, 7277, // [0x82F1,0x82F1] -> [ 6619, 6619] # seg 980 // [0x82FD,0x8309] -v # seg 982 at pos 19866 4176, 8294, RCHAR, RCHAR, 7591, 5345, 5536, 3874, 5301, RCHAR, RCHAR, RCHAR, 5210, // [0x8317,0x8317] -> [ 5274, 5274] # seg 984 // [0x8328,0x8352] -v # seg 986 at pos 19879 7171, RCHAR, RCHAR, 5221, RCHAR, RCHAR, RCHAR, 5603, RCHAR, 6137, RCHAR, RCHAR, 8630, 7113, 4699, RCHAR, 6806, 6495, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6189, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8392, RCHAR, 7909, 8469, RCHAR, RCHAR, RCHAR, RCHAR, 7140, RCHAR, 7080, 8609, // [0x8373,0x837B] -v # seg 988 at pos 19922 4862, RCHAR, RCHAR, RCHAR, 8306, RCHAR, RCHAR, RCHAR, 7303, // [0x8389,0x838E] -v # seg 990 at pos 19931 5148, 7229, RCHAR, RCHAR, RCHAR, 5810, // [0x8396,0x83AB] -v # seg 992 at pos 19937 4117, RCHAR, 6281, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6725, RCHAR, RCHAR, RCHAR, 8453, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5659, 6318, 5185, // [0x83BD,0x83DC] -v # seg 994 at pos 19959 5222, RCHAR, RCHAR, RCHAR, 7875, RCHAR, RCHAR, RCHAR, 4254, RCHAR, RCHAR, RCHAR, 5046, 4373, RCHAR, 4439, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4231, RCHAR, RCHAR, 7785, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7795, // [0x83E9,0x840E] -v # seg 996 at pos 19991 5589, RCHAR, 4460, RCHAR, RCHAR, RCHAR, 8557, 4177, 5127, 5736, RCHAR, 6361, RCHAR, RCHAR, RCHAR, RCHAR, 7278, RCHAR, RCHAR, RCHAR, 6170, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7989, 4805, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4936, RCHAR, 5249, 8212, 6916, // [0x8429,0x843D] -v # seg 998 at pos 20029 7950, RCHAR, RCHAR, 5200, RCHAR, RCHAR, RCHAR, RCHAR, 8679, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6968, RCHAR, RCHAR, RCHAR, RCHAR, 4897, // [0x8449,0x8449] -> [ 6587, 6587] # seg 1000 // [0x8457,0x847A] -v # seg 1002 at pos 20050 7279, RCHAR, RCHAR, RCHAR, 3924, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8244, RCHAR, 4854, RCHAR, RCHAR, 6917, RCHAR, RCHAR, RCHAR, RCHAR, 8516, 7230, RCHAR, RCHAR, 6412, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4430, RCHAR, RCHAR, RCHAR, RCHAR, 7600, // [0x8490,0x84A1] -v # seg 1004 at pos 20086 6138, RCHAR, RCHAR, RCHAR, 6243, RCHAR, RCHAR, RCHAR, RCHAR, 5316, RCHAR, RCHAR, 5837, RCHAR, RCHAR, RCHAR, RCHAR, 5479, // [0x84B2,0x84D1] -v # seg 1006 at pos 20104 8245, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7609, RCHAR, RCHAR, 6413, 7786, RCHAR, RCHAR, 8517, 6079, RCHAR, 5275, RCHAR, 7970, RCHAR, 5943, RCHAR, RCHAR, 6807, RCHAR, 3994, RCHAR, 6244, RCHAR, RCHAR, RCHAR, 5811, // [0x84DA,0x84DA] -> [ 6139, 6139] # seg 1008 // [0x84EC,0x84F4] -v # seg 1010 at pos 20136 5624, RCHAR, 4986, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6190, // [0x84FC,0x84FC] -> [ 5075, 5075] # seg 1012 // [0x8511,0x852F] -v # seg 1014 at pos 20145 5264, RCHAR, 5201, 5604, RCHAR, RCHAR, 7172, 5851, RCHAR, 6866, RCHAR, RCHAR, RCHAR, 5088, RCHAR, RCHAR, 7796, RCHAR, 7231, RCHAR, 7934, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6057, 7022, RCHAR, 7675, // [0x853D,0x8559] -v # seg 1016 at pos 20176 8221, RCHAR, 6918, RCHAR, 4737, RCHAR, 5521, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7910, RCHAR, RCHAR, RCHAR, RCHAR, 4309, RCHAR, RCHAR, RCHAR, RCHAR, 6861, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8481, // [0x8563,0x856D] -v # seg 1018 at pos 20205 6191, RCHAR, RCHAR, RCHAR, RCHAR, 4405, 8108, 5346, RCHAR, RCHAR, 6058, // [0x8584,0x8587] -v # seg 1020 at pos 20216 5418, RCHAR, RCHAR, 5382, // [0x858F,0x859B] -v # seg 1022 at pos 20220 7046, RCHAR, 3972, RCHAR, RCHAR, 7232, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5985, // [0x85A6,0x85B0] -v # seg 1024 at pos 20233 7833, RCHAR, 8675, 5844, 6282, RCHAR, RCHAR, RCHAR, RCHAR, 5924, 8672, // [0x85BA,0x85C1] -v # seg 1026 at pos 20244 7442, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4178, // [0x85C9,0x85EA] -v # seg 1028 at pos 20252 7173, RCHAR, RCHAR, RCHAR, 4919, 6283, 7233, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6835, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4964, 6640, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4879, 6414, RCHAR, RCHAR, RCHAR, 5522, 6140, // [0x85F7,0x860A] -v # seg 1030 at pos 20286 7280, RCHAR, RCHAR, 5159, 7486, RCHAR, RCHAR, RCHAR, 4240, RCHAR, RCHAR, 6641, RCHAR, RCHAR, RCHAR, 5035, 6059, RCHAR, RCHAR, 6692, // [0x8616,0x861A] -v # seg 1032 at pos 20306 6469, 5547, RCHAR, RCHAR, 5969, // [0x862D,0x862D] -> [ 4908, 4908] # seg 1034 // [0x863F,0x863F] -> [ 4888, 4888] # seg 1036 // [0x864E,0x865F] -v # seg 1038 at pos 20311 8518, RCHAR, 8314, RCHAR, RCHAR, RCHAR, 4030, 7806, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8405, 5036, RCHAR, 6836, 8519, // [0x8667,0x8667] -> [ 8695, 8695] # seg 1040 // [0x8679,0x8679] -> [ 8545, 8545] # seg 1042 // [0x868A,0x8693] -v # seg 1044 at pos 20329 5362, RCHAR, 5480, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7115, // [0x86A3,0x86A9] -v # seg 1046 at pos 20339 4222, 7487, RCHAR, RCHAR, RCHAR, RCHAR, 8030, // [0x86C7,0x86CB] -v # seg 1048 at pos 20346 5812, RCHAR, RCHAR, RCHAR, 4716, // [0x86D4,0x86E4] -v # seg 1050 at pos 20351 8631, RCHAR, RCHAR, RCHAR, RCHAR, 6708, RCHAR, 7559, RCHAR, RCHAR, RCHAR, 4310, RCHAR, RCHAR, RCHAR, RCHAR, 8348, // [0x86ED,0x86ED] -> [ 7697, 7697] # seg 1052 // [0x86FE,0x8708] -v # seg 1054 at pos 20368 6319, RCHAR, 7920, RCHAR, 5625, 6284, RCHAR, RCHAR, RCHAR, RCHAR, 6678, // [0x8718,0x871C] -v # seg 1056 at pos 20379 7640, RCHAR, 5737, RCHAR, 5401, // [0x874E,0x8757] -v # seg 1058 at pos 20384 3926, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6261, RCHAR, 8610, // [0x875F,0x8768] -v # seg 1060 at pos 20394 6919, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8307, RCHAR, 6207, // [0x8774,0x8778] -v # seg 1062 at pos 20404 8520, RCHAR, 7373, RCHAR, 6709, // [0x8782,0x8782] -> [ 4931, 4931] # seg 1064 // [0x878D,0x878D] -> [ 7010, 7010] # seg 1066 // [0x879F,0x87A2] -v # seg 1068 at pos 20409 5276, RCHAR, RCHAR, 8470, // [0x87B3,0x87BA] -v # seg 1070 at pos 20413 4756, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4889, // [0x87C4,0x87C4] -> [ 8051, 8051] # seg 1072 // [0x87E0,0x87E0] -> [ 5443, 5443] # seg 1074 // [0x87EC,0x8805] -v # seg 1076 at pos 20421 5970, RCHAR, RCHAR, 6775, RCHAR, RCHAR, 7984, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8380, RCHAR, 7047, RCHAR, RCHAR, 5995, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6221, // [0x881F,0x8823] -v # seg 1078 at pos 20447 4924, RCHAR, RCHAR, 7586, 4965, // [0x8831,0x889E] -v # seg 1080 at pos 20452 4179, RCHAR, RCHAR, RCHAR, RCHAR, 7200, RCHAR, RCHAR, RCHAR, RCHAR, 5202, RCHAR, RCHAR, RCHAR, RCHAR, 8441, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8393, 6551, RCHAR, RCHAR, RCHAR, RCHAR, 8434, 6199, RCHAR, RCHAR, RCHAR, 3875, RCHAR, 6320, RCHAR, 6920, RCHAR, 7985, RCHAR, RCHAR, RCHAR, 8471, 4358, 7048, RCHAR, RCHAR, RCHAR, RCHAR, 8267, RCHAR, RCHAR, 5852, RCHAR, RCHAR, RCHAR, RCHAR, 6096, RCHAR, 4609, RCHAR, RCHAR, RCHAR, RCHAR, 7986, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4475, 4476, RCHAR, 6891, 5280, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3876, RCHAR, RCHAR, 4770, RCHAR, 8246, RCHAR, RCHAR, RCHAR, RCHAR, 4717, RCHAR, RCHAR, RCHAR, 6141, 7676, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4204, // [0x88AB,0x88AB] -> [ 8283, 8283] # seg 1082 // [0x88B4,0x88B4] -> [ 4180, 4180] # seg 1084 // [0x88C1,0x88C2] -v # seg 1086 at pos 20562 7251, 4995, // [0x88CF,0x88E8] -v # seg 1088 at pos 20564 5149, RCHAR, RCHAR, RCHAR, RCHAR, 6643, 6969, RCHAR, RCHAR, RCHAR, 4380, RCHAR, RCHAR, 5590, 7234, RCHAR, 5813, RCHAR, 5150, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5738, // [0x88F3,0x88FD] -v # seg 1090 at pos 20590 5882, 5499, 5500, RCHAR, RCHAR, 4890, RCHAR, RCHAR, RCHAR, RCHAR, 7443, // [0x8907,0x8907] -> [ 5605, 5605] # seg 1092 // [0x8910,0x8919] -v # seg 1094 at pos 20601 3925, RCHAR, 8247, 5591, RCHAR, RCHAR, RCHAR, RCHAR, 6921, 5501, // [0x8925,0x892A] -v # seg 1096 at pos 20611 6786, RCHAR, RCHAR, RCHAR, RCHAR, 8142, // [0x8936,0x8944] -v # seg 1098 at pos 20617 6211, RCHAR, 5089, RCHAR, RCHAR, 5986, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3973, RCHAR, RCHAR, 6440, // [0x895F,0x896A] -v # seg 1100 at pos 20632 4477, RCHAR, RCHAR, RCHAR, RCHAR, 4920, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5211, // [0x8972,0x8972] -> [ 6212, 6212] # seg 1102 // [0x897F,0x8996] -v # seg 1104 at pos 20644 5925, RCHAR, 6776, RCHAR, 4738, RCHAR, RCHAR, 5606, 8191, RCHAR, RCHAR, RCHAR, 4065, RCHAR, RCHAR, RCHAR, 4431, RCHAR, RCHAR, RCHAR, 5251, RCHAR, RCHAR, 6245, // [0x89A1,0x89A1] -> [ 4056, 4056] # seg 1106 // [0x89A9,0x89AA] -v # seg 1108 at pos 20668 4806, 8038, // [0x89B2,0x89B2] -> [ 4461, 4461] # seg 1110 // [0x89BA,0x89C0] -v # seg 1112 at pos 20670 3891, RCHAR, RCHAR, 4921, RCHAR, RCHAR, 4255, // [0x89D2,0x89D2] -> [ 3892, 3892] # seg 1114 // [0x89E3,0x89E3] -> [ 8381, 8381] # seg 1116 // [0x89F4,0x89F8] -v # seg 1118 at pos 20677 5883, RCHAR, RCHAR, RCHAR, 7921, // [0x8A00,0x8A3B] -v # seg 1120 at pos 20682 6466, RCHAR, 7415, 5660, RCHAR, RCHAR, RCHAR, RCHAR, 4145, RCHAR, 6285, RCHAR, 8546, RCHAR, 8131, RCHAR, RCHAR, RCHAR, RCHAR, 8673, RCHAR, RCHAR, 8712, 8083, 4543, RCHAR, RCHAR, 6710, RCHAR, 6321, RCHAR, 6087, RCHAR, RCHAR, RCHAR, 4074, RCHAR, 4682, RCHAR, RCHAR, RCHAR, RCHAR, 5481, RCHAR, RCHAR, 5987, RCHAR, RCHAR, RCHAR, 8406, RCHAR, RCHAR, 6060, RCHAR, 3877, RCHAR, RCHAR, RCHAR, 7677, 7560, // [0x8A50,0x8A79] -v # seg 1122 at pos 20742 5814, RCHAR, RCHAR, RCHAR, 7488, 8213, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7281, RCHAR, RCHAR, 5815, RCHAR, 6620, RCHAR, 6192, 6644, RCHAR, RCHAR, 6246, RCHAR, RCHAR, 6247, RCHAR, RCHAR, RCHAR, 4411, 7343, RCHAR, 8741, 8558, 8382, 5884, RCHAR, 5971, RCHAR, RCHAR, RCHAR, 7859, // [0x8A85,0x8B04] -v # seg 1124 at pos 20784 7561, RCHAR, 4232, RCHAR, RCHAR, RCHAR, RCHAR, 7641, 7116, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5926, RCHAR, 8094, RCHAR, RCHAR, 6970, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6453, RCHAR, 6019, 4146, RCHAR, 5347, 6679, 4181, 6088, RCHAR, 8632, RCHAR, 5988, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6142, RCHAR, 4233, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5739, RCHAR, RCHAR, 7049, RCHAR, 7016, 7489, RCHAR, RCHAR, 7860, RCHAR, 6193, RCHAR, RCHAR, 4739, RCHAR, RCHAR, RCHAR, 7876, RCHAR, 7258, RCHAR, 7951, RCHAR, RCHAR, 4950, RCHAR, RCHAR, RCHAR, 5050, RCHAR, RCHAR, RCHAR, RCHAR, 6971, 7868, RCHAR, RCHAR, RCHAR, RCHAR, 6248, RCHAR, RCHAR, RCHAR, RCHAR, 7885, 8383, RCHAR, RCHAR, 7416, 3916, RCHAR, 6972, 7174, RCHAR, RCHAR, 8688, RCHAR, RCHAR, RCHAR, RCHAR, 6303, 8275, 7444, RCHAR, 6467, RCHAR, RCHAR, RCHAR, 4582, RCHAR, 5302, 6352, 6922, RCHAR, 4880, // [0x8B0E,0x8B20] -v # seg 1126 at pos 20912 5383, RCHAR, 5402, RCHAR, RCHAR, RCHAR, 8315, RCHAR, 6073, 5482, RCHAR, 4078, 7097, 3974, RCHAR, 5816, RCHAR, RCHAR, 6777, // [0x8B28,0x8B39] -v # seg 1128 at pos 20931 5303, RCHAR, RCHAR, 7304, 5104, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4359, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4462, // [0x8B41,0x8B41] -> [ 8559, 8559] # seg 1130 // [0x8B49,0x8B4F] -v # seg 1132 at pos 20949 7610, RCHAR, RCHAR, RCHAR, RCHAR, 8697, 4544, // [0x8B58,0x8B5C] -v # seg 1134 at pos 20956 6262, RCHAR, 4740, RCHAR, 5592, // [0x8B66,0x8B80] -v # seg 1136 at pos 20961 4118, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5740, RCHAR, RCHAR, 6512, 7050, RCHAR, RCHAR, RCHAR, 4066, RCHAR, RCHAR, 8521, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6645, RCHAR, RCHAR, 4826, // [0x8B8A,0x8B9A] -v # seg 1138 at pos 20988 5553, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6143, RCHAR, 7763, 6442, RCHAR, RCHAR, 7764, RCHAR, RCHAR, RCHAR, 7745, // [0x8C37,0x8C37] -> [ 4194, 4194] # seg 1140 // [0x8C3F,0x8C4C] -v # seg 1142 at pos 21005 4147, RCHAR, 8588, RCHAR, RCHAR, RCHAR, RCHAR, 4864, RCHAR, 4545, RCHAR, 8276, RCHAR, 6726, // [0x8C55,0x8C61] -v # seg 1144 at pos 21019 6249, RCHAR, RCHAR, RCHAR, RCHAR, 4835, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5885, // [0x8C6A,0x8C6B] -v # seg 1146 at pos 21032 8522, 6646, // [0x8C79,0x8C7A] -v # seg 1148 at pos 21034 8268, 6250, // [0x8C82,0x8C82] -> [ 7911, 7911] # seg 1150 // [0x8C8A,0x8C8C] -v # seg 1152 at pos 21036 5240, RCHAR, 5304, // [0x8C9D,0x8D16] -v # seg 1154 at pos 21039 8192, 7417, RCHAR, 5661, 7252, 4223, RCHAR, RCHAR, RCHAR, RCHAR, 5757, 8560, 8175, 8100, 4256, 7802, RCHAR, RCHAR, 7282, 6029, RCHAR, RCHAR, 7084, 4417, RCHAR, 8208, 5235, 4771, RCHAR, RCHAR, 5741, 7869, 7083, RCHAR, 5348, 8308, 5690, 5062, 7141, 8633, RCHAR, RCHAR, 7175, 3878, RCHAR, 7305, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7678, RCHAR, 5758, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5063, RCHAR, 5817, RCHAR, 5886, RCHAR, 5502, RCHAR, 8436, 5236, 7834, RCHAR, 5662, RCHAR, RCHAR, RCHAR, 7698, RCHAR, RCHAR, 4807, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5064, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5663, 4360, 5890, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7643, 7990, RCHAR, 6998, 7611, RCHAR, 7746, RCHAR, RCHAR, 5996, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7235, RCHAR, RCHAR, 6074, // [0x8D64,0x8D77] -v # seg 1156 at pos 21161 7306, RCHAR, 5818, RCHAR, RCHAR, RCHAR, RCHAR, 8416, RCHAR, RCHAR, RCHAR, RCHAR, 7562, RCHAR, RCHAR, 4432, 5664, RCHAR, RCHAR, 4546, // [0x8D85,0x8D8A] -v # seg 1158 at pos 21181 7912, RCHAR, RCHAR, RCHAR, RCHAR, 6899, // [0x8D99,0x8D99] -> [ 7490, 7490] # seg 1160 // [0x8DA3,0x8DA8] -v # seg 1162 at pos 21187 8001, RCHAR, RCHAR, RCHAR, RCHAR, 7952, // [0x8DB3,0x8DBE] -v # seg 1164 at pos 21193 7500, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5665, RCHAR, RCHAR, RCHAR, 7644, // [0x8DC6,0x8DCF] -v # seg 1166 at pos 21205 8120, RCHAR, RCHAR, RCHAR, RCHAR, 5453, 7699, RCHAR, RCHAR, 3879, // [0x8DDB,0x8DF3] -v # seg 1168 at pos 21215 8168, RCHAR, 4016, RCHAR, RCHAR, RCHAR, 7307, RCHAR, 5972, RCHAR, RCHAR, RCHAR, RCHAR, 4234, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5037, RCHAR, RCHAR, RCHAR, 4808, // [0x8E0A,0x8E10] -v # seg 1170 at pos 21240 6808, RCHAR, RCHAR, RCHAR, RCHAR, 4745, 7835, // [0x8E1E,0x8E1E] -> [ 4017, 4017] # seg 1172 // [0x8E2A,0x8E35] -v # seg 1174 at pos 21247 7520, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6973, RCHAR, RCHAR, RCHAR, RCHAR, 7521, // [0x8E42,0x8E4A] -v # seg 1176 at pos 21259 6974, RCHAR, 7445, RCHAR, RCHAR, 4031, 4809, 7725, 8482, // [0x8E59,0x8E60] -v # seg 1178 at pos 21268 7971, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7308, 7819, // [0x8E74,0x8E76] -v # seg 1180 at pos 21276 7972, RCHAR, 4406, // [0x8E81,0x8E8D] -v # seg 1182 at pos 21279 7491, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7283, RCHAR, RCHAR, 7563, RCHAR, RCHAR, 6415, // [0x8EAA,0x8EAC] -v # seg 1184 at pos 21292 5160, 6286, 4392, // [0x8EC0,0x8EC0] -> [ 4361, 4361] # seg 1186 // [0x8ECA,0x8ED2] -v # seg 1188 at pos 21295 7726, 6353, 4412, 4381, RCHAR, RCHAR, RCHAR, RCHAR, 8410, // [0x8EDF,0x8EDF] -> [ 6552, 6552] # seg 1190 // [0x8EEB,0x8EEB] -> [ 7679, 7679] # seg 1192 // [0x8EF8,0x8F09] -v # seg 1194 at pos 21304 7973, RCHAR, RCHAR, 3880, RCHAR, RCHAR, 6263, RCHAR, RCHAR, RCHAR, RCHAR, 4311, RCHAR, 5038, RCHAR, RCHAR, RCHAR, 7253, // [0x8F12,0x8F4E] -v # seg 1196 at pos 21322 7870, 5203, 5593, 4119, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4951, 8031, 8689, 5223, 7848, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4987, 5575, RCHAR, 5503, 5114, RCHAR, RCHAR, RCHAR, RCHAR, 7707, RCHAR, RCHAR, RCHAR, 7564, RCHAR, RCHAR, RCHAR, RCHAR, 6144, 5607, RCHAR, 5608, RCHAR, RCHAR, 7344, 6496, RCHAR, RCHAR, RCHAR, RCHAR, 8332, 6892, RCHAR, RCHAR, RCHAR, 7345, RCHAR, RCHAR, RCHAR, 7849, 4312, // [0x8F5D,0x8F62] -v # seg 1198 at pos 21383 6497, RCHAR, 4291, RCHAR, RCHAR, 4976, // [0x8F9B,0x8FB2] -v # seg 1200 at pos 21389 6287, 4183, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4911, RCHAR, RCHAR, 8176, RCHAR, 5554, RCHAR, RCHAR, RCHAR, RCHAR, 5819, RCHAR, 5555, 7680, 6787, 4665, // [0x8FC2,0x8FC5] -v # seg 1202 at pos 21413 6837, RCHAR, RCHAR, 6289, // [0x8FCE,0x8FD4] -v # seg 1204 at pos 21417 6621, RCHAR, RCHAR, 4463, RCHAR, RCHAR, 5444, // [0x8FE6,0x9023] -v # seg 1206 at pos 21424 3881, RCHAR, RCHAR, RCHAR, 7309, 5419, RCHAR, 7700, RCHAR, RCHAR, 6200, RCHAR, 4047, RCHAR, RCHAR, RCHAR, RCHAR, 5384, RCHAR, 7310, RCHAR, RCHAR, RCHAR, 7953, RCHAR, RCHAR, 8143, 6089, 4262, 4810, RCHAR, 8664, 6514, RCHAR, 8472, RCHAR, RCHAR, 8248, RCHAR, 6061, RCHAR, 8149, 7974, 4362, RCHAR, RCHAR, 4811, 4120, RCHAR, 4865, RCHAR, 7284, 8138, RCHAR, RCHAR, 5927, 5014, 6075, 7492, 7587, 5626, 4988, // [0x902E,0x9099] -v # seg 1208 at pos 21486 7886, RCHAR, RCHAR, 7565, 7681, RCHAR, RCHAR, 4433, RCHAR, RCHAR, 7128, RCHAR, RCHAR, RCHAR, 8297, RCHAR, 6976, RCHAR, RCHAR, 4870, 6145, RCHAR, RCHAR, RCHAR, RCHAR, 6838, RCHAR, RCHAR, 6975, 6862, RCHAR, 8205, 4235, RCHAR, 8309, 8611, RCHAR, 4812, 4724, 6923, RCHAR, RCHAR, RCHAR, 6778, RCHAR, RCHAR, 6080, 4746, 7887, RCHAR, 6893, 6062, RCHAR, 4067, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7311, RCHAR, RCHAR, RCHAR, 7493, 7727, 4871, RCHAR, RCHAR, 7645, RCHAR, RCHAR, 7588, RCHAR, 7836, 5973, RCHAR, 6977, RCHAR, 5076, 4019, RCHAR, 8284, 6780, 5237, 8384, 6146, 8582, RCHAR, RCHAR, 7085, 5186, RCHAR, 5556, RCHAR, RCHAR, RCHAR, RCHAR, 4891, RCHAR, 7028, RCHAR, RCHAR, RCHAR, 6700, RCHAR, RCHAR, RCHAR, 5224, // [0x90A2,0x90B8] -v # seg 1210 at pos 21594 8473, 4576, RCHAR, RCHAR, 5483, RCHAR, 7925, RCHAR, 5820, RCHAR, RCHAR, RCHAR, RCHAR, 3944, 8121, 4363, RCHAR, RCHAR, RCHAR, 6063, RCHAR, RCHAR, 7285, // [0x90C1,0x90C1] -> [ 6851, 6851] # seg 1212 // [0x90CA,0x90CA] -> [ 4313, 4313] # seg 1214 // [0x90DE,0x90ED] -v # seg 1216 at pos 21617 4932, RCHAR, RCHAR, 4382, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5666, RCHAR, RCHAR, RCHAR, RCHAR, 4241, // [0x90F5,0x90F5] -> [ 6839, 6839] # seg 1218 // [0x90FD,0x9102] -v # seg 1220 at pos 21633 4813, RCHAR, RCHAR, RCHAR, RCHAR, 6336, // [0x9112,0x9119] -v # seg 1222 at pos 21639 7954, RCHAR, RCHAR, 8398, RCHAR, RCHAR, RCHAR, 5742, // [0x9127,0x9132] -v # seg 1224 at pos 21647 4881, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7418, RCHAR, RCHAR, RCHAR, RCHAR, 4718, // [0x9149,0x9152] -v # seg 1226 at pos 21659 6978, 7419, 7955, 7187, 5504, 7566, RCHAR, RCHAR, RCHAR, 7567, // [0x9162,0x916C] -v # seg 1228 at pos 21669 7913, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5277, 4899, RCHAR, 6147, // [0x9175,0x9178] -v # seg 1230 at pos 21680 8650, RCHAR, 8528, 5838, // [0x9187,0x9192] -v # seg 1232 at pos 21684 6194, RCHAR, 8002, RCHAR, 7914, RCHAR, 7446, RCHAR, RCHAR, RCHAR, RCHAR, 6020, // [0x919C,0x919C] -> [ 7956, 7956] # seg 1234 // [0x91AB,0x91B5] -v # seg 1236 at pos 21696 7051, 7236, RCHAR, 7915, 8483, RCHAR, 5454, RCHAR, RCHAR, 5023, 4004, // [0x91C0,0x91EA] -v # seg 1238 at pos 21707 6443, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7797, RCHAR, 6979, RCHAR, 5944, 5151, 7595, 6406, 4952, 5152, 4560, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6097, 7420, RCHAR, RCHAR, RCHAR, 5667, 8049, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7494, RCHAR, RCHAR, RCHAR, 7837, RCHAR, RCHAR, 6840, // [0x91F5,0x91F5] -> [ 7798, 7798] # seg 1240 // [0x920D,0x921E] -v # seg 1242 at pos 21750 4872, RCHAR, RCHAR, 4043, 8177, 5855, RCHAR, RCHAR, RCHAR, RCHAR, 7000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4440, // [0x9234,0x9249] -v # seg 1244 at pos 21768 5015, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6686, RCHAR, RCHAR, RCHAR, RCHAR, 7346, 3952, RCHAR, RCHAR, RCHAR, RCHAR, 4020, RCHAR, RCHAR, RCHAR, 8437, // [0x9257,0x9266] -v # seg 1246 at pos 21790 4079, RCHAR, RCHAR, RCHAR, 6556, RCHAR, RCHAR, 6900, RCHAR, RCHAR, RCHAR, 5455, RCHAR, 4364, 6201, 7421, // [0x9280,0x9285] -v # seg 1248 at pos 21806 7017, RCHAR, RCHAR, 7935, RCHAR, 4855, // [0x9291,0x929C] -v # seg 1250 at pos 21812 5974, RCHAR, 7347, RCHAR, RCHAR, 6148, RCHAR, 5278, RCHAR, RCHAR, RCHAR, 8342, // [0x92B3,0x92B9] -v # seg 1252 at pos 21824 6648, RCHAR, RCHAR, 4365, 6064, RCHAR, 6149, // [0x92CC,0x92D2] -v # seg 1254 at pos 21831 7422, RCHAR, RCHAR, 8454, RCHAR, RCHAR, 5627, // [0x92E4,0x92EA] -v # seg 1256 at pos 21838 5928, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8249, // [0x92F8,0x92FC] -v # seg 1258 at pos 21845 4021, RCHAR, RCHAR, RCHAR, 3975, // [0x9304,0x9304] -> [ 5047, 5047] # seg 1260 // [0x9310,0x9310] -> [ 7957, 7957] # seg 1262 // [0x9318,0x932F] -v # seg 1264 at pos 21850 7958, RCHAR, 7259, RCHAR, RCHAR, RCHAR, 6195, 4741, 7423, 4547, 7348, RCHAR, 4548, RCHAR, 4479, RCHAR, 5328, RCHAR, RCHAR, 5945, RCHAR, RCHAR, 4184, 7732, // [0x9348,0x935B] -v # seg 1266 at pos 21874 6623, RCHAR, 4989, 4236, RCHAR, 4814, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6337, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4719, // [0x936E,0x937E] -v # seg 1268 at pos 21894 6980, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4032, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8050, RCHAR, 7522, // [0x938C,0x938C] -> [ 4080, 4080] # seg 1270 // [0x9394,0x939A] -v # seg 1272 at pos 21911 6809, RCHAR, 6095, RCHAR, RCHAR, RCHAR, 7959, // [0x93A3,0x93B0] -v # seg 1274 at pos 21918 8474, RCHAR, RCHAR, RCHAR, 3996, RCHAR, RCHAR, RCHAR, RCHAR, 8523, 7682, RCHAR, RCHAR, 7129, // [0x93C3,0x93C3] -> [ 7501, 7501] # seg 1276 // [0x93D1,0x93D1] -> [ 7312, 7312] # seg 1278 // [0x93DE,0x93E4] -v # seg 1280 at pos 21932 6810, RCHAR, RCHAR, 4121, RCHAR, RCHAR, 5090, // [0x93F6,0x93F6] -> [ 7708, 7708] # seg 1282 // [0x9404,0x9404] -> [ 8638, 8638] # seg 1284 // [0x9418,0x9418] -> [ 7523, 7523] # seg 1286 // [0x9425,0x942B] -v # seg 1288 at pos 21939 5975, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7349, // [0x9435,0x9438] -v # seg 1290 at pos 21946 7850, RCHAR, RCHAR, 8084, // [0x9444,0x9444] -> [ 7568, 7568] # seg 1292 // [0x9451,0x9452] -> [ 3945, 3946] # seg 1294 // [0x945B,0x945B] -> [ 4275, 4275] # seg 1296 // [0x947D,0x947F] -v # seg 1298 at pos 21950 7747, RCHAR, 7733, // [0x9577,0x9577] -> [ 7237, 7237] # seg 1300 // [0x9580,0x9598] -v # seg 1302 at pos 21953 5363, RCHAR, RCHAR, 5997, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8222, RCHAR, 3997, RCHAR, RCHAR, RCHAR, 7001, RCHAR, 8327, 8328, 3917, 5399, RCHAR, RCHAR, RCHAR, 3953, // [0x95A3,0x95B1] -v # seg 1304 at pos 21978 3893, 8349, 5527, RCHAR, RCHAR, 4434, RCHAR, RCHAR, RCHAR, RCHAR, 4966, RCHAR, RCHAR, RCHAR, 6568, // [0x95BB,0x95BC] -v # seg 1306 at pos 21993 6581, 6354, // [0x95C7,0x95CA] -v # seg 1308 at pos 21995 6362, RCHAR, RCHAR, 8589, // [0x95D4,0x95E2] -v # seg 1310 at pos 21999 8350, 4407, 8153, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4257, RCHAR, RCHAR, RCHAR, RCHAR, 7838, 5548, // [0x961C,0x9621] -v # seg 1312 at pos 22014 5668, RCHAR, RCHAR, RCHAR, RCHAR, 7839, // [0x962A,0x9632] -v # seg 1314 at pos 22020 8178, RCHAR, RCHAR, RCHAR, 6727, RCHAR, RCHAR, RCHAR, 5484, // [0x963B,0x9650] -v # seg 1316 at pos 22029 7495, RCHAR, RCHAR, RCHAR, 6322, 8066, RCHAR, 8285, RCHAR, 5669, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5091, 5241, 3976, RCHAR, RCHAR, 8329, // [0x965B,0x967D] -v # seg 1318 at pos 22051 8223, 8351, 5998, 6222, 7820, RCHAR, RCHAR, 6895, 7683, 7447, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5505, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7023, RCHAR, RCHAR, 7684, RCHAR, 5128, 4815, 8343, 5108, RCHAR, RCHAR, RCHAR, RCHAR, 6444, // [0x9685,0x9707] -v # seg 1320 at pos 22086 6841, 5119, RCHAR, RCHAR, RCHAR, 4772, 6150, RCHAR, 8612, 4148, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4057, 6863, RCHAR, RCHAR, 6383, 4449, RCHAR, 7448, 7238, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5161, RCHAR, RCHAR, RCHAR, 6151, 6152, RCHAR, 8412, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7018, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5024, RCHAR, RCHAR, RCHAR, 7821, RCHAR, RCHAR, RCHAR, RCHAR, 7188, 6347, RCHAR, RCHAR, 6870, 6323, 7709, 4185, RCHAR, 8032, RCHAR, 7589, 7176, 6701, 7286, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7496, 6153, RCHAR, RCHAR, 6307, RCHAR, 7960, 7201, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5153, 4592, RCHAR, RCHAR, RCHAR, RCHAR, 6842, 6843, 5989, RCHAR, RCHAR, RCHAR, RCHAR, 5364, 5691, RCHAR, 6864, RCHAR, RCHAR, RCHAR, 5016, 5065, RCHAR, 5420, RCHAR, 7350, RCHAR, RCHAR, RCHAR, RCHAR, 6154, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7424, 7685, // [0x9711,0x971E] -v # seg 1322 at pos 22217 7368, RCHAR, 6650, RCHAR, RCHAR, 5168, RCHAR, RCHAR, 6625, RCHAR, RCHAR, 5887, RCHAR, 8310, // [0x9727,0x9727] -> [ 5349, 5349] # seg 1324 // [0x9730,0x9748] -v # seg 1326 at pos 22231 5839, RCHAR, 5039, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5549, RCHAR, RCHAR, RCHAR, 7449, RCHAR, RCHAR, RCHAR, RCHAR, 4977, RCHAR, 6384, RCHAR, RCHAR, RCHAR, 5017, // [0x9751,0x977A] -v # seg 1328 at pos 22256 7877, RCHAR, RCHAR, RCHAR, RCHAR, 7425, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7426, RCHAR, 5743, RCHAR, RCHAR, 5385, 5261, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8417, RCHAR, RCHAR, RCHAR, 7118, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8561, RCHAR, RCHAR, 7119, RCHAR, RCHAR, 5212, // [0x978B,0x978F] -v # seg 1330 at pos 22298 8484, RCHAR, 6348, RCHAR, 4224, // [0x97A0,0x97A0] -> [ 4374, 4374] # seg 1332 // [0x97A8,0x97AD] -v # seg 1334 at pos 22303 3927, RCHAR, RCHAR, 4375, RCHAR, 8206, // [0x97C6,0x97CB] -v # seg 1336 at pos 22309 7840, RCHAR, RCHAR, RCHAR, RCHAR, 6924, // [0x97D3,0x97D3] -> [ 8330, 8330] # seg 1338 // [0x97DC,0x97DC] -> [ 4816, 4816] # seg 1340 // [0x97F3,0x9818] -v # seg 1342 at pos 22315 7024, RCHAR, RCHAR, 6065, RCHAR, RCHAR, RCHAR, RCHAR, 6865, RCHAR, RCHAR, RCHAR, 8399, 8524, 8442, 7427, 4122, RCHAR, 8368, 6196, RCHAR, 6155, RCHAR, 6852, RCHAR, 6090, RCHAR, RCHAR, RCHAR, 6651, 6728, 5445, 4836, RCHAR, RCHAR, RCHAR, 8169, 5018, // [0x982D,0x9830] -v # seg 1344 at pos 22353 4866, RCHAR, RCHAR, 8455, // [0x9838,0x983B] -v # seg 1346 at pos 22357 4123, 8144, RCHAR, 5759, // [0x9846,0x986F] -v # seg 1348 at pos 22361 4237, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7450, 6391, 6338, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6349, RCHAR, RCHAR, RCHAR, 6896, RCHAR, 7351, RCHAR, RCHAR, RCHAR, 5105, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8525, RCHAR, 4186, RCHAR, RCHAR, RCHAR, 7352, RCHAR, RCHAR, RCHAR, 8438, // [0x98A8,0x98B1] -v # seg 1350 at pos 22403 8277, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5856, RCHAR, 8122, // [0x98C4,0x98C7] -v # seg 1352 at pos 22413 8270, RCHAR, RCHAR, 8269, // [0x98DB,0x98E2] -v # seg 1354 at pos 22417 5744, 5523, RCHAR, RCHAR, 6264, RCHAR, 6081, 4549, // [0x98ED,0x98F4] -v # seg 1356 at pos 22425 8037, 7025, 5446, RCHAR, RCHAR, RCHAR, RCHAR, 7088, // [0x98FC,0x9920] -v # seg 1358 at pos 22433 5821, 8250, 6265, RCHAR, RCHAR, RCHAR, RCHAR, 4314, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8400, 6446, RCHAR, 7089, RCHAR, RCHAR, RCHAR, 7748, RCHAR, RCHAR, 6324, RCHAR, RCHAR, RCHAR, RCHAR, 6499, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7353, RCHAR, 5576, // [0x9928,0x9928] -> [ 4258, 4258] # seg 1360 // [0x9945,0x9957] -v # seg 1362 at pos 22470 5204, RCHAR, RCHAR, RCHAR, 4464, RCHAR, 4413, 7749, 5976, RCHAR, RCHAR, RCHAR, 4550, 6781, RCHAR, 6702, RCHAR, RCHAR, 8401, // [0x9996,0x999D] -v # seg 1364 at pos 22489 6156, RCHAR, RCHAR, 8402, RCHAR, RCHAR, RCHAR, 8295, // [0x99A5,0x99B9] -v # seg 1366 at pos 22497 5609, RCHAR, RCHAR, 8475, RCHAR, RCHAR, RCHAR, 5178, 6454, 8278, RCHAR, RCHAR, 8067, RCHAR, 8033, 6197, RCHAR, RCHAR, RCHAR, RCHAR, 7130, // [0x99C1,0x99C1] -> [ 5421, 5421] # seg 1368 // [0x99D0,0x99DF] -v # seg 1370 at pos 22518 7569, 4649, 4366, RCHAR, RCHAR, 3882, RCHAR, RCHAR, RCHAR, 5670, RCHAR, RCHAR, RCHAR, 8068, RCHAR, 5822, // [0x99ED,0x99F1] -v # seg 1372 at pos 22534 8385, RCHAR, RCHAR, RCHAR, 4900, // [0x99FF,0x9A0F] -v # seg 1374 at pos 22539 7590, RCHAR, 5763, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5577, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4551, 4552, // [0x9A19,0x9A19] -> [ 8207, 8207] # seg 1376 // [0x9A2B,0x9A37] -v # seg 1378 at pos 22556 4033, RCHAR, RCHAR, RCHAR, RCHAR, 4882, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7961, 6066, // [0x9A40,0x9A45] -v # seg 1380 at pos 22569 5242, RCHAR, RCHAR, 8271, RCHAR, 4367, // [0x9A4D,0x9A4D] -> [ 8651, 8651] # seg 1382 // [0x9A55,0x9A6A] -v # seg 1384 at pos 22575 4315, RCHAR, 8413, RCHAR, RCHAR, 4124, 6515, RCHAR, RCHAR, RCHAR, 8003, RCHAR, RCHAR, 4967, RCHAR, RCHAR, 4553, RCHAR, RCHAR, RCHAR, 8583, 4968, // [0x9AA8,0x9AA8] -> [ 4208, 4208] # seg 1386 // [0x9AB8,0x9AB8] -> [ 8386, 8386] # seg 1388 // [0x9AD3,0x9AD8] -v # seg 1390 at pos 22597 6157, 7888, RCHAR, RCHAR, RCHAR, 4187, // [0x9AE5,0x9AE5] -> [ 6582, 6582] # seg 1392 // [0x9AEE,0x9AEE] -> [ 5456, 5456] # seg 1394 // [0x9B1A,0x9B1A] -> [ 6158, 6158] # seg 1396 // [0x9B27,0x9B31] -v # seg 1398 at pos 22603 5077, RCHAR, RCHAR, 8150, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6867, // [0x9B3C,0x9B45] -v # seg 1400 at pos 22614 4418, RCHAR, RCHAR, RCHAR, RCHAR, 4287, 8534, 5457, 5513, 5238, // [0x9B4F,0x9B5A] -v # seg 1402 at pos 22624 6925, RCHAR, RCHAR, RCHAR, RCHAR, 5179, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6455, // [0x9B6F,0x9B6F] -> [ 5040, 5040] # seg 1404 // [0x9B8E,0x9B91] -v # seg 1406 at pos 22636 7369, RCHAR, RCHAR, 8251, // [0x9B9F,0x9B9F] -> [ 6350, 6350] # seg 1408 // [0x9BAB,0x9BAE] -v # seg 1410 at pos 22640 4316, RCHAR, RCHAR, 5977, // [0x9BC9,0x9BC9] -> [ 5154, 5154] # seg 1412 // [0x9BD6,0x9BD6] -> [ 7878, 7878] # seg 1414 // [0x9BE4,0x9BE8] -v # seg 1416 at pos 22644 4205, RCHAR, RCHAR, RCHAR, 4125, // [0x9C0D,0x9C15] -v # seg 1418 at pos 22649 7962, RCHAR, RCHAR, 6339, RCHAR, 5610, RCHAR, RCHAR, 8311, // [0x9C25,0x9C25] -> [ 8584, 8584] # seg 1420 // [0x9C32,0x9C32] -> [ 6680, 6680] # seg 1422 // [0x9C3B,0x9C3B] -> [ 5205, 5205] # seg 1424 // [0x9C47,0x9C49] -v # seg 1426 at pos 22658 3977, RCHAR, 5559, // [0x9C57,0x9C57] -> [ 5162, 5162] # seg 1428 // [0x9CE5,0x9CE9] -v # seg 1430 at pos 22661 7497, RCHAR, 5671, RCHAR, 4368, // [0x9CF3,0x9CF6] -v # seg 1432 at pos 22666 5628, 5279, RCHAR, 6558, // [0x9D09,0x9D09] -> [ 6325, 6325] # seg 1434 // [0x9D1B,0x9D1B] -> [ 6897, 6897] # seg 1436 // [0x9D26,0x9D28] -v # seg 1438 at pos 22670 6373, RCHAR, 6366, // [0x9D3B,0x9D3B] -> [ 8547, 8547] # seg 1440 // [0x9D51,0x9D51] -> [ 4068, 4068] # seg 1442 // [0x9D5D,0x9D61] -v # seg 1444 at pos 22673 6326, RCHAR, RCHAR, 4195, 5350, // [0x9D6C,0x9D72] -v # seg 1446 at pos 22678 5702, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7189, // [0x9DA9,0x9DB4] -v # seg 1448 at pos 22685 5311, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6394, RCHAR, RCHAR, RCHAR, RCHAR, 8316, // [0x9DC4,0x9DC4] -> [ 4149, 4149] # seg 1450 // [0x9DD7,0x9DD7] -> [ 4369, 4369] # seg 1452 // [0x9DF2,0x9DFA] -v # seg 1454 at pos 22697 8004, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8698, 7032, 5041, // [0x9E1A,0x9E1E] -v # seg 1456 at pos 22706 6395, RCHAR, RCHAR, RCHAR, 4909, // [0x9E75,0x9E7F] -v # seg 1458 at pos 22711 5042, RCHAR, RCHAR, RCHAR, 8344, RCHAR, RCHAR, RCHAR, 6583, RCHAR, 5048, // [0x9E92,0x9EA5] -v # seg 1460 at pos 22722 4554, 5049, RCHAR, RCHAR, RCHAR, 4969, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5823, RCHAR, 5163, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5243, // [0x9EB4,0x9EC3] -v # seg 1462 at pos 22742 4376, 5262, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5180, RCHAR, RCHAR, 8690, RCHAR, RCHAR, RCHAR, RCHAR, 8613, // [0x9ECD,0x9EDE] -v # seg 1464 at pos 22758 5929, 4970, RCHAR, RCHAR, 8704, RCHAR, RCHAR, 4044, RCHAR, RCHAR, RCHAR, 5352, RCHAR, RCHAR, 4773, 7980, RCHAR, 7370, // [0x9EE8,0x9EE8] -> [ 4757, 4757] # seg 1466 // [0x9EF4,0x9EF4] -> [ 5386, 5386] # seg 1468 // [0x9F07,0x9F13] -v # seg 1470 at pos 22776 6681, 5560, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7428, RCHAR, RCHAR, RCHAR, RCHAR, 4188, // [0x9F20,0x9F20] -> [ 5930, 5930] # seg 1472 // [0x9F3B,0x9F3B] -> [ 5745, 5745] # seg 1474 // [0x9F4A,0x9F52] -v # seg 1476 at pos 22789 7451, 7254, RCHAR, RCHAR, 7255, RCHAR, RCHAR, RCHAR, 8034, // [0x9F5F,0x9F6C] -v # seg 1478 at pos 22798 7287, RCHAR, 5019, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5990, RCHAR, RCHAR, 7734, RCHAR, 6456, // [0x9F77,0x9F77] -> [ 6340, 6340] # seg 1480 // [0x9F8D,0x9F9C] -v # seg 1482 at pos 22812 5078, RCHAR, RCHAR, 5485, RCHAR, RCHAR, RCHAR, RCHAR, 3947, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4370, // [0xF900,0xF938] -v # seg 1486 at pos 22828 3995, 4001, 4018, 4182, 4207, 4242, 4414, 4419, 4441, 4465, 4478, 4563, 4564, 4567, 4570, 4571, 4572, 4573, 4574, 4575, 4577, 4578, 4579, 4580, 4581, 4583, 4584, 4585, 4586, 4588, 4590, 4591, 4593, 4597, 4601, 4603, 4604, 4605, 4607, 4608, 4612, 4613, 4614, 4615, 4616, 4618, 4623, 4635, 4639, 4640, 4641, 4643, 4644, 4645, 4646, 4647, 4648, // [0xF939,0xF943] -> [ 4650, 4660] # seg 1487 // [0xF944,0xFA0B] -v # seg 1488 at pos 22885 4662, 4663, 4667, 4668, 4670, 4671, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4685, 4686, 4687, 4688, 4689, 4690, 4692, 4693, 4863, 4885, 4892, 4898, 4901, 5005, 5026, 5118, 5143, 5488, 5519, 5550, 5644, 5692, 5723, 5825, 5827, 5846, 5892, 5899, 6002, 6028, 6092, 6288, 6298, 6306, 6405, 6408, 6409, 6416, 6418, 6419, 6427, 6437, 6439, 6441, 6445, 6481, 6482, 6483, 6485, 6486, 6489, 6492, 6498, 6500, 6501, 6502, 6504, 6508, 6509, 6513, 6521, 6523, 6524, 6527, 6535, 6539, 6542, 6545, 6548, 6550, 6553, 6554, 6555, 6557, 6559, 6560, 6561, 6564, 6566, 6567, 6570, 6571, 6572, 6574, 6580, 6585, 6588, 6589, 6591, 6592, 6595, 6610, 6612, 6617, 6618, 6622, 6624, 6626, 6627, 6630, 6642, 6647, 6649, 6666, 6744, 6745, 6753, 6754, 6760, 6762, 6764, 6767, 6774, 6779, 6811, 6854, 6894, 6930, 6945, 6948, 6953, 6955, 6959, 6962, 6964, 6965, 6981, 6982, 6984, 6988, 6989, 6993, 6994, 6999, 7002, 7003, 7004, 7005, 7011, 7055, 7056, 7059, 7064, 7065, 7066, 7067, 7070, 7073, 7075, 7081, 7082, 7086, 7087, 7090, 7091, 7102, 7110, 7111, 7114, 7117, 7120, 7121, 7136, 7137, 7139, 7144, 7145, 7146, 7221, 7296, 7642, 7703, 7724, 7808, 7879, 8073, 8075, 8107, 8123, 8134, 8236, 8257, 8366, 8367, 8435, 8562, // [0xFF01,0xFF3B] -> [ 188, 246] # seg 1490 // [0xFF3C,0xFF3C] -> [ 11, 11] # seg 1491 // [0xFF3D,0xFF5D] -> [ 248, 280] # seg 1492 // [0xFF5E,0xFF5E] -> [ 99, 99] # seg 1493 // [0xFFE0,0xFFE6] -v # seg 1495 at pos 23085 42, 43, 93, 281, RCHAR, 44, 247, }; // Simplified Chinese GB18030-2000 const unsigned short CodePageGB18030[17420] = { // hot segments (indexes into segment table) 2, 0, 35, // number of segments 659, // segment table 0, 94, 104, 110, 130, 150, 160, 162, 172, 174, 186, 192, 281, 282, 365, 376, 462, 470, 487, 502, 519, 555, 564, 571, 597, 612, 619, 645, 658, 694, 731, 752, 755, 831, 846, 1410, 8178, 8836, 8880, 8890, 9034, 9043, 9077, 9090, 9106, 9117, 9154, 9163, 9178, 9199, 9215, 9234, 9243, 9254, 9268, 9278, 9287, 9301, 9330, 9400, 9409, 9486, 9496, 9527, 9537, 9564, 9575, 9583, 9614, 9624, 9921, 9930, 10013, 10025, 10073, 10088, 10099, 10110, 10123, 10132, 10159, 10176, 10261, 10270, 10348, 10362, 10393, 10410, 10440, 10458, 10465, 10476, 10479, 10493, 10568, 10581, 10652, 10664, 10716, 10726, 10743, 10752, 10758, 10776, 10783, 10797, 10847, 10870, 10882, 10908, 10919, 10934, 10990, 10999, 11164, 11174, 11233, 11244, 11247, 11258, 11265, 11278, 11300, 11303, 11328, 11341, 11348, 11361, 11438, 11453, 11489, 11499, 11511, 11523, 11524, 11533, 11575, 11590, 11850, 11869, 11877, 11912, 11931, 11946, 11955, 11957, 11967, 11988, 12005, 12019, 12028, 12370, 12380, 12389, 12398, 12454, 12479, 12487, 12495, 12500, 12512, 12562, 12577, 12746, 12755, 12773, 12799, 12932, 12942, 13010, 13020, 13030, 13039, 13055, 13065, 13076, 13086, 13111, 13121, 13144, 13156, 13182, 13199, 13244, 13254, 13295, 13307, 13311, 13321, 13322, 13332, 13344, 13404, 13415, 13430, 13439, 13462, 13577, 13579, 13589, 13606, 13618, 13626, 13628, 13642, 14059, 14070, 14072, 14087, 14150, 14160, 14185, 14195, 14226, 14236, 14273, 14286, 14295, 14306, 14330, 14341, 14342, 14354, 14387, 14395, 14402, 14419, 14422, 14440, 14442, 14456, 14468, 14496, 14509, 14522, 14535, 14557, 14568, 14577, 14588, 14596, 14600, 14614, 14620, 14633, 14702, 14711, 14721, 14726, 14736, 14747, 14757, 14769, 14791, 14801, 14864, 14876, 14888, 14916, 15588, 15608, 15644, 15659, 15673, 15684, 15693, 15724, 15734, 15738, 15752, 15757, 15769, 15770, 15780, 15834, 15847, 15862, 15873, 15874, 15888, 15967, 15983, 15990, 15999, 16023, 16042, 16045, 16058, 16082, 16093, 16102, 16118, 16141, 16150, 16417, 16427, 16436, 16439, 16449, 16493, 16504, 16556, 16568, 16582, 16594, 16613, 16626, 16635, 16709, 16721, 16729, 16733, 16743, 16793, 16807, 16829, 16842, 16852, 16857, 16872, 16884, 16893, 16929, 16939, 16951, 16962, 17032, 17047, 17059, 17069, 17074, 17098, 17135, 17146, 17157, 17167, 17183, 17192, 17249, 17260, 17392, 17405, 17411, 17422, 17459, 17465, 17476, 17551, 17565, 17586, 17597, 17659, 17667, 17713, 17720, 17860, 17870, 17928, 17952, 17976, 17986, 18148, 18162, 18168, 18181, 18250, 18263, 18365, 18387, 18546, 18556, 18720, 18730, 18782, 18795, 18836, 18847, 18849, 18861, 18876, 18885, 18895, 18904, 18915, 18929, 18938, 18958, 18969, 19029, 19046, 19054, 19065, 19069, 19085, 19086, 19100, 19103, 19119, 19385, 19395, 19427, 19442, 19619, 19629, 19631, 19656, 19662, 19682, 19689, 19747, 19772, 19784, 19790, 19844, 19853, 19901, 19916, 19924, 20039, 20069, 20132, 20137, 20188, 20196, 20205, 20271, 20403, 20417, 20426, 20439, 20449, 20452, 20465, 20562, 20574, 20612, 20624, 20635, 20654, 20805, 21004, 21024, 21031, 21042, 21050, 21059, 21122, 21134, 21137, 21147, 21298, 21323, 21354, 21379, 21496, 21539, 21575, 21633, 21644, 21747, 21791, 21816, 21848, 21952, 22004, 22017, 22029, 22039, 22047, 22065, 22075, 22114, 22125, 22139, 22158, 22171, 22180, 22228, 22277, 22284, 22410, 22416, 22454, 22469, 22505, 22507, 22536, 22573, 22586, 22598, 22609, 22611, 22806, 22864, 22873, 22894, 22905, 22908, 22919, 22941, 23236, 23268, 23584, 23608, 23618, 23632, 23641, 23648, 23661, 23697, 23706, 23708, 23720, 23735, 23744, 23761, 23772, 23817, 23819, 23831, 23940, 23976, 23990, 24021, 24029, 24049, 24066, 24073, 24088, 24112, 24119, 24148, 24246, 24253, 24281, 24368, 24383, 24484, 24485, 24498, 24681, 24690, 24745, 24759, 24760, 31862, 31874, 31883, 31890, 32002, 32088, 32092, 32104, 32114, 32176, 32180, 32202, 32204, 32314, 32346, 32356, 32364, 32377, 32385, 32422, 32425, 32436, 32461, 32543, 32876, 32886, 32986, 32990, 33003, 33006, 33016, 33032, 33040, 33048, 33053, 33071, 33102, 33104, 33158, 33159, 35269, 35276, 35286, 35301, 35315, 35329, 35622, 35634, 35654, 35676, 35922, 35929, 36042, 36276, 36288, 36290, 36324, 36333, 36337, 36450, 36493, 36791, 36902, 36913, 37678, 37763, 37859, 37873, 38020, 38238, 38525, 38638, 39523, 39787, 40258, 40374, 40378, 40421, 40669, 41042, 41062, 41255, 41260, 41342, 41358, 41799, 41849, 41856, 41876, 41879, 41901, 42604, 42643, 42754, 42902, 42983, 57409, 57411, 57424, 57460, 57476, 57490, 61785, 61861, 61888, 61969, 61978, 62004, 62018, 63048, 63056, 63205, 63334, 63360, // compressed segments RCHAR, 0x2170, 0xE766, 0x2488, 0x2474, 0x2460, RCHAR, 0x3220, 0xE76E, 0x2160, RCHAR, 0xFF05, 0xFFE3, 0x3041, 0xE772, 0x30A1, 0xE77D, 0x0391, RCHAR, 0x03B1, RCHAR, 0xE797, RCHAR, 0x0416, 0xE7A0, RCHAR, 0x0436, 0xE7AF, RCHAR, 0x3105, 0xE7CD, 0xE7FE, 0x2500, 0xE801, 0xE000, RCHAR, 0xE234, RCHAR, 0x4E74, RCHAR, 0x4FB6, RCHAR, 0x4FFF, RCHAR, 0x502F, RCHAR, 0x506D, RCHAR, 0x508E, RCHAR, 0x50BC, RCHAR, 0x50DB, RCHAR, 0x50FC, RCHAR, 0x5113, 0x5122, RCHAR, 0x51D2, RCHAR, 0x5273, RCHAR, 0x52B4, RCHAR, 0x52E5, 0x52F1, RCHAR, 0x532F, RCHAR, 0x55A8, RCHAR, 0x5640, RCHAR, 0x5694, 0x56A4, RCHAR, 0x56BD, 0x56CB, RCHAR, 0x570B, RCHAR, 0x57B9, RCHAR, 0x5836, RCHAR, 0x586D, RCHAR, 0x58AA, RCHAR, 0x58C6, 0x58D2, 0x58D6, RCHAR, 0x5966, RCHAR, 0x59ED, RCHAR, 0x5A4B, RCHAR, 0x5A6B, RCHAR, 0x5A80, 0x5A93, 0x5A9C, RCHAR, 0x5AF2, 0x5B0A, 0x5B18, RCHAR, 0x5B41, RCHAR, 0x5BD4, RCHAR, 0x5CF1, RCHAR, 0x5D4D, RCHAR, 0x5D5E, RCHAR, 0x5D75, 0x5D83, 0x5D9A, 0x5D9E, 0x5DB8, 0x5DC6, 0x5DCE, RCHAR, 0x5E63, RCHAR, 0x5EBF, RCHAR, 0x5EDC, 0x5EE9, 0x5EEB, RCHAR, 0x5F41, RCHAR, 0x612C, 0x6140, RCHAR, 0x6178, RCHAR, 0x619E, 0x61AA, 0x61AD, RCHAR, 0x61D5, 0x61E7, 0x61F6, RCHAR, 0x646E, RCHAR, 0x6488, RCHAR, 0x64E7, 0x6501, 0x650A, 0x6513, 0x6519, RCHAR, 0x6578, RCHAR, 0x669E, RCHAR, 0x66BF, RCHAR, 0x67C5, RCHAR, 0x6856, RCHAR, 0x6878, RCHAR, 0x6898, RCHAR, 0x68B6, RCHAR, 0x68E4, RCHAR, 0x6913, RCHAR, 0x6943, RCHAR, 0x699D, RCHAR, 0x69E1, 0x69EE, 0x69F3, 0x69FE, 0x6A00, 0x6A0B, RCHAR, 0x6A66, RCHAR, 0x6A85, RCHAR, 0x6AAD, 0x6B25, 0x6B28, RCHAR, 0x6B4D, 0x6B5A, 0x6B68, 0x6B6B, RCHAR, 0x6E60, 0x6E6C, 0x6E6F, RCHAR, 0x6EEA, RCHAR, 0x6F16, RCHAR, 0x6F4E, RCHAR, 0x6F8F, RCHAR, 0x6FA8, RCHAR, 0x6FD3, 0x6FDF, 0x6FE2, 0x6FF0, 0x7012, 0x701C, 0x7024, 0x7036, 0x703A, 0x704D, 0x7050, 0x705F, RCHAR, 0x709E, RCHAR, 0x70CB, RCHAR, 0x70FE, RCHAR, 0x711B, 0x7127, 0x7132, 0x7137, RCHAR, 0x714F, RCHAR, 0x71BA, 0x71C4, 0x71CF, 0x71D6, RCHAR, 0x71EF, 0x71FA, 0x7207, 0x721E, RCHAR, 0x7293, 0x72A0, RCHAR, 0xE4C6, RCHAR, 0x2550, 0x2581, RCHAR, 0xE7BC, 0x3021, RCHAR, 0xFE49, 0xFE54, 0xFE59, RCHAR, 0x2FF0, 0x3007, 0xE7F4, RCHAR, 0x7340, RCHAR, 0x7361, 0x736E, 0x7370, RCHAR, 0x73F3, RCHAR, 0x7411, RCHAR, 0x7442, RCHAR, 0x7460, RCHAR, 0x7491, RCHAR, 0x74AA, 0x74BB, 0x74D3, RCHAR, 0x769A, 0x76A5, RCHAR, 0x76B5, RCHAR, 0x770E, RCHAR, 0x776D, RCHAR, 0x7793, RCHAR, 0x77C0, 0x77CE, RCHAR, 0x785E, 0x786F, 0x7878, 0x787D, RCHAR, 0x78DA, RCHAR, 0x7906, 0x7914, 0x791F, 0x7925, RCHAR, 0x794A, RCHAR, 0x7990, 0x799B, 0x79A8, RCHAR, 0x7A24, RCHAR, 0x7A47, 0x7A52, 0x7A58, RCHAR, 0x7AB4, 0x7AC0, 0x7ACC, RCHAR, 0x7AF0, RCHAR, 0x7B63, RCHAR, 0x7C2B, 0x7C39, 0x7C42, 0x7C4E, 0x7C75, 0x7C7E, RCHAR, 0x7CFC, 0x7D0B, RCHAR, 0x7D30, 0x7D6F, 0x7D78, 0x7DA7, 0x7DAF, RCHAR, 0x7E48, 0x7E83, RCHAR, 0x7F46, RCHAR, 0x805B, 0x806B, 0x8072, RCHAR, 0x811F, RCHAR, 0x81CD, RCHAR, 0x831D, RCHAR, 0x8447, RCHAR, 0x84A2, RCHAR, 0x84F1, 0x84FD, 0x8500, RCHAR, 0x8522, 0x852D, RCHAR, 0x854B, RCHAR, 0x8569, RCHAR, 0x8590, RCHAR, 0x85EA, RCHAR, 0x8606, 0x8612, 0x8617, 0x8628, 0x862A, 0x8639, 0x863D, RCHAR, 0x87EF, RCHAR, 0x8823, RCHAR, 0x8937, 0x8942, 0x8945, 0x8960, 0x8967, RCHAR, 0x8987, RCHAR, 0x89F4, 0x8A01, 0x8A08, 0x8A3F, 0x8A49, 0x8A7A, 0x8A8B, 0x8A94, 0x8B08, 0x8B27, 0x8B67, 0x8B6D, RCHAR, 0x8C38, RCHAR, 0x8C99, RCHAR, 0x8D78, RCHAR, 0x8D95, 0x8DA0, 0x8DA4, RCHAR, 0x8E5A, RCHAR, 0x8E9F, RCHAR, 0x8EBB, 0x8ECF, RCHAR, 0x9105, RCHAR, 0x9124, RCHAR, 0x913A, RCHAR, 0x91BB, RCHAR, 0x91D2, 0x91DD, 0x9275, 0x928F, 0x92AF, 0x92C9, 0x933F, 0x936B, 0x9390, 0x93CB, 0x93D7, 0x943F, 0x946C, RCHAR, 0x9580, RCHAR, 0x9678, RCHAR, 0x969D, 0x96A8, RCHAR, 0x96D6, RCHAR, 0x971F, RCHAR, 0x973F, RCHAR, 0x976A, RCHAR, 0x97B5, RCHAR, 0x97F7, RCHAR, 0x98A8, RCHAR, 0x98E9, 0x990E, 0x9911, 0x992F, 0x9956, RCHAR, 0x999A, 0x99A6, 0x99A9, RCHAR, 0x9AF0, RCHAR, 0x9B14, 0x9B20, 0x9B24, RCHAR, 0x9B55, RCHAR, 0x9CE3, RCHAR, 0x9E74, RCHAR, 0x9E94, RCHAR, 0x9EA7, RCHAR, 0x9EF0, RCHAR, 0x9EFF, RCHAR, 0x9F23, RCHAR, 0x9F45, 0x9F52, 0x9F81, 0x9F8D, RCHAR, 0x0080, RCHAR, 0x00B8, 0x00D8, RCHAR, 0x0102, 0x0114, 0x011C, 0x012C, RCHAR, 0x014E, 0x016C, RCHAR, 0x01DD, 0x01FA, 0x0252, 0x0262, 0x02C8, 0x02CC, 0x02DA, RCHAR, 0x03CA, 0x0402, 0x0450, 0x0452, RCHAR, 0x2027, RCHAR, 0x203C, 0x20AD, RCHAR, 0x210A, 0x2117, 0x2122, 0x216C, 0x217A, 0x2194, 0x219A, RCHAR, 0x223E, RCHAR, 0x2253, RCHAR, 0x2270, 0x2296, 0x229A, 0x22A6, 0x22C0, 0x2313, 0x246A, 0x249C, 0x254C, 0x2574, 0x2590, 0x2596, 0x25A2, 0x25B4, 0x25BE, RCHAR, 0x25D0, 0x25E6, 0x2607, 0x260A, 0x2641, 0x2643, RCHAR, 0x2E8D, 0x2E98, RCHAR, 0x2EBC, 0x2ECB, RCHAR, 0x302A, RCHAR, 0x312A, 0x322A, 0x3232, 0x32A4, 0x3390, 0x339F, 0x33A2, 0x33C5, RCHAR, 0x33D6, 0x3448, 0x3474, 0x359F, 0x360F, 0x361B, 0x3919, 0x396F, 0x39D1, 0x39E0, 0x3A74, 0x3B4F, 0x3C6F, 0x3CE1, 0x4057, 0x4160, 0x4338, 0x43AD, 0x43B2, 0x43DE, 0x44D7, 0x464D, 0x4662, 0x4724, 0x472A, 0x477D, 0x478E, 0x4948, RCHAR, 0x4987, 0x499C, 0x49A0, 0x49B8, 0x4C78, 0x4CA4, 0x4D1A, 0x4DAF, 0x9FA6, RCHAR, 0xE7E7, RCHAR, 0xE844, 0xE856, 0xE865, 0xF92D, 0xF97A, 0xF996, 0xF9E8, 0xF9F2, RCHAR, 0xFA2A, RCHAR, 0xFE6C, 0xFF5F, 0xFFE6, RCHAR, // uncompressed segments 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x1ACE, RCHAR, RCHAR, RCHAR, 0x1AD0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x1AD6, RCHAR, 0x1AE5, RCHAR, 0x1B09, RCHAR, RCHAR, 0x1B10, RCHAR, RCHAR, 0x1B17, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x005E, RCHAR, 0x1B3B, RCHAR, 0x1B67, RCHAR, 0x1BF7, RCHAR, 0x1C19, RCHAR, 0x1C29, RCHAR, 0x1C4E, RCHAR, 0x1C5D, RCHAR, 0x1C6D, RCHAR, 0x1C76, RCHAR, 0x1C84, RCHAR, RCHAR, 0x1C8D, RCHAR, 0x1CD3, RCHAR, 0x1D20, RCHAR, 0x1D3F, RCHAR, RCHAR, 0x1D5A, RCHAR, 0x1D79, RCHAR, 0x1EA2, RCHAR, 0x1EF5, RCHAR, RCHAR, 0x1F25, RCHAR, RCHAR, 0x1F30, RCHAR, 0x1F4B, RCHAR, 0x1FA0, RCHAR, 0x1FEE, RCHAR, 0x200D, RCHAR, 0x202B, RCHAR, RCHAR, RCHAR, 0x2032, RCHAR, 0x207D, RCHAR, 0x20C4, RCHAR, 0x20F8, RCHAR, 0x2109, RCHAR, RCHAR, RCHAR, 0x210F, RCHAR, RCHAR, RCHAR, 0x2141, RCHAR, 0x214C, RCHAR, 0x2184, RCHAR, 0x2229, RCHAR, 0x2264, RCHAR, 0x2267, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x226E, RCHAR, 0x22BB, RCHAR, 0x22DF, RCHAR, RCHAR, RCHAR, 0x22EB, RCHAR, 0x2315, RCHAR, RCHAR, 0x2419, RCHAR, 0x243C, RCHAR, RCHAR, RCHAR, 0x244B, RCHAR, RCHAR, RCHAR, 0x2460, RCHAR, 0x25B6, RCHAR, 0x25BF, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x25F7, RCHAR, 0x2629, RCHAR, 0x26D2, RCHAR, 0x26E4, RCHAR, 0x2769, RCHAR, 0x27AD, RCHAR, 0x27B7, RCHAR, 0x27C7, RCHAR, 0x27D2, RCHAR, 0x27EB, RCHAR, 0x2802, RCHAR, 0x281C, RCHAR, 0x2849, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2872, RCHAR, 0x28AE, RCHAR, 0x28BD, RCHAR, RCHAR, RCHAR, 0x28D4, RCHAR, RCHAR, RCHAR, RCHAR, 0x28E5, RCHAR, RCHAR, RCHAR, 0x2A86, RCHAR, 0x2AC5, RCHAR, 0x2ADE, RCHAR, 0x2AFD, RCHAR, 0x2B22, RCHAR, 0x2B2B, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2B43, RCHAR, 0x2B5F, RCHAR, 0x2B6C, RCHAR, 0x2B82, RCHAR, RCHAR, RCHAR, RCHAR, 0x2B8B, RCHAR, 0x2B91, RCHAR, RCHAR, RCHAR, RCHAR, 0x2BD6, RCHAR, RCHAR, RCHAR, RCHAR, 0x2BE1, RCHAR, RCHAR, 0x2C20, RCHAR, 0x2C3C, RCHAR, RCHAR, 0x2C50, RCHAR, RCHAR, 0x2C5E, RCHAR, RCHAR, RCHAR, 0x2C7D, RCHAR, RCHAR, RCHAR, 0x2C82, RCHAR, 0x2CB8, RCHAR, RCHAR, RCHAR, 0x2CC7, RCHAR, 0x2D16, RCHAR, 0x2D1D, RCHAR, 0x2D35, RCHAR, 0x2D38, RCHAR, 0x2D50, RCHAR, RCHAR, RCHAR, 0x2D59, RCHAR, RCHAR, 0x2E64, RCHAR, 0x2E67, RCHAR, 0x2E93, RCHAR, 0x2EC7, RCHAR, 0x2ED5, RCHAR, RCHAR, 0x2EE8, RCHAR, RCHAR, RCHAR, RCHAR, 0x2F32, RCHAR, 0x2F64, RCHAR, RCHAR, RCHAR, RCHAR, 0x2F7A, RCHAR, 0x2F86, RCHAR, RCHAR, RCHAR, 0x2FAA, RCHAR, 0x2FF0, RCHAR, RCHAR, RCHAR, 0x2FFC, RCHAR, RCHAR, RCHAR, 0x3021, RCHAR, 0x3031, RCHAR, 0x306A, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x30EE, RCHAR, RCHAR, 0x3139, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3144, RCHAR, RCHAR, 0x314E, RCHAR, 0x3166, RCHAR, RCHAR, RCHAR, 0x3208, RCHAR, 0x324D, RCHAR, 0x32B3, RCHAR, 0x3352, RCHAR, 0x33F6, RCHAR, 0x342A, RCHAR, RCHAR, RCHAR, 0x3453, RCHAR, RCHAR, 0x3462, RCHAR, 0x346B, RCHAR, 0x3479, RCHAR, 0x348D, RCHAR, 0x34C9, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x34D1, RCHAR, 0x35DB, RCHAR, 0x35FB, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x36AC, RCHAR, 0x36B3, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x36CC, RCHAR, 0x36D4, RCHAR, 0x3716, RCHAR, 0x3724, RCHAR, RCHAR, RCHAR, 0x3731, RCHAR, 0x3792, RCHAR, 0x37B8, RCHAR, RCHAR, 0x37C3, RCHAR, 0x388A, RCHAR, 0x3891, RCHAR, 0x3899, RCHAR, 0x38D8, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x38DB, RCHAR, 0x38FB, RCHAR, 0x392F, RCHAR, RCHAR, 0x393B, RCHAR, 0x394D, RCHAR, 0x3974, RCHAR, 0x3982, RCHAR, 0x398F, RCHAR, 0x39BF, RCHAR, 0x39C6, RCHAR, 0x39CC, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x39DB, RCHAR, RCHAR, RCHAR, 0x39E7, RCHAR, 0x3A21, RCHAR, RCHAR, RCHAR, 0x3A36, RCHAR, 0x3A4C, RCHAR, 0x3A6C, RCHAR, 0x3A84, RCHAR, 0x3A92, RCHAR, 0x3A99, RCHAR, 0x3ABD, RCHAR, 0x3ABF, RCHAR, 0x3ACE, RCHAR, RCHAR, RCHAR, RCHAR, 0x3ADF, RCHAR, 0x3B4C, RCHAR, RCHAR, 0x3B5A, RCHAR, RCHAR, RCHAR, RCHAR, 0x3B6E, RCHAR, RCHAR, 0x3B75, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3B7C, RCHAR, RCHAR, RCHAR, RCHAR, 0x3B85, RCHAR, 0x3B91, RCHAR, RCHAR, 0x3B98, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3B9C, RCHAR, 0x3BBC, RCHAR, 0x3BC4, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3BCC, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3BD1, RCHAR, RCHAR, 0x3BD8, RCHAR, RCHAR, 0x3BE6, RCHAR, 0x3BF2, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3C08, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3C0C, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3C13, RCHAR, 0x3C15, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x3C39, RCHAR, 0x3C47, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 93] -v # seg 0 at pos 0 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, // [ 94, 103] -> [0x2170,0x2179] # seg 1 // [ 104, 109] -> [0xE766,0xE76B] # seg 2 // [ 110, 129] -> [0x2488,0x249B] # seg 3 // [ 130, 149] -> [0x2474,0x2487] # seg 4 // [ 150, 159] -> [0x2460,0x2469] # seg 5 // [ 162, 171] -> [0x3220,0x3229] # seg 7 // [ 172, 173] -> [0xE76E,0xE76F] # seg 8 // [ 174, 185] -> [0x2160,0x216B] # seg 9 // [ 192, 280] -> [0xFF05,0xFF5D] # seg 11 // [ 281, 281] -> [0xFFE3,0xFFE3] # seg 12 // [ 282, 364] -> [0x3041,0x3093] # seg 13 // [ 376, 461] -> [0x30A1,0x30F6] # seg 15 // [ 462, 469] -> [0xE77D,0xE784] # seg 16 // [ 470, 486] -> [0x0391,0x03A1] # seg 17 // [ 502, 518] -> [0x03B1,0x03C1] # seg 19 // [ 752, 754] -> [0xE7FE,0xE800] # seg 31 // [ 831, 845] -> [0xE801,0xE80F] # seg 33 // [ 1410, 8177] -v # seg 35 at pos 94 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0xE810, 0xE811, 0xE812, 0xE813, 0xE814, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, // [ 160, 161] -v # seg 6 at pos 6862 0x20AC, 0xE76D, // [ 186, 191] -v # seg 10 at pos 6864 0xE770, 0xE771, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, // [ 365, 375] -> [0xE772,0xE77C] # seg 14 // [ 487, 501] -v # seg 18 at pos 6870 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789, 0xE78A, 0xE78B, 0xE78C, // [ 519, 554] -v # seg 20 at pos 6885 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791, 0xE792, 0xE793, 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xE794, 0xE795, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0xE796, 0xFE33, 0xFE34, // [ 555, 563] -> [0xE797,0xE79F] # seg 21 // [ 564, 570] -v # seg 22 at pos 6921 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, // [ 571, 596] -> [0x0416,0x042F] # seg 23 // [ 597, 611] -> [0xE7A0,0xE7AE] # seg 24 // [ 612, 618] -v # seg 25 at pos 6928 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, // [ 619, 644] -> [0x0436,0x044F] # seg 26 // [ 645, 657] -> [0xE7AF,0xE7BB] # seg 27 // [ 658, 693] -v # seg 28 at pos 6935 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0x01F9, 0x0261, 0xE7C9, 0xE7CA, 0xE7CB, 0xE7CC, // [ 694, 730] -> [0x3105,0x3129] # seg 29 // [ 731, 751] -> [0xE7CD,0xE7E1] # seg 30 // [ 755, 830] -> [0x2500,0x254B] # seg 32 // [ 846, 1409] -> [0xE000,0xE233] # seg 34 // [ 8178, 8835] -> [0xE234,0xE4C5] # seg 36 // [ 8836, 8879] -v # seg 37 at pos 6971 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, // [ 8880, 8889] -> [0x4E74,0x4E7D] # seg 38 // [ 8890, 9033] -v # seg 39 at pos 7015 0x4E7F, 0x4E80, 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, // [ 9034, 9042] -> [0x4FB6,0x4FBE] # seg 40 // [ 9043, 9076] -v # seg 41 at pos 7159 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, 0x4FFD, // [ 9077, 9089] -> [0x4FFF,0x500B] # seg 42 // [ 9090, 9105] -v # seg 43 at pos 7193 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502B, // [ 9106, 9116] -> [0x502F,0x5039] # seg 44 // [ 9117, 9153] -v # seg 45 at pos 7209 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, // [ 9154, 9162] -> [0x506D,0x5075] # seg 46 // [ 9163, 9177] -v # seg 47 at pos 7246 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, // [ 9178, 9198] -> [0x508E,0x50A2] # seg 48 // [ 9199, 9214] -v # seg 49 at pos 7261 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, // [ 9215, 9233] -> [0x50BC,0x50CE] # seg 50 // [ 9234, 9242] -v # seg 51 at pos 7277 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, 0x50D7, 0x50D8, 0x50D9, // [ 9243, 9253] -> [0x50DB,0x50E5] # seg 52 // [ 9254, 9267] -v # seg 53 at pos 7286 0x50E8, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50F9, 0x50FA, // [ 9268, 9277] -> [0x50FC,0x5105] # seg 54 // [ 9278, 9286] -v # seg 55 at pos 7300 0x5108, 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, // [ 9287, 9300] -> [0x5113,0x5120] # seg 56 // [ 9301, 9329] -> [0x5122,0x513E] # seg 57 // [ 9330, 9399] -v # seg 58 at pos 7309 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, 0x51D0, // [ 9400, 9408] -> [0x51D2,0x51DA] # seg 59 // [ 9409, 9485] -v # seg 60 at pos 7379 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, 0x5271, // [ 9486, 9495] -> [0x5273,0x527C] # seg 61 // [ 9496, 9526] -v # seg 62 at pos 7456 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, // [ 9527, 9536] -> [0x52B4,0x52BD] # seg 63 // [ 9537, 9563] -v # seg 64 at pos 7487 0x52C0, 0x52C1, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, // [ 9564, 9574] -> [0x52E5,0x52EF] # seg 65 // [ 9575, 9582] -> [0x52F1,0x52F8] # seg 66 // [ 9583, 9613] -v # seg 67 at pos 7514 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, // [ 9614, 9623] -> [0x532F,0x5338] # seg 68 // [ 9624, 9920] -v # seg 69 at pos 7545 0x533C, 0x533D, 0x5340, 0x5342, 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, // [ 9921, 9929] -> [0x55A8,0x55B0] # seg 70 // [ 9930, 10012] -v # seg 71 at pos 7842 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605, 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, // [ 10013, 10024] -> [0x5640,0x564B] # seg 72 // [ 10025, 10072] -v # seg 73 at pos 7925 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, 0x5691, 0x5692, // [ 10073, 10087] -> [0x5694,0x56A2] # seg 74 // [ 10088, 10098] -> [0x56A4,0x56AE] # seg 75 // [ 10099, 10109] -v # seg 76 at pos 7973 0x56B0, 0x56B1, 0x56B2, 0x56B3, 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, // [ 10110, 10122] -> [0x56BD,0x56C9] # seg 77 // [ 10123, 10131] -> [0x56CB,0x56D3] # seg 78 // [ 10132, 10158] -v # seg 79 at pos 7984 0x56D5, 0x56D6, 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, // [ 10159, 10175] -> [0x570B,0x571B] # seg 80 // [ 10176, 10260] -v # seg 81 at pos 8011 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, // [ 10261, 10269] -> [0x57B9,0x57C1] # seg 82 // [ 10270, 10347] -v # seg 83 at pos 8096 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, // [ 10348, 10361] -> [0x5836,0x5843] # seg 84 // [ 10362, 10392] -v # seg 85 at pos 8174 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, // [ 10393, 10409] -> [0x586D,0x587D] # seg 86 // [ 10410, 10439] -v # seg 87 at pos 8205 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, // [ 10440, 10457] -> [0x58AA,0x58BB] # seg 88 // [ 10458, 10464] -v # seg 89 at pos 8235 0x58BD, 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, // [ 10465, 10475] -> [0x58C6,0x58D0] # seg 90 // [ 10476, 10478] -> [0x58D2,0x58D4] # seg 91 // [ 10479, 10492] -> [0x58D6,0x58E3] # seg 92 // [ 10493, 10567] -v # seg 93 at pos 8242 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, // [ 10568, 10580] -> [0x5966,0x5972] # seg 94 // [ 10581, 10651] -v # seg 95 at pos 8317 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, // [ 10652, 10663] -> [0x59ED,0x59F8] # seg 96 // [ 10664, 10715] -v # seg 97 at pos 8388 0x59FA, 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, // [ 10716, 10725] -> [0x5A4B,0x5A54] # seg 98 // [ 10726, 10742] -v # seg 99 at pos 8440 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, // [ 10743, 10751] -> [0x5A6B,0x5A73] # seg 100 // [ 10752, 10757] -v # seg 101 at pos 8457 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, // [ 10758, 10775] -> [0x5A80,0x5A91] # seg 102 // [ 10776, 10782] -> [0x5A93,0x5A99] # seg 103 // [ 10783, 10796] -> [0x5A9C,0x5AA9] # seg 104 // [ 10797, 10846] -v # seg 105 at pos 8463 0x5AAB, 0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, // [ 10847, 10869] -> [0x5AF2,0x5B08] # seg 106 // [ 10870, 10881] -> [0x5B0A,0x5B15] # seg 107 // [ 10882, 10907] -> [0x5B18,0x5B31] # seg 108 // [ 10908, 10918] -v # seg 109 at pos 8513 0x5B33, 0x5B35, 0x5B36, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, // [ 10919, 10933] -> [0x5B41,0x5B4F] # seg 110 // [ 10934, 10989] -v # seg 111 at pos 8524 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0x5BD1, // [ 10990, 10998] -> [0x5BD4,0x5BDC] # seg 112 // [ 10999, 11163] -v # seg 113 at pos 8580 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, // [ 11164, 11173] -> [0x5CF1,0x5CFA] # seg 114 // [ 11174, 11232] -v # seg 115 at pos 8745 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, // [ 11233, 11243] -> [0x5D4D,0x5D57] # seg 116 // [ 11244, 11246] -v # seg 117 at pos 8804 0x5D59, 0x5D5A, 0x5D5C, // [ 11247, 11257] -> [0x5D5E,0x5D68] # seg 118 // [ 11258, 11264] -v # seg 119 at pos 8807 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, // [ 11265, 11277] -> [0x5D75,0x5D81] # seg 120 // [ 11278, 11299] -> [0x5D83,0x5D98] # seg 121 // [ 11300, 11302] -> [0x5D9A,0x5D9C] # seg 122 // [ 11303, 11327] -> [0x5D9E,0x5DB6] # seg 123 // [ 11328, 11340] -> [0x5DB8,0x5DC4] # seg 124 // [ 11341, 11347] -> [0x5DC6,0x5DCC] # seg 125 // [ 11348, 11360] -> [0x5DCE,0x5DDA] # seg 126 // [ 11361, 11437] -v # seg 127 at pos 8814 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, // [ 11438, 11452] -> [0x5E63,0x5E71] # seg 128 // [ 11453, 11488] -v # seg 129 at pos 8891 0x5E75, 0x5E77, 0x5E79, 0x5E7E, 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, // [ 11489, 11498] -> [0x5EBF,0x5EC8] # seg 130 // [ 11499, 11510] -v # seg 131 at pos 8927 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, // [ 11511, 11522] -> [0x5EDC,0x5EE7] # seg 132 // [ 11523, 11523] -> [0x5EE9,0x5EE9] # seg 133 // [ 11524, 11532] -> [0x5EEB,0x5EF3] # seg 134 // [ 11533, 11574] -v # seg 135 at pos 8939 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, // [ 11575, 11589] -> [0x5F41,0x5F4F] # seg 136 // [ 11590, 11849] -v # seg 137 at pos 8981 0x5F51, 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, // [ 11850, 11868] -> [0x612C,0x613E] # seg 138 // [ 11869, 11876] -> [0x6140,0x6147] # seg 139 // [ 11877, 11911] -v # seg 140 at pos 9241 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, // [ 11912, 11930] -> [0x6178,0x618A] # seg 141 // [ 11931, 11945] -v # seg 142 at pos 9276 0x618C, 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, // [ 11946, 11954] -> [0x619E,0x61A6] # seg 143 // [ 11955, 11956] -> [0x61AA,0x61AB] # seg 144 // [ 11957, 11966] -> [0x61AD,0x61B6] # seg 145 // [ 11967, 11987] -v # seg 146 at pos 9291 0x61B8, 0x61B9, 0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, // [ 11988, 12004] -> [0x61D5,0x61E5] # seg 147 // [ 12005, 12018] -> [0x61E7,0x61F4] # seg 148 // [ 12019, 12027] -> [0x61F6,0x61FE] # seg 149 // [ 12028, 12369] -v # seg 150 at pos 9312 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0, 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, // [ 12370, 12379] -> [0x646E,0x6477] # seg 151 // [ 12380, 12388] -v # seg 152 at pos 9654 0x647B, 0x647C, 0x647D, 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, // [ 12389, 12397] -> [0x6488,0x6490] # seg 153 // [ 12398, 12453] -v # seg 154 at pos 9663 0x6493, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA, 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, // [ 12454, 12478] -> [0x64E7,0x64FF] # seg 155 // [ 12479, 12486] -> [0x6501,0x6508] # seg 156 // [ 12487, 12494] -> [0x650A,0x6511] # seg 157 // [ 12495, 12499] -> [0x6513,0x6517] # seg 158 // [ 12500, 12511] -> [0x6519,0x6524] # seg 159 // [ 12512, 12561] -v # seg 160 at pos 9719 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, // [ 12562, 12576] -> [0x6578,0x6586] # seg 161 // [ 12577, 12745] -v # seg 162 at pos 9769 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, // [ 12746, 12754] -> [0x669E,0x66A6] # seg 163 // [ 12755, 12772] -v # seg 164 at pos 9938 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, 0x66BD, // [ 12773, 12798] -> [0x66BF,0x66D8] # seg 165 // [ 12799, 12931] -v # seg 166 at pos 9956 0x66DA, 0x66DE, 0x66DF, 0x66E0, 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2, // [ 12932, 12941] -> [0x67C5,0x67CE] # seg 167 // [ 12942, 13009] -v # seg 168 at pos 10089 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, // [ 13010, 13019] -> [0x6856,0x685F] # seg 169 // [ 13020, 13029] -v # seg 170 at pos 10157 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, // [ 13030, 13038] -> [0x6878,0x6880] # seg 171 // [ 13039, 13054] -v # seg 172 at pos 10167 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, // [ 13055, 13064] -> [0x6898,0x68A1] # seg 173 // [ 13065, 13075] -v # seg 174 at pos 10183 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, // [ 13076, 13085] -> [0x68B6,0x68BF] # seg 175 // [ 13086, 13110] -v # seg 176 at pos 10194 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, // [ 13111, 13120] -> [0x68E4,0x68ED] # seg 177 // [ 13121, 13143] -v # seg 178 at pos 10219 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, 0x6911, // [ 13144, 13155] -> [0x6913,0x691E] # seg 179 // [ 13156, 13181] -v # seg 180 at pos 10242 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, // [ 13182, 13198] -> [0x6943,0x6953] # seg 181 // [ 13199, 13243] -v # seg 182 at pos 10268 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F, 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, // [ 13244, 13253] -> [0x699D,0x69A6] # seg 183 // [ 13254, 13294] -v # seg 184 at pos 10313 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD, 0x69DE, // [ 13295, 13306] -> [0x69E1,0x69EC] # seg 185 // [ 13307, 13310] -> [0x69EE,0x69F1] # seg 186 // [ 13311, 13320] -> [0x69F3,0x69FC] # seg 187 // [ 13321, 13321] -> [0x69FE,0x69FE] # seg 188 // [ 13322, 13331] -> [0x6A00,0x6A09] # seg 189 // [ 13332, 13343] -> [0x6A0B,0x6A16] # seg 190 // [ 13344, 13403] -v # seg 191 at pos 10354 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, // [ 13404, 13414] -> [0x6A66,0x6A70] # seg 192 // [ 13415, 13429] -v # seg 193 at pos 10414 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83, // [ 13430, 13438] -> [0x6A85,0x6A8D] # seg 194 // [ 13439, 13461] -v # seg 195 at pos 10429 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, 0x6AA8, 0x6AAA, // [ 13462, 13576] -> [0x6AAD,0x6B1F] # seg 196 // [ 13577, 13578] -> [0x6B25,0x6B26] # seg 197 // [ 13579, 13588] -> [0x6B28,0x6B31] # seg 198 // [ 13589, 13605] -v # seg 199 at pos 10452 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, // [ 13606, 13617] -> [0x6B4D,0x6B58] # seg 200 // [ 13618, 13625] -> [0x6B5A,0x6B61] # seg 201 // [ 13626, 13627] -> [0x6B68,0x6B69] # seg 202 // [ 13628, 13641] -> [0x6B6B,0x6B78] # seg 203 // [ 13642, 14058] -v # seg 204 at pos 10469 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, // [ 14059, 14069] -> [0x6E60,0x6E6A] # seg 205 // [ 14070, 14071] -> [0x6E6C,0x6E6D] # seg 206 // [ 14072, 14086] -> [0x6E6F,0x6E7D] # seg 207 // [ 14087, 14149] -v # seg 208 at pos 10886 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, 0x6EE7, // [ 14150, 14159] -> [0x6EEA,0x6EF3] # seg 209 // [ 14160, 14184] -v # seg 210 at pos 10949 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, // [ 14185, 14194] -> [0x6F16,0x6F1F] # seg 211 // [ 14195, 14225] -v # seg 212 at pos 10974 0x6F21, 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, // [ 14226, 14235] -> [0x6F4E,0x6F57] # seg 213 // [ 14236, 14272] -v # seg 214 at pos 11005 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, // [ 14273, 14285] -> [0x6F8F,0x6F9B] # seg 215 // [ 14286, 14294] -v # seg 216 at pos 11042 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, // [ 14295, 14305] -> [0x6FA8,0x6FB2] # seg 217 // [ 14306, 14329] -v # seg 218 at pos 11051 0x6FB4, 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, // [ 14330, 14340] -> [0x6FD3,0x6FDD] # seg 219 // [ 14341, 14341] -> [0x6FDF,0x6FDF] # seg 220 // [ 14342, 14353] -> [0x6FE2,0x6FED] # seg 221 // [ 14354, 14386] -> [0x6FF0,0x7010] # seg 222 // [ 14387, 14394] -> [0x7012,0x7019] # seg 223 // [ 14395, 14401] -> [0x701C,0x7022] # seg 224 // [ 14402, 14418] -> [0x7024,0x7034] # seg 225 // [ 14419, 14421] -> [0x7036,0x7038] # seg 226 // [ 14422, 14439] -> [0x703A,0x704B] # seg 227 // [ 14440, 14441] -> [0x704D,0x704E] # seg 228 // [ 14442, 14455] -> [0x7050,0x705D] # seg 229 // [ 14456, 14467] -> [0x705F,0x706A] # seg 230 // [ 14468, 14495] -v # seg 231 at pos 11075 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, // [ 14496, 14508] -> [0x709E,0x70AA] # seg 232 // [ 14509, 14521] -v # seg 233 at pos 11103 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, // [ 14522, 14534] -> [0x70CB,0x70D7] # seg 234 // [ 14535, 14556] -v # seg 235 at pos 11116 0x70DA, 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, // [ 14557, 14567] -> [0x70FE,0x7108] # seg 236 // [ 14568, 14576] -v # seg 237 at pos 11138 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, // [ 14577, 14587] -> [0x711B,0x7125] # seg 238 // [ 14588, 14595] -> [0x7127,0x712E] # seg 239 // [ 14596, 14599] -> [0x7132,0x7135] # seg 240 // [ 14600, 14613] -> [0x7137,0x7144] # seg 241 // [ 14614, 14619] -v # seg 242 at pos 11147 0x7146, 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, // [ 14620, 14632] -> [0x714F,0x715B] # seg 243 // [ 14633, 14701] -v # seg 244 at pos 11153 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, // [ 14702, 14710] -> [0x71BA,0x71C2] # seg 245 // [ 14711, 14720] -> [0x71C4,0x71CD] # seg 246 // [ 14721, 14725] -> [0x71CF,0x71D3] # seg 247 // [ 14726, 14735] -> [0x71D6,0x71DF] # seg 248 // [ 14736, 14746] -v # seg 249 at pos 11222 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, // [ 14747, 14756] -> [0x71EF,0x71F8] # seg 250 // [ 14757, 14768] -> [0x71FA,0x7205] # seg 251 // [ 14769, 14790] -> [0x7207,0x721C] # seg 252 // [ 14791, 14800] -> [0x721E,0x7227] # seg 253 // [ 14801, 14863] -v # seg 254 at pos 11233 0x7229, 0x722B, 0x722D, 0x722E, 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290, 0x7291, // [ 14864, 14875] -> [0x7293,0x729E] # seg 255 // [ 14876, 14887] -> [0x72A0,0x72AB] # seg 256 // [ 14888, 14915] -v # seg 257 at pos 11296 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, // [ 14916, 15587] -> [0xE4C6,0xE765] # seg 258 // [ 15588, 15607] -v # seg 259 at pos 11324 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, // [ 15608, 15643] -> [0x2550,0x2573] # seg 260 // [ 15644, 15658] -> [0x2581,0x258F] # seg 261 // [ 15659, 15672] -v # seg 262 at pos 11344 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, // [ 15673, 15683] -> [0xE7BC,0xE7C6] # seg 263 // [ 15684, 15692] -> [0x3021,0x3029] # seg 264 // [ 15693, 15723] -v # seg 265 at pos 11358 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, 0xE7E2, 0x2121, 0x3231, 0xE7E3, 0x2010, 0xE7E4, 0xE7E5, 0xE7E6, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, // [ 15724, 15733] -> [0xFE49,0xFE52] # seg 266 // [ 15734, 15737] -> [0xFE54,0xFE57] # seg 267 // [ 15738, 15751] -> [0xFE59,0xFE66] # seg 268 // [ 15752, 15756] -v # seg 269 at pos 11389 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0x303E, // [ 15757, 15768] -> [0x2FF0,0x2FFB] # seg 270 // [ 15769, 15769] -> [0x3007,0x3007] # seg 271 // [ 15770, 15779] -> [0xE7F4,0xE7FD] # seg 272 // [ 15780, 15833] -v # seg 273 at pos 11394 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, // [ 15834, 15846] -> [0x7340,0x734C] # seg 274 // [ 15847, 15861] -v # seg 275 at pos 11448 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, // [ 15862, 15872] -> [0x7361,0x736B] # seg 276 // [ 15873, 15873] -> [0x736E,0x736E] # seg 277 // [ 15874, 15887] -> [0x7370,0x737D] # seg 278 // [ 15888, 15966] -v # seg 279 at pos 11463 0x737F, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0, 0x73F1, // [ 15967, 15982] -> [0x73F3,0x7402] # seg 280 // [ 15983, 15989] -v # seg 281 at pos 11542 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, // [ 15990, 15998] -> [0x7411,0x7419] # seg 282 // [ 15999, 16022] -v # seg 283 at pos 11549 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x743F, 0x7440, // [ 16023, 16041] -> [0x7442,0x7454] # seg 284 // [ 16042, 16044] -v # seg 285 at pos 11573 0x7456, 0x7458, 0x745D, // [ 16045, 16057] -> [0x7460,0x746C] # seg 286 // [ 16058, 16081] -v # seg 287 at pos 11576 0x746E, 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A, 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, // [ 16082, 16092] -> [0x7491,0x749B] # seg 288 // [ 16093, 16101] -v # seg 289 at pos 11600 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, 0x74A5, 0x74A6, // [ 16102, 16117] -> [0x74AA,0x74B9] # seg 290 // [ 16118, 16140] -> [0x74BB,0x74D1] # seg 291 // [ 16141, 16149] -> [0x74D3,0x74DB] # seg 292 // [ 16150, 16416] -v # seg 293 at pos 11609 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, 0x7644, 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, // [ 16417, 16426] -> [0x769A,0x76A3] # seg 294 // [ 16427, 16435] -> [0x76A5,0x76AD] # seg 295 // [ 16436, 16438] -v # seg 296 at pos 11876 0x76AF, 0x76B0, 0x76B3, // [ 16439, 16448] -> [0x76B5,0x76BE] # seg 297 // [ 16449, 16492] -v # seg 298 at pos 11879 0x76C0, 0x76C1, 0x76C3, 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, // [ 16493, 16503] -> [0x770E,0x7718] # seg 299 // [ 16504, 16555] -v # seg 300 at pos 11923 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, // [ 16556, 16567] -> [0x776D,0x7778] # seg 301 // [ 16568, 16581] -v # seg 302 at pos 11975 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, // [ 16582, 16593] -> [0x7793,0x779E] # seg 303 // [ 16594, 16612] -v # seg 304 at pos 11989 0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0x77BC, 0x77BE, // [ 16613, 16625] -> [0x77C0,0x77CC] # seg 305 // [ 16626, 16634] -> [0x77CE,0x77D6] # seg 306 // [ 16635, 16708] -v # seg 307 at pos 12008 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, 0x785B, 0x785C, // [ 16709, 16720] -> [0x785E,0x7869] # seg 308 // [ 16721, 16728] -> [0x786F,0x7876] # seg 309 // [ 16729, 16732] -> [0x7878,0x787B] # seg 310 // [ 16733, 16742] -> [0x787D,0x7886] # seg 311 // [ 16743, 16792] -v # seg 312 at pos 12082 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, // [ 16793, 16806] -> [0x78DA,0x78E7] # seg 313 // [ 16807, 16828] -v # seg 314 at pos 12132 0x78E9, 0x78EA, 0x78EB, 0x78ED, 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904, // [ 16829, 16841] -> [0x7906,0x7912] # seg 315 // [ 16842, 16851] -> [0x7914,0x791D] # seg 316 // [ 16852, 16856] -> [0x791F,0x7923] # seg 317 // [ 16857, 16871] -> [0x7925,0x7933] # seg 318 // [ 16872, 16883] -v # seg 319 at pos 12154 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, // [ 16884, 16892] -> [0x794A,0x7952] # seg 320 // [ 16893, 16928] -v # seg 321 at pos 12166 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, // [ 16929, 16938] -> [0x7990,0x7999] # seg 322 // [ 16939, 16950] -> [0x799B,0x79A6] # seg 323 // [ 16951, 16961] -> [0x79A8,0x79B2] # seg 324 // [ 16962, 17031] -v # seg 325 at pos 12202 0x79B4, 0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, // [ 17032, 17046] -> [0x7A24,0x7A32] # seg 326 // [ 17047, 17058] -v # seg 327 at pos 12272 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, // [ 17059, 17068] -> [0x7A47,0x7A50] # seg 328 // [ 17069, 17073] -> [0x7A52,0x7A56] # seg 329 // [ 17074, 17097] -> [0x7A58,0x7A6F] # seg 330 // [ 17098, 17134] -v # seg 331 at pos 12284 0x7A71, 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, // [ 17135, 17145] -> [0x7AB4,0x7ABE] # seg 332 // [ 17146, 17156] -> [0x7AC0,0x7ACA] # seg 333 // [ 17157, 17166] -> [0x7ACC,0x7AD5] # seg 334 // [ 17167, 17182] -v # seg 335 at pos 12321 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, 0x7AEE, // [ 17183, 17191] -> [0x7AF0,0x7AF8] # seg 336 // [ 17192, 17248] -v # seg 337 at pos 12337 0x7AFB, 0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, 0x7B2D, 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, // [ 17249, 17259] -> [0x7B63,0x7B6D] # seg 338 // [ 17260, 17391] -v # seg 339 at pos 12394 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, // [ 17392, 17404] -> [0x7C2B,0x7C37] # seg 340 // [ 17405, 17410] -> [0x7C39,0x7C3E] # seg 341 // [ 17411, 17421] -> [0x7C42,0x7C4C] # seg 342 // [ 17422, 17458] -> [0x7C4E,0x7C72] # seg 343 // [ 17459, 17464] -> [0x7C75,0x7C7A] # seg 344 // [ 17465, 17475] -> [0x7C7E,0x7C88] # seg 345 // [ 17476, 17550] -v # seg 346 at pos 12526 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, 0x7CFA, // [ 17551, 17564] -> [0x7CFC,0x7D09] # seg 347 // [ 17565, 17585] -> [0x7D0B,0x7D1F] # seg 348 // [ 17586, 17596] -v # seg 349 at pos 12601 0x7D21, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, 0x7D2D, 0x7D2E, // [ 17597, 17658] -> [0x7D30,0x7D6D] # seg 350 // [ 17659, 17666] -> [0x7D6F,0x7D76] # seg 351 // [ 17667, 17712] -> [0x7D78,0x7DA5] # seg 352 // [ 17713, 17719] -> [0x7DA7,0x7DAD] # seg 353 // [ 17720, 17859] -> [0x7DAF,0x7E3A] # seg 354 // [ 17860, 17869] -v # seg 355 at pos 12612 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E45, 0x7E46, // [ 17870, 17927] -> [0x7E48,0x7E81] # seg 356 // [ 17928, 17951] -> [0x7E83,0x7E9A] # seg 357 // [ 17952, 17975] -v # seg 358 at pos 12622 0x7E9C, 0x7E9D, 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, // [ 17976, 17985] -> [0x7F46,0x7F4F] # seg 359 // [ 17986, 18147] -v # seg 360 at pos 12646 0x7F52, 0x7F53, 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, // [ 18148, 18161] -> [0x805B,0x8068] # seg 361 // [ 18162, 18167] -> [0x806B,0x8070] # seg 362 // [ 18168, 18180] -> [0x8072,0x807E] # seg 363 // [ 18181, 18249] -v # seg 364 at pos 12808 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, // [ 18250, 18262] -> [0x811F,0x812B] # seg 365 // [ 18263, 18364] -v # seg 366 at pos 12877 0x812D, 0x812E, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813F, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81C9, 0x81CB, // [ 18365, 18386] -> [0x81CD,0x81E2] # seg 367 // [ 18387, 18545] -v # seg 368 at pos 12979 0x81E4, 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, // [ 18546, 18555] -> [0x831D,0x8326] # seg 369 // [ 18556, 18719] -v # seg 370 at pos 13138 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D, 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, // [ 18720, 18729] -> [0x8447,0x8450] # seg 371 // [ 18730, 18781] -v # seg 372 at pos 13302 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F, 0x84A0, // [ 18782, 18794] -> [0x84A2,0x84AE] # seg 373 // [ 18795, 18835] -v # seg 374 at pos 13354 0x84B0, 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, 0x84EF, // [ 18836, 18846] -> [0x84F1,0x84FB] # seg 375 // [ 18847, 18848] -> [0x84FD,0x84FE] # seg 376 // [ 18849, 18860] -> [0x8500,0x850B] # seg 377 // [ 18861, 18875] -v # seg 378 at pos 13395 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, // [ 18876, 18884] -> [0x8522,0x852A] # seg 379 // [ 18885, 18894] -> [0x852D,0x8536] # seg 380 // [ 18895, 18903] -v # seg 381 at pos 13410 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, // [ 18904, 18914] -> [0x854B,0x8555] # seg 382 // [ 18915, 18928] -v # seg 383 at pos 13419 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, // [ 18929, 18937] -> [0x8569,0x8571] # seg 384 // [ 18938, 18957] -v # seg 385 at pos 13433 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, // [ 18958, 18968] -> [0x8590,0x859A] # seg 386 // [ 18969, 19028] -v # seg 387 at pos 13453 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, 0x85E7, 0x85E8, // [ 19029, 19045] -> [0x85EA,0x85FA] # seg 388 // [ 19046, 19053] -v # seg 389 at pos 13513 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, // [ 19054, 19064] -> [0x8606,0x8610] # seg 390 // [ 19065, 19068] -> [0x8612,0x8615] # seg 391 // [ 19069, 19084] -> [0x8617,0x8626] # seg 392 // [ 19085, 19085] -> [0x8628,0x8628] # seg 393 // [ 19086, 19099] -> [0x862A,0x8637] # seg 394 // [ 19100, 19102] -> [0x8639,0x863B] # seg 395 // [ 19103, 19118] -> [0x863D,0x864C] # seg 396 // [ 19119, 19384] -v # seg 397 at pos 13521 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866A, 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, // [ 19385, 19394] -> [0x87EF,0x87F8] # seg 398 // [ 19395, 19426] -v # seg 399 at pos 13787 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, // [ 19427, 19441] -> [0x8823,0x8831] # seg 400 // [ 19442, 19618] -v # seg 401 at pos 13819 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, // [ 19619, 19628] -> [0x8937,0x8940] # seg 402 // [ 19629, 19630] -> [0x8942,0x8943] # seg 403 // [ 19631, 19655] -> [0x8945,0x895D] # seg 404 // [ 19656, 19661] -> [0x8960,0x8965] # seg 405 // [ 19662, 19681] -> [0x8967,0x897A] # seg 406 // [ 19682, 19688] -v # seg 407 at pos 13996 0x897C, 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, // [ 19689, 19746] -> [0x8987,0x89C0] # seg 408 // [ 19747, 19771] -v # seg 409 at pos 14003 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, // [ 19772, 19783] -> [0x89F4,0x89FF] # seg 410 // [ 19784, 19789] -> [0x8A01,0x8A06] # seg 411 // [ 19790, 19843] -> [0x8A08,0x8A3D] # seg 412 // [ 19844, 19852] -> [0x8A3F,0x8A47] # seg 413 // [ 19853, 19900] -> [0x8A49,0x8A78] # seg 414 // [ 19901, 19915] -> [0x8A7A,0x8A88] # seg 415 // [ 19916, 19923] -> [0x8A8B,0x8A92] # seg 416 // [ 19924, 20038] -> [0x8A94,0x8B06] # seg 417 // [ 20039, 20068] -> [0x8B08,0x8B25] # seg 418 // [ 20069, 20131] -> [0x8B27,0x8B65] # seg 419 // [ 20132, 20136] -> [0x8B67,0x8B6B] # seg 420 // [ 20137, 20187] -> [0x8B6D,0x8B9F] # seg 421 // [ 20188, 20195] -v # seg 422 at pos 14028 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, // [ 20196, 20204] -> [0x8C38,0x8C40] # seg 423 // [ 20205, 20270] -v # seg 424 at pos 14036 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, // [ 20271, 20402] -> [0x8C99,0x8D1C] # seg 425 // [ 20403, 20416] -v # seg 426 at pos 14102 0x8D20, 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, // [ 20417, 20425] -> [0x8D78,0x8D80] # seg 427 // [ 20426, 20438] -v # seg 428 at pos 14116 0x8D82, 0x8D83, 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92, 0x8D93, // [ 20439, 20448] -> [0x8D95,0x8D9E] # seg 429 // [ 20449, 20451] -> [0x8DA0,0x8DA2] # seg 430 // [ 20452, 20464] -> [0x8DA4,0x8DB0] # seg 431 // [ 20465, 20561] -v # seg 432 at pos 14129 0x8DB2, 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, // [ 20562, 20573] -> [0x8E5A,0x8E65] # seg 433 // [ 20574, 20611] -v # seg 434 at pos 14226 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, // [ 20612, 20623] -> [0x8E9F,0x8EAA] # seg 435 // [ 20624, 20634] -v # seg 436 at pos 14264 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, // [ 20635, 20653] -> [0x8EBB,0x8ECD] # seg 437 // [ 20654, 20804] -> [0x8ECF,0x8F65] # seg 438 // [ 20805, 21003] -v # seg 439 at pos 14275 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, 0x9018, 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, // [ 21004, 21023] -> [0x9105,0x9118] # seg 440 // [ 21024, 21030] -v # seg 441 at pos 14474 0x911A, 0x911B, 0x911C, 0x911D, 0x911F, 0x9120, 0x9121, // [ 21031, 21041] -> [0x9124,0x912E] # seg 442 // [ 21042, 21049] -v # seg 443 at pos 14481 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, // [ 21050, 21058] -> [0x913A,0x9142] # seg 444 // [ 21059, 21121] -v # seg 445 at pos 14489 0x9144, 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, // [ 21122, 21133] -> [0x91BB,0x91C6] # seg 446 // [ 21134, 21136] -v # seg 447 at pos 14552 0x91C8, 0x91CB, 0x91D0, // [ 21137, 21146] -> [0x91D2,0x91DB] # seg 448 // [ 21147, 21297] -> [0x91DD,0x9273] # seg 449 // [ 21298, 21322] -> [0x9275,0x928D] # seg 450 // [ 21323, 21353] -> [0x928F,0x92AD] # seg 451 // [ 21354, 21378] -> [0x92AF,0x92C7] # seg 452 // [ 21379, 21495] -> [0x92C9,0x933D] # seg 453 // [ 21496, 21538] -> [0x933F,0x9369] # seg 454 // [ 21539, 21574] -> [0x936B,0x938E] # seg 455 // [ 21575, 21632] -> [0x9390,0x93C9] # seg 456 // [ 21633, 21643] -> [0x93CB,0x93D5] # seg 457 // [ 21644, 21746] -> [0x93D7,0x943D] # seg 458 // [ 21747, 21790] -> [0x943F,0x946A] # seg 459 // [ 21791, 21815] -> [0x946C,0x9484] # seg 460 // [ 21816, 21847] -v # seg 461 at pos 14555 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E, // [ 21848, 21951] -> [0x9580,0x95E7] # seg 462 // [ 21952, 22003] -v # seg 463 at pos 14587 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, // [ 22004, 22016] -> [0x9678,0x9684] # seg 464 // [ 22017, 22028] -v # seg 465 at pos 14639 0x9687, 0x9689, 0x968A, 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, 0x969B, // [ 22029, 22038] -> [0x969D,0x96A6] # seg 466 // [ 22039, 22046] -> [0x96A8,0x96AF] # seg 467 // [ 22047, 22064] -v # seg 468 at pos 14651 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, // [ 22065, 22074] -> [0x96D6,0x96DF] # seg 469 // [ 22075, 22113] -v # seg 470 at pos 14669 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, // [ 22114, 22124] -> [0x971F,0x9729] # seg 471 // [ 22125, 22138] -v # seg 472 at pos 14708 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, // [ 22139, 22157] -> [0x973F,0x9751] # seg 473 // [ 22158, 22170] -v # seg 474 at pos 14722 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, // [ 22171, 22179] -> [0x976A,0x9772] # seg 475 // [ 22180, 22227] -v # seg 476 at pos 14735 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, // [ 22228, 22276] -> [0x97B5,0x97E5] # seg 477 // [ 22277, 22283] -v # seg 478 at pos 14783 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F4, // [ 22284, 22409] -> [0x97F7,0x9874] # seg 479 // [ 22410, 22415] -v # seg 480 at pos 14790 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, // [ 22416, 22453] -> [0x98A8,0x98CD] # seg 481 // [ 22454, 22468] -v # seg 482 at pos 14796 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0x98E5, 0x98E6, // [ 22469, 22504] -> [0x98E9,0x990C] # seg 483 // [ 22505, 22506] -> [0x990E,0x990F] # seg 484 // [ 22507, 22535] -> [0x9911,0x992D] # seg 485 // [ 22536, 22572] -> [0x992F,0x9953] # seg 486 // [ 22573, 22585] -> [0x9956,0x9962] # seg 487 // [ 22586, 22597] -v # seg 488 at pos 14811 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x998C, 0x998E, // [ 22598, 22608] -> [0x999A,0x99A4] # seg 489 // [ 22609, 22610] -> [0x99A6,0x99A7] # seg 490 // [ 22611, 22805] -> [0x99A9,0x9A6B] # seg 491 // [ 22806, 22863] -v # seg 492 at pos 14823 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, // [ 22864, 22872] -> [0x9AF0,0x9AF8] # seg 493 // [ 22873, 22893] -v # seg 494 at pos 14881 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B06, 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, // [ 22894, 22904] -> [0x9B14,0x9B1E] # seg 495 // [ 22905, 22907] -> [0x9B20,0x9B22] # seg 496 // [ 22908, 22918] -> [0x9B24,0x9B2E] # seg 497 // [ 22919, 22940] -v # seg 498 at pos 14902 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, 0x9B53, // [ 22941, 23235] -> [0x9B55,0x9C7B] # seg 499 // [ 23236, 23267] -v # seg 500 at pos 14924 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, // [ 23268, 23583] -> [0x9CE3,0x9E1E] # seg 501 // [ 23584, 23607] -v # seg 502 at pos 14956 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, // [ 23608, 23617] -> [0x9E74,0x9E7D] # seg 503 // [ 23618, 23631] -v # seg 504 at pos 14980 0x9E80, 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, // [ 23632, 23640] -> [0x9E94,0x9E9C] # seg 505 // [ 23641, 23647] -v # seg 506 at pos 14994 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, // [ 23648, 23660] -> [0x9EA7,0x9EB3] # seg 507 // [ 23661, 23696] -v # seg 508 at pos 15001 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, // [ 23697, 23705] -> [0x9EF0,0x9EF8] # seg 509 // [ 23706, 23707] -v # seg 510 at pos 15037 0x9EFA, 0x9EFD, // [ 23708, 23719] -> [0x9EFF,0x9F0A] # seg 511 // [ 23720, 23734] -v # seg 512 at pos 15039 0x9F0C, 0x9F0F, 0x9F11, 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, // [ 23735, 23743] -> [0x9F23,0x9F2B] # seg 513 // [ 23744, 23760] -v # seg 514 at pos 15054 0x9F2D, 0x9F2E, 0x9F30, 0x9F31, 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, // [ 23761, 23771] -> [0x9F45,0x9F4F] # seg 515 // [ 23772, 23816] -> [0x9F52,0x9F7E] # seg 516 // [ 23817, 23818] -> [0x9F81,0x9F82] # seg 517 // [ 23819, 23830] -> [0x9F8D,0x9F98] # seg 518 // [ 23831, 23939] -v # seg 519 at pos 15071 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, 0xF9F1, 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81, 0xE816, 0xE817, 0xE818, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B, 0xE81E, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918, 0xE826, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0xE82B, 0xE82C, 0x3B4E, 0x3C6E, 0x3CE0, 0x2EA7, 0xE831, 0xE832, 0x2EAA, 0x4056, 0x415F, 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0xE83B, 0x43B1, 0x43AC, 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0xE843, 0x4723, 0x4729, 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983, 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0xE854, 0xE855, 0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0xE864, // [ 23940, 23975] -> [0x0080,0x00A3] # seg 520 // [ 23976, 23989] -v # seg 521 at pos 15180 0x00A5, 0x00A6, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, // [ 23990, 24020] -> [0x00B8,0x00D6] # seg 522 // [ 24021, 24028] -> [0x00D8,0x00DF] # seg 523 // [ 24029, 24048] -v # seg 524 at pos 15194 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00EB, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F4, 0x00F5, 0x00F6, 0x00F8, 0x00FB, 0x00FD, 0x00FE, 0x00FF, 0x0100, // [ 24049, 24065] -> [0x0102,0x0112] # seg 525 // [ 24066, 24072] -> [0x0114,0x011A] # seg 526 // [ 24073, 24087] -> [0x011C,0x012A] # seg 527 // [ 24088, 24111] -> [0x012C,0x0143] # seg 528 // [ 24112, 24118] -v # seg 529 at pos 15214 0x0145, 0x0146, 0x0147, 0x0149, 0x014A, 0x014B, 0x014C, // [ 24119, 24147] -> [0x014E,0x016A] # seg 530 // [ 24148, 24245] -> [0x016C,0x01CD] # seg 531 // [ 24246, 24252] -v # seg 532 at pos 15221 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, // [ 24253, 24280] -> [0x01DD,0x01F8] # seg 533 // [ 24281, 24367] -> [0x01FA,0x0250] # seg 534 // [ 24368, 24382] -> [0x0252,0x0260] # seg 535 // [ 24383, 24483] -> [0x0262,0x02C6] # seg 536 // [ 24484, 24484] -> [0x02C8,0x02C8] # seg 537 // [ 24485, 24497] -> [0x02CC,0x02D8] # seg 538 // [ 24498, 24680] -> [0x02DA,0x0390] # seg 539 // [ 24681, 24689] -v # seg 540 at pos 15228 0x03A2, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03C2, // [ 24690, 24744] -> [0x03CA,0x0400] # seg 541 // [ 24745, 24758] -> [0x0402,0x040F] # seg 542 // [ 24759, 24759] -> [0x0450,0x0450] # seg 543 // [ 24760, 31861] -> [0x0452,0x200F] # seg 544 // [ 31862, 31873] -v # seg 545 at pos 15237 0x2011, 0x2012, 0x2017, 0x201A, 0x201B, 0x201E, 0x201F, 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, // [ 31874, 31882] -> [0x2027,0x202F] # seg 546 // [ 31883, 31889] -v # seg 547 at pos 15249 0x2031, 0x2034, 0x2036, 0x2037, 0x2038, 0x2039, 0x203A, // [ 31890, 32001] -> [0x203C,0x20AB] # seg 548 // [ 32002, 32087] -> [0x20AD,0x2102] # seg 549 // [ 32088, 32091] -v # seg 550 at pos 15256 0x2104, 0x2106, 0x2107, 0x2108, // [ 32092, 32103] -> [0x210A,0x2115] # seg 551 // [ 32104, 32113] -> [0x2117,0x2120] # seg 552 // [ 32114, 32175] -> [0x2122,0x215F] # seg 553 // [ 32176, 32179] -> [0x216C,0x216F] # seg 554 // [ 32180, 32201] -> [0x217A,0x218F] # seg 555 // [ 32202, 32203] -> [0x2194,0x2195] # seg 556 // [ 32204, 32313] -> [0x219A,0x2207] # seg 557 // [ 32314, 32345] -v # seg 558 at pos 15260 0x2209, 0x220A, 0x220B, 0x220C, 0x220D, 0x220E, 0x2210, 0x2212, 0x2213, 0x2214, 0x2216, 0x2217, 0x2218, 0x2219, 0x221B, 0x221C, 0x2221, 0x2222, 0x2224, 0x2226, 0x222C, 0x222D, 0x222F, 0x2230, 0x2231, 0x2232, 0x2233, 0x2238, 0x2239, 0x223A, 0x223B, 0x223C, // [ 32346, 32355] -> [0x223E,0x2247] # seg 559 // [ 32356, 32363] -v # seg 560 at pos 15292 0x2249, 0x224A, 0x224B, 0x224D, 0x224E, 0x224F, 0x2250, 0x2251, // [ 32364, 32376] -> [0x2253,0x225F] # seg 561 // [ 32377, 32384] -v # seg 562 at pos 15300 0x2262, 0x2263, 0x2268, 0x2269, 0x226A, 0x226B, 0x226C, 0x226D, // [ 32385, 32421] -> [0x2270,0x2294] # seg 563 // [ 32422, 32424] -> [0x2296,0x2298] # seg 564 // [ 32425, 32435] -> [0x229A,0x22A4] # seg 565 // [ 32436, 32460] -> [0x22A6,0x22BE] # seg 566 // [ 32461, 32542] -> [0x22C0,0x2311] # seg 567 // [ 32543, 32875] -> [0x2313,0x245F] # seg 568 // [ 32876, 32885] -> [0x246A,0x2473] # seg 569 // [ 32886, 32985] -> [0x249C,0x24FF] # seg 570 // [ 32986, 32989] -> [0x254C,0x254F] # seg 571 // [ 32990, 33002] -> [0x2574,0x2580] # seg 572 // [ 33003, 33005] -> [0x2590,0x2592] # seg 573 // [ 33006, 33015] -> [0x2596,0x259F] # seg 574 // [ 33016, 33031] -> [0x25A2,0x25B1] # seg 575 // [ 33032, 33039] -> [0x25B4,0x25BB] # seg 576 // [ 33040, 33047] -> [0x25BE,0x25C5] # seg 577 // [ 33048, 33052] -v # seg 578 at pos 15308 0x25C8, 0x25C9, 0x25CA, 0x25CC, 0x25CD, // [ 33053, 33070] -> [0x25D0,0x25E1] # seg 579 // [ 33071, 33101] -> [0x25E6,0x2604] # seg 580 // [ 33102, 33103] -> [0x2607,0x2608] # seg 581 // [ 33104, 33157] -> [0x260A,0x263F] # seg 582 // [ 33158, 33158] -> [0x2641,0x2641] # seg 583 // [ 33159, 35268] -> [0x2643,0x2E80] # seg 584 // [ 35269, 35275] -v # seg 585 at pos 15313 0x2E82, 0x2E83, 0x2E85, 0x2E86, 0x2E87, 0x2E89, 0x2E8A, // [ 35276, 35285] -> [0x2E8D,0x2E96] # seg 586 // [ 35286, 35300] -> [0x2E98,0x2EA6] # seg 587 // [ 35301, 35314] -v # seg 588 at pos 15320 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC, 0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, 0x2EB4, 0x2EB5, 0x2EB8, 0x2EB9, 0x2EBA, // [ 35315, 35328] -> [0x2EBC,0x2EC9] # seg 589 // [ 35329, 35621] -> [0x2ECB,0x2FEF] # seg 590 // [ 35622, 35633] -v # seg 591 at pos 15334 0x2FFC, 0x2FFD, 0x2FFE, 0x2FFF, 0x3004, 0x3018, 0x3019, 0x301A, 0x301B, 0x301C, 0x301F, 0x3020, // [ 35634, 35653] -> [0x302A,0x303D] # seg 592 // [ 35654, 35675] -v # seg 593 at pos 15346 0x303F, 0x3040, 0x3094, 0x3095, 0x3096, 0x3097, 0x3098, 0x3099, 0x309A, 0x309F, 0x30A0, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x30FB, 0x30FF, 0x3100, 0x3101, 0x3102, 0x3103, 0x3104, // [ 35676, 35921] -> [0x312A,0x321F] # seg 594 // [ 35922, 35928] -> [0x322A,0x3230] # seg 595 // [ 35929, 36041] -> [0x3232,0x32A2] # seg 596 // [ 36042, 36275] -> [0x32A4,0x338D] # seg 597 // [ 36276, 36287] -> [0x3390,0x339B] # seg 598 // [ 36288, 36289] -> [0x339F,0x33A0] # seg 599 // [ 36290, 36323] -> [0x33A2,0x33C3] # seg 600 // [ 36324, 36332] -> [0x33C5,0x33CD] # seg 601 // [ 36333, 36336] -v # seg 602 at pos 15368 0x33CF, 0x33D0, 0x33D3, 0x33D4, // [ 36337, 36449] -> [0x33D6,0x3446] # seg 603 // [ 36450, 36492] -> [0x3448,0x3472] # seg 604 // [ 36493, 36790] -> [0x3474,0x359D] # seg 605 // [ 36791, 36901] -> [0x359F,0x360D] # seg 606 // [ 36902, 36912] -> [0x360F,0x3619] # seg 607 // [ 36913, 37677] -> [0x361B,0x3917] # seg 608 // [ 37678, 37762] -> [0x3919,0x396D] # seg 609 // [ 37763, 37858] -> [0x396F,0x39CE] # seg 610 // [ 37859, 37872] -> [0x39D1,0x39DE] # seg 611 // [ 37873, 38019] -> [0x39E0,0x3A72] # seg 612 // [ 38020, 38237] -> [0x3A74,0x3B4D] # seg 613 // [ 38238, 38524] -> [0x3B4F,0x3C6D] # seg 614 // [ 38525, 38637] -> [0x3C6F,0x3CDF] # seg 615 // [ 38638, 39522] -> [0x3CE1,0x4055] # seg 616 // [ 39523, 39786] -> [0x4057,0x415E] # seg 617 // [ 39787, 40257] -> [0x4160,0x4336] # seg 618 // [ 40258, 40373] -> [0x4338,0x43AB] # seg 619 // [ 40374, 40377] -> [0x43AD,0x43B0] # seg 620 // [ 40378, 40420] -> [0x43B2,0x43DC] # seg 621 // [ 40421, 40668] -> [0x43DE,0x44D5] # seg 622 // [ 40669, 41041] -> [0x44D7,0x464B] # seg 623 // [ 41042, 41061] -> [0x464D,0x4660] # seg 624 // [ 41062, 41254] -> [0x4662,0x4722] # seg 625 // [ 41255, 41259] -> [0x4724,0x4728] # seg 626 // [ 41260, 41341] -> [0x472A,0x477B] # seg 627 // [ 41342, 41357] -> [0x477D,0x478C] # seg 628 // [ 41358, 41798] -> [0x478E,0x4946] # seg 629 // [ 41799, 41848] -> [0x4948,0x4979] # seg 630 // [ 41849, 41855] -v # seg 631 at pos 15372 0x497B, 0x497C, 0x497E, 0x497F, 0x4980, 0x4981, 0x4984, // [ 41856, 41875] -> [0x4987,0x499A] # seg 632 // [ 41876, 41878] -> [0x499C,0x499E] # seg 633 // [ 41879, 41900] -> [0x49A0,0x49B5] # seg 634 // [ 41901, 42603] -> [0x49B8,0x4C76] # seg 635 // [ 42604, 42642] -> [0x4C78,0x4C9E] # seg 636 // [ 42643, 42753] -> [0x4CA4,0x4D12] # seg 637 // [ 42754, 42901] -> [0x4D1A,0x4DAD] # seg 638 // [ 42902, 42982] -> [0x4DAF,0x4DFF] # seg 639 // [ 42983, 57408] -> [0x9FA6,0xD7FF] # seg 640 // [ 57409, 57410] -v # seg 641 at pos 15379 0xE76C, 0xE7C8, // [ 57411, 57423] -> [0xE7E7,0xE7F3] # seg 642 // [ 57424, 57459] -v # seg 643 at pos 15381 0xE815, 0xE819, 0xE81A, 0xE81B, 0xE81C, 0xE81D, 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, 0xE824, 0xE825, 0xE827, 0xE828, 0xE829, 0xE82A, 0xE82D, 0xE82E, 0xE82F, 0xE830, 0xE833, 0xE834, 0xE835, 0xE836, 0xE837, 0xE838, 0xE839, 0xE83A, 0xE83C, 0xE83D, 0xE83E, 0xE83F, 0xE840, 0xE841, 0xE842, // [ 57460, 57475] -> [0xE844,0xE853] # seg 644 // [ 57476, 57489] -> [0xE856,0xE863] # seg 645 // [ 57490, 61784] -> [0xE865,0xF92B] # seg 646 // [ 61785, 61860] -> [0xF92D,0xF978] # seg 647 // [ 61861, 61887] -> [0xF97A,0xF994] # seg 648 // [ 61888, 61968] -> [0xF996,0xF9E6] # seg 649 // [ 61969, 61977] -> [0xF9E8,0xF9F0] # seg 650 // [ 61978, 62003] -> [0xF9F2,0xFA0B] # seg 651 // [ 62004, 62017] -v # seg 652 at pos 15417 0xFA10, 0xFA12, 0xFA15, 0xFA16, 0xFA17, 0xFA19, 0xFA1A, 0xFA1B, 0xFA1C, 0xFA1D, 0xFA1E, 0xFA22, 0xFA25, 0xFA26, // [ 62018, 63047] -> [0xFA2A,0xFE2F] # seg 653 // [ 63048, 63055] -v # seg 654 at pos 15431 0xFE32, 0xFE45, 0xFE46, 0xFE47, 0xFE48, 0xFE53, 0xFE58, 0xFE67, // [ 63056, 63204] -> [0xFE6C,0xFF00] # seg 655 // [ 63205, 63333] -> [0xFF5F,0xFFDF] # seg 656 // [ 63334, 63359] -> [0xFFE6,0xFFFF] # seg 657 }; // Reverse const unsigned short CodePageGB18030_R[22354] = { // hot segments (indexes into segment table) 2, 103, 191, // number of segments 243, // segment table 0x0000, 0x0080, 0x00A4, 0x00B8, 0x00D7, 0x0102, 0x0113, 0x011C, 0x012B, 0x012C, 0x0144, 0x014E, 0x016B, 0x016C, 0x01CE, 0x01DD, 0x01F9, 0x01FA, 0x0251, 0x0252, 0x0261, 0x0262, 0x02C7, 0x02CC, 0x02D9, 0x02DA, 0x0391, 0x03A2, 0x03B1, 0x03C2, 0x03CA, 0x0401, 0x0402, 0x0410, 0x0416, 0x0430, 0x0436, 0x0450, 0x0452, 0x2010, 0x2027, 0x2030, 0x203C, 0x20AC, 0x20AD, 0x2103, 0x210A, 0x2116, 0x2117, 0x2121, 0x2122, 0x2160, 0x216C, 0x2170, 0x217A, 0x2190, 0x219A, 0x2208, 0x223E, 0x2248, 0x2253, 0x2260, 0x2270, 0x2295, 0x229A, 0x22A5, 0x22A6, 0x22BF, 0x22C0, 0x2312, 0x2313, 0x2460, 0x246A, 0x2474, 0x2488, 0x249C, 0x2500, 0x254C, 0x2550, 0x2574, 0x2581, 0x2590, 0x2596, 0x25A0, 0x25A2, 0x25B2, 0x25D0, 0x25E2, 0x25E6, 0x2605, 0x260A, 0x2640, 0x2643, 0x2E81, 0x2E8D, 0x2E97, 0x2E98, 0x2EA7, 0x2EBC, 0x2ECA, 0x2ECB, 0x2FF0, 0x2FFC, 0x3000, 0x3020, 0x3021, 0x302A, 0x303E, 0x3041, 0x3094, 0x30A1, 0x30F7, 0x3105, 0x312A, 0x3220, 0x322A, 0x3232, 0x32A3, 0x32A4, 0x338E, 0x3390, 0x339C, 0x33A2, 0x33C4, 0x33C5, 0x33CE, 0x33D6, 0x3447, 0x3448, 0x3473, 0x3474, 0x359E, 0x359F, 0x360E, 0x360F, 0x361A, 0x361B, 0x3918, 0x3919, 0x396E, 0x396F, 0x39CF, 0x39D1, 0x39DF, 0x39E0, 0x3A73, 0x3A74, 0x3B4E, 0x3B4F, 0x3C6E, 0x3C6F, 0x3CE0, 0x3CE1, 0x4056, 0x4057, 0x415F, 0x4160, 0x4337, 0x4338, 0x43AC, 0x43B2, 0x43DD, 0x43DE, 0x44D6, 0x44D7, 0x464C, 0x464D, 0x4661, 0x4662, 0x4723, 0x472A, 0x477C, 0x477D, 0x478D, 0x478E, 0x4947, 0x4948, 0x497A, 0x4987, 0x499B, 0x49A0, 0x49B6, 0x49B8, 0x4C77, 0x4C78, 0x4C9F, 0x4CA4, 0x4D13, 0x4D1A, 0x4DAE, 0x4DAF, 0x4E00, 0xA000, 0xD800, 0xE000, 0xE234, 0xE4C6, 0xE766, 0xE772, 0xE77D, 0xE785, 0xE78D, 0xE797, 0xE7A0, 0xE7AF, 0xE7BC, 0xE7C7, 0xE7CD, 0xE7E2, 0xE7E7, 0xE7F4, 0xE7FE, 0xE801, 0xE810, 0xE844, 0xE854, 0xE856, 0xE864, 0xE865, 0xF92C, 0xF92D, 0xF979, 0xF97A, 0xF995, 0xF996, 0xF9E7, 0xF9E8, 0xF9F1, 0xF9F2, 0xFA0C, 0xFA2A, 0xFE30, 0xFE49, 0xFE53, 0xFE59, 0xFE67, 0xFE6C, 0xFF01, 0xFF05, 0xFF5E, 0xFF5F, 0xFFE0, 0xFFE6, // compressed segments RCHAR, 23940, RCHAR, 23990, RCHAR, 24049, RCHAR, 24073, 666, 24088, RCHAR, 24119, 674, 24148, RCHAR, 24253, 688, 24281, 684, 24368, 689, 24383, RCHAR, 24485, 15590, 24498, 470, RCHAR, 502, RCHAR, 24690, 570, 24745, 564, 571, 612, 619, RCHAR, 24760, RCHAR, 31874, RCHAR, 31890, 160, 32002, RCHAR, 32092, 76, 32104, 15709, 32114, 174, 32176, 94, 32180, RCHAR, 32204, RCHAR, 32346, RCHAR, 32364, RCHAR, 32385, RCHAR, 32425, 44, 32436, 15607, 32461, 47, 32543, 150, 32876, 130, 110, 32886, 755, 32986, 15608, 32990, 15644, RCHAR, 33006, RCHAR, 33016, RCHAR, 33053, 15664, 33071, RCHAR, 33104, RCHAR, 33159, RCHAR, 35276, 23874, 35286, RCHAR, 35315, 23911, 35329, 15757, 35622, RCHAR, 35633, 15684, 35634, RCHAR, 282, RCHAR, 376, RCHAR, 694, 35676, 162, RCHAR, 35929, 15693, 36042, 15694, 36276, RCHAR, 36290, 15700, 36324, RCHAR, 36337, 23866, 36450, 23865, 36493, 23870, 36791, 23872, 36902, 23871, 36913, 23876, 37678, 23875, 37763, RCHAR, 37859, 23879, 37873, 23880, 38020, 23884, 38238, 23885, 38525, 23886, 38638, 23891, 39523, 23892, 39787, 23894, 40258, RCHAR, 40378, 23902, 40421, 23903, 40669, 23905, 41042, 23904, 41062, RCHAR, 41260, 23909, 41342, 23910, 41358, 23912, 41799, RCHAR, 41856, RCHAR, 41879, RCHAR, 41901, 23929, 42604, RCHAR, 42643, 23931, 42754, 23938, 42902, RCHAR, 43073, RCHAR, 846, 8178, 14916, RCHAR, 365, 462, 494, RCHAR, 555, 597, 645, 15673, RCHAR, 731, RCHAR, 57411, 15770, 752, 831, RCHAR, 57460, 23923, 57476, 23939, 57490, 23839, 61785, 23840, 61861, 23841, 61888, 23842, 61969, 23843, 61978, RCHAR, 62018, RCHAR, 15724, RCHAR, 15738, RCHAR, 63056, RCHAR, 192, 10, 63205, RCHAR, 63334, // uncompressed segments RCHAR, RCHAR, 21024, RCHAR, 21044, RCHAR, 21087, RCHAR, RCHAR, RCHAR, 21096, RCHAR, RCHAR, RCHAR, 21106, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21121, RCHAR, RCHAR, RCHAR, RCHAR, 21126, RCHAR, 21141, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21149, RCHAR, 21151, RCHAR, 21174, RCHAR, RCHAR, RCHAR, 21186, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21193, RCHAR, 21203, RCHAR, 21257, RCHAR, 21268, RCHAR, 21284, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21289, RCHAR, 21295, RCHAR, 21297, RCHAR, RCHAR, RCHAR, 21327, RCHAR, 21332, RCHAR, 21335, RCHAR, RCHAR, RCHAR, 21347, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, 21368, RCHAR, 21371, RCHAR, 21384, RCHAR, RCHAR, RCHAR, 21398, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21406, RCHAR, RCHAR, RCHAR, 21412, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21420, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21422, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21428, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21435, RCHAR, 21448, RCHAR, 21453, RCHAR, RCHAR, RCHAR, 21455, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 32, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21460, RCHAR, RCHAR, RCHAR, 21472, RCHAR, RCHAR, RCHAR, RCHAR, 21482, RCHAR, 21488, RCHAR, RCHAR, RCHAR, RCHAR, 21493, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21545, RCHAR, 21575, RCHAR, 21600, RCHAR, 21606, RCHAR, 21611, RCHAR, RCHAR, RCHAR, 21615, RCHAR, // [0x0080,0x00A3] -> [ 23940, 23975] # seg 1 // [0x00B8,0x00D6] -> [ 23990, 24020] # seg 3 // [0x0102,0x0112] -> [ 24049, 24065] # seg 5 // [0x011C,0x012A] -> [ 24073, 24087] # seg 7 // [0x012B,0x012B] -> [ 666, 666] # seg 8 // [0x014E,0x016A] -> [ 24119, 24147] # seg 11 // [0x016B,0x016B] -> [ 674, 674] # seg 12 // [0x01DD,0x01F8] -> [ 24253, 24280] # seg 15 // [0x01F9,0x01F9] -> [ 688, 688] # seg 16 // [0x0251,0x0251] -> [ 684, 684] # seg 18 // [0x0261,0x0261] -> [ 689, 689] # seg 20 // [0x02CC,0x02D8] -> [ 24485, 24497] # seg 23 // [0x02D9,0x02D9] -> [ 15590, 15590] # seg 24 // [0x0391,0x03A1] -> [ 470, 486] # seg 26 // [0x03B1,0x03C1] -> [ 502, 518] # seg 28 // [0x03CA,0x0400] -> [ 24690, 24744] # seg 30 // [0x0402,0x040F] -> [ 24745, 24758] # seg 32 // [0x0416,0x042F] -> [ 571, 596] # seg 34 // [0x0436,0x044F] -> [ 619, 644] # seg 36 // [0x0452,0x200F] -> [ 24760, 31861] # seg 38 // [0x2027,0x202F] -> [ 31874, 31882] # seg 40 // [0x203C,0x20AB] -> [ 31890, 32001] # seg 42 // [0x20AD,0x2102] -> [ 32002, 32087] # seg 44 // [0x210A,0x2115] -> [ 32092, 32103] # seg 46 // [0x2117,0x2120] -> [ 32104, 32113] # seg 48 // [0x2122,0x215F] -> [ 32114, 32175] # seg 50 // [0x216C,0x216F] -> [ 32176, 32179] # seg 52 // [0x217A,0x218F] -> [ 32180, 32201] # seg 54 // [0x219A,0x2207] -> [ 32204, 32313] # seg 56 // [0x223E,0x2247] -> [ 32346, 32355] # seg 58 // [0x2253,0x225F] -> [ 32364, 32376] # seg 60 // [0x2270,0x2294] -> [ 32385, 32421] # seg 62 // [0x229A,0x22A4] -> [ 32425, 32435] # seg 64 // [0x22A6,0x22BE] -> [ 32436, 32460] # seg 66 // [0x22C0,0x2311] -> [ 32461, 32542] # seg 68 // [0x2313,0x245F] -> [ 32543, 32875] # seg 70 // [0x246A,0x2473] -> [ 32876, 32885] # seg 72 // [0x2488,0x249B] -> [ 110, 129] # seg 74 // [0x2500,0x254B] -> [ 755, 830] # seg 76 // [0x2550,0x2573] -> [ 15608, 15643] # seg 78 // [0x2581,0x258F] -> [ 15644, 15658] # seg 80 // [0x2596,0x259F] -> [ 33006, 33015] # seg 82 // [0x25A2,0x25B1] -> [ 33016, 33031] # seg 84 // [0x25D0,0x25E1] -> [ 33053, 33070] # seg 86 // [0x25E6,0x2604] -> [ 33071, 33101] # seg 88 // [0x260A,0x263F] -> [ 33104, 33157] # seg 90 // [0x2643,0x2E80] -> [ 33159, 35268] # seg 92 // [0x2E8D,0x2E96] -> [ 35276, 35285] # seg 94 // [0x2E98,0x2EA6] -> [ 35286, 35300] # seg 96 // [0x2EBC,0x2EC9] -> [ 35315, 35328] # seg 98 // [0x2ECB,0x2FEF] -> [ 35329, 35621] # seg 100 // [0x2FFC,0x2FFF] -> [ 35622, 35625] # seg 102 // [0x3000,0x301F] -v # seg 103 at pos 0 0, 1, 2, 7, 35626, 8, 15721, 15769, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 15670, 93, 17, 18, 27, 28, 35627, 35628, 35629, 35630, 35631, 15671, 15672, 35632, // [0x3041,0x3093] -> [ 282, 364] # seg 108 // [0x30A1,0x30F6] -> [ 376, 461] # seg 110 // [0x3105,0x3129] -> [ 694, 730] # seg 112 // [0x312A,0x321F] -> [ 35676, 35921] # seg 113 // [0x3232,0x32A2] -> [ 35929, 36041] # seg 116 // [0x32A3,0x32A3] -> [ 15693, 15693] # seg 117 // [0x338E,0x338F] -> [ 15694, 15695] # seg 119 // [0x33A2,0x33C3] -> [ 36290, 36323] # seg 122 // [0x33C4,0x33C4] -> [ 15700, 15700] # seg 123 // [0x33D6,0x3446] -> [ 36337, 36449] # seg 126 // [0x3447,0x3447] -> [ 23866, 23866] # seg 127 // [0x3473,0x3473] -> [ 23865, 23865] # seg 129 // [0x359E,0x359E] -> [ 23870, 23870] # seg 131 // [0x360E,0x360E] -> [ 23872, 23872] # seg 133 // [0x361A,0x361A] -> [ 23871, 23871] # seg 135 // [0x3918,0x3918] -> [ 23876, 23876] # seg 137 // [0x396E,0x396E] -> [ 23875, 23875] # seg 139 // [0x39D1,0x39DE] -> [ 37859, 37872] # seg 142 // [0x39DF,0x39DF] -> [ 23879, 23879] # seg 143 // [0x3A73,0x3A73] -> [ 23880, 23880] # seg 145 // [0x3B4E,0x3B4E] -> [ 23884, 23884] # seg 147 // [0x3C6E,0x3C6E] -> [ 23885, 23885] # seg 149 // [0x3CE0,0x3CE0] -> [ 23886, 23886] # seg 151 // [0x4056,0x4056] -> [ 23891, 23891] # seg 153 // [0x415F,0x415F] -> [ 23892, 23892] # seg 155 // [0x4337,0x4337] -> [ 23894, 23894] # seg 157 // [0x43B2,0x43DC] -> [ 40378, 40420] # seg 160 // [0x43DD,0x43DD] -> [ 23902, 23902] # seg 161 // [0x44D6,0x44D6] -> [ 23903, 23903] # seg 163 // [0x464C,0x464C] -> [ 23905, 23905] # seg 165 // [0x4661,0x4661] -> [ 23904, 23904] # seg 167 // [0x472A,0x477B] -> [ 41260, 41341] # seg 170 // [0x477C,0x477C] -> [ 23909, 23909] # seg 171 // [0x478D,0x478D] -> [ 23910, 23910] # seg 173 // [0x4947,0x4947] -> [ 23912, 23912] # seg 175 // [0x4987,0x499A] -> [ 41856, 41875] # seg 178 // [0x49A0,0x49B5] -> [ 41879, 41900] # seg 180 // [0x49B8,0x4C76] -> [ 41901, 42603] # seg 182 // [0x4C77,0x4C77] -> [ 23929, 23929] # seg 183 // [0x4CA4,0x4D12] -> [ 42643, 42753] # seg 186 // [0x4D13,0x4D19] -> [ 23931, 23937] # seg 187 // [0x4DAE,0x4DAE] -> [ 23938, 23938] # seg 189 // [0x4E00,0x9FFF] -v # seg 191 at pos 32 4632, 1974, 8836, 3540, 8837, 8838, 8839, 4217, 4928, 3758, 3806, 4357, 5171, 1624, 4774, 8840, 5173, 1774, 8841, 5083, 3621, 5176, 3885, 8842, 3651, 1594, 4626, 1837, 1984, 3978, 5178, 8843, 8844, 8845, 1983, 8846, 3036, 4558, 8847, 3764, 5182, 8848, 2247, 4541, 6263, 5029, 8849, 8850, 2132, 8851, 1799, 8852, 3064, 8853, 5197, 8854, 4207, 1883, 4239, 5068, 8855, 2999, 2782, 5184, 8856, 8857, 8858, 3332, 8859, 2760, 8860, 5186, 3215, 4674, 8861, 4995, 4287, 4894, 2434, 2073, 2967, 8862, 3502, 3433, 3610, 8863, 2307, 8864, 1734, 4655, 8865, 8866, 5200, 2762, 3559, 4623, 4339, 4394, 8867, 8868, 8869, 8870, 3926, 8871, 8872, 5201, 8873, 8874, 8875, 8876, 8877, 8878, 3183, 3151, 8879, 3738, 8880, 8881, 8882, 8883, 8884, 8885, 8886, 8887, 8888, 8889, 3583, 8890, 8891, 8892, 8893, 8894, 8895, 8896, 3050, 8897, 4771, 4976, 8898, 3887, 2067, 5170, 4757, 2906, 8899, 4831, 2448, 5202, 4298, 2739, 8900, 8901, 5177, 8902, 4550, 4426, 8903, 8904, 8905, 5198, 5342, 4221, 2845, 8906, 2658, 2354, 4669, 1687, 2413, 3311, 8907, 4400, 2734, 4139, 3040, 8908, 8909, 8910, 3626, 5344, 8911, 5347, 8912, 8913, 8914, 8915, 3708, 5242, 8916, 8917, 8918, 4663, 3871, 3707, 5245, 5243, 5207, 2717, 3522, 1771, 8919, 5244, 2712, 2704, 8920, 3717, 1836, 8921, 8922, 3157, 8923, 1651, 5123, 3896, 4038, 4931, 2183, 4364, 8924, 8925, 8926, 5321, 5249, 3581, 8927, 5247, 8928, 1875, 3085, 4657, 8929, 8930, 5246, 8931, 4644, 5248, 3234, 8932, 8933, 8934, 4597, 8935, 5038, 5251, 8936, 5254, 2631, 2596, 8937, 8938, 8939, 3711, 8940, 2128, 8941, 2101, 8942, 3560, 8943, 8944, 8945, 8946, 8947, 8948, 8949, 5257, 4638, 8950, 8951, 4302, 2568, 2159, 2072, 4478, 8952, 8953, 8954, 8955, 8956, 5039, 4736, 2522, 2508, 5250, 8957, 8958, 3760, 4245, 1796, 8959, 5252, 8960, 3802, 5255, 3156, 5256, 8961, 8962, 4246, 5258, 8963, 8964, 8965, 1611, 2287, 8966, 5266, 8967, 1482, 8968, 3077, 8969, 3835, 8970, 3984, 8971, 3985, 5267, 8972, 8973, 8974, 8975, 8976, 1951, 8977, 8978, 1890, 8979, 8980, 8981, 8982, 8983, 8984, 4256, 1924, 5076, 5159, 4750, 8985, 4110, 8986, 2395, 8987, 5265, 5323, 4763, 5262, 2147, 5162, 5263, 5259, 5264, 3356, 8988, 8989, 4721, 5253, 5324, 8990, 5260, 8991, 3452, 8992, 8993, 2961, 8994, 8995, 4591, 1468, 8996, 8997, 2586, 5269, 8998, 5268, 8999, 9000, 9001, 9002, 5275, 5277, 9003, 5274, 3878, 9004, 9005, 9006, 5272, 5003, 9007, 9008, 9009, 1753, 5271, 9010, 3006, 9011, 3897, 9012, 5273, 9013, 5270, 9014, 9015, 5279, 9016, 9017, 1990, 9018, 9019, 9020, 2264, 9021, 4637, 9022, 9023, 4355, 9024, 9025, 3135, 9026, 2667, 4963, 1661, 3611, 2894, 5276, 9027, 5278, 9028, 4303, 2427, 9029, 9030, 9031, 9032, 9033, 3625, 9034, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9042, 1570, 9043, 9044, 9045, 1842, 2050, 5283, 9046, 9047, 9048, 9049, 2820, 9050, 9051, 9052, 5325, 3617, 3007, 5287, 9053, 9054, 9055, 9056, 9057, 4002, 2160, 9058, 5284, 9059, 5286, 1506, 4764, 5288, 9060, 4454, 9061, 5285, 9062, 9063, 5280, 9064, 5281, 3016, 5282, 9065, 9066, 2620, 4479, 2170, 9067, 2792, 9068, 5292, 9069, 9070, 9071, 9072, 5289, 9073, 1428, 9074, 9075, 9076, 5297, 9077, 9078, 9079, 9080, 9081, 9082, 9083, 9084, 9085, 9086, 9087, 9088, 9089, 5299, 1525, 9090, 5294, 9091, 9092, 1904, 9093, 2808, 9094, 9095, 9096, 4081, 2431, 4653, 9097, 5298, 9098, 9099, 2703, 9100, 1702, 9101, 9102, 9103, 5300, 2800, 9104, 5301, 5290, 3352, 9105, 5293, 5296, 5295, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 9114, 9115, 9116, 4901, 9117, 5002, 9118, 3638, 9119, 9120, 9121, 9122, 5303, 9123, 9124, 9125, 2594, 5305, 9126, 9127, 9128, 5291, 9129, 5306, 3488, 9130, 9131, 9132, 9133, 9134, 5304, 9135, 9136, 9137, 9138, 5161, 9139, 4138, 9140, 9141, 9142, 9143, 9144, 9145, 9146, 9147, 2632, 9148, 9149, 9150, 9151, 9152, 9153, 5307, 9154, 9155, 9156, 9157, 9158, 9159, 9160, 9161, 9162, 3411, 4156, 9163, 9164, 9165, 5308, 9166, 9167, 5302, 1696, 2913, 9168, 9169, 9170, 9171, 2182, 9172, 9173, 3005, 9174, 9175, 9176, 9177, 1497, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 1871, 9199, 5309, 9200, 5310, 1787, 5311, 9201, 9202, 1848, 9203, 9204, 9205, 9206, 9207, 1442, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 5312, 3780, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 4404, 9234, 9235, 9236, 9237, 9238, 9239, 5313, 9240, 9241, 9242, 3044, 9243, 9244, 9245, 9246, 9247, 9248, 9249, 9250, 9251, 9252, 9253, 5317, 3773, 9254, 9255, 9256, 9257, 5316, 5315, 5318, 9258, 9259, 9260, 9261, 4006, 9262, 2640, 9263, 9264, 9265, 9266, 9267, 3484, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 5314, 5319, 9278, 9279, 9280, 5320, 9281, 9282, 9283, 9284, 9285, 9286, 3734, 9287, 9288, 9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299, 9300, 2973, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 2062, 5172, 4835, 9330, 4803, 4471, 1759, 4942, 9331, 4363, 2321, 9332, 2862, 9333, 3261, 9334, 9335, 9336, 2023, 9337, 9338, 4170, 5341, 5343, 9339, 9340, 9341, 1898, 9342, 1994, 9343, 9344, 9345, 9346, 9347, 2729, 9348, 9349, 3740, 9350, 9351, 3676, 9352, 9353, 1452, 2266, 3096, 5329, 9354, 2941, 2273, 9355, 2311, 4460, 1591, 3545, 2788, 1947, 5115, 9356, 4599, 2607, 3915, 9357, 9358, 2566, 5333, 5240, 9359, 9360, 3347, 9361, 9362, 2213, 3694, 9363, 9364, 1662, 4850, 9365, 9366, 9367, 9368, 3211, 9369, 9370, 3260, 5359, 3728, 9371, 4437, 9372, 2817, 3392, 9373, 9374, 9375, 2313, 9376, 5360, 9377, 4802, 5361, 9378, 9379, 9380, 9381, 9382, 5354, 1985, 9383, 9384, 2142, 1592, 5355, 1760, 2811, 9385, 2905, 4622, 2981, 9386, 9387, 9388, 1992, 5357, 5356, 9389, 9390, 2752, 9391, 9392, 9393, 3541, 9394, 5103, 5358, 9395, 3032, 9396, 1961, 3079, 9397, 9398, 2622, 9399, 1838, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 3068, 9409, 3382, 9410, 9411, 2561, 2085, 9412, 9413, 2146, 9414, 9415, 9416, 9417, 9418, 9419, 5339, 9420, 3507, 9421, 2832, 2486, 9422, 9423, 1921, 9424, 5492, 4472, 9425, 4160, 1437, 1777, 2530, 5493, 2364, 9426, 4861, 1901, 1962, 5223, 3713, 9427, 9428, 2121, 3619, 5224, 9429, 2834, 9430, 9431, 5478, 5225, 9432, 9433, 4461, 2457, 9434, 9435, 9436, 6985, 3055, 3092, 4875, 2214, 1805, 9437, 1776, 9438, 9439, 3789, 9440, 9441, 9442, 3431, 9443, 9444, 9445, 3440, 3004, 9446, 1583, 9447, 5226, 2301, 9448, 1908, 9449, 9450, 5227, 9451, 9452, 5019, 3949, 3680, 3777, 1829, 2863, 9453, 2339, 9454, 5228, 5229, 2044, 2570, 4115, 9455, 9456, 9457, 9458, 9459, 9460, 4410, 9461, 5230, 3587, 9462, 9463, 2303, 2634, 9464, 9465, 4103, 9466, 3519, 9467, 9468, 9469, 9470, 9471, 5233, 9472, 5231, 9473, 9474, 5232, 9475, 9476, 9477, 1503, 9478, 2796, 9479, 3856, 2621, 9480, 9481, 9482, 9483, 2178, 9484, 9485, 2239, 9486, 9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495, 5235, 9496, 2674, 9497, 5237, 5236, 9498, 9499, 9500, 9501, 9502, 3475, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 5238, 9510, 9511, 5239, 9512, 9513, 9514, 9515, 9516, 9517, 9518, 3013, 9519, 3681, 1485, 2261, 2588, 4310, 5480, 3058, 9520, 9521, 9522, 9523, 1988, 5071, 3395, 2688, 5481, 5482, 9524, 9525, 9526, 3001, 2727, 2958, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, 5483, 3891, 9537, 9538, 9539, 1607, 9540, 9541, 9542, 4733, 9543, 3262, 9544, 4522, 9545, 9546, 9547, 9548, 5485, 9549, 2966, 9550, 9551, 9552, 5486, 9553, 2836, 9554, 9555, 9556, 9557, 9558, 9559, 3317, 9560, 9561, 9562, 9563, 3629, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 5487, 9575, 9576, 9577, 9578, 9579, 9580, 9581, 9582, 5335, 3814, 9583, 9584, 9585, 2275, 4309, 4833, 9586, 9587, 9588, 9589, 1501, 1835, 9590, 4474, 9591, 9592, 9593, 9594, 5336, 9595, 5776, 5338, 9596, 9597, 9598, 9599, 5185, 2458, 1520, 9600, 1746, 5215, 9601, 9602, 4842, 9603, 9604, 2650, 2898, 9605, 4350, 9606, 9607, 5217, 9608, 9609, 9610, 2110, 9611, 9612, 9613, 5218, 9614, 9615, 9616, 9617, 9618, 9619, 9620, 9621, 9622, 9623, 3482, 3659, 4634, 9624, 9625, 5219, 3357, 9626, 3867, 9627, 3578, 9628, 5175, 9629, 3852, 4300, 2503, 1484, 9630, 9631, 9632, 2453, 4430, 9633, 1519, 5143, 5106, 9634, 1884, 3185, 3336, 9635, 9636, 1606, 9637, 1620, 9638, 1572, 5845, 4915, 2827, 3113, 5222, 3118, 9639, 5221, 4281, 9640, 5421, 9641, 4261, 9642, 9643, 5189, 3209, 4700, 4232, 9644, 2557, 3685, 3150, 9645, 2802, 4439, 9646, 5422, 9647, 9648, 9649, 9650, 3639, 9651, 9652, 1698, 9653, 2055, 4133, 3003, 9654, 9655, 3000, 9656, 4536, 4576, 5208, 9657, 9658, 9659, 9660, 9661, 9662, 9663, 1659, 9664, 9665, 2982, 9666, 2430, 9667, 9668, 5209, 9669, 4806, 9670, 9671, 4388, 5210, 9672, 5211, 4358, 9673, 1779, 2764, 9674, 9675, 9676, 9677, 5212, 9678, 9679, 9680, 9681, 9682, 9683, 9684, 5495, 9685, 9686, 9687, 9688, 3670, 9689, 9690, 9691, 4379, 9692, 3759, 1643, 9693, 9694, 9695, 9696, 9697, 4753, 1667, 2553, 4748, 3958, 2087, 9698, 9699, 9700, 2069, 9701, 9702, 3922, 9703, 3666, 3913, 1571, 4497, 9704, 3432, 9705, 9706, 9707, 5488, 1973, 9708, 9709, 2877, 2292, 2793, 3084, 9710, 5849, 5848, 5008, 2679, 4944, 1449, 1976, 2860, 4049, 5846, 3876, 4749, 9711, 5216, 4627, 2386, 3977, 4071, 9712, 5850, 1959, 5847, 9713, 9714, 9715, 4784, 9716, 1743, 2248, 9717, 5853, 9718, 2396, 2547, 1964, 9719, 4147, 3286, 2432, 2997, 4169, 4405, 5851, 4360, 9720, 3133, 5852, 3181, 9721, 9722, 9723, 2818, 9724, 3070, 4179, 4692, 2112, 5860, 9725, 5863, 9726, 9727, 2148, 1450, 2027, 2119, 9728, 2361, 4134, 2871, 3964, 3561, 9729, 4989, 5864, 9730, 4295, 1710, 9731, 9732, 4321, 1806, 9733, 4268, 2429, 9734, 4294, 9735, 4540, 9736, 9737, 5859, 9738, 9739, 1869, 9740, 1733, 9741, 2231, 5854, 9742, 9743, 9744, 9745, 3326, 9746, 5855, 5856, 5857, 3410, 5858, 5861, 4810, 5862, 9747, 3597, 4285, 9748, 9749, 9750, 9751, 9752, 3345, 9753, 5869, 9754, 5874, 9755, 5041, 9756, 9757, 9758, 9759, 9760, 9761, 9762, 9763, 5868, 5885, 4251, 9764, 2388, 5873, 5867, 3445, 9765, 9766, 3834, 2433, 3287, 9767, 9768, 2780, 9769, 5865, 9770, 5872, 9771, 3439, 9772, 9773, 9774, 9775, 4893, 2394, 9776, 2769, 4728, 2193, 9777, 5049, 9778, 5866, 2285, 2826, 9779, 9780, 3099, 5870, 5871, 9781, 5875, 9782, 9783, 9784, 9785, 9786, 5886, 5896, 9787, 5882, 5881, 5116, 5894, 5895, 6466, 4612, 5877, 9788, 2828, 9789, 4852, 9790, 2859, 5879, 9791, 9792, 9793, 4367, 9794, 9795, 5888, 9796, 4553, 9797, 5889, 1416, 3500, 5878, 9798, 2418, 9799, 2036, 4194, 2349, 4846, 9800, 9801, 5890, 4399, 1414, 5898, 5876, 4549, 5880, 5883, 5884, 5887, 9802, 2452, 9803, 5891, 5892, 9804, 5893, 5897, 5899, 4719, 9805, 9806, 9807, 9808, 9809, 2232, 3405, 5901, 3817, 3015, 3325, 9810, 9811, 2881, 4411, 9812, 9813, 9814, 4947, 5905, 9815, 9816, 9817, 9818, 9819, 9820, 1621, 9821, 2412, 5903, 9822, 5484, 9823, 4579, 9824, 9825, 9826, 9827, 4031, 1814, 9828, 1415, 9829, 9830, 9831, 9832, 9833, 5908, 4079, 5909, 9834, 9835, 5904, 9836, 9837, 9838, 9839, 9840, 9841, 5900, 9842, 9843, 9844, 9845, 5902, 9846, 5906, 5907, 2472, 9847, 9848, 5910, 9849, 9850, 5911, 9851, 2446, 9852, 3912, 4237, 5928, 1701, 9853, 5927, 9854, 9855, 9856, 5922, 9857, 9858, 9859, 9860, 5921, 9861, 4192, 5919, 9862, 5917, 9863, 2867, 5111, 9864, 3803, 9865, 9866, 5915, 1410, 9867, 9868, 9869, 9870, 9871, 5920, 9872, 9873, 9874, 9875, 5918, 5923, 9876, 9877, 9878, 9879, 9880, 5929, 9881, 9882, 9883, 9884, 2107, 9885, 9886, 3478, 3781, 2931, 5912, 9887, 9888, 3413, 9889, 5205, 5916, 3375, 9890, 9891, 9892, 9893, 9894, 9895, 5924, 5925, 5926, 4422, 9896, 9897, 5941, 4109, 9898, 5938, 9899, 2825, 5936, 4254, 5932, 3797, 9900, 9901, 2927, 5935, 2426, 2365, 5930, 9902, 9903, 9904, 5913, 9905, 5940, 9906, 9907, 5945, 9908, 9909, 9910, 1798, 5946, 9911, 9912, 4341, 2389, 9913, 5937, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 4507, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 5933, 9930, 4884, 9931, 5914, 9932, 3454, 9933, 5934, 9934, 4786, 9935, 5943, 5944, 9936, 9937, 9938, 9939, 9940, 5957, 4482, 9941, 9942, 9943, 5949, 9944, 9945, 5962, 5963, 9946, 9947, 9948, 5951, 5931, 3763, 5954, 9949, 5939, 9950, 9951, 9952, 9953, 9954, 3893, 5956, 9955, 5942, 9956, 4272, 9957, 3982, 5966, 5959, 5955, 9958, 5964, 9959, 5947, 5952, 5953, 9960, 9961, 5958, 9962, 9963, 5960, 5961, 9964, 5965, 9965, 5948, 9966, 9967, 9968, 9969, 9970, 3999, 5974, 9971, 5975, 5971, 9972, 9973, 9974, 9975, 9976, 9977, 5969, 2583, 9978, 9979, 5970, 9980, 2195, 5206, 9981, 9982, 9983, 9984, 9985, 9986, 9987, 9988, 4491, 9989, 9990, 3180, 9991, 9992, 5968, 5950, 9993, 9994, 9995, 5973, 5972, 9996, 9997, 5976, 9998, 9999, 10000, 10001, 5981, 5977, 10002, 10003, 10004, 5067, 1707, 10005, 5151, 10006, 3974, 10007, 10008, 5979, 10009, 4320, 10010, 10011, 10012, 2406, 10013, 10014, 10015, 10016, 10017, 10018, 10019, 10020, 10021, 10022, 10023, 10024, 5986, 5982, 4618, 10025, 10026, 10027, 10028, 10029, 5987, 10030, 10031, 5980, 5978, 5984, 10032, 10033, 5985, 10034, 10035, 10036, 10037, 10038, 5983, 10039, 5989, 10040, 10041, 10042, 3564, 5181, 4868, 5991, 3894, 10043, 10044, 10045, 10046, 5990, 10047, 10048, 10049, 10050, 2194, 10051, 10052, 10053, 10054, 5992, 5993, 10055, 10056, 10057, 10058, 10059, 10060, 10061, 10062, 5994, 5988, 10063, 10064, 10065, 10066, 10067, 10068, 10069, 2380, 4112, 10070, 10071, 10072, 5995, 10073, 10074, 10075, 10076, 10077, 10078, 10079, 10080, 10081, 10082, 10083, 10084, 10085, 10086, 10087, 4412, 10088, 10089, 10090, 10091, 10092, 10093, 10094, 10095, 10096, 10097, 10098, 5996, 10099, 10100, 10101, 10102, 10103, 10104, 10105, 3699, 10106, 10107, 10108, 10109, 2663, 10110, 10111, 10112, 10113, 10114, 10115, 10116, 10117, 10118, 10119, 10120, 10121, 10122, 3339, 10123, 10124, 10125, 10126, 10127, 10128, 10129, 10130, 10131, 5997, 10132, 10133, 5998, 10134, 10135, 3655, 3983, 10136, 5999, 2499, 5191, 4687, 6000, 4172, 10137, 2031, 10138, 10139, 10140, 10141, 10142, 10143, 6002, 10144, 4809, 10145, 10146, 2920, 1834, 10147, 10148, 4236, 6001, 10149, 10150, 10151, 6003, 2299, 10152, 10153, 2345, 4163, 6004, 10154, 10155, 10156, 3529, 6005, 10157, 4811, 10158, 3671, 6007, 6006, 10159, 10160, 10161, 10162, 10163, 10164, 10165, 10166, 10167, 10168, 10169, 10170, 10171, 10172, 10173, 10174, 10175, 6008, 10176, 10177, 4168, 10178, 10179, 10180, 3858, 10181, 10182, 10183, 10184, 4851, 5506, 5508, 10185, 5507, 2326, 5511, 5512, 1935, 10186, 10187, 5509, 10188, 10189, 10190, 10191, 10192, 5510, 1692, 5514, 10193, 10194, 2531, 10195, 5004, 10196, 5515, 10197, 10198, 10199, 10200, 2814, 10201, 10202, 2094, 10203, 5499, 4055, 2837, 2464, 5163, 2870, 10204, 10205, 10206, 10207, 10208, 2892, 10209, 10210, 2602, 4060, 5513, 1460, 4304, 2123, 5100, 3511, 10211, 10212, 2917, 10213, 4066, 10214, 5522, 5516, 3503, 5518, 10215, 5523, 10216, 3470, 10217, 10218, 10219, 5525, 10220, 10221, 5524, 2851, 10222, 10223, 10224, 5521, 5520, 10225, 10226, 10227, 10228, 10229, 1810, 2925, 3103, 5517, 5519, 10230, 10231, 10232, 10233, 4462, 5528, 10234, 10235, 10236, 10237, 10238, 2974, 5533, 10239, 10240, 10241, 10242, 10243, 10244, 10245, 2039, 10246, 10247, 10248, 10249, 5534, 5501, 2279, 4804, 5527, 10250, 2868, 5531, 10251, 5500, 10252, 1949, 10253, 5526, 2888, 10254, 10255, 10256, 5529, 10257, 5532, 10258, 10259, 10260, 5540, 10261, 10262, 10263, 10264, 10265, 10266, 10267, 10268, 10269, 2256, 1412, 10270, 10271, 10272, 10273, 10274, 10275, 10276, 3182, 10277, 10278, 1730, 5530, 10279, 10280, 5539, 10281, 3527, 5535, 10282, 10283, 5536, 5538, 5537, 10284, 10285, 5545, 10286, 4781, 1623, 10287, 10288, 10289, 5544, 10290, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 5549, 10298, 5542, 10299, 10300, 10301, 10302, 5541, 10303, 10304, 10305, 5543, 3447, 2532, 10306, 10307, 5548, 10308, 10309, 5550, 10310, 4076, 10311, 10312, 10313, 2022, 5671, 10314, 10315, 10316, 5546, 10317, 5547, 10318, 10319, 10320, 3592, 10321, 10322, 10323, 2046, 10324, 10325, 10326, 5552, 10327, 10328, 10329, 10330, 5551, 10331, 5554, 1507, 10332, 10333, 1923, 10334, 10335, 10336, 10337, 10338, 2835, 10339, 10340, 10341, 10342, 10343, 4574, 10344, 10345, 10346, 10347, 2007, 10348, 10349, 10350, 10351, 10352, 10353, 10354, 10355, 10356, 10357, 10358, 10359, 10360, 10361, 5553, 10362, 10363, 10364, 10365, 10366, 10367, 10368, 4037, 7038, 10369, 10370, 10371, 4007, 10372, 10373, 4041, 10374, 10375, 10376, 4074, 10377, 10378, 10379, 10380, 10381, 3756, 10382, 10383, 10384, 10385, 10386, 10387, 5555, 10388, 10389, 10390, 10391, 10392, 4119, 5556, 10393, 10394, 10395, 10396, 10397, 10398, 10399, 10400, 10401, 10402, 10403, 10404, 10405, 10406, 10407, 10408, 10409, 5502, 10410, 5560, 5557, 10411, 2744, 10412, 3944, 10413, 10414, 10415, 5558, 10416, 10417, 10418, 10419, 10420, 10421, 10422, 10423, 3801, 3314, 10424, 10425, 10426, 10427, 10428, 3600, 5559, 10429, 10430, 10431, 4879, 4487, 10432, 10433, 10434, 10435, 10436, 10437, 10438, 10439, 3300, 2026, 10440, 10441, 10442, 10443, 10444, 10445, 10446, 10447, 10448, 10449, 10450, 10451, 10452, 10453, 10454, 10455, 10456, 10457, 5503, 10458, 10459, 10460, 10461, 1561, 10462, 10463, 10464, 5504, 10465, 10466, 10467, 10468, 10469, 10470, 10471, 10472, 10473, 10474, 10475, 5505, 10476, 10477, 10478, 2379, 10479, 10480, 10481, 10482, 10483, 10484, 10485, 10486, 10487, 10488, 10489, 10490, 10491, 10492, 3697, 10493, 10494, 10495, 10496, 10497, 10498, 3884, 3706, 10499, 5094, 10500, 3848, 10501, 10502, 2858, 10503, 10504, 2437, 10505, 10506, 4633, 10507, 10508, 10509, 10510, 10511, 10512, 10513, 10514, 6135, 10515, 1791, 10516, 10517, 1527, 10518, 10519, 10520, 10521, 10522, 2181, 10523, 4359, 10524, 10525, 10526, 10527, 5334, 4329, 4201, 10528, 10529, 5340, 2037, 10530, 4630, 10531, 10532, 2282, 10533, 10534, 10535, 10536, 6134, 6132, 10537, 1868, 10538, 4117, 4052, 2149, 10539, 5187, 4586, 2376, 10540, 3860, 10541, 10542, 4158, 10543, 10544, 4641, 2887, 2585, 2038, 10545, 5770, 10546, 10547, 10548, 10549, 5771, 5479, 10550, 4568, 10551, 10552, 3547, 3335, 2145, 10553, 2127, 10554, 10555, 2911, 5139, 10556, 3562, 10557, 10558, 1531, 5773, 2648, 4096, 5775, 10559, 5774, 10560, 10561, 10562, 10563, 10564, 1955, 10565, 3820, 10566, 10567, 1443, 10568, 10569, 10570, 10571, 10572, 10573, 10574, 10575, 10576, 10577, 10578, 10579, 10580, 3397, 3394, 10581, 3333, 10582, 2610, 4040, 10583, 10584, 10585, 2384, 10586, 10587, 10588, 6480, 3736, 6481, 4228, 10589, 5092, 2191, 3173, 10590, 3714, 10591, 10592, 6482, 10593, 10594, 10595, 10596, 2015, 2580, 10597, 10598, 4604, 6486, 10599, 3273, 10600, 10601, 10602, 10603, 6489, 10604, 10605, 10606, 10607, 6485, 6490, 4190, 10608, 10609, 2100, 6483, 6484, 6488, 10610, 10611, 3350, 6493, 10612, 10613, 6492, 10614, 10615, 10616, 10617, 10618, 10619, 3230, 10620, 3539, 10621, 10622, 6495, 10623, 10624, 10625, 10626, 10627, 10628, 10629, 3312, 10630, 10631, 10632, 6487, 3881, 10633, 10634, 10635, 10636, 2698, 2290, 6491, 4470, 4244, 10637, 10638, 6494, 6501, 10639, 4611, 10640, 2641, 6498, 10641, 10642, 10643, 10644, 10645, 6500, 10646, 2962, 10647, 10648, 4649, 10649, 10650, 10651, 2544, 10652, 10653, 10654, 10655, 10656, 10657, 10658, 10659, 10660, 10661, 10662, 10663, 6502, 10664, 4691, 10665, 10666, 10667, 5118, 10668, 4229, 10669, 4197, 3107, 6496, 6497, 2662, 6499, 6504, 10670, 10671, 6503, 10672, 10673, 10674, 10675, 6507, 10676, 6509, 10677, 10678, 10679, 10680, 3368, 10681, 10682, 10683, 3329, 10684, 10685, 2799, 3838, 10686, 10687, 6508, 10688, 2053, 10689, 10690, 10691, 3263, 10692, 10693, 10694, 10695, 10696, 10697, 10698, 4772, 6505, 10699, 6506, 10700, 3667, 10701, 10702, 10703, 10704, 10705, 6514, 10706, 10707, 10708, 6510, 10709, 10710, 10711, 10712, 10713, 3514, 10714, 10715, 4216, 6512, 10716, 10717, 10718, 10719, 10720, 10721, 10722, 10723, 10724, 10725, 6513, 10726, 10727, 10728, 10729, 2516, 10730, 10731, 10732, 10733, 10734, 10735, 10736, 6515, 10737, 10738, 10739, 10740, 6511, 10741, 10742, 2936, 10743, 10744, 10745, 10746, 10747, 10748, 10749, 10750, 10751, 4703, 6516, 3843, 6520, 10752, 10753, 6521, 10754, 10755, 10756, 10757, 4503, 10758, 10759, 10760, 10761, 10762, 10763, 10764, 10765, 10766, 10767, 10768, 10769, 10770, 10771, 10772, 10773, 10774, 10775, 3224, 10776, 10777, 10778, 10779, 10780, 10781, 10782, 3231, 6519, 10783, 10784, 10785, 10786, 10787, 10788, 10789, 10790, 10791, 10792, 10793, 10794, 10795, 10796, 6518, 10797, 10798, 10799, 10800, 10801, 10802, 10803, 6524, 4340, 10804, 7039, 10805, 10806, 6527, 10807, 10808, 10809, 10810, 10811, 6522, 10812, 10813, 2599, 3768, 10814, 10815, 10816, 10817, 10818, 10819, 2558, 10820, 10821, 4374, 10822, 10823, 10824, 10825, 10826, 6525, 10827, 6526, 10828, 6531, 10829, 6533, 10830, 10831, 10832, 6534, 10833, 10834, 10835, 6528, 1932, 10836, 6529, 10837, 10838, 6532, 10839, 10840, 3348, 10841, 6523, 10842, 10843, 10844, 10845, 10846, 6530, 10847, 10848, 10849, 10850, 10851, 10852, 10853, 10854, 10855, 10856, 10857, 10858, 10859, 10860, 10861, 10862, 10863, 10864, 10865, 10866, 10867, 10868, 10869, 6535, 10870, 10871, 10872, 10873, 10874, 10875, 10876, 10877, 10878, 10879, 10880, 10881, 6537, 6536, 10882, 10883, 10884, 10885, 10886, 10887, 10888, 10889, 10890, 10891, 10892, 10893, 10894, 10895, 10896, 10897, 10898, 10899, 10900, 10901, 10902, 10903, 10904, 10905, 10906, 10907, 6538, 10908, 5351, 10909, 10910, 6539, 10911, 10912, 10913, 10914, 10915, 10916, 10917, 10918, 6540, 10919, 10920, 10921, 10922, 10923, 10924, 10925, 10926, 10927, 10928, 10929, 10930, 10931, 10932, 10933, 5126, 6546, 10934, 6547, 2874, 4841, 10935, 5129, 1855, 4026, 6543, 5204, 5121, 4419, 10936, 3242, 10937, 10938, 6548, 2567, 2289, 6544, 4518, 10939, 10940, 2351, 3148, 10941, 5180, 10942, 10943, 10944, 3928, 6469, 10945, 6545, 10946, 2152, 10947, 10948, 10949, 10950, 3735, 10951, 10952, 3374, 10953, 10954, 6409, 3383, 10955, 4039, 6410, 4899, 10956, 4777, 3909, 1427, 10957, 3993, 4209, 10958, 10959, 2423, 10960, 10961, 10962, 6412, 10963, 6411, 10964, 5133, 2312, 5051, 1981, 4215, 4648, 1509, 3874, 10965, 1763, 3842, 2864, 4508, 3903, 6413, 2477, 10966, 10967, 10968, 4383, 2267, 10969, 10970, 10971, 10972, 4848, 10973, 10974, 2355, 4582, 4415, 2587, 10975, 6414, 3726, 10976, 10977, 10978, 2896, 1589, 4009, 10979, 10980, 2574, 10981, 2573, 4695, 3255, 2879, 10982, 10983, 10984, 10985, 2188, 10986, 10987, 10988, 3229, 10989, 2363, 4795, 10990, 10991, 10992, 10993, 10994, 10995, 10996, 10997, 10998, 3633, 3304, 1673, 10999, 2304, 11000, 11001, 6418, 3047, 11002, 11003, 4902, 11004, 11005, 11006, 11007, 11008, 6419, 11009, 6421, 11010, 11011, 11012, 11013, 11014, 11015, 11016, 1856, 2025, 3981, 4527, 1907, 11017, 11018, 3910, 11019, 2133, 11020, 11021, 3827, 11022, 2642, 11023, 11024, 4259, 5155, 11025, 11026, 11027, 11028, 4418, 11029, 3816, 11030, 11031, 2064, 6541, 2603, 11032, 1721, 11033, 3807, 11034, 6542, 1693, 11035, 11036, 11037, 11038, 5777, 11039, 4739, 5778, 11040, 4607, 11041, 11042, 11043, 11044, 5779, 11045, 11046, 11047, 11048, 2770, 11049, 11050, 5780, 11051, 11052, 11053, 3865, 4697, 1754, 6465, 3354, 2726, 4247, 3371, 2779, 3485, 1664, 11054, 11055, 2776, 11056, 11057, 3663, 4116, 2707, 4290, 11058, 11059, 3879, 3510, 6467, 4445, 11060, 11061, 11062, 4912, 11063, 11064, 11065, 6468, 11066, 11067, 11068, 11069, 3937, 11070, 4167, 3138, 11071, 6470, 11072, 3137, 6471, 11073, 11074, 11075, 11076, 11077, 11078, 11079, 6479, 4180, 11080, 3788, 11081, 11082, 11083, 11084, 11085, 11086, 11087, 4662, 6023, 11088, 11089, 11090, 11091, 4775, 11092, 4021, 3558, 11093, 11094, 11095, 11096, 11097, 6027, 11098, 11099, 11100, 6022, 6024, 11101, 11102, 6025, 6030, 11103, 11104, 1674, 11105, 6026, 2219, 6028, 6029, 6031, 1905, 6032, 11106, 11107, 11108, 11109, 11110, 6034, 6039, 11111, 11112, 11113, 11114, 11115, 4561, 11116, 6037, 6036, 3082, 11117, 11118, 11119, 6038, 11120, 4825, 11121, 6033, 11122, 6041, 1431, 11123, 11124, 11125, 11126, 6035, 11127, 2908, 11128, 6040, 11129, 11130, 6042, 11131, 11132, 11133, 11134, 11135, 11136, 6045, 11137, 11138, 11139, 11140, 11141, 11142, 6043, 11143, 11144, 11145, 11146, 11147, 11148, 5018, 11149, 11150, 11151, 11152, 11153, 11154, 11155, 4354, 11156, 11157, 6044, 6046, 3146, 11158, 2048, 11159, 4787, 11160, 11161, 3616, 11162, 11163, 2136, 11164, 11165, 11166, 11167, 11168, 11169, 11170, 11171, 11172, 11173, 2819, 11174, 11175, 11176, 11177, 11178, 11179, 6047, 6048, 11180, 11181, 6054, 1762, 11182, 11183, 11184, 11185, 11186, 11187, 3550, 11188, 11189, 11190, 11191, 11192, 1847, 11193, 4545, 11194, 11195, 11196, 11197, 6055, 11198, 11199, 6053, 11200, 11201, 11202, 11203, 11204, 6052, 11205, 6050, 6049, 11206, 1535, 11207, 11208, 11209, 4911, 6051, 11210, 11211, 11212, 11213, 11214, 6058, 11215, 11216, 11217, 11218, 11219, 11220, 11221, 11222, 6059, 6057, 11223, 11224, 11225, 11226, 11227, 11228, 11229, 11230, 7421, 11231, 11232, 6066, 6065, 3593, 11233, 11234, 11235, 11236, 11237, 11238, 11239, 11240, 11241, 11242, 11243, 6056, 11244, 11245, 6061, 11246, 6063, 11247, 11248, 11249, 11250, 11251, 11252, 11253, 11254, 11255, 11256, 11257, 6067, 11258, 6064, 6060, 11259, 11260, 6062, 11261, 11262, 11263, 11264, 6068, 11265, 11266, 11267, 11268, 11269, 11270, 11271, 11272, 11273, 11274, 11275, 11276, 11277, 6069, 11278, 11279, 11280, 11281, 11282, 11283, 11284, 11285, 11286, 11287, 11288, 11289, 11290, 11291, 11292, 11293, 11294, 11295, 11296, 11297, 11298, 11299, 6070, 11300, 11301, 11302, 6071, 11303, 11304, 11305, 11306, 11307, 11308, 11309, 11310, 11311, 11312, 11313, 11314, 11315, 11316, 11317, 11318, 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 6073, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 6074, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 4230, 11348, 11349, 11350, 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11360, 6640, 11361, 1793, 5042, 11362, 11363, 4529, 1709, 11364, 11365, 2259, 5158, 3612, 2787, 2269, 11366, 4284, 11367, 11368, 1675, 5498, 11369, 2563, 4654, 3987, 1454, 11370, 11371, 4402, 11372, 11373, 11374, 11375, 11376, 5330, 2708, 11377, 11378, 1553, 3901, 1625, 11379, 3954, 2078, 11380, 3859, 11381, 11382, 11383, 4326, 11384, 11385, 6009, 4929, 6012, 11386, 11387, 6011, 3416, 4132, 11388, 3024, 6010, 5048, 1612, 5017, 1938, 11389, 11390, 11391, 11392, 11393, 11394, 11395, 11396, 1873, 4982, 11397, 11398, 11399, 11400, 11401, 4338, 1488, 11402, 11403, 6013, 11404, 11405, 11406, 11407, 11408, 6016, 1694, 11409, 11410, 6014, 6015, 3212, 11411, 11412, 11413, 11414, 3256, 11415, 6017, 2156, 11416, 11417, 11418, 11419, 11420, 11421, 2490, 11422, 11423, 11424, 11425, 11426, 11427, 11428, 6018, 3316, 11429, 11430, 11431, 11432, 11433, 6019, 11434, 11435, 6020, 11436, 11437, 6021, 1802, 11438, 11439, 11440, 11441, 11442, 11443, 11444, 11445, 11446, 11447, 11448, 11449, 11450, 11451, 11452, 2202, 3506, 3363, 11453, 1599, 11454, 4467, 11455, 6638, 2478, 4754, 4735, 11456, 2322, 6156, 11457, 11458, 11459, 5090, 11460, 3647, 1554, 11461, 11462, 1803, 6158, 11463, 11464, 11465, 4499, 3115, 6157, 11466, 2885, 4705, 1934, 6159, 1953, 11467, 3272, 2254, 11468, 2175, 11469, 3434, 2114, 6161, 11470, 11471, 11472, 11473, 6160, 2013, 5164, 11474, 11475, 11476, 11477, 11478, 4140, 11479, 11480, 11481, 11482, 11483, 6165, 11484, 6163, 3945, 2840, 4724, 6162, 11485, 11486, 11487, 11488, 6164, 11489, 11490, 11491, 11492, 11493, 11494, 11495, 11496, 11497, 11498, 3021, 2953, 11499, 11500, 11501, 11502, 11503, 11504, 6168, 6167, 2923, 11505, 11506, 3053, 11507, 11508, 11509, 11510, 6169, 11511, 11512, 11513, 11514, 11515, 11516, 11517, 11518, 11519, 11520, 11521, 11522, 6170, 11523, 6171, 11524, 11525, 11526, 11527, 11528, 11529, 11530, 11531, 11532, 5491, 11533, 4562, 4137, 11534, 11535, 2639, 11536, 11537, 11538, 5768, 5174, 2829, 5496, 4681, 3567, 3393, 11539, 11540, 11541, 5769, 11542, 1558, 5841, 11543, 11544, 11545, 3882, 11546, 5844, 11547, 2268, 11548, 4698, 11549, 2166, 2424, 11550, 11551, 1749, 11552, 11553, 11554, 1939, 4924, 11555, 11556, 11557, 11558, 3249, 4373, 2444, 11559, 6474, 6473, 11560, 11561, 6475, 11562, 4203, 11563, 3750, 11564, 11565, 11566, 11567, 11568, 11569, 11570, 1894, 3602, 11571, 6477, 11572, 11573, 11574, 7065, 11575, 11576, 11577, 11578, 11579, 11580, 11581, 11582, 11583, 11584, 11585, 11586, 11587, 11588, 11589, 6461, 11590, 2328, 1896, 11591, 3129, 6463, 6462, 6464, 11592, 11593, 11594, 11595, 4650, 11596, 11597, 11598, 6089, 4463, 11599, 4149, 11600, 4580, 11601, 11602, 1639, 1578, 11603, 1585, 3460, 11604, 11605, 4922, 4715, 11606, 6075, 11607, 11608, 11609, 6076, 11610, 4664, 11611, 1716, 1546, 11612, 11613, 11614, 4224, 4974, 6077, 11615, 2747, 1878, 11616, 6078, 2409, 6079, 2461, 3142, 6080, 11617, 11618, 11619, 4493, 11620, 4164, 11621, 11622, 6081, 11623, 1914, 3422, 6082, 11624, 11625, 6083, 11626, 11627, 11628, 11629, 4788, 11630, 11631, 11632, 11633, 11634, 11635, 6084, 11636, 4524, 11637, 11638, 6085, 4231, 11639, 11640, 11641, 11642, 11643, 11644, 6086, 11645, 1913, 11646, 11647, 11648, 11649, 6087, 2496, 11650, 11651, 11652, 11653, 11654, 4453, 6173, 1559, 4673, 11655, 11656, 6174, 11657, 11658, 2578, 3709, 11659, 6176, 7143, 7142, 5842, 11660, 11661, 11662, 6175, 5011, 4227, 3201, 11663, 11664, 11665, 6238, 11666, 11667, 5031, 6180, 11668, 11669, 6181, 11670, 11671, 4738, 11672, 11673, 6185, 2895, 11674, 6186, 6178, 11675, 11676, 1723, 11677, 11678, 11679, 3367, 11680, 11681, 6187, 11682, 11683, 4452, 11684, 2435, 6182, 2129, 2462, 4053, 3990, 6177, 6179, 6183, 6184, 11685, 11686, 11687, 6196, 11688, 11689, 6193, 4878, 6192, 11690, 11691, 3396, 11692, 4977, 3417, 1629, 11693, 11694, 6188, 11695, 6191, 3022, 3975, 11696, 11697, 1880, 6198, 11698, 11699, 11700, 2554, 6190, 4469, 4818, 6194, 2309, 6195, 11701, 11702, 11703, 3622, 11704, 11705, 11706, 11707, 11708, 6189, 11709, 11710, 11711, 11712, 11713, 5135, 7144, 11714, 11715, 6197, 11716, 7148, 6203, 3902, 11717, 11718, 11719, 11720, 11721, 11722, 11723, 3028, 11724, 2491, 11725, 11726, 2873, 11727, 2416, 11728, 11729, 3948, 11730, 11731, 11732, 7149, 7146, 11733, 11734, 7145, 11735, 11736, 11737, 11738, 2497, 7150, 4501, 11739, 11740, 7147, 2411, 2060, 6204, 1991, 4122, 2262, 11741, 4325, 3572, 11742, 11743, 2869, 11744, 11745, 2054, 11746, 6199, 6200, 6202, 6201, 3342, 6205, 11747, 4732, 11748, 11749, 11750, 6210, 3607, 11751, 11752, 11753, 11754, 4327, 11755, 11756, 6212, 2372, 11757, 11758, 11759, 11760, 6211, 11761, 2501, 11762, 6206, 11763, 11764, 11765, 6207, 6213, 11766, 6209, 11767, 4311, 4737, 11768, 11769, 2471, 11770, 11771, 4828, 11772, 3379, 11773, 11774, 7151, 4509, 6208, 11775, 3280, 11776, 6216, 1518, 11777, 6221, 11778, 11779, 11780, 2571, 11781, 11782, 6215, 1910, 11783, 11784, 11785, 11786, 11787, 11788, 11789, 11790, 3644, 6219, 11791, 11792, 11793, 2735, 4214, 11794, 11795, 11796, 11797, 11798, 2526, 11799, 11800, 11801, 4113, 11802, 11803, 6218, 11804, 6220, 11805, 4330, 6217, 11806, 4238, 2504, 11807, 11808, 11809, 11810, 11811, 1954, 2794, 1647, 1736, 11812, 1528, 6214, 1646, 1891, 2318, 2045, 11813, 11814, 4398, 6226, 11815, 2487, 11816, 11817, 3704, 4459, 11818, 11819, 11820, 11821, 11822, 6227, 1769, 11823, 11824, 11825, 11826, 7152, 11827, 4789, 4767, 11828, 11829, 11830, 7153, 6228, 4671, 11831, 11832, 11833, 11834, 11835, 6224, 11836, 11837, 11838, 11839, 4761, 11840, 11841, 11842, 11843, 2209, 6222, 11844, 11845, 6225, 2130, 11846, 6223, 2915, 11847, 11848, 11849, 6229, 11850, 11851, 11852, 11853, 11854, 11855, 11856, 11857, 11858, 11859, 11860, 11861, 11862, 11863, 11864, 11865, 11866, 11867, 11868, 4817, 11869, 11870, 11871, 11872, 11873, 11874, 11875, 11876, 1825, 11877, 6230, 11878, 2480, 11879, 3846, 11880, 11881, 3828, 11882, 11883, 11884, 3318, 11885, 11886, 11887, 11888, 11889, 11890, 11891, 7154, 11892, 11893, 11894, 11895, 3194, 11896, 11897, 11898, 11899, 2502, 2833, 11900, 11901, 11902, 11903, 11904, 11905, 11906, 4260, 11907, 11908, 11909, 11910, 6231, 11911, 2841, 11912, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, 11921, 11922, 11923, 11924, 11925, 11926, 11927, 11928, 11929, 11930, 1582, 11931, 11932, 4880, 11933, 11934, 11935, 11936, 11937, 6233, 11938, 11939, 11940, 11941, 11942, 11943, 11944, 11945, 7156, 11946, 11947, 11948, 11949, 11950, 11951, 11952, 11953, 11954, 6234, 2358, 7155, 11955, 11956, 6232, 11957, 11958, 11959, 11960, 11961, 11962, 11963, 11964, 11965, 11966, 6235, 11967, 11968, 11969, 11970, 11971, 11972, 2371, 11973, 11974, 11975, 1987, 11976, 11977, 11978, 11979, 11980, 4441, 11981, 1444, 7157, 11982, 11983, 11984, 11985, 11986, 7158, 2946, 11987, 6236, 11988, 11989, 11990, 11991, 11992, 11993, 11994, 11995, 11996, 11997, 11998, 11999, 12000, 12001, 12002, 12003, 12004, 3402, 12005, 12006, 12007, 12008, 12009, 12010, 12011, 12012, 12013, 12014, 12015, 12016, 12017, 12018, 6237, 12019, 12020, 12021, 12022, 12023, 12024, 12025, 12026, 12027, 5563, 12028, 12029, 12030, 12031, 12032, 12033, 7159, 12034, 2235, 12035, 4305, 6868, 4488, 3942, 3719, 4346, 1732, 4279, 2699, 12036, 12037, 6265, 2525, 6869, 4916, 12038, 3538, 6870, 12039, 12040, 12041, 6871, 12042, 6873, 6872, 12043, 6875, 6874, 12044, 12045, 12046, 12047, 2687, 12048, 6876, 12049, 3131, 12050, 12051, 12052, 12053, 1818, 1872, 12054, 12055, 2450, 12056, 12057, 12058, 12059, 12060, 7119, 7118, 2098, 4036, 1569, 12061, 7120, 12062, 12063, 12064, 3799, 7121, 7122, 12065, 3907, 5781, 1634, 4883, 12066, 12067, 3520, 1448, 1867, 3716, 12068, 12069, 12070, 4183, 12071, 12072, 2843, 12073, 12074, 12075, 12076, 12077, 12078, 12079, 2878, 12080, 12081, 3575, 5001, 12082, 2922, 5782, 3767, 4590, 3387, 1480, 1713, 3702, 12083, 12084, 1475, 12085, 12086, 2153, 12087, 12088, 3473, 12089, 12090, 2056, 12091, 4937, 1739, 2565, 12092, 12093, 12094, 1704, 12095, 12096, 12097, 12098, 2806, 1458, 12099, 12100, 12101, 12102, 12103, 12104, 4659, 3920, 5080, 12105, 4157, 1995, 2844, 4946, 12106, 2168, 3438, 12107, 12108, 12109, 5783, 2876, 3154, 3603, 12110, 2447, 1511, 12111, 12112, 3457, 12113, 12114, 3474, 4048, 12115, 12116, 12117, 12118, 1510, 12119, 12120, 12121, 1933, 12122, 12123, 12124, 3297, 12125, 5784, 4537, 1764, 12126, 3277, 12127, 12128, 2154, 12129, 5065, 1882, 1677, 3309, 3362, 2926, 5785, 12130, 1481, 3419, 3071, 12131, 2308, 12132, 2785, 4191, 1455, 12133, 4182, 5787, 2773, 5105, 5786, 4935, 1470, 12134, 12135, 3355, 12136, 12137, 3104, 2617, 12138, 4720, 2938, 3384, 1603, 4874, 12139, 12140, 2921, 3888, 5788, 4979, 12141, 2271, 12142, 3678, 3956, 12143, 5790, 2848, 12144, 12145, 12146, 12147, 3497, 5082, 3869, 3324, 12148, 1745, 2305, 12149, 12150, 12151, 12152, 5005, 6953, 1429, 12153, 12154, 12155, 12156, 2889, 12157, 12158, 4125, 12159, 12160, 12161, 12162, 4193, 12163, 12164, 12165, 5012, 3147, 12166, 4275, 4043, 4431, 3340, 1897, 5789, 4972, 2560, 2494, 12167, 12168, 1413, 12169, 3401, 1861, 12170, 12171, 12172, 4968, 12173, 12174, 6954, 12175, 12176, 12177, 12178, 12179, 12180, 5791, 4141, 12181, 12182, 4211, 12183, 12184, 12185, 12186, 4299, 5793, 12187, 4152, 2919, 12188, 12189, 5104, 12190, 5792, 1447, 2369, 3810, 3372, 2797, 12191, 12192, 12193, 12194, 1619, 12195, 12196, 12197, 12198, 12199, 12200, 12201, 12202, 2957, 4027, 12203, 2618, 2470, 1902, 12204, 12205, 12206, 3468, 12207, 5803, 12208, 12209, 12210, 5800, 2786, 12211, 12212, 5796, 12213, 12214, 12215, 12216, 1808, 2692, 12217, 12218, 5797, 3366, 12219, 12220, 12221, 12222, 4361, 12223, 1943, 12224, 12225, 12226, 12227, 2035, 3911, 1963, 5802, 12228, 4925, 12229, 5798, 4086, 3571, 12230, 3420, 12231, 12232, 12233, 4625, 12234, 2807, 12235, 12236, 12237, 12238, 12239, 12240, 12241, 3152, 12242, 4070, 1715, 12243, 2682, 12244, 2875, 4173, 4569, 1860, 12245, 5801, 5794, 5804, 12246, 6955, 12247, 12248, 3117, 5799, 12249, 12250, 5013, 1886, 12251, 1681, 12252, 5805, 12253, 5815, 12254, 12255, 12256, 12257, 12258, 5810, 12259, 5814, 12260, 12261, 3729, 12262, 12263, 12264, 5140, 5812, 3267, 4106, 12265, 1666, 12266, 12267, 12268, 4635, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 5811, 12276, 5808, 4282, 12277, 1792, 12278, 12279, 12280, 12281, 12282, 2830, 2755, 12283, 12284, 2681, 12285, 12286, 12287, 12288, 5806, 12289, 4807, 12290, 5795, 12291, 5807, 12292, 12293, 12294, 12295, 2944, 12296, 5809, 1680, 2234, 3108, 12297, 12298, 2664, 12299, 12300, 12301, 12302, 12303, 5818, 5821, 12304, 12305, 1608, 1789, 12306, 12307, 1859, 3765, 12308, 12309, 12310, 12311, 12312, 12313, 5819, 3996, 12314, 2228, 12315, 5820, 5823, 12316, 12317, 12318, 12319, 5822, 12320, 12321, 12322, 4075, 12323, 1474, 1863, 12324, 12325, 12326, 12327, 12328, 12329, 6417, 12330, 12331, 12332, 12333, 12334, 4432, 12335, 12336, 1672, 12337, 6956, 12338, 5817, 12339, 12340, 3826, 5816, 1467, 4606, 1590, 12341, 4056, 12342, 12343, 12344, 12345, 12346, 12347, 12348, 5813, 12349, 3951, 12350, 12351, 12352, 4897, 12353, 12354, 12355, 12356, 12357, 5824, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 1846, 12366, 3295, 12367, 12368, 12369, 5826, 12370, 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 3289, 3290, 5828, 12380, 12381, 12382, 12383, 12384, 12385, 12386, 3051, 12387, 5825, 2804, 12388, 3495, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, 12397, 1728, 3751, 12398, 12399, 3973, 5827, 12400, 12401, 5831, 12402, 12403, 12404, 12405, 5093, 12406, 12407, 12408, 12409, 12410, 1714, 12411, 12412, 12413, 12414, 3042, 12415, 12416, 3614, 1602, 1858, 12417, 5086, 12418, 12419, 12420, 12421, 3365, 12422, 5829, 5830, 12423, 5832, 12424, 2368, 12425, 12426, 12427, 5833, 12428, 2975, 12429, 12430, 3794, 12431, 12432, 12433, 12434, 12435, 12436, 12437, 1654, 3641, 12438, 5834, 12439, 3631, 12440, 12441, 12442, 12443, 5835, 6957, 12444, 12445, 12446, 12447, 12448, 3998, 12449, 12450, 12451, 5837, 12452, 5836, 12453, 1630, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 3425, 12479, 12480, 12481, 12482, 12483, 12484, 12485, 12486, 5838, 12487, 12488, 12489, 12490, 12491, 12492, 12493, 12494, 4853, 12495, 12496, 12497, 12498, 12499, 3698, 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 5839, 12512, 12513, 12514, 12515, 12516, 2805, 12517, 12518, 5840, 4988, 12519, 12520, 12521, 12522, 6884, 6977, 3906, 12523, 5261, 2197, 12524, 2260, 12525, 12526, 2104, 4981, 12527, 12528, 12529, 12530, 12531, 2297, 12532, 12533, 4424, 7846, 12534, 12535, 1927, 12536, 12537, 3279, 12538, 2765, 12539, 12540, 12541, 6978, 1438, 12542, 12543, 2675, 12544, 3025, 12545, 1557, 1699, 12546, 12547, 12548, 2211, 3761, 12549, 12550, 2029, 12551, 12552, 12553, 12554, 6979, 2745, 12555, 12556, 12557, 3946, 12558, 3606, 12559, 4978, 12560, 12561, 2150, 12562, 12563, 12564, 12565, 12566, 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 4265, 12577, 12578, 12579, 4898, 1586, 12580, 12581, 12582, 7068, 1472, 12583, 7070, 12584, 12585, 12586, 1996, 12587, 3054, 12588, 7985, 4434, 12589, 12590, 4956, 12591, 4280, 12592, 12593, 2710, 1757, 12594, 2172, 12595, 4909, 12596, 7172, 12597, 2020, 12598, 3972, 4451, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, 2096, 12607, 12608, 7071, 3862, 12609, 12610, 12611, 3435, 12612, 7074, 7073, 3136, 7072, 12613, 12614, 12615, 12616, 4510, 7075, 12617, 7076, 5144, 12618, 12619, 7077, 12620, 12621, 12622, 7078, 3553, 12623, 12624, 12625, 12626, 12627, 12628, 12629, 12630, 4291, 12631, 2577, 12632, 12633, 3718, 1888, 2766, 5009, 4864, 12634, 12635, 4525, 4498, 6885, 6886, 6887, 2370, 12636, 12637, 12638, 12639, 3870, 2904, 12640, 12641, 4225, 12642, 12643, 12644, 12645, 12646, 6893, 12647, 1435, 6891, 12648, 12649, 2918, 12650, 12651, 12652, 6888, 12653, 1690, 12654, 3282, 2515, 12655, 12656, 12657, 4660, 4313, 6892, 12658, 12659, 12660, 6889, 12661, 12662, 12663, 6896, 12664, 4456, 4718, 12665, 12666, 12667, 12668, 1811, 12669, 3228, 5157, 12670, 12671, 12672, 12673, 4936, 12674, 3892, 12675, 6898, 12676, 12677, 6897, 6900, 6899, 12678, 12679, 12680, 12681, 12682, 5052, 12683, 4375, 12684, 12685, 6904, 12686, 2489, 12687, 12688, 12689, 12690, 12691, 12692, 12693, 2721, 3805, 12694, 12695, 6905, 12696, 12697, 3784, 4417, 6903, 4839, 6906, 6908, 12698, 12699, 4212, 12700, 12701, 12702, 12703, 6902, 12704, 6907, 12705, 12706, 4307, 12707, 2505, 12708, 1722, 12709, 12710, 12711, 12712, 12713, 3530, 2741, 4319, 12714, 12715, 12716, 3642, 12717, 2732, 6909, 12718, 12719, 5020, 12720, 12721, 12722, 3039, 12723, 12724, 12725, 4854, 12726, 6910, 12727, 12728, 4353, 12729, 12730, 12731, 12732, 6911, 12733, 12734, 12735, 12736, 3931, 12737, 12738, 12739, 12740, 3398, 1430, 12741, 12742, 12743, 12744, 12745, 6913, 12746, 12747, 12748, 12749, 12750, 12751, 12752, 12753, 12754, 6912, 7864, 12755, 12756, 12757, 12758, 12759, 3315, 12760, 12761, 12762, 12763, 12764, 1512, 12765, 12766, 12767, 12768, 6454, 12769, 12770, 12771, 12772, 6914, 12773, 12774, 12775, 12776, 12777, 12778, 12779, 12780, 12781, 12782, 12783, 12784, 12785, 12786, 12787, 12788, 12789, 12790, 12791, 12792, 12793, 12794, 12795, 12796, 12797, 12798, 3932, 12799, 6915, 6916, 3533, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, 6917, 12808, 12809, 6918, 12810, 12811, 12812, 12813, 12814, 12815, 4820, 12816, 3661, 4628, 2253, 12817, 12818, 6895, 12819, 1657, 12820, 12821, 3193, 12822, 4881, 4111, 5153, 12823, 12824, 12825, 12826, 12827, 12828, 12829, 4827, 4747, 6990, 3466, 12830, 2161, 12831, 12832, 7007, 12833, 12834, 12835, 3970, 7017, 12836, 2955, 12837, 12838, 12839, 4226, 12840, 1706, 12841, 3535, 12842, 12843, 12844, 12845, 12846, 12847, 7047, 12848, 3319, 12849, 4249, 3298, 1533, 4886, 12850, 3938, 12851, 5057, 12852, 12853, 3528, 2041, 12854, 12855, 12856, 12857, 2533, 12858, 12859, 4481, 12860, 12861, 3776, 12862, 4844, 3673, 12863, 12864, 2204, 12865, 6703, 3787, 12866, 12867, 6700, 12868, 2991, 4468, 1633, 1854, 12869, 6701, 12870, 12871, 4927, 12872, 12873, 12874, 12875, 12876, 2010, 12877, 6702, 3941, 2221, 4126, 12878, 12879, 12880, 2933, 12881, 12882, 4589, 6704, 6707, 12883, 12884, 2377, 12885, 1516, 2691, 12886, 6890, 6708, 12887, 6711, 12888, 6716, 12889, 12890, 12891, 12892, 6717, 12893, 3988, 1478, 12894, 2548, 12895, 12896, 2280, 12897, 12898, 6706, 12899, 4222, 12900, 6715, 12901, 12902, 12903, 12904, 4315, 12905, 12906, 12907, 12908, 4964, 12909, 3061, 6709, 12910, 3217, 12911, 2346, 4987, 6713, 12912, 12913, 12914, 3917, 4863, 12915, 6705, 12916, 6710, 6712, 12917, 3596, 2134, 12918, 6714, 12919, 2880, 6723, 12920, 12921, 6728, 12922, 6726, 2597, 2584, 6732, 12923, 12924, 12925, 12926, 12927, 12928, 12929, 12930, 6735, 12931, 6731, 1593, 12932, 12933, 12934, 12935, 12936, 12937, 12938, 12939, 12940, 12941, 1465, 3308, 2205, 3543, 3695, 3730, 12942, 12943, 12944, 6720, 6725, 6727, 12945, 2336, 6729, 5160, 12946, 3380, 12947, 6733, 12948, 12949, 1670, 12950, 12951, 12952, 6722, 12953, 12954, 2614, 12955, 12956, 2853, 6718, 5070, 12957, 3095, 1678, 12958, 12959, 12960, 12961, 12962, 12963, 12964, 12965, 6736, 12966, 3886, 6730, 12967, 12968, 12969, 12970, 4891, 12971, 1577, 4914, 6719, 6721, 1989, 6724, 12972, 6734, 2937, 12973, 3940, 12974, 3955, 12975, 12976, 3537, 2998, 12977, 12978, 12979, 12980, 12981, 6746, 12982, 12983, 12984, 4420, 12985, 12986, 12987, 12988, 12989, 12990, 12991, 6755, 5055, 12992, 12993, 12994, 12995, 12996, 12997, 12998, 6737, 6738, 12999, 13000, 13001, 4600, 2392, 2250, 13002, 13003, 2242, 4845, 6752, 13004, 6751, 6749, 2335, 4091, 6743, 4235, 2901, 13005, 1433, 6754, 6753, 13006, 5107, 13007, 6741, 13008, 4144, 3762, 13009, 2467, 2690, 6747, 13010, 13011, 13012, 13013, 13014, 13015, 13016, 13017, 13018, 13019, 6739, 6740, 6742, 1900, 6744, 3608, 6748, 6750, 2647, 5089, 13020, 6761, 13021, 13022, 13023, 13024, 13025, 13026, 13027, 13028, 6758, 13029, 4151, 6759, 13030, 13031, 13032, 13033, 13034, 13035, 13036, 13037, 13038, 3033, 13039, 6745, 13040, 3218, 1489, 13041, 13042, 13043, 13044, 13045, 13046, 13047, 13048, 6757, 13049, 13050, 13051, 6760, 13052, 13053, 13054, 2258, 13055, 13056, 13057, 13058, 13059, 13060, 13061, 13062, 13063, 13064, 3809, 13065, 13066, 13067, 3241, 4293, 2983, 13068, 13069, 13070, 13071, 4030, 13072, 4102, 4438, 13073, 13074, 3918, 13075, 6756, 13076, 13077, 13078, 13079, 13080, 13081, 13082, 13083, 13084, 13085, 2613, 13086, 6762, 13087, 13088, 13089, 13090, 13091, 13092, 3257, 13093, 3546, 13094, 2342, 13095, 13096, 13097, 13098, 1493, 13099, 13100, 5131, 13101, 13102, 2549, 13103, 3462, 13104, 13105, 13106, 13107, 13108, 4077, 13109, 13110, 6773, 13111, 13112, 13113, 13114, 13115, 13116, 13117, 13118, 13119, 13120, 3772, 13121, 6769, 2979, 13122, 13123, 13124, 2854, 13125, 13126, 13127, 6767, 2310, 13128, 6764, 13129, 13130, 13131, 13132, 6771, 13133, 13134, 13135, 4651, 13136, 13137, 13138, 13139, 13140, 6770, 13141, 4999, 5096, 13142, 6774, 13143, 2654, 13144, 13145, 13146, 13147, 13148, 13149, 13150, 13151, 13152, 13153, 13154, 13155, 6765, 6766, 13156, 13157, 13158, 6768, 13159, 13160, 13161, 13162, 13163, 13164, 13165, 13166, 4189, 13167, 13168, 4617, 13169, 13170, 13171, 6785, 13172, 13173, 13174, 13175, 6776, 13176, 13177, 13178, 1795, 13179, 1812, 13180, 13181, 6778, 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190, 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 4425, 13199, 13200, 6772, 13201, 13202, 1785, 13203, 13204, 6779, 2980, 13205, 6777, 13206, 13207, 6792, 13208, 13209, 6791, 13210, 13211, 13212, 13213, 6781, 13214, 13215, 6763, 13216, 13217, 6775, 13218, 13219, 13220, 13221, 13222, 2831, 6784, 6793, 13223, 13224, 3106, 13225, 13226, 13227, 6782, 13228, 2198, 13229, 6780, 13230, 4759, 6787, 6788, 6790, 13231, 13232, 13233, 6806, 13234, 13235, 13236, 13237, 13238, 13239, 2951, 6804, 13240, 13241, 6783, 13242, 13243, 6794, 1490, 13244, 13245, 13246, 13247, 13248, 13249, 13250, 13251, 13252, 13253, 6795, 4892, 13254, 13255, 6797, 13256, 6798, 13257, 13258, 13259, 6800, 13260, 13261, 3088, 13262, 13263, 3687, 13264, 13265, 13266, 6796, 13267, 13268, 13269, 13270, 13271, 6801, 13272, 13273, 13274, 13275, 13276, 13277, 13278, 13279, 6802, 13280, 6786, 13281, 6789, 13282, 2460, 13283, 13284, 13285, 6799, 13286, 13287, 13288, 13289, 13290, 13291, 2624, 13292, 13293, 13294, 6803, 6805, 13295, 13296, 13297, 13298, 13299, 13300, 13301, 13302, 13303, 13304, 13305, 13306, 6809, 13307, 13308, 13309, 13310, 6813, 13311, 13312, 13313, 13314, 13315, 13316, 13317, 13318, 13319, 13320, 1656, 13321, 6807, 13322, 13323, 13324, 13325, 13326, 13327, 13328, 13329, 13330, 13331, 2081, 13332, 13333, 13334, 13335, 13336, 13337, 13338, 13339, 13340, 13341, 13342, 13343, 6810, 6811, 13344, 13345, 13346, 13347, 13348, 13349, 4920, 13350, 3292, 13351, 13352, 13353, 13354, 13355, 13356, 6823, 13357, 2414, 13358, 13359, 13360, 13361, 6808, 13362, 4702, 13363, 13364, 13365, 6819, 13366, 13367, 13368, 13369, 13370, 13371, 13372, 6822, 6815, 13373, 13374, 13375, 13376, 13377, 6814, 13378, 13379, 3604, 13380, 13381, 13382, 13383, 13384, 13385, 13386, 13387, 6817, 13388, 13389, 13390, 13391, 13392, 13393, 13394, 6824, 1731, 13395, 6818, 13396, 13397, 13398, 13399, 13400, 4403, 13401, 13402, 13403, 6812, 13404, 13405, 13406, 13407, 13408, 13409, 13410, 13411, 13412, 13413, 13414, 1778, 13415, 13416, 13417, 13418, 13419, 13420, 13421, 6821, 13422, 13423, 6825, 13424, 13425, 13426, 4061, 13427, 13428, 13429, 4336, 13430, 13431, 13432, 13433, 13434, 13435, 13436, 13437, 13438, 6820, 13439, 6827, 6826, 13440, 13441, 13442, 13443, 13444, 6829, 13445, 13446, 13447, 13448, 13449, 13450, 13451, 13452, 6816, 13453, 13454, 13455, 13456, 13457, 13458, 13459, 13460, 6828, 13461, 6830, 3237, 13462, 13463, 13464, 13465, 13466, 13467, 13468, 13469, 13470, 13471, 13472, 13473, 13474, 13475, 13476, 13477, 13478, 13479, 13480, 13481, 13482, 13483, 13484, 13485, 13486, 13487, 13488, 13489, 13490, 13491, 13492, 13493, 13494, 13495, 13496, 13497, 13498, 13499, 13500, 13501, 13502, 13503, 13504, 13505, 13506, 13507, 13508, 13509, 13510, 13511, 13512, 13513, 13514, 13515, 13516, 13517, 13518, 13519, 13520, 13521, 13522, 13523, 13524, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13532, 13533, 13534, 13535, 13536, 13537, 13538, 13539, 13540, 13541, 13542, 13543, 13544, 13545, 13546, 13547, 13548, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13558, 13559, 13560, 13561, 13562, 13563, 13564, 13565, 13566, 13567, 13568, 13569, 13570, 13571, 13572, 13573, 13574, 13575, 13576, 3594, 1831, 2465, 4449, 7052, 13577, 13578, 3406, 13579, 13580, 13581, 13582, 13583, 13584, 13585, 13586, 13587, 13588, 4790, 13589, 13590, 13591, 13592, 7053, 13593, 7054, 3536, 13594, 13595, 13596, 2897, 13597, 13598, 13599, 13600, 7055, 13601, 13602, 7056, 4427, 13603, 3595, 13604, 13605, 2233, 13606, 13607, 13608, 13609, 13610, 13611, 13612, 13613, 13614, 13615, 13616, 13617, 7057, 13618, 13619, 13620, 13621, 13622, 13623, 13624, 13625, 5006, 4980, 1828, 1626, 4297, 3548, 13626, 13627, 4200, 13628, 13629, 13630, 13631, 13632, 13633, 13634, 13635, 13636, 13637, 13638, 13639, 13640, 13641, 1870, 13642, 3979, 2600, 13643, 13644, 13645, 13646, 6833, 6834, 4585, 6836, 13647, 1874, 6835, 13648, 4530, 3919, 1645, 13649, 6839, 13650, 13651, 13652, 13653, 6837, 6838, 13654, 13655, 5000, 13656, 13657, 13658, 6840, 6841, 13659, 13660, 13661, 13662, 13663, 6842, 13664, 13665, 13666, 13667, 13668, 13669, 13670, 13671, 6843, 13672, 13673, 13674, 13675, 13676, 13677, 13678, 13679, 7064, 3408, 2019, 13680, 4688, 13681, 13682, 13683, 13684, 13685, 13686, 13687, 1957, 13688, 2500, 7066, 13689, 13690, 4672, 13691, 13692, 13693, 13694, 13695, 4296, 13696, 3313, 13697, 3226, 13698, 13699, 2003, 5194, 1543, 1550, 1552, 3477, 13700, 1551, 13701, 3206, 13702, 13703, 13704, 13705, 13706, 4904, 13707, 13708, 13709, 13710, 13711, 13712, 13713, 13714, 6959, 2382, 13715, 13716, 13717, 4067, 13718, 13719, 13720, 6960, 13721, 6962, 13722, 13723, 13724, 6963, 13725, 13726, 13727, 6961, 13728, 13729, 13730, 13731, 13732, 13733, 13734, 6964, 6966, 6965, 13735, 13736, 13737, 13738, 13739, 6967, 13740, 3900, 5190, 3276, 13741, 3200, 3565, 6968, 3331, 13742, 6969, 6970, 6971, 2120, 13743, 13744, 13745, 2157, 13746, 6972, 3637, 13747, 6974, 13748, 2353, 4596, 1426, 6973, 6975, 13749, 13750, 13751, 1889, 3141, 3643, 13752, 6976, 13753, 3961, 6266, 13754, 13755, 4731, 13756, 13757, 13758, 13759, 5322, 13760, 13761, 4136, 4994, 3654, 13762, 13763, 13764, 5327, 2510, 13765, 2375, 6269, 13766, 13767, 13768, 13769, 13770, 4334, 13771, 13772, 13773, 6267, 3798, 13774, 2374, 13775, 13776, 13777, 4531, 6268, 3739, 2270, 2644, 1747, 4288, 13778, 13779, 4073, 13780, 13781, 13782, 6275, 6276, 4219, 13783, 13784, 13785, 13786, 13787, 4054, 13788, 2556, 13789, 6277, 13790, 6278, 13791, 13792, 4475, 13793, 13794, 13795, 3568, 2125, 13796, 13797, 3634, 4647, 4283, 13798, 6271, 6279, 13799, 3841, 1724, 13800, 13801, 6274, 13802, 13803, 3544, 6272, 13804, 13805, 7162, 6273, 13806, 13807, 13808, 13809, 3778, 13810, 3453, 13811, 13812, 13813, 2276, 13814, 3222, 13815, 6270, 3412, 3011, 3158, 1652, 13816, 6280, 2449, 3302, 13817, 6283, 2783, 13818, 13819, 6294, 6288, 2400, 13820, 13821, 13822, 13823, 2115, 4744, 13824, 5027, 4938, 2288, 4907, 4567, 13825, 13826, 13827, 13828, 4442, 3657, 13829, 13830, 13831, 3675, 1617, 13832, 3253, 13833, 13834, 13835, 6281, 13836, 13837, 6295, 6282, 2075, 6290, 6287, 13838, 13839, 13840, 2093, 13841, 13842, 3385, 13843, 6289, 3444, 1605, 3569, 13844, 3353, 13845, 13846, 5077, 13847, 2978, 6292, 13848, 13849, 6293, 6296, 4050, 6286, 13850, 4729, 13851, 1538, 7163, 6284, 6285, 13852, 6291, 4443, 3512, 4876, 6297, 13853, 13854, 2695, 13855, 13856, 6304, 13857, 13858, 6303, 13859, 13860, 13861, 4594, 6300, 13862, 6306, 13863, 13864, 13865, 3752, 13866, 13867, 13868, 13869, 4343, 13870, 6305, 6311, 3170, 13871, 13872, 1993, 13873, 13874, 13875, 13876, 13877, 13878, 2713, 13879, 6299, 13880, 13881, 2422, 6307, 13882, 13883, 6309, 13884, 13885, 2066, 5043, 6315, 13886, 6310, 13887, 13888, 13889, 6298, 13890, 2521, 4196, 3573, 3424, 13891, 13892, 3094, 13893, 6301, 13894, 3590, 2643, 2660, 6302, 13895, 5114, 1663, 13896, 6308, 2572, 6312, 13897, 2518, 6313, 3391, 6314, 13898, 13899, 13900, 13901, 4954, 2822, 13902, 6323, 13903, 6320, 13904, 6324, 13905, 13906, 6326, 13907, 13908, 3531, 13909, 13910, 2387, 2956, 13911, 13912, 13913, 2162, 6317, 13914, 13915, 13916, 13917, 4794, 13918, 13919, 2352, 2725, 13920, 13921, 13922, 6325, 13923, 13924, 13925, 13926, 13927, 4166, 13928, 13929, 3378, 13930, 13931, 4414, 3829, 13932, 13933, 4730, 13934, 4372, 13935, 13936, 6316, 13937, 6321, 6322, 4114, 13938, 13939, 13940, 13941, 13942, 4087, 13943, 2965, 6318, 3023, 6319, 4277, 13944, 2476, 1930, 13945, 3748, 2638, 4926, 3771, 2163, 6339, 13946, 13947, 6341, 4547, 13948, 13949, 4631, 13950, 13951, 2362, 13952, 13953, 2401, 13954, 13955, 13956, 13957, 13958, 13959, 6332, 1956, 13960, 13961, 13962, 5120, 6329, 4416, 6328, 13963, 13964, 13965, 3067, 4083, 13966, 13967, 13968, 13969, 3924, 13970, 13971, 13972, 13973, 3344, 13974, 4093, 6337, 13975, 13976, 13977, 6336, 6330, 13978, 6333, 1892, 13979, 13980, 4756, 13981, 6335, 13982, 13983, 13984, 13985, 4694, 1852, 13986, 2463, 13987, 13988, 3837, 13989, 1815, 13990, 13991, 13992, 2519, 13993, 4556, 13994, 4118, 7164, 13995, 13996, 13997, 13998, 13999, 14000, 14001, 14002, 3640, 14003, 14004, 14005, 14006, 4801, 14007, 6340, 5128, 6331, 14008, 2636, 6334, 14009, 14010, 4769, 14011, 6338, 3847, 14012, 14013, 6327, 14014, 14015, 4768, 14016, 14017, 3665, 2014, 14018, 4885, 1616, 6352, 14019, 14020, 14021, 4263, 14022, 6342, 14023, 4257, 14024, 2220, 14025, 14026, 6351, 14027, 2861, 14028, 14029, 14030, 4745, 14031, 3271, 14032, 14033, 14034, 14035, 14036, 14037, 14038, 14039, 3423, 6353, 14040, 14041, 14042, 14043, 14044, 14045, 14046, 14047, 4171, 6344, 14048, 14049, 14050, 14051, 6349, 6350, 14052, 2443, 14053, 4393, 14054, 14055, 4918, 14056, 14057, 14058, 6347, 14059, 14060, 14061, 14062, 14063, 14064, 14065, 14066, 14067, 14068, 14069, 6345, 14070, 14071, 6343, 14072, 14073, 14074, 14075, 14076, 14077, 14078, 14079, 14080, 14081, 14082, 14083, 14084, 14085, 14086, 4204, 3863, 14087, 14088, 14089, 2916, 14090, 2637, 6348, 14091, 14092, 2201, 14093, 14094, 14095, 14096, 14097, 6368, 4813, 14098, 14099, 14100, 14101, 14102, 14103, 14104, 6356, 14105, 14106, 14107, 3086, 14108, 14109, 6370, 14110, 14111, 4676, 14112, 14113, 6360, 14114, 6361, 14115, 14116, 4333, 14117, 14118, 14119, 14120, 4008, 14121, 6355, 6346, 14122, 6366, 14123, 3725, 6364, 14124, 14125, 3360, 6363, 14126, 6362, 14127, 14128, 14129, 1783, 6369, 14130, 14131, 14132, 14133, 1944, 14134, 14135, 14136, 5119, 14137, 14138, 14139, 6367, 14140, 2455, 14141, 5125, 4088, 7043, 14142, 6365, 14143, 14144, 2341, 14145, 14146, 14147, 5026, 6354, 6357, 3191, 6359, 14148, 3144, 2949, 3149, 14149, 1588, 4059, 14150, 14151, 14152, 14153, 14154, 14155, 14156, 14157, 14158, 14159, 1925, 14160, 14161, 14162, 14163, 6376, 14164, 14165, 14166, 14167, 14168, 14169, 14170, 14171, 3492, 14172, 14173, 14174, 3542, 14175, 14176, 6382, 14177, 14178, 14179, 14180, 14181, 3110, 14182, 14183, 14184, 2989, 4572, 6375, 14185, 14186, 14187, 14188, 14189, 14190, 14191, 14192, 14193, 14194, 3303, 14195, 14196, 14197, 6374, 14198, 14199, 14200, 14201, 6383, 6381, 3195, 14202, 6358, 14203, 6377, 14204, 3947, 14205, 4923, 14206, 14207, 6378, 14208, 14209, 14210, 14211, 14212, 14213, 14214, 4601, 14215, 14216, 14217, 14218, 14219, 14220, 14221, 6372, 6373, 14222, 14223, 14224, 6379, 14225, 4240, 14226, 14227, 14228, 14229, 14230, 14231, 14232, 14233, 14234, 14235, 3426, 14236, 14237, 14238, 3588, 14239, 3127, 14240, 14241, 14242, 6371, 14243, 14244, 14245, 3049, 14246, 14247, 14248, 14249, 14250, 14251, 4063, 1708, 14252, 14253, 14254, 6388, 14255, 6380, 14256, 14257, 14258, 6387, 14259, 6390, 14260, 6389, 14261, 14262, 14263, 14264, 14265, 14266, 14267, 1737, 14268, 14269, 14270, 1717, 6384, 14271, 14272, 6386, 6385, 3459, 14273, 14274, 14275, 14276, 14277, 14278, 14279, 14280, 14281, 14282, 14283, 14284, 14285, 2942, 14286, 14287, 14288, 14289, 4865, 14290, 14291, 14292, 14293, 14294, 6393, 14295, 14296, 14297, 14298, 14299, 14300, 14301, 14302, 14303, 14304, 14305, 1445, 14306, 14307, 6395, 14308, 14309, 6394, 14310, 14311, 14312, 14313, 14314, 14315, 2541, 14316, 6396, 14317, 14318, 14319, 14320, 14321, 14322, 6392, 14323, 14324, 14325, 14326, 14327, 14328, 14329, 6391, 1587, 14330, 14331, 14332, 14333, 14334, 14335, 14336, 14337, 14338, 14339, 14340, 6399, 14341, 6400, 6397, 14342, 14343, 14344, 14345, 14346, 14347, 14348, 14349, 14350, 14351, 14352, 14353, 6398, 6401, 14354, 14355, 14356, 14357, 14358, 14359, 14360, 14361, 14362, 14363, 14364, 14365, 14366, 14367, 14368, 14369, 14370, 14371, 14372, 14373, 14374, 14375, 14376, 14377, 14378, 14379, 14380, 14381, 14382, 14383, 14384, 14385, 14386, 3534, 14387, 14388, 14389, 14390, 14391, 14392, 14393, 14394, 6402, 6404, 14395, 14396, 14397, 14398, 14399, 14400, 14401, 6403, 14402, 14403, 14404, 14405, 14406, 14407, 14408, 14409, 14410, 14411, 14412, 14413, 14414, 14415, 14416, 14417, 14418, 6406, 14419, 14420, 14421, 6405, 14422, 14423, 14424, 14425, 14426, 14427, 14428, 14429, 14430, 14431, 14432, 14433, 14434, 14435, 14436, 14437, 14438, 14439, 2319, 14440, 14441, 6407, 14442, 14443, 14444, 14445, 14446, 14447, 14448, 14449, 14450, 14451, 14452, 14453, 14454, 14455, 6408, 14456, 14457, 14458, 14459, 14460, 14461, 14462, 14463, 14464, 14465, 14466, 14467, 2523, 7114, 3275, 14468, 1917, 2493, 14469, 14470, 14471, 14472, 3080, 4871, 14473, 2761, 14474, 14475, 14476, 5113, 14477, 4847, 1648, 7079, 14478, 14479, 14480, 14481, 6894, 14482, 14483, 14484, 3116, 1807, 14485, 14486, 14487, 4566, 14488, 14489, 14490, 1711, 14491, 3683, 2846, 7081, 14492, 14493, 5024, 14494, 14495, 7080, 7082, 14496, 14497, 14498, 14499, 14500, 14501, 14502, 14503, 14504, 14505, 14506, 14507, 14508, 7086, 2795, 4072, 3441, 2753, 14509, 7087, 14510, 1597, 14511, 14512, 14513, 7085, 4895, 1946, 14514, 7083, 3029, 1758, 14515, 14516, 7084, 3971, 2948, 4135, 14517, 14518, 14519, 14520, 3057, 14521, 7089, 14522, 14523, 14524, 14525, 14526, 14527, 14528, 14529, 14530, 14531, 14532, 14533, 14534, 2419, 2964, 14535, 5063, 14536, 14537, 14538, 4555, 14539, 14540, 14541, 14542, 2849, 14543, 2086, 3812, 7088, 2509, 14544, 4085, 2724, 3705, 14545, 4332, 14546, 14547, 14548, 14549, 14550, 14551, 14552, 4208, 14553, 3458, 14554, 14555, 14556, 2140, 14557, 14558, 14559, 14560, 14561, 14562, 14563, 14564, 14565, 14566, 14567, 4552, 2373, 14568, 14569, 14570, 14571, 14572, 7090, 14573, 14574, 7091, 14575, 2475, 7092, 14576, 7115, 1529, 2124, 14577, 14578, 14579, 14580, 14581, 14582, 14583, 14584, 14585, 14586, 14587, 2656, 14588, 14589, 14590, 14591, 14592, 14593, 14594, 14595, 7093, 4581, 7094, 14596, 14597, 14598, 14599, 3692, 14600, 14601, 14602, 14603, 14604, 14605, 14606, 14607, 14608, 14609, 14610, 14611, 14612, 14613, 7098, 14614, 14615, 14616, 14617, 7100, 14618, 2488, 14619, 2606, 14620, 14621, 14622, 14623, 14624, 14625, 14626, 14627, 14628, 14629, 14630, 14631, 14632, 7096, 14633, 3782, 14634, 14635, 14636, 14637, 14638, 3221, 14639, 7116, 4940, 7097, 14640, 14641, 14642, 14643, 14644, 5064, 14645, 14646, 14647, 7099, 7095, 14648, 14649, 14650, 14651, 7101, 14652, 7102, 14653, 14654, 3790, 14655, 14656, 14657, 14658, 14659, 14660, 4331, 14661, 14662, 14663, 14664, 14665, 4477, 14666, 14667, 14668, 14669, 4523, 14670, 14671, 14672, 14673, 3724, 14674, 14675, 14676, 7103, 4314, 14677, 14678, 14679, 14680, 14681, 3929, 7107, 14682, 14683, 14684, 14685, 14686, 14687, 14688, 7106, 14689, 14690, 14691, 1439, 14692, 14693, 14694, 14695, 14696, 14697, 7104, 14698, 7105, 14699, 14700, 14701, 7117, 14702, 14703, 14704, 14705, 14706, 14707, 14708, 14709, 14710, 3693, 14711, 14712, 14713, 14714, 14715, 14716, 14717, 14718, 14719, 14720, 3046, 14721, 14722, 14723, 14724, 14725, 7109, 4575, 14726, 14727, 14728, 14729, 14730, 14731, 14732, 14733, 14734, 14735, 7108, 14736, 14737, 14738, 14739, 4872, 14740, 7110, 14741, 14742, 14743, 14744, 14745, 14746, 5489, 14747, 14748, 14749, 14750, 14751, 14752, 14753, 14754, 14755, 14756, 7111, 14757, 14758, 14759, 14760, 14761, 14762, 14763, 14764, 14765, 14766, 14767, 14768, 1515, 14769, 14770, 14771, 14772, 14773, 14774, 14775, 14776, 14777, 14778, 14779, 14780, 14781, 14782, 14783, 14784, 14785, 14786, 14787, 14788, 14789, 14790, 7112, 14791, 14792, 14793, 14794, 14795, 14796, 14797, 14798, 14799, 14800, 7113, 14801, 5081, 14802, 3415, 14803, 14804, 14805, 6983, 1423, 14806, 14807, 14808, 2809, 2185, 4620, 1463, 1968, 14809, 5188, 14810, 3959, 14811, 6264, 14812, 14813, 14814, 14815, 14816, 14817, 14818, 3489, 1479, 14819, 14820, 14821, 3421, 6980, 14822, 14823, 14824, 14825, 6981, 14826, 14827, 14828, 6982, 14829, 14830, 4543, 14831, 3386, 14832, 6943, 14833, 3307, 14834, 3310, 2959, 14835, 14836, 14837, 6944, 3322, 14838, 4308, 14839, 14840, 14841, 14842, 6941, 6945, 14843, 14844, 3851, 14845, 14846, 3574, 14847, 14848, 14849, 4097, 4323, 14850, 14851, 14852, 6946, 6947, 4335, 2984, 14853, 14854, 6948, 14855, 14856, 14857, 14858, 14859, 2004, 6949, 14860, 6950, 14861, 6951, 14862, 14863, 6952, 14864, 14865, 14866, 14867, 14868, 14869, 14870, 14871, 14872, 14873, 14874, 14875, 6942, 14876, 14877, 14878, 14879, 14880, 14881, 14882, 14883, 14884, 14885, 14886, 14887, 3679, 6090, 14888, 2091, 6091, 14889, 14890, 14891, 6092, 14892, 5095, 6093, 6094, 4743, 14893, 14894, 14895, 14896, 14897, 14898, 14899, 6096, 2900, 6095, 1929, 14900, 14901, 14902, 1526, 14903, 14904, 14905, 14906, 6098, 6097, 14907, 2441, 14908, 6099, 14909, 14910, 14911, 14912, 2278, 14913, 2774, 14914, 14915, 15780, 15781, 3381, 15782, 2410, 2669, 15783, 15784, 15785, 15786, 15787, 15788, 6100, 6102, 15789, 15790, 2005, 4356, 3861, 6101, 4975, 4791, 6103, 6107, 6104, 15791, 15792, 6105, 2987, 15793, 6109, 6110, 2952, 15794, 15795, 15796, 15797, 6106, 15798, 6108, 15799, 15800, 15801, 15802, 15803, 15804, 6114, 15805, 15806, 15807, 3059, 15808, 15809, 15810, 15811, 6112, 15812, 6117, 1691, 6111, 15813, 15814, 15815, 3240, 1631, 6116, 6115, 15816, 15817, 6113, 6118, 15818, 15819, 6120, 15820, 15821, 15822, 4458, 5058, 3203, 6121, 15823, 4378, 15824, 15825, 6123, 15826, 15827, 2428, 15828, 15829, 6831, 6122, 6119, 15830, 15831, 15832, 15833, 2454, 4812, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, 15843, 15844, 15845, 15846, 6125, 15847, 15848, 6124, 15849, 6832, 15850, 15851, 15852, 15853, 6126, 15854, 15855, 15856, 15857, 15858, 15859, 15860, 15861, 6127, 15862, 15863, 15864, 15865, 15866, 15867, 15868, 15869, 15870, 15871, 15872, 6128, 4042, 15873, 6129, 15874, 15875, 15876, 15877, 15878, 15879, 15880, 15881, 15882, 15883, 15884, 15885, 15886, 15887, 6130, 15888, 15889, 15890, 15891, 15892, 4511, 15893, 15894, 3143, 15895, 4780, 15896, 4220, 15897, 15898, 6643, 15899, 15900, 6644, 15901, 15902, 15903, 15904, 2758, 15905, 15906, 15907, 15908, 3175, 15909, 15910, 15911, 6647, 15912, 15913, 6646, 15914, 15915, 15916, 15917, 15918, 15919, 4205, 15920, 3216, 15921, 15922, 6645, 2466, 4377, 15923, 3072, 6652, 15924, 15925, 15926, 6651, 15927, 15928, 6663, 1600, 15929, 15930, 15931, 15932, 6653, 15933, 6649, 15934, 15935, 15936, 15937, 15938, 6655, 6654, 3785, 15939, 15940, 4955, 15941, 6648, 2076, 6650, 15942, 15943, 15944, 15945, 15946, 15947, 15948, 6657, 15949, 15950, 15951, 15952, 6662, 15953, 5054, 15954, 15955, 15956, 15957, 6656, 15958, 6661, 15959, 6660, 15960, 15961, 15962, 1473, 15963, 15964, 15965, 15966, 6664, 15967, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 15975, 15976, 15977, 15978, 15979, 15980, 15981, 15982, 3653, 15983, 2950, 2990, 15984, 15985, 3087, 6659, 15986, 15987, 15988, 15989, 6665, 4033, 15990, 15991, 15992, 15993, 15994, 15995, 15996, 15997, 15998, 6675, 6674, 15999, 16000, 16001, 16002, 16003, 16004, 5108, 16005, 16006, 6669, 6668, 16007, 6670, 16008, 6666, 16009, 6673, 16010, 6672, 16011, 6671, 16012, 16013, 3060, 3628, 3476, 3418, 16014, 16015, 16016, 16017, 16018, 3648, 16019, 16020, 16021, 16022, 6676, 16023, 16024, 16025, 16026, 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, 16036, 16037, 16038, 16039, 16040, 16041, 6679, 16042, 6678, 16043, 6680, 2436, 6667, 6677, 16044, 3745, 3769, 16045, 16046, 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, 16056, 16057, 6682, 16058, 16059, 2324, 16060, 16061, 16062, 16063, 16064, 4605, 6681, 16065, 16066, 16067, 16068, 16069, 16070, 6683, 16071, 6686, 6687, 16072, 3014, 16073, 16074, 16075, 6688, 16076, 16077, 16078, 6689, 16079, 16080, 6685, 16081, 6693, 16082, 16083, 16084, 16085, 16086, 16087, 16088, 16089, 16090, 16091, 16092, 6684, 16093, 6690, 16094, 16095, 16096, 16097, 16098, 16099, 16100, 16101, 6694, 6691, 6692, 16102, 16103, 16104, 16105, 16106, 16107, 16108, 16109, 16110, 16111, 16112, 16113, 16114, 16115, 16116, 16117, 6696, 16118, 16119, 16120, 16121, 16122, 16123, 16124, 16125, 16126, 16127, 16128, 16129, 16130, 16131, 16132, 16133, 16134, 16135, 16136, 16137, 16138, 16139, 16140, 6695, 16141, 16142, 16143, 16144, 16145, 16146, 16147, 16148, 16149, 2302, 16150, 7437, 16151, 7438, 16152, 3493, 1483, 3696, 16153, 4198, 16154, 16155, 16156, 16157, 16158, 16159, 16160, 4274, 6878, 16161, 16162, 16163, 16164, 6879, 16165, 3508, 1826, 16166, 16167, 16168, 16169, 16170, 16171, 16172, 6880, 16173, 16174, 16175, 16176, 4958, 16177, 16178, 16179, 16180, 16181, 16182, 16183, 16184, 5728, 16185, 6881, 16186, 6882, 16187, 6883, 16188, 16189, 16190, 16191, 2203, 5843, 3844, 16192, 4121, 16193, 16194, 3849, 16195, 16196, 16197, 16198, 16199, 3850, 16200, 16201, 4734, 3953, 16202, 2167, 7439, 1537, 16203, 6415, 4120, 4740, 2592, 3833, 16204, 1950, 16205, 3337, 1952, 16206, 7251, 2456, 16207, 16208, 6641, 16209, 7252, 16210, 16211, 16212, 16213, 1700, 16214, 16215, 7255, 16216, 16217, 7254, 2702, 16218, 7253, 4252, 16219, 16220, 16221, 16222, 3430, 16223, 16224, 16225, 16226, 3091, 5497, 7256, 4500, 16227, 16228, 16229, 16230, 16231, 16232, 16233, 16234, 3153, 3549, 16235, 16236, 16237, 2079, 16238, 16239, 16240, 16241, 16242, 16243, 16244, 7257, 16245, 1766, 16246, 16247, 16248, 2534, 7258, 16249, 16250, 16251, 16252, 16253, 6639, 16254, 16255, 16256, 7259, 16257, 16258, 2645, 16259, 16260, 16261, 16262, 7585, 16263, 16264, 16265, 3925, 16266, 4646, 7483, 16267, 7484, 16268, 7485, 3045, 16269, 2238, 2771, 16270, 16271, 7487, 16272, 3400, 7486, 4592, 16273, 7489, 1453, 2705, 16274, 16275, 16276, 16277, 16278, 4668, 7488, 16279, 1800, 2139, 7495, 7494, 3480, 7490, 7491, 1820, 16280, 16281, 7492, 4965, 16282, 16283, 4100, 2775, 2555, 16284, 16285, 16286, 7497, 7496, 7493, 1598, 16287, 4983, 4723, 2748, 3677, 16288, 16289, 7499, 16290, 16291, 16292, 16293, 4598, 16294, 5025, 2408, 7498, 16295, 2000, 16296, 16297, 4155, 16298, 16299, 3483, 16300, 16301, 16302, 3008, 7500, 7503, 16303, 7502, 7505, 7501, 16304, 2473, 7504, 16305, 16306, 16307, 16308, 4062, 7507, 16309, 16310, 1744, 16311, 16312, 16313, 16314, 1555, 16315, 16316, 7508, 16317, 16318, 7509, 7511, 1850, 16319, 7506, 16320, 7512, 16321, 16322, 16323, 16324, 7515, 16325, 7513, 16326, 16327, 16328, 7510, 16329, 16330, 16331, 16332, 7518, 16333, 7514, 7517, 7519, 16334, 7520, 16335, 16336, 16337, 4262, 7523, 16338, 7522, 16339, 3093, 7516, 3914, 16340, 16341, 1866, 1584, 4058, 16342, 7525, 16343, 16344, 7526, 16345, 16346, 7531, 4933, 7528, 16347, 16348, 3684, 16349, 16350, 16351, 7521, 16352, 7530, 7527, 7524, 16353, 16354, 7529, 16355, 16356, 16357, 16358, 16359, 16360, 16361, 16362, 1418, 7532, 16363, 16364, 16365, 16366, 16367, 16368, 7534, 16369, 7536, 16370, 16371, 16372, 16373, 16374, 7535, 16375, 7533, 16376, 16377, 16378, 16379, 4513, 16380, 16381, 16382, 16383, 16384, 16385, 16386, 7537, 16387, 16388, 16389, 7538, 16390, 16391, 16392, 16393, 16394, 16395, 16396, 16397, 2334, 16398, 16399, 1918, 16400, 1464, 1466, 16401, 16402, 16403, 4870, 16404, 1915, 16405, 2683, 2485, 7432, 16406, 16407, 2223, 16408, 16409, 7433, 16410, 16411, 1417, 16412, 7434, 16413, 16414, 4213, 16415, 16416, 7435, 16417, 16418, 16419, 16420, 16421, 16422, 16423, 16424, 16425, 16426, 7436, 16427, 16428, 16429, 16430, 16431, 16432, 16433, 16434, 16435, 3481, 16436, 16437, 5050, 7587, 16438, 7588, 16439, 16440, 16441, 16442, 16443, 16444, 16445, 16446, 16447, 16448, 3278, 16449, 16450, 4758, 16451, 16452, 5030, 3455, 16453, 4714, 16454, 4675, 16455, 16456, 7270, 1436, 4908, 4557, 2601, 2397, 16457, 2907, 16458, 2200, 1912, 3427, 16459, 16460, 3855, 16461, 16462, 16463, 3238, 16464, 16465, 16466, 16467, 16468, 7271, 16469, 16470, 16471, 16472, 16473, 16474, 16475, 16476, 3320, 1975, 16477, 7219, 3199, 16478, 4998, 16479, 16480, 16481, 4387, 7222, 16482, 16483, 3429, 16484, 2033, 16485, 16486, 3854, 16487, 16488, 7220, 16489, 16490, 7223, 7224, 3223, 16491, 2839, 16492, 7221, 16493, 16494, 16495, 16496, 16497, 16498, 16499, 16500, 16501, 16502, 16503, 7227, 7225, 16504, 16505, 16506, 16507, 4957, 3258, 16508, 7226, 16509, 16510, 16511, 7229, 16512, 4890, 4514, 16513, 16514, 16515, 7228, 16516, 3243, 16517, 16518, 16519, 16520, 16521, 7230, 2903, 2801, 7231, 16522, 4128, 16523, 4570, 16524, 16525, 16526, 5112, 4973, 16527, 7235, 16528, 16529, 16530, 7234, 16531, 16532, 16533, 16534, 16535, 16536, 16537, 16538, 7232, 7233, 16539, 16540, 16541, 16542, 16543, 16544, 16545, 16546, 7236, 2731, 16547, 16548, 16549, 16550, 16551, 3962, 7238, 2002, 16552, 7239, 3321, 16553, 7237, 16554, 16555, 2693, 1636, 16556, 16557, 16558, 16559, 16560, 16561, 16562, 16563, 16564, 16565, 16566, 16567, 2008, 16568, 16569, 16570, 7242, 5195, 7240, 7243, 16571, 16572, 16573, 3268, 1773, 16574, 16575, 16576, 16577, 16578, 16579, 7244, 7241, 4348, 16580, 16581, 7245, 3188, 16582, 16583, 16584, 16585, 16586, 16587, 16588, 16589, 16590, 16591, 16592, 16593, 7246, 7247, 16594, 5744, 16595, 16596, 3496, 16597, 3609, 16598, 5066, 1920, 16599, 3965, 16600, 16601, 16602, 7248, 16603, 16604, 4146, 16605, 7249, 16606, 16607, 16608, 16609, 16610, 4903, 16611, 7250, 16612, 8025, 16613, 16614, 16615, 16616, 16617, 16618, 16619, 16620, 16621, 16622, 16623, 16624, 16625, 5490, 16626, 16627, 16628, 16629, 16630, 16631, 16632, 16633, 16634, 1788, 16635, 16636, 16637, 3207, 7589, 16638, 16639, 16640, 16641, 16642, 3877, 4656, 16643, 4991, 16644, 7413, 16645, 2781, 16646, 2666, 7414, 2017, 1420, 16647, 16648, 16649, 16650, 3868, 16651, 16652, 7165, 16653, 7166, 16654, 16655, 16656, 16657, 4318, 2082, 2902, 7167, 3176, 3775, 16658, 16659, 16660, 16661, 16662, 16663, 7168, 16664, 16665, 3563, 2838, 16666, 16667, 16668, 7171, 3471, 16669, 4559, 16670, 5084, 7169, 7170, 16671, 4577, 16672, 7174, 7175, 16673, 7179, 16674, 16675, 16676, 7183, 16677, 7181, 7189, 4959, 16678, 7184, 16679, 16680, 7182, 7173, 16681, 16682, 3456, 16683, 16684, 16685, 3515, 16686, 16687, 3832, 4843, 7176, 7177, 7178, 7180, 16688, 3002, 16689, 1786, 16690, 16691, 16692, 16693, 2327, 16694, 7191, 16695, 16696, 16697, 16698, 7192, 16699, 7185, 16700, 7190, 16701, 4317, 16702, 16703, 3969, 7187, 7188, 16704, 16705, 16706, 16707, 16708, 4408, 16709, 16710, 16711, 16712, 16713, 16714, 16715, 16716, 16717, 16718, 16719, 16720, 7193, 3089, 4717, 7186, 3688, 16721, 16722, 16723, 16724, 16725, 16726, 16727, 16728, 2616, 16729, 16730, 16731, 16732, 3463, 16733, 16734, 16735, 16736, 16737, 16738, 16739, 16740, 16741, 16742, 7197, 16743, 1958, 16744, 16745, 3122, 1422, 4020, 16746, 16747, 1517, 16748, 7195, 16749, 16750, 16751, 4210, 1945, 16752, 7196, 7194, 7198, 16753, 16754, 1969, 16755, 7199, 16756, 7200, 16757, 7203, 16758, 1547, 16759, 16760, 16761, 16762, 16763, 16764, 16765, 16766, 3469, 2615, 7201, 4069, 1671, 16767, 16768, 16769, 16770, 7202, 16771, 16772, 16773, 16774, 3364, 16775, 16776, 1822, 16777, 16778, 16779, 1494, 16780, 16781, 16782, 7206, 2971, 1857, 16783, 16784, 16785, 16786, 3428, 16787, 16788, 16789, 7204, 2855, 16790, 16791, 16792, 7205, 16793, 16794, 16795, 16796, 16797, 16798, 16799, 16800, 16801, 16802, 16803, 16804, 16805, 16806, 3294, 16807, 16808, 16809, 7207, 16810, 16811, 16812, 16813, 16814, 7208, 16815, 7210, 16816, 16817, 3062, 16818, 16819, 2482, 16820, 16821, 16822, 16823, 16824, 16825, 2655, 16826, 16827, 16828, 7209, 16829, 16830, 16831, 16832, 16833, 16834, 16835, 16836, 16837, 16838, 16839, 16840, 16841, 7211, 16842, 16843, 16844, 16845, 16846, 16847, 16848, 16849, 16850, 16851, 7213, 16852, 16853, 16854, 16855, 16856, 7212, 16857, 16858, 16859, 16860, 16861, 16862, 16863, 16864, 16865, 16866, 16867, 16868, 16869, 16870, 16871, 7214, 16872, 16873, 16874, 16875, 16876, 3883, 7123, 2994, 16877, 3830, 16878, 7124, 3555, 16879, 16880, 16881, 16882, 7125, 16883, 3554, 7126, 16884, 16885, 16886, 16887, 16888, 16889, 16890, 16891, 16892, 7129, 16893, 16894, 5145, 7132, 16895, 16896, 7130, 7127, 7128, 5078, 3840, 4025, 7133, 16897, 7131, 16898, 16899, 4396, 16900, 7135, 3494, 16901, 16902, 16903, 16904, 2569, 16905, 7134, 16906, 16907, 16908, 16909, 16910, 16911, 16912, 1906, 2529, 16913, 7136, 16914, 16915, 16916, 16917, 16918, 5350, 2722, 16919, 16920, 3128, 7137, 16921, 16922, 16923, 16924, 7138, 16925, 16926, 16927, 16928, 2164, 16929, 16930, 16931, 16932, 16933, 16934, 16935, 16936, 16937, 16938, 7139, 16939, 16940, 16941, 16942, 16943, 16944, 16945, 16946, 16947, 16948, 16949, 16950, 7140, 16951, 16952, 16953, 16954, 16955, 16956, 16957, 16958, 16959, 16960, 16961, 7141, 16962, 16963, 16964, 16965, 16966, 4776, 5183, 2988, 16967, 3632, 2393, 16968, 4484, 3976, 16969, 4161, 16970, 16971, 2210, 16972, 16973, 1595, 16974, 3650, 16975, 5035, 16976, 16977, 16978, 2857, 3270, 16979, 16980, 7416, 16981, 16982, 3251, 16983, 16984, 16985, 16986, 16987, 16988, 5141, 16989, 16990, 16991, 7418, 1742, 16992, 3627, 4588, 16993, 5021, 16994, 7419, 16995, 7417, 16996, 2536, 1729, 16997, 16998, 16999, 17000, 17001, 17002, 17003, 2684, 17004, 17005, 4643, 17006, 2507, 17007, 17008, 4324, 17009, 7423, 7422, 17010, 17011, 7420, 17012, 17013, 17014, 17015, 1735, 17016, 3811, 3963, 17017, 17018, 17019, 17020, 17021, 7425, 17022, 17023, 1471, 17024, 17025, 5022, 17026, 17027, 17028, 7424, 17029, 1768, 17030, 17031, 8042, 17032, 17033, 17034, 17035, 17036, 17037, 17038, 17039, 17040, 17041, 17042, 17043, 17044, 17045, 17046, 4269, 17047, 17048, 17049, 7427, 17050, 7426, 17051, 1909, 2595, 2535, 17052, 2230, 17053, 17054, 17055, 17056, 17057, 17058, 3323, 17059, 17060, 17061, 17062, 17063, 17064, 17065, 17066, 17067, 17068, 7428, 17069, 17070, 17071, 17072, 17073, 4022, 17074, 17075, 17076, 17077, 17078, 17079, 17080, 17081, 17082, 17083, 17084, 17085, 17086, 17087, 17088, 17089, 17090, 17091, 17092, 17093, 17094, 17095, 17096, 17097, 7431, 17098, 17099, 17100, 4519, 17101, 2756, 3649, 7541, 7542, 2872, 17102, 17103, 17104, 17105, 1794, 7543, 4162, 17106, 3623, 4900, 17107, 7544, 17108, 7545, 17109, 17110, 17111, 17112, 3618, 17113, 17114, 17115, 4609, 5028, 17116, 17117, 7546, 2680, 1801, 2754, 17118, 17119, 17120, 1845, 4278, 17121, 2882, 7548, 17122, 17123, 17124, 17125, 2909, 7547, 17126, 7550, 17127, 17128, 17129, 7549, 7551, 17130, 17131, 17132, 17133, 17134, 7552, 17135, 17136, 17137, 17138, 17139, 17140, 17141, 17142, 17143, 17144, 17145, 3101, 17146, 17147, 17148, 17149, 17150, 17151, 17152, 17153, 17154, 17155, 17156, 3009, 17157, 17158, 17159, 17160, 17161, 17162, 17163, 17164, 17165, 17166, 3943, 17167, 17168, 4917, 17169, 17170, 17171, 17172, 2751, 2750, 4921, 17173, 17174, 2821, 17175, 4150, 7540, 17176, 17177, 17178, 17179, 17180, 17181, 2694, 17182, 2016, 17183, 17184, 17185, 17186, 17187, 17188, 17189, 17190, 17191, 5062, 7742, 17192, 17193, 7743, 17194, 2206, 17195, 17196, 17197, 7745, 7746, 17198, 1451, 17199, 7744, 17200, 7748, 4028, 17201, 17202, 17203, 7750, 17204, 4423, 17205, 17206, 1545, 7747, 17207, 17208, 17209, 7754, 17210, 1928, 17211, 17212, 7762, 17213, 7757, 17214, 17215, 17216, 7759, 7758, 2158, 17217, 1534, 17218, 7753, 7749, 1937, 17219, 7755, 17220, 17221, 7756, 17222, 7760, 17223, 17224, 17225, 17226, 7752, 17227, 2604, 17228, 3100, 17229, 7761, 17230, 17231, 17232, 17233, 17234, 17235, 7765, 17236, 7751, 17237, 1919, 17238, 2709, 7767, 17239, 17240, 2071, 2899, 5075, 4153, 17241, 1865, 17242, 1660, 17243, 7763, 17244, 7764, 3783, 17245, 7768, 17246, 17247, 7769, 17248, 7772, 17249, 17250, 17251, 17252, 17253, 17254, 17255, 17256, 17257, 17258, 17259, 7770, 17260, 17261, 7774, 7773, 17262, 17263, 7766, 17264, 2893, 17265, 1770, 17266, 7771, 17267, 17268, 3580, 17269, 2619, 17270, 17271, 17272, 17273, 7782, 17274, 17275, 17276, 17277, 17278, 17279, 17280, 2286, 17281, 17282, 7775, 17283, 17284, 17285, 1610, 2537, 17286, 4014, 17287, 17288, 17289, 17290, 7784, 7780, 17291, 17292, 17293, 2315, 7785, 17294, 17295, 17296, 7776, 7777, 7781, 3166, 7783, 7786, 7779, 2630, 17297, 17298, 17299, 4391, 17300, 17301, 7787, 17302, 17303, 17304, 7778, 17305, 17306, 17307, 17308, 17309, 17310, 17311, 17312, 7789, 17313, 17314, 17315, 17316, 5088, 3487, 17317, 17318, 17319, 17320, 7790, 17321, 17322, 17323, 17324, 7788, 17325, 3109, 17326, 17327, 17328, 17329, 17330, 2222, 7792, 17331, 17332, 7791, 17333, 17334, 17335, 1844, 17336, 17337, 17338, 7793, 7794, 17339, 17340, 17341, 7795, 17342, 17343, 17344, 2939, 17345, 17346, 2986, 17347, 17348, 17349, 17350, 17351, 3464, 17352, 17353, 17354, 17355, 7798, 17356, 7797, 17357, 17358, 17359, 17360, 17361, 17362, 17363, 17364, 1841, 17365, 17366, 17367, 7801, 7796, 17368, 17369, 7799, 17370, 17371, 17372, 17373, 17374, 17375, 7800, 17376, 17377, 17378, 17379, 17380, 17381, 17382, 17383, 7802, 17384, 17385, 17386, 17387, 17388, 17389, 7804, 2484, 17390, 17391, 7803, 17392, 17393, 17394, 17395, 17396, 17397, 17398, 17399, 17400, 17401, 17402, 17403, 17404, 7805, 17405, 17406, 17407, 17408, 17409, 17410, 1627, 7807, 7806, 17411, 17412, 17413, 17414, 17415, 17416, 17417, 17418, 17419, 17420, 17421, 2551, 17422, 17423, 17424, 17425, 17426, 17427, 17428, 17429, 17430, 17431, 17432, 17433, 17434, 17435, 17436, 17437, 17438, 17439, 17440, 17441, 17442, 17443, 17444, 17445, 17446, 17447, 17448, 17449, 17450, 17451, 17452, 17453, 17454, 17455, 17456, 17457, 17458, 3250, 5328, 17459, 17460, 17461, 17462, 17463, 17464, 2977, 7845, 5124, 17465, 17466, 17467, 17468, 17469, 17470, 17471, 17472, 17473, 17474, 17475, 2126, 17476, 17477, 17478, 17479, 17480, 17481, 17482, 7847, 3010, 17483, 17484, 3518, 17485, 1839, 4906, 17486, 17487, 17488, 7849, 7848, 7850, 4005, 17489, 17490, 7851, 17491, 4826, 5045, 17492, 17493, 17494, 17495, 2131, 17496, 17497, 17498, 3031, 17499, 17500, 3034, 7852, 2737, 17501, 17502, 17503, 17504, 17505, 1851, 17506, 17507, 7853, 7854, 2736, 17508, 17509, 7855, 17510, 17511, 17512, 7860, 17513, 7856, 7859, 17514, 2442, 17515, 7857, 7858, 17516, 17517, 17518, 17519, 17520, 17521, 17522, 2227, 4080, 7861, 17523, 1655, 17524, 17525, 3246, 17526, 17527, 4860, 2842, 17528, 17529, 17530, 17531, 17532, 17533, 17534, 7862, 17535, 17536, 17537, 17538, 17539, 17540, 3403, 17541, 17542, 17543, 17544, 17545, 17546, 17547, 17548, 7874, 17549, 17550, 4344, 17551, 17552, 17553, 17554, 17555, 17556, 17557, 17558, 17559, 17560, 17561, 17562, 17563, 17564, 4270, 17565, 17566, 17567, 17568, 17569, 17570, 17571, 17572, 17573, 17574, 17575, 17576, 17577, 17578, 17579, 17580, 17581, 17582, 17583, 17584, 17585, 4003, 17586, 4034, 17587, 17588, 17589, 17590, 2715, 17591, 17592, 17593, 5122, 17594, 17595, 17596, 2972, 17597, 17598, 17599, 17600, 17601, 17602, 17603, 17604, 17605, 17606, 17607, 17608, 17609, 17610, 17611, 17612, 17613, 17614, 17615, 17616, 17617, 17618, 17619, 17620, 17621, 17622, 17623, 17624, 17625, 17626, 17627, 17628, 17629, 17630, 17631, 17632, 17633, 17634, 17635, 17636, 17637, 17638, 17639, 17640, 17641, 17642, 17643, 17644, 17645, 17646, 17647, 17648, 17649, 17650, 17651, 17652, 17653, 17654, 17655, 17656, 17657, 17658, 4502, 17659, 17660, 17661, 17662, 17663, 17664, 17665, 17666, 7875, 17667, 17668, 17669, 17670, 17671, 17672, 17673, 17674, 17675, 17676, 17677, 17678, 17679, 17680, 17681, 17682, 17683, 17684, 17685, 17686, 17687, 17688, 17689, 17690, 17691, 17692, 17693, 17694, 17695, 17696, 17697, 17698, 17699, 17700, 17701, 17702, 17703, 17704, 17705, 17706, 17707, 17708, 17709, 17710, 17711, 17712, 7876, 17713, 17714, 17715, 17716, 17717, 17718, 17719, 7877, 17720, 17721, 17722, 17723, 17724, 17725, 17726, 17727, 17728, 17729, 17730, 17731, 17732, 17733, 17734, 17735, 17736, 17737, 17738, 17739, 17740, 17741, 17742, 17743, 17744, 17745, 17746, 17747, 17748, 17749, 17750, 17751, 17752, 17753, 17754, 17755, 17756, 17757, 17758, 17759, 17760, 17761, 17762, 17763, 17764, 17765, 17766, 17767, 17768, 17769, 17770, 17771, 17772, 17773, 17774, 17775, 17776, 17777, 17778, 17779, 17780, 17781, 17782, 17783, 17784, 17785, 17786, 17787, 17788, 17789, 17790, 17791, 17792, 17793, 17794, 17795, 17796, 17797, 17798, 17799, 17800, 17801, 17802, 17803, 17804, 17805, 17806, 17807, 17808, 17809, 17810, 17811, 17812, 17813, 17814, 17815, 17816, 17817, 17818, 17819, 17820, 17821, 17822, 17823, 17824, 17825, 17826, 17827, 17828, 17829, 17830, 17831, 17832, 17833, 17834, 17835, 17836, 17837, 17838, 17839, 17840, 17841, 17842, 17843, 17844, 17845, 17846, 17847, 17848, 17849, 17850, 17851, 17852, 17853, 17854, 17855, 17856, 17857, 17858, 17859, 8150, 17860, 17861, 17862, 17863, 17864, 2084, 17865, 17866, 17867, 17868, 17869, 7878, 17870, 17871, 17872, 17873, 17874, 17875, 17876, 17877, 17878, 17879, 17880, 17881, 17882, 17883, 17884, 17885, 17886, 17887, 17888, 17889, 17890, 17891, 17892, 17893, 17894, 17895, 17896, 17897, 17898, 17899, 17900, 17901, 17902, 17903, 17904, 17905, 17906, 17907, 17908, 17909, 17910, 17911, 17912, 17913, 17914, 17915, 17916, 17917, 17918, 17919, 17920, 17921, 17922, 17923, 17924, 17925, 17926, 17927, 5150, 17928, 17929, 17930, 17931, 17932, 17933, 17934, 17935, 17936, 17937, 17938, 17939, 17940, 17941, 17942, 17943, 17944, 17945, 17946, 17947, 17948, 17949, 17950, 17951, 7879, 17952, 17953, 17954, 6574, 2757, 6575, 2425, 6576, 4366, 6577, 4821, 2559, 6578, 6579, 2582, 3715, 4248, 6580, 17955, 1816, 6581, 3779, 2218, 3330, 17956, 5136, 3159, 2122, 5010, 4267, 2103, 17957, 17958, 3389, 6582, 4386, 6583, 6584, 6585, 3030, 5148, 3839, 4347, 4996, 5034, 6586, 1486, 6587, 6588, 3819, 4684, 2738, 6589, 1492, 3727, 2696, 6590, 3703, 17959, 6591, 2513, 2249, 4515, 6592, 3172, 2813, 2673, 4154, 6593, 6594, 2803, 4486, 17960, 4018, 4089, 2581, 6595, 2545, 4504, 6596, 17961, 4505, 6597, 6598, 1819, 6599, 6600, 3853, 4241, 3259, 6602, 1536, 1772, 17962, 6603, 6604, 5134, 4919, 6605, 3145, 5101, 6606, 6607, 6608, 2611, 3264, 2947, 6609, 6610, 2546, 17963, 6611, 6612, 6601, 2021, 6613, 17964, 6614, 6615, 2469, 1941, 3139, 1567, 6616, 4814, 6617, 2192, 6619, 6618, 2143, 17965, 6620, 1685, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 4706, 4032, 6628, 6629, 6630, 6631, 3800, 6632, 6633, 6634, 6635, 6636, 2672, 6637, 7737, 17966, 2216, 17967, 3682, 17968, 17969, 17970, 17971, 17972, 17973, 17974, 7738, 17975, 7739, 7740, 17976, 17977, 17978, 17979, 17980, 17981, 17982, 17983, 17984, 17985, 2317, 4223, 17986, 17987, 5241, 2366, 17988, 3163, 7260, 17989, 2070, 17990, 17991, 17992, 17993, 7262, 17994, 7261, 1462, 17995, 17996, 17997, 17998, 17999, 7264, 4941, 5154, 18000, 18001, 18002, 5016, 18003, 18004, 7266, 3933, 18005, 7265, 18006, 18007, 18008, 18009, 7267, 18010, 18011, 18012, 18013, 7269, 18014, 18015, 7268, 18016, 18017, 18018, 18019, 18020, 18021, 18022, 18023, 4593, 18024, 3599, 18025, 3227, 18026, 18027, 18028, 18029, 18030, 2226, 18031, 18032, 18033, 18034, 18035, 3078, 18036, 18037, 7839, 4480, 7840, 18038, 4382, 18039, 18040, 3691, 18041, 18042, 7841, 18043, 18044, 18045, 18046, 18047, 18048, 18049, 7842, 7843, 18050, 7844, 18051, 18052, 18053, 18054, 18055, 5353, 2255, 18056, 18057, 6472, 4779, 18058, 7865, 18059, 4273, 18060, 18061, 18062, 1756, 18063, 18064, 18065, 18066, 7539, 18067, 4683, 18068, 7866, 18069, 18070, 18071, 18072, 18073, 4395, 7867, 18074, 18075, 3615, 18076, 18077, 18078, 18079, 18080, 18081, 1931, 1853, 7869, 18082, 18083, 18084, 7868, 7870, 18085, 18086, 7871, 18087, 18088, 18089, 18090, 7872, 18091, 2367, 1440, 18092, 7873, 18093, 18094, 18095, 18096, 18097, 18098, 18099, 2080, 4682, 18100, 18101, 18102, 4616, 2960, 18103, 2847, 6958, 4950, 6901, 18104, 18105, 18106, 18107, 7602, 2061, 3950, 18108, 18109, 3334, 18110, 7590, 18111, 7591, 2252, 7592, 2385, 4830, 1459, 18112, 18113, 7593, 18114, 18115, 18116, 7594, 18117, 7595, 18118, 18119, 7596, 7597, 7598, 7600, 7599, 3436, 18120, 18121, 18122, 18123, 18124, 18125, 7601, 18126, 2063, 18127, 7603, 4619, 5772, 3989, 18128, 18129, 1751, 18130, 1881, 18131, 2257, 18132, 18133, 3373, 7604, 18134, 18135, 7605, 18136, 18137, 18138, 3043, 3098, 4997, 7606, 18139, 18140, 18141, 18142, 7607, 18143, 3017, 18144, 18145, 18146, 3501, 18147, 2784, 18148, 18149, 18150, 18151, 18152, 18153, 18154, 18155, 18156, 18157, 18158, 18159, 18160, 18161, 7608, 1832, 18162, 18163, 18164, 18165, 18166, 18167, 7609, 18168, 18169, 18170, 18171, 18172, 18173, 18174, 18175, 18176, 18177, 18178, 18179, 18180, 7161, 7160, 18181, 18182, 4011, 4667, 18183, 3980, 4943, 18184, 3731, 18185, 2976, 2538, 18186, 18187, 18188, 18189, 18190, 18191, 6988, 18192, 18193, 4421, 18194, 5047, 18195, 2012, 2217, 6987, 2207, 18196, 6986, 1697, 2296, 4992, 18197, 2151, 2109, 18198, 18199, 18200, 2608, 2097, 6993, 18201, 6994, 1434, 2866, 18202, 6992, 4792, 18203, 6995, 18204, 18205, 6996, 18206, 18207, 2113, 18208, 6989, 6991, 3845, 5036, 4932, 4435, 7002, 4253, 7003, 18209, 1887, 18210, 18211, 18212, 18213, 18214, 1522, 7005, 4046, 18215, 18216, 18217, 18218, 18219, 18220, 18221, 3437, 7006, 18222, 7004, 3446, 7001, 3857, 7008, 1500, 18223, 18224, 2439, 18225, 18226, 5192, 7586, 18227, 6997, 6998, 6999, 7000, 7009, 6517, 7012, 18228, 2891, 4645, 7010, 7015, 2237, 7011, 18229, 2657, 18230, 4473, 18231, 1432, 18232, 7016, 3349, 18233, 18234, 18235, 18236, 4993, 18237, 18238, 18239, 1849, 18240, 18241, 3187, 2562, 18242, 18243, 7013, 7014, 4857, 3551, 3341, 7018, 3390, 5348, 18244, 1614, 18245, 7023, 18246, 2668, 18247, 18248, 18249, 7021, 18250, 18251, 18252, 18253, 18254, 18255, 18256, 18257, 18258, 18259, 18260, 18261, 18262, 7022, 18263, 18264, 2173, 18265, 4184, 7024, 18266, 18267, 18268, 7020, 18269, 3026, 18270, 18271, 18272, 18273, 18274, 3479, 18275, 18276, 18277, 18278, 18279, 18280, 18281, 4124, 18282, 7025, 18283, 2929, 4629, 7026, 18284, 18285, 18286, 2176, 2174, 18287, 7027, 3598, 4218, 18288, 18289, 18290, 7029, 7030, 18291, 18292, 18293, 18294, 18295, 7032, 18296, 18297, 18298, 18299, 4457, 18300, 7037, 18301, 7033, 18302, 18303, 18304, 7036, 3754, 18305, 4603, 7031, 18306, 18307, 7028, 18308, 18309, 18310, 18311, 2186, 4380, 3358, 7034, 7035, 4099, 4175, 1491, 18312, 7041, 18313, 18314, 18315, 18316, 18317, 7040, 18318, 1615, 18319, 18320, 18321, 18322, 2225, 18323, 7042, 18324, 18325, 18326, 18327, 18328, 18329, 1579, 18330, 18331, 4078, 3293, 4328, 18332, 18333, 18334, 18335, 18336, 7044, 18337, 18338, 7051, 18339, 3465, 18340, 7045, 18341, 18342, 18343, 18344, 18345, 18346, 18347, 18348, 3796, 18349, 18350, 18351, 18352, 18353, 18354, 6172, 7049, 18355, 18356, 18357, 18358, 4181, 7050, 1562, 4722, 18359, 18360, 4665, 18361, 18362, 18363, 7048, 18364, 7046, 18365, 18366, 18367, 18368, 18369, 18370, 18371, 18372, 18373, 18374, 18375, 18376, 18377, 18378, 18379, 18380, 18381, 18382, 18383, 18384, 18385, 18386, 1719, 18387, 18388, 18389, 6877, 18390, 18391, 5127, 18392, 7812, 1775, 18393, 18394, 18395, 18396, 18397, 5014, 5015, 18398, 18399, 18400, 18401, 18402, 18403, 4960, 2767, 18404, 7808, 18405, 4613, 7809, 7810, 18406, 7811, 2768, 4762, 18407, 18408, 18409, 18410, 18411, 3823, 3824, 18412, 18413, 7741, 18414, 3923, 18415, 4123, 18416, 18417, 18418, 18419, 18420, 18421, 6131, 3967, 18422, 4301, 5040, 18423, 7814, 7815, 7816, 18424, 18425, 18426, 18427, 7819, 18428, 2378, 7820, 1476, 7817, 18429, 7818, 2633, 1650, 18430, 7823, 7824, 2043, 1613, 4370, 7821, 1797, 18431, 7822, 18432, 18433, 7825, 18434, 18435, 18436, 18437, 18438, 7826, 18439, 18440, 4142, 18441, 7827, 18442, 7828, 18443, 18444, 18445, 7829, 18446, 18447, 18448, 18449, 18450, 18451, 18452, 18453, 3997, 18454, 7830, 18455, 18456, 18457, 18458, 7831, 18459, 18460, 18461, 18462, 18463, 18464, 18465, 18466, 7832, 18467, 18468, 18469, 18470, 18471, 7863, 3035, 2609, 18472, 3770, 4573, 6476, 18473, 18474, 18475, 18476, 5564, 4658, 18477, 18478, 5565, 1421, 5566, 18479, 18480, 2689, 18481, 5570, 18482, 18483, 18484, 5203, 18485, 5568, 4782, 18486, 3813, 5571, 5567, 18487, 5572, 3197, 18488, 18489, 18490, 18491, 5573, 5582, 5574, 18492, 18493, 4292, 4986, 18494, 5592, 18495, 5590, 18496, 18497, 5595, 2701, 3112, 18498, 5569, 5588, 5591, 5575, 2117, 1446, 5584, 4447, 5578, 2451, 18499, 2095, 5589, 18500, 18501, 5583, 5576, 3630, 18502, 18503, 18504, 4542, 5577, 18505, 18506, 5587, 18507, 18508, 5593, 18509, 18510, 4242, 5579, 18511, 5580, 5585, 5586, 1649, 5594, 4000, 18512, 4816, 5604, 5608, 4047, 5615, 18513, 3266, 5605, 18514, 18515, 2852, 5602, 18516, 1499, 2277, 5614, 5596, 18517, 5581, 5599, 3749, 2883, 18518, 18519, 18520, 18521, 3786, 18522, 18523, 18524, 1532, 18525, 4701, 18526, 18527, 5603, 18528, 18529, 5598, 18530, 3504, 18531, 5607, 18532, 18533, 18534, 18535, 18536, 5109, 3210, 2089, 3620, 3204, 5611, 5601, 5620, 5597, 18537, 18538, 5606, 18539, 2730, 5600, 18540, 5609, 18541, 18542, 5612, 5613, 18543, 5633, 18544, 18545, 5610, 5641, 5616, 18546, 18547, 18548, 18549, 18550, 18551, 18552, 18553, 18554, 18555, 2612, 1821, 18556, 18557, 3198, 1668, 5635, 18558, 5627, 18559, 5624, 18560, 5637, 5623, 4685, 1669, 18561, 3720, 3732, 5636, 18562, 5622, 18563, 18564, 18565, 5632, 18566, 18567, 5630, 18568, 18569, 2728, 5629, 18570, 1658, 18571, 18572, 18573, 18574, 18575, 5628, 2623, 5617, 2479, 18576, 2996, 18577, 18578, 18579, 18580, 18581, 2589, 5618, 5619, 18582, 5626, 5631, 5634, 1899, 18583, 3722, 2514, 5639, 5638, 4710, 5640, 5642, 5644, 4686, 5643, 5645, 5646, 4614, 18584, 18585, 18586, 18587, 18588, 18589, 18590, 2390, 5648, 18591, 18592, 5661, 5656, 5659, 18593, 18594, 18595, 18596, 18597, 18598, 18599, 5655, 3523, 18600, 18601, 2995, 18602, 18603, 18604, 18605, 3774, 18606, 18607, 18608, 5621, 5653, 18609, 18610, 18611, 18612, 5662, 18613, 18614, 5625, 5654, 18615, 5663, 18616, 5651, 18617, 18618, 18619, 18620, 18621, 18622, 18623, 5664, 5658, 5652, 3299, 18624, 18625, 18626, 18627, 5647, 2932, 3018, 5649, 5650, 18628, 5657, 2524, 5660, 4707, 5665, 18629, 5666, 3202, 18630, 18631, 5689, 5667, 18632, 18633, 18634, 5688, 18635, 2284, 18636, 18637, 2778, 18638, 2815, 18639, 18640, 2391, 18641, 18642, 18643, 18644, 5681, 18645, 5676, 18646, 5670, 18647, 18648, 18649, 1640, 5674, 18650, 5682, 1601, 5692, 18651, 18652, 18653, 5669, 18654, 18655, 18656, 3525, 5687, 18657, 18658, 18659, 18660, 18661, 5691, 3073, 2105, 18662, 18663, 18664, 18665, 18666, 5685, 5686, 18667, 18668, 18669, 5675, 18670, 18671, 18672, 5668, 18673, 5684, 4090, 18674, 5680, 18675, 18676, 18677, 18678, 5673, 3235, 3505, 4243, 5683, 18679, 5679, 18680, 18681, 18682, 18683, 18684, 18685, 5672, 18686, 18687, 18688, 5677, 3161, 18689, 18690, 18691, 18692, 18693, 18694, 4708, 4709, 5690, 4407, 3753, 18695, 18696, 18697, 18698, 18699, 18700, 18701, 18702, 5709, 18703, 18704, 18705, 18706, 18707, 18708, 5678, 18709, 18710, 18711, 5703, 3169, 18712, 18713, 18714, 18715, 18716, 18717, 18718, 18719, 5704, 18720, 18721, 18722, 18723, 18724, 18725, 18726, 18727, 18728, 18729, 5694, 18730, 18731, 18732, 18733, 18734, 5069, 18735, 5696, 5695, 2241, 5693, 18736, 18737, 18738, 18739, 3524, 18740, 1986, 18741, 18742, 18743, 18744, 18745, 5705, 18746, 2438, 4858, 5710, 18747, 18748, 18749, 1833, 18750, 5697, 18751, 2910, 5706, 18752, 5702, 18753, 5700, 18754, 18755, 18756, 18757, 18758, 18759, 18760, 1936, 18761, 18762, 18763, 18764, 5698, 5699, 5701, 18765, 2646, 5707, 18766, 5708, 18767, 18768, 18769, 18770, 18771, 18772, 18773, 18774, 5724, 18775, 3236, 18776, 18777, 4013, 18778, 18779, 18780, 18781, 5721, 18782, 18783, 18784, 18785, 18786, 18787, 18788, 18789, 18790, 18791, 18792, 18793, 18794, 5234, 18795, 18796, 3526, 18797, 5723, 18798, 18799, 18800, 4971, 5722, 5719, 18801, 18802, 5715, 18803, 5718, 18804, 5711, 18805, 18806, 4495, 18807, 18808, 18809, 18810, 3721, 5717, 18811, 18812, 5712, 18813, 18814, 5713, 4029, 18815, 5716, 18816, 18817, 1548, 18818, 18819, 18820, 18821, 18822, 18823, 2935, 18824, 2564, 5720, 18825, 18826, 5726, 18827, 5725, 5714, 18828, 18829, 18830, 18831, 18832, 3461, 18833, 18834, 18835, 5730, 18836, 18837, 18838, 18839, 18840, 18841, 18842, 18843, 18844, 18845, 18846, 5737, 18847, 18848, 5736, 18849, 18850, 18851, 18852, 18853, 18854, 18855, 18856, 18857, 18858, 18859, 18860, 5727, 18861, 18862, 18863, 18864, 3274, 18865, 3192, 18866, 18867, 18868, 4952, 18869, 18870, 4250, 18871, 18872, 18873, 18874, 5732, 18875, 1641, 18876, 18877, 18878, 18879, 18880, 18881, 18882, 18883, 18884, 3361, 3916, 18885, 18886, 18887, 18888, 18889, 18890, 18891, 18892, 18893, 18894, 3601, 5729, 5731, 5733, 5735, 1419, 1549, 18895, 18896, 18897, 18898, 18899, 5745, 18900, 18901, 18902, 18903, 5739, 2653, 3744, 18904, 18905, 18906, 18907, 18908, 18909, 18910, 18911, 18912, 18913, 18914, 5734, 18915, 18916, 5738, 18917, 18918, 18919, 18920, 5742, 18921, 18922, 18923, 18924, 18925, 5741, 18926, 18927, 18928, 5740, 18929, 18930, 18931, 18932, 18933, 18934, 18935, 18936, 18937, 5746, 18938, 4837, 18939, 18940, 18941, 18942, 5752, 5743, 5747, 18943, 18944, 2970, 18945, 18946, 18947, 18948, 18949, 1504, 5755, 18950, 5750, 18951, 18952, 18953, 18954, 18955, 18956, 18957, 5751, 18958, 18959, 18960, 18961, 18962, 18963, 18964, 18965, 18966, 18967, 18968, 4517, 5754, 18969, 18970, 18971, 18972, 18973, 18974, 18975, 5748, 18976, 18977, 18978, 5749, 18979, 4446, 18980, 18981, 18982, 5753, 3930, 5758, 18983, 18984, 18985, 18986, 18987, 18988, 5757, 18989, 5756, 18990, 18991, 18992, 18993, 18994, 18995, 18996, 5760, 18997, 18998, 18999, 19000, 19001, 19002, 19003, 2700, 19004, 19005, 19006, 19007, 19008, 1653, 3269, 19009, 19010, 5759, 19011, 3409, 19012, 19013, 19014, 19015, 19016, 19017, 5761, 19018, 19019, 19020, 19021, 19022, 19023, 19024, 4098, 19025, 19026, 19027, 19028, 2077, 19029, 19030, 19031, 19032, 19033, 19034, 19035, 19036, 19037, 19038, 19039, 19040, 19041, 19042, 19043, 19044, 19045, 4862, 19046, 19047, 19048, 5762, 19049, 19050, 19051, 19052, 19053, 5764, 19054, 19055, 19056, 19057, 19058, 19059, 19060, 19061, 19062, 19063, 19064, 3291, 19065, 19066, 19067, 19068, 5766, 19069, 19070, 19071, 19072, 19073, 19074, 19075, 19076, 19077, 19078, 19079, 19080, 19081, 19082, 19083, 19084, 5763, 19085, 5765, 19086, 19087, 19088, 19089, 19090, 19091, 19092, 19093, 19094, 19095, 19096, 19097, 19098, 19099, 4913, 19100, 19101, 19102, 5767, 19103, 19104, 19105, 19106, 19107, 19108, 19109, 19110, 19111, 19112, 19113, 19114, 19115, 19116, 19117, 19118, 7627, 2445, 3119, 3399, 3140, 19119, 19120, 7628, 19121, 19122, 19123, 19124, 19125, 4490, 19126, 19127, 19128, 4760, 19129, 19130, 19131, 6984, 19132, 19133, 19134, 19135, 19136, 19137, 19138, 19139, 1761, 7629, 19140, 7630, 19141, 19142, 3866, 19143, 19144, 19145, 19146, 19147, 19148, 19149, 2420, 7632, 7634, 7633, 4015, 4349, 7631, 3873, 4652, 3177, 19150, 19151, 19152, 19153, 19154, 19155, 19156, 4264, 7637, 1495, 7636, 19157, 19158, 19159, 19160, 19161, 7643, 19162, 1644, 19163, 19164, 19165, 19166, 19167, 19168, 4544, 7639, 19169, 19170, 19171, 19172, 19173, 7641, 4866, 19174, 19175, 7640, 7635, 7644, 7642, 19176, 7638, 19177, 19178, 7652, 7649, 7651, 19179, 19180, 7655, 7647, 7645, 19181, 19182, 19183, 7650, 19184, 19185, 19186, 19187, 19188, 5072, 19189, 19190, 19191, 7646, 19192, 3660, 3822, 19193, 7653, 2293, 1895, 19194, 19195, 7648, 7654, 7661, 7667, 19196, 19197, 2498, 19198, 19199, 19200, 7666, 4195, 19201, 5056, 19202, 19203, 7663, 7665, 19204, 19205, 19206, 19207, 2243, 19208, 19209, 19210, 19211, 7656, 19212, 19213, 19214, 7659, 3190, 19215, 4948, 7657, 7658, 7660, 7664, 19216, 19217, 19218, 7670, 4727, 19219, 19220, 19221, 19222, 2047, 19223, 3934, 19224, 2135, 7668, 19225, 19226, 19227, 7669, 7671, 7674, 7672, 19228, 19229, 7673, 19230, 19231, 19232, 19233, 4560, 7662, 19234, 4176, 19235, 4276, 4990, 19236, 7680, 19237, 3254, 19238, 7677, 19239, 19240, 2928, 7689, 7675, 19241, 7678, 19242, 19243, 19244, 7685, 19245, 19246, 19247, 19248, 7679, 19249, 19250, 7684, 19251, 19252, 7683, 19253, 19254, 7686, 19255, 19256, 19257, 7676, 19258, 19259, 7681, 7687, 19260, 19261, 19262, 19263, 19264, 19265, 19266, 4711, 7682, 1682, 19267, 19268, 7695, 19269, 4428, 19270, 19271, 19272, 19273, 7698, 19274, 19275, 19276, 2483, 19277, 7702, 19278, 19279, 19280, 19281, 19282, 19283, 7693, 19284, 19285, 7699, 7701, 7703, 19286, 19287, 19288, 19289, 19290, 19291, 19292, 19293, 7696, 19294, 7694, 19295, 19296, 19297, 2440, 19298, 1970, 19299, 19300, 19301, 19302, 7692, 7700, 7690, 7691, 19303, 19304, 19305, 7688, 7713, 19306, 7710, 19307, 19308, 7709, 19309, 19310, 7697, 19311, 3723, 19312, 19313, 19314, 19315, 19316, 7704, 19317, 19318, 19319, 7712, 19320, 19321, 19322, 19323, 19324, 19325, 19326, 3283, 19327, 19328, 19329, 19330, 19331, 19332, 19333, 19334, 7706, 19335, 19336, 7714, 7716, 7711, 19337, 7705, 19338, 19339, 19340, 7718, 19341, 7717, 19342, 19343, 19344, 19345, 3162, 19346, 19347, 7721, 19348, 19349, 7723, 19350, 19351, 19352, 19353, 19354, 7708, 19355, 19356, 19357, 7724, 7719, 19358, 19359, 19360, 19361, 19362, 7722, 7707, 7720, 19363, 19364, 19365, 19366, 19367, 19368, 19369, 7725, 19370, 19371, 19372, 19373, 7727, 19374, 19375, 19376, 19377, 7715, 19378, 19379, 19380, 19381, 7726, 19382, 19383, 19384, 7728, 19385, 19386, 19387, 19388, 19389, 19390, 19391, 19392, 19393, 19394, 4440, 19395, 19396, 19397, 19398, 7731, 19399, 19400, 19401, 19402, 5352, 19403, 19404, 19405, 19406, 19407, 19408, 7732, 19409, 19410, 19411, 19412, 19413, 19414, 19415, 19416, 7730, 19417, 3733, 7729, 19418, 19419, 19420, 19421, 7733, 19422, 19423, 19424, 19425, 19426, 7734, 1817, 19427, 19428, 19429, 19430, 19431, 19432, 19433, 19434, 19435, 19436, 19437, 19438, 19439, 19440, 19441, 7272, 19442, 19443, 19444, 19445, 19446, 19447, 7735, 19448, 19449, 7736, 19450, 19451, 19452, 4521, 19453, 19454, 19455, 7813, 4455, 19456, 19457, 19458, 19459, 19460, 19461, 4465, 4571, 19462, 19463, 19464, 19465, 19466, 19467, 4369, 19468, 19469, 2685, 19470, 4546, 19471, 19472, 19473, 19474, 19475, 19476, 19477, 2415, 6088, 4639, 7553, 1622, 19478, 19479, 1580, 7554, 19480, 3791, 1727, 19481, 5345, 19482, 3952, 19483, 7555, 19484, 19485, 19486, 19487, 5033, 19488, 19489, 19490, 19491, 19492, 7556, 7833, 7557, 19493, 4805, 7558, 19494, 1441, 7834, 19495, 19496, 7835, 19497, 19498, 1877, 19499, 3442, 19500, 19501, 19502, 19503, 4068, 19504, 19505, 19506, 4485, 19507, 19508, 19509, 19510, 19511, 4199, 19512, 19513, 19514, 19515, 19516, 7559, 19517, 5346, 19518, 19519, 19520, 19521, 19522, 19523, 1530, 19524, 4337, 19525, 19526, 19527, 2165, 19528, 19529, 19530, 19531, 19532, 7561, 19533, 19534, 19535, 19536, 7562, 19537, 19538, 19539, 19540, 1632, 3056, 19541, 19542, 5091, 7560, 19543, 19544, 7563, 19545, 19546, 19547, 19548, 7565, 19549, 19550, 19551, 5349, 19552, 4670, 4796, 19553, 19554, 7836, 3690, 19555, 19556, 19557, 19558, 19559, 7837, 19560, 19561, 7564, 7566, 2886, 7567, 19562, 19563, 7571, 19564, 19565, 19566, 19567, 19568, 19569, 19570, 7573, 7568, 19571, 3808, 3448, 19572, 19573, 19574, 3168, 2347, 19575, 19576, 7570, 19577, 7572, 19578, 19579, 19580, 2306, 19581, 19582, 19583, 19584, 19585, 19586, 19587, 7578, 19588, 19589, 19590, 19591, 19592, 2403, 19593, 1502, 7576, 19594, 19595, 19596, 19597, 19598, 7575, 7569, 7577, 19599, 19600, 19601, 19602, 19603, 7574, 19604, 19605, 19606, 3741, 19607, 19608, 19609, 19610, 4177, 7580, 19611, 19612, 19613, 19614, 6420, 19615, 19616, 19617, 7579, 19618, 7581, 19619, 19620, 19621, 19622, 19623, 19624, 19625, 19626, 19627, 19628, 7582, 19629, 19630, 4392, 19631, 19632, 19633, 19634, 19635, 19636, 19637, 19638, 19639, 19640, 19641, 19642, 19643, 19644, 19645, 19646, 19647, 19648, 19649, 19650, 19651, 19652, 19653, 19654, 19655, 7838, 2714, 19656, 19657, 19658, 19659, 19660, 19661, 7583, 19662, 19663, 19664, 19665, 19666, 19667, 19668, 19669, 19670, 19671, 19672, 19673, 19674, 19675, 19676, 19677, 19678, 19679, 19680, 19681, 7584, 19682, 19683, 19684, 4316, 19685, 4615, 19686, 7610, 19687, 19688, 2179, 19689, 19690, 19691, 19692, 19693, 19694, 19695, 19696, 19697, 19698, 19699, 19700, 19701, 19702, 19703, 19704, 19705, 19706, 19707, 19708, 19709, 19710, 19711, 19712, 19713, 19714, 19715, 19716, 19717, 19718, 19719, 19720, 19721, 19722, 19723, 19724, 19725, 19726, 19727, 19728, 19729, 19730, 19731, 19732, 19733, 19734, 19735, 19736, 19737, 19738, 19739, 19740, 19741, 19742, 19743, 19744, 19745, 19746, 2628, 2314, 19747, 2325, 3252, 3904, 6933, 2945, 2810, 6934, 6935, 6936, 19748, 6937, 6938, 6939, 6940, 2670, 19749, 19750, 19751, 7986, 19752, 19753, 19754, 7988, 19755, 7989, 19756, 7987, 19757, 19758, 19759, 19760, 2697, 19761, 7990, 1790, 19762, 19763, 19764, 19765, 7991, 19766, 19767, 19768, 7992, 19769, 19770, 19771, 7067, 19772, 19773, 19774, 19775, 19776, 19777, 19778, 19779, 19780, 19781, 19782, 19783, 4563, 19784, 19785, 19786, 19787, 19788, 19789, 5337, 19790, 19791, 19792, 19793, 19794, 19795, 19796, 19797, 19798, 19799, 19800, 19801, 19802, 19803, 19804, 19805, 19806, 19807, 19808, 19809, 19810, 19811, 19812, 19813, 19814, 19815, 19816, 19817, 19818, 19819, 19820, 19821, 19822, 19823, 19824, 19825, 19826, 19827, 19828, 19829, 19830, 19831, 19832, 19833, 19834, 19835, 19836, 19837, 19838, 19839, 19840, 19841, 19842, 19843, 7993, 19844, 19845, 19846, 19847, 19848, 19849, 19850, 19851, 19852, 7263, 19853, 19854, 19855, 19856, 19857, 19858, 19859, 19860, 19861, 19862, 19863, 19864, 19865, 19866, 19867, 19868, 19869, 19870, 19871, 19872, 19873, 19874, 19875, 19876, 19877, 19878, 19879, 19880, 19881, 19882, 19883, 19884, 19885, 19886, 19887, 19888, 19889, 19890, 19891, 19892, 19893, 19894, 19895, 19896, 19897, 19898, 19899, 19900, 4905, 19901, 19902, 19903, 19904, 19905, 19906, 19907, 19908, 19909, 19910, 19911, 19912, 19913, 19914, 19915, 4793, 4101, 19916, 19917, 19918, 19919, 19920, 19921, 19922, 19923, 3889, 19924, 19925, 19926, 19927, 19928, 19929, 19930, 19931, 19932, 19933, 19934, 19935, 19936, 19937, 19938, 19939, 19940, 19941, 19942, 19943, 19944, 19945, 19946, 19947, 19948, 19949, 19950, 19951, 19952, 19953, 19954, 19955, 19956, 19957, 19958, 19959, 19960, 19961, 19962, 19963, 19964, 19965, 19966, 19967, 19968, 19969, 19970, 19971, 19972, 19973, 19974, 19975, 19976, 19977, 19978, 19979, 19980, 19981, 19982, 19983, 19984, 19985, 19986, 19987, 19988, 19989, 19990, 19991, 19992, 19993, 19994, 19995, 19996, 19997, 19998, 19999, 20000, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010, 20011, 20012, 20013, 20014, 20015, 20016, 20017, 20018, 20019, 20020, 20021, 20022, 20023, 20024, 20025, 20026, 20027, 20028, 20029, 20030, 20031, 20032, 20033, 20034, 20035, 20036, 20037, 20038, 6423, 20039, 20040, 20041, 20042, 20043, 20044, 20045, 20046, 20047, 20048, 20049, 20050, 20051, 20052, 20053, 20054, 20055, 20056, 20057, 20058, 20059, 20060, 20061, 20062, 20063, 20064, 20065, 20066, 20067, 20068, 7994, 20069, 20070, 20071, 20072, 20073, 20074, 20075, 20076, 20077, 20078, 20079, 20080, 20081, 20082, 20083, 20084, 20085, 20086, 20087, 20088, 20089, 20090, 20091, 20092, 20093, 20094, 20095, 20096, 20097, 20098, 20099, 20100, 20101, 20102, 20103, 20104, 20105, 20106, 20107, 20108, 20109, 20110, 20111, 20112, 20113, 20114, 20115, 20116, 20117, 20118, 20119, 20120, 20121, 20122, 20123, 20124, 20125, 20126, 20127, 20128, 20129, 20130, 20131, 2740, 20132, 20133, 20134, 20135, 20136, 3486, 20137, 20138, 20139, 20140, 20141, 20142, 20143, 20144, 20145, 20146, 20147, 20148, 20149, 20150, 20151, 20152, 20153, 20154, 20155, 20156, 20157, 20158, 20159, 20160, 20161, 20162, 20163, 20164, 20165, 20166, 20167, 20168, 20169, 20170, 20171, 20172, 20173, 20174, 20175, 20176, 20177, 20178, 20179, 20180, 20181, 20182, 20183, 20184, 20185, 20186, 20187, 5362, 2575, 1982, 2189, 3712, 2542, 5363, 5364, 4095, 3700, 5365, 3570, 20188, 4532, 4678, 4533, 2576, 20189, 2649, 2511, 5366, 5367, 4551, 5368, 4494, 2052, 3160, 20190, 3994, 2144, 3831, 2102, 2812, 4985, 5369, 5370, 3509, 5146, 3875, 20191, 4896, 4010, 4966, 5371, 5044, 1827, 5373, 5372, 20192, 4680, 5374, 5375, 5376, 3905, 5377, 3864, 5378, 5379, 1738, 5060, 5380, 2459, 1893, 5381, 5382, 2333, 4526, 4677, 5383, 2196, 4397, 1676, 5384, 5385, 20193, 2706, 4289, 4778, 5386, 4312, 5387, 4752, 2512, 5388, 3968, 3995, 5389, 3646, 5059, 5390, 3404, 2006, 5391, 2111, 2865, 5392, 5393, 3960, 5394, 1966, 5395, 3041, 5102, 5396, 4065, 20194, 4679, 3306, 5397, 1972, 2492, 5398, 4436, 5399, 5400, 4258, 5401, 5402, 5403, 1684, 5406, 5404, 4583, 5405, 3248, 5407, 20195, 5408, 5409, 5410, 4444, 4610, 1498, 5411, 3582, 5412, 2718, 3196, 5413, 5414, 3288, 4064, 5415, 5416, 2943, 3532, 5417, 5418, 3591, 5419, 5420, 2295, 20196, 20197, 20198, 20199, 20200, 20201, 20202, 20203, 20204, 2520, 20205, 20206, 20207, 20208, 1998, 7889, 20209, 7890, 20210, 20211, 4202, 20212, 20213, 20214, 20215, 20216, 20217, 20218, 20219, 7920, 20220, 20221, 20222, 20223, 7019, 20224, 20225, 20226, 20227, 20228, 20229, 4406, 2474, 20230, 20231, 20232, 20233, 20234, 20235, 20236, 2381, 4798, 20237, 20238, 20239, 20240, 20241, 20242, 20243, 6072, 20244, 20245, 20246, 20247, 7979, 1513, 1679, 20248, 20249, 20250, 20251, 20252, 20253, 20254, 7980, 20255, 20256, 7982, 20257, 20258, 20259, 2398, 7981, 20260, 3213, 20261, 20262, 20263, 20264, 20265, 20266, 20267, 7984, 20268, 20269, 20270, 7983, 20271, 20272, 20273, 20274, 20275, 20276, 20277, 20278, 20279, 20280, 20281, 20282, 20283, 20284, 20285, 20286, 20287, 20288, 20289, 20290, 20291, 20292, 20293, 20294, 20295, 20296, 20297, 20298, 20299, 20300, 20301, 20302, 20303, 20304, 20305, 20306, 20307, 20308, 20309, 20310, 20311, 20312, 20313, 20314, 20315, 20316, 20317, 20318, 20319, 20320, 20321, 20322, 20323, 20324, 20325, 20326, 20327, 20328, 20329, 20330, 20331, 20332, 20333, 20334, 20335, 20336, 20337, 20338, 20339, 20340, 20341, 20342, 20343, 20344, 20345, 20346, 20347, 20348, 20349, 20350, 20351, 20352, 20353, 20354, 20355, 20356, 20357, 20358, 20359, 20360, 20361, 20362, 20363, 20364, 20365, 20366, 20367, 20368, 20369, 20370, 20371, 20372, 20373, 20374, 20375, 20376, 20377, 20378, 20379, 20380, 20381, 20382, 20383, 20384, 20385, 20386, 20387, 20388, 20389, 20390, 20391, 20392, 20393, 20394, 20395, 20396, 20397, 20398, 20399, 20400, 20401, 20402, 1523, 4961, 2187, 20403, 2272, 1635, 4873, 4368, 1469, 4930, 2528, 5023, 2090, 4057, 3499, 1568, 2281, 5073, 2320, 2068, 2627, 6919, 6920, 4130, 2338, 6921, 1876, 3214, 2116, 2405, 6922, 4877, 6923, 2591, 2506, 6924, 3069, 3125, 4856, 5117, 6925, 6926, 6929, 6927, 6928, 3821, 2180, 2009, 6930, 3927, 3804, 1830, 20404, 20405, 6166, 3449, 6931, 2934, 20406, 5099, 6932, 5087, 3757, 5220, 5214, 4855, 20407, 4882, 3795, 4713, 2212, 1755, 20408, 3825, 7887, 20409, 20410, 20411, 2402, 20412, 7888, 20413, 20414, 5138, 20415, 20416, 7882, 2177, 4939, 2208, 3557, 20417, 20418, 20419, 20420, 20421, 20422, 20423, 20424, 20425, 1726, 20426, 20427, 7883, 1703, 20428, 20429, 20430, 20431, 4822, 3658, 20432, 20433, 20434, 20435, 20436, 7885, 20437, 20438, 7884, 20439, 20440, 20441, 20442, 20443, 20444, 20445, 20446, 20447, 20448, 4084, 20449, 20450, 20451, 3669, 20452, 20453, 20454, 20455, 20456, 20457, 20458, 20459, 20460, 20461, 20462, 20463, 20464, 7886, 20465, 5142, 3414, 7927, 20466, 20467, 7922, 20468, 7930, 20469, 7929, 20470, 5007, 7928, 20471, 20472, 20473, 4823, 7931, 20474, 7939, 20475, 20476, 20477, 20478, 1456, 1967, 20479, 7936, 7937, 20480, 3443, 20481, 20482, 20483, 20484, 7932, 7933, 20485, 20486, 7934, 7938, 20487, 2789, 7935, 2251, 20488, 20489, 20490, 7943, 7946, 20491, 20492, 20493, 2890, 20494, 2337, 7923, 7940, 20495, 20496, 3124, 20497, 20498, 20499, 4129, 20500, 2626, 20501, 7941, 7942, 7944, 2042, 7945, 20502, 7948, 20503, 20504, 20505, 20506, 20507, 20508, 20509, 7924, 20510, 20511, 20512, 7947, 4726, 20513, 1767, 20514, 20515, 4045, 20516, 20517, 20518, 20519, 7949, 20520, 20521, 20522, 20523, 20524, 20525, 20526, 20527, 7950, 2790, 7951, 20528, 20529, 4104, 7954, 20530, 20531, 20532, 20533, 20534, 1637, 5132, 20535, 7952, 20536, 7953, 7955, 20537, 7961, 20538, 20539, 20540, 7959, 20541, 20542, 20543, 7958, 7956, 20544, 20545, 7960, 20546, 20547, 7957, 7963, 7964, 20548, 4108, 20549, 20550, 6422, 1903, 7962, 7967, 4044, 20551, 20552, 20553, 20554, 20555, 7965, 7966, 20556, 20557, 20558, 20559, 20560, 20561, 7925, 20562, 20563, 20564, 20565, 20566, 20567, 20568, 20569, 20570, 20571, 20572, 20573, 1539, 20574, 20575, 7926, 20576, 20577, 1916, 1665, 20578, 7971, 7968, 20579, 2028, 20580, 7972, 20581, 7969, 20582, 20583, 20584, 20585, 20586, 7970, 20587, 20588, 1843, 20589, 4867, 20590, 20591, 20592, 7973, 20593, 1780, 20594, 20595, 20596, 20597, 20598, 20599, 20600, 7974, 7976, 20601, 20602, 20603, 7975, 20604, 20605, 20606, 20607, 20608, 20609, 20610, 7977, 20611, 7978, 20612, 20613, 20614, 20615, 20616, 20617, 20618, 20619, 20620, 20621, 20622, 20623, 3836, 2265, 20624, 20625, 3662, 20626, 20627, 2040, 20628, 20629, 20630, 20631, 20632, 20633, 20634, 4082, 20635, 20636, 20637, 20638, 20639, 20640, 20641, 20642, 20643, 20644, 20645, 20646, 20647, 20648, 20649, 20650, 20651, 20652, 20653, 6867, 20654, 20655, 20656, 20657, 20658, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20666, 20667, 20668, 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20687, 20688, 20689, 20690, 20691, 20692, 20693, 20694, 20695, 20696, 20697, 20698, 20699, 20700, 20701, 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20710, 20711, 20712, 20713, 20714, 20715, 20716, 20717, 20718, 20719, 20720, 20721, 20722, 20723, 20724, 20725, 20726, 20727, 20728, 20729, 20730, 20731, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, 20740, 20741, 20742, 20743, 20744, 20745, 20746, 20747, 20748, 20749, 20750, 20751, 20752, 20753, 20754, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, 20764, 20765, 20766, 20767, 20768, 20769, 20770, 20771, 20772, 20773, 20774, 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, 20795, 20796, 20797, 20798, 20799, 20800, 20801, 20802, 20803, 20804, 1712, 4887, 2331, 4506, 20805, 6844, 5085, 6845, 3155, 3742, 2417, 6846, 6847, 6848, 5046, 6849, 6850, 6852, 6851, 6853, 6854, 3636, 6855, 4849, 6856, 2677, 20806, 6857, 6858, 2678, 6859, 2169, 3037, 6860, 1521, 2495, 2340, 6861, 20807, 6862, 6863, 6864, 2155, 2550, 20808, 3921, 5967, 4808, 4352, 4910, 6865, 4949, 6866, 4450, 2283, 20809, 1824, 1560, 20810, 20811, 20812, 2930, 20813, 20814, 20815, 20816, 1573, 1574, 20817, 1575, 20818, 20819, 20820, 20821, 1720, 3737, 20822, 20823, 20824, 20825, 6424, 20826, 20827, 1566, 20828, 20829, 20830, 3048, 1864, 20831, 20832, 3579, 4755, 20833, 3566, 4535, 20834, 2348, 3186, 20835, 20836, 20837, 20838, 20839, 4712, 20840, 4836, 2723, 20841, 6425, 2088, 6426, 20842, 20843, 2468, 4953, 20844, 2719, 4815, 4234, 3019, 1748, 20845, 20846, 4127, 20847, 6429, 6427, 6431, 20848, 6433, 6430, 1926, 3517, 20849, 1971, 6428, 20850, 3939, 20851, 20852, 6432, 20853, 20854, 20855, 3247, 1540, 2540, 20856, 20857, 20858, 5098, 20859, 20860, 4178, 3992, 3895, 4092, 6435, 6434, 3359, 20861, 20862, 4512, 4534, 6436, 20863, 6439, 20864, 4159, 5061, 6438, 1940, 20865, 4165, 20866, 6440, 1999, 20867, 20868, 4143, 2323, 20869, 3890, 1740, 4004, 4869, 6441, 2141, 20870, 20871, 20872, 6437, 20873, 20874, 20875, 20876, 20877, 20878, 6444, 1879, 6445, 20879, 20880, 20881, 20882, 20883, 6442, 6443, 20884, 4666, 20885, 20886, 3164, 1541, 20887, 4765, 20888, 20889, 2034, 4023, 20890, 6446, 20891, 20892, 4785, 20893, 20894, 20895, 20896, 20897, 1576, 20898, 2057, 6449, 6447, 6448, 1911, 20899, 20900, 20901, 4642, 6451, 20902, 20903, 6453, 20904, 20905, 20906, 20907, 20908, 20909, 6452, 3589, 20910, 4608, 20911, 20912, 6450, 20913, 20914, 20915, 20916, 4859, 4945, 20917, 20918, 20919, 20920, 20921, 6455, 5156, 20922, 20923, 20924, 20925, 20926, 20927, 20928, 6456, 20929, 1563, 4602, 20930, 6457, 6459, 20931, 20932, 20933, 20934, 6458, 20935, 20936, 6460, 20937, 20938, 20939, 20940, 20941, 4661, 20942, 1922, 20943, 6642, 20944, 5442, 20945, 5445, 20946, 5443, 20947, 5444, 20948, 20949, 20950, 5447, 4464, 3328, 20951, 20952, 1487, 20953, 20954, 20955, 4433, 20956, 5446, 20957, 4741, 2359, 5453, 3652, 20958, 5449, 5448, 3818, 5450, 20959, 5452, 5137, 5451, 3065, 20960, 20961, 5456, 20962, 20963, 4783, 20964, 20965, 5458, 5455, 20966, 5459, 20967, 20968, 2659, 20969, 20970, 20971, 2954, 5454, 5457, 4984, 20972, 5460, 20973, 20974, 20975, 5464, 20976, 20977, 20978, 5465, 5463, 2383, 20979, 20980, 20981, 2823, 5462, 20982, 20983, 20984, 5461, 4832, 1628, 20985, 20986, 5466, 20987, 2344, 20988, 5467, 20989, 20990, 20991, 20992, 1718, 20993, 20994, 20995, 1885, 20996, 20997, 20998, 20999, 2001, 5468, 21000, 21001, 21002, 2058, 21003, 5469, 21004, 21005, 21006, 21007, 21008, 21009, 21010, 21011, 21012, 21013, 21014, 21015, 21016, 21017, 21018, 21019, 21020, 21021, 21022, 21023, 1544, 21024, 21025, 21026, 21027, 5471, 21028, 21029, 21030, 5470, 5472, 21031, 21032, 21033, 21034, 21035, 21036, 21037, 21038, 21039, 21040, 21041, 5474, 21042, 5473, 21043, 21044, 21045, 21046, 21047, 21048, 21049, 5475, 21050, 21051, 21052, 21053, 21054, 21055, 21056, 21057, 21058, 5476, 21059, 21060, 5477, 21061, 21062, 4746, 7891, 3656, 5110, 3451, 7893, 7894, 7892, 21063, 2763, 21064, 21065, 21066, 21067, 4496, 21068, 21069, 2118, 21070, 21071, 4838, 4051, 21072, 21073, 7897, 7896, 2357, 7895, 4001, 21074, 21075, 21076, 7899, 2963, 21077, 1765, 21078, 4145, 7900, 7898, 2651, 7903, 21079, 7904, 2676, 3219, 2884, 4012, 7905, 21080, 21081, 21082, 7901, 7902, 3369, 21083, 21084, 21085, 21086, 21087, 7907, 21088, 1813, 21089, 5152, 21090, 1840, 7906, 7909, 21091, 21092, 7908, 7910, 4466, 21093, 21094, 21095, 21096, 21097, 21098, 21099, 3244, 3674, 21100, 21101, 21102, 21103, 21104, 21105, 7911, 7912, 21106, 21107, 21108, 21109, 21110, 21111, 7913, 21112, 21113, 7914, 7915, 7916, 21114, 21115, 21116, 21117, 7918, 7917, 21118, 21119, 21120, 21121, 7919, 21122, 21123, 21124, 21125, 21126, 21127, 21128, 21129, 21130, 21131, 21132, 21133, 1638, 21134, 4751, 3898, 21135, 2992, 5037, 4621, 3038, 21136, 2711, 21137, 21138, 21139, 21140, 21141, 21142, 21143, 21144, 21145, 21146, 2171, 21147, 21148, 21149, 21150, 21151, 21152, 21153, 21154, 21155, 21156, 21157, 21158, 21159, 21160, 21161, 21162, 21163, 21164, 21165, 21166, 21167, 21168, 21169, 21170, 21171, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, 21181, 21182, 21183, 21184, 21185, 21186, 21187, 21188, 21189, 21190, 21191, 21192, 21193, 21194, 21195, 21196, 21197, 21198, 21199, 21200, 21201, 21202, 21203, 21204, 21205, 21206, 21207, 21208, 21209, 21210, 21211, 21212, 21213, 21214, 21215, 21216, 21217, 21218, 21219, 21220, 21221, 21222, 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21232, 21233, 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21241, 21242, 21243, 21244, 21245, 21246, 21247, 21248, 21249, 21250, 21251, 21252, 21253, 21254, 21255, 21256, 21257, 21258, 21259, 21260, 21261, 21262, 21263, 21264, 21265, 21266, 21267, 21268, 21269, 21270, 21271, 21272, 21273, 21274, 21275, 21276, 21277, 21278, 21279, 21280, 21281, 21282, 21283, 21284, 21285, 21286, 21287, 21288, 21289, 21290, 21291, 21292, 21293, 21294, 21295, 21296, 21297, 2625, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21305, 21306, 21307, 21308, 21309, 21310, 21311, 21312, 21313, 21314, 21315, 21316, 21317, 21318, 21319, 21320, 21321, 21322, 8027, 21323, 21324, 21325, 21326, 21327, 21328, 21329, 21330, 21331, 21332, 21333, 21334, 21335, 21336, 21337, 21338, 21339, 21340, 21341, 21342, 21343, 21344, 21345, 21346, 21347, 21348, 21349, 21350, 21351, 21352, 21353, 8028, 21354, 21355, 21356, 21357, 21358, 21359, 21360, 21361, 21362, 21363, 21364, 21365, 21366, 21367, 21368, 21369, 21370, 21371, 21372, 21373, 21374, 21375, 21376, 21377, 21378, 8029, 21379, 21380, 21381, 21382, 21383, 21384, 21385, 21386, 21387, 21388, 21389, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21397, 21398, 21399, 21400, 21401, 21402, 21403, 21404, 21405, 21406, 21407, 21408, 21409, 21410, 21411, 21412, 21413, 21414, 21415, 21416, 21417, 21418, 21419, 21420, 21421, 21422, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21430, 21431, 21432, 21433, 21434, 21435, 21436, 21437, 21438, 21439, 21440, 21441, 21442, 21443, 21444, 21445, 21446, 21447, 21448, 21449, 21450, 21451, 21452, 21453, 21454, 21455, 21456, 21457, 21458, 21459, 21460, 21461, 21462, 21463, 21464, 21465, 21466, 21467, 21468, 21469, 21470, 21471, 21472, 21473, 21474, 21475, 21476, 21477, 21478, 21479, 21480, 21481, 21482, 21483, 21484, 21485, 21486, 21487, 21488, 21489, 21490, 21491, 21492, 21493, 21494, 21495, 8030, 21496, 21497, 21498, 21499, 21500, 21501, 21502, 21503, 21504, 21505, 21506, 21507, 21508, 21509, 21510, 21511, 21512, 21513, 21514, 21515, 21516, 21517, 21518, 21519, 21520, 21521, 21522, 21523, 21524, 21525, 21526, 21527, 21528, 21529, 21530, 21531, 21532, 21533, 21534, 21535, 21536, 21537, 21538, 8031, 21539, 21540, 21541, 21542, 21543, 21544, 21545, 21546, 21547, 21548, 21549, 21550, 21551, 21552, 21553, 21554, 21555, 21556, 21557, 21558, 21559, 21560, 21561, 21562, 21563, 21564, 21565, 21566, 21567, 21568, 21569, 21570, 21571, 21572, 21573, 21574, 8033, 21575, 21576, 21577, 21578, 21579, 21580, 21581, 21582, 21583, 21584, 21585, 21586, 21587, 21588, 21589, 21590, 21591, 21592, 21593, 21594, 21595, 21596, 21597, 21598, 21599, 21600, 21601, 21602, 21603, 21604, 21605, 21606, 21607, 21608, 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21617, 21618, 21619, 21620, 21621, 21622, 21623, 21624, 21625, 21626, 21627, 21628, 21629, 21630, 21631, 21632, 8032, 21633, 21634, 21635, 21636, 21637, 21638, 21639, 21640, 21641, 21642, 21643, 8156, 21644, 21645, 21646, 21647, 21648, 21649, 21650, 21651, 21652, 21653, 21654, 21655, 21656, 21657, 21658, 21659, 21660, 21661, 21662, 21663, 21664, 21665, 21666, 21667, 21668, 21669, 21670, 21671, 21672, 21673, 21674, 21675, 21676, 21677, 21678, 21679, 21680, 21681, 21682, 21683, 21684, 21685, 21686, 21687, 21688, 21689, 21690, 21691, 21692, 21693, 21694, 21695, 21696, 21697, 21698, 21699, 21700, 21701, 21702, 21703, 21704, 21705, 21706, 21707, 21708, 21709, 21710, 21711, 21712, 21713, 21714, 21715, 21716, 21717, 21718, 21719, 21720, 21721, 21722, 21723, 21724, 21725, 21726, 21727, 21728, 21729, 21730, 21731, 21732, 21733, 21734, 21735, 21736, 21737, 21738, 21739, 21740, 21741, 21742, 21743, 21744, 21745, 21746, 8034, 21747, 21748, 21749, 21750, 21751, 21752, 21753, 21754, 21755, 21756, 21757, 21758, 21759, 21760, 21761, 21762, 21763, 21764, 21765, 21766, 21767, 21768, 21769, 21770, 21771, 21772, 21773, 21774, 21775, 21776, 21777, 21778, 21779, 21780, 21781, 21782, 21783, 21784, 21785, 21786, 21787, 21788, 21789, 21790, 8035, 21791, 21792, 21793, 21794, 21795, 21796, 21797, 21798, 21799, 21800, 21801, 21802, 21803, 21804, 21805, 21806, 21807, 21808, 21809, 21810, 21811, 21812, 21813, 21814, 21815, 7273, 7274, 7275, 4962, 1977, 7277, 7276, 7278, 7279, 3576, 7280, 7281, 21816, 2083, 1965, 7282, 7284, 21817, 7283, 21818, 2199, 7285, 7286, 7287, 2032, 1705, 5032, 3327, 1524, 2215, 7288, 7289, 4824, 3624, 2816, 4286, 2274, 7291, 7290, 7293, 7292, 3388, 7294, 7295, 3585, 7296, 3586, 7297, 1604, 7298, 7299, 7300, 7301, 7302, 5149, 7303, 7304, 2593, 7305, 4742, 4131, 1609, 3076, 7306, 3577, 3208, 21819, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 21820, 7314, 7315, 7316, 21821, 21822, 7317, 7318, 7319, 7321, 7320, 21823, 7322, 4148, 3134, 7323, 7324, 7325, 4888, 7326, 4342, 7327, 7328, 21824, 7329, 7330, 7332, 7331, 7333, 2246, 3285, 7334, 7335, 2665, 4636, 1686, 7336, 7337, 7338, 4693, 7339, 5074, 7340, 3521, 21825, 7341, 7342, 3027, 7343, 4413, 4035, 7345, 7344, 1781, 2343, 7346, 7347, 4483, 7348, 7349, 2137, 4448, 7350, 7351, 7352, 3746, 4105, 7353, 7354, 7355, 7356, 7357, 4951, 7358, 1862, 3205, 7359, 21826, 7360, 7361, 7362, 21827, 4322, 7363, 3165, 1809, 5097, 2716, 21828, 4362, 7366, 7364, 7365, 7367, 1980, 2629, 2791, 3239, 7368, 7369, 21829, 7370, 7378, 7371, 7372, 7373, 3605, 7412, 2018, 7374, 21830, 7375, 7376, 2011, 3225, 7377, 21831, 7379, 7380, 7381, 4969, 21832, 7382, 3376, 21833, 7383, 3377, 7384, 7385, 2229, 1496, 7386, 7387, 7388, 21834, 7389, 7390, 7391, 7392, 21835, 7393, 2746, 7396, 7394, 7395, 21836, 7397, 7398, 3052, 7399, 7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 2969, 21837, 7408, 3020, 7409, 7410, 7411, 21838, 21839, 4389, 21840, 21841, 21842, 21843, 21844, 21845, 21846, 21847, 1695, 21848, 21849, 21850, 21851, 21852, 21853, 21854, 21855, 21856, 21857, 21858, 21859, 21860, 21861, 21862, 21863, 21864, 21865, 21866, 21867, 21868, 21869, 21870, 21871, 21872, 21873, 21874, 21875, 21876, 21877, 21878, 21879, 21880, 21881, 21882, 21883, 21884, 21885, 21886, 21887, 21888, 21889, 21890, 21891, 21892, 21893, 21894, 21895, 21896, 21897, 21898, 21899, 21900, 21901, 21902, 21903, 21904, 21905, 21906, 21907, 21908, 21909, 21910, 21911, 21912, 21913, 21914, 21915, 21916, 21917, 21918, 21919, 21920, 21921, 21922, 21923, 21924, 21925, 21926, 21927, 21928, 21929, 21930, 21931, 21932, 21933, 21934, 21935, 21936, 21937, 21938, 21939, 21940, 21941, 21942, 21943, 21944, 21945, 21946, 21947, 21948, 21949, 21950, 21951, 3232, 6240, 3792, 6241, 21952, 1556, 4271, 1804, 3747, 6242, 4371, 6243, 2605, 6244, 6245, 3233, 4889, 3343, 2330, 4266, 6246, 3281, 6247, 21953, 2074, 2244, 2399, 6248, 6249, 4829, 6250, 21954, 6251, 4554, 6252, 6253, 6254, 6255, 4565, 6256, 1688, 2940, 6257, 21955, 2924, 6258, 6259, 6260, 21956, 6261, 6262, 21957, 2184, 5423, 21958, 2024, 21959, 5425, 5424, 21960, 21961, 21962, 21963, 21964, 21965, 21966, 5427, 21967, 21968, 21969, 3743, 21970, 21971, 5426, 2099, 4595, 4690, 4970, 2686, 21972, 21973, 21974, 21975, 5147, 5429, 5428, 21976, 1411, 4186, 21977, 5430, 21978, 2190, 2579, 3130, 3105, 1725, 5431, 21979, 3111, 3305, 2652, 21980, 21981, 4385, 21982, 21983, 21984, 5432, 3793, 21985, 21986, 21987, 21988, 21989, 1564, 21990, 21991, 21992, 5433, 21993, 1997, 4819, 21994, 1784, 21995, 21996, 5434, 4834, 4376, 3450, 21997, 5435, 21998, 21999, 22000, 22001, 22002, 5436, 22003, 5437, 3081, 4094, 4384, 22004, 22005, 22006, 22007, 22008, 22009, 22010, 22011, 22012, 22013, 22014, 22015, 22016, 4770, 3102, 22017, 5438, 22018, 22019, 4016, 22020, 5439, 22021, 4017, 4699, 22022, 22023, 22024, 2245, 22025, 22026, 5440, 1424, 4345, 22027, 22028, 4934, 22029, 22030, 22031, 22032, 22033, 22034, 22035, 22036, 22037, 22038, 4024, 22039, 22040, 22041, 22042, 22043, 22044, 22045, 22046, 5441, 22047, 22048, 6239, 22049, 22050, 3012, 22051, 22052, 8020, 22053, 22054, 8021, 8022, 3338, 22055, 3689, 4578, 22056, 22057, 4476, 4548, 2552, 2300, 22058, 7415, 22059, 22060, 1823, 4725, 8023, 1782, 22061, 22062, 8024, 22063, 22064, 1960, 22065, 22066, 22067, 22068, 22069, 22070, 22071, 22072, 22073, 22074, 8026, 22075, 22076, 22077, 22078, 22079, 22080, 22081, 4773, 7996, 4520, 22082, 22083, 22084, 22085, 7998, 22086, 22087, 22088, 7997, 22089, 22090, 3074, 2968, 22091, 1505, 22092, 22093, 22094, 22095, 4306, 22096, 4489, 8000, 22097, 22098, 4409, 22099, 7999, 4967, 8001, 3220, 22100, 22101, 22102, 2527, 8003, 8002, 22103, 22104, 22105, 3351, 22106, 22107, 3063, 22108, 22109, 22110, 22111, 22112, 3957, 22113, 4351, 22114, 22115, 22116, 22117, 22118, 22119, 22120, 22121, 22122, 22123, 22124, 8004, 22125, 22126, 8005, 22127, 22128, 8006, 22129, 3123, 22130, 22131, 22132, 22133, 22134, 1461, 3472, 22135, 22136, 22137, 22138, 8007, 22139, 22140, 22141, 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22149, 22150, 22151, 22152, 22153, 22154, 22155, 22156, 22157, 3635, 7995, 22158, 22159, 2749, 22160, 22161, 2743, 22162, 1948, 22163, 22164, 2106, 22165, 2850, 3245, 3265, 22166, 22167, 5213, 22168, 22169, 22170, 2240, 22171, 22172, 22173, 22174, 22175, 22176, 22177, 22178, 22179, 2720, 4516, 22180, 1457, 22181, 22182, 22183, 22184, 22185, 8099, 22186, 22187, 22188, 22189, 22190, 22191, 22192, 22193, 8100, 22194, 22195, 22196, 22197, 22198, 4429, 22199, 1425, 22200, 22201, 22202, 8101, 8102, 22203, 8103, 22204, 22205, 22206, 3613, 22207, 22208, 22209, 22210, 22211, 22212, 22213, 2772, 22214, 22215, 8106, 22216, 22217, 22218, 22219, 22220, 22221, 22222, 8105, 22223, 1565, 22224, 8104, 22225, 22226, 8107, 22227, 8108, 22228, 22229, 22230, 22231, 22232, 22233, 22234, 22235, 22236, 22237, 22238, 22239, 22240, 22241, 22242, 22243, 22244, 22245, 22246, 22247, 22248, 22249, 22250, 22251, 22252, 22253, 22254, 22255, 22256, 22257, 22258, 22259, 22260, 22261, 22262, 22263, 22264, 22265, 22266, 22267, 22268, 22269, 22270, 22271, 22272, 22273, 22274, 22275, 22276, 4233, 3710, 22277, 2360, 6697, 6698, 6699, 2759, 22278, 22279, 22280, 22281, 22282, 4689, 22283, 4840, 3815, 22284, 22285, 22286, 22287, 22288, 22289, 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, 22300, 22301, 22302, 22303, 22304, 22305, 22306, 22307, 22308, 22309, 22310, 22311, 22312, 22313, 22314, 22315, 22316, 22317, 22318, 22319, 22320, 22321, 22322, 22323, 22324, 22325, 22326, 22327, 22328, 22329, 22330, 22331, 22332, 22333, 22334, 22335, 22336, 22337, 22338, 22339, 22340, 22341, 22342, 22343, 22344, 22345, 22346, 22347, 22348, 22349, 22350, 22351, 22352, 22353, 22354, 22355, 22356, 22357, 22358, 22359, 22360, 22361, 22362, 22363, 22364, 22365, 22366, 22367, 22368, 22369, 22370, 22371, 22372, 22373, 22374, 22375, 22376, 22377, 22378, 22379, 22380, 22381, 22382, 22383, 22384, 22385, 22386, 22387, 22388, 22389, 22390, 22391, 22392, 22393, 22394, 22395, 22396, 22397, 22398, 22399, 22400, 22401, 22402, 22403, 22404, 22405, 22406, 22407, 22408, 22409, 4624, 1978, 3645, 7611, 4401, 3966, 4492, 6658, 4206, 2298, 2030, 7612, 1477, 3991, 7613, 4797, 3114, 3083, 3513, 2742, 7614, 2590, 22410, 7615, 7616, 22411, 7617, 4640, 3498, 22412, 4174, 7618, 22413, 4716, 2856, 4107, 22414, 7619, 7620, 4564, 2051, 7621, 7622, 1942, 7623, 7624, 22415, 1689, 7625, 7626, 3672, 22416, 22417, 22418, 22419, 22420, 22421, 22422, 22423, 22424, 22425, 22426, 22427, 22428, 22429, 22430, 22431, 22432, 22433, 22434, 22435, 22436, 22437, 22438, 22439, 22440, 22441, 22442, 22443, 22444, 22445, 22446, 22447, 22448, 22449, 22450, 22451, 22452, 22453, 2138, 22454, 22455, 7058, 7059, 7060, 22456, 7061, 22457, 22458, 3491, 7062, 7063, 22459, 22460, 22461, 2108, 3872, 22462, 22463, 22464, 22465, 22466, 22467, 22468, 6133, 8130, 22469, 22470, 22471, 22472, 22473, 22474, 22475, 22476, 22477, 22478, 22479, 22480, 22481, 22482, 22483, 22484, 22485, 22486, 22487, 22488, 22489, 22490, 22491, 22492, 22493, 22494, 22495, 22496, 22497, 22498, 22499, 22500, 22501, 22502, 22503, 22504, 8131, 22505, 22506, 1642, 22507, 22508, 22509, 22510, 22511, 22512, 22513, 22514, 22515, 22516, 22517, 22518, 22519, 22520, 22521, 22522, 22523, 22524, 22525, 22526, 22527, 22528, 22529, 22530, 22531, 22532, 22533, 22534, 22535, 8132, 22536, 22537, 22538, 22539, 22540, 22541, 22542, 22543, 22544, 22545, 22546, 22547, 22548, 22549, 22550, 22551, 22552, 22553, 22554, 22555, 22556, 22557, 22558, 22559, 22560, 22561, 22562, 22563, 22564, 22565, 22566, 22567, 22568, 22569, 22570, 22571, 22572, 8134, 8133, 22573, 22574, 22575, 22576, 22577, 22578, 22579, 22580, 22581, 22582, 22583, 22584, 22585, 6136, 22586, 2539, 22587, 6137, 6138, 6139, 6140, 6141, 6142, 2092, 4696, 2635, 3899, 1508, 3986, 22588, 6143, 2065, 3701, 6144, 22589, 22590, 2671, 22591, 1596, 6145, 22592, 2059, 6146, 3346, 22593, 22594, 6147, 4381, 2316, 6148, 2914, 22595, 6149, 1683, 22596, 6150, 22597, 3090, 6151, 6152, 3189, 6153, 6154, 6155, 3908, 5193, 5332, 4390, 22598, 22599, 22600, 22601, 22602, 22603, 22604, 22605, 22606, 22607, 22608, 7430, 22609, 22610, 5561, 22611, 22612, 22613, 22614, 22615, 22616, 22617, 22618, 22619, 22620, 22621, 22622, 22623, 22624, 22625, 22626, 22627, 22628, 22629, 22630, 22631, 22632, 22633, 22634, 22635, 22636, 22637, 22638, 22639, 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, 22650, 22651, 22652, 22653, 22654, 22655, 22656, 22657, 22658, 22659, 22660, 22661, 22662, 22663, 22664, 22665, 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22674, 22675, 22676, 22677, 22678, 22679, 22680, 22681, 22682, 22683, 22684, 22685, 22686, 22687, 22688, 22689, 22690, 22691, 22692, 22693, 22694, 22695, 22696, 22697, 22698, 22699, 22700, 22701, 22702, 22703, 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, 22714, 22715, 22716, 22717, 22718, 22719, 22720, 22721, 22722, 22723, 22724, 22725, 22726, 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, 22737, 22738, 22739, 22740, 22741, 22742, 22743, 22744, 22745, 22746, 22747, 22748, 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22756, 22757, 22758, 22759, 22760, 22761, 22762, 22763, 22764, 22765, 22766, 22767, 22768, 22769, 22770, 22771, 22772, 22773, 22774, 22775, 22776, 22777, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22786, 22787, 22788, 22789, 22790, 22791, 22792, 22793, 22794, 22795, 22796, 22797, 22798, 22799, 22800, 22801, 22802, 22803, 22804, 22805, 3178, 4799, 4187, 4528, 1750, 3664, 22806, 1618, 3132, 6549, 3880, 6550, 6551, 2777, 6552, 5079, 4188, 6554, 2598, 6553, 6555, 6556, 3179, 22807, 2661, 6557, 3171, 2356, 6558, 22808, 6559, 1741, 4584, 22809, 22810, 2824, 6560, 3556, 6561, 6562, 22811, 22812, 6563, 3490, 6564, 22813, 3766, 6565, 6566, 6567, 6416, 6568, 6569, 3167, 6570, 6571, 5053, 6572, 22814, 6573, 2294, 22815, 22816, 22817, 22818, 22819, 22820, 22821, 8110, 8109, 22822, 22823, 22824, 22825, 8113, 8111, 2350, 22826, 8114, 22827, 8115, 22828, 22829, 22830, 8117, 8116, 8119, 22831, 22832, 8118, 22833, 22834, 22835, 22836, 22837, 8120, 8121, 22838, 22839, 22840, 22841, 8122, 22842, 4019, 22843, 22844, 22845, 22846, 2224, 22847, 22848, 22849, 22850, 22851, 22852, 8135, 22853, 8136, 22854, 22855, 22856, 22857, 8137, 22858, 22859, 22860, 22861, 8139, 22862, 8141, 22863, 8138, 22864, 22865, 22866, 22867, 22868, 22869, 22870, 22871, 22872, 8142, 22873, 8140, 22874, 22875, 22876, 22877, 22878, 22879, 22880, 5130, 22881, 22882, 22883, 22884, 8143, 22885, 22886, 22887, 22888, 22889, 22890, 8144, 22891, 22892, 22893, 8145, 22894, 22895, 22896, 22897, 22898, 22899, 22900, 22901, 22902, 22903, 22904, 8146, 22905, 22906, 22907, 8147, 22908, 22909, 22910, 22911, 22912, 22913, 22914, 22915, 22916, 22917, 22918, 5494, 22919, 22920, 5179, 22921, 22922, 22923, 22924, 22925, 22926, 22927, 22928, 6478, 2332, 22929, 22930, 22931, 22932, 2912, 2517, 8124, 3516, 8123, 22933, 8125, 8127, 8126, 22934, 22935, 22936, 8128, 22937, 4255, 22938, 8129, 22939, 22940, 3296, 22941, 22942, 22943, 22944, 22945, 22946, 22947, 22948, 22949, 22950, 22951, 22952, 22953, 22954, 22955, 22956, 22957, 22958, 22959, 22960, 22961, 22962, 22963, 22964, 22965, 22966, 22967, 22968, 22969, 22970, 22971, 22972, 22973, 22974, 22975, 22976, 22977, 22978, 22979, 22980, 22981, 22982, 22983, 22984, 22985, 22986, 22987, 22988, 22989, 22990, 22991, 22992, 22993, 22994, 22995, 22996, 22997, 22998, 22999, 23000, 23001, 23002, 23003, 23004, 23005, 23006, 23007, 23008, 23009, 23010, 23011, 23012, 23013, 23014, 23015, 23016, 23017, 23018, 23019, 23020, 23021, 23022, 23023, 23024, 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23033, 23034, 23035, 23036, 23037, 23038, 23039, 23040, 23041, 23042, 23043, 23044, 23045, 23046, 23047, 23048, 23049, 23050, 23051, 23052, 23053, 23054, 23055, 23056, 23057, 23058, 23059, 23060, 23061, 23062, 23063, 23064, 23065, 23066, 23067, 23068, 23069, 23070, 23071, 23072, 23073, 23074, 23075, 23076, 23077, 23078, 23079, 23080, 23081, 23082, 23083, 23084, 23085, 23086, 23087, 23088, 23089, 23090, 23091, 23092, 23093, 23094, 23095, 23096, 23097, 23098, 23099, 23100, 23101, 23102, 23103, 23104, 23105, 23106, 23107, 23108, 23109, 23110, 23111, 23112, 23113, 23114, 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, 23125, 23126, 23127, 23128, 23129, 23130, 23131, 23132, 23133, 23134, 23135, 23136, 23137, 23138, 23139, 23140, 23141, 23142, 23143, 23144, 23145, 23146, 23147, 23148, 23149, 23150, 23151, 23152, 23153, 23154, 23155, 23156, 23157, 23158, 23159, 23160, 23161, 23162, 23163, 23164, 23165, 23166, 23167, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, 23186, 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23194, 23195, 23196, 23197, 23198, 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, 23209, 23210, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23218, 23219, 23220, 23221, 23222, 23223, 23224, 23225, 23226, 23227, 23228, 23229, 23230, 23231, 23232, 23233, 23234, 23235, 4766, 23236, 23237, 8036, 23238, 3120, 8037, 23239, 23240, 8038, 8039, 8040, 8041, 23241, 23242, 8043, 23243, 1514, 8044, 23244, 8045, 8046, 8047, 23245, 8048, 8049, 23246, 23247, 23248, 23249, 8050, 8051, 4365, 23250, 8052, 8053, 8054, 8055, 8056, 8057, 2993, 8058, 8059, 8060, 8061, 8062, 23251, 8063, 23252, 8064, 8065, 23253, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 2733, 23254, 8074, 8075, 8076, 8077, 23255, 23256, 23257, 23258, 23259, 3755, 8078, 8079, 8080, 8081, 23260, 23261, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 23262, 23263, 8089, 8090, 8091, 1581, 8092, 8093, 8094, 23264, 23265, 8095, 8096, 3066, 8097, 23266, 23267, 8098, 23268, 23269, 23270, 23271, 23272, 23273, 23274, 23275, 23276, 23277, 23278, 23279, 23280, 23281, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, 23301, 23302, 23303, 23304, 23305, 23306, 23307, 23308, 23309, 23310, 23311, 23312, 23313, 23314, 23315, 23316, 23317, 23318, 23319, 23320, 23321, 23322, 23323, 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, 23344, 23345, 23346, 23347, 23348, 23349, 23350, 23351, 23352, 23353, 23354, 23355, 23356, 23357, 23358, 23359, 23360, 23361, 23362, 23363, 23364, 23365, 23366, 23367, 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23376, 23377, 23378, 23379, 23380, 23381, 23382, 23383, 23384, 23385, 23386, 23387, 23388, 23389, 23390, 23391, 23392, 23393, 23394, 23395, 23396, 23397, 23398, 23399, 23400, 23401, 23402, 23403, 23404, 23405, 23406, 23407, 23408, 23409, 23410, 23411, 23412, 23413, 23414, 23415, 23416, 23417, 23418, 23419, 23420, 23421, 23422, 23423, 23424, 23425, 23426, 23427, 23428, 23429, 23430, 23431, 23432, 23433, 23434, 23435, 23436, 23437, 23438, 23439, 23440, 23441, 23442, 23443, 23444, 23445, 23446, 23447, 23448, 23449, 23450, 23451, 23452, 23453, 23454, 23455, 23456, 23457, 23458, 23459, 23460, 23461, 23462, 23463, 23464, 23465, 23466, 23467, 23468, 23469, 23470, 23471, 23472, 23473, 23474, 23475, 23476, 23477, 23478, 23479, 23480, 23481, 23482, 23483, 23484, 23485, 23486, 23487, 23488, 23489, 23490, 23491, 23492, 23493, 23494, 23495, 23496, 23497, 23498, 23499, 23500, 23501, 23502, 23503, 23504, 23505, 23506, 23507, 23508, 23509, 23510, 23511, 23512, 23513, 23514, 23515, 23516, 23517, 23518, 23519, 23520, 23521, 23522, 23523, 23524, 23525, 23526, 23527, 23528, 23529, 23530, 23531, 23532, 23533, 23534, 23535, 23536, 23537, 23538, 23539, 23540, 23541, 23542, 23543, 23544, 23545, 23546, 23547, 23548, 23549, 23550, 23551, 23552, 23553, 23554, 23555, 23556, 23557, 23558, 23559, 23560, 23561, 23562, 23563, 23564, 23565, 23566, 23567, 23568, 23569, 23570, 23571, 23572, 23573, 23574, 23575, 23576, 23577, 23578, 23579, 23580, 23581, 23582, 23583, 3370, 7440, 2543, 7441, 3284, 23584, 3407, 4538, 23585, 7442, 7443, 7444, 7445, 7446, 4539, 23586, 4587, 23587, 7448, 7447, 4800, 23588, 4185, 7449, 7451, 7450, 7452, 7453, 23589, 23590, 2236, 7454, 2421, 23591, 7455, 7456, 2798, 7457, 2049, 7458, 7459, 7460, 7461, 3686, 7462, 7463, 23592, 7464, 3467, 23593, 7465, 23594, 23595, 23596, 7466, 23597, 7467, 8112, 23598, 7468, 7469, 7470, 23599, 7471, 23600, 23601, 23602, 23603, 7472, 2404, 23604, 7473, 7474, 7475, 7476, 7477, 7478, 7479, 7481, 23605, 23606, 4704, 7480, 23607, 7482, 23608, 23609, 23610, 23611, 23612, 23613, 23614, 23615, 23616, 23617, 7921, 3126, 23618, 23619, 8151, 23620, 23621, 23622, 23623, 8152, 8153, 23624, 23625, 8154, 23626, 23627, 23628, 23629, 23630, 23631, 8155, 3121, 23632, 23633, 23634, 23635, 23636, 23637, 23638, 23639, 23640, 8157, 23641, 8158, 23642, 23643, 23644, 23645, 23646, 23647, 3184, 23648, 23649, 23650, 23651, 23652, 23653, 23654, 23655, 23656, 23657, 23658, 23659, 23660, 7881, 23661, 23662, 23663, 7880, 23664, 23665, 3174, 23666, 8148, 8149, 23667, 23668, 23669, 23670, 23671, 2481, 23672, 23673, 23674, 23675, 5331, 23676, 23677, 23678, 3935, 2985, 7429, 23679, 2407, 23680, 23681, 3584, 23682, 23683, 23684, 3301, 23685, 23686, 8159, 8160, 8161, 23687, 8163, 8162, 23688, 8164, 23689, 23690, 8167, 23691, 8166, 23692, 8165, 8168, 23693, 23694, 23695, 23696, 8169, 23697, 23698, 23699, 23700, 23701, 23702, 23703, 23704, 23705, 7216, 23706, 7217, 7218, 23707, 8017, 23708, 23709, 23710, 23711, 23712, 23713, 23714, 23715, 23716, 23717, 23718, 23719, 8018, 23720, 8019, 1979, 23721, 5199, 23722, 23723, 2291, 23724, 23725, 23726, 5196, 23727, 5562, 23728, 23729, 23730, 23731, 23732, 23733, 3936, 23734, 8170, 23735, 23736, 23737, 23738, 23739, 23740, 23741, 23742, 23743, 8171, 23744, 23745, 8172, 23746, 23747, 23748, 23749, 23750, 23751, 23752, 8174, 23753, 8173, 23754, 1542, 23755, 8175, 8176, 23756, 23757, 23758, 23759, 23760, 8177, 23761, 23762, 23763, 23764, 23765, 23766, 23767, 23768, 23769, 23770, 23771, 3552, 7069, 23772, 23773, 23774, 23775, 23776, 23777, 23778, 23779, 23780, 23781, 23782, 23783, 23784, 23785, 23786, 23787, 23788, 23789, 23790, 23791, 23792, 23793, 23794, 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23803, 23804, 23805, 23806, 23807, 23808, 23809, 23810, 23811, 23812, 23813, 23814, 23815, 23816, 1752, 8008, 23817, 23818, 8009, 3075, 8010, 8011, 8012, 8013, 8014, 8015, 3668, 8016, 23819, 23820, 23821, 23822, 23823, 23824, 23825, 23826, 23827, 23828, 23829, 23830, 3097, 2263, 7215, 23831, 23832, 23833, 2329, 5326, 23834, 23835, 23836, 23837, 23838, 42983, 42984, 42985, 42986, 42987, 42988, 42989, 42990, 42991, 42992, 42993, 42994, 42995, 42996, 42997, 42998, 42999, 43000, 43001, 43002, 43003, 43004, 43005, 43006, 43007, 43008, 43009, 43010, 43011, 43012, 43013, 43014, 43015, 43016, 43017, 43018, 43019, 43020, 43021, 43022, 43023, 43024, 43025, 43026, 43027, 43028, 43029, 43030, 43031, 43032, 43033, 43034, 43035, 43036, 43037, 43038, 43039, 43040, 43041, 43042, 43043, 43044, 43045, 43046, 43047, 43048, 43049, 43050, 43051, 43052, 43053, 43054, 43055, 43056, 43057, 43058, 43059, 43060, 43061, 43062, 43063, 43064, 43065, 43066, 43067, 43068, 43069, 43070, 43071, 43072, // [0x00A4,0x00B7] -v # seg 2 at pos 21024 71, 23976, 23977, 75, 6, 23978, 23979, 23980, 23981, 23982, 23983, 23984, 66, 31, 23985, 23986, 23987, 23988, 23989, 3, // [0x00D7,0x0101] -v # seg 4 at pos 21044 32, 24021, 24022, 24023, 24024, 24025, 24026, 24027, 24028, 661, 659, 24029, 24030, 24031, 24032, 24033, 24034, 665, 663, 683, 24035, 669, 667, 24036, 24037, 24038, 24039, 673, 671, 24040, 24041, 24042, 33, 24043, 677, 675, 24044, 682, 24045, 24046, 24047, 24048, 658, // [0x0113,0x011B] -v # seg 6 at pos 21087 662, 24066, 24067, 24068, 24069, 24070, 24071, 24072, 664, // [0x012C,0x0143] -> [ 24088, 24111] # seg 9 // [0x0144,0x014D] -v # seg 10 at pos 21096 686, 24112, 24113, 24114, 687, 24115, 24116, 24117, 24118, 670, // [0x016C,0x01CD] -> [ 24148, 24245] # seg 13 // [0x01CE,0x01DC] -v # seg 14 at pos 21106 660, 24246, 668, 24247, 672, 24248, 676, 24249, 678, 24250, 679, 24251, 680, 24252, 681, // [0x01FA,0x0250] -> [ 24281, 24367] # seg 17 // [0x0252,0x0260] -> [ 24368, 24382] # seg 19 // [0x0262,0x02C6] -> [ 24383, 24483] # seg 21 // [0x02C7,0x02CB] -v # seg 22 at pos 21121 5, 24484, 4, 15588, 15589, // [0x02DA,0x0390] -> [ 24498, 24680] # seg 25 // [0x03A2,0x03B0] -v # seg 27 at pos 21126 24681, 487, 488, 489, 490, 491, 492, 493, 24682, 24683, 24684, 24685, 24686, 24687, 24688, // [0x03C2,0x03C9] -v # seg 29 at pos 21141 24689, 519, 520, 521, 522, 523, 524, 525, // [0x0401,0x0401] -> [ 570, 570] # seg 31 // [0x0410,0x0415] -> [ 564, 569] # seg 33 // [0x0430,0x0435] -> [ 612, 617] # seg 35 // [0x0450,0x0451] -v # seg 37 at pos 21149 24759, 618, // [0x2010,0x2026] -v # seg 39 at pos 21151 15712, 31862, 31863, 15591, 9, 15592, 11, 31864, 13, 14, 31865, 31866, 15, 16, 31867, 31868, 31869, 31870, 31871, 31872, 31873, 15593, 12, // [0x2030,0x203B] -v # seg 41 at pos 21174 74, 31883, 67, 68, 31884, 15594, 31885, 31886, 31887, 31888, 31889, 88, // [0x20AC,0x20AC] -> [ 160, 160] # seg 43 // [0x2103,0x2109] -v # seg 45 at pos 21186 69, 32088, 15595, 32089, 32090, 32091, 15596, // [0x2116,0x2116] -> [ 76, 76] # seg 47 // [0x2121,0x2121] -> [ 15709, 15709] # seg 49 // [0x2160,0x216B] -> [ 174, 185] # seg 51 // [0x2170,0x2179] -> [ 94, 103] # seg 53 // [0x2190,0x2199] -v # seg 55 at pos 21193 90, 91, 89, 92, 32202, 32203, 15597, 15598, 15599, 15600, // [0x2208,0x223D] -v # seg 57 at pos 21203 41, 32314, 32315, 32316, 32317, 32318, 32319, 38, 32320, 37, 32321, 32322, 32323, 15601, 32324, 32325, 32326, 32327, 43, 32328, 32329, 55, 61, 15602, 46, 32330, 32331, 15603, 32332, 45, 32333, 35, 36, 40, 39, 49, 32334, 32335, 50, 32336, 32337, 32338, 32339, 32340, 63, 62, 34, 42, 32341, 32342, 32343, 32344, 32345, 54, // [0x2248,0x2252] -v # seg 59 at pos 21257 53, 32356, 32357, 32358, 52, 32359, 32360, 32361, 32362, 32363, 15604, // [0x2260,0x226F] -v # seg 61 at pos 21268 56, 51, 32377, 32378, 59, 60, 15605, 15606, 32379, 32380, 32381, 32382, 32383, 32384, 57, 58, // [0x2295,0x2299] -v # seg 63 at pos 21284 15669, 32422, 32423, 32424, 48, // [0x22A5,0x22A5] -> [ 44, 44] # seg 65 // [0x22BF,0x22BF] -> [ 15607, 15607] # seg 67 // [0x2312,0x2312] -> [ 47, 47] # seg 69 // [0x2460,0x2469] -> [ 150, 159] # seg 71 // [0x2474,0x2487] -> [ 130, 149] # seg 73 // [0x249C,0x24FF] -> [ 32886, 32985] # seg 75 // [0x254C,0x254F] -> [ 32986, 32989] # seg 77 // [0x2574,0x2580] -> [ 32990, 33002] # seg 79 // [0x2590,0x2595] -v # seg 81 at pos 21289 33003, 33004, 33005, 15659, 15660, 15661, // [0x25A0,0x25A1] -v # seg 83 at pos 21295 85, 84, // [0x25B2,0x25CF] -v # seg 85 at pos 21297 87, 86, 33032, 33033, 33034, 33035, 33036, 33037, 33038, 33039, 15662, 15663, 33040, 33041, 33042, 33043, 33044, 33045, 33046, 33047, 83, 82, 33048, 33049, 33050, 79, 33051, 33052, 81, 80, // [0x25E2,0x25E5] -> [ 15664, 15667] # seg 87 // [0x2605,0x2609] -v # seg 89 at pos 21327 78, 77, 33102, 33103, 15668, // [0x2640,0x2642] -v # seg 91 at pos 21332 65, 33158, 64, // [0x2E81,0x2E8C] -v # seg 93 at pos 21335 23860, 35269, 35270, 23864, 35271, 35272, 35273, 23867, 35274, 35275, 23868, 23873, // [0x2E97,0x2E97] -> [ 23874, 23874] # seg 95 // [0x2EA7,0x2EBB] -v # seg 97 at pos 21347 23887, 35301, 35302, 23890, 35303, 35304, 35305, 23893, 35306, 35307, 35308, 35309, 23895, 35310, 35311, 23896, 23897, 35312, 35313, 35314, 23901, // [0x2ECA,0x2ECA] -> [ 23911, 23911] # seg 99 // [0x2FF0,0x2FFB] -> [ 15757, 15768] # seg 101 // [0x3020,0x3020] -> [ 35633, 35633] # seg 104 // [0x3021,0x3029] -> [ 15684, 15692] # seg 105 // [0x302A,0x303D] -> [ 35634, 35653] # seg 106 // [0x303E,0x3040] -v # seg 107 at pos 21368 15756, 35654, 35655, // [0x3094,0x30A0] -v # seg 109 at pos 21371 35656, 35657, 35658, 35659, 35660, 35661, 35662, 15717, 15718, 15722, 15723, 35663, 35664, // [0x30F7,0x3104] -v # seg 111 at pos 21384 35665, 35666, 35667, 35668, 35669, 15716, 15719, 15720, 35670, 35671, 35672, 35673, 35674, 35675, // [0x3220,0x3229] -> [ 162, 171] # seg 114 // [0x322A,0x3231] -v # seg 115 at pos 21398 35922, 35923, 35924, 35925, 35926, 35927, 35928, 15710, // [0x32A4,0x338D] -> [ 36042, 36275] # seg 118 // [0x3390,0x339B] -> [ 36276, 36287] # seg 120 // [0x339C,0x33A1] -v # seg 121 at pos 21406 15696, 15697, 15698, 36288, 36289, 15699, // [0x33C5,0x33CD] -> [ 36324, 36332] # seg 124 // [0x33CE,0x33D5] -v # seg 125 at pos 21412 15701, 36333, 36334, 15702, 15703, 36335, 36336, 15704, // [0x3448,0x3472] -> [ 36450, 36492] # seg 128 // [0x3474,0x359D] -> [ 36493, 36790] # seg 130 // [0x359F,0x360D] -> [ 36791, 36901] # seg 132 // [0x360F,0x3619] -> [ 36902, 36912] # seg 134 // [0x361B,0x3917] -> [ 36913, 37677] # seg 136 // [0x3919,0x396D] -> [ 37678, 37762] # seg 138 // [0x396F,0x39CE] -> [ 37763, 37858] # seg 140 // [0x39CF,0x39D0] -v # seg 141 at pos 21420 23878, 23881, // [0x39E0,0x3A72] -> [ 37873, 38019] # seg 144 // [0x3A74,0x3B4D] -> [ 38020, 38237] # seg 146 // [0x3B4F,0x3C6D] -> [ 38238, 38524] # seg 148 // [0x3C6F,0x3CDF] -> [ 38525, 38637] # seg 150 // [0x3CE1,0x4055] -> [ 38638, 39522] # seg 152 // [0x4057,0x415E] -> [ 39523, 39786] # seg 154 // [0x4160,0x4336] -> [ 39787, 40257] # seg 156 // [0x4338,0x43AB] -> [ 40258, 40373] # seg 158 // [0x43AC,0x43B1] -v # seg 159 at pos 21422 23900, 40374, 40375, 40376, 40377, 23899, // [0x43DE,0x44D5] -> [ 40421, 40668] # seg 162 // [0x44D7,0x464B] -> [ 40669, 41041] # seg 164 // [0x464D,0x4660] -> [ 41042, 41061] # seg 166 // [0x4662,0x4722] -> [ 41062, 41254] # seg 168 // [0x4723,0x4729] -v # seg 169 at pos 21428 23907, 41255, 41256, 41257, 41258, 41259, 23908, // [0x477D,0x478C] -> [ 41342, 41357] # seg 172 // [0x478E,0x4946] -> [ 41358, 41798] # seg 174 // [0x4948,0x4979] -> [ 41799, 41848] # seg 176 // [0x497A,0x4986] -v # seg 177 at pos 21435 23913, 41849, 41850, 23914, 41851, 41852, 41853, 41854, 23915, 23916, 41855, 23917, 23918, // [0x499B,0x499F] -v # seg 179 at pos 21448 23920, 41876, 41877, 41878, 23919, // [0x49B6,0x49B7] -v # seg 181 at pos 21453 23922, 23921, // [0x4C78,0x4C9E] -> [ 42604, 42642] # seg 184 // [0x4C9F,0x4CA3] -v # seg 185 at pos 21455 23926, 23927, 23928, 23930, 23925, // [0x4D1A,0x4DAD] -> [ 42754, 42901] # seg 188 // [0x4DAF,0x4DFF] -> [ 42902, 42982] # seg 190 // [0xA000,0xD7FF] -> [ 43073, 57408] # seg 192 // [0xE000,0xE233] -> [ 846, 1409] # seg 194 // [0xE234,0xE4C5] -> [ 8178, 8835] # seg 195 // [0xE4C6,0xE765] -> [ 14916, 15587] # seg 196 // [0xE766,0xE771] -v # seg 197 at pos 21460 104, 105, 106, 107, 108, 109, 57409, 161, 172, 173, 186, 187, // [0xE772,0xE77C] -> [ 365, 375] # seg 198 // [0xE77D,0xE784] -> [ 462, 469] # seg 199 // [0xE785,0xE78C] -> [ 494, 501] # seg 200 // [0xE78D,0xE796] -v # seg 201 at pos 21472 526, 527, 528, 529, 530, 531, 532, 545, 546, 552, // [0xE797,0xE79F] -> [ 555, 563] # seg 202 // [0xE7A0,0xE7AE] -> [ 597, 611] # seg 203 // [0xE7AF,0xE7BB] -> [ 645, 657] # seg 204 // [0xE7BC,0xE7C6] -> [ 15673, 15683] # seg 205 // [0xE7C7,0xE7CC] -v # seg 206 at pos 21482 685, 57410, 690, 691, 692, 693, // [0xE7CD,0xE7E1] -> [ 731, 751] # seg 207 // [0xE7E2,0xE7E6] -v # seg 208 at pos 21488 15708, 15711, 15713, 15714, 15715, // [0xE7E7,0xE7F3] -> [ 57411, 57423] # seg 209 // [0xE7F4,0xE7FD] -> [ 15770, 15779] # seg 210 // [0xE7FE,0xE800] -> [ 752, 754] # seg 211 // [0xE801,0xE80F] -> [ 831, 845] # seg 212 // [0xE810,0xE843] -v # seg 213 at pos 21493 5165, 5166, 5167, 5168, 5169, 57424, 23861, 23862, 23863, 57425, 57426, 57427, 57428, 57429, 23869, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 23877, 57437, 57438, 57439, 57440, 23882, 23883, 57441, 57442, 57443, 57444, 23888, 23889, 57445, 57446, 57447, 57448, 57449, 57450, 57451, 57452, 23898, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 23906, // [0xE844,0xE853] -> [ 57460, 57475] # seg 214 // [0xE854,0xE855] -> [ 23923, 23924] # seg 215 // [0xE856,0xE863] -> [ 57476, 57489] # seg 216 // [0xE864,0xE864] -> [ 23939, 23939] # seg 217 // [0xE865,0xF92B] -> [ 57490, 61784] # seg 218 // [0xF92C,0xF92C] -> [ 23839, 23839] # seg 219 // [0xF92D,0xF978] -> [ 61785, 61860] # seg 220 // [0xF979,0xF979] -> [ 23840, 23840] # seg 221 // [0xF97A,0xF994] -> [ 61861, 61887] # seg 222 // [0xF995,0xF995] -> [ 23841, 23841] # seg 223 // [0xF996,0xF9E6] -> [ 61888, 61968] # seg 224 // [0xF9E7,0xF9E7] -> [ 23842, 23842] # seg 225 // [0xF9E8,0xF9F0] -> [ 61969, 61977] # seg 226 // [0xF9F1,0xF9F1] -> [ 23843, 23843] # seg 227 // [0xF9F2,0xFA0B] -> [ 61978, 62003] # seg 228 // [0xFA0C,0xFA29] -v # seg 229 at pos 21545 23844, 23845, 23846, 23847, 62004, 23848, 62005, 23849, 23850, 62006, 62007, 62008, 23851, 62009, 62010, 62011, 62012, 62013, 62014, 23852, 23853, 23854, 62015, 23855, 23856, 62016, 62017, 23857, 23858, 23859, // [0xFA2A,0xFE2F] -> [ 62018, 63047] # seg 230 // [0xFE30,0xFE48] -v # seg 231 at pos 21575 15705, 551, 63048, 553, 554, 533, 534, 549, 550, 535, 536, 547, 548, 539, 540, 537, 538, 541, 542, 543, 544, 63049, 63050, 63051, 63052, // [0xFE49,0xFE52] -> [ 15724, 15733] # seg 232 // [0xFE53,0xFE58] -v # seg 233 at pos 21600 63053, 15734, 15735, 15736, 15737, 63054, // [0xFE59,0xFE66] -> [ 15738, 15751] # seg 234 // [0xFE67,0xFE6B] -v # seg 235 at pos 21606 63055, 15752, 15753, 15754, 15755, // [0xFE6C,0xFF00] -> [ 63056, 63204] # seg 236 // [0xFF01,0xFF04] -v # seg 237 at pos 21611 188, 189, 190, 70, // [0xFF05,0xFF5D] -> [ 192, 280] # seg 238 // [0xFF5E,0xFF5E] -> [ 10, 10] # seg 239 // [0xFF5F,0xFFDF] -> [ 63205, 63333] # seg 240 // [0xFFE0,0xFFE5] -v # seg 241 at pos 21615 72, 73, 15706, 281, 15707, 191, // [0xFFE6,0xFFFF] -> [ 63334, 63359] # seg 242 }; // Compatibility overlay for GBK and GB2312 const unsigned short CodePageGBK_R[51] = { // hot segments (indexes into segment table) 0, // number of segments 13, // segment table 0x0000, 0x1E3F, 0x1E40, 0x9FB4, 0x9FBC, 0xE7C7, 0xE7C9, 0xE7E7, 0xE7F4, 0xE815, 0xE865, 0xFE10, 0xFE1A, // compressed segments RCHAR, 685, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15756, RCHAR, 23860, RCHAR, 526, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, 0, RCHAR, 8, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x1E3F,0x1E3F] -> [ 685, 685] # seg 1 // [0x9FB4,0x9FBB] -v # seg 3 at pos 0 23869, 23877, 23882, 23883, 23889, 23906, 23923, 23939, // [0xE7C7,0xE7C8] -v # seg 5 at pos 8 685, 688, // [0xE7E7,0xE7F3] -> [ 15756, 15768] # seg 7 // [0xE815,0xE864] -> [ 23860, 23939] # seg 9 // [0xFE10,0xFE19] -> [ 526, 535] # seg 11 }; // Japanese JIS X 0208, plus CP932 compatibility const unsigned short CodePageJISX0208[7939] = { // hot segments (indexes into segment table) 2, 0, 9, // number of segments 20, // segment table 0, 690, 1128, 1148, 1158, 1159, 1182, 1190, 1220, 1410, 7808, 8272, 8634, 8644, 8648, 8836, 10716, 10726, 10736, 11104, // compressed segments RCHAR, RCHAR, 0x2460, 0x2160, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2170, RCHAR, RCHAR, 0xE000, 0x2170, 0x2160, RCHAR, RCHAR, // uncompressed segments 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, 0x1BB0, RCHAR, 0x1BC7, RCHAR, 0x02B2, RCHAR, 0x1BE5, RCHAR, 0x1D4F, RCHAR, RCHAR, RCHAR, RCHAR, 0x1D53, RCHAR, // [ 0, 689] -v # seg 0 at pos 0 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2014, 0x2010, 0xFF0F, 0xFF3C, 0x301C, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0x2212, 0x00B1, 0x00D7, 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, RCHAR, RCHAR, RCHAR, RCHAR, 0x25EF, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, RCHAR, RCHAR, RCHAR, RCHAR, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, // [ 1128, 1147] -> [0x2460,0x2473] # seg 2 // [ 1148, 1157] -> [0x2160,0x2169] # seg 3 // [ 1410, 7807] -v # seg 9 at pos 690 0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E, 0x7897, 0x8155, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B, 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3, 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A, 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870, 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, // [ 1159, 1181] -v # seg 5 at pos 7088 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A, 0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1, // [ 1190, 1219] -v # seg 7 at pos 7111 0x337B, 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6, 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C, 0x2252, 0x2261, 0x222B, 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2235, 0x2229, 0x222A, // [ 8272, 8633] -v # seg 11 at pos 7141 0x7E8A, 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8, 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03, 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040, 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4, 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C, 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586, 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E, 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA, 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA, 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9, 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085, 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E, 0x6600, 0x6615, 0x663B, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657, 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA, 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844, 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B, 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C, 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC, 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C, 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085, 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1, 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9, 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429, 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C, 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E, 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B, 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48, 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E, 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553, 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5, 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6, 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF, 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA, 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210, 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239, 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0, 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28, 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6, 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29, 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751, 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E, 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB, 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, RCHAR, RCHAR, // [ 8634, 8643] -> [0x2170,0x2179] # seg 12 // [ 8644, 8647] -v # seg 13 at pos 7503 0xFFE2, 0xFFE4, 0xFF07, 0xFF02, // [ 8836, 10715] -> [0xE000,0xE757] # seg 15 // [ 10716, 10725] -> [0x2170,0x2179] # seg 16 // [ 10726, 10735] -> [0x2160,0x2169] # seg 17 // [ 10736, 11103] -v # seg 18 at pos 7507 0xFFE2, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121, 0x2235, 0x7E8A, 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8, 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03, 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040, 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4, 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C, 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586, 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E, 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA, 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA, 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9, 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085, 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E, 0x6600, 0x6615, 0x663B, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657, 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA, 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844, 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B, 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C, 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC, 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C, 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085, 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1, 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9, 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429, 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C, 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E, 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B, 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48, 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E, 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553, 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5, 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6, 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF, 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA, 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210, 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239, 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0, 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28, 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6, 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29, 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751, 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E, 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB, 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, }; // Japanese JIS X 0212 const unsigned short CodePageJISX0212[6134] = { // hot segments (indexes into segment table) 1, 23, // number of segments 25, // segment table 0, 108, 119, 127, 130, 168, 175, 534, 562, 597, 608, 610, 645, 656, 658, 752, 768, 784, 800, 846, 933, 940, 1027, 1410, 7211, // compressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0402, 0x040E, RCHAR, 0x0452, 0x045E, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, 0x16A9, RCHAR, 0x16B4, RCHAR, 0x16B7, RCHAR, 0x16BE, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x16DA, RCHAR, 0x16EA, RCHAR, 0x16FA, RCHAR, 0x1751, RCHAR, 0x0000, RCHAR, // [ 597, 607] -> [0x0402,0x040C] # seg 9 // [ 656, 657] -> [0x045E,0x045F] # seg 13 // [ 1410, 7210] -v # seg 23 at pos 0 0x4E02, 0x4E04, 0x4E05, 0x4E0C, 0x4E12, 0x4E1F, 0x4E23, 0x4E24, 0x4E28, 0x4E2B, 0x4E2E, 0x4E2F, 0x4E30, 0x4E35, 0x4E40, 0x4E41, 0x4E44, 0x4E47, 0x4E51, 0x4E5A, 0x4E5C, 0x4E63, 0x4E68, 0x4E69, 0x4E74, 0x4E75, 0x4E79, 0x4E7F, 0x4E8D, 0x4E96, 0x4E97, 0x4E9D, 0x4EAF, 0x4EB9, 0x4EC3, 0x4ED0, 0x4EDA, 0x4EDB, 0x4EE0, 0x4EE1, 0x4EE2, 0x4EE8, 0x4EEF, 0x4EF1, 0x4EF3, 0x4EF5, 0x4EFD, 0x4EFE, 0x4EFF, 0x4F00, 0x4F02, 0x4F03, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F15, 0x4F16, 0x4F17, 0x4F19, 0x4F2E, 0x4F31, 0x4F60, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F40, 0x4F42, 0x4F48, 0x4F49, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F58, 0x4F5F, 0x4F63, 0x4F6A, 0x4F6C, 0x4F6E, 0x4F71, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84, 0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F94, 0x4F97, 0x4F99, 0x4F9A, 0x4F9E, 0x4F9F, 0x4FB2, 0x4FB7, 0x4FB9, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC5, 0x4FC6, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FCF, 0x4FD2, 0x4FDC, 0x4FE0, 0x4FE2, 0x4FF0, 0x4FF2, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5004, 0x5007, 0x500A, 0x500C, 0x500E, 0x5010, 0x5013, 0x5017, 0x5018, 0x501B, 0x501C, 0x501D, 0x501E, 0x5022, 0x5027, 0x502E, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041, 0x5042, 0x5045, 0x5046, 0x504A, 0x504C, 0x504E, 0x5051, 0x5052, 0x5053, 0x5057, 0x5059, 0x505F, 0x5060, 0x5062, 0x5063, 0x5066, 0x5067, 0x506A, 0x506D, 0x5070, 0x5071, 0x503B, 0x5081, 0x5083, 0x5084, 0x5086, 0x508A, 0x508E, 0x508F, 0x5090, 0x5092, 0x5093, 0x5094, 0x5096, 0x509B, 0x509C, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50AA, 0x50AF, 0x50B0, 0x50B9, 0x50BA, 0x50BD, 0x50C0, 0x50C3, 0x50C4, 0x50C7, 0x50CC, 0x50CE, 0x50D0, 0x50D3, 0x50D4, 0x50D8, 0x50DC, 0x50DD, 0x50DF, 0x50E2, 0x50E4, 0x50E6, 0x50E8, 0x50E9, 0x50EF, 0x50F1, 0x50F6, 0x50FA, 0x50FE, 0x5103, 0x5106, 0x5107, 0x5108, 0x510B, 0x510C, 0x510D, 0x510E, 0x50F2, 0x5110, 0x5117, 0x5119, 0x511B, 0x511C, 0x511D, 0x511E, 0x5123, 0x5127, 0x5128, 0x512C, 0x512D, 0x512F, 0x5131, 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514A, 0x514F, 0x5153, 0x5155, 0x5157, 0x5158, 0x515F, 0x5164, 0x5166, 0x517E, 0x5183, 0x5184, 0x518B, 0x518E, 0x5198, 0x519D, 0x51A1, 0x51A3, 0x51AD, 0x51B8, 0x51BA, 0x51BC, 0x51BE, 0x51BF, 0x51C2, 0x51C8, 0x51CF, 0x51D1, 0x51D2, 0x51D3, 0x51D5, 0x51D8, 0x51DE, 0x51E2, 0x51E5, 0x51EE, 0x51F2, 0x51F3, 0x51F4, 0x51F7, 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523C, 0x5245, 0x5249, 0x5255, 0x5257, 0x5258, 0x525A, 0x525C, 0x525F, 0x5260, 0x5261, 0x5266, 0x526E, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528A, 0x528C, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AF, 0x52B0, 0x52B6, 0x52B7, 0x52B8, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6, 0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC, 0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x52EA, 0x52EC, 0x52F0, 0x52F1, 0x52F4, 0x52F6, 0x52F7, 0x5300, 0x5303, 0x530A, 0x530B, 0x530C, 0x5311, 0x5313, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, 0x5330, 0x5332, 0x5335, 0x533C, 0x533D, 0x533E, 0x5342, 0x534C, 0x534B, 0x5359, 0x535B, 0x5361, 0x5363, 0x5365, 0x536C, 0x536D, 0x5372, 0x5379, 0x537E, 0x5383, 0x5387, 0x5388, 0x538E, 0x5393, 0x5394, 0x5399, 0x539D, 0x53A1, 0x53A4, 0x53AA, 0x53AB, 0x53AF, 0x53B2, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53BA, 0x53BD, 0x53C0, 0x53C5, 0x53CF, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DD, 0x53DE, 0x53E0, 0x53E6, 0x53E7, 0x53F5, 0x5402, 0x5413, 0x541A, 0x5421, 0x5427, 0x5428, 0x542A, 0x542F, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444, 0x5447, 0x544D, 0x544F, 0x545E, 0x5462, 0x5464, 0x5466, 0x5467, 0x5469, 0x546B, 0x546D, 0x546E, 0x5474, 0x547F, 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548D, 0x5491, 0x5495, 0x5496, 0x549C, 0x549F, 0x54A1, 0x54A6, 0x54A7, 0x54A9, 0x54AA, 0x54AD, 0x54AE, 0x54B1, 0x54B7, 0x54B9, 0x54BA, 0x54BB, 0x54BF, 0x54C6, 0x54CA, 0x54CD, 0x54CE, 0x54E0, 0x54EA, 0x54EC, 0x54EF, 0x54F6, 0x54FC, 0x54FE, 0x54FF, 0x5500, 0x5501, 0x5505, 0x5508, 0x5509, 0x550C, 0x550D, 0x550E, 0x5515, 0x552A, 0x552B, 0x5532, 0x5535, 0x5536, 0x553B, 0x553C, 0x553D, 0x5541, 0x5547, 0x5549, 0x554A, 0x554D, 0x5550, 0x5551, 0x5558, 0x555A, 0x555B, 0x555E, 0x5560, 0x5561, 0x5564, 0x5566, 0x557F, 0x5581, 0x5582, 0x5586, 0x5588, 0x558E, 0x558F, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597, 0x55A3, 0x55A4, 0x55AD, 0x55B2, 0x55BF, 0x55C1, 0x55C3, 0x55C6, 0x55C9, 0x55CB, 0x55CC, 0x55CE, 0x55D1, 0x55D2, 0x55D3, 0x55D7, 0x55D8, 0x55DB, 0x55DE, 0x55E2, 0x55E9, 0x55F6, 0x55FF, 0x5605, 0x5608, 0x560A, 0x560D, 0x560E, 0x560F, 0x5610, 0x5611, 0x5612, 0x5619, 0x562C, 0x5630, 0x5633, 0x5635, 0x5637, 0x5639, 0x563B, 0x563C, 0x563D, 0x563F, 0x5640, 0x5641, 0x5643, 0x5644, 0x5646, 0x5649, 0x564B, 0x564D, 0x564F, 0x5654, 0x565E, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566D, 0x566F, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568B, 0x568C, 0x5695, 0x5699, 0x569A, 0x569D, 0x569E, 0x569F, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AB, 0x56AC, 0x56AD, 0x56B1, 0x56B3, 0x56B7, 0x56BE, 0x56C5, 0x56C9, 0x56CA, 0x56CB, 0x56CF, 0x56D0, 0x56CC, 0x56CD, 0x56D9, 0x56DC, 0x56DD, 0x56DF, 0x56E1, 0x56E4, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56F1, 0x56EB, 0x56ED, 0x56F6, 0x56F7, 0x5701, 0x5702, 0x5707, 0x570A, 0x570C, 0x5711, 0x5715, 0x571A, 0x571B, 0x571D, 0x5720, 0x5722, 0x5723, 0x5724, 0x5725, 0x5729, 0x572A, 0x572C, 0x572E, 0x572F, 0x5733, 0x5734, 0x573D, 0x573E, 0x573F, 0x5745, 0x5746, 0x574C, 0x574D, 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576B, 0x576D, 0x576E, 0x576F, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577A, 0x577B, 0x577C, 0x577E, 0x5781, 0x5783, 0x578C, 0x5794, 0x5797, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A1, 0x5795, 0x57A7, 0x57A8, 0x57A9, 0x57AC, 0x57B8, 0x57BD, 0x57C7, 0x57C8, 0x57CC, 0x57CF, 0x57D5, 0x57DD, 0x57DE, 0x57E4, 0x57E6, 0x57E7, 0x57E9, 0x57ED, 0x57F0, 0x57F5, 0x57F6, 0x57F8, 0x57FD, 0x57FE, 0x57FF, 0x5803, 0x5804, 0x5808, 0x5809, 0x57E1, 0x580C, 0x580D, 0x581B, 0x581E, 0x581F, 0x5820, 0x5826, 0x5827, 0x582D, 0x5832, 0x5839, 0x583F, 0x5849, 0x584C, 0x584D, 0x584F, 0x5850, 0x5855, 0x585F, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878, 0x587C, 0x587F, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588A, 0x588C, 0x588D, 0x588F, 0x5890, 0x5894, 0x5896, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A6, 0x58A9, 0x58B1, 0x58B2, 0x58C4, 0x58BC, 0x58C2, 0x58C8, 0x58CD, 0x58CE, 0x58D0, 0x58D2, 0x58D4, 0x58D6, 0x58DA, 0x58DD, 0x58E1, 0x58E2, 0x58E9, 0x58F3, 0x5905, 0x5906, 0x590B, 0x590C, 0x5912, 0x5913, 0x5914, 0x8641, 0x591D, 0x5921, 0x5923, 0x5924, 0x5928, 0x592F, 0x5930, 0x5933, 0x5935, 0x5936, 0x593F, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595B, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x596B, 0x596D, 0x596F, 0x5972, 0x5975, 0x5976, 0x5979, 0x597B, 0x597C, 0x598B, 0x598C, 0x598E, 0x5992, 0x5995, 0x5997, 0x599F, 0x59A4, 0x59A7, 0x59AD, 0x59AE, 0x59AF, 0x59B0, 0x59B3, 0x59B7, 0x59BA, 0x59BC, 0x59C1, 0x59C3, 0x59C4, 0x59C8, 0x59CA, 0x59CD, 0x59D2, 0x59DD, 0x59DE, 0x59DF, 0x59E3, 0x59E4, 0x59E7, 0x59EE, 0x59EF, 0x59F1, 0x59F2, 0x59F4, 0x59F7, 0x5A00, 0x5A04, 0x5A0C, 0x5A0D, 0x5A0E, 0x5A12, 0x5A13, 0x5A1E, 0x5A23, 0x5A24, 0x5A27, 0x5A28, 0x5A2A, 0x5A2D, 0x5A30, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4C, 0x5A50, 0x5A55, 0x5A5E, 0x5A63, 0x5A65, 0x5A67, 0x5A6D, 0x5A77, 0x5A7A, 0x5A7B, 0x5A7E, 0x5A8B, 0x5A90, 0x5A93, 0x5A96, 0x5A99, 0x5A9C, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA2, 0x5AA7, 0x5AAC, 0x5AB1, 0x5AB2, 0x5AB3, 0x5AB5, 0x5AB8, 0x5ABA, 0x5ABB, 0x5ABF, 0x5AC4, 0x5AC6, 0x5AC8, 0x5ACF, 0x5ADA, 0x5ADC, 0x5AE0, 0x5AE5, 0x5AEA, 0x5AEE, 0x5AF5, 0x5AF6, 0x5AFD, 0x5B00, 0x5B01, 0x5B08, 0x5B17, 0x5B34, 0x5B19, 0x5B1B, 0x5B1D, 0x5B21, 0x5B25, 0x5B2D, 0x5B38, 0x5B41, 0x5B4B, 0x5B4C, 0x5B52, 0x5B56, 0x5B5E, 0x5B68, 0x5B6E, 0x5B6F, 0x5B7C, 0x5B7D, 0x5B7E, 0x5B7F, 0x5B81, 0x5B84, 0x5B86, 0x5B8A, 0x5B8E, 0x5B90, 0x5B91, 0x5B93, 0x5B94, 0x5B96, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BCD, 0x5BCF, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BE0, 0x5BEF, 0x5BF1, 0x5BF4, 0x5BFD, 0x5C0C, 0x5C17, 0x5C1E, 0x5C1F, 0x5C23, 0x5C26, 0x5C29, 0x5C2B, 0x5C2C, 0x5C2E, 0x5C30, 0x5C32, 0x5C35, 0x5C36, 0x5C59, 0x5C5A, 0x5C5C, 0x5C62, 0x5C63, 0x5C67, 0x5C68, 0x5C69, 0x5C6D, 0x5C70, 0x5C74, 0x5C75, 0x5C7A, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C87, 0x5C88, 0x5C8A, 0x5C8F, 0x5C92, 0x5C9D, 0x5C9F, 0x5CA0, 0x5CA2, 0x5CA3, 0x5CA6, 0x5CAA, 0x5CB2, 0x5CB4, 0x5CB5, 0x5CBA, 0x5CC9, 0x5CCB, 0x5CD2, 0x5CDD, 0x5CD7, 0x5CEE, 0x5CF1, 0x5CF2, 0x5CF4, 0x5D01, 0x5D06, 0x5D0D, 0x5D12, 0x5D2B, 0x5D23, 0x5D24, 0x5D26, 0x5D27, 0x5D31, 0x5D34, 0x5D39, 0x5D3D, 0x5D3F, 0x5D42, 0x5D43, 0x5D46, 0x5D48, 0x5D55, 0x5D51, 0x5D59, 0x5D4A, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D64, 0x5D6A, 0x5D6D, 0x5D70, 0x5D79, 0x5D7A, 0x5D7E, 0x5D7F, 0x5D81, 0x5D83, 0x5D88, 0x5D8A, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D99, 0x5D9B, 0x5D9F, 0x5DA0, 0x5DA7, 0x5DAB, 0x5DB0, 0x5DB4, 0x5DB8, 0x5DB9, 0x5DC3, 0x5DC7, 0x5DCB, 0x5DD0, 0x5DCE, 0x5DD8, 0x5DD9, 0x5DE0, 0x5DE4, 0x5DE9, 0x5DF8, 0x5DF9, 0x5E00, 0x5E07, 0x5E0D, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E1F, 0x5E20, 0x5E2E, 0x5E28, 0x5E32, 0x5E35, 0x5E3E, 0x5E4B, 0x5E50, 0x5E49, 0x5E51, 0x5E56, 0x5E58, 0x5E5B, 0x5E5C, 0x5E5E, 0x5E68, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E70, 0x5E80, 0x5E8B, 0x5E8E, 0x5EA2, 0x5EA4, 0x5EA5, 0x5EA8, 0x5EAA, 0x5EAC, 0x5EB1, 0x5EB3, 0x5EBD, 0x5EBE, 0x5EBF, 0x5EC6, 0x5ECC, 0x5ECB, 0x5ECE, 0x5ED1, 0x5ED2, 0x5ED4, 0x5ED5, 0x5EDC, 0x5EDE, 0x5EE5, 0x5EEB, 0x5F02, 0x5F06, 0x5F07, 0x5F08, 0x5F0E, 0x5F19, 0x5F1C, 0x5F1D, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F34, 0x5F36, 0x5F3B, 0x5F3D, 0x5F3F, 0x5F40, 0x5F44, 0x5F45, 0x5F47, 0x5F4D, 0x5F50, 0x5F54, 0x5F58, 0x5F5B, 0x5F60, 0x5F63, 0x5F64, 0x5F67, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F89, 0x5F8D, 0x5F8F, 0x5F96, 0x5F9C, 0x5F9D, 0x5FA2, 0x5FA7, 0x5FAB, 0x5FA4, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB8, 0x5FC4, 0x5FC7, 0x5FC8, 0x5FC9, 0x5FCB, 0x5FD0, 0x5FD1, 0x5FD2, 0x5FD3, 0x5FD4, 0x5FDE, 0x5FE1, 0x5FE2, 0x5FE8, 0x5FE9, 0x5FEA, 0x5FEC, 0x5FED, 0x5FEE, 0x5FEF, 0x5FF2, 0x5FF3, 0x5FF6, 0x5FFA, 0x5FFC, 0x6007, 0x600A, 0x600D, 0x6013, 0x6014, 0x6017, 0x6018, 0x601A, 0x601F, 0x6024, 0x602D, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048, 0x6049, 0x604C, 0x6051, 0x6054, 0x6056, 0x6057, 0x605D, 0x6061, 0x6067, 0x6071, 0x607E, 0x607F, 0x6082, 0x6086, 0x6088, 0x608A, 0x608E, 0x6091, 0x6093, 0x6095, 0x6098, 0x609D, 0x609E, 0x60A2, 0x60A4, 0x60A5, 0x60A8, 0x60B0, 0x60B1, 0x60B7, 0x60BB, 0x60BE, 0x60C2, 0x60C4, 0x60C8, 0x60C9, 0x60CA, 0x60CB, 0x60CE, 0x60CF, 0x60D4, 0x60D5, 0x60D9, 0x60DB, 0x60DD, 0x60DE, 0x60E2, 0x60E5, 0x60F2, 0x60F5, 0x60F8, 0x60FC, 0x60FD, 0x6102, 0x6107, 0x610A, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6119, 0x611C, 0x611E, 0x6122, 0x612A, 0x612B, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145, 0x6146, 0x6149, 0x615E, 0x6160, 0x616C, 0x6172, 0x6178, 0x617B, 0x617C, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x618B, 0x618D, 0x6192, 0x6193, 0x6197, 0x6198, 0x619C, 0x619D, 0x619F, 0x61A0, 0x61A5, 0x61A8, 0x61AA, 0x61AD, 0x61B8, 0x61B9, 0x61BC, 0x61C0, 0x61C1, 0x61C2, 0x61CE, 0x61CF, 0x61D5, 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E1, 0x61E2, 0x61E7, 0x61E9, 0x61E5, 0x61EC, 0x61ED, 0x61EF, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213, 0x6215, 0x621C, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622B, 0x6239, 0x623D, 0x6242, 0x6243, 0x6244, 0x6246, 0x624C, 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625A, 0x625C, 0x6264, 0x626D, 0x626F, 0x6273, 0x627A, 0x627D, 0x628D, 0x628E, 0x628F, 0x6290, 0x62A6, 0x62A8, 0x62B3, 0x62B6, 0x62B7, 0x62BA, 0x62BE, 0x62BF, 0x62C4, 0x62CE, 0x62D5, 0x62D6, 0x62DA, 0x62EA, 0x62F2, 0x62F4, 0x62FC, 0x62FD, 0x6303, 0x6304, 0x630A, 0x630B, 0x630D, 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632A, 0x632D, 0x6335, 0x6336, 0x6339, 0x633C, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634A, 0x634B, 0x634E, 0x6352, 0x6353, 0x6354, 0x6358, 0x635B, 0x6365, 0x6366, 0x636C, 0x636D, 0x6371, 0x6374, 0x6375, 0x6378, 0x637C, 0x637D, 0x637F, 0x6382, 0x6384, 0x6387, 0x638A, 0x6390, 0x6394, 0x6395, 0x6399, 0x639A, 0x639E, 0x63A4, 0x63A6, 0x63AD, 0x63AE, 0x63AF, 0x63BD, 0x63C1, 0x63C5, 0x63C8, 0x63CE, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63DC, 0x63E0, 0x63E5, 0x63EA, 0x63EC, 0x63F2, 0x63F3, 0x63F5, 0x63F8, 0x63F9, 0x6409, 0x640A, 0x6410, 0x6412, 0x6414, 0x6418, 0x641E, 0x6420, 0x6422, 0x6424, 0x6425, 0x6429, 0x642A, 0x642F, 0x6430, 0x6435, 0x643D, 0x643F, 0x644B, 0x644F, 0x6451, 0x6452, 0x6453, 0x6454, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6463, 0x646D, 0x6473, 0x6474, 0x647B, 0x647D, 0x6485, 0x6487, 0x648F, 0x6490, 0x6491, 0x6498, 0x6499, 0x649B, 0x649D, 0x649F, 0x64A1, 0x64A3, 0x64A6, 0x64A8, 0x64AC, 0x64B3, 0x64BD, 0x64BE, 0x64BF, 0x64C4, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CE, 0x64D0, 0x64D1, 0x64D5, 0x64D7, 0x64E4, 0x64E5, 0x64E9, 0x64EA, 0x64ED, 0x64F0, 0x64F5, 0x64F7, 0x64FB, 0x64FF, 0x6501, 0x6504, 0x6508, 0x6509, 0x650A, 0x650F, 0x6513, 0x6514, 0x6516, 0x6519, 0x651B, 0x651E, 0x651F, 0x6522, 0x6526, 0x6529, 0x652E, 0x6531, 0x653A, 0x653C, 0x653D, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655F, 0x6560, 0x6567, 0x656B, 0x657A, 0x657D, 0x6581, 0x6585, 0x658A, 0x6592, 0x6595, 0x6598, 0x659D, 0x65A0, 0x65A3, 0x65A6, 0x65AE, 0x65B2, 0x65B3, 0x65B4, 0x65BF, 0x65C2, 0x65C8, 0x65C9, 0x65CE, 0x65D0, 0x65D4, 0x65D6, 0x65D8, 0x65DF, 0x65F0, 0x65F2, 0x65F4, 0x65F5, 0x65F9, 0x65FE, 0x65FF, 0x6600, 0x6604, 0x6608, 0x6609, 0x660D, 0x6611, 0x6612, 0x6615, 0x6616, 0x661D, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637, 0x6640, 0x6645, 0x6646, 0x664A, 0x664C, 0x6651, 0x664E, 0x6657, 0x6658, 0x6659, 0x665B, 0x665C, 0x6660, 0x6661, 0x66FB, 0x666A, 0x666B, 0x666C, 0x667E, 0x6673, 0x6675, 0x667F, 0x6677, 0x6678, 0x6679, 0x667B, 0x6680, 0x667C, 0x668B, 0x668C, 0x668D, 0x6690, 0x6692, 0x6699, 0x669A, 0x669B, 0x669C, 0x669F, 0x66A0, 0x66A4, 0x66AD, 0x66B1, 0x66B2, 0x66B5, 0x66BB, 0x66BF, 0x66C0, 0x66C2, 0x66C3, 0x66C8, 0x66CC, 0x66CE, 0x66CF, 0x66D4, 0x66DB, 0x66DF, 0x66E8, 0x66EB, 0x66EC, 0x66EE, 0x66FA, 0x6705, 0x6707, 0x670E, 0x6713, 0x6719, 0x671C, 0x6720, 0x6722, 0x6733, 0x673E, 0x6745, 0x6747, 0x6748, 0x674C, 0x6754, 0x6755, 0x675D, 0x6766, 0x676C, 0x676E, 0x6774, 0x6776, 0x677B, 0x6781, 0x6784, 0x678E, 0x678F, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679B, 0x67B0, 0x67B1, 0x67B2, 0x67B5, 0x67BB, 0x67BC, 0x67BD, 0x67F9, 0x67C0, 0x67C2, 0x67C3, 0x67C5, 0x67C8, 0x67C9, 0x67D2, 0x67D7, 0x67D9, 0x67DC, 0x67E1, 0x67E6, 0x67F0, 0x67F2, 0x67F6, 0x67F7, 0x6852, 0x6814, 0x6819, 0x681D, 0x681F, 0x6828, 0x6827, 0x682C, 0x682D, 0x682F, 0x6830, 0x6831, 0x6833, 0x683B, 0x683F, 0x6844, 0x6845, 0x684A, 0x684C, 0x6855, 0x6857, 0x6858, 0x685B, 0x686B, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687A, 0x687B, 0x687C, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898, 0x689A, 0x689C, 0x68A1, 0x68A3, 0x68A5, 0x68A9, 0x68AA, 0x68AE, 0x68B2, 0x68BB, 0x68C5, 0x68C8, 0x68CC, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D6, 0x68D9, 0x68DC, 0x68DD, 0x68E5, 0x68E8, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68F0, 0x68F1, 0x68F5, 0x68F6, 0x68FB, 0x68FC, 0x68FD, 0x6906, 0x6909, 0x690A, 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938, 0x693B, 0x6942, 0x6945, 0x6949, 0x694E, 0x6957, 0x695B, 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696C, 0x6970, 0x6971, 0x6972, 0x697A, 0x697B, 0x697F, 0x6980, 0x698D, 0x6992, 0x6996, 0x6998, 0x69A1, 0x69A5, 0x69A6, 0x69A8, 0x69AB, 0x69AD, 0x69AF, 0x69B7, 0x69B8, 0x69BA, 0x69BC, 0x69C5, 0x69C8, 0x69D1, 0x69D6, 0x69D7, 0x69E2, 0x69E5, 0x69EE, 0x69EF, 0x69F1, 0x69F3, 0x69F5, 0x69FE, 0x6A00, 0x6A01, 0x6A03, 0x6A0F, 0x6A11, 0x6A15, 0x6A1A, 0x6A1D, 0x6A20, 0x6A24, 0x6A28, 0x6A30, 0x6A32, 0x6A34, 0x6A37, 0x6A3B, 0x6A3E, 0x6A3F, 0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4E, 0x6A50, 0x6A51, 0x6A52, 0x6A55, 0x6A56, 0x6A5B, 0x6A64, 0x6A67, 0x6A6A, 0x6A71, 0x6A73, 0x6A7E, 0x6A81, 0x6A83, 0x6A86, 0x6A87, 0x6A89, 0x6A8B, 0x6A91, 0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA5, 0x6AAB, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB4, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC6, 0x6AC9, 0x6AC8, 0x6ACC, 0x6AD0, 0x6AD4, 0x6AD5, 0x6AD6, 0x6ADC, 0x6ADD, 0x6AE4, 0x6AE7, 0x6AEC, 0x6AF0, 0x6AF1, 0x6AF2, 0x6AFC, 0x6AFD, 0x6B02, 0x6B03, 0x6B06, 0x6B07, 0x6B09, 0x6B0F, 0x6B10, 0x6B11, 0x6B17, 0x6B1B, 0x6B1E, 0x6B24, 0x6B28, 0x6B2B, 0x6B2C, 0x6B2F, 0x6B35, 0x6B36, 0x6B3B, 0x6B3F, 0x6B46, 0x6B4A, 0x6B4D, 0x6B52, 0x6B56, 0x6B58, 0x6B5D, 0x6B60, 0x6B67, 0x6B6B, 0x6B6E, 0x6B70, 0x6B75, 0x6B7D, 0x6B7E, 0x6B82, 0x6B85, 0x6B97, 0x6B9B, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BB0, 0x6BB8, 0x6BB9, 0x6BBD, 0x6BBE, 0x6BC3, 0x6BC4, 0x6BC9, 0x6BCC, 0x6BD6, 0x6BDA, 0x6BE1, 0x6BE3, 0x6BE6, 0x6BE7, 0x6BEE, 0x6BF1, 0x6BF7, 0x6BF9, 0x6BFF, 0x6C02, 0x6C04, 0x6C05, 0x6C09, 0x6C0D, 0x6C0E, 0x6C10, 0x6C12, 0x6C19, 0x6C1F, 0x6C26, 0x6C27, 0x6C28, 0x6C2C, 0x6C2E, 0x6C33, 0x6C35, 0x6C36, 0x6C3A, 0x6C3B, 0x6C3F, 0x6C4A, 0x6C4B, 0x6C4D, 0x6C4F, 0x6C52, 0x6C54, 0x6C59, 0x6C5B, 0x6C5C, 0x6C6B, 0x6C6D, 0x6C6F, 0x6C74, 0x6C76, 0x6C78, 0x6C79, 0x6C7B, 0x6C85, 0x6C86, 0x6C87, 0x6C89, 0x6C94, 0x6C95, 0x6C97, 0x6C98, 0x6C9C, 0x6C9F, 0x6CB0, 0x6CB2, 0x6CB4, 0x6CC2, 0x6CC6, 0x6CCD, 0x6CCF, 0x6CD0, 0x6CD1, 0x6CD2, 0x6CD4, 0x6CD6, 0x6CDA, 0x6CDC, 0x6CE0, 0x6CE7, 0x6CE9, 0x6CEB, 0x6CEC, 0x6CEE, 0x6CF2, 0x6CF4, 0x6D04, 0x6D07, 0x6D0A, 0x6D0E, 0x6D0F, 0x6D11, 0x6D13, 0x6D1A, 0x6D26, 0x6D27, 0x6D28, 0x6C67, 0x6D2E, 0x6D2F, 0x6D31, 0x6D39, 0x6D3C, 0x6D3F, 0x6D57, 0x6D5E, 0x6D5F, 0x6D61, 0x6D65, 0x6D67, 0x6D6F, 0x6D70, 0x6D7C, 0x6D82, 0x6D87, 0x6D91, 0x6D92, 0x6D94, 0x6D96, 0x6D97, 0x6D98, 0x6DAA, 0x6DAC, 0x6DB4, 0x6DB7, 0x6DB9, 0x6DBD, 0x6DBF, 0x6DC4, 0x6DC8, 0x6DCA, 0x6DCE, 0x6DCF, 0x6DD6, 0x6DDB, 0x6DDD, 0x6DDF, 0x6DE0, 0x6DE2, 0x6DE5, 0x6DE9, 0x6DEF, 0x6DF0, 0x6DF4, 0x6DF6, 0x6DFC, 0x6E00, 0x6E04, 0x6E1E, 0x6E22, 0x6E27, 0x6E32, 0x6E36, 0x6E39, 0x6E3B, 0x6E3C, 0x6E44, 0x6E45, 0x6E48, 0x6E49, 0x6E4B, 0x6E4F, 0x6E51, 0x6E52, 0x6E53, 0x6E54, 0x6E57, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E62, 0x6E63, 0x6E68, 0x6E73, 0x6E7B, 0x6E7D, 0x6E8D, 0x6E93, 0x6E99, 0x6EA0, 0x6EA7, 0x6EAD, 0x6EAE, 0x6EB1, 0x6EB3, 0x6EBB, 0x6EBF, 0x6EC0, 0x6EC1, 0x6EC3, 0x6EC7, 0x6EC8, 0x6ECA, 0x6ECD, 0x6ECE, 0x6ECF, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF9, 0x6EFB, 0x6EFD, 0x6F04, 0x6F08, 0x6F0A, 0x6F0C, 0x6F0D, 0x6F16, 0x6F18, 0x6F1A, 0x6F1B, 0x6F26, 0x6F29, 0x6F2A, 0x6F2F, 0x6F30, 0x6F33, 0x6F36, 0x6F3B, 0x6F3C, 0x6F2D, 0x6F4F, 0x6F51, 0x6F52, 0x6F53, 0x6F57, 0x6F59, 0x6F5A, 0x6F5D, 0x6F5E, 0x6F61, 0x6F62, 0x6F68, 0x6F6C, 0x6F7D, 0x6F7E, 0x6F83, 0x6F87, 0x6F88, 0x6F8B, 0x6F8C, 0x6F8D, 0x6F90, 0x6F92, 0x6F93, 0x6F94, 0x6F96, 0x6F9A, 0x6F9F, 0x6FA0, 0x6FA5, 0x6FA6, 0x6FA7, 0x6FA8, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB5, 0x6FB6, 0x6FBC, 0x6FC5, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FDA, 0x6FDE, 0x6FE8, 0x6FE9, 0x6FF0, 0x6FF5, 0x6FF9, 0x6FFC, 0x6FFD, 0x7000, 0x7005, 0x7006, 0x7007, 0x700D, 0x7017, 0x7020, 0x7023, 0x702F, 0x7034, 0x7037, 0x7039, 0x703C, 0x7043, 0x7044, 0x7048, 0x7049, 0x704A, 0x704B, 0x7054, 0x7055, 0x705D, 0x705E, 0x704E, 0x7064, 0x7065, 0x706C, 0x706E, 0x7075, 0x7076, 0x707E, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x709B, 0x70A4, 0x70AB, 0x70B0, 0x70B1, 0x70B4, 0x70B7, 0x70CA, 0x70D1, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D8, 0x70DC, 0x70E4, 0x70FA, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710B, 0x710C, 0x710F, 0x711E, 0x7120, 0x712B, 0x712D, 0x712F, 0x7130, 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714A, 0x714B, 0x7150, 0x7152, 0x7157, 0x715A, 0x715C, 0x715E, 0x7160, 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718C, 0x7192, 0x719A, 0x719B, 0x71A0, 0x71A2, 0x71AF, 0x71B0, 0x71B2, 0x71B3, 0x71BA, 0x71BF, 0x71C0, 0x71C1, 0x71C4, 0x71CB, 0x71CC, 0x71D3, 0x71D6, 0x71D9, 0x71DA, 0x71DC, 0x71F8, 0x71FE, 0x7200, 0x7207, 0x7208, 0x7209, 0x7213, 0x7217, 0x721A, 0x721D, 0x721F, 0x7224, 0x722B, 0x722F, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245, 0x724E, 0x724F, 0x7250, 0x7253, 0x7255, 0x7256, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7268, 0x726B, 0x726E, 0x726F, 0x7271, 0x7277, 0x7278, 0x727B, 0x727C, 0x727F, 0x7284, 0x7289, 0x728D, 0x728E, 0x7293, 0x729B, 0x72A8, 0x72AD, 0x72AE, 0x72B1, 0x72B4, 0x72BE, 0x72C1, 0x72C7, 0x72C9, 0x72CC, 0x72D5, 0x72D6, 0x72D8, 0x72DF, 0x72E5, 0x72F3, 0x72F4, 0x72FA, 0x72FB, 0x72FE, 0x7302, 0x7304, 0x7305, 0x7307, 0x730B, 0x730D, 0x7312, 0x7313, 0x7318, 0x7319, 0x731E, 0x7322, 0x7324, 0x7327, 0x7328, 0x732C, 0x7331, 0x7332, 0x7335, 0x733A, 0x733B, 0x733D, 0x7343, 0x734D, 0x7350, 0x7352, 0x7356, 0x7358, 0x735D, 0x735E, 0x735F, 0x7360, 0x7366, 0x7367, 0x7369, 0x736B, 0x736C, 0x736E, 0x736F, 0x7371, 0x7377, 0x7379, 0x737C, 0x7380, 0x7381, 0x7383, 0x7385, 0x7386, 0x738E, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739C, 0x739E, 0x739F, 0x73A0, 0x73A2, 0x73A5, 0x73A6, 0x73AA, 0x73AB, 0x73AD, 0x73B5, 0x73B7, 0x73B9, 0x73BC, 0x73BD, 0x73BF, 0x73C5, 0x73C6, 0x73C9, 0x73CB, 0x73CC, 0x73CF, 0x73D2, 0x73D3, 0x73D6, 0x73D9, 0x73DD, 0x73E1, 0x73E3, 0x73E6, 0x73E7, 0x73E9, 0x73F4, 0x73F5, 0x73F7, 0x73F9, 0x73FA, 0x73FB, 0x73FD, 0x73FF, 0x7400, 0x7401, 0x7404, 0x7407, 0x740A, 0x7411, 0x741A, 0x741B, 0x7424, 0x7426, 0x7428, 0x7429, 0x742A, 0x742B, 0x742C, 0x742D, 0x742E, 0x742F, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443, 0x7444, 0x7446, 0x7447, 0x744B, 0x744D, 0x7451, 0x7452, 0x7457, 0x745D, 0x7462, 0x7466, 0x7467, 0x7468, 0x746B, 0x746D, 0x746E, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489, 0x748F, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749A, 0x749C, 0x749F, 0x74A0, 0x74A1, 0x74A3, 0x74A6, 0x74A8, 0x74A9, 0x74AA, 0x74AB, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B5, 0x74B9, 0x74BB, 0x74BF, 0x74C8, 0x74C9, 0x74CC, 0x74D0, 0x74D3, 0x74D8, 0x74DA, 0x74DB, 0x74DE, 0x74DF, 0x74E4, 0x74E8, 0x74EA, 0x74EB, 0x74EF, 0x74F4, 0x74FA, 0x74FB, 0x74FC, 0x74FF, 0x7506, 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529, 0x752A, 0x752F, 0x7536, 0x7539, 0x753D, 0x753E, 0x753F, 0x7540, 0x7543, 0x7547, 0x7548, 0x754E, 0x7550, 0x7552, 0x7557, 0x755E, 0x755F, 0x7561, 0x756F, 0x7571, 0x7579, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595, 0x7599, 0x759C, 0x75A2, 0x75A4, 0x75B4, 0x75BA, 0x75BF, 0x75C0, 0x75C1, 0x75C4, 0x75C6, 0x75CC, 0x75CE, 0x75CF, 0x75D7, 0x75DC, 0x75DF, 0x75E0, 0x75E1, 0x75E4, 0x75E7, 0x75EC, 0x75EE, 0x75EF, 0x75F1, 0x75F9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608, 0x760A, 0x760C, 0x760F, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619, 0x761B, 0x761C, 0x761D, 0x761E, 0x7623, 0x7625, 0x7626, 0x7629, 0x762D, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639, 0x763A, 0x763C, 0x764A, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645, 0x7649, 0x764B, 0x7655, 0x7659, 0x765F, 0x7664, 0x7665, 0x766D, 0x766E, 0x766F, 0x7671, 0x7674, 0x7681, 0x7685, 0x768C, 0x768D, 0x7695, 0x769B, 0x769C, 0x769D, 0x769F, 0x76A0, 0x76A2, 0x76A3, 0x76A4, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76AA, 0x76AD, 0x76BD, 0x76C1, 0x76C5, 0x76C9, 0x76CB, 0x76CC, 0x76CE, 0x76D4, 0x76D9, 0x76E0, 0x76E6, 0x76E8, 0x76EC, 0x76F0, 0x76F1, 0x76F6, 0x76F9, 0x76FC, 0x7700, 0x7706, 0x770A, 0x770E, 0x7712, 0x7714, 0x7715, 0x7717, 0x7719, 0x771A, 0x771C, 0x7722, 0x7728, 0x772D, 0x772E, 0x772F, 0x7734, 0x7735, 0x7736, 0x7739, 0x773D, 0x773E, 0x7742, 0x7745, 0x7746, 0x774A, 0x774D, 0x774E, 0x774F, 0x7752, 0x7756, 0x7757, 0x775C, 0x775E, 0x775F, 0x7760, 0x7762, 0x7764, 0x7767, 0x776A, 0x776C, 0x7770, 0x7772, 0x7773, 0x7774, 0x777A, 0x777D, 0x7780, 0x7784, 0x778C, 0x778D, 0x7794, 0x7795, 0x7796, 0x779A, 0x779F, 0x77A2, 0x77A7, 0x77AA, 0x77AE, 0x77AF, 0x77B1, 0x77B5, 0x77BE, 0x77C3, 0x77C9, 0x77D1, 0x77D2, 0x77D5, 0x77D9, 0x77DE, 0x77DF, 0x77E0, 0x77E4, 0x77E6, 0x77EA, 0x77EC, 0x77F0, 0x77F1, 0x77F4, 0x77F8, 0x77FB, 0x7805, 0x7806, 0x7809, 0x780D, 0x780E, 0x7811, 0x781D, 0x7821, 0x7822, 0x7823, 0x782D, 0x782E, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848, 0x784C, 0x784E, 0x7852, 0x785C, 0x785E, 0x7860, 0x7861, 0x7863, 0x7864, 0x7868, 0x786A, 0x786E, 0x787A, 0x787E, 0x788A, 0x788F, 0x7894, 0x7898, 0x78A1, 0x789D, 0x789E, 0x789F, 0x78A4, 0x78A8, 0x78AC, 0x78AD, 0x78B0, 0x78B1, 0x78B2, 0x78B3, 0x78BB, 0x78BD, 0x78BF, 0x78C7, 0x78C8, 0x78C9, 0x78CC, 0x78CE, 0x78D2, 0x78D3, 0x78D5, 0x78D6, 0x78E4, 0x78DB, 0x78DF, 0x78E0, 0x78E1, 0x78E6, 0x78EA, 0x78F2, 0x78F3, 0x7900, 0x78F6, 0x78F7, 0x78FA, 0x78FB, 0x78FF, 0x7906, 0x790C, 0x7910, 0x791A, 0x791C, 0x791E, 0x791F, 0x7920, 0x7925, 0x7927, 0x7929, 0x792D, 0x7931, 0x7934, 0x7935, 0x793B, 0x793D, 0x793F, 0x7944, 0x7945, 0x7946, 0x794A, 0x794B, 0x794F, 0x7951, 0x7954, 0x7958, 0x795B, 0x795C, 0x7967, 0x7969, 0x796B, 0x7972, 0x7979, 0x797B, 0x797C, 0x797E, 0x798B, 0x798C, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998, 0x799B, 0x799C, 0x79A1, 0x79A8, 0x79A9, 0x79AB, 0x79AF, 0x79B1, 0x79B4, 0x79B8, 0x79BB, 0x79C2, 0x79C4, 0x79C7, 0x79C8, 0x79CA, 0x79CF, 0x79D4, 0x79D6, 0x79DA, 0x79DD, 0x79DE, 0x79E0, 0x79E2, 0x79E5, 0x79EA, 0x79EB, 0x79ED, 0x79F1, 0x79F8, 0x79FC, 0x7A02, 0x7A03, 0x7A07, 0x7A09, 0x7A0A, 0x7A0C, 0x7A11, 0x7A15, 0x7A1B, 0x7A1E, 0x7A21, 0x7A27, 0x7A2B, 0x7A2D, 0x7A2F, 0x7A30, 0x7A34, 0x7A35, 0x7A38, 0x7A39, 0x7A3A, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A4C, 0x7A55, 0x7A56, 0x7A59, 0x7A5C, 0x7A5D, 0x7A5F, 0x7A60, 0x7A65, 0x7A67, 0x7A6A, 0x7A6D, 0x7A75, 0x7A78, 0x7A7E, 0x7A80, 0x7A82, 0x7A85, 0x7A86, 0x7A8A, 0x7A8B, 0x7A90, 0x7A91, 0x7A94, 0x7A9E, 0x7AA0, 0x7AA3, 0x7AAC, 0x7AB3, 0x7AB5, 0x7AB9, 0x7ABB, 0x7ABC, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACE, 0x7AD1, 0x7ADB, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AF1, 0x7AF4, 0x7AFB, 0x7AFD, 0x7AFE, 0x7B07, 0x7B14, 0x7B1F, 0x7B23, 0x7B27, 0x7B29, 0x7B2A, 0x7B2B, 0x7B2D, 0x7B2E, 0x7B2F, 0x7B30, 0x7B31, 0x7B34, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B47, 0x7B4E, 0x7B55, 0x7B60, 0x7B64, 0x7B66, 0x7B69, 0x7B6A, 0x7B6D, 0x7B6F, 0x7B72, 0x7B73, 0x7B77, 0x7B84, 0x7B89, 0x7B8E, 0x7B90, 0x7B91, 0x7B96, 0x7B9B, 0x7B9E, 0x7BA0, 0x7BA5, 0x7BAC, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB5, 0x7BB6, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BC2, 0x7BC5, 0x7BC8, 0x7BCA, 0x7BD4, 0x7BD6, 0x7BD7, 0x7BD9, 0x7BDA, 0x7BDB, 0x7BE8, 0x7BEA, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFC, 0x7BFE, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C06, 0x7C09, 0x7C0B, 0x7C0C, 0x7C0E, 0x7C0F, 0x7C19, 0x7C1B, 0x7C20, 0x7C25, 0x7C26, 0x7C28, 0x7C2C, 0x7C31, 0x7C33, 0x7C34, 0x7C36, 0x7C39, 0x7C3A, 0x7C46, 0x7C4A, 0x7C55, 0x7C51, 0x7C52, 0x7C53, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, 0x7C61, 0x7C63, 0x7C67, 0x7C69, 0x7C6D, 0x7C6E, 0x7C70, 0x7C72, 0x7C79, 0x7C7C, 0x7C7D, 0x7C86, 0x7C87, 0x7C8F, 0x7C94, 0x7C9E, 0x7CA0, 0x7CA6, 0x7CB0, 0x7CB6, 0x7CB7, 0x7CBA, 0x7CBB, 0x7CBC, 0x7CBF, 0x7CC4, 0x7CC7, 0x7CC8, 0x7CC9, 0x7CCD, 0x7CCF, 0x7CD3, 0x7CD4, 0x7CD5, 0x7CD7, 0x7CD9, 0x7CDA, 0x7CDD, 0x7CE6, 0x7CE9, 0x7CEB, 0x7CF5, 0x7D03, 0x7D07, 0x7D08, 0x7D09, 0x7D0F, 0x7D11, 0x7D12, 0x7D13, 0x7D16, 0x7D1D, 0x7D1E, 0x7D23, 0x7D26, 0x7D2A, 0x7D2D, 0x7D31, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D40, 0x7D41, 0x7D47, 0x7D48, 0x7D4D, 0x7D51, 0x7D53, 0x7D57, 0x7D59, 0x7D5A, 0x7D5C, 0x7D5D, 0x7D65, 0x7D67, 0x7D6A, 0x7D70, 0x7D78, 0x7D7A, 0x7D7B, 0x7D7F, 0x7D81, 0x7D82, 0x7D83, 0x7D85, 0x7D86, 0x7D88, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D91, 0x7D96, 0x7D97, 0x7D9D, 0x7D9E, 0x7DA6, 0x7DA7, 0x7DAA, 0x7DB3, 0x7DB6, 0x7DB7, 0x7DB9, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DD7, 0x7DD9, 0x7E00, 0x7DE2, 0x7DE5, 0x7DE6, 0x7DEA, 0x7DEB, 0x7DED, 0x7DF1, 0x7DF5, 0x7DF6, 0x7DF9, 0x7DFA, 0x7E08, 0x7E10, 0x7E11, 0x7E15, 0x7E17, 0x7E1C, 0x7E1D, 0x7E20, 0x7E27, 0x7E28, 0x7E2C, 0x7E2D, 0x7E2F, 0x7E33, 0x7E36, 0x7E3F, 0x7E44, 0x7E45, 0x7E47, 0x7E4E, 0x7E50, 0x7E52, 0x7E58, 0x7E5F, 0x7E61, 0x7E62, 0x7E65, 0x7E6B, 0x7E6E, 0x7E6F, 0x7E73, 0x7E78, 0x7E7E, 0x7E81, 0x7E86, 0x7E87, 0x7E8A, 0x7E8D, 0x7E91, 0x7E95, 0x7E98, 0x7E9A, 0x7E9D, 0x7E9E, 0x7F3C, 0x7F3B, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F43, 0x7F44, 0x7F47, 0x7F4F, 0x7F52, 0x7F53, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F61, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F6D, 0x7F71, 0x7F7D, 0x7F7E, 0x7F7F, 0x7F80, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F96, 0x7F97, 0x7F9C, 0x7FA1, 0x7FA2, 0x7FA6, 0x7FAA, 0x7FAD, 0x7FB4, 0x7FBC, 0x7FBF, 0x7FC0, 0x7FC3, 0x7FC8, 0x7FCE, 0x7FCF, 0x7FDB, 0x7FDF, 0x7FE3, 0x7FE5, 0x7FE8, 0x7FEC, 0x7FEE, 0x7FEF, 0x7FF2, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8007, 0x8008, 0x800A, 0x800D, 0x800E, 0x800F, 0x8011, 0x8013, 0x8014, 0x8016, 0x801D, 0x801E, 0x801F, 0x8020, 0x8024, 0x8026, 0x802C, 0x802E, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806D, 0x8071, 0x8075, 0x8081, 0x8088, 0x808E, 0x809C, 0x809E, 0x80A6, 0x80A7, 0x80AB, 0x80B8, 0x80B9, 0x80C8, 0x80CD, 0x80CF, 0x80D2, 0x80D4, 0x80D5, 0x80D7, 0x80D8, 0x80E0, 0x80ED, 0x80EE, 0x80F0, 0x80F2, 0x80F3, 0x80F6, 0x80F9, 0x80FA, 0x80FE, 0x8103, 0x810B, 0x8116, 0x8117, 0x8118, 0x811C, 0x811E, 0x8120, 0x8124, 0x8127, 0x812C, 0x8130, 0x8135, 0x813A, 0x813C, 0x8145, 0x8147, 0x814A, 0x814C, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168, 0x8169, 0x816D, 0x816F, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185, 0x8186, 0x818B, 0x818E, 0x8196, 0x8198, 0x819B, 0x819E, 0x81A2, 0x81AE, 0x81B2, 0x81B4, 0x81BB, 0x81CB, 0x81C3, 0x81C5, 0x81CA, 0x81CE, 0x81CF, 0x81D5, 0x81D7, 0x81DB, 0x81DD, 0x81DE, 0x81E1, 0x81E4, 0x81EB, 0x81EC, 0x81F0, 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8200, 0x8203, 0x820F, 0x8213, 0x8214, 0x8219, 0x821A, 0x821D, 0x8221, 0x8222, 0x8228, 0x8232, 0x8234, 0x823A, 0x8243, 0x8244, 0x8245, 0x8246, 0x824B, 0x824E, 0x824F, 0x8251, 0x8256, 0x825C, 0x8260, 0x8263, 0x8267, 0x826D, 0x8274, 0x827B, 0x827D, 0x827F, 0x8280, 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828A, 0x828E, 0x8291, 0x8294, 0x8296, 0x8298, 0x829A, 0x829B, 0x82A0, 0x82A1, 0x82A3, 0x82A4, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AE, 0x82B0, 0x82B2, 0x82B4, 0x82B7, 0x82BA, 0x82BC, 0x82BE, 0x82BF, 0x82C6, 0x82D0, 0x82D5, 0x82DA, 0x82E0, 0x82E2, 0x82E4, 0x82E8, 0x82EA, 0x82ED, 0x82EF, 0x82F6, 0x82F7, 0x82FD, 0x82FE, 0x8300, 0x8301, 0x8307, 0x8308, 0x830A, 0x830B, 0x8354, 0x831B, 0x831D, 0x831E, 0x831F, 0x8321, 0x8322, 0x832C, 0x832D, 0x832E, 0x8330, 0x8333, 0x8337, 0x833A, 0x833C, 0x833D, 0x8342, 0x8343, 0x8344, 0x8347, 0x834D, 0x834E, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378, 0x837D, 0x837F, 0x8380, 0x8382, 0x8384, 0x8386, 0x838D, 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839B, 0x839C, 0x839D, 0x83A6, 0x83A7, 0x83A9, 0x83AC, 0x83BE, 0x83BF, 0x83C0, 0x83C7, 0x83C9, 0x83CF, 0x83D0, 0x83D1, 0x83D4, 0x83DD, 0x8353, 0x83E8, 0x83EA, 0x83F6, 0x83F8, 0x83F9, 0x83FC, 0x8401, 0x8406, 0x840A, 0x840F, 0x8411, 0x8415, 0x8419, 0x83AD, 0x842F, 0x8439, 0x8445, 0x8447, 0x8448, 0x844A, 0x844D, 0x844F, 0x8451, 0x8452, 0x8456, 0x8458, 0x8459, 0x845A, 0x845C, 0x8460, 0x8464, 0x8465, 0x8467, 0x846A, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847C, 0x847D, 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849E, 0x84A6, 0x84A8, 0x84A9, 0x84AA, 0x84AF, 0x84B1, 0x84B4, 0x84BA, 0x84BD, 0x84BE, 0x84C0, 0x84C2, 0x84C7, 0x84C8, 0x84CC, 0x84CF, 0x84D3, 0x84DC, 0x84E7, 0x84EA, 0x84EF, 0x84F0, 0x84F1, 0x84F2, 0x84F7, 0x8532, 0x84FA, 0x84FB, 0x84FD, 0x8502, 0x8503, 0x8507, 0x850C, 0x850E, 0x8510, 0x851C, 0x851E, 0x8522, 0x8523, 0x8524, 0x8525, 0x8527, 0x852A, 0x852B, 0x852F, 0x8533, 0x8534, 0x8536, 0x853F, 0x8546, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8564, 0x856B, 0x856F, 0x8579, 0x857A, 0x857B, 0x857D, 0x857F, 0x8581, 0x8585, 0x8586, 0x8589, 0x858B, 0x858C, 0x858F, 0x8593, 0x8598, 0x859D, 0x859F, 0x85A0, 0x85A2, 0x85A5, 0x85A7, 0x85B4, 0x85B6, 0x85B7, 0x85B8, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C2, 0x85C7, 0x85CA, 0x85CB, 0x85CE, 0x85AD, 0x85D8, 0x85DA, 0x85DF, 0x85E0, 0x85E6, 0x85E8, 0x85ED, 0x85F3, 0x85F6, 0x85FC, 0x85FF, 0x8600, 0x8604, 0x8605, 0x860D, 0x860E, 0x8610, 0x8611, 0x8612, 0x8618, 0x8619, 0x861B, 0x861E, 0x8621, 0x8627, 0x8629, 0x8636, 0x8638, 0x863A, 0x863C, 0x863D, 0x8640, 0x8642, 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865D, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866C, 0x866F, 0x8675, 0x8676, 0x8677, 0x867A, 0x868D, 0x8691, 0x8696, 0x8698, 0x869A, 0x869C, 0x86A1, 0x86A6, 0x86A7, 0x86A8, 0x86AD, 0x86B1, 0x86B3, 0x86B4, 0x86B5, 0x86B7, 0x86B8, 0x86B9, 0x86BF, 0x86C0, 0x86C1, 0x86C3, 0x86C5, 0x86D1, 0x86D2, 0x86D5, 0x86D7, 0x86DA, 0x86DC, 0x86E0, 0x86E3, 0x86E5, 0x86E7, 0x8688, 0x86FA, 0x86FC, 0x86FD, 0x8704, 0x8705, 0x8707, 0x870B, 0x870E, 0x870F, 0x8710, 0x8713, 0x8714, 0x8719, 0x871E, 0x871F, 0x8721, 0x8723, 0x8728, 0x872E, 0x872F, 0x8731, 0x8732, 0x8739, 0x873A, 0x873C, 0x873D, 0x873E, 0x8740, 0x8743, 0x8745, 0x874D, 0x8758, 0x875D, 0x8761, 0x8764, 0x8765, 0x876F, 0x8771, 0x8772, 0x877B, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878B, 0x878C, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879E, 0x87A0, 0x87A3, 0x87A7, 0x87AC, 0x87AD, 0x87AE, 0x87B1, 0x87B5, 0x87BE, 0x87BF, 0x87C1, 0x87C8, 0x87C9, 0x87CA, 0x87CE, 0x87D5, 0x87D6, 0x87D9, 0x87DA, 0x87DC, 0x87DF, 0x87E2, 0x87E3, 0x87E4, 0x87EA, 0x87EB, 0x87ED, 0x87F1, 0x87F3, 0x87F8, 0x87FA, 0x87FF, 0x8801, 0x8803, 0x8806, 0x8809, 0x880A, 0x880B, 0x8810, 0x8819, 0x8812, 0x8813, 0x8814, 0x8818, 0x881A, 0x881B, 0x881C, 0x881E, 0x881F, 0x8828, 0x882D, 0x882E, 0x8830, 0x8832, 0x8835, 0x883A, 0x883C, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x8851, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885F, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887B, 0x8880, 0x8898, 0x889A, 0x889B, 0x889C, 0x889F, 0x88A0, 0x88A8, 0x88AA, 0x88BA, 0x88BD, 0x88BE, 0x88C0, 0x88CA, 0x88CB, 0x88CC, 0x88CD, 0x88CE, 0x88D1, 0x88D2, 0x88D3, 0x88DB, 0x88DE, 0x88E7, 0x88EF, 0x88F0, 0x88F1, 0x88F5, 0x88F7, 0x8901, 0x8906, 0x890D, 0x890E, 0x890F, 0x8915, 0x8916, 0x8918, 0x8919, 0x891A, 0x891C, 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939, 0x893A, 0x893E, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894F, 0x8952, 0x8957, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962, 0x8963, 0x896B, 0x896E, 0x8970, 0x8973, 0x8975, 0x897A, 0x897B, 0x897C, 0x897D, 0x8989, 0x898D, 0x8990, 0x8994, 0x8995, 0x899B, 0x899C, 0x899F, 0x89A0, 0x89A5, 0x89B0, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89BC, 0x89D4, 0x89D5, 0x89D6, 0x89D7, 0x89D8, 0x89E5, 0x89E9, 0x89EB, 0x89ED, 0x89F1, 0x89F3, 0x89F6, 0x89F9, 0x89FD, 0x89FF, 0x8A04, 0x8A05, 0x8A07, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, 0x8A15, 0x8A1E, 0x8A20, 0x8A22, 0x8A24, 0x8A26, 0x8A2B, 0x8A2C, 0x8A2F, 0x8A35, 0x8A37, 0x8A3D, 0x8A3E, 0x8A40, 0x8A43, 0x8A45, 0x8A47, 0x8A49, 0x8A4D, 0x8A4E, 0x8A53, 0x8A56, 0x8A57, 0x8A58, 0x8A5C, 0x8A5D, 0x8A61, 0x8A65, 0x8A67, 0x8A75, 0x8A76, 0x8A77, 0x8A79, 0x8A7A, 0x8A7B, 0x8A7E, 0x8A7F, 0x8A80, 0x8A83, 0x8A86, 0x8A8B, 0x8A8F, 0x8A90, 0x8A92, 0x8A96, 0x8A97, 0x8A99, 0x8A9F, 0x8AA7, 0x8AA9, 0x8AAE, 0x8AAF, 0x8AB3, 0x8AB6, 0x8AB7, 0x8ABB, 0x8ABE, 0x8AC3, 0x8AC6, 0x8AC8, 0x8AC9, 0x8ACA, 0x8AD1, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD7, 0x8ADD, 0x8ADF, 0x8AEC, 0x8AF0, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AFC, 0x8AFF, 0x8B05, 0x8B06, 0x8B0B, 0x8B11, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B0A, 0x8B2D, 0x8B30, 0x8B37, 0x8B3C, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x8B46, 0x8B48, 0x8B52, 0x8B53, 0x8B54, 0x8B59, 0x8B4D, 0x8B5E, 0x8B63, 0x8B6D, 0x8B76, 0x8B78, 0x8B79, 0x8B7C, 0x8B7E, 0x8B81, 0x8B84, 0x8B85, 0x8B8B, 0x8B8D, 0x8B8F, 0x8B94, 0x8B95, 0x8B9C, 0x8B9E, 0x8B9F, 0x8C38, 0x8C39, 0x8C3D, 0x8C3E, 0x8C45, 0x8C47, 0x8C49, 0x8C4B, 0x8C4F, 0x8C51, 0x8C53, 0x8C54, 0x8C57, 0x8C58, 0x8C5B, 0x8C5D, 0x8C59, 0x8C63, 0x8C64, 0x8C66, 0x8C68, 0x8C69, 0x8C6D, 0x8C73, 0x8C75, 0x8C76, 0x8C7B, 0x8C7E, 0x8C86, 0x8C87, 0x8C8B, 0x8C90, 0x8C92, 0x8C93, 0x8C99, 0x8C9B, 0x8C9C, 0x8CA4, 0x8CB9, 0x8CBA, 0x8CC5, 0x8CC6, 0x8CC9, 0x8CCB, 0x8CCF, 0x8CD6, 0x8CD5, 0x8CD9, 0x8CDD, 0x8CE1, 0x8CE8, 0x8CEC, 0x8CEF, 0x8CF0, 0x8CF2, 0x8CF5, 0x8CF7, 0x8CF8, 0x8CFE, 0x8CFF, 0x8D01, 0x8D03, 0x8D09, 0x8D12, 0x8D17, 0x8D1B, 0x8D65, 0x8D69, 0x8D6C, 0x8D6E, 0x8D7F, 0x8D82, 0x8D84, 0x8D88, 0x8D8D, 0x8D90, 0x8D91, 0x8D95, 0x8D9E, 0x8D9F, 0x8DA0, 0x8DA6, 0x8DAB, 0x8DAC, 0x8DAF, 0x8DB2, 0x8DB5, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DC0, 0x8DC5, 0x8DC6, 0x8DC7, 0x8DC8, 0x8DCA, 0x8DCE, 0x8DD1, 0x8DD4, 0x8DD5, 0x8DD7, 0x8DD9, 0x8DE4, 0x8DE5, 0x8DE7, 0x8DEC, 0x8DF0, 0x8DBC, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DFD, 0x8E01, 0x8E04, 0x8E05, 0x8E06, 0x8E0B, 0x8E11, 0x8E14, 0x8E16, 0x8E20, 0x8E21, 0x8E22, 0x8E23, 0x8E26, 0x8E27, 0x8E31, 0x8E33, 0x8E36, 0x8E37, 0x8E38, 0x8E39, 0x8E3D, 0x8E40, 0x8E41, 0x8E4B, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E54, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E61, 0x8E62, 0x8E69, 0x8E6C, 0x8E6D, 0x8E6F, 0x8E70, 0x8E71, 0x8E79, 0x8E7A, 0x8E7B, 0x8E82, 0x8E83, 0x8E89, 0x8E90, 0x8E92, 0x8E95, 0x8E9A, 0x8E9B, 0x8E9D, 0x8E9E, 0x8EA2, 0x8EA7, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB3, 0x8EB5, 0x8EBA, 0x8EBB, 0x8EC0, 0x8EC1, 0x8EC3, 0x8EC4, 0x8EC7, 0x8ECF, 0x8ED1, 0x8ED4, 0x8EDC, 0x8EE8, 0x8EEE, 0x8EF0, 0x8EF1, 0x8EF7, 0x8EF9, 0x8EFA, 0x8EED, 0x8F00, 0x8F02, 0x8F07, 0x8F08, 0x8F0F, 0x8F10, 0x8F16, 0x8F17, 0x8F18, 0x8F1E, 0x8F20, 0x8F21, 0x8F23, 0x8F25, 0x8F27, 0x8F28, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F3A, 0x8F40, 0x8F41, 0x8F43, 0x8F47, 0x8F4F, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F58, 0x8F5D, 0x8F5E, 0x8F65, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FB5, 0x8FB6, 0x8FB8, 0x8FBE, 0x8FC0, 0x8FC1, 0x8FC6, 0x8FCA, 0x8FCB, 0x8FCD, 0x8FD0, 0x8FD2, 0x8FD3, 0x8FD5, 0x8FE0, 0x8FE3, 0x8FE4, 0x8FE8, 0x8FEE, 0x8FF1, 0x8FF5, 0x8FF6, 0x8FFB, 0x8FFE, 0x9002, 0x9004, 0x9008, 0x900C, 0x9018, 0x901B, 0x9028, 0x9029, 0x902F, 0x902A, 0x902C, 0x902D, 0x9033, 0x9034, 0x9037, 0x903F, 0x9043, 0x9044, 0x904C, 0x905B, 0x905D, 0x9062, 0x9066, 0x9067, 0x906C, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088, 0x908B, 0x908C, 0x908E, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099, 0x909B, 0x90A0, 0x90A1, 0x90A2, 0x90A5, 0x90B0, 0x90B2, 0x90B3, 0x90B4, 0x90B6, 0x90BD, 0x90CC, 0x90BE, 0x90C3, 0x90C4, 0x90C5, 0x90C7, 0x90C8, 0x90D5, 0x90D7, 0x90D8, 0x90D9, 0x90DC, 0x90DD, 0x90DF, 0x90E5, 0x90D2, 0x90F6, 0x90EB, 0x90EF, 0x90F0, 0x90F4, 0x90FE, 0x90FF, 0x9100, 0x9104, 0x9105, 0x9106, 0x9108, 0x910D, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911A, 0x911C, 0x911E, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129, 0x912E, 0x912F, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913A, 0x913C, 0x913D, 0x9143, 0x9147, 0x9148, 0x914F, 0x9153, 0x9157, 0x9159, 0x915A, 0x915B, 0x9161, 0x9164, 0x9167, 0x916D, 0x9174, 0x9179, 0x917A, 0x917B, 0x9181, 0x9183, 0x9185, 0x9186, 0x918A, 0x918E, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919E, 0x91A1, 0x91A6, 0x91A8, 0x91AC, 0x91AD, 0x91AE, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91BB, 0x91BC, 0x91BD, 0x91BF, 0x91C2, 0x91C3, 0x91C5, 0x91D3, 0x91D4, 0x91D7, 0x91D9, 0x91DA, 0x91DE, 0x91E4, 0x91E5, 0x91E9, 0x91EA, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F7, 0x91F9, 0x91FB, 0x91FD, 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920A, 0x920C, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921C, 0x921D, 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922E, 0x922F, 0x9230, 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923A, 0x923C, 0x923E, 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924A, 0x924D, 0x924E, 0x924F, 0x9251, 0x9258, 0x9259, 0x925C, 0x925D, 0x9260, 0x9261, 0x9265, 0x9267, 0x9268, 0x9269, 0x926E, 0x926F, 0x9270, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927B, 0x927C, 0x927D, 0x927F, 0x9288, 0x9289, 0x928A, 0x928D, 0x928E, 0x9292, 0x9297, 0x9299, 0x929F, 0x92A0, 0x92A4, 0x92A5, 0x92A7, 0x92A8, 0x92AB, 0x92AF, 0x92B2, 0x92B6, 0x92B8, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92D0, 0x92D3, 0x92D5, 0x92D7, 0x92D8, 0x92D9, 0x92DC, 0x92DD, 0x92DF, 0x92E0, 0x92E1, 0x92E3, 0x92E5, 0x92E7, 0x92E8, 0x92EC, 0x92EE, 0x92F0, 0x92F9, 0x92FB, 0x92FF, 0x9300, 0x9302, 0x9308, 0x930D, 0x9311, 0x9314, 0x9315, 0x931C, 0x931D, 0x931E, 0x931F, 0x9321, 0x9324, 0x9325, 0x9327, 0x9329, 0x932A, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358, 0x935A, 0x935E, 0x9364, 0x9365, 0x9367, 0x9369, 0x936A, 0x936D, 0x936F, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376, 0x937A, 0x937D, 0x937F, 0x9380, 0x9381, 0x9382, 0x9388, 0x938A, 0x938B, 0x938D, 0x938F, 0x9392, 0x9395, 0x9398, 0x939B, 0x939E, 0x93A1, 0x93A3, 0x93A4, 0x93A6, 0x93A8, 0x93AB, 0x93B4, 0x93B5, 0x93B6, 0x93BA, 0x93A9, 0x93C1, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93D3, 0x93D9, 0x93DC, 0x93DE, 0x93DF, 0x93E2, 0x93E6, 0x93E7, 0x93F9, 0x93F7, 0x93F8, 0x93FA, 0x93FB, 0x93FD, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409, 0x940D, 0x940E, 0x940F, 0x9415, 0x9416, 0x9417, 0x941F, 0x942E, 0x942F, 0x9431, 0x9432, 0x9433, 0x9434, 0x943B, 0x943F, 0x943D, 0x9443, 0x9445, 0x9448, 0x944A, 0x944C, 0x9455, 0x9459, 0x945C, 0x945F, 0x9461, 0x9463, 0x9468, 0x946B, 0x946D, 0x946E, 0x946F, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579, 0x957E, 0x9584, 0x9588, 0x958C, 0x958D, 0x958E, 0x959D, 0x959E, 0x959F, 0x95A1, 0x95A6, 0x95A9, 0x95AB, 0x95AC, 0x95B4, 0x95B6, 0x95BA, 0x95BD, 0x95BF, 0x95C6, 0x95C8, 0x95C9, 0x95CB, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D9, 0x95DA, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E4, 0x95E6, 0x961D, 0x961E, 0x9622, 0x9624, 0x9625, 0x9626, 0x962C, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963A, 0x963C, 0x963D, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658, 0x9661, 0x966E, 0x9674, 0x967B, 0x967C, 0x967E, 0x967F, 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969A, 0x969D, 0x969F, 0x96A4, 0x96A5, 0x96A6, 0x96A9, 0x96AE, 0x96AF, 0x96B3, 0x96BA, 0x96CA, 0x96D2, 0x5DB2, 0x96D8, 0x96DA, 0x96DD, 0x96DE, 0x96DF, 0x96E9, 0x96EF, 0x96F1, 0x96FA, 0x9702, 0x9703, 0x9705, 0x9709, 0x971A, 0x971B, 0x971D, 0x9721, 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974A, 0x974E, 0x974F, 0x9755, 0x9757, 0x9758, 0x975A, 0x975B, 0x9763, 0x9767, 0x976A, 0x976E, 0x9773, 0x9776, 0x9777, 0x9778, 0x977B, 0x977D, 0x977F, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979E, 0x979F, 0x97A2, 0x97AC, 0x97AE, 0x97B1, 0x97B2, 0x97B5, 0x97B6, 0x97B8, 0x97B9, 0x97BA, 0x97BC, 0x97BE, 0x97BF, 0x97C1, 0x97C4, 0x97C5, 0x97C7, 0x97C9, 0x97CA, 0x97CC, 0x97CD, 0x97CE, 0x97D0, 0x97D1, 0x97D4, 0x97D7, 0x97D8, 0x97D9, 0x97DD, 0x97DE, 0x97E0, 0x97DB, 0x97E1, 0x97E4, 0x97EF, 0x97F1, 0x97F4, 0x97F7, 0x97F8, 0x97FA, 0x9807, 0x980A, 0x9819, 0x980D, 0x980E, 0x9814, 0x9816, 0x981C, 0x981E, 0x9820, 0x9823, 0x9826, 0x982B, 0x982E, 0x982F, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825, 0x983E, 0x9844, 0x9847, 0x984A, 0x9851, 0x9852, 0x9853, 0x9856, 0x9857, 0x9859, 0x985A, 0x9862, 0x9863, 0x9865, 0x9866, 0x986A, 0x986C, 0x98AB, 0x98AD, 0x98AE, 0x98B0, 0x98B4, 0x98B7, 0x98B8, 0x98BA, 0x98BB, 0x98BF, 0x98C2, 0x98C5, 0x98C8, 0x98CC, 0x98E1, 0x98E3, 0x98E5, 0x98E6, 0x98E7, 0x98EA, 0x98F3, 0x98F6, 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991A, 0x991B, 0x991C, 0x991F, 0x9922, 0x9926, 0x9927, 0x992B, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993A, 0x993B, 0x993C, 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994D, 0x994E, 0x9954, 0x9958, 0x9959, 0x995B, 0x995C, 0x995E, 0x995F, 0x9960, 0x999B, 0x999D, 0x999F, 0x99A6, 0x99B0, 0x99B1, 0x99B2, 0x99B5, 0x99B9, 0x99BA, 0x99BD, 0x99BF, 0x99C3, 0x99C9, 0x99D3, 0x99D4, 0x99D9, 0x99DA, 0x99DC, 0x99DE, 0x99E7, 0x99EA, 0x99EB, 0x99EC, 0x99F0, 0x99F4, 0x99F5, 0x99F9, 0x99FD, 0x99FE, 0x9A02, 0x9A03, 0x9A04, 0x9A0B, 0x9A0C, 0x9A10, 0x9A11, 0x9A16, 0x9A1E, 0x9A20, 0x9A22, 0x9A23, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A33, 0x9A35, 0x9A36, 0x9A38, 0x9A47, 0x9A41, 0x9A44, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A51, 0x9A54, 0x9A56, 0x9A5D, 0x9AAA, 0x9AAC, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB4, 0x9AB5, 0x9AB6, 0x9AB9, 0x9ABB, 0x9ABE, 0x9ABF, 0x9AC1, 0x9AC3, 0x9AC6, 0x9AC8, 0x9ACE, 0x9AD0, 0x9AD2, 0x9AD5, 0x9AD6, 0x9AD7, 0x9ADB, 0x9ADC, 0x9AE0, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE9, 0x9AEC, 0x9AF2, 0x9AF3, 0x9AF5, 0x9AF9, 0x9AFA, 0x9AFD, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B03, 0x9B04, 0x9B05, 0x9B08, 0x9B09, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, 0x9B12, 0x9B16, 0x9B19, 0x9B1B, 0x9B1C, 0x9B20, 0x9B26, 0x9B2B, 0x9B2D, 0x9B33, 0x9B34, 0x9B35, 0x9B37, 0x9B39, 0x9B3A, 0x9B3D, 0x9B48, 0x9B4B, 0x9B4C, 0x9B55, 0x9B56, 0x9B57, 0x9B5B, 0x9B5E, 0x9B61, 0x9B63, 0x9B65, 0x9B66, 0x9B68, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B73, 0x9B75, 0x9B77, 0x9B78, 0x9B79, 0x9B7F, 0x9B80, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8D, 0x9B8F, 0x9B90, 0x9B94, 0x9B9A, 0x9B9D, 0x9B9E, 0x9BA6, 0x9BA7, 0x9BA9, 0x9BAC, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB7, 0x9BB8, 0x9BBB, 0x9BBC, 0x9BBE, 0x9BBF, 0x9BC1, 0x9BC7, 0x9BC8, 0x9BCE, 0x9BD0, 0x9BD7, 0x9BD8, 0x9BDD, 0x9BDF, 0x9BE5, 0x9BE7, 0x9BEA, 0x9BEB, 0x9BEF, 0x9BF3, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFD, 0x9BFF, 0x9C00, 0x9C02, 0x9C0B, 0x9C0F, 0x9C11, 0x9C16, 0x9C18, 0x9C19, 0x9C1A, 0x9C1C, 0x9C1E, 0x9C22, 0x9C23, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C31, 0x9C35, 0x9C36, 0x9C37, 0x9C3D, 0x9C41, 0x9C43, 0x9C44, 0x9C45, 0x9C49, 0x9C4A, 0x9C4E, 0x9C4F, 0x9C50, 0x9C53, 0x9C54, 0x9C56, 0x9C58, 0x9C5B, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C63, 0x9C69, 0x9C6A, 0x9C5C, 0x9C6B, 0x9C68, 0x9C6E, 0x9C70, 0x9C72, 0x9C75, 0x9C77, 0x9C7B, 0x9CE6, 0x9CF2, 0x9CF7, 0x9CF9, 0x9D0B, 0x9D02, 0x9D11, 0x9D17, 0x9D18, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D2F, 0x9D30, 0x9D32, 0x9D33, 0x9D34, 0x9D3A, 0x9D3C, 0x9D45, 0x9D3D, 0x9D42, 0x9D43, 0x9D47, 0x9D4A, 0x9D53, 0x9D54, 0x9D5F, 0x9D63, 0x9D62, 0x9D65, 0x9D69, 0x9D6A, 0x9D6B, 0x9D70, 0x9D76, 0x9D77, 0x9D7B, 0x9D7C, 0x9D7E, 0x9D83, 0x9D84, 0x9D86, 0x9D8A, 0x9D8D, 0x9D8E, 0x9D92, 0x9D93, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9DA1, 0x9DAA, 0x9DAC, 0x9DAE, 0x9DB1, 0x9DB5, 0x9DB9, 0x9DBC, 0x9DBF, 0x9DC3, 0x9DC7, 0x9DC9, 0x9DCA, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DDA, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE5, 0x9DE7, 0x9DE9, 0x9DEB, 0x9DEE, 0x9DF0, 0x9DF3, 0x9DF4, 0x9DFE, 0x9E0A, 0x9E02, 0x9E07, 0x9E0E, 0x9E10, 0x9E11, 0x9E12, 0x9E15, 0x9E16, 0x9E19, 0x9E1C, 0x9E1D, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E80, 0x9E82, 0x9E83, 0x9E84, 0x9E85, 0x9E87, 0x9E8E, 0x9E8F, 0x9E96, 0x9E98, 0x9E9B, 0x9E9E, 0x9EA4, 0x9EA8, 0x9EAC, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EC6, 0x9EC8, 0x9ECB, 0x9ED5, 0x9EDF, 0x9EE4, 0x9EE7, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF5, 0x9EF8, 0x9EFF, 0x9F02, 0x9F03, 0x9F09, 0x9F0F, 0x9F10, 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F17, 0x9F19, 0x9F1A, 0x9F1B, 0x9F1F, 0x9F22, 0x9F26, 0x9F2A, 0x9F2B, 0x9F2F, 0x9F31, 0x9F32, 0x9F34, 0x9F37, 0x9F39, 0x9F3A, 0x9F3C, 0x9F3D, 0x9F3F, 0x9F41, 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, 0x9F53, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F5A, 0x9F5D, 0x9F5E, 0x9F68, 0x9F69, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F75, 0x9F7A, 0x9F7D, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F94, 0x9F96, 0x9F97, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA5, // [ 108, 118] -v # seg 1 at pos 5801 0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0xFF5E, 0x0384, 0x0385, // [ 127, 129] -v # seg 3 at pos 5812 0x00A1, 0x00A6, 0x00BF, // [ 168, 174] -v # seg 5 at pos 5815 0x00BA, 0x00AA, 0x00A9, 0x00AE, 0x2122, 0x00A4, 0x2116, // [ 534, 561] -v # seg 7 at pos 5822 0x0386, 0x0388, 0x0389, 0x038A, 0x03AA, RCHAR, 0x038C, RCHAR, 0x038E, 0x03AB, RCHAR, 0x038F, RCHAR, RCHAR, RCHAR, RCHAR, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x0390, 0x03CC, 0x03C2, 0x03CD, 0x03CB, 0x03B0, 0x03CE, // [ 608, 609] -> [0x040E,0x040F] # seg 10 // [ 645, 655] -> [0x0452,0x045C] # seg 12 // [ 752, 767] -v # seg 15 at pos 5850 0x00C6, 0x0110, RCHAR, 0x0126, RCHAR, 0x0132, RCHAR, 0x0141, 0x013F, RCHAR, 0x014A, 0x00D8, 0x0152, RCHAR, 0x0166, 0x00DE, // [ 784, 799] -v # seg 17 at pos 5866 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, 0x0140, 0x0149, 0x014B, 0x00F8, 0x0153, 0x00DF, 0x0167, 0x00FE, // [ 846, 932] -v # seg 19 at pos 5882 0x00C1, 0x00C0, 0x00C4, 0x00C2, 0x0102, 0x01CD, 0x0100, 0x0104, 0x00C5, 0x00C3, 0x0106, 0x0108, 0x010C, 0x00C7, 0x010A, 0x010E, 0x00C9, 0x00C8, 0x00CB, 0x00CA, 0x011A, 0x0116, 0x0112, 0x0118, RCHAR, 0x011C, 0x011E, 0x0122, 0x0120, 0x0124, 0x00CD, 0x00CC, 0x00CF, 0x00CE, 0x01CF, 0x0130, 0x012A, 0x012E, 0x0128, 0x0134, 0x0136, 0x0139, 0x013D, 0x013B, 0x0143, 0x0147, 0x0145, 0x00D1, 0x00D3, 0x00D2, 0x00D6, 0x00D4, 0x01D1, 0x0150, 0x014C, 0x00D5, 0x0154, 0x0158, 0x0156, 0x015A, 0x015C, 0x0160, 0x015E, 0x0164, 0x0162, 0x00DA, 0x00D9, 0x00DC, 0x00DB, 0x016C, 0x01D3, 0x0170, 0x016A, 0x0172, 0x016E, 0x0168, 0x01D7, 0x01DB, 0x01D9, 0x01D5, 0x0174, 0x00DD, 0x0178, 0x0176, 0x0179, 0x017D, 0x017B, // [ 940, 1026] -v # seg 21 at pos 5969 0x00E1, 0x00E0, 0x00E4, 0x00E2, 0x0103, 0x01CE, 0x0101, 0x0105, 0x00E5, 0x00E3, 0x0107, 0x0109, 0x010D, 0x00E7, 0x010B, 0x010F, 0x00E9, 0x00E8, 0x00EB, 0x00EA, 0x011B, 0x0117, 0x0113, 0x0119, 0x01F5, 0x011D, 0x011F, RCHAR, 0x0121, 0x0125, 0x00ED, 0x00EC, 0x00EF, 0x00EE, 0x01D0, RCHAR, 0x012B, 0x012F, 0x0129, 0x0135, 0x0137, 0x013A, 0x013E, 0x013C, 0x0144, 0x0148, 0x0146, 0x00F1, 0x00F3, 0x00F2, 0x00F6, 0x00F4, 0x01D2, 0x0151, 0x014D, 0x00F5, 0x0155, 0x0159, 0x0157, 0x015B, 0x015D, 0x0161, 0x015F, 0x0165, 0x0163, 0x00FA, 0x00F9, 0x00FC, 0x00FB, 0x016D, 0x01D4, 0x0171, 0x016B, 0x0173, 0x016F, 0x0169, 0x01D8, 0x01DC, 0x01DA, 0x01D6, 0x0175, 0x00FD, 0x00FF, 0x0177, 0x017A, 0x017E, 0x017C, }; // Reverse (values >= 8836 are JIS X 0212) const unsigned short CodePageJISX_R[22085] = { // hot segments (indexes into segment table) 2, 93, 95, // number of segments 107, // segment table 0x0000, 0x005C, 0x005D, 0x007E, 0x007F, 0x00A1, 0x017F, 0x01CD, 0x01DD, 0x01F5, 0x01F6, 0x02C7, 0x02C8, 0x02D8, 0x02DE, 0x0384, 0x0391, 0x03A2, 0x03A3, 0x03B1, 0x03C2, 0x03CF, 0x0401, 0x0402, 0x040D, 0x040E, 0x0416, 0x0430, 0x0436, 0x0450, 0x0451, 0x0452, 0x045D, 0x045E, 0x0460, 0x2010, 0x2027, 0x2030, 0x2034, 0x203B, 0x203F, 0x2103, 0x2104, 0x2116, 0x2117, 0x2122, 0x2123, 0x212B, 0x212C, 0x2190, 0x2194, 0x21D2, 0x21D5, 0x2200, 0x2213, 0x221A, 0x222D, 0x2234, 0x2236, 0x223D, 0x223E, 0x2252, 0x2253, 0x2260, 0x226C, 0x2282, 0x2288, 0x22A5, 0x22A6, 0x2312, 0x2313, 0x2500, 0x2504, 0x250C, 0x2543, 0x254B, 0x254C, 0x25A0, 0x25A2, 0x25B2, 0x25B4, 0x25BC, 0x25BE, 0x25C6, 0x25D0, 0x25EF, 0x25F0, 0x2605, 0x2607, 0x2640, 0x2643, 0x266A, 0x2670, 0x3000, 0x3100, 0x4E00, 0xA000, 0xFF01, 0xFF10, 0xFF1A, 0xFF21, 0xFF3B, 0xFF41, 0xFF5B, 0xFF5F, 0xFFE0, 0xFFE6, // compressed segments RCHAR, 31, RCHAR, 8952, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9800, RCHAR, 8945, RCHAR, RCHAR, RCHAR, RCHAR, 470, RCHAR, RCHAR, 502, RCHAR, RCHAR, 570, 9433, RCHAR, RCHAR, 571, 612, 619, RCHAR, 618, 9481, RCHAR, 9492, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 77, RCHAR, 9010, RCHAR, 9008, RCHAR, 175, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 163, RCHAR, 159, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 154, RCHAR, 155, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 679, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 203, RCHAR, 220, RCHAR, 252, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21248, RCHAR, 21470, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21486, RCHAR, 21492, RCHAR, RCHAR, 21505, RCHAR, 21519, RCHAR, RCHAR, RCHAR, RCHAR, 21532, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21540, RCHAR, 21563, RCHAR, 21567, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21571, RCHAR, 21575, RCHAR, 21578, RCHAR, 21597, RCHAR, 21616, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21618, RCHAR, 21630, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21636, RCHAR, 21640, RCHAR, RCHAR, RCHAR, 21695, RCHAR, 21697, RCHAR, 21699, RCHAR, 21701, RCHAR, RCHAR, RCHAR, 21711, RCHAR, 21713, RCHAR, 21716, RCHAR, 0, RCHAR, 256, RCHAR, 21722, RCHAR, 21737, RCHAR, 21744, RCHAR, 21750, RCHAR, 21754, RCHAR, // [0x005C,0x005C] -> [ 31, 31] # seg 1 // [0x007E,0x007E] -> [ 8952, 8952] # seg 3 // [0x0391,0x03A1] -> [ 470, 486] # seg 16 // [0x03B1,0x03C1] -> [ 502, 518] # seg 19 // [0x0401,0x0401] -> [ 570, 570] # seg 22 // [0x0416,0x042F] -> [ 571, 596] # seg 26 // [0x0436,0x044F] -> [ 619, 644] # seg 28 // [0x0451,0x0451] -> [ 618, 618] # seg 30 // [0x3000,0x30FF] -v # seg 93 at pos 0 0, 1, 2, 22, RCHAR, 24, 25, 26, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 102, 107, 43, 44, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 32, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10, 11, 20, 21, RCHAR, RCHAR, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, RCHAR, RCHAR, RCHAR, RCHAR, 5, 27, 18, 19, RCHAR, // [0x4E00,0x9FFF] -v # seg 95 at pos 256 1485, 3285, 10246, 2560, 10247, 10248, RCHAR, 4039, 2795, 2459, 2794, 1625, 10249, 3811, 4166, RCHAR, 4419, 1518, 10250, RCHAR, 1769, 4420, 2917, 4639, 1933, 3879, RCHAR, RCHAR, RCHAR, RCHAR, 2796, 10251, RCHAR, 4259, RCHAR, 10252, 10253, RCHAR, 3887, RCHAR, 10254, RCHAR, 4421, 10255, RCHAR, 3265, 10256, 10257, 10258, 4422, 2063, RCHAR, RCHAR, 10259, 4423, RCHAR, 1846, 3211, RCHAR, 2608, 4424, RCHAR, RCHAR, 4425, 10260, 10261, 4426, 3592, 10262, 1934, RCHAR, 10263, RCHAR, RCHAR, RCHAR, 3594, RCHAR, 3544, 2196, 3966, RCHAR, 10264, RCHAR, RCHAR, RCHAR, 6808, 4427, 2797, 4428, 1618, 10265, RCHAR, 10266, 2042, 2241, 4114, RCHAR, RCHAR, 4987, 10267, RCHAR, RCHAR, RCHAR, RCHAR, 10268, 10269, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4215, RCHAR, 3570, 10270, 10271, RCHAR, RCHAR, RCHAR, 10272, RCHAR, RCHAR, RCHAR, RCHAR, 1790, 10273, 1900, RCHAR, 4429, RCHAR, RCHAR, 4430, 4256, RCHAR, 4164, 3079, 4432, 2529, 3560, 10274, 4435, RCHAR, RCHAR, 1533, 2224, RCHAR, 2223, 1479, 10275, 10276, 4366, 4365, RCHAR, 2368, 1410, 10277, 4436, 4437, 4438, 3967, 4439, RCHAR, 2243, 1480, 4029, RCHAR, 1971, RCHAR, RCHAR, 1972, 1973, 3355, 4257, 10278, 4440, RCHAR, RCHAR, 4441, RCHAR, RCHAR, 4442, RCHAR, RCHAR, 10279, 2864, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2657, 2865, 4447, 10280, 4445, RCHAR, 4446, 1935, RCHAR, RCHAR, 2352, 1677, RCHAR, 4444, 4443, 3862, 10281, RCHAR, RCHAR, RCHAR, 2481, 2480, 3131, 4448, 3812, 2984, 10282, 10283, RCHAR, 23, 4449, 4451, 10284, 10285, 10286, 3170, 4294, 1451, RCHAR, RCHAR, 10287, RCHAR, RCHAR, RCHAR, RCHAR, 4450, 1627, 10288, 2009, 10289, 3266, 10290, RCHAR, 10291, 2146, 4452, RCHAR, RCHAR, RCHAR, 3575, RCHAR, 10292, 10293, 10294, 10295, 1860, 10296, 10297, RCHAR, RCHAR, RCHAR, RCHAR, 10298, 4453, 1452, 10299, 10300, 2225, 1861, 3849, 3683, 1936, 10301, RCHAR, RCHAR, 10302, 10303, 10304, RCHAR, 10305, 1678, RCHAR, 4488, 3416, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10306, 3647, 4455, 10307, RCHAR, 10309, 3693, 10310, 4295, 10311, 2832, 10312, 2482, 10313, 2530, 1629, 10314, RCHAR, 10315, RCHAR, 10316, 3338, RCHAR, RCHAR, 3197, 4459, 10317, 10318, RCHAR, 10319, 10320, 1453, 3356, 2658, 2369, 4139, 10321, 3147, 10322, 1628, 10323, 4458, 10324, 4165, 4454, 4456, 2427, 4457, 4891, 10325, 10308, RCHAR, RCHAR, 10326, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4465, 10327, RCHAR, 10328, RCHAR, 10329, 4468, 4466, 10330, RCHAR, 1631, RCHAR, 3880, 4460, 10331, 10332, 10333, 10334, 4464, 2244, 10335, 10336, 2483, RCHAR, 10337, 10338, 1791, 10339, 10340, 4469, RCHAR, 4461, 10341, 10342, 4296, 10343, 2531, 10344, 4462, 10345, 4467, 10346, 10347, 10348, RCHAR, 4470, 10349, 4463, 10350, 10351, 1974, RCHAR, 1454, 10352, 10353, 1975, 1630, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4892, RCHAR, 4036, 3837, 2245, RCHAR, RCHAR, 10354, RCHAR, RCHAR, 2834, 4252, 10355, RCHAR, 10356, RCHAR, 10357, 10358, 10359, 10360, 3909, 10361, 10362, 2091, 3106, 1665, 10363, 10364, RCHAR, 10365, 10366, 2682, 10367, 10368, 10369, 4474, 10370, 4479, 4477, 10371, RCHAR, 4472, RCHAR, RCHAR, 3116, 4475, RCHAR, 4478, 4476, 10372, 3914, RCHAR, 4473, 10373, 2833, 10374, 4030, 4480, 4481, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2635, 4494, 10375, RCHAR, 10376, 3619, RCHAR, 3781, 4489, RCHAR, 3933, RCHAR, 1619, RCHAR, 10377, 10378, 4493, 10379, 10380, 10381, RCHAR, RCHAR, 10382, 4487, 4496, 10383, RCHAR, 3057, 10384, 2197, 10385, 3631, 10386, 5960, 10387, 4495, 3444, 10388, 4484, RCHAR, 2247, 10389, 10390, 2246, 4482, 10391, 10392, 10393, 10394, 2595, RCHAR, 4490, 10395, 3932, 3240, 4486, 2148, 10396, 4483, 4491, 4485, 4278, 4492, 4356, 10397, RCHAR, 10398, RCHAR, 10399, 10400, RCHAR, 10401, 2043, RCHAR, RCHAR, 2147, RCHAR, 10425, RCHAR, RCHAR, RCHAR, RCHAR, 10402, 10403, 10404, 4497, RCHAR, 10405, 10406, 4498, 4502, 1455, 10407, RCHAR, 10408, RCHAR, 10409, 3901, 4501, 10410, 10411, 10412, RCHAR, 4500, 4504, 10413, RCHAR, 10414, 4503, RCHAR, 3357, RCHAR, RCHAR, 10415, 10416, RCHAR, 10417, 10418, RCHAR, 2149, 10419, 10420, RCHAR, RCHAR, 10421, RCHAR, 4505, 10422, RCHAR, RCHAR, 10423, 10424, 2574, RCHAR, 3107, 3358, 2059, RCHAR, 4506, RCHAR, RCHAR, RCHAR, RCHAR, 1901, RCHAR, RCHAR, 4507, 10426, RCHAR, 10427, 10428, 4509, 10429, RCHAR, RCHAR, RCHAR, 10430, RCHAR, RCHAR, 3968, 10431, 10432, 10433, 2137, 10434, 10435, 10436, RCHAR, 10437, RCHAR, 2460, 3752, 4508, 10438, 10439, RCHAR, 10440, 10441, 10442, 10443, 10444, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10445, RCHAR, 2386, 4170, RCHAR, 10446, 10447, RCHAR, 4511, 4514, 4510, 2385, RCHAR, 2724, RCHAR, 10448, 10449, RCHAR, RCHAR, 10450, 2092, RCHAR, 10451, RCHAR, 4515, 10452, 10453, 2020, RCHAR, 10454, RCHAR, 4512, 4513, RCHAR, 10455, 3492, 10456, 3099, 10457, 1976, RCHAR, 10458, 10459, 3992, 4516, RCHAR, 10460, RCHAR, 4258, RCHAR, 10461, 10462, 4517, 10463, RCHAR, RCHAR, 10464, 4520, 10465, 4518, 10466, 3053, 10467, 10468, RCHAR, RCHAR, RCHAR, 4519, 4521, 10469, RCHAR, 10470, 10482, RCHAR, RCHAR, 4523, 10471, RCHAR, RCHAR, 4522, 10472, 3893, RCHAR, RCHAR, 10473, RCHAR, 1902, 4525, 4526, 10474, 1612, RCHAR, 10475, 10476, 10477, 4524, RCHAR, 10478, 10479, 10480, 10481, RCHAR, 10483, RCHAR, 2621, RCHAR, 4529, 4528, 4527, 10484, 4471, 10485, 4530, 10486, 10487, 10488, 10489, 2725, RCHAR, 4531, RCHAR, 10490, RCHAR, RCHAR, RCHAR, 10491, 10492, RCHAR, 4140, RCHAR, 10493, 10494, RCHAR, 10495, RCHAR, 10496, 4098, 10497, 10498, 10499, RCHAR, 4533, 10500, 10501, 4532, 4535, 4534, RCHAR, RCHAR, 4536, 4537, 1493, 10502, 2182, 2094, 2659, 3286, 1977, 2985, 2248, 10503, 2333, 4539, 4081, 3421, 10504, 2532, RCHAR, 4538, 10505, 4540, 10506, RCHAR, 10507, 10508, RCHAR, 3445, RCHAR, 1776, RCHAR, RCHAR, 10509, RCHAR, RCHAR, 4541, RCHAR, 10510, 3571, 10511, RCHAR, 3027, 4543, 4544, 3677, 2249, 4350, 4545, RCHAR, RCHAR, 1979, RCHAR, RCHAR, RCHAR, 3881, 3123, 2054, 3404, RCHAR, RCHAR, RCHAR, 2150, RCHAR, 10512, RCHAR, 4546, RCHAR, 4547, 10513, 10514, 3543, 1566, RCHAR, RCHAR, 4550, 2442, 10515, 4549, 2387, 10516, 4551, 6563, 4552, 3980, 4553, RCHAR, 4554, 4555, 2798, 10517, 2581, RCHAR, RCHAR, RCHAR, 10518, RCHAR, RCHAR, 1792, 10519, 4558, 10520, 4556, 4070, 4557, RCHAR, 3817, 4559, 4560, 4561, 3446, 10521, RCHAR, RCHAR, 4565, 4563, 4564, 4562, 2416, 4566, 4115, 4297, 10522, RCHAR, 10523, RCHAR, 10524, 4567, 10525, 10526, RCHAR, RCHAR, 10527, RCHAR, 2921, 4568, 2689, RCHAR, 10528, 4569, RCHAR, 3287, 4260, 3447, RCHAR, 10529, RCHAR, 10530, 10531, 10532, RCHAR, 10533, 4642, RCHAR, 10534, RCHAR, RCHAR, 4570, 7806, 2010, 10535, RCHAR, 4571, 4009, 10536, RCHAR, RCHAR, 10537, 2703, 3193, RCHAR, 4573, 3545, RCHAR, RCHAR, 4574, 10538, RCHAR, 4575, 1705, 10539, 10540, 10541, 4576, 1980, 10542, 3521, 1593, 2679, RCHAR, RCHAR, 3666, 4577, RCHAR, 3448, 10543, 10544, 2866, 4578, 10545, 3865, 2971, 1787, RCHAR, 1794, 4579, RCHAR, RCHAR, 4581, RCHAR, RCHAR, 2093, 10546, 10547, 4580, 10548, 10549, 4312, 10550, RCHAR, RCHAR, RCHAR, RCHAR, 2704, RCHAR, RCHAR, RCHAR, RCHAR, 10551, RCHAR, 3694, 3897, RCHAR, 4582, 10552, 4223, 4583, RCHAR, RCHAR, RCHAR, 4584, RCHAR, 3477, 10553, 10554, 4585, RCHAR, 10555, 2922, 2443, 2151, 4586, 2484, 2334, 10556, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3359, 4588, 10557, RCHAR, 3108, RCHAR, 10558, 2428, 4589, 4590, 3023, RCHAR, 4587, RCHAR, RCHAR, RCHAR, RCHAR, 4592, 10559, 3969, 10560, 10561, RCHAR, 10562, 2323, 10563, 3648, 4591, 10564, 10565, 10566, RCHAR, 2152, 2411, 3648, 10567, RCHAR, RCHAR, 4595, 4593, RCHAR, RCHAR, RCHAR, 10568, 3850, 2799, 4602, 1759, 4596, 4594, 3054, RCHAR, 10569, 10570, 10571, RCHAR, RCHAR, RCHAR, 4598, RCHAR, 4597, 10572, RCHAR, 10573, 1727, RCHAR, 10574, RCHAR, 2131, 4603, 4242, 10575, RCHAR, 10576, 4599, RCHAR, RCHAR, RCHAR, 4604, 4601, 10577, 4600, 10578, 10579, 10580, 10581, RCHAR, 10582, 4276, 10583, RCHAR, RCHAR, 2250, 1632, RCHAR, RCHAR, 4313, 10584, 10585, 10586, 10587, RCHAR, 2716, 3439, 2324, 4607, 4608, RCHAR, 10588, 10589, 4298, RCHAR, RCHAR, 4334, 4610, 10590, 10591, 10592, 2251, 10593, 10594, 4609, 10595, 1706, RCHAR, 10596, 4611, RCHAR, 4001, 10597, 3317, 10598, 4141, 10599, 3910, RCHAR, RCHAR, 10600, 4612, RCHAR, 10601, RCHAR, 10602, 7478, RCHAR, 10603, 3493, 10604, 4613, 1795, 4060, RCHAR, 10605, 10606, 2726, 4614, 3924, 4618, 10607, 2923, 4615, 2021, 10608, 4616, 1796, 10609, 10610, 10611, RCHAR, 10612, RCHAR, RCHAR, RCHAR, 10613, 10614, 2081, 4619, 10615, 4620, 10616, 10617, 4621, 4622, 2596, RCHAR, RCHAR, RCHAR, 2252, 4103, 10618, 4113, 3564, 10619, RCHAR, 3934, 4623, RCHAR, 4624, RCHAR, 10620, 10621, 10622, 4626, RCHAR, 4628, 4627, 10623, RCHAR, 10624, RCHAR, 4629, 1626, 3991, 10625, 2441, 4630, 10626, 10627, 3064, 10628, 10629, 2727, 1982, RCHAR, 4631, RCHAR, 10630, RCHAR, 10631, 10632, 10633, 3724, 10634, 10635, 10636, RCHAR, 4632, 10637, 4633, 10638, 4634, RCHAR, 10639, RCHAR, RCHAR, 4635, 3763, 2045, 1478, 10640, 10641, 10642, 3508, 4636, 2660, 10643, 2986, RCHAR, 4638, 4637, 2728, 2226, 4640, 3695, 10645, 10644, 4641, RCHAR, RCHAR, RCHAR, 3725, 3121, 3179, 1981, RCHAR, RCHAR, 3555, 3212, 10646, 3649, 10647, 3993, RCHAR, 4643, RCHAR, 2987, 10648, RCHAR, 10649, RCHAR, 10650, 2088, RCHAR, RCHAR, 4644, RCHAR, RCHAR, 10651, 10652, 4645, 1515, 1494, 1862, 10653, 3109, 1928, 4216, RCHAR, 4648, 1620, 10654, RCHAR, 4647, RCHAR, RCHAR, 10655, 1983, RCHAR, RCHAR, 4649, 10656, 4122, RCHAR, RCHAR, 10657, 10658, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10659, RCHAR, RCHAR, RCHAR, RCHAR, 10660, 10661, RCHAR, 4650, RCHAR, 4279, 10662, 2253, RCHAR, RCHAR, 10663, RCHAR, 2183, 4651, 10664, RCHAR, RCHAR, 10665, 4653, 4652, RCHAR, 2882, 1528, 10666, 10667, RCHAR, 1565, 4654, 10668, 4655, RCHAR, 10669, 2184, 10670, 10671, 4656, 10672, 10673, RCHAR, 10674, 1957, RCHAR, 10675, RCHAR, RCHAR, 10676, RCHAR, 2461, 4657, RCHAR, 10677, RCHAR, RCHAR, 4031, 2370, 1937, 4142, 3055, 3696, 2630, 10678, RCHAR, RCHAR, 10679, 10680, 2670, 10681, 2609, 2622, RCHAR, 2717, 10682, 3697, RCHAR, 10683, 10684, 4660, 10685, 1538, 3056, 2254, 2198, 2044, 10686, 10687, 4664, 3196, 3195, 1984, 2729, 4665, 4663, 1633, 3171, 2561, 2486, 1509, RCHAR, 10688, 1771, 2325, 2485, RCHAR, 4666, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4667, 10689, 1920, 1729, RCHAR, RCHAR, RCHAR, 2326, 1919, 3352, 1508, 3494, 4071, 2256, 4224, 3422, 2255, RCHAR, 10690, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10691, 2082, RCHAR, 4676, RCHAR, 2040, 3989, 10692, RCHAR, RCHAR, RCHAR, RCHAR, 3726, 10693, 10694, 4675, 10695, 1847, 4670, 4671, 4673, 10696, RCHAR, 10697, RCHAR, RCHAR, 10698, 10699, 4674, RCHAR, 1938, 2884, RCHAR, 3866, 4672, 4668, 2228, RCHAR, 4669, RCHAR, 4327, 10700, 10701, RCHAR, 3935, 10702, 3361, 2227, 2335, RCHAR, RCHAR, 10703, 4677, 10704, RCHAR, 3538, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10705, 4681, RCHAR, RCHAR, 10706, RCHAR, 10707, RCHAR, 10708, 10709, 2631, 10710, 2623, 10711, RCHAR, 10712, 10713, RCHAR, 4684, 4682, RCHAR, 4044, 10714, 4679, 4688, 4683, RCHAR, RCHAR, RCHAR, 4686, 2199, 4072, RCHAR, 10715, 4687, 10716, RCHAR, 10717, 4689, 10718, 4691, RCHAR, 10719, 10720, RCHAR, 2429, 4357, 10721, 4680, 4678, 4690, 10722, 4685, RCHAR, RCHAR, 10723, 10724, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10725, RCHAR, RCHAR, 10726, RCHAR, 10727, 4693, RCHAR, 4702, 4695, 10728, 10729, 4699, 10730, 10731, 4700, 4696, 10732, 10733, 4729, RCHAR, 10734, 2422, 1708, RCHAR, RCHAR, RCHAR, 10735, 4694, 10736, 10737, 10738, 4704, 1495, 4703, 10739, 1414, 3801, 4701, RCHAR, 4697, RCHAR, 10740, 4692, 4698, 2389, 10741, RCHAR, RCHAR, 10742, 10743, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4705, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10744, 1496, 4714, RCHAR, RCHAR, 4706, 4707, RCHAR, 2730, 4020, 10745, RCHAR, 10746, 4712, 4711, 10747, RCHAR, RCHAR, 3398, RCHAR, RCHAR, RCHAR, 10748, RCHAR, RCHAR, RCHAR, 4713, RCHAR, 10749, 4710, 10750, 10751, 10752, 10753, RCHAR, RCHAR, 1523, 10754, 2371, 2835, 10755, 10756, RCHAR, RCHAR, 10757, 10758, 10759, 4708, 3449, RCHAR, RCHAR, RCHAR, 4709, 10760, 1411, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10761, 10762, RCHAR, RCHAR, 4719, 4138, RCHAR, 2732, 10763, 4725, RCHAR, 10764, 10765, RCHAR, 4724, 4715, RCHAR, 10766, 10767, 10768, 3136, RCHAR, 4716, 10769, RCHAR, RCHAR, 3180, 4721, 2731, 10770, RCHAR, 10771, 10772, RCHAR, 4718, 10773, RCHAR, 4109, 10774, 10775, RCHAR, 2095, RCHAR, RCHAR, 4722, 4723, 10776, RCHAR, 10777, 10778, 4720, 4726, 10779, RCHAR, 10780, 10781, RCHAR, 4717, 10782, RCHAR, 10783, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4732, 4737, RCHAR, 4733, 10784, 4728, 10785, 10786, 4738, 3024, RCHAR, 10787, 4740, 10788, 2257, 4730, 3288, RCHAR, RCHAR, 10789, 10790, RCHAR, 10791, 10792, 10793, 10794, RCHAR, RCHAR, 10795, 4734, 4727, 1798, RCHAR, 1863, 1760, 4735, 4731, RCHAR, RCHAR, RCHAR, 10796, 10797, RCHAR, RCHAR, 2153, 4741, 4739, 3058, 1921, 1985, 10798, 4736, RCHAR, 2057, RCHAR, 10799, RCHAR, RCHAR, RCHAR, 1539, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10800, RCHAR, 10801, RCHAR, 10802, 4745, 4743, 10803, 4800, RCHAR, 10804, RCHAR, 10805, 10806, RCHAR, 10807, RCHAR, RCHAR, 10808, 10809, 10810, 4748, RCHAR, RCHAR, 10811, 10812, RCHAR, 4742, 10813, 4746, RCHAR, 10814, 4744, RCHAR, RCHAR, 10815, 2487, 4747, RCHAR, RCHAR, RCHAR, RCHAR, 10816, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10817, 4750, RCHAR, 4755, RCHAR, RCHAR, RCHAR, 4753, 4752, 10818, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10819, 3213, RCHAR, 10820, 1634, 10821, RCHAR, RCHAR, 10822, 10823, 10824, 10825, 10826, 10827, RCHAR, 4749, RCHAR, 4751, 2733, 1522, 10828, RCHAR, 4754, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1659, RCHAR, RCHAR, 10829, RCHAR, RCHAR, 4765, 10830, 2817, 4761, 10831, 4759, 10832, 4760, 10833, 4762, 10834, RCHAR, 10835, 10836, 10837, RCHAR, 10838, 10839, 10840, 1532, 10841, 10842, RCHAR, 10843, RCHAR, RCHAR, 10844, RCHAR, 10845, 3032, 10846, 4756, 10847, 4757, RCHAR, RCHAR, RCHAR, 10848, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1781, RCHAR, RCHAR, 10849, RCHAR, 10850, 10851, 10852, 10853, 4764, RCHAR, 10854, RCHAR, 1864, 10855, 4767, 4763, 4766, 10856, RCHAR, 10857, RCHAR, 10858, 10859, RCHAR, 3867, 10860, RCHAR, RCHAR, 3530, RCHAR, 3689, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4769, RCHAR, RCHAR, RCHAR, 10861, 10862, 4768, 1728, 10863, RCHAR, 4770, 10864, 10865, RCHAR, RCHAR, 4773, RCHAR, RCHAR, RCHAR, RCHAR, 4772, 10866, RCHAR, RCHAR, RCHAR, 10867, 10868, RCHAR, RCHAR, 10869, 10870, 10871, 4771, RCHAR, 3596, RCHAR, RCHAR, 4774, 10872, 10873, 10874, 10875, RCHAR, 10876, 10877, 10878, 4775, RCHAR, RCHAR, 10879, RCHAR, 10880, 4777, RCHAR, 4776, 10881, RCHAR, RCHAR, RCHAR, RCHAR, 4779, RCHAR, 10882, RCHAR, 4782, 4780, 4778, 4781, RCHAR, 10883, RCHAR, RCHAR, 4783, 10884, 10885, 10886, 10889, 10890, 4784, 10887, 10888, 4785, RCHAR, 4786, RCHAR, RCHAR, RCHAR, 4787, 4548, 10891, 2629, 2488, 10892, 10893, 1680, 10894, 1497, 10895, RCHAR, 3231, 10896, 10897, 10898, 10899, 10900, RCHAR, RCHAR, 10902, RCHAR, 10903, 4788, RCHAR, 2353, 10901, 1456, 2881, RCHAR, RCHAR, 10904, 10905, RCHAR, 4789, 2200, RCHAR, RCHAR, 2336, RCHAR, 4791, 4790, 10906, 10907, 3917, 4792, RCHAR, RCHAR, 10908, 4794, 4793, 10909, 4795, 10910, 4796, RCHAR, 2154, RCHAR, 10911, 1567, 4797, RCHAR, 10912, 4799, RCHAR, 4798, RCHAR, 10913, 10914, 4801, 10915, RCHAR, 3441, 10916, RCHAR, 10917, 10918, 10919, 10920, 4802, 1430, 2412, 10921, 10922, RCHAR, 10923, 2096, 10924, 10925, 3242, RCHAR, RCHAR, 10926, 10927, RCHAR, RCHAR, 4803, 4804, RCHAR, RCHAR, 4806, RCHAR, 10928, 10929, 10930, 4807, RCHAR, 2417, RCHAR, RCHAR, 10931, 10932, 2022, RCHAR, RCHAR, 3970, RCHAR, 10933, 10934, 4805, 4808, 2382, 2258, 10935, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4812, 10936, RCHAR, 2354, 10937, 3214, 10938, 10939, 4809, 3347, 10940, RCHAR, 10941, 10942, 10943, 10944, 10945, RCHAR, 10946, 10947, 10948, RCHAR, 10949, RCHAR, 10950, 10951, 10952, 10953, RCHAR, 10954, 4813, RCHAR, 10955, 2885, 10956, RCHAR, RCHAR, RCHAR, RCHAR, 4811, 4814, RCHAR, 2098, 10957, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4815, 10958, 10967, RCHAR, 10959, RCHAR, 10960, 10961, RCHAR, 10962, 10963, 10964, 10965, 4816, 10966, 2259, 1723, 4818, RCHAR, RCHAR, 10968, 10969, 10970, 4819, RCHAR, 10971, RCHAR, RCHAR, RCHAR, 4820, RCHAR, RCHAR, 4817, RCHAR, RCHAR, RCHAR, RCHAR, 10972, RCHAR, RCHAR, RCHAR, RCHAR, 10973, RCHAR, RCHAR, 4810, RCHAR, RCHAR, 4821, RCHAR, RCHAR, 4822, 10974, 10975, RCHAR, RCHAR, 4015, 10976, RCHAR, 2800, 10977, RCHAR, RCHAR, 4824, 4825, 4823, 10978, 4827, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3595, 10979, 10980, 1481, 3813, 10997, RCHAR, 4828, 10981, RCHAR, 10982, 10983, RCHAR, 10984, RCHAR, RCHAR, RCHAR, 10985, RCHAR, RCHAR, 10986, RCHAR, RCHAR, RCHAR, 2818, 10987, 10988, 2562, 10989, 3632, 1865, RCHAR, 2424, 10990, 10991, 10992, 4004, RCHAR, 3495, 10993, 10994, 2155, 3148, RCHAR, 10995, 10996, 4826, 4829, 10998, 10999, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3137, RCHAR, RCHAR, RCHAR, 4830, RCHAR, 11000, RCHAR, 4831, 11001, 11002, 11003, 4833, RCHAR, RCHAR, 3362, RCHAR, 11004, 11005, RCHAR, RCHAR, 1799, RCHAR, RCHAR, 11006, RCHAR, 7802, 1568, 3936, 11007, RCHAR, 2801, 3423, RCHAR, RCHAR, RCHAR, 11008, 2419, RCHAR, RCHAR, 4839, RCHAR, 11009, 3882, 4290, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11010, 1681, 4835, 11011, 11012, RCHAR, 11013, 11014, 3033, 4838, RCHAR, 3450, 11015, RCHAR, 3424, 3451, 3690, 3334, RCHAR, RCHAR, RCHAR, 2390, 11016, RCHAR, 11017, 4834, RCHAR, 11018, RCHAR, RCHAR, 11019, 11020, 1589, RCHAR, 3405, RCHAR, RCHAR, RCHAR, RCHAR, 4836, RCHAR, 4832, RCHAR, RCHAR, 2867, RCHAR, RCHAR, 11021, 4840, RCHAR, RCHAR, 11022, RCHAR, 2677, 11023, 11024, 11025, RCHAR, 1986, RCHAR, 4841, RCHAR, 11026, 11027, 11028, 11029, RCHAR, 11030, 11031, RCHAR, 11032, 11033, RCHAR, RCHAR, 3925, 11034, RCHAR, 11035, 3100, RCHAR, RCHAR, RCHAR, RCHAR, 3327, 11036, RCHAR, 4843, 11037, 11038, 11039, RCHAR, RCHAR, RCHAR, 11040, RCHAR, 3994, 11041, RCHAR, 4844, RCHAR, RCHAR, 4849, RCHAR, RCHAR, 11042, 11043, 3868, RCHAR, RCHAR, RCHAR, RCHAR, 4848, 4842, 4845, 4847, 11045, RCHAR, 2355, RCHAR, RCHAR, 3894, 11046, RCHAR, 11044, 4850, RCHAR, 3232, 11047, RCHAR, 1682, RCHAR, 2802, 11048, 11049, RCHAR, 11050, 4852, 11051, 4851, 11052, 2327, 11053, 4853, 4855, 4854, 11054, RCHAR, 4857, 11055, 4846, 4859, RCHAR, 11056, 11057, RCHAR, 4858, 4856, RCHAR, RCHAR, RCHAR, 11058, RCHAR, 2489, 2868, RCHAR, 3059, 4860, 2941, 1486, 3639, 11059, RCHAR, RCHAR, RCHAR, 3348, RCHAR, 4862, 4861, 4863, 4864, 4865, RCHAR, RCHAR, RCHAR, RCHAR, 4866, RCHAR, RCHAR, 11060, 11061, RCHAR, RCHAR, 3902, 4867, 11062, 11063, RCHAR, RCHAR, 1635, 4868, RCHAR, 11064, 11065, 11066, 4163, 1707, RCHAR, 4646, 2671, 3132, 4869, 4116, 11068, RCHAR, RCHAR, RCHAR, 11069, 4061, 11070, 11071, 4871, RCHAR, 3172, 11072, 3406, 3133, 3814, 4872, 4873, 1594, 11073, 11074, 2563, 4874, 11075, RCHAR, 11076, 11077, 1457, 4875, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4876, 11078, RCHAR, RCHAR, RCHAR, 11079, 1569, RCHAR, 11080, 1866, 3541, 3937, RCHAR, RCHAR, RCHAR, RCHAR, 4880, 3060, 4879, 2099, 11081, 11082, 4006, 4878, RCHAR, 3452, 4882, 11083, 4881, 11084, RCHAR, 11085, 11086, 11087, 4884, 11088, 4883, 11089, RCHAR, 1595, RCHAR, 4885, 2734, 4887, 3200, 11090, 4886, 11091, 3872, 11092, RCHAR, RCHAR, 11093, 2718, 3442, 11094, 11095, RCHAR, 4888, 11096, RCHAR, 11097, 11098, 2260, RCHAR, RCHAR, RCHAR, 4889, 3572, 3727, 4090, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3576, 11099, 11100, 4898, 11101, RCHAR, RCHAR, RCHAR, 11102, 1903, RCHAR, 11103, 4172, 11104, RCHAR, 4056, RCHAR, 4993, RCHAR, 4890, RCHAR, 11105, RCHAR, RCHAR, RCHAR, 4893, 11106, 3138, RCHAR, 11107, 3971, RCHAR, RCHAR, RCHAR, 3425, 11108, 11109, 11110, 11111, RCHAR, 4894, 11112, RCHAR, RCHAR, RCHAR, 11113, RCHAR, 4016, 11114, 2391, 11115, RCHAR, 2735, RCHAR, RCHAR, 11116, RCHAR, 11117, 11118, RCHAR, 4895, RCHAR, 11119, 2491, 11120, 2490, RCHAR, 11121, RCHAR, RCHAR, 1434, 2201, 11122, 2924, 1458, RCHAR, RCHAR, RCHAR, RCHAR, 4899, 4900, RCHAR, 4897, 11123, 11124, 11125, RCHAR, RCHAR, RCHAR, 11126, 11127, 1527, 1800, 11128, 4896, RCHAR, 4078, 3776, RCHAR, RCHAR, 11129, 11130, RCHAR, 11131, 11132, RCHAR, 11133, RCHAR, 1417, 11134, RCHAR, RCHAR, RCHAR, 1498, RCHAR, RCHAR, RCHAR, 2492, 11135, 1459, RCHAR, 1412, 11136, RCHAR, RCHAR, RCHAR, RCHAR, 4905, RCHAR, RCHAR, 11137, 11138, 11139, RCHAR, RCHAR, 4903, 11140, 11141, RCHAR, RCHAR, RCHAR, RCHAR, 4069, RCHAR, 4906, RCHAR, 4904, RCHAR, 11142, 4902, 2836, RCHAR, RCHAR, 11143, 11144, 4901, RCHAR, 11145, 11146, 3911, 11147, RCHAR, RCHAR, 11148, RCHAR, 2229, 11149, RCHAR, RCHAR, RCHAR, RCHAR, 4910, 4911, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2736, RCHAR, RCHAR, RCHAR, 4907, 4335, RCHAR, RCHAR, 11150, 11151, 3615, 11152, 11153, 4909, RCHAR, RCHAR, 11154, RCHAR, RCHAR, RCHAR, 11155, RCHAR, RCHAR, RCHAR, RCHAR, 11156, RCHAR, RCHAR, RCHAR, RCHAR, 2356, RCHAR, RCHAR, RCHAR, 11157, RCHAR, RCHAR, RCHAR, 4912, 11158, RCHAR, 11159, 3815, 11160, RCHAR, RCHAR, 4913, RCHAR, 4908, 11161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11162, RCHAR, RCHAR, 11163, 11164, RCHAR, RCHAR, 11165, 4068, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11166, RCHAR, RCHAR, RCHAR, RCHAR, 11167, RCHAR, 3633, 11168, RCHAR, RCHAR, 11169, RCHAR, RCHAR, 11170, 4914, 3777, 11171, RCHAR, 11172, 11173, 11174, RCHAR, 11175, RCHAR, RCHAR, RCHAR, RCHAR, 11176, RCHAR, RCHAR, RCHAR, RCHAR, 11177, RCHAR, RCHAR, RCHAR, RCHAR, 11178, 11179, 11180, RCHAR, 11181, RCHAR, RCHAR, 11182, RCHAR, 11183, 11184, 4915, 4919, 4916, 11185, RCHAR, 1636, 4918, RCHAR, 11186, RCHAR, 11187, RCHAR, 11188, 2564, RCHAR, 4917, 2156, RCHAR, RCHAR, 11189, 4931, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4924, 4921, RCHAR, RCHAR, 11190, RCHAR, 11191, RCHAR, RCHAR, RCHAR, 11192, 3263, RCHAR, 4920, RCHAR, 11193, 4922, RCHAR, RCHAR, 4923, 11194, RCHAR, RCHAR, RCHAR, 11195, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11196, 11197, RCHAR, RCHAR, RCHAR, 4925, 4926, RCHAR, 11198, RCHAR, RCHAR, 11199, 11200, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11201, 1867, RCHAR, 4928, 4927, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4929, 11202, RCHAR, 11204, RCHAR, 11205, RCHAR, 11206, RCHAR, RCHAR, RCHAR, 11207, 2803, RCHAR, RCHAR, 11208, RCHAR, RCHAR, RCHAR, RCHAR, 4932, RCHAR, 3349, 11209, RCHAR, RCHAR, 1540, RCHAR, 4930, RCHAR, 11203, RCHAR, 4933, RCHAR, 11210, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4934, RCHAR, 4937, 11211, RCHAR, 4935, RCHAR, 4936, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11212, 11213, RCHAR, RCHAR, RCHAR, 2493, 4938, 11214, RCHAR, 2261, 4939, 11215, 2533, 3125, RCHAR, 4940, 4941, 2501, 2262, 11216, 4091, RCHAR, RCHAR, RCHAR, 1887, 2202, 4942, 1747, RCHAR, 11217, 4943, RCHAR, 3126, RCHAR, RCHAR, 11218, 11219, 4944, 4984, RCHAR, 4945, RCHAR, 4946, RCHAR, RCHAR, 4947, RCHAR, 4949, RCHAR, 11220, 11221, 11222, 11223, 4950, 11224, RCHAR, 4951, 11225, 3181, 11226, 1510, 2610, 1443, 11227, 3062, 1801, 2558, 11228, 2263, 11229, 11230, RCHAR, 11231, 11232, 3453, 11233, 2632, 1802, 3267, 3363, 1433, 1904, 3938, RCHAR, 2571, RCHAR, RCHAR, 1929, 2988, 2565, 4143, 4952, RCHAR, 11234, 11235, RCHAR, RCHAR, 11236, 11237, 1939, 11238, 2392, 11239, 11240, 1709, 1570, 2737, 1637, 11241, 4953, 4173, 11242, RCHAR, 11243, RCHAR, RCHAR, 2672, 11244, 11245, 2605, 4954, 1868, 3527, 4050, 4955, RCHAR, 4956, RCHAR, RCHAR, 3816, 11246, RCHAR, 11247, 4958, RCHAR, 1793, 2060, 4957, RCHAR, 11248, 11249, 11250, 11251, 11252, 1803, RCHAR, 2837, 4962, 2444, 11253, 1638, 4961, RCHAR, 4959, 4963, 4960, 3582, 5590, 2838, RCHAR, 4964, RCHAR, RCHAR, 4261, 11254, 4965, 11255, RCHAR, 4967, 11256, 3289, 4966, RCHAR, 2916, RCHAR, 2534, RCHAR, RCHAR, 11257, 3149, 2624, RCHAR, 3844, 2989, RCHAR, 2582, 4968, 2738, 4969, 4970, 1460, 3127, 2869, 11258, 4971, 3496, 2739, RCHAR, 2740, RCHAR, 4972, RCHAR, RCHAR, 2990, 11259, RCHAR, RCHAR, 2741, RCHAR, RCHAR, RCHAR, 11260, 11261, 4973, RCHAR, 4974, 11262, 4105, RCHAR, 11263, RCHAR, 4975, 11264, RCHAR, 11265, 11266, 2011, 11267, RCHAR, 11268, 2633, 11269, RCHAR, RCHAR, 11270, 11271, RCHAR, 4976, 4977, 2597, 2831, 3561, 2871, 3753, 3573, 2014, 4978, RCHAR, RCHAR, RCHAR, 1958, 4979, RCHAR, 2067, RCHAR, 3524, 1613, RCHAR, 2494, 4980, 4983, 4982, 2066, RCHAR, 4981, RCHAR, 3407, RCHAR, RCHAR, RCHAR, 11272, 11273, RCHAR, 11274, RCHAR, 3117, RCHAR, 3426, 2577, 11275, 11276, 3063, 4225, RCHAR, 11277, 11278, 11279, RCHAR, RCHAR, 4985, 11280, 4986, 3531, 11281, 2462, RCHAR, RCHAR, 11282, 11283, 4988, RCHAR, RCHAR, 4989, 11284, 11285, 11286, 11287, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11288, 11289, RCHAR, 11290, RCHAR, 4990, RCHAR, RCHAR, 11291, 1869, 4991, 11292, RCHAR, 4992, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11293, RCHAR, 11294, 11295, 1609, 11296, 11297, RCHAR, RCHAR, 11298, RCHAR, 3034, 1853, 11299, 4994, 4049, RCHAR, RCHAR, RCHAR, RCHAR, 3151, 11300, 1748, 11301, 11302, 4996, 4998, 1848, RCHAR, 11303, 4995, 4997, RCHAR, 5000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4999, RCHAR, 5001, RCHAR, 11304, RCHAR, 11305, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11306, RCHAR, RCHAR, RCHAR, RCHAR, 11308, RCHAR, 5002, RCHAR, RCHAR, RCHAR, 11307, RCHAR, RCHAR, 3506, 1987, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1666, 5003, 5008, RCHAR, RCHAR, 5006, 11309, 3940, 3939, 11310, 11311, RCHAR, 11312, RCHAR, 3454, RCHAR, RCHAR, RCHAR, 5005, 2683, RCHAR, 5004, RCHAR, RCHAR, RCHAR, 11313, RCHAR, RCHAR, RCHAR, RCHAR, 11314, 2901, RCHAR, RCHAR, RCHAR, 5009, RCHAR, 11315, 2423, RCHAR, RCHAR, 5015, 11316, RCHAR, 5016, 5010, 1710, 5011, 5020, 5019, 5018, 5014, RCHAR, RCHAR, RCHAR, 5013, RCHAR, RCHAR, 5017, 11318, 11319, RCHAR, 11320, 11321, RCHAR, 3941, RCHAR, 11317, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11322, RCHAR, RCHAR, 11323, RCHAR, RCHAR, RCHAR, RCHAR, 11324, RCHAR, RCHAR, RCHAR, 11325, RCHAR, 11326, RCHAR, RCHAR, 11327, 11328, RCHAR, RCHAR, 11329, RCHAR, 11330, RCHAR, 11334, 5024, 5021, RCHAR, 5023, RCHAR, 4217, 11332, 5022, RCHAR, RCHAR, 11331, RCHAR, RCHAR, RCHAR, 11333, RCHAR, RCHAR, 5012, RCHAR, RCHAR, 11335, 11336, 11337, 11338, RCHAR, 11339, RCHAR, RCHAR, RCHAR, RCHAR, 2902, 11340, RCHAR, 5025, 11341, RCHAR, 2372, 11342, RCHAR, RCHAR, 5026, RCHAR, RCHAR, 5027, RCHAR, RCHAR, 11343, 11344, RCHAR, RCHAR, RCHAR, 11345, 11346, RCHAR, 11347, 5030, 11348, 5029, RCHAR, RCHAR, 5028, 11349, RCHAR, 11350, 3455, 5007, RCHAR, RCHAR, RCHAR, 5036, RCHAR, 11351, 11352, 11353, 11354, RCHAR, RCHAR, RCHAR, 11355, RCHAR, 11356, RCHAR, 5032, RCHAR, 11357, 11358, RCHAR, 5031, RCHAR, RCHAR, RCHAR, RCHAR, 11359, RCHAR, RCHAR, RCHAR, 11360, 5033, RCHAR, 5034, RCHAR, 11361, RCHAR, 15405, RCHAR, 11362, RCHAR, RCHAR, 5037, 11363, 11364, 4299, RCHAR, 5038, 5035, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11365, RCHAR, RCHAR, RCHAR, 11366, RCHAR, 5039, RCHAR, 11367, 1849, 5040, 11369, RCHAR, 11368, RCHAR, 5042, 5041, RCHAR, RCHAR, 5043, RCHAR, 11370, 11371, RCHAR, 5044, RCHAR, 2991, 2634, RCHAR, 11372, 2699, RCHAR, 3074, 11373, 2264, 2373, 2265, 1959, 11374, RCHAR, 5045, RCHAR, RCHAR, 2374, RCHAR, RCHAR, 2203, 5046, 4047, 3606, 5047, RCHAR, 2266, 11375, 11376, RCHAR, 1797, RCHAR, 3202, 2023, RCHAR, 11377, RCHAR, 2495, 3818, RCHAR, RCHAR, 3698, 11378, RCHAR, RCHAR, RCHAR, 5048, 1870, 11379, RCHAR, RCHAR, RCHAR, 5051, 11380, RCHAR, 11381, 11382, 3290, RCHAR, 11383, 5050, 5049, 5052, RCHAR, 3364, RCHAR, 11384, 11385, RCHAR, RCHAR, RCHAR, RCHAR, 2886, RCHAR, RCHAR, 11387, RCHAR, RCHAR, 2496, RCHAR, 2955, 11386, 3152, 1881, RCHAR, 11388, 3291, RCHAR, 11389, 5053, 5054, 2804, RCHAR, RCHAR, RCHAR, RCHAR, 3972, 11390, RCHAR, 5057, RCHAR, RCHAR, 5056, 5055, 3852, RCHAR, 5064, RCHAR, 11393, RCHAR, 11391, 4005, RCHAR, 5058, RCHAR, 11392, 11394, RCHAR, RCHAR, 5060, 4022, 11395, 5059, 11396, RCHAR, RCHAR, 11397, 11398, RCHAR, 11399, 5061, RCHAR, 3673, 5062, 3883, 5063, RCHAR, RCHAR, RCHAR, 11400, RCHAR, 11401, 11402, 11403, 11404, 11405, RCHAR, 11406, RCHAR, 1804, 3884, 3586, 5065, 5066, RCHAR, 2267, 1805, 5067, 2185, 4171, 4144, 1871, 5069, 11407, 3292, RCHAR, 2268, 2742, RCHAR, RCHAR, 3728, RCHAR, RCHAR, 2743, 11408, RCHAR, RCHAR, 11409, 2719, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3365, 3942, 3408, RCHAR, RCHAR, 2269, RCHAR, 3819, RCHAR, RCHAR, RCHAR, 5070, RCHAR, 11410, RCHAR, 11411, 11412, 3440, 2383, 11413, RCHAR, 11414, 2204, 11415, 3366, RCHAR, RCHAR, RCHAR, 11416, RCHAR, 11417, RCHAR, 1444, 2709, 2270, 4174, RCHAR, RCHAR, RCHAR, RCHAR, 11418, 11419, 11420, RCHAR, 5071, 5072, 3620, RCHAR, RCHAR, 11421, RCHAR, 5073, 4316, 4336, 11423, 11422, RCHAR, 11424, 5075, 5074, 11425, 11426, 1730, 11427, 11428, 5076, RCHAR, RCHAR, RCHAR, 5079, 5080, 11429, 5078, 11430, 3791, 2744, 5082, 5081, 5077, RCHAR, 11431, RCHAR, RCHAR, 5083, 5084, RCHAR, 11432, 5085, RCHAR, RCHAR, RCHAR, 5088, 5086, RCHAR, 5087, 5089, RCHAR, 1571, 3367, 5090, RCHAR, 2157, 1683, 3593, RCHAR, 5091, 3568, RCHAR, 3912, 11433, 5092, 4337, RCHAR, 11434, 11435, 11436, 5093, 3885, 5096, 4418, 4434, 11437, 2553, 3562, 5097, RCHAR, 1940, 3293, 1499, 5098, 3859, 2271, 11438, RCHAR, 3243, 11439, 11440, RCHAR, 3368, RCHAR, 11441, 11442, 11443, 11444, 4120, 2186, 2205, 11445, 5099, RCHAR, 11446, 11447, 5100, 11448, 5106, 11449, 2606, RCHAR, RCHAR, 11450, 3294, 11451, 1988, 5101, RCHAR, RCHAR, 11452, 3770, 11453, 3233, 11454, 11455, 5102, RCHAR, RCHAR, 11456, 11457, RCHAR, 11458, 5103, RCHAR, 1989, RCHAR, 5104, 11459, 5105, RCHAR, 11460, 5107, RCHAR, 3469, 11461, RCHAR, 5108, 5109, 11462, 5110, RCHAR, 11463, 5095, 5094, RCHAR, RCHAR, 11464, 5111, 2100, 11465, 11466, RCHAR, 3766, 11467, RCHAR, 2393, 3782, 3295, 3802, 5112, RCHAR, 11468, 2745, 1541, 11469, 5113, 11470, 11471, RCHAR, 5114, 11472, 4123, 11473, RCHAR, 3729, 11474, 11475, 5117, 1596, 2925, 5116, 5115, 2101, 3153, RCHAR, 5121, 5119, 11476, 5118, 4236, 2230, 11477, RCHAR, 11478, 2720, 5120, 3427, 2661, RCHAR, RCHAR, 11479, 3509, 5124, 5123, RCHAR, RCHAR, 11480, 11481, 5122, RCHAR, 5125, 2231, 11482, RCHAR, 11485, RCHAR, RCHAR, 11483, 5126, 3851, 2690, 11484, 11486, 5127, 3754, 11487, 11488, 11489, RCHAR, 3510, 3296, RCHAR, RCHAR, RCHAR, 11490, 3399, RCHAR, RCHAR, 5128, 1890, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2839, 11491, 3771, RCHAR, 11492, 11493, 11494, RCHAR, 11495, 1872, 3577, RCHAR, RCHAR, 11496, 11497, 11498, 11499, 11500, RCHAR, 5129, 2497, 3973, 3974, RCHAR, RCHAR, 1597, 5134, 11501, RCHAR, 3268, 11502, 11503, RCHAR, 5131, RCHAR, RCHAR, RCHAR, 11504, 11505, 11506, 1684, 11507, 11508, 11509, 11510, 5182, 5133, 11511, 11512, RCHAR, 3587, 11513, RCHAR, 5132, RCHAR, 11514, 5130, 11515, 2345, RCHAR, 5136, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11516, RCHAR, RCHAR, 11517, RCHAR, RCHAR, 11518, 5142, 5148, 5140, RCHAR, 3443, 11519, 11520, 5145, 3820, 11521, 11522, 5139, 11523, 5144, 4300, 2498, RCHAR, 11524, 3154, 5137, RCHAR, RCHAR, 11525, 1941, 5147, 2926, 1572, 5141, 1685, 5146, RCHAR, 11526, RCHAR, 1990, RCHAR, 5143, RCHAR, 11527, RCHAR, 11528, RCHAR, RCHAR, RCHAR, RCHAR, 5149, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11529, 5151, 5161, 5159, RCHAR, RCHAR, 5156, 11530, 11531, 11532, 5155, 4317, 11533, 5157, RCHAR, RCHAR, 1991, 11534, 2272, RCHAR, 11535, 2721, 11536, 11537, RCHAR, 5164, 5150, RCHAR, RCHAR, 11538, RCHAR, 5154, 5138, 11539, 1687, 5158, 5160, 3244, RCHAR, 11540, 2357, 1621, 5152, 5163, 5162, 1992, RCHAR, 3110, 1761, 11541, RCHAR, RCHAR, RCHAR, 2102, RCHAR, 5153, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11542, 11543, RCHAR, 5165, 11544, 5168, 5170, RCHAR, 11545, RCHAR, 11546, 2566, 11547, 5176, 3369, 5166, 11548, RCHAR, RCHAR, 11549, 5174, 11550, 1686, 11551, 5172, 5173, 11552, RCHAR, 5169, 5171, RCHAR, 11553, 11554, 2232, 4145, RCHAR, 11555, 1806, 11556, 11557, 1560, 5175, 11558, 3597, 1422, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11559, 11560, 3730, 5135, 5181, 5185, 4110, 11561, 5178, RCHAR, RCHAR, 11562, 3456, 5183, 11563, RCHAR, RCHAR, RCHAR, 11564, RCHAR, 11565, 2805, 5184, 3532, 11566, 11567, 11568, 11569, RCHAR, RCHAR, 11570, 11571, RCHAR, 4362, RCHAR, 5180, 11572, 11573, RCHAR, RCHAR, 5186, 11574, 2346, 11575, 2956, 11576, 11577, 1461, 5179, 5177, 11578, 3065, RCHAR, 11579, RCHAR, 5167, 2463, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3139, 5198, 11580, 3066, 5193, 11581, 5190, 5191, 11582, 2607, 5194, 5197, 11583, 11584, RCHAR, RCHAR, 5192, 2636, 11585, 5195, RCHAR, RCHAR, 5189, 11586, 4133, 4132, 11587, RCHAR, 11588, 5199, 5200, 1462, 11589, 11590, 11591, 11592, 11593, 5188, 11594, 11595, RCHAR, 11596, 2055, 1415, 11597, RCHAR, 11598, 1807, RCHAR, 5196, 11599, RCHAR, RCHAR, RCHAR, RCHAR, 5204, 5203, RCHAR, 11600, 11601, 5208, RCHAR, RCHAR, RCHAR, 11602, 11603, RCHAR, RCHAR, 5209, 11604, 11605, 11606, RCHAR, 11607, RCHAR, RCHAR, 5207, 5210, 5202, 5206, RCHAR, 11608, 5211, RCHAR, 5212, 11609, 11610, 5201, 2535, 11611, 5205, 3155, 2273, 5187, 2840, RCHAR, RCHAR, RCHAR, RCHAR, 5225, RCHAR, 3926, RCHAR, RCHAR, 5215, 5216, 5217, RCHAR, RCHAR, 5224, 11612, 5223, 11613, RCHAR, 4040, 1808, RCHAR, 5221, RCHAR, 2104, 1711, RCHAR, RCHAR, 5218, 11614, RCHAR, 4253, 5220, 1463, 5222, 11615, 5213, 5219, 5226, 2103, 5214, 11616, RCHAR, RCHAR, 11617, 11618, RCHAR, 4196, 11619, 11620, 11621, 4146, 11622, 11623, RCHAR, RCHAR, 5229, RCHAR, RCHAR, 5233, 11624, RCHAR, 11625, 3101, RCHAR, 4318, 5234, 11626, 11627, 5231, RCHAR, 5228, 11628, 11629, 5227, 5232, RCHAR, 11630, 11631, RCHAR, 11632, 11633, RCHAR, RCHAR, RCHAR, 3869, 11634, RCHAR, 3497, 11635, 2105, 11636, 5235, 5230, 11637, 5236, RCHAR, RCHAR, RCHAR, 2158, RCHAR, RCHAR, RCHAR, 1614, RCHAR, 11638, 11639, 5244, RCHAR, 11640, RCHAR, 1809, RCHAR, 11641, 11642, 11643, 5242, RCHAR, RCHAR, 5243, 2358, 5241, 5239, 5238, 5245, 5237, 5247, 11644, 11645, 1688, RCHAR, RCHAR, RCHAR, RCHAR, 11646, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11647, 11648, 11649, 11650, RCHAR, 11651, 11652, 5249, RCHAR, 11655, 5248, 11653, RCHAR, 11654, RCHAR, RCHAR, 11656, 11657, RCHAR, 11658, RCHAR, RCHAR, 3297, RCHAR, 5252, RCHAR, 5250, 5240, 2159, RCHAR, 5251, RCHAR, 5255, 5254, 5256, 5253, 5257, 11659, RCHAR, 11660, 11661, RCHAR, RCHAR, 11662, 5258, 5259, 3927, RCHAR, 5261, 5260, 2662, RCHAR, 2927, 1667, 1689, 11663, 5262, 11664, 1440, RCHAR, RCHAR, RCHAR, 2957, 5263, 11665, 7084, 5264, 2132, 11666, 5265, 11667, 11668, RCHAR, RCHAR, 2992, 11669, RCHAR, 11670, 5266, 11671, RCHAR, RCHAR, 5267, 1905, 5268, RCHAR, 5269, 5270, 3156, RCHAR, RCHAR, RCHAR, 2206, 11672, RCHAR, 4106, RCHAR, 11673, RCHAR, 3975, 2705, 5271, 11674, 11675, 11676, RCHAR, 11677, 2993, 7266, 3731, RCHAR, 2611, 11678, 2394, 5272, RCHAR, 11679, 11680, 11681, 3140, 11682, 3860, 11683, RCHAR, 3182, RCHAR, 11684, 5275, 11685, RCHAR, 5273, RCHAR, 5276, RCHAR, RCHAR, 5274, 11686, RCHAR, RCHAR, RCHAR, 5277, RCHAR, RCHAR, RCHAR, RCHAR, 11687, 3870, 11688, RCHAR, 1432, RCHAR, 11689, RCHAR, RCHAR, 3821, RCHAR, RCHAR, 3732, 11690, RCHAR, 5278, 11691, 5281, 2746, 1906, RCHAR, 5279, 5286, 2747, RCHAR, RCHAR, RCHAR, RCHAR, 5280, 3607, RCHAR, RCHAR, 11692, 11693, 11694, 11695, 4197, 5282, 5283, 5287, 3457, 5284, 2274, 2975, RCHAR, RCHAR, 5301, 3685, RCHAR, 3183, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11696, RCHAR, 11697, RCHAR, RCHAR, 3733, 5370, RCHAR, RCHAR, RCHAR, RCHAR, 3943, RCHAR, 11698, RCHAR, 3370, 11699, 11700, RCHAR, 4032, 11701, 5290, 1598, 3269, 11702, 11703, RCHAR, RCHAR, 5299, RCHAR, 11704, 3215, 5293, 5300, 5295, 5302, 5298, RCHAR, 5297, 3650, 11705, 5291, 1690, 5289, 1960, 3184, 5285, 11706, 11707, 5288, 2275, 2972, 11708, 2748, 5296, 3621, RCHAR, RCHAR, 1961, 1731, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11709, RCHAR, 1762, 2820, 5304, 5309, RCHAR, 5305, 11710, 2160, 11711, 5310, 2445, 2328, RCHAR, RCHAR, RCHAR, RCHAR, 11712, 11713, 2637, 5292, RCHAR, 2536, 5307, 11714, 11715, RCHAR, RCHAR, 2499, 5308, 1445, 11716, 11717, 5303, 11718, RCHAR, RCHAR, 11719, 3298, RCHAR, 11720, RCHAR, RCHAR, 11721, RCHAR, 11722, 1962, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1993, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5306, 1416, 11723, 11724, 2384, RCHAR, 11725, RCHAR, 2841, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11726, 11727, RCHAR, RCHAR, 11728, 3371, RCHAR, 11729, 3717, 5312, 3069, RCHAR, 11730, 11731, 11732, 11733, RCHAR, 11734, RCHAR, RCHAR, 3111, 11735, 11736, 2454, 5313, 11737, 5315, 5311, RCHAR, 11738, 11739, 11740, 3918, RCHAR, 3318, 11741, RCHAR, RCHAR, 11742, 3067, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11743, 11744, 3944, 2583, 5327, RCHAR, 5326, 11745, 11746, 2907, RCHAR, RCHAR, 11747, 2161, RCHAR, 11748, 11749, 5320, 2750, 11750, RCHAR, 3549, 3588, 11751, 11752, RCHAR, 11753, 5318, RCHAR, 11754, 3068, 11755, RCHAR, RCHAR, 11756, 2625, 5323, 11757, RCHAR, 2749, RCHAR, 5317, 5322, 11758, RCHAR, 3622, RCHAR, 11759, 11760, 5316, RCHAR, 2068, 11761, 11762, 1752, RCHAR, RCHAR, 11763, 5324, 4240, 2395, 3216, 5321, 11764, 2973, 11765, 2276, 2887, 1573, 3035, 5319, 1916, 11766, 11767, 11768, RCHAR, RCHAR, 2106, RCHAR, 3336, 5325, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3070, RCHAR, 11769, 5328, RCHAR, 5330, 11770, RCHAR, 3124, 5336, 11771, 5331, RCHAR, 11772, 5333, RCHAR, RCHAR, RCHAR, RCHAR, 11773, 3792, 3372, 11774, 5334, 11775, 11776, 11777, 4147, RCHAR, RCHAR, RCHAR, 4175, 1810, 11778, RCHAR, RCHAR, RCHAR, 11779, 1423, RCHAR, 5332, RCHAR, 11780, RCHAR, RCHAR, RCHAR, 5329, 11781, RCHAR, 11782, RCHAR, 1873, RCHAR, RCHAR, RCHAR, 11783, 11784, 1574, 11785, 5335, RCHAR, 11786, 11787, 4176, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5339, RCHAR, RCHAR, 11788, 11789, RCHAR, RCHAR, 3128, RCHAR, 5346, 11790, RCHAR, 11791, 5340, 11792, RCHAR, 5337, 5344, 11793, RCHAR, RCHAR, RCHAR, 5314, RCHAR, 11794, RCHAR, 11795, RCHAR, 11796, RCHAR, 11797, 11798, 5341, RCHAR, 5345, 11799, 11800, RCHAR, 3699, 3458, RCHAR, 11801, 11802, RCHAR, RCHAR, RCHAR, 5338, 11803, 5342, RCHAR, RCHAR, RCHAR, 2107, RCHAR, RCHAR, 11804, 2430, 11805, RCHAR, RCHAR, 2974, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11806, RCHAR, RCHAR, 5350, 11807, RCHAR, 11808, 11809, 11810, 11811, RCHAR, RCHAR, RCHAR, 3389, RCHAR, 11812, 11813, 11814, 11815, RCHAR, 11816, 11817, 11818, RCHAR, 11819, RCHAR, RCHAR, RCHAR, 5347, RCHAR, 4011, RCHAR, RCHAR, RCHAR, 11820, RCHAR, 5348, RCHAR, RCHAR, RCHAR, 11821, 11822, RCHAR, 5349, RCHAR, 4087, RCHAR, 2915, 11823, RCHAR, 11824, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2133, RCHAR, 11825, RCHAR, 11826, 5356, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11827, 11828, 11829, 2464, 5353, RCHAR, 5352, RCHAR, RCHAR, 11830, 11831, 3589, 11832, RCHAR, 11833, 3498, 11834, RCHAR, 11835, RCHAR, 11836, 3400, 5354, 11837, RCHAR, 11838, 5355, RCHAR, 3838, 11839, 3608, 2446, RCHAR, 2994, RCHAR, 3995, 11840, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1732, RCHAR, 5362, 5357, 11841, 11842, 11843, RCHAR, 4177, 5364, RCHAR, 11844, 5360, RCHAR, 5361, RCHAR, 11845, 11846, 11847, 11848, 3071, 11849, RCHAR, 11850, 11851, 5359, RCHAR, 5294, 11852, RCHAR, 11853, 5363, RCHAR, 5358, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5368, 5369, 3390, 5371, 11854, 11855, 2447, 5366, RCHAR, 11856, 11857, RCHAR, 1907, 11858, RCHAR, 5372, 11859, 5365, 5376, RCHAR, 5375, 11860, 5374, 11861, RCHAR, RCHAR, 5377, 11862, RCHAR, 5379, 2806, 11863, 5378, 11864, RCHAR, RCHAR, 11865, 5382, RCHAR, RCHAR, 11866, 11867, 11868, RCHAR, RCHAR, RCHAR, RCHAR, 11869, RCHAR, RCHAR, RCHAR, 11870, 11871, RCHAR, 11872, RCHAR, 5380, 11873, RCHAR, 11874, 5381, 5343, 11875, 11876, RCHAR, RCHAR, 11877, 5384, 5383, RCHAR, 11878, RCHAR, RCHAR, 11879, 5351, 5385, 5373, RCHAR, 11880, 2500, RCHAR, 11881, RCHAR, RCHAR, 5386, 5387, 5389, 5388, 5390, 1691, 11882, 2277, 11883, 11884, 3945, 2928, RCHAR, RCHAR, RCHAR, 11885, RCHAR, 2207, RCHAR, 11886, 5392, 11887, RCHAR, RCHAR, RCHAR, 5395, RCHAR, 3809, 11888, 1942, 11889, RCHAR, 11890, 5394, 5393, 3623, 5396, 1994, RCHAR, RCHAR, RCHAR, 5398, 5397, 11891, 11892, RCHAR, 1811, 2465, RCHAR, RCHAR, 3533, 11893, RCHAR, RCHAR, RCHAR, 11894, 2108, RCHAR, RCHAR, RCHAR, 2903, RCHAR, 5399, RCHAR, 2929, 3391, RCHAR, 3822, 5400, RCHAR, 11895, RCHAR, RCHAR, 11896, RCHAR, RCHAR, RCHAR, 11897, 5401, 5402, RCHAR, 11898, RCHAR, 3877, 4948, 2951, 11899, RCHAR, 3803, RCHAR, 2405, RCHAR, 3734, 3700, 11900, RCHAR, RCHAR, 11901, RCHAR, 3428, 11902, 4262, RCHAR, 5404, 2585, 11903, RCHAR, 5405, 11904, 1431, RCHAR, 11905, 2025, 2958, 11906, 3823, RCHAR, RCHAR, RCHAR, 5406, 2477, 3234, 11907, 2502, 2842, RCHAR, 11908, 11909, 11910, RCHAR, RCHAR, 5407, RCHAR, 3946, RCHAR, RCHAR, 1590, 2503, RCHAR, 11911, RCHAR, 5410, 11912, 5408, 5411, 4254, 5409, RCHAR, 11913, 11914, RCHAR, 3004, 5412, RCHAR, 11915, 3119, 11916, RCHAR, 5413, RCHAR, 11917, RCHAR, 11918, 1875, 11919, 5415, RCHAR, 5414, RCHAR, RCHAR, RCHAR, 11920, 5416, 5417, 1876, RCHAR, RCHAR, 3569, 3217, 1955, 2504, 3072, RCHAR, RCHAR, 2691, 1425, RCHAR, RCHAR, 11921, 5418, 11922, RCHAR, 11923, 11924, RCHAR, RCHAR, RCHAR, 11925, 1599, 5422, RCHAR, RCHAR, 11926, 11927, 11928, RCHAR, 2278, 5421, 11929, RCHAR, 2360, 2751, 11930, 11931, 5420, RCHAR, 2752, 11932, 4073, 2359, RCHAR, 11933, 11934, 1464, 2959, 11935, 11936, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5427, 11937, 11938, 2930, 1542, 11939, 11940, 11941, 11942, 2684, 11943, 4017, 2431, 11944, 11945, 11946, 11947, 2753, 11948, 2920, 11949, 11950, RCHAR, 11951, 5426, 5424, 5425, 11953, RCHAR, 11952, RCHAR, RCHAR, 3270, RCHAR, RCHAR, 5457, 11954, 5431, 2537, 2279, 5429, 11955, 11956, RCHAR, RCHAR, 5430, 11957, 2843, 11958, RCHAR, 11960, 5428, RCHAR, 11959, 2458, RCHAR, RCHAR, RCHAR, RCHAR, 11961, 11962, 11963, RCHAR, 11964, 11965, 5433, 5432, 5437, 11966, 11967, 5438, RCHAR, 5434, RCHAR, 1693, 5435, 5436, 3718, 11969, 11970, 11971, RCHAR, 3824, 2109, 5439, RCHAR, RCHAR, 11973, 2931, 11974, 2754, 11976, 11977, 11978, 3245, 11979, 11981, RCHAR, 11972, 11975, 11980, 2012, RCHAR, 5440, 5444, RCHAR, RCHAR, 1640, 5441, 5443, RCHAR, 11982, 11983, 11984, 5442, RCHAR, 11985, 2706, 11986, RCHAR, RCHAR, RCHAR, 3235, 1446, 5445, 11987, 11988, 11989, 11990, 5446, RCHAR, 11991, 11992, RCHAR, 3299, RCHAR, 11993, RCHAR, 4310, RCHAR, RCHAR, RCHAR, RCHAR, 2478, RCHAR, 11994, 3928, RCHAR, RCHAR, 11995, 11996, RCHAR, 3976, 11997, RCHAR, RCHAR, 5453, 5448, RCHAR, 11998, 5451, RCHAR, 5450, 11999, 12000, 5447, 12001, 12002, 5452, RCHAR, RCHAR, 3539, 12003, 5449, RCHAR, RCHAR, 12004, RCHAR, 12005, 12006, RCHAR, RCHAR, RCHAR, RCHAR, 12007, RCHAR, 5454, RCHAR, RCHAR, 2707, 5455, 12008, 4178, 3659, RCHAR, 12009, 5456, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5458, RCHAR, 12010, 5459, RCHAR, 12011, 12012, RCHAR, 12013, RCHAR, 5460, RCHAR, 2015, 1543, 2280, 5461, RCHAR, 5462, 2712, 3073, 12014, 11968, 4661, 3037, 3036, 3157, 2388, RCHAR, RCHAR, 4499, RCHAR, 12015, RCHAR, 12016, 2145, 4148, RCHAR, 3947, RCHAR, 3853, 12017, 5463, RCHAR, RCHAR, RCHAR, 12018, 2432, 3320, 5464, 4338, RCHAR, 12019, RCHAR, 3977, 12020, 3300, 5465, 1877, 12021, RCHAR, 12022, RCHAR, RCHAR, RCHAR, 5466, 5467, 4099, RCHAR, 4045, 4033, 4007, 2448, 5469, RCHAR, RCHAR, 2612, RCHAR, 12023, 3996, RCHAR, 5471, 5474, 5473, RCHAR, 1874, RCHAR, RCHAR, 1943, 12024, 5470, RCHAR, 5472, RCHAR, RCHAR, RCHAR, 12025, 5475, 12026, 12027, 2908, RCHAR, RCHAR, 12028, RCHAR, 4226, 1450, 2413, 3129, RCHAR, 2598, 12029, 12030, 2808, RCHAR, RCHAR, 5478, RCHAR, RCHAR, 3429, 12031, 5476, 3112, 5477, 2807, 4102, 5479, 5480, 4207, 12032, RCHAR, RCHAR, RCHAR, 5485, RCHAR, 12033, 2281, 12034, 3624, 5482, 3459, 5419, 5423, 12035, 1926, 12036, 3610, RCHAR, RCHAR, RCHAR, 12037, 5484, RCHAR, 2755, 3701, RCHAR, 12038, RCHAR, RCHAR, 12039, 5490, RCHAR, 3755, RCHAR, 5481, RCHAR, 5487, 5486, RCHAR, 12040, 12041, 2960, 12042, RCHAR, 12043, RCHAR, 4024, 12044, 4280, 12045, 12046, 4018, 12047, 1641, 2505, RCHAR, RCHAR, 4363, 5489, 2904, RCHAR, RCHAR, RCHAR, 5488, RCHAR, RCHAR, 5483, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2208, 12048, 12049, 12050, 5495, 5493, 12051, 1642, 5491, 5497, 5503, RCHAR, 12052, 12053, 12054, RCHAR, RCHAR, 12056, 3141, 12057, 12058, 3886, 12059, 5505, RCHAR, 12060, 12061, 3761, RCHAR, RCHAR, RCHAR, 5504, 3651, 3978, 1812, 12062, 3000, 2663, RCHAR, RCHAR, 12063, 3340, 12064, 4149, RCHAR, 12065, 5500, 5499, RCHAR, RCHAR, 12066, 5501, RCHAR, 5498, RCHAR, 12067, 5506, RCHAR, 5496, RCHAR, RCHAR, 5494, RCHAR, 5502, 5492, 12068, 3271, 12069, 4129, 2575, 2433, 12070, 12071, RCHAR, 12055, RCHAR, 2375, RCHAR, RCHAR, 4026, 1724, RCHAR, RCHAR, 3335, 3519, 1544, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2995, 12073, RCHAR, 2933, 2077, RCHAR, 12074, RCHAR, RCHAR, RCHAR, 12075, 5508, 12076, RCHAR, 2282, 1783, RCHAR, RCHAR, RCHAR, RCHAR, 12078, 12077, 5510, 1775, 5516, 12079, 12080, RCHAR, 12081, 12082, 12083, 5513, 12084, 2996, RCHAR, RCHAR, RCHAR, 1734, 2361, RCHAR, 12085, 1733, 2396, RCHAR, 12086, 5511, 2136, 2110, 3460, 12087, 12088, 5509, RCHAR, 1447, RCHAR, 12089, RCHAR, 12090, 5512, 5514, RCHAR, 2018, 2079, 12072, 1813, 1922, 12091, RCHAR, 12092, 12093, 5517, RCHAR, 12094, 2438, 4028, RCHAR, 2466, RCHAR, RCHAR, RCHAR, 5518, RCHAR, RCHAR, RCHAR, 3775, RCHAR, RCHAR, RCHAR, 12095, RCHAR, RCHAR, 12096, 12097, 12098, 12099, 12100, RCHAR, 5530, 12101, 1616, 5519, RCHAR, 12102, 12103, 12104, 12105, RCHAR, 5536, 5520, RCHAR, 4263, 12106, 5527, 12107, 3634, 12108, RCHAR, 12109, RCHAR, RCHAR, RCHAR, RCHAR, 5535, RCHAR, 5522, RCHAR, RCHAR, RCHAR, 1429, 5524, RCHAR, 12110, 2283, 12111, RCHAR, 12112, 5526, 12113, 5525, RCHAR, 5521, 5532, 12114, 2756, 12115, RCHAR, 12116, 4870, 2233, 4227, 12117, 12118, RCHAR, RCHAR, 5523, 12119, 3373, 1694, 2362, 12120, 5515, RCHAR, 5531, 1756, RCHAR, RCHAR, 5529, 5533, 12121, 3461, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1879, 12122, 5563, RCHAR, 12123, 4082, 5538, 1878, 12124, 5545, RCHAR, 12125, 12126, 12127, 3979, 12128, 5546, 5548, 12129, 5552, 5540, 12130, 3205, RCHAR, 12131, 12132, RCHAR, 3462, 5556, 5543, RCHAR, 5553, RCHAR, 12133, RCHAR, 5547, 12134, RCHAR, 12135, 12136, 12137, 12138, 2844, 5557, 12139, 12140, 2932, RCHAR, RCHAR, 12141, 12142, RCHAR, RCHAR, 5555, 1814, 12143, 12144, 12145, RCHAR, RCHAR, 4371, 5537, RCHAR, RCHAR, 5551, 1465, 12146, RCHAR, 5539, 12147, 12148, 4067, 5544, 2821, 3328, 5534, 12149, 12150, 5550, 12151, RCHAR, RCHAR, 12152, 12153, RCHAR, 2909, 5560, 1772, 2162, RCHAR, RCHAR, RCHAR, RCHAR, 5562, 5541, 5561, RCHAR, 5554, 5542, RCHAR, 5558, RCHAR, 5559, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5576, 12154, RCHAR, 12155, 3523, 12156, 5549, RCHAR, 12157, 5572, RCHAR, 12158, RCHAR, 5574, RCHAR, 3345, RCHAR, RCHAR, 12159, RCHAR, RCHAR, 12160, RCHAR, RCHAR, RCHAR, 12161, 4179, RCHAR, RCHAR, RCHAR, 12162, RCHAR, RCHAR, RCHAR, RCHAR, 3845, 5569, 3143, RCHAR, 12163, RCHAR, 5575, 3038, 12164, 5566, 5579, 5578, RCHAR, 3556, 5577, 3551, 12165, 12166, 12167, 12168, RCHAR, 12169, 12170, 5581, 5568, 12171, 2013, 5571, 2692, 12172, 12173, 12174, 3635, 5573, 2016, RCHAR, 5565, 5567, 5564, 12175, 12176, 4339, 1749, 5570, 12177, 12178, 5580, 1712, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2420, RCHAR, RCHAR, 12179, 1564, RCHAR, RCHAR, 5597, 12180, RCHAR, 4340, 5600, 12181, RCHAR, 12182, RCHAR, RCHAR, 2845, 5599, RCHAR, RCHAR, RCHAR, 5598, 12183, RCHAR, RCHAR, RCHAR, 12184, 12185, 5595, 12186, RCHAR, RCHAR, 12187, RCHAR, 12188, 5583, 12189, RCHAR, 5612, 5582, RCHAR, 5601, RCHAR, RCHAR, 12190, 12191, RCHAR, 12192, 5593, 12193, RCHAR, 5588, 5585, RCHAR, 5586, RCHAR, 5594, RCHAR, 12194, RCHAR, 7803, 12195, RCHAR, 5591, 2284, 3329, 3075, 5589, RCHAR, 5584, 12196, RCHAR, 5587, RCHAR, RCHAR, 12197, 12198, 4180, 4021, RCHAR, RCHAR, RCHAR, 5592, 5602, RCHAR, RCHAR, RCHAR, 12199, RCHAR, RCHAR, 12200, RCHAR, 5610, 5603, RCHAR, RCHAR, 5616, RCHAR, 5614, 12201, 12202, RCHAR, 12203, 5609, 12204, RCHAR, 12205, RCHAR, RCHAR, RCHAR, 5608, RCHAR, 3337, RCHAR, 3076, 12206, 5606, 12207, 12208, 5604, 12209, RCHAR, 5611, RCHAR, RCHAR, RCHAR, RCHAR, 5617, 3750, 5623, RCHAR, RCHAR, 12210, RCHAR, 12211, 5618, 5621, 5615, 12212, RCHAR, 3279, RCHAR, 3783, 12213, 5605, RCHAR, 12214, 5613, 2757, 12215, 4088, 5633, 5620, 12216, RCHAR, RCHAR, RCHAR, 12217, 2163, 1600, 1754, RCHAR, RCHAR, 5596, RCHAR, 12218, RCHAR, 12219, RCHAR, 12220, 2758, 5625, 12221, 5632, 2626, 1773, 12222, RCHAR, 3209, 12223, 12224, RCHAR, RCHAR, RCHAR, RCHAR, 5622, 12225, 12226, 5627, 5631, 12227, 12228, 1995, RCHAR, RCHAR, 12229, RCHAR, 12230, 12231, 12232, RCHAR, RCHAR, 12233, 12234, RCHAR, 1923, 5629, RCHAR, 12235, RCHAR, RCHAR, RCHAR, 1880, RCHAR, 3520, 5628, RCHAR, 12236, RCHAR, 5630, 12237, RCHAR, RCHAR, 12238, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12239, 5624, 12240, RCHAR, RCHAR, RCHAR, RCHAR, 5626, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12241, 1755, 3236, 12242, RCHAR, 12243, 5637, RCHAR, 12244, 12245, RCHAR, 12246, RCHAR, 12247, RCHAR, 5635, 2234, RCHAR, 5634, 12248, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5640, RCHAR, RCHAR, RCHAR, 12249, 5507, 12250, 12251, 12252, 5636, RCHAR, 5638, 5639, RCHAR, 12253, RCHAR, RCHAR, RCHAR, RCHAR, 5651, 12254, 5647, RCHAR, 5528, 12255, 12256, 12257, RCHAR, 5646, 12258, RCHAR, RCHAR, RCHAR, 5645, RCHAR, RCHAR, 5642, RCHAR, 12259, 12260, 12261, RCHAR, 5619, 5644, 5643, RCHAR, RCHAR, 12262, RCHAR, 12264, 12263, RCHAR, RCHAR, 12265, RCHAR, RCHAR, RCHAR, 12266, 5649, RCHAR, 4329, 12267, 12268, 12269, RCHAR, RCHAR, RCHAR, 5652, 2064, 12270, 12271, 5648, 5650, RCHAR, RCHAR, RCHAR, RCHAR, 12272, RCHAR, RCHAR, 12273, 3672, RCHAR, 5653, RCHAR, 12274, RCHAR, RCHAR, RCHAR, 12275, 12276, 12277, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5657, 5654, 12278, 12279, RCHAR, RCHAR, RCHAR, RCHAR, 12280, 12281, 4218, 5655, 12282, 12283, RCHAR, 12284, 5607, RCHAR, RCHAR, RCHAR, RCHAR, 12285, 12286, 12287, 5658, RCHAR, RCHAR, RCHAR, 5659, 12288, RCHAR, RCHAR, RCHAR, 12289, RCHAR, 1524, 12290, 5661, 2138, 2538, RCHAR, 2026, 12291, RCHAR, RCHAR, 1601, 12292, RCHAR, RCHAR, 12293, 12294, RCHAR, RCHAR, 12295, RCHAR, RCHAR, 4198, RCHAR, RCHAR, 12296, 12297, 5663, 5662, 5665, 1908, 12298, RCHAR, 2027, 1815, 12299, RCHAR, RCHAR, RCHAR, 5668, RCHAR, RCHAR, 12300, 5667, RCHAR, 5669, 12301, RCHAR, 1643, 12302, 3218, RCHAR, 5670, RCHAR, 12303, 1816, 5672, RCHAR, 12304, RCHAR, 12305, 5671, RCHAR, 5673, RCHAR, 12306, RCHAR, 5674, 12307, 5675, 2506, 2934, 2350, RCHAR, 3839, 12308, RCHAR, 3919, 4359, 12309, RCHAR, RCHAR, 12310, 2528, 12311, RCHAR, RCHAR, 2397, 4311, 12312, RCHAR, RCHAR, 5676, 5677, RCHAR, 2507, RCHAR, 12313, 12314, 5678, 5679, RCHAR, 12315, 5681, 5680, 12316, 4003, RCHAR, RCHAR, 2693, 2613, 2479, RCHAR, 5682, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5684, 2822, 12317, 5683, RCHAR, RCHAR, 12318, RCHAR, RCHAR, 5685, 12319, 12320, RCHAR, 12321, 12322, 5686, RCHAR, RCHAR, RCHAR, 12323, 12324, 5687, 5688, 12325, 12326, 12327, 5689, 12328, 5691, 5690, 5692, 1602, 3237, RCHAR, 5693, 12329, 12330, 2449, 1735, 5694, 12331, 12332, 3417, 4837, RCHAR, RCHAR, 12333, 12334, 1882, 5695, RCHAR, RCHAR, 12335, RCHAR, 5696, 12336, 3929, 4019, RCHAR, RCHAR, RCHAR, 3516, 5697, 3735, RCHAR, 12337, RCHAR, 3756, RCHAR, 12338, 4092, RCHAR, RCHAR, RCHAR, 5698, RCHAR, 12339, RCHAR, 12340, RCHAR, RCHAR, 12341, 12342, RCHAR, RCHAR, RCHAR, 5700, 5699, RCHAR, 12343, 5702, RCHAR, 12344, RCHAR, 5701, RCHAR, RCHAR, RCHAR, 12345, RCHAR, 12346, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12347, RCHAR, RCHAR, 12348, RCHAR, 12349, 12350, RCHAR, RCHAR, 5704, 12351, RCHAR, RCHAR, RCHAR, 12352, 12353, 2508, 12354, 4058, 12355, 5705, 5706, RCHAR, RCHAR, 1883, RCHAR, 12356, RCHAR, 5707, RCHAR, RCHAR, RCHAR, 12357, RCHAR, RCHAR, RCHAR, 5709, 5708, RCHAR, 12358, 12359, 12360, RCHAR, RCHAR, RCHAR, 12361, RCHAR, 12362, RCHAR, RCHAR, RCHAR, RCHAR, 12363, 2888, 12364, 12365, 3784, 1545, RCHAR, 12366, 12367, RCHAR, RCHAR, 3702, 12368, 3374, 2664, 1944, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12369, 12370, RCHAR, 12371, 3703, 12372, 2551, RCHAR, 12373, RCHAR, 12374, 5711, RCHAR, 1817, RCHAR, 12375, 1591, 12376, 12377, 3559, 5710, 2285, 3246, RCHAR, 5712, RCHAR, RCHAR, RCHAR, RCHAR, 12429, 5720, RCHAR, 5713, 12378, RCHAR, 12379, RCHAR, 12380, 3134, RCHAR, 1945, 5721, 12381, RCHAR, 12382, RCHAR, 12383, 12384, 2139, 12385, RCHAR, 1884, 5719, RCHAR, RCHAR, 5717, 5714, 4199, RCHAR, 12386, 12387, 12388, 3321, 12389, RCHAR, RCHAR, 3534, 5715, RCHAR, RCHAR, 5723, RCHAR, 5722, 2070, 12390, 12391, 1610, 12392, 12393, 2376, 5716, 5718, 12394, RCHAR, RCHAR, 12395, RCHAR, 4002, 3185, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4034, RCHAR, RCHAR, 5731, RCHAR, 12396, 5732, 12397, 1644, 12398, RCHAR, RCHAR, RCHAR, 3861, 4134, 5734, 2540, 2759, 5727, 5733, 1575, RCHAR, 1996, 12399, RCHAR, 5724, 5729, 12400, RCHAR, RCHAR, 2997, 3652, RCHAR, 3736, 12401, RCHAR, 12402, 12403, 12404, 12405, 5726, 12406, 3948, 12407, 5728, RCHAR, 5737, 12408, 5735, 12409, 5730, RCHAR, RCHAR, 12410, 3949, 3611, 1946, RCHAR, 3388, RCHAR, 12411, 3272, 12412, 5738, 12413, 12414, RCHAR, 12415, 5736, 3158, 5725, 12416, 1546, 12417, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12418, RCHAR, RCHAR, 12419, RCHAR, RCHAR, 12420, 4181, 5749, RCHAR, 12421, 12422, RCHAR, 12423, 5748, 12424, RCHAR, RCHAR, RCHAR, 2999, RCHAR, 5745, 12425, 4211, RCHAR, RCHAR, 3499, 5739, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3326, 12426, 12427, 12428, 1547, 2286, 5742, RCHAR, RCHAR, 12430, 12431, RCHAR, 12432, 2638, 5747, RCHAR, 5746, 5741, RCHAR, 5744, 12433, RCHAR, 1763, 12434, 5743, 3612, 12435, RCHAR, 4243, RCHAR, RCHAR, 2809, 2998, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12436, RCHAR, 5755, 5753, RCHAR, 3804, RCHAR, 12437, 12438, RCHAR, 12439, RCHAR, 5750, 5752, 12440, 1529, 12441, RCHAR, 2287, 4341, RCHAR, 1720, RCHAR, 3825, 12442, 12443, RCHAR, RCHAR, RCHAR, 4200, RCHAR, RCHAR, 1695, 2846, 5754, RCHAR, RCHAR, 12444, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12445, RCHAR, RCHAR, 5759, RCHAR, 12446, 2760, RCHAR, RCHAR, RCHAR, 4151, RCHAR, 5756, RCHAR, RCHAR, 12447, 12448, 5751, 12449, 5757, 12450, 12451, 12452, 4291, RCHAR, 3466, 3511, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12453, RCHAR, 12454, RCHAR, RCHAR, 1713, RCHAR, RCHAR, 1556, RCHAR, 12455, 5763, RCHAR, 12456, 5766, 12457, RCHAR, RCHAR, 4264, 12458, RCHAR, 12459, 4203, RCHAR, RCHAR, RCHAR, 12460, 5773, 5767, 5764, 12461, RCHAR, 12462, 4281, 5770, RCHAR, 12463, 12464, RCHAR, 2673, 5772, RCHAR, RCHAR, 5777, 12465, RCHAR, 3464, 5775, RCHAR, 12466, RCHAR, 12467, 5769, 12468, 12469, 3219, 12470, RCHAR, 5776, 12471, 5765, RCHAR, 5771, 12472, 5778, 1501, 5768, RCHAR, 5779, 12473, 12474, 2847, RCHAR, 2694, 12475, 3858, 12476, 2363, RCHAR, 5760, 5774, 3409, 12477, RCHAR, RCHAR, RCHAR, 12478, RCHAR, RCHAR, RCHAR, 12479, 2935, RCHAR, 1764, 2398, 2761, 5762, 2665, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2111, RCHAR, 5761, RCHAR, RCHAR, RCHAR, 5783, 2708, 2187, RCHAR, 5798, 12480, 5792, 1963, 3430, 12481, 5787, 5796, 1424, 1521, 12482, RCHAR, 1622, RCHAR, 5789, 3113, 5780, 5782, 2288, RCHAR, RCHAR, 12483, RCHAR, RCHAR, RCHAR, 12484, RCHAR, 5799, 12485, 5794, 12486, 12487, RCHAR, 5786, RCHAR, RCHAR, RCHAR, RCHAR, 5793, 12488, 12489, RCHAR, RCHAR, 12490, 12491, 4052, 12492, RCHAR, 5791, 5795, 12493, RCHAR, 12494, 12495, 12496, 12497, RCHAR, 2209, 12498, 2762, RCHAR, RCHAR, 3220, 12499, 12500, 12501, 5785, RCHAR, RCHAR, 12502, 12503, RCHAR, RCHAR, RCHAR, 4150, 12504, RCHAR, RCHAR, 5788, RCHAR, RCHAR, 5781, 3465, RCHAR, RCHAR, 5784, 12505, RCHAR, RCHAR, 5790, RCHAR, RCHAR, RCHAR, RCHAR, 12506, RCHAR, 12507, 4372, 2567, 4041, RCHAR, 5800, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3679, 12508, RCHAR, 5812, 2188, RCHAR, RCHAR, 12509, RCHAR, RCHAR, 2695, RCHAR, 5802, 12510, RCHAR, RCHAR, 4244, 2289, RCHAR, 5815, 12511, RCHAR, 1487, RCHAR, RCHAR, 5813, RCHAR, 12512, RCHAR, RCHAR, 5801, RCHAR, RCHAR, 12513, 12514, 5807, RCHAR, 12515, 5809, 12516, RCHAR, RCHAR, 4182, 5804, RCHAR, RCHAR, 3397, 12517, RCHAR, 5806, RCHAR, 12518, 12519, 12520, 5814, 12521, 5808, 4080, RCHAR, 12522, 12523, 5803, 12524, 2539, 5827, 12525, 12526, 12527, RCHAR, 1765, RCHAR, 5805, 5810, 5811, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3177, 3159, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12528, 5819, 12529, 12530, 5825, RCHAR, RCHAR, 5823, RCHAR, 3392, RCHAR, RCHAR, 5830, 5820, 12531, RCHAR, 12532, RCHAR, 12533, 5821, 5797, RCHAR, 1968, 3785, RCHAR, 12534, RCHAR, 2568, RCHAR, 12535, 2342, 12536, RCHAR, 12537, 12538, RCHAR, 4342, RCHAR, 5817, RCHAR, 5829, 1576, 3077, 12539, RCHAR, 12540, RCHAR, 12541, 12542, RCHAR, RCHAR, RCHAR, RCHAR, 3660, RCHAR, 1818, 4319, RCHAR, RCHAR, 12543, RCHAR, RCHAR, 12544, 12545, 4042, 3339, 12552, RCHAR, 12546, 12547, 5824, 5826, 12548, RCHAR, RCHAR, 12549, RCHAR, 3025, RCHAR, RCHAR, 12550, 12551, RCHAR, 5828, 5822, RCHAR, 5816, RCHAR, RCHAR, RCHAR, 1820, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12553, RCHAR, 12554, 12555, 12556, 2140, RCHAR, RCHAR, 12557, 5842, 12558, 12559, 5837, 3001, 12560, 12561, 1758, RCHAR, 12562, 12563, RCHAR, 2696, RCHAR, 5846, RCHAR, 12564, RCHAR, RCHAR, RCHAR, 12565, 5839, 3301, 5836, 3346, RCHAR, RCHAR, RCHAR, 5871, RCHAR, RCHAR, RCHAR, 5833, RCHAR, 5832, RCHAR, 5841, 12566, 12567, RCHAR, 5835, 5834, 5840, 12568, 2914, RCHAR, 5831, 12569, 12570, RCHAR, RCHAR, 12571, 12572, 12573, 5843, RCHAR, 12574, 5844, 12575, 12576, 12577, RCHAR, 12578, 1819, RCHAR, RCHAR, 12579, RCHAR, RCHAR, RCHAR, RCHAR, 12580, 12581, 5849, RCHAR, 5848, 5850, 12582, 12583, 12584, 12585, RCHAR, 5853, RCHAR, RCHAR, RCHAR, 12586, 12587, 12588, 3418, RCHAR, 5847, RCHAR, 12589, 12590, RCHAR, RCHAR, 5851, RCHAR, RCHAR, 12591, RCHAR, RCHAR, RCHAR, 2134, 3190, 5845, 3598, RCHAR, 12592, 5852, 12593, 12594, RCHAR, 12595, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5857, 5855, RCHAR, RCHAR, 5858, RCHAR, 12596, 5861, RCHAR, RCHAR, 12597, 5854, 2329, 3579, RCHAR, RCHAR, 5758, RCHAR, RCHAR, RCHAR, 12598, 12599, RCHAR, 4219, 5856, RCHAR, 5860, 3186, 12600, 5859, RCHAR, 5838, RCHAR, 12601, 7404, RCHAR, RCHAR, 12602, 5864, RCHAR, 12603, 12604, 5868, RCHAR, 12605, 5866, RCHAR, RCHAR, RCHAR, 12606, 12607, 12608, RCHAR, 5862, RCHAR, 5863, RCHAR, 12609, RCHAR, 5867, RCHAR, 5865, RCHAR, RCHAR, RCHAR, 3805, RCHAR, 12610, 5873, RCHAR, 5870, 5869, RCHAR, 5872, 3529, 5874, 12611, RCHAR, RCHAR, 12612, RCHAR, RCHAR, 3280, 3178, RCHAR, RCHAR, RCHAR, RCHAR, 2918, RCHAR, RCHAR, 12613, 5875, RCHAR, 5877, RCHAR, 12614, RCHAR, RCHAR, 12615, RCHAR, 12616, RCHAR, RCHAR, 12617, RCHAR, 5876, RCHAR, RCHAR, RCHAR, RCHAR, 12618, 12619, RCHAR, RCHAR, RCHAR, 12620, 12621, 12622, 12623, 5818, RCHAR, 12628, RCHAR, RCHAR, 5878, RCHAR, RCHAR, 12624, 12625, RCHAR, RCHAR, 3548, RCHAR, RCHAR, RCHAR, RCHAR, 12626, 12627, RCHAR, RCHAR, RCHAR, RCHAR, 5879, 12629, 12630, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1645, 12631, RCHAR, 12632, 3467, 1696, RCHAR, RCHAR, RCHAR, RCHAR, 12633, 12634, RCHAR, 1947, RCHAR, RCHAR, RCHAR, 2599, 2399, 12635, RCHAR, RCHAR, 12636, RCHAR, RCHAR, RCHAR, 12637, 12638, RCHAR, RCHAR, 4330, 2889, RCHAR, RCHAR, RCHAR, 1577, RCHAR, RCHAR, RCHAR, 5881, RCHAR, 12639, 12640, 12641, 12642, 12643, 5880, RCHAR, 12644, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12645, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12646, 5884, 3221, 5887, 5882, 12647, 12648, RCHAR, 5886, 12649, RCHAR, RCHAR, 12650, 5885, 3415, 1466, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4314, RCHAR, 12651, 5889, RCHAR, RCHAR, RCHAR, 1511, RCHAR, 12652, RCHAR, 12653, 12654, 12655, 12656, RCHAR, 12657, 5891, RCHAR, RCHAR, 12658, 5890, RCHAR, 5888, RCHAR, RCHAR, RCHAR, RCHAR, 12659, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5883, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3950, 12660, RCHAR, RCHAR, 5893, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12661, 12662, 12663, 12664, 12665, RCHAR, 5892, RCHAR, 12666, 12667, RCHAR, RCHAR, 12668, RCHAR, RCHAR, RCHAR, RCHAR, 1578, RCHAR, RCHAR, RCHAR, RCHAR, 5895, 3871, RCHAR, 5894, RCHAR, 12669, RCHAR, 12670, 4062, RCHAR, RCHAR, RCHAR, RCHAR, 2764, RCHAR, RCHAR, RCHAR, RCHAR, 12671, RCHAR, 12672, RCHAR, 12673, 12674, 12675, RCHAR, RCHAR, RCHAR, RCHAR, 3026, RCHAR, 12676, RCHAR, RCHAR, RCHAR, 2763, RCHAR, RCHAR, RCHAR, RCHAR, 12677, RCHAR, RCHAR, RCHAR, 12678, 12679, 12680, RCHAR, 4320, 12681, 12682, 5901, RCHAR, 3002, RCHAR, 12683, RCHAR, 12684, RCHAR, RCHAR, 5897, 5902, 12685, RCHAR, 1579, 12686, RCHAR, 12687, RCHAR, 12688, RCHAR, 12689, RCHAR, 5900, RCHAR, 3636, 5896, 5899, 2765, 12690, 3714, RCHAR, RCHAR, 5903, RCHAR, 2586, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12691, RCHAR, RCHAR, RCHAR, 3003, RCHAR, RCHAR, 12692, RCHAR, RCHAR, RCHAR, 5906, 12693, RCHAR, 12694, 5898, RCHAR, 2074, RCHAR, 12695, RCHAR, RCHAR, 5904, RCHAR, RCHAR, 12696, RCHAR, 4183, 5907, RCHAR, RCHAR, RCHAR, 7807, 12697, 12698, RCHAR, RCHAR, RCHAR, 2678, 12699, RCHAR, 12700, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5908, RCHAR, RCHAR, RCHAR, 5909, RCHAR, RCHAR, 12701, 12702, 3585, 12703, 12704, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5911, 12705, RCHAR, RCHAR, RCHAR, 5912, 12706, 12707, 12708, RCHAR, 3590, 12709, RCHAR, RCHAR, RCHAR, 3468, 5914, RCHAR, 12710, 12711, RCHAR, 5916, RCHAR, 4282, RCHAR, 5913, 12712, 5915, 1580, 12713, 5910, RCHAR, 12714, 12715, RCHAR, 12716, RCHAR, RCHAR, 4758, 5917, RCHAR, RCHAR, RCHAR, RCHAR, 3078, 2467, 5919, RCHAR, RCHAR, RCHAR, RCHAR, 5918, 2823, 4662, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5920, RCHAR, RCHAR, 12717, 5922, RCHAR, 5905, 5921, RCHAR, 12718, 5923, 12719, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3661, 12720, 12721, 12722, RCHAR, RCHAR, RCHAR, 5924, RCHAR, RCHAR, 5925, RCHAR, RCHAR, 12723, RCHAR, RCHAR, RCHAR, 12724, RCHAR, RCHAR, 12725, 5926, RCHAR, 12726, RCHAR, 12727, RCHAR, RCHAR, RCHAR, RCHAR, 12728, RCHAR, RCHAR, RCHAR, 5927, RCHAR, 3351, 12729, 5929, 5928, RCHAR, 12730, 5930, RCHAR, 5931, RCHAR, 12731, 2600, 3826, RCHAR, 12732, 12733, 4117, 5932, 5933, 3061, 2541, 5934, 5935, 12734, 12735, 12736, RCHAR, 12737, 5936, 3903, 3704, RCHAR, RCHAR, 5937, 3626, RCHAR, 12738, 12739, 12740, RCHAR, 3302, 12741, RCHAR, 12742, 12743, RCHAR, 5938, 1668, 12744, 1956, 12745, 4079, 12746, 4063, 12747, 1617, 4343, 12748, RCHAR, RCHAR, RCHAR, 3997, 12749, 3863, RCHAR, 12750, RCHAR, RCHAR, 12751, 12752, RCHAR, 12753, 2936, RCHAR, 5939, RCHAR, RCHAR, 12754, 12755, 3512, RCHAR, 12756, 12757, 2164, 5940, 12758, 2401, 5942, 5941, RCHAR, 12759, RCHAR, RCHAR, 5943, RCHAR, 12760, RCHAR, RCHAR, RCHAR, 12761, 12762, RCHAR, RCHAR, RCHAR, 5944, 12763, RCHAR, RCHAR, 5945, RCHAR, RCHAR, RCHAR, RCHAR, 12764, RCHAR, RCHAR, RCHAR, RCHAR, 1909, RCHAR, 5946, RCHAR, RCHAR, RCHAR, RCHAR, 5947, 12765, RCHAR, RCHAR, RCHAR, 2165, 12766, 12767, 3705, RCHAR, 12768, 5949, RCHAR, 12769, RCHAR, 2810, RCHAR, RCHAR, 5948, RCHAR, RCHAR, RCHAR, RCHAR, 12770, RCHAR, RCHAR, 12771, 1997, 5950, 5952, RCHAR, 5951, 12772, RCHAR, 12773, RCHAR, RCHAR, 12774, RCHAR, 5953, RCHAR, 2210, RCHAR, 5954, RCHAR, RCHAR, 12775, 12776, 2046, 12777, 3039, RCHAR, 2348, RCHAR, RCHAR, RCHAR, 12778, 5956, 5957, 5955, RCHAR, RCHAR, 12779, RCHAR, RCHAR, RCHAR, 2614, RCHAR, RCHAR, 3517, 1998, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12780, 12781, RCHAR, RCHAR, 5959, 3207, 5958, 12782, 12783, 4344, 3637, 12784, RCHAR, RCHAR, RCHAR, 12785, RCHAR, 12786, 12787, RCHAR, 12788, RCHAR, RCHAR, 5962, 12789, RCHAR, 12790, RCHAR, RCHAR, RCHAR, RCHAR, 12791, 12792, RCHAR, RCHAR, 5964, 5961, 12793, 12794, RCHAR, 4093, 5963, 5965, 12795, 4265, RCHAR, RCHAR, 12796, RCHAR, 12797, 5969, RCHAR, 12798, 12799, 5968, 3281, 3584, 12800, RCHAR, 2166, 5967, RCHAR, 12801, 12802, RCHAR, 5966, 12803, 4152, 4153, RCHAR, RCHAR, 12804, 12805, RCHAR, 12806, 5970, 1581, RCHAR, RCHAR, RCHAR, 12807, 2341, 2509, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12808, 5971, 5972, 12809, RCHAR, 12810, RCHAR, RCHAR, RCHAR, 12811, 5974, 12812, RCHAR, RCHAR, RCHAR, RCHAR, 12813, 12814, 12815, 12816, RCHAR, RCHAR, 2666, RCHAR, RCHAR, 12817, 12818, 5976, 12819, 5975, 12820, 12821, RCHAR, 12822, 12823, 5977, 12824, 1736, RCHAR, RCHAR, 5979, RCHAR, 12825, 5978, 12826, 5981, 5980, 12827, RCHAR, RCHAR, RCHAR, 12828, 12829, RCHAR, 12830, 2189, 12831, 12832, 4237, RCHAR, 2017, RCHAR, 1603, RCHAR, RCHAR, 12833, RCHAR, 12834, RCHAR, RCHAR, 12835, RCHAR, 12836, 2047, 12837, 12838, RCHAR, RCHAR, RCHAR, 12839, RCHAR, 12840, 12841, 12842, RCHAR, 12843, RCHAR, RCHAR, 12844, 12845, RCHAR, RCHAR, 1850, 12846, 12847, RCHAR, 12848, RCHAR, RCHAR, RCHAR, RCHAR, 4301, 5983, RCHAR, 12849, RCHAR, 12850, RCHAR, 12851, RCHAR, 5985, 12852, 12853, RCHAR, 12854, 5986, RCHAR, 1646, RCHAR, RCHAR, 12855, 12856, RCHAR, 5982, 12857, 2468, 12858, 12859, 3322, 5984, 12860, RCHAR, RCHAR, 12861, 12862, RCHAR, RCHAR, 12863, RCHAR, RCHAR, 12864, RCHAR, RCHAR, RCHAR, 12865, 5989, RCHAR, 2615, 12866, RCHAR, 12867, RCHAR, 5987, 12868, 12869, RCHAR, 12870, 2097, RCHAR, RCHAR, 3706, 5988, RCHAR, RCHAR, 6015, RCHAR, RCHAR, 12871, 12872, RCHAR, 12873, 5994, 12874, 12875, 12876, RCHAR, 12877, 2190, 12878, 12879, 12880, RCHAR, 1948, 12881, 5991, 4228, 12882, RCHAR, 4245, 12883, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12884, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12885, 12886, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3187, RCHAR, 12887, 5993, 12888, RCHAR, 12889, 12890, 12891, 12892, 12893, 12894, 12895, 12896, 12897, 12898, 5995, 4283, 2028, 3757, 3613, RCHAR, RCHAR, 12899, 5996, RCHAR, RCHAR, RCHAR, RCHAR, 5998, 12900, 6001, RCHAR, 12901, 12902, RCHAR, 12903, 12904, RCHAR, RCHAR, RCHAR, 12905, RCHAR, 12906, RCHAR, RCHAR, RCHAR, 12907, 12908, RCHAR, RCHAR, 5997, RCHAR, 12909, RCHAR, 6000, 2235, 1548, 6002, 12910, 2899, 5999, 4289, RCHAR, 12911, 6005, 7805, RCHAR, 12912, 12913, 12914, 6003, 6006, 12915, RCHAR, 12916, 12917, 5992, 6004, 12918, 12919, 2377, RCHAR, RCHAR, 6007, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6008, RCHAR, 12920, 12921, RCHAR, 4229, RCHAR, 12922, 12923, 12924, RCHAR, 12925, RCHAR, 6009, RCHAR, RCHAR, RCHAR, 12926, 12927, 12928, 12929, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12930, 12931, 12932, RCHAR, 12933, RCHAR, 6010, 12934, 12935, 12936, 5990, 12937, RCHAR, RCHAR, 12938, 6011, 12939, 12940, 12941, 12942, RCHAR, RCHAR, 12943, 12944, 1821, 12945, 12946, RCHAR, RCHAR, 12947, RCHAR, RCHAR, RCHAR, 12948, RCHAR, 12949, RCHAR, 2542, RCHAR, 12950, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12951, 12952, 6012, RCHAR, 12953, RCHAR, RCHAR, 6013, 12954, RCHAR, RCHAR, 12955, 6014, RCHAR, RCHAR, RCHAR, 12956, RCHAR, 12957, 12958, 1530, RCHAR, 12959, 12960, 6016, RCHAR, 3786, 6017, 12961, RCHAR, 1789, 6018, 12962, 6019, 12963, 12964, RCHAR, RCHAR, 6020, 12965, 6022, 6023, 6021, RCHAR, 12966, RCHAR, 3810, 6025, 6024, RCHAR, 12967, 12968, 12969, RCHAR, RCHAR, 12970, RCHAR, RCHAR, RCHAR, 6027, 6026, 6028, 12971, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6029, 6031, 6030, RCHAR, RCHAR, 2344, 12972, 6033, RCHAR, 6032, 12973, 12974, 1822, RCHAR, 2870, RCHAR, 3411, RCHAR, 6034, 2937, 12975, 12976, RCHAR, 2469, 12977, 1592, 6035, 12978, 4184, 12979, 12980, 3920, 6036, RCHAR, RCHAR, 12981, 3419, 4154, 2290, 2848, RCHAR, RCHAR, 12982, 3238, 4625, 12983, 3303, 1669, 6037, 12984, 12985, 12986, 12987, RCHAR, RCHAR, 12988, 6038, RCHAR, 6043, 12989, 12990, 6041, 6040, 5391, 1697, 6039, 12991, 1467, 12992, 3675, 12993, RCHAR, 3707, RCHAR, RCHAR, 12994, RCHAR, 4246, 6044, 6042, 3255, 2919, 12995, 12996, 3676, 12997, 3772, RCHAR, 6046, 4241, 2112, 6047, RCHAR, 6045, 3719, 6048, RCHAR, 6049, RCHAR, 12998, 1468, 12999, RCHAR, 2811, 6054, RCHAR, 6051, 3554, 6050, 13000, 13001, 13002, 13003, 13004, 13005, 1885, RCHAR, 13006, 6057, RCHAR, RCHAR, 13007, 6052, 6053, RCHAR, 6056, 6055, 3764, RCHAR, RCHAR, 3041, 3040, 13008, 1910, 13009, 13010, 6058, 13011, RCHAR, RCHAR, RCHAR, 13012, 6059, RCHAR, 13013, 6060, RCHAR, RCHAR, RCHAR, RCHAR, 13014, 6062, 13015, 6061, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1557, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6070, 3737, 6064, 13016, 6066, RCHAR, RCHAR, 6068, 2849, 13017, RCHAR, 6069, 6067, 2569, 13018, 13019, 13020, 6063, 6065, 13021, 3793, 13022, 2766, RCHAR, RCHAR, 6072, RCHAR, 13023, 6071, 13024, 13025, RCHAR, RCHAR, 6073, RCHAR, 2543, 2364, RCHAR, 13026, 3470, 6074, RCHAR, 3332, 13027, RCHAR, 6076, 13028, 13029, 13030, 4230, 6075, 13031, RCHAR, RCHAR, 13032, RCHAR, 3080, RCHAR, RCHAR, 13033, RCHAR, 13034, 13035, 6081, 13036, 6083, 6084, 3247, RCHAR, RCHAR, RCHAR, RCHAR, 13037, 6082, RCHAR, 6079, RCHAR, 6077, 6078, 13038, 6080, 13039, 13040, 13041, RCHAR, RCHAR, 13042, 13043, 6087, 13044, 6085, 13045, 6086, RCHAR, 13046, RCHAR, RCHAR, 13047, 13048, RCHAR, 13049, 13050, RCHAR, RCHAR, 13051, RCHAR, 13052, 13053, 13054, 13055, 6088, 6090, 6091, 6092, 13056, 6093, 13057, 13058, 6089, RCHAR, 13059, RCHAR, RCHAR, RCHAR, 13060, RCHAR, RCHAR, 6095, RCHAR, 13061, 13062, 6094, 13063, RCHAR, RCHAR, 13064, 13065, 13066, 6096, 13067, RCHAR, RCHAR, RCHAR, 13069, 13070, 4266, 13071, 13072, 13073, 6099, 6097, 6098, 13074, 13068, 13075, 1851, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4135, RCHAR, RCHAR, 13076, 3895, RCHAR, 6101, 13077, RCHAR, RCHAR, 6100, RCHAR, RCHAR, 13078, RCHAR, 6102, 6103, RCHAR, 13079, 13080, RCHAR, 6107, 6104, 6105, 6106, RCHAR, 6108, 13081, 13082, 13083, 6109, 13084, 6110, RCHAR, 13085, RCHAR, 6111, RCHAR, 6112, RCHAR, 3680, 3431, 6113, 3653, 3779, RCHAR, 6114, 13086, RCHAR, 6115, 3393, 13087, 1698, 2291, 6116, RCHAR, RCHAR, 6117, 13088, 13089, 6118, RCHAR, 2452, RCHAR, RCHAR, 6120, RCHAR, 13090, 6119, RCHAR, RCHAR, 6121, 6122, 13091, 13092, 13093, RCHAR, 13094, 13095, RCHAR, 13096, 13097, 13098, 13099, 13100, 13101, 13102, RCHAR, 13103, RCHAR, RCHAR, 13104, 3738, RCHAR, 6123, RCHAR, RCHAR, RCHAR, 6124, RCHAR, RCHAR, 7780, 6125, 6126, 6127, RCHAR, RCHAR, 13105, RCHAR, 2457, RCHAR, 13106, 6128, 3625, RCHAR, 13107, 4010, RCHAR, 1549, 13108, 1558, 13109, 13110, 6129, 13111, RCHAR, RCHAR, RCHAR, 6131, RCHAR, 13112, RCHAR, 6130, 3463, RCHAR, 13113, RCHAR, 2938, 5664, RCHAR, 6132, 4074, 13114, 6133, RCHAR, 1823, 3720, 6134, 13115, 6135, 13116, RCHAR, 6136, RCHAR, 13117, RCHAR, 4101, RCHAR, 13118, 13119, 4094, RCHAR, 3319, RCHAR, 13120, RCHAR, 3081, 13121, RCHAR, 6138, 13122, RCHAR, 2697, RCHAR, 13123, 2767, RCHAR, RCHAR, 6141, RCHAR, 13124, 6140, 6139, 3758, 13125, 1824, 2170, RCHAR, 13126, RCHAR, RCHAR, RCHAR, 13127, RCHAR, 13128, 13129, RCHAR, 13130, RCHAR, 13131, 13132, 6147, 13133, RCHAR, 6144, 2850, 4059, RCHAR, 13134, RCHAR, 6143, 6145, 6146, RCHAR, 13135, 6142, RCHAR, RCHAR, RCHAR, 13136, 13137, 13138, RCHAR, RCHAR, RCHAR, RCHAR, 13139, 13140, 13141, 6148, 6149, 13142, 3304, RCHAR, 1852, 13143, 13144, RCHAR, 3264, RCHAR, 13145, RCHAR, RCHAR, 13146, 13147, 6150, RCHAR, RCHAR, 13148, RCHAR, RCHAR, 13149, 13150, 13151, RCHAR, RCHAR, 13152, RCHAR, RCHAR, RCHAR, 13153, 13154, RCHAR, RCHAR, 6151, 6154, 13155, RCHAR, 13156, 13157, 13158, 2890, 13159, 3513, 13160, 6155, 3998, 13161, 6152, RCHAR, 13162, 6153, 13163, RCHAR, RCHAR, RCHAR, 13164, RCHAR, 13165, 13166, 13167, RCHAR, RCHAR, RCHAR, RCHAR, 6158, 13168, RCHAR, RCHAR, 13169, 6157, 6156, 13170, RCHAR, RCHAR, RCHAR, 13171, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6160, 13172, 13173, 6159, RCHAR, RCHAR, 6161, RCHAR, RCHAR, 13174, 13175, 13176, RCHAR, RCHAR, RCHAR, 13177, RCHAR, RCHAR, RCHAR, 6163, 13178, 6162, RCHAR, 13179, RCHAR, RCHAR, 3898, RCHAR, 13180, RCHAR, RCHAR, 13181, RCHAR, 2685, 4267, 13182, 13183, 6164, 13184, RCHAR, 3500, RCHAR, 13185, 6165, RCHAR, RCHAR, 6166, RCHAR, 6170, 6168, 6169, 13186, 6167, RCHAR, RCHAR, RCHAR, 13187, RCHAR, RCHAR, RCHAR, 6171, RCHAR, 13188, RCHAR, RCHAR, RCHAR, 6172, RCHAR, RCHAR, RCHAR, 13189, 13190, RCHAR, RCHAR, 13191, RCHAR, 6173, RCHAR, 13192, 6174, 4064, 6175, RCHAR, 13193, 13194, 13195, RCHAR, 4121, 6176, 13196, 3241, 13197, 3645, RCHAR, 2048, 13198, RCHAR, 13199, 3222, 6177, 1999, 13200, 13201, RCHAR, 2961, 13202, RCHAR, RCHAR, RCHAR, 13203, RCHAR, RCHAR, 13204, 6178, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2378, RCHAR, RCHAR, 13205, 13206, RCHAR, RCHAR, 13207, RCHAR, RCHAR, 6179, 13208, 13209, RCHAR, RCHAR, 13210, 6180, RCHAR, 2167, 2402, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13211, RCHAR, RCHAR, 6182, 13212, 13213, 13214, RCHAR, 3437, 2403, 1925, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13215, 13216, RCHAR, 13217, RCHAR, 3951, RCHAR, 3614, 13218, RCHAR, 13219, RCHAR, RCHAR, 3438, RCHAR, RCHAR, RCHAR, RCHAR, 2315, RCHAR, RCHAR, RCHAR, 13220, 13221, 6184, RCHAR, 13222, 13223, RCHAR, RCHAR, RCHAR, 13224, RCHAR, 13225, RCHAR, RCHAR, RCHAR, 13226, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13227, 2768, 13228, RCHAR, 13229, 13230, RCHAR, 13231, 13232, RCHAR, RCHAR, RCHAR, 13233, RCHAR, 13234, 4247, 2292, RCHAR, 13235, 2168, RCHAR, RCHAR, 3668, RCHAR, 6186, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13236, RCHAR, 6188, RCHAR, 13237, RCHAR, RCHAR, 2236, RCHAR, RCHAR, RCHAR, RCHAR, 6187, 3375, RCHAR, RCHAR, 13238, RCHAR, 6190, 1714, 6185, 13239, RCHAR, 3739, RCHAR, 1519, 13240, 2425, RCHAR, 4373, 13241, RCHAR, 6189, RCHAR, RCHAR, 13243, 13244, 13245, RCHAR, 13242, RCHAR, 6191, 13246, RCHAR, RCHAR, 3896, 13247, 2970, 6193, RCHAR, 13248, 13249, RCHAR, 6194, 13250, 13251, 13252, 13253, RCHAR, 6192, RCHAR, RCHAR, RCHAR, RCHAR, 1737, 13254, 6200, 13255, 6199, 13256, RCHAR, 2544, RCHAR, RCHAR, RCHAR, 6201, 6196, 13257, 13258, 13259, 6202, 6197, 13260, RCHAR, 13261, RCHAR, 3721, 6195, 13262, 13263, 6198, 13264, 13265, RCHAR, RCHAR, RCHAR, 6205, 13267, RCHAR, RCHAR, RCHAR, 13268, 13269, 13270, RCHAR, RCHAR, 13266, RCHAR, 13271, 6204, 4012, RCHAR, 13272, RCHAR, 6203, RCHAR, RCHAR, 1484, RCHAR, RCHAR, 13273, 13274, 6207, RCHAR, 13276, 13277, RCHAR, RCHAR, 13278, 13279, RCHAR, 6206, RCHAR, 13280, 13275, 2769, RCHAR, RCHAR, RCHAR, RCHAR, 13281, 6208, RCHAR, RCHAR, RCHAR, RCHAR, 13282, RCHAR, 3042, RCHAR, 13283, 6210, 6209, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6211, 13284, RCHAR, 13285, RCHAR, 13286, 13287, 13288, RCHAR, RCHAR, RCHAR, RCHAR, 13289, 6181, 13290, RCHAR, 13291, 6183, 6213, 6212, 13292, RCHAR, RCHAR, RCHAR, 13293, RCHAR, RCHAR, 13294, 13295, RCHAR, RCHAR, RCHAR, RCHAR, 2545, 13296, 4302, 13297, 2587, 13298, 6214, 2090, RCHAR, RCHAR, 13299, 13300, 13301, 1911, 1886, 2510, 13302, 13303, RCHAR, RCHAR, RCHAR, 13304, 4155, 13305, RCHAR, 6220, 13306, 6219, 3043, 6216, 13307, RCHAR, 6218, 13308, 13309, 2674, 2851, 6217, 6215, RCHAR, 3581, RCHAR, RCHAR, 2770, RCHAR, 13310, 3787, 13311, RCHAR, 13312, RCHAR, 2404, RCHAR, RCHAR, RCHAR, RCHAR, 13313, RCHAR, RCHAR, RCHAR, RCHAR, 3471, RCHAR, 13314, 6221, 13315, 13316, RCHAR, 13317, 6222, 6244, 2029, RCHAR, RCHAR, 4352, 3028, RCHAR, RCHAR, RCHAR, RCHAR, 6223, 13318, 13319, 1647, 3376, 3854, RCHAR, 13320, RCHAR, 13321, 13322, 13323, 13324, RCHAR, 13325, RCHAR, RCHAR, 13326, 13327, 6224, RCHAR, RCHAR, RCHAR, 13328, RCHAR, RCHAR, RCHAR, RCHAR, 1969, 6225, 13329, 13330, 6227, 13331, RCHAR, RCHAR, 6228, 13332, 3580, 13333, RCHAR, 6229, 13334, RCHAR, RCHAR, RCHAR, 13335, 6230, 6231, 13336, RCHAR, 2030, 1648, 3514, 2639, 2511, 13337, RCHAR, 13338, RCHAR, RCHAR, 13339, 13340, 6232, 13341, 2640, RCHAR, RCHAR, RCHAR, 13342, RCHAR, 1639, 3794, RCHAR, 13343, 6233, 13344, RCHAR, 3740, RCHAR, 13345, RCHAR, RCHAR, 13346, 13347, 3044, 13348, 6236, 13349, 6237, 3644, 13350, 2852, 6234, RCHAR, 3260, 13351, 13352, 6235, 13353, RCHAR, RCHAR, 2771, 13354, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13355, RCHAR, RCHAR, 1469, 13356, RCHAR, RCHAR, RCHAR, 1888, RCHAR, 13357, 13358, RCHAR, RCHAR, RCHAR, 13359, 6238, 13360, 13361, 3377, 13362, 6239, 2952, RCHAR, RCHAR, 13363, RCHAR, RCHAR, 4054, 13364, RCHAR, 3762, 6240, 6241, 3248, 13365, 4268, RCHAR, 13366, 6243, 6242, 13367, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13368, RCHAR, RCHAR, RCHAR, 13369, RCHAR, 13370, 2616, 13371, 13372, 6245, 1489, RCHAR, 13373, 13374, RCHAR, 6248, 13375, 13376, 13377, 6246, 1649, 2113, 6247, 2293, 2337, RCHAR, 3923, 6249, 13378, 13379, 3999, 13380, 13381, 6251, RCHAR, RCHAR, 13382, 2962, 1550, 1623, 1421, RCHAR, RCHAR, RCHAR, RCHAR, 13383, 13384, 6250, RCHAR, 13385, RCHAR, RCHAR, 13386, 13387, RCHAR, 13388, 13389, 6252, 6253, 2812, RCHAR, 13390, RCHAR, 13391, RCHAR, 6254, 13392, 1738, RCHAR, 13393, RCHAR, RCHAR, 6256, RCHAR, RCHAR, RCHAR, 2141, 13394, 1949, RCHAR, 13395, 6257, 2058, RCHAR, RCHAR, 6258, 13396, 3005, 13397, 3522, 13398, 2977, 2434, 13399, 13400, RCHAR, 6259, RCHAR, 13401, 13402, RCHAR, RCHAR, RCHAR, RCHAR, 13403, 13404, 3261, 3082, 13405, 6261, 6263, 6260, 6262, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13406, 2069, 13407, RCHAR, RCHAR, 13408, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6264, 2073, RCHAR, 13409, RCHAR, 1950, 4185, 6266, RCHAR, RCHAR, 13410, RCHAR, 13411, 6267, RCHAR, RCHAR, 13412, 1517, 13413, 13414, RCHAR, RCHAR, 6270, RCHAR, RCHAR, RCHAR, 1777, 6269, 6268, 13415, 6272, 6265, 13416, 6273, 4238, 13417, 6274, 13418, 6275, RCHAR, 13419, 4877, 6277, RCHAR, 6276, RCHAR, RCHAR, RCHAR, 6278, 6279, 13420, 4250, 6280, RCHAR, 7504, 2772, 6281, 6282, 2686, RCHAR, 3501, 6283, RCHAR, 13421, 13422, 3203, 13423, 13424, 6284, RCHAR, 3223, 6285, 13425, RCHAR, RCHAR, 13426, RCHAR, 1978, RCHAR, 4542, 3256, 2556, 13427, RCHAR, 13428, 13429, 1825, RCHAR, RCHAR, 6286, RCHAR, 6299, RCHAR, 6289, 13430, 1951, RCHAR, 6288, 6301, RCHAR, RCHAR, RCHAR, 6287, RCHAR, 2773, RCHAR, RCHAR, 13431, RCHAR, RCHAR, RCHAR, 6291, 6292, RCHAR, 3394, RCHAR, RCHAR, 6293, 13432, 1753, RCHAR, RCHAR, 13433, RCHAR, 2877, 3827, 13434, 6295, 13435, 13436, 13437, 3173, 13438, 13439, 13440, 13441, 13442, RCHAR, 6290, 13443, 6294, 6296, RCHAR, RCHAR, 2440, RCHAR, RCHAR, RCHAR, 13444, RCHAR, 13445, 13446, 13447, RCHAR, RCHAR, RCHAR, 6303, 3773, 13448, 3671, 3472, RCHAR, 2031, 6302, 6300, 13449, 3686, 6297, 3257, 3474, RCHAR, 3473, 13450, 2435, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6321, RCHAR, RCHAR, 13451, RCHAR, RCHAR, RCHAR, 13452, 6305, 13453, 6307, RCHAR, 13454, 13455, RCHAR, 6310, 13456, 6311, 13457, 6308, 6309, 13458, 13459, 6306, 6304, RCHAR, 13460, RCHAR, RCHAR, 6298, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13461, RCHAR, 3900, 1650, RCHAR, 13462, RCHAR, 6318, RCHAR, 6315, 13463, 6320, 13464, 13465, 6319, RCHAR, 3654, 4048, 13466, 2470, 6313, 6322, 6317, 13467, 6316, 6312, 13468, 6314, 13469, 1826, RCHAR, RCHAR, RCHAR, 13470, RCHAR, RCHAR, RCHAR, RCHAR, 3224, RCHAR, 13471, 3006, RCHAR, 13472, 13473, 3667, 13474, RCHAR, 6327, 13475, 13476, RCHAR, 3669, RCHAR, 13477, 13478, 13479, 13480, RCHAR, RCHAR, 2978, 6324, 13481, RCHAR, 3712, 13482, 6328, 3904, 13483, 3254, 13484, 6323, 6325, RCHAR, RCHAR, 6326, RCHAR, RCHAR, RCHAR, RCHAR, 13485, RCHAR, 13486, 13487, RCHAR, 13488, 13489, 13490, RCHAR, 6329, RCHAR, RCHAR, 2573, RCHAR, RCHAR, RCHAR, 3515, 6334, 6333, RCHAR, 13491, 6330, 13492, RCHAR, RCHAR, 4345, RCHAR, RCHAR, RCHAR, RCHAR, 13493, 6339, 13494, 13495, 6343, 6340, 13496, 13497, 13498, RCHAR, 13499, RCHAR, 13500, RCHAR, 6336, 13501, 13502, 13503, 13504, RCHAR, 13505, 6337, RCHAR, 13506, RCHAR, 13507, 13508, 6342, 13509, 13510, RCHAR, 6331, 4658, 6338, 6332, RCHAR, RCHAR, 6341, RCHAR, 13511, RCHAR, 13512, RCHAR, RCHAR, RCHAR, 6347, 13513, 1827, RCHAR, 6344, RCHAR, 13514, 13515, 6345, 13516, RCHAR, 6346, 6349, 13517, RCHAR, RCHAR, RCHAR, RCHAR, 13518, RCHAR, 13519, 13520, RCHAR, 13521, 6348, 3751, 13522, 13523, RCHAR, RCHAR, 6350, 4321, 3930, 6355, RCHAR, RCHAR, 6352, RCHAR, RCHAR, 13524, RCHAR, RCHAR, RCHAR, 13525, RCHAR, 6351, 2963, RCHAR, 6354, 6356, 13527, 13528, 13529, 6353, 13526, 6360, RCHAR, 6357, 13530, 13531, 13532, 13533, 13534, 13535, 6358, 6335, 13536, RCHAR, 13537, 6359, 6361, RCHAR, 13538, RCHAR, 13539, RCHAR, RCHAR, 6362, 13540, 13541, RCHAR, 13542, RCHAR, 13543, 3891, RCHAR, 6363, RCHAR, RCHAR, RCHAR, 13544, RCHAR, RCHAR, 13545, 13546, 4107, RCHAR, RCHAR, 2019, 2076, 6364, RCHAR, RCHAR, 13547, 13548, RCHAR, 3873, RCHAR, 2891, RCHAR, 4057, RCHAR, 13549, 6365, RCHAR, 4248, RCHAR, 13550, 3655, RCHAR, 3045, 3591, RCHAR, RCHAR, 2676, RCHAR, RCHAR, 13551, 1441, 13552, 6370, 6368, RCHAR, 6366, 1786, 13553, 2774, 6371, RCHAR, RCHAR, 6369, RCHAR, 6367, 6375, RCHAR, 13554, 6374, 6373, 6372, RCHAR, RCHAR, 13555, 13556, RCHAR, 6376, 13557, 13558, 13559, 6377, 2939, 13560, 6378, RCHAR, 6380, RCHAR, 13561, 6379, RCHAR, 13562, 13563, 13564, 2211, RCHAR, RCHAR, 13565, 3031, 13566, RCHAR, RCHAR, 6382, 13567, 13568, 13569, 3475, 13570, 6381, 13571, 13572, RCHAR, 6383, 13573, 3874, 3083, 2294, RCHAR, 6384, RCHAR, RCHAR, RCHAR, 13574, 4269, RCHAR, 13575, RCHAR, 13576, RCHAR, RCHAR, RCHAR, 6386, RCHAR, RCHAR, 6387, RCHAR, 6388, 13577, 6389, RCHAR, 2512, RCHAR, 6390, 2114, RCHAR, RCHAR, 1953, RCHAR, 1889, RCHAR, 6392, 13578, 4124, 2295, 6391, 13579, 13580, 13581, 6395, 4111, RCHAR, 3599, RCHAR, 13582, 3778, 13583, 13584, 13585, 2698, 6394, 13586, 2588, 2296, 2513, 1952, 3875, 6393, 13587, 13588, RCHAR, 3046, 3981, 2436, 13589, RCHAR, RCHAR, 13590, RCHAR, RCHAR, RCHAR, 13591, 2514, 3350, 13592, 6398, 4292, 2406, 13593, 6399, 2853, RCHAR, 6401, RCHAR, RCHAR, RCHAR, 2775, 2365, RCHAR, 13594, 13595, 13596, 6400, 13597, 13598, 2641, 2191, 3047, 6396, 6402, 13599, 13600, RCHAR, RCHAR, 6397, 2115, 13601, 6405, 6409, 2142, 13602, RCHAR, 13603, RCHAR, RCHAR, 6404, 13604, RCHAR, 13605, 13606, 6413, 13607, 13608, 2297, RCHAR, RCHAR, 4212, 1437, 6410, RCHAR, 13609, 1954, 13610, 6407, RCHAR, 13611, RCHAR, RCHAR, RCHAR, 6408, RCHAR, 13612, 3476, 6406, 6403, RCHAR, 1699, 2981, RCHAR, 13613, 2169, 13614, 13615, RCHAR, 6415, RCHAR, 13616, RCHAR, 13617, 13618, 13619, RCHAR, 13620, 13621, RCHAR, 13622, 6412, RCHAR, 13623, 13624, 13625, RCHAR, 6414, RCHAR, 13626, RCHAR, 6411, RCHAR, RCHAR, 13627, 13628, RCHAR, 2116, 3120, 6416, 3085, 13629, 13630, 6429, RCHAR, RCHAR, 6425, 6419, RCHAR, RCHAR, 13631, 13632, RCHAR, RCHAR, 13633, 6423, 2627, 1470, 6418, 6426, 6430, 2298, 4095, 13634, 3343, 6420, 13635, 13636, 6428, 13637, 6417, 3225, RCHAR, 6422, 1438, 4083, RCHAR, RCHAR, 13638, 13639, 13640, 13641, 13642, 6421, RCHAR, RCHAR, 2032, 3741, 13643, 13644, 13645, 3084, RCHAR, 4277, 2710, RCHAR, RCHAR, 6469, RCHAR, 13646, 6431, 13647, 3007, RCHAR, 6427, 6432, 6434, RCHAR, 3378, 6437, 13649, RCHAR, 6433, 13650, 13651, RCHAR, 3905, 1828, 13652, 13653, 4084, 13654, RCHAR, 1471, RCHAR, 13655, 6436, RCHAR, 4322, 13656, 13657, RCHAR, RCHAR, 13658, 13659, 6435, RCHAR, RCHAR, RCHAR, RCHAR, 13648, 1582, RCHAR, RCHAR, 3553, 6438, RCHAR, RCHAR, 13660, 6445, 6439, 6446, RCHAR, RCHAR, RCHAR, RCHAR, 13661, 13662, 6442, RCHAR, RCHAR, 13663, RCHAR, 13664, RCHAR, RCHAR, RCHAR, 3662, 13665, 13666, 2579, 6444, 13667, 6441, 6447, 6440, RCHAR, RCHAR, 2667, 13668, 13669, RCHAR, RCHAR, 3952, 13670, 13671, 2675, 13672, RCHAR, 6443, 6455, 13673, RCHAR, 6451, 13674, 6454, RCHAR, 6452, 6456, 6450, RCHAR, 6424, 2964, 13675, RCHAR, 3708, RCHAR, 6453, 13676, 13677, 6448, 13678, RCHAR, RCHAR, 3008, 2117, RCHAR, 2642, 13679, RCHAR, 13680, RCHAR, 13681, RCHAR, 2824, 3029, 6459, RCHAR, 13682, 6461, 6462, RCHAR, RCHAR, 6458, 6460, 13683, RCHAR, 13684, 13685, RCHAR, RCHAR, 13686, 6449, 6457, RCHAR, 6465, 6464, 13687, RCHAR, 4037, 13688, 13689, 2078, RCHAR, RCHAR, 13690, RCHAR, RCHAR, RCHAR, RCHAR, 13691, 6463, RCHAR, 6467, 6466, 6470, 13692, 6472, RCHAR, 13693, 2471, 6468, RCHAR, RCHAR, 13694, 13695, 6473, 6474, 13696, RCHAR, 6475, 13697, 6481, 3410, 6477, 13698, 6476, 6478, 6479, 13699, 6480, RCHAR, 13700, RCHAR, 13701, 6482, 6483, 13702, 13703, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1829, RCHAR, 6484, RCHAR, 6485, 13705, 13704, 13706, 13707, 13708, RCHAR, RCHAR, RCHAR, 13709, 13710, 6486, RCHAR, 13711, RCHAR, RCHAR, RCHAR, RCHAR, 6487, 6488, 6489, 13712, 6490, 6491, 13713, 13714, 6493, 6492, RCHAR, RCHAR, 6494, RCHAR, RCHAR, 13715, 13716, 13717, RCHAR, 6495, 6496, 13718, RCHAR, 13719, 13720, 13721, 13722, 6499, 6497, 6498, 2414, 2118, RCHAR, 13723, 3249, RCHAR, 3684, 13724, 2711, RCHAR, RCHAR, 3616, RCHAR, 3742, 6500, 5246, RCHAR, RCHAR, RCHAR, 13725, 13726, 13727, 13728, RCHAR, 6501, 6503, RCHAR, 4204, 6502, 6505, 6504, RCHAR, 4186, 13729, 6506, 13730, 3759, 13731, 13732, 13733, RCHAR, RCHAR, 6507, RCHAR, 13734, 13735, RCHAR, RCHAR, 6510, RCHAR, 13736, 6509, 6508, RCHAR, RCHAR, 13737, 13738, 6511, 2085, RCHAR, 13739, RCHAR, 3009, 1912, 13740, RCHAR, RCHAR, 13741, 6515, 6512, RCHAR, RCHAR, 6513, RCHAR, 13742, RCHAR, 6516, RCHAR, 6517, 6514, RCHAR, RCHAR, 13743, 1512, RCHAR, 13744, 13745, 1604, RCHAR, 13746, RCHAR, 6519, 6520, RCHAR, 13747, RCHAR, 6521, RCHAR, 4201, RCHAR, 13748, 13749, RCHAR, RCHAR, 2643, RCHAR, 6523, 6522, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13750, RCHAR, RCHAR, RCHAR, 13751, 2892, 6524, RCHAR, 13752, RCHAR, 13753, 6525, RCHAR, 13754, 6526, RCHAR, 1854, 13755, RCHAR, 13756, 13757, 1830, RCHAR, 13758, 6527, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6528, 13759, 4008, 4202, 13760, 13761, 13762, 4187, 4346, RCHAR, 2300, 6531, 2589, 6530, 13763, 13764, RCHAR, 13765, 6532, 2546, 13766, 13767, 13768, 3150, 13769, 6533, 13770, 13771, 2299, 13772, 4096, 6534, 6535, RCHAR, RCHAR, 6536, 13773, 13774, 13775, 13776, 6537, RCHAR, RCHAR, 13777, RCHAR, 13778, RCHAR, 6538, RCHAR, RCHAR, RCHAR, 13779, RCHAR, 13780, RCHAR, 13781, RCHAR, RCHAR, 2547, 13782, 13783, 4118, 13784, RCHAR, 13785, 13786, 6540, 13787, 3226, 13788, 6539, 13789, RCHAR, RCHAR, RCHAR, 13790, RCHAR, 6542, RCHAR, RCHAR, RCHAR, 6541, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6543, RCHAR, RCHAR, RCHAR, 2940, RCHAR, 6544, RCHAR, 6545, RCHAR, RCHAR, RCHAR, 3878, 6546, 13791, 3086, 6547, RCHAR, 13792, RCHAR, 13793, RCHAR, 6548, RCHAR, RCHAR, RCHAR, RCHAR, 13794, RCHAR, 4323, 6551, 13795, 6550, 6549, 3305, 13796, 6552, 2825, RCHAR, 6553, RCHAR, RCHAR, RCHAR, 6554, 4347, 6555, RCHAR, 13797, RCHAR, RCHAR, 6556, 6558, 6557, 3670, 13798, 3566, RCHAR, 4353, 3674, RCHAR, 13799, RCHAR, RCHAR, RCHAR, RCHAR, 6560, RCHAR, RCHAR, 2776, RCHAR, 3769, RCHAR, 6561, 6559, 13800, 1831, 13801, RCHAR, RCHAR, 2213, 2515, RCHAR, RCHAR, 3743, 13802, 13803, RCHAR, 2171, 3982, 13804, 6564, 6562, RCHAR, 2301, RCHAR, 2302, 1482, RCHAR, 2421, RCHAR, RCHAR, RCHAR, 13805, 13806, 3628, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1472, 6569, RCHAR, 3227, RCHAR, 13807, RCHAR, RCHAR, RCHAR, 3627, 13808, 3160, 13809, RCHAR, RCHAR, 13810, RCHAR, 13811, 13812, 6571, 13813, 13814, 6567, 6570, 6565, RCHAR, 6568, 3953, RCHAR, 13815, 2214, RCHAR, RCHAR, 1502, 6566, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13816, 13817, 6573, 13818, 6574, 13819, 13820, 3502, RCHAR, 13821, RCHAR, 2000, 13822, 13823, RCHAR, 6585, 3600, 13824, RCHAR, RCHAR, RCHAR, 2516, 13825, RCHAR, 2001, 2953, 4361, 4055, 6572, 2965, 13826, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13827, 13828, 13829, RCHAR, 1930, 6575, 13830, RCHAR, 13831, RCHAR, 13832, RCHAR, RCHAR, 6577, 13833, RCHAR, RCHAR, 13834, RCHAR, 6576, RCHAR, RCHAR, 13835, RCHAR, RCHAR, 6578, 13836, 3201, RCHAR, 3601, RCHAR, 13837, RCHAR, RCHAR, RCHAR, 3306, 13838, RCHAR, 13839, RCHAR, 6582, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13840, 6581, 13841, RCHAR, RCHAR, 13842, 6579, 13843, RCHAR, 2872, RCHAR, 3828, 6584, 13844, 6583, 2303, 4374, RCHAR, 13845, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6600, 13846, 13847, RCHAR, RCHAR, RCHAR, 6588, 6589, 13848, 13849, 13850, RCHAR, 2617, RCHAR, 13851, 6587, 13852, 2343, 6586, RCHAR, RCHAR, 6590, RCHAR, RCHAR, 13853, 3307, 3855, 3010, RCHAR, RCHAR, RCHAR, RCHAR, 3161, 6594, 13854, 6595, 6591, 13856, 13857, 13858, RCHAR, 6592, RCHAR, 6593, 13859, RCHAR, RCHAR, 13860, 2304, 13855, RCHAR, RCHAR, 6601, RCHAR, 6597, 13861, RCHAR, 13862, RCHAR, 3829, 13863, 4023, 3767, 13864, RCHAR, 6596, RCHAR, 13865, 6599, 6598, RCHAR, RCHAR, RCHAR, 3983, 6602, RCHAR, RCHAR, RCHAR, RCHAR, 13866, RCHAR, 6603, RCHAR, 13867, 3030, 13868, 6604, RCHAR, RCHAR, 6606, RCHAR, 6610, 13869, RCHAR, 6607, 6605, 3602, 6608, RCHAR, 6609, 13871, RCHAR, 13872, 1615, RCHAR, 6616, 6611, 13873, 13870, RCHAR, 6612, 13874, 13875, RCHAR, 6613, RCHAR, 3102, RCHAR, 13876, RCHAR, 13877, 6615, 6614, 6617, 13878, RCHAR, 13879, 13880, 6618, 6619, 13881, RCHAR, 2854, 13882, 1670, RCHAR, 6620, 4284, RCHAR, 2548, 13883, 13884, 2644, RCHAR, RCHAR, 13885, 13886, 13887, 2517, 3250, 13888, 13889, RCHAR, 13890, 13891, 6621, 6622, 1520, 13892, 6623, 13893, 13894, 6624, 6625, 13895, RCHAR, 6626, RCHAR, 6627, 2002, 5367, 6628, RCHAR, 2982, 6629, 2580, 13896, 6630, RCHAR, 4433, 13897, 13898, RCHAR, 6631, 3915, 1845, 13899, 13900, 3011, 2687, 13901, 3840, 2645, RCHAR, 13902, 13903, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13904, 6632, 2305, 6633, 3709, RCHAR, 6647, RCHAR, RCHAR, RCHAR, 13905, 6635, 13906, 3142, 3656, 2192, 6634, 3012, 13907, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6636, RCHAR, RCHAR, 13908, 13909, 13910, 13911, 3379, RCHAR, RCHAR, RCHAR, 13912, RCHAR, RCHAR, 13913, 13914, RCHAR, 13915, RCHAR, RCHAR, RCHAR, RCHAR, 13916, RCHAR, 6638, 6637, 6640, RCHAR, 13917, 6639, RCHAR, 6641, 13918, RCHAR, 6643, 13919, 6642, RCHAR, 1832, 13920, 6644, RCHAR, 6645, 6646, RCHAR, 13921, 2366, 4270, RCHAR, 6648, 2826, RCHAR, 13922, RCHAR, 1583, 6649, 6650, RCHAR, RCHAR, 13923, RCHAR, 13924, 6651, 13925, 13926, 13927, RCHAR, 13928, 13929, RCHAR, RCHAR, 13930, RCHAR, 13931, 13932, 1491, RCHAR, 6652, 13933, RCHAR, RCHAR, 13934, 6653, RCHAR, 13935, RCHAR, 13936, RCHAR, 13937, 3830, 13938, 13939, RCHAR, 2576, RCHAR, 6655, 13940, 13941, RCHAR, 13942, 13943, 1700, 1427, 13944, 13945, 13946, 13947, 6654, 6657, 3617, 13948, 2855, 13949, 1651, 13950, 3954, 13951, RCHAR, RCHAR, 13952, 2128, 2033, 13953, 6656, 13954, 1671, 13955, 13956, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1788, 13957, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13958, 1584, 6661, 4303, 3162, 13959, RCHAR, 3795, RCHAR, 6673, 13960, 1652, 6671, RCHAR, 6669, 6660, 13961, 6658, 13962, 6659, 13963, 2604, 2049, 3282, 13964, RCHAR, 13965, 3526, RCHAR, 13966, RCHAR, 13967, RCHAR, 1552, RCHAR, 6663, 6662, RCHAR, 13968, 13969, RCHAR, 6668, 6664, 6667, RCHAR, 13970, 13971, RCHAR, 13972, 13973, 4089, 6666, 1653, 1784, 6670, 13974, 13975, 6672, 13976, 13977, RCHAR, RCHAR, 2119, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6676, 6685, 6686, RCHAR, RCHAR, 13979, 1420, 13980, 13981, 13982, RCHAR, 13983, 13984, 6693, RCHAR, RCHAR, RCHAR, RCHAR, 1490, RCHAR, RCHAR, 6684, 13985, 13986, 13987, 6683, 13988, 6678, 6677, 13989, 6675, 6674, 3262, 13990, 3192, 6680, 13991, RCHAR, 13992, 13993, RCHAR, RCHAR, 6679, RCHAR, 13994, 13995, 13996, 6682, RCHAR, 13997, RCHAR, 3087, 2120, RCHAR, RCHAR, 13998, 13999, 1536, 6681, 14000, 2306, 14035, 13978, 14001, 14002, 14003, 3088, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14004, RCHAR, RCHAR, 6699, RCHAR, 6700, RCHAR, 1654, 14005, RCHAR, RCHAR, 1611, 6697, 14006, RCHAR, 14007, 14008, RCHAR, 14009, RCHAR, 14010, 6687, 14011, 6695, RCHAR, 6702, 6696, RCHAR, RCHAR, 14012, 6694, RCHAR, RCHAR, RCHAR, 14013, 6665, 14014, 14015, 6692, RCHAR, 14016, 14017, 6688, 14018, 14019, 14020, 1833, 6690, 6701, RCHAR, 6691, RCHAR, RCHAR, RCHAR, 14021, 14022, 6703, 14023, 6689, 3663, 14024, 14049, RCHAR, RCHAR, RCHAR, 4208, RCHAR, RCHAR, RCHAR, 6698, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6720, 14025, 14026, 14027, 6712, RCHAR, RCHAR, RCHAR, 2910, RCHAR, 14028, RCHAR, 14029, 1917, RCHAR, 2034, RCHAR, 6707, 14030, 14031, 14032, RCHAR, 1656, 14033, RCHAR, 2777, RCHAR, 6710, RCHAR, RCHAR, RCHAR, 2407, 14034, RCHAR, 3432, 6715, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14036, 3931, 14037, 6706, RCHAR, RCHAR, RCHAR, 1655, 2215, 3768, 6716, RCHAR, 6704, RCHAR, 14038, 6713, 14039, 14040, RCHAR, 6723, 14041, 6708, RCHAR, RCHAR, RCHAR, 14042, RCHAR, 6709, 3503, RCHAR, 14043, 6714, RCHAR, RCHAR, 14044, 6711, 3955, 6717, 1473, 14045, RCHAR, 14046, RCHAR, 6705, RCHAR, 14047, RCHAR, RCHAR, RCHAR, 14048, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6719, RCHAR, 6718, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3646, 6725, RCHAR, 6736, RCHAR, RCHAR, 14050, RCHAR, 1785, RCHAR, RCHAR, RCHAR, 6739, RCHAR, RCHAR, 6721, 14051, RCHAR, RCHAR, 6726, 4213, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14052, 6735, 14053, 14054, 4188, 14055, RCHAR, RCHAR, 14056, 4239, 14057, RCHAR, 14058, 14059, RCHAR, RCHAR, RCHAR, 14060, 3283, 14061, 14062, 14063, 1766, 14064, RCHAR, RCHAR, RCHAR, 14065, 3841, 6741, 3478, 14066, 14067, 1426, 14068, RCHAR, 6734, 14069, 6730, 3089, 6724, 6732, 6737, 14070, 3583, RCHAR, 14071, 14072, 1419, 14073, 6729, 14074, 6738, 3847, RCHAR, 14075, 14076, RCHAR, RCHAR, RCHAR, 14077, 6733, RCHAR, 6728, 14078, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2778, RCHAR, RCHAR, RCHAR, RCHAR, 2646, RCHAR, 14079, 14080, 2549, 14081, RCHAR, RCHAR, RCHAR, 4097, RCHAR, RCHAR, 3798, RCHAR, 14082, 6744, RCHAR, 6753, RCHAR, RCHAR, RCHAR, RCHAR, 14083, RCHAR, 14084, 14085, 14086, RCHAR, RCHAR, 6731, RCHAR, 14087, RCHAR, 14088, 1778, RCHAR, 14089, RCHAR, RCHAR, RCHAR, 2813, 6742, 14090, 6747, 3090, 14091, 14092, 6743, 14093, 6750, 14094, RCHAR, 3258, RCHAR, 6751, 14095, 14096, 4189, 6740, 1715, 14097, 6746, RCHAR, 14098, 6749, 4053, RCHAR, 14099, RCHAR, RCHAR, 6752, RCHAR, RCHAR, 6745, 6748, RCHAR, 14100, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14101, RCHAR, RCHAR, 14102, RCHAR, 3956, RCHAR, 4324, 14103, 14104, 14105, 14106, RCHAR, 6756, RCHAR, RCHAR, 14107, RCHAR, RCHAR, 14109, 14110, 6763, 14111, RCHAR, 6755, 2572, RCHAR, 14112, 14113, RCHAR, RCHAR, 6722, 14114, RCHAR, RCHAR, RCHAR, RCHAR, 14115, RCHAR, 14116, RCHAR, 14117, 3899, RCHAR, 4043, 6762, 6761, RCHAR, 6757, 6758, RCHAR, 1525, RCHAR, 14118, RCHAR, 14119, 6760, RCHAR, 6754, 14120, 14121, 14122, 14123, 3342, 14124, RCHAR, RCHAR, 14125, 14126, 6759, 1503, RCHAR, 14127, RCHAR, RCHAR, 14108, 14128, 14129, 3103, 14130, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3888, RCHAR, 14131, 6764, 6768, RCHAR, 3722, RCHAR, RCHAR, 14132, RCHAR, 6767, 2779, 2578, 6770, RCHAR, RCHAR, 2003, 14133, 14134, 14135, 14136, 14137, RCHAR, 6771, 14138, 3848, 6766, 14139, 6727, RCHAR, 14140, 14141, 14142, 14143, 14144, 14145, 14146, 6765, 14147, RCHAR, RCHAR, RCHAR, 4370, 3479, 3842, 14148, RCHAR, 6778, RCHAR, 14149, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6784, RCHAR, 14150, 14151, 14152, RCHAR, 14153, 6785, 14154, 6772, 14155, RCHAR, RCHAR, 3657, 14156, 14157, 6782, 6774, 14158, 6776, 14159, 14160, RCHAR, RCHAR, 14161, 6786, 6775, RCHAR, 14162, 6779, RCHAR, RCHAR, 1585, 14163, 3546, RCHAR, 6780, 6783, 14164, RCHAR, 14165, 14166, RCHAR, 14167, RCHAR, 6773, 14168, 3013, 14169, 6777, 2450, 2856, 2083, 4125, 14183, 4130, 2713, RCHAR, RCHAR, RCHAR, RCHAR, 14170, RCHAR, 14171, 14172, 14173, 6790, 6788, RCHAR, 14174, 14175, 14176, 14177, RCHAR, 4369, 14178, RCHAR, RCHAR, RCHAR, RCHAR, 14179, RCHAR, 6787, 14180, 14181, RCHAR, 4220, 14182, 6789, 6791, RCHAR, RCHAR, RCHAR, RCHAR, 6792, RCHAR, RCHAR, 14184, RCHAR, 14185, RCHAR, 6795, 6793, RCHAR, 14186, 14187, RCHAR, RCHAR, RCHAR, 3480, 6794, 14188, RCHAR, 14189, 3710, 6781, RCHAR, RCHAR, 14190, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14191, RCHAR, RCHAR, 14192, 2714, RCHAR, 6796, 6801, 3091, 14193, RCHAR, 6800, 14194, 14195, RCHAR, 6769, RCHAR, 14196, 14197, 6802, 3048, RCHAR, RCHAR, 6797, 6799, RCHAR, 14198, 14199, RCHAR, 14200, 14201, 14202, 6798, RCHAR, RCHAR, 5656, 5641, 14203, 14204, 6804, 14205, RCHAR, RCHAR, 14206, RCHAR, RCHAR, 14207, 6803, RCHAR, RCHAR, RCHAR, RCHAR, 14208, RCHAR, 14209, RCHAR, RCHAR, RCHAR, 4221, RCHAR, 6137, 6805, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14210, RCHAR, 14211, RCHAR, 14212, RCHAR, 14213, 14214, RCHAR, 6806, 14215, 11067, 14216, RCHAR, RCHAR, RCHAR, 14217, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6807, 2216, RCHAR, 1931, RCHAR, 14218, 14219, 6809, 4572, 14220, 14221, 14222, 14223, 1964, RCHAR, 4255, 14224, 2056, 6810, 14225, 14226, 14227, 14228, 14229, RCHAR, RCHAR, 6811, RCHAR, 14230, RCHAR, 3273, 14231, RCHAR, RCHAR, 14232, RCHAR, 6812, RCHAR, RCHAR, RCHAR, 14233, 14234, 14235, RCHAR, 3567, 14236, 1435, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14270, RCHAR, 1664, 6817, 6818, 14237, RCHAR, RCHAR, RCHAR, 14238, RCHAR, 6813, RCHAR, 2472, 14239, RCHAR, 14240, RCHAR, 14241, RCHAR, 14242, RCHAR, RCHAR, RCHAR, RCHAR, 14243, RCHAR, 6814, 3605, RCHAR, 14244, 14245, 14246, 6815, 6816, 6826, RCHAR, 14247, RCHAR, 6820, 6823, 14248, RCHAR, 14249, 14250, 14251, 6819, 14252, 14253, 14254, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14255, 14256, 14257, RCHAR, 14258, 6821, 14259, 6822, 2593, RCHAR, 6824, RCHAR, 3228, RCHAR, 2121, 1725, RCHAR, RCHAR, 14260, 14261, RCHAR, 6827, 14262, RCHAR, 14263, RCHAR, 1722, 14264, 6832, 14265, RCHAR, 6828, 6831, 14266, RCHAR, RCHAR, 14267, 3691, 14268, RCHAR, 14269, RCHAR, 6829, RCHAR, RCHAR, 6830, 3799, 3723, 6833, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3194, 6843, 14271, 6839, 14272, 14273, 1672, RCHAR, 6837, RCHAR, 3957, 6838, 14274, 14275, 6835, 14276, 6836, 6841, 6844, 14277, RCHAR, 6842, 14278, 14279, 14280, 6840, 6834, 14281, 14282, RCHAR, RCHAR, RCHAR, 3251, 14283, 6851, RCHAR, 4051, RCHAR, 14284, 14285, RCHAR, 14286, RCHAR, 14287, RCHAR, 6849, RCHAR, RCHAR, 14288, 6850, RCHAR, RCHAR, RCHAR, RCHAR, 14289, 14290, RCHAR, 14291, 14292, RCHAR, 6845, RCHAR, RCHAR, 6847, RCHAR, 14293, 14294, 6848, 14295, 14296, 14297, 6846, 14298, RCHAR, RCHAR, 14299, RCHAR, 14300, RCHAR, RCHAR, RCHAR, 2983, RCHAR, 4348, 6855, 14301, 6856, RCHAR, RCHAR, RCHAR, RCHAR, 6862, RCHAR, 2829, RCHAR, 6858, 14302, 6861, RCHAR, RCHAR, RCHAR, 14303, RCHAR, 6853, 6852, 14304, RCHAR, 6863, 14305, 14306, 1657, RCHAR, 6859, RCHAR, 6864, RCHAR, RCHAR, RCHAR, 6860, 14307, RCHAR, 14308, 14309, RCHAR, 6857, RCHAR, 3308, RCHAR, 6854, RCHAR, RCHAR, 14310, RCHAR, RCHAR, RCHAR, 3643, RCHAR, RCHAR, 6868, 14311, 14312, 14313, 14314, 14315, 14316, 14317, RCHAR, 14318, 14319, 4162, RCHAR, RCHAR, 14320, RCHAR, RCHAR, 14321, RCHAR, 14322, RCHAR, 14323, 14324, 14325, RCHAR, RCHAR, RCHAR, RCHAR, 14326, 6867, 14327, RCHAR, 6866, 14328, RCHAR, RCHAR, RCHAR, 14329, RCHAR, RCHAR, RCHAR, 6875, 14330, 14331, 14332, 6869, RCHAR, 14333, RCHAR, 6877, RCHAR, 14334, RCHAR, RCHAR, RCHAR, RCHAR, 4205, 6880, RCHAR, 6871, 14335, 14336, 6872, 14337, RCHAR, RCHAR, 6876, RCHAR, 6879, 6878, 14338, 14339, 14340, 6870, RCHAR, RCHAR, 14341, RCHAR, 6873, RCHAR, 6890, RCHAR, RCHAR, 14342, 14343, RCHAR, RCHAR, 14344, 14345, RCHAR, 14346, RCHAR, RCHAR, 14347, 6883, RCHAR, 14348, 14349, 14350, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14351, 14352, RCHAR, 14353, RCHAR, 6881, RCHAR, 14354, 6882, 14355, RCHAR, RCHAR, 6887, 6888, 14356, 1701, 14357, 1913, RCHAR, RCHAR, 6886, 14358, RCHAR, 14359, RCHAR, 14360, RCHAR, 6865, 14361, RCHAR, RCHAR, 14362, 14363, 14364, RCHAR, 6885, 6889, 6884, 14365, 6891, 14367, 14368, 14369, 6893, 6892, RCHAR, 14370, 14366, 14371, 14372, 14373, RCHAR, 14374, 14375, RCHAR, 6895, 6894, 6825, RCHAR, RCHAR, RCHAR, 6899, 14376, RCHAR, RCHAR, RCHAR, RCHAR, 14377, 14378, RCHAR, 14379, 6896, 14380, RCHAR, RCHAR, 14381, 6897, RCHAR, RCHAR, 6898, 14382, 6900, 14383, RCHAR, RCHAR, RCHAR, 2143, 14384, 6902, 14385, 6901, 14386, 2647, RCHAR, 14387, 14388, 14389, 14390, 2307, 5740, 14391, RCHAR, RCHAR, 14392, 6903, 2680, RCHAR, 14393, 14394, 1716, 14395, 6904, 14396, 1553, 14397, 2780, 6905, 14398, 14399, 2308, 6906, 1474, 14400, RCHAR, RCHAR, RCHAR, 3788, 14401, RCHAR, 6907, RCHAR, RCHAR, RCHAR, RCHAR, 2893, 14402, 6914, RCHAR, RCHAR, 6911, RCHAR, 3274, RCHAR, 14403, RCHAR, 14404, RCHAR, 6912, 6909, 2035, 14405, 6908, 6915, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2089, RCHAR, RCHAR, 3163, RCHAR, 6921, RCHAR, RCHAR, RCHAR, RCHAR, 6917, RCHAR, RCHAR, RCHAR, 3122, 6916, 14406, 6919, 14407, 14408, 14409, RCHAR, 6910, 14410, 14411, RCHAR, 6920, RCHAR, 6922, RCHAR, RCHAR, RCHAR, 14412, RCHAR, 14413, 3744, RCHAR, RCHAR, 6918, RCHAR, 6923, 6925, RCHAR, RCHAR, 2212, 6913, RCHAR, 1442, RCHAR, RCHAR, 14414, RCHAR, RCHAR, 14415, 14416, 6924, 14417, 2408, 4315, 6926, 6927, 3092, RCHAR, RCHAR, RCHAR, RCHAR, 14418, 14419, 14420, 14421, 14422, 4231, RCHAR, 14423, 14424, 14425, 6928, 4156, RCHAR, RCHAR, 6929, 6930, RCHAR, 14426, 3921, 6931, 14427, 2381, RCHAR, 4232, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14428, 6936, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14429, 14430, 14431, 6937, 2781, 6935, 14432, RCHAR, 14433, 4206, 6932, RCHAR, RCHAR, 6934, 2942, 2913, RCHAR, RCHAR, 14434, 6933, RCHAR, 6938, RCHAR, 14435, 3856, RCHAR, RCHAR, 6940, RCHAR, 6939, 14436, 14437, 14438, 1767, RCHAR, 3958, 6941, RCHAR, 14439, 14440, RCHAR, 14441, 14442, 14443, RCHAR, 14444, 6953, 6943, RCHAR, 14445, RCHAR, RCHAR, RCHAR, RCHAR, 6944, 14446, 14447, 14448, RCHAR, 6945, 6946, RCHAR, RCHAR, RCHAR, RCHAR, 14449, 14450, 14451, RCHAR, RCHAR, 14452, 6950, RCHAR, 6951, 14453, 14454, 6949, RCHAR, RCHAR, 14455, RCHAR, 14456, 6947, 14457, 6942, 6948, 14458, 14459, RCHAR, RCHAR, 14460, RCHAR, RCHAR, 6952, 7448, RCHAR, 14461, RCHAR, RCHAR, 14462, RCHAR, RCHAR, RCHAR, 1605, 14463, RCHAR, RCHAR, 14464, 14465, 14466, RCHAR, 6955, 2036, 6954, 14467, 14468, 14469, 6957, RCHAR, 6956, RCHAR, RCHAR, RCHAR, 6959, 14470, RCHAR, 6958, 14471, 6960, 14472, RCHAR, 2648, 14473, 6961, 14474, RCHAR, 6962, RCHAR, RCHAR, 14475, 14476, 14477, 14478, 6963, 2943, RCHAR, 4190, RCHAR, 6964, RCHAR, RCHAR, 3857, 3609, 6965, 14479, 6966, 2172, RCHAR, 14480, RCHAR, 1891, 14481, RCHAR, RCHAR, 6967, 14482, 14483, 2518, 3604, 6968, RCHAR, 1739, 14484, 14485, RCHAR, RCHAR, 14486, 14487, 6969, RCHAR, RCHAR, RCHAR, 14488, 6971, 4222, RCHAR, 6970, 2857, RCHAR, 6972, RCHAR, RCHAR, 6973, 14489, RCHAR, 6974, 1834, 14490, 14491, 14492, 14493, RCHAR, RCHAR, 6975, RCHAR, 14494, 6976, RCHAR, 6977, 6978, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1740, RCHAR, 14495, 14496, 14497, 14498, 14499, RCHAR, 6979, RCHAR, 6980, 6981, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1679, RCHAR, 14500, 2827, 6982, RCHAR, 14501, RCHAR, 14502, RCHAR, 14503, RCHAR, RCHAR, RCHAR, 14504, RCHAR, 14505, 6983, RCHAR, 14506, RCHAR, 6984, 14507, RCHAR, RCHAR, RCHAR, 14508, RCHAR, 14509, 2193, RCHAR, 3380, 6985, 14510, 14511, RCHAR, 14512, 2122, RCHAR, 2873, RCHAR, 6988, RCHAR, 3481, 14513, 6987, 14514, 14515, 2084, 14516, 14517, 6986, 3188, 1892, RCHAR, RCHAR, 6989, RCHAR, 6990, 14518, 2782, 14519, RCHAR, 14520, 2144, 14521, 6991, 14522, RCHAR, RCHAR, RCHAR, 3959, 14523, 14524, 2976, RCHAR, 14525, RCHAR, 1965, RCHAR, 4126, 3049, 14526, 6992, 14527, RCHAR, RCHAR, 2858, 3275, 2783, 14528, 14529, RCHAR, 14530, 6993, RCHAR, 14531, RCHAR, 14532, 6996, 14533, 6997, 14534, RCHAR, RCHAR, RCHAR, 14535, 14536, RCHAR, 2379, 3135, 6995, 14537, 2784, 3789, 14538, 14539, 14540, RCHAR, RCHAR, 6994, 14541, 14542, 2519, RCHAR, 1554, 14543, 7001, 2123, RCHAR, 14544, 2521, 14545, RCHAR, 2520, RCHAR, 4368, 7000, 6999, 3014, RCHAR, 1924, 4358, 1717, 2785, RCHAR, 14546, 14547, 14548, RCHAR, 14549, 14550, 14551, 6998, RCHAR, 14552, 14553, 14554, RCHAR, 7003, 14555, 7004, 7002, 14556, 2217, RCHAR, 4167, RCHAR, 14557, 2522, 3578, RCHAR, 14558, 14559, 7007, 14560, 2945, RCHAR, 3229, 14561, 14562, 4157, 14563, 7010, RCHAR, RCHAR, RCHAR, 2237, 14564, 2944, 7006, RCHAR, 7011, 2238, 7008, 7009, 14565, 7005, 14566, RCHAR, RCHAR, 2979, 3518, 14567, 14568, 3210, RCHAR, 1658, 14569, RCHAR, RCHAR, 14570, 14571, RCHAR, 3745, RCHAR, 14572, 1914, RCHAR, 14573, 3309, RCHAR, RCHAR, 7014, 14574, 7012, RCHAR, 14575, 3239, 14576, 14577, 14578, 2946, 1835, 7013, RCHAR, 2878, RCHAR, 14579, 4271, 14580, 14581, 14582, 4355, 14583, RCHAR, RCHAR, 7015, 7026, 3310, 14584, 7025, 14585, 7022, 7030, 7023, RCHAR, 7019, RCHAR, 3381, 7018, RCHAR, RCHAR, RCHAR, 7016, 14586, 4136, 2523, RCHAR, 14587, 7020, RCHAR, 7017, 14588, 14589, 14590, 7024, 2715, RCHAR, 2194, RCHAR, 14591, RCHAR, 3191, 14592, 3984, 1561, 1475, RCHAR, 3482, 14593, 14594, 7028, RCHAR, RCHAR, 14600, 14595, 7027, RCHAR, 3547, RCHAR, 7032, 14596, RCHAR, RCHAR, 7021, RCHAR, 7031, 7033, RCHAR, 2173, 7029, 2309, 14597, 2590, 14598, 14599, 7034, 4191, RCHAR, RCHAR, RCHAR, RCHAR, 7037, RCHAR, 7040, RCHAR, RCHAR, 7038, 3780, 14601, RCHAR, RCHAR, 14602, RCHAR, RCHAR, 7035, RCHAR, RCHAR, RCHAR, 14603, RCHAR, 2037, RCHAR, RCHAR, 14604, RCHAR, 7039, RCHAR, RCHAR, 7041, 14605, 14606, 14607, 14608, 14609, RCHAR, 14610, 7045, RCHAR, RCHAR, 7042, 14615, 7044, 7043, RCHAR, RCHAR, 14611, 14612, 14613, RCHAR, 7046, RCHAR, 2554, 14614, 7048, 7047, 3831, RCHAR, 14616, 7050, RCHAR, RCHAR, RCHAR, 14617, RCHAR, RCHAR, 2124, RCHAR, RCHAR, RCHAR, RCHAR, 7049, 7051, 14618, RCHAR, 7052, 1915, 6518, 2814, RCHAR, 7053, RCHAR, 14619, 2239, 14620, 14621, RCHAR, RCHAR, 14622, 7054, 14623, RCHAR, 7055, 14624, RCHAR, 2473, 14625, 14626, RCHAR, RCHAR, RCHAR, RCHAR, 5403, 14627, 7056, 14628, 7057, 14629, 2649, RCHAR, 7058, 7059, 14630, 14631, 7060, RCHAR, RCHAR, 7061, 7062, RCHAR, 14632, RCHAR, 14633, 14634, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3206, 14635, 14636, 7063, RCHAR, RCHAR, 14637, 14638, 7065, RCHAR, 7064, RCHAR, RCHAR, RCHAR, 14639, 3483, 14640, 7066, 14641, 3960, 14642, 7067, RCHAR, 7068, 14643, 7069, 14644, RCHAR, 14645, 14646, 7070, RCHAR, 14647, 14648, 14651, 3535, 14649, RCHAR, 14650, RCHAR, RCHAR, RCHAR, 2786, 7071, 14652, 14653, RCHAR, 14654, RCHAR, 14655, 14656, 2330, 4431, 7072, 14657, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14658, RCHAR, 14659, 14660, RCHAR, 7073, 3790, 7074, 14661, 7082, RCHAR, 14662, RCHAR, RCHAR, RCHAR, 7075, RCHAR, RCHAR, 7077, 14663, 14664, RCHAR, 7076, 7078, 14665, 3985, 7079, 7080, RCHAR, 14666, RCHAR, 14667, 14668, 7081, RCHAR, RCHAR, RCHAR, 7083, 14669, RCHAR, 14670, 14671, 1704, 3360, RCHAR, 3832, 2415, 2310, RCHAR, 14672, RCHAR, RCHAR, 3806, 1660, 3711, 7086, 1836, 2966, 7085, 7090, 3284, 4108, RCHAR, 7088, 7089, 1893, RCHAR, 7091, 3638, 3164, 14673, 14674, 3746, 3412, 7087, RCHAR, 3986, 1673, 7093, 4331, 3323, 4360, 14675, 14676, 2524, 7092, 14677, 3118, 14678, RCHAR, 7109, 3015, 14679, RCHAR, 3565, RCHAR, 3807, RCHAR, 14681, 14680, RCHAR, RCHAR, 14682, 7096, 2474, 2525, 14683, 2787, RCHAR, 3640, 14684, 2174, 7095, 7094, RCHAR, 3833, RCHAR, 14685, RCHAR, 2570, RCHAR, 14686, 3433, RCHAR, 14687, 14688, RCHAR, 14689, RCHAR, RCHAR, 14690, RCHAR, 14691, 14692, RCHAR, 7098, 7099, 2311, 7097, 14693, 14694, RCHAR, 14695, RCHAR, 14696, 7100, 7101, RCHAR, 7103, 3104, 14697, 7102, 1855, RCHAR, 7105, RCHAR, 7104, 7106, RCHAR, 14698, 7108, 7110, RCHAR, 7111, 14699, RCHAR, RCHAR, RCHAR, 14700, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2967, 14701, 2584, 7112, RCHAR, 14702, RCHAR, 1741, 14703, 7113, 14704, RCHAR, 3093, 7114, RCHAR, 7115, 3834, RCHAR, RCHAR, 1894, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14705, RCHAR, 7116, 14706, RCHAR, 14707, 3311, RCHAR, RCHAR, 14708, RCHAR, 1562, RCHAR, RCHAR, 14709, RCHAR, RCHAR, 14710, 14711, RCHAR, RCHAR, RCHAR, 14712, RCHAR, RCHAR, RCHAR, 7117, RCHAR, RCHAR, RCHAR, RCHAR, 14713, 14714, 14715, RCHAR, RCHAR, 2618, RCHAR, RCHAR, 14716, RCHAR, 2905, RCHAR, RCHAR, 14717, 14718, RCHAR, RCHAR, 14719, RCHAR, RCHAR, 14720, 3114, RCHAR, 14721, RCHAR, 14722, RCHAR, 14723, 7120, 14724, 14742, RCHAR, 7119, RCHAR, 14725, RCHAR, 7118, RCHAR, RCHAR, 14726, 14727, 14728, 14729, RCHAR, 14730, 7126, 7124, RCHAR, 14731, 7121, RCHAR, 14732, RCHAR, RCHAR, 14733, 14734, 7123, 14735, RCHAR, 14736, 7122, 7125, RCHAR, 1966, RCHAR, 7129, RCHAR, 2968, RCHAR, 7130, 14737, 14738, RCHAR, 14739, 2218, RCHAR, 7127, 7128, 14740, RCHAR, RCHAR, 4332, 14741, 14743, 14744, 3312, 14745, 3016, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7131, 14746, RCHAR, 7134, RCHAR, 14747, RCHAR, RCHAR, 14748, 14749, 14750, RCHAR, 7132, 7133, 4192, 14751, RCHAR, RCHAR, RCHAR, 3484, 7137, 14752, RCHAR, RCHAR, 14753, RCHAR, 14754, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7135, 7136, 7138, 14755, 14756, 14757, 14758, RCHAR, RCHAR, 14759, 14760, RCHAR, RCHAR, 7152, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7141, 14761, RCHAR, 14762, 7142, 7140, 14763, 14764, 14765, 14766, RCHAR, RCHAR, RCHAR, 14767, RCHAR, RCHAR, 14768, 14769, 7139, RCHAR, 3382, RCHAR, RCHAR, 7144, 7148, 7145, 7143, 14770, 7146, 14771, 14772, 14773, 7147, RCHAR, RCHAR, RCHAR, 14774, 7154, RCHAR, RCHAR, RCHAR, 7149, RCHAR, 14775, 14776, 14777, 14778, 2969, 7151, 14779, 14780, 7153, 7150, RCHAR, RCHAR, RCHAR, RCHAR, 14781, RCHAR, RCHAR, 14782, 14783, RCHAR, 14784, 14785, 14786, 7156, RCHAR, 2650, RCHAR, 7155, RCHAR, RCHAR, 14787, 14788, 14789, 7157, RCHAR, RCHAR, RCHAR, RCHAR, 7158, 14790, 14791, 7161, 7160, RCHAR, 7159, RCHAR, 14792, 7163, 7162, RCHAR, 4127, RCHAR, RCHAR, 14793, 7165, 14794, 7164, 7166, 14795, RCHAR, RCHAR, RCHAR, 7167, 14796, 14797, RCHAR, 14798, 14799, RCHAR, RCHAR, 7169, 14800, RCHAR, RCHAR, RCHAR, RCHAR, 14801, RCHAR, 14802, 7168, 2859, 7170, 14803, 14804, 2050, 7171, 7173, RCHAR, 14805, RCHAR, 14806, RCHAR, RCHAR, RCHAR, RCHAR, 14807, 14808, RCHAR, RCHAR, 7174, RCHAR, 14809, 14810, RCHAR, 14811, 14812, 7175, 7172, 14813, 7176, RCHAR, 2591, 7177, 1895, 2086, RCHAR, 14814, RCHAR, 14815, 2175, RCHAR, 14816, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7178, 14817, RCHAR, RCHAR, 3557, RCHAR, RCHAR, 3413, 7179, RCHAR, RCHAR, RCHAR, RCHAR, 14818, RCHAR, RCHAR, 7182, RCHAR, 14825, 14819, RCHAR, 14820, 14821, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14822, 2557, 14823, 14824, 7181, 7180, 2125, 7183, RCHAR, 14826, RCHAR, 14827, 1742, RCHAR, 7185, RCHAR, 14828, 14829, 2409, 7184, RCHAR, 7193, RCHAR, RCHAR, 14830, 14831, RCHAR, 7187, 7189, 3922, 7186, 14832, 14833, 14834, 7188, RCHAR, 7192, 7190, 1896, 14835, 7191, 14836, 14837, RCHAR, 14838, RCHAR, 14839, 7194, 14840, 14841, 3629, 4285, RCHAR, 14842, 14843, 14844, 2651, RCHAR, RCHAR, RCHAR, 7195, 14845, 14846, 14847, 14848, 4137, 7197, 14849, 7196, RCHAR, RCHAR, 7200, 4168, 14850, 14851, 7199, 14852, 1768, 7198, 7203, 14853, RCHAR, 7202, RCHAR, RCHAR, 7201, 3401, 7204, 14854, RCHAR, 14855, 14856, 14857, 14858, 14859, RCHAR, 7205, 14860, RCHAR, RCHAR, RCHAR, 7206, 14861, 14862, 2331, RCHAR, 2072, 7207, 7208, 7209, 14863, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2860, 7210, 14864, 2550, 7211, 14865, 14866, RCHAR, 7212, 14867, 14868, 14869, 4606, 4605, RCHAR, RCHAR, RCHAR, RCHAR, 7213, 6471, 7214, 3199, 2830, 3603, RCHAR, RCHAR, 14870, 14871, 7215, 14872, RCHAR, 3906, 3341, 2349, RCHAR, 14873, 3204, 14874, 14875, 1513, RCHAR, 4035, 2874, 14876, RCHAR, RCHAR, RCHAR, 14877, 14878, RCHAR, 14879, 2129, RCHAR, 14880, 2038, 14881, 14882, 3907, 14883, RCHAR, RCHAR, RCHAR, RCHAR, 7216, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14884, RCHAR, 7218, 14885, 14886, 7217, 1661, RCHAR, 14887, 3563, 7219, 3658, RCHAR, 3402, 14888, 7220, 2681, 14889, RCHAR, RCHAR, 7222, 14890, 14891, 4075, 7237, 7224, 7225, 14892, RCHAR, 3330, 14893, RCHAR, 3165, 3094, 14894, 3485, 14895, 7223, 1932, RCHAR, 14896, RCHAR, RCHAR, 7232, 14897, 7229, 7242, 3486, 3259, 7226, RCHAR, 3383, 3434, 7227, 7231, 2883, 14898, 3642, 3333, 14899, RCHAR, 2947, 7230, 3115, 3105, 7228, 1418, 4325, RCHAR, RCHAR, RCHAR, 7233, 14900, 14901, 14903, RCHAR, 14904, 14905, 3166, 14902, RCHAR, 2652, 2861, 14906, 14907, 7235, 7234, 14908, 1488, 7236, RCHAR, RCHAR, 3774, RCHAR, 7244, 14909, RCHAR, 3536, 2894, 14910, 14911, 3252, RCHAR, 2061, RCHAR, 7243, 4158, 1534, 14912, 3908, 1662, 7238, 7239, 7240, 7241, 3504, 3198, 1476, 7245, RCHAR, 7246, 7804, RCHAR, 14913, 3130, 14914, 7247, RCHAR, 1586, 3051, 14915, 2176, RCHAR, 4193, 14916, 14917, 7248, 3395, RCHAR, RCHAR, 14918, 3095, 2592, 7249, 14919, RCHAR, 7252, RCHAR, 14920, 2700, 7250, 3018, 3017, 14921, 1477, RCHAR, 4272, 7254, RCHAR, 3747, 7256, 7255, 7253, 6271, 1837, 14922, RCHAR, 7221, 14923, 7258, 7257, 14924, 14925, RCHAR, 14926, 7259, 14927, 4159, RCHAR, RCHAR, RCHAR, 14928, RCHAR, 14929, 14930, 14931, RCHAR, 14932, RCHAR, RCHAR, RCHAR, RCHAR, 14933, 14934, 14935, 3542, RCHAR, 14936, 3961, RCHAR, 7260, RCHAR, 2594, RCHAR, RCHAR, RCHAR, RCHAR, 7261, 14937, 7262, 14938, 14939, 14940, 7263, 14941, RCHAR, 3384, RCHAR, RCHAR, RCHAR, RCHAR, 14942, 14944, RCHAR, RCHAR, 1483, RCHAR, 14945, 14946, 14947, RCHAR, 14948, 14949, RCHAR, 2312, RCHAR, 14943, RCHAR, 4349, RCHAR, RCHAR, RCHAR, 14958, RCHAR, RCHAR, 14950, RCHAR, 14951, 14952, 14953, RCHAR, 7267, 14954, 14955, RCHAR, 14956, RCHAR, 2087, 7264, RCHAR, 7265, 14957, RCHAR, RCHAR, 3843, RCHAR, RCHAR, 14960, RCHAR, 1743, RCHAR, 14961, 14962, RCHAR, RCHAR, RCHAR, 14963, 4160, 14959, 2004, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3435, 14964, 14965, 14966, RCHAR, 7268, RCHAR, 14967, 14968, 14969, RCHAR, 14970, RCHAR, RCHAR, RCHAR, RCHAR, 14971, RCHAR, RCHAR, 14972, RCHAR, 7269, RCHAR, 14973, RCHAR, 14974, 14975, 14976, 7270, 14977, RCHAR, 14978, RCHAR, 14979, RCHAR, 14980, RCHAR, 14982, 14983, RCHAR, 14981, RCHAR, 14984, RCHAR, 14985, RCHAR, RCHAR, RCHAR, 3385, 14986, 14987, 7272, 14988, 7271, RCHAR, 14989, RCHAR, 14990, 14991, RCHAR, 14992, 14993, RCHAR, 14994, 14995, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14996, RCHAR, RCHAR, RCHAR, 14997, 14998, 3528, 7273, 2653, 2601, 3630, 3276, 14999, RCHAR, RCHAR, 2619, 15000, 2895, RCHAR, 7274, 15001, 7275, 15002, 15003, 15004, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15005, 2880, 7276, 15006, 7277, RCHAR, 15007, RCHAR, 7278, 4214, RCHAR, 2654, 15008, RCHAR, RCHAR, RCHAR, RCHAR, 7280, 7279, 15009, 2313, RCHAR, 2338, 2475, 15010, 15011, 15012, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15013, 7283, 15014, RCHAR, 15015, 15016, 2701, RCHAR, 7282, 15017, 7281, RCHAR, 3174, 15018, RCHAR, 2240, 15019, 2948, 15020, 15021, 15022, RCHAR, 3681, 15023, RCHAR, RCHAR, RCHAR, 2656, RCHAR, 15024, RCHAR, RCHAR, 15025, 7284, RCHAR, 2788, RCHAR, 15026, RCHAR, 15027, RCHAR, 7287, 7285, 15028, 15029, 15030, 7286, 15031, 15032, 15033, 15034, 7289, 7288, 15035, RCHAR, 2815, RCHAR, 7290, 15036, 15037, 15038, RCHAR, 15039, 7291, 7292, 15040, 15041, RCHAR, 15042, 3713, 2400, 2602, 7293, RCHAR, 7294, 4233, 2668, 4119, 4273, 7295, 2039, RCHAR, 15043, 15044, RCHAR, 7296, 15045, 3386, 15046, 15047, 7299, 1779, 2862, 15048, 7297, RCHAR, 7298, RCHAR, 3353, 15049, 15050, 4000, 2065, RCHAR, 15051, 15052, RCHAR, 15053, 15054, 15055, 15056, 15057, 15058, RCHAR, RCHAR, RCHAR, 7301, 7302, 15059, RCHAR, 15060, RCHAR, 15061, 7300, 15062, RCHAR, 7304, 15063, 15064, RCHAR, RCHAR, 15065, 15066, 15067, 15068, RCHAR, 15069, 15070, RCHAR, 15071, 3540, 1726, RCHAR, 15072, 7308, 15073, 15074, 7305, 7307, 15075, RCHAR, 15076, RCHAR, RCHAR, RCHAR, 15077, 15078, 7303, RCHAR, RCHAR, RCHAR, RCHAR, 15079, 15080, 15081, 15082, RCHAR, 15083, 7378, RCHAR, RCHAR, 7306, RCHAR, 15084, 15085, 15086, RCHAR, RCHAR, 15087, 4304, 15088, 15089, 2219, 15090, 15091, 15092, RCHAR, 15093, RCHAR, 15094, 7316, 15095, RCHAR, 15096, 15097, 3403, 7311, 15098, 15099, 7314, 7312, 15100, 7317, RCHAR, 15101, 15102, 15103, 7318, 15104, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7310, 15105, 15106, 7323, 1587, 15107, 15108, 7309, RCHAR, 15109, 15110, 3678, RCHAR, 7313, 15111, 2789, 15112, 15113, 15114, RCHAR, RCHAR, RCHAR, RCHAR, 15115, 15116, 15117, 2314, RCHAR, RCHAR, RCHAR, 15118, 15119, 15120, 15121, 15122, RCHAR, 15123, 15124, 15125, 3987, 15126, 2041, RCHAR, RCHAR, 2669, RCHAR, 3505, RCHAR, RCHAR, 15127, 15128, 15129, RCHAR, RCHAR, 15130, 15131, RCHAR, RCHAR, 3020, 15132, 7321, RCHAR, 7315, 7320, 15133, 4076, 15134, 3313, 7322, 7319, RCHAR, RCHAR, 15135, 15136, RCHAR, RCHAR, RCHAR, 15137, 15138, RCHAR, 15139, 15140, RCHAR, RCHAR, 15141, RCHAR, 3019, RCHAR, 15142, RCHAR, RCHAR, 15143, RCHAR, RCHAR, RCHAR, 15144, 7326, 15145, 7325, 15146, 15147, 15148, 15149, RCHAR, 15150, 15151, 15152, 15153, 15154, RCHAR, 15155, 15156, 15157, 15158, RCHAR, RCHAR, 15159, 15160, 15161, 15162, 7324, 15163, RCHAR, 3962, 15164, RCHAR, 15165, RCHAR, 15166, 15167, 15168, RCHAR, RCHAR, 15169, 15170, RCHAR, 15171, 15172, 15173, RCHAR, 15174, 2722, 15175, RCHAR, 15176, 15177, 7327, 3916, RCHAR, 15178, 1555, 15179, RCHAR, 15180, RCHAR, 3797, 3277, RCHAR, RCHAR, RCHAR, RCHAR, 1967, 15181, 7329, 15182, 2316, RCHAR, RCHAR, 15183, 15184, RCHAR, 15185, RCHAR, RCHAR, RCHAR, 2455, RCHAR, 15186, RCHAR, RCHAR, RCHAR, RCHAR, 15187, RCHAR, 7328, 2896, 15188, RCHAR, RCHAR, 15189, 15190, RCHAR, RCHAR, 2897, 7332, 7334, RCHAR, 15191, 15192, 15193, 15194, 2816, 15195, 7333, 7335, 15196, 15197, 2024, 15198, 3796, 15199, 15200, 2603, 4326, RCHAR, 7331, 2437, RCHAR, RCHAR, 4354, 15201, 15202, 7337, 15203, 15204, RCHAR, RCHAR, 7336, 7338, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7330, RCHAR, RCHAR, 15205, 15206, 15207, RCHAR, 3550, RCHAR, 3436, RCHAR, RCHAR, 15208, 15209, 15210, RCHAR, 3344, 15211, 7343, 15212, 15213, RCHAR, 15214, 3230, 7339, RCHAR, 15215, RCHAR, 7340, RCHAR, RCHAR, RCHAR, 15216, 15217, RCHAR, 15218, RCHAR, 15219, 15220, RCHAR, 2080, 15221, 7342, 15222, 15223, 15224, RCHAR, 15225, 15226, 2177, 15227, RCHAR, RCHAR, RCHAR, 15228, RCHAR, 7341, 15229, 2790, 15230, 15231, 15232, 15233, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15234, RCHAR, 15235, 15236, 1780, 15237, RCHAR, 15238, RCHAR, RCHAR, 15239, RCHAR, 7347, 15240, 2380, 3096, 15241, RCHAR, 3331, 15242, RCHAR, RCHAR, 15243, RCHAR, RCHAR, 15244, RCHAR, 15245, 15246, RCHAR, 15247, 1718, 15248, 15254, RCHAR, 15249, 7345, 7346, 3324, RCHAR, 7344, RCHAR, RCHAR, RCHAR, 15250, 15251, 15252, RCHAR, RCHAR, 7348, 15253, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15255, RCHAR, 7354, 15256, 15257, 15258, 15259, 7357, 15260, 15261, 15262, 15263, 15264, RCHAR, RCHAR, 7356, 3396, RCHAR, 15265, RCHAR, RCHAR, 7349, 7350, 7353, 15266, RCHAR, RCHAR, 15267, 7355, 15268, 15269, RCHAR, 2005, 15270, RCHAR, 7358, 7352, 15271, 15272, 7351, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15274, 15275, 15273, 15276, 15277, RCHAR, 15278, RCHAR, RCHAR, RCHAR, 15279, 15280, 7362, 15281, RCHAR, RCHAR, 7363, 15282, 15283, RCHAR, RCHAR, RCHAR, 15284, 15285, 15286, 7364, RCHAR, RCHAR, 7361, 7360, 15287, 15288, 15289, 2791, 3487, 7359, RCHAR, RCHAR, RCHAR, RCHAR, 15290, RCHAR, 7368, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7366, RCHAR, RCHAR, 15291, 15292, RCHAR, 15293, 15294, 15295, 15296, 7367, 7365, RCHAR, 3189, RCHAR, 7369, 15297, RCHAR, 15299, RCHAR, 15298, RCHAR, 7370, RCHAR, 15300, 7372, 15301, RCHAR, RCHAR, 15302, RCHAR, 15303, RCHAR, 15304, RCHAR, RCHAR, RCHAR, RCHAR, 1838, 7371, 4131, RCHAR, 15305, RCHAR, RCHAR, RCHAR, 15306, 7383, 7373, 15307, RCHAR, 7376, 15308, 7374, 15309, 7375, 15310, RCHAR, RCHAR, RCHAR, RCHAR, 15311, RCHAR, 7377, 15312, RCHAR, 15313, 15314, 15315, 7379, 15316, 15317, RCHAR, RCHAR, 7380, RCHAR, 7381, RCHAR, RCHAR, RCHAR, RCHAR, 7384, 7382, 7385, 7387, RCHAR, 7386, RCHAR, 15319, 15318, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3314, 15320, 15321, RCHAR, RCHAR, RCHAR, RCHAR, 15322, RCHAR, 4112, RCHAR, 7388, 3021, 15323, RCHAR, RCHAR, 7389, 15324, 3889, 7390, 1702, 15325, 15326, 15327, 1531, RCHAR, 1840, RCHAR, 1839, 7391, RCHAR, 7392, RCHAR, 7393, 7394, RCHAR, RCHAR, RCHAR, 15328, 15329, 15330, 7395, 15331, 1841, 1744, 2317, 3687, 15332, 7397, 7396, 15333, RCHAR, 15334, 15335, 7398, RCHAR, RCHAR, RCHAR, RCHAR, 1563, RCHAR, 15336, RCHAR, 15337, RCHAR, RCHAR, 7401, 15338, 7400, 7399, 15339, 7402, 15340, RCHAR, RCHAR, RCHAR, 7405, RCHAR, RCHAR, 15341, 1448, 15342, 15343, 7403, 15344, 7407, 7406, RCHAR, RCHAR, 15345, 15346, 15347, 15348, 7409, 7408, 7410, RCHAR, 3491, 15349, 15350, RCHAR, 7411, 15351, 15352, 15353, 15354, 7412, 7414, RCHAR, 15355, 7413, 15356, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3835, 15357, 15358, RCHAR, RCHAR, 7415, 15359, RCHAR, 15360, 15361, 15362, RCHAR, 7416, RCHAR, 2418, RCHAR, 15363, RCHAR, 7417, 7418, RCHAR, 15364, 3988, 15365, RCHAR, RCHAR, RCHAR, 15366, 15367, 15368, 15369, 3050, 15370, 15371, RCHAR, 1413, 3144, 15372, 7419, RCHAR, 3836, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7422, 7420, 2318, RCHAR, 7421, 2195, RCHAR, 15373, RCHAR, 15374, RCHAR, 15375, 15376, 15377, RCHAR, RCHAR, 3890, 7424, 7426, 7425, 7427, RCHAR, 15378, 1504, 2875, 2723, 1842, 7428, RCHAR, RCHAR, RCHAR, 3641, RCHAR, 7430, RCHAR, 15379, RCHAR, 1505, RCHAR, 7429, 3325, 15380, 4274, 3488, 7423, 4235, RCHAR, 2178, 15381, 15382, 4194, 15383, 15384, RCHAR, 15385, 15386, 15387, 15388, 2062, 4249, RCHAR, 2075, 15389, 3167, 6580, RCHAR, 7431, 1703, 2898, RCHAR, 15390, RCHAR, RCHAR, 1745, 7433, 15391, 7434, 7432, 2135, 15392, 2410, 2792, 15393, RCHAR, 15394, 1506, RCHAR, RCHAR, 4286, 15395, 15396, 15397, 7436, 7251, 15398, 7435, RCHAR, RCHAR, RCHAR, 15399, 15400, 7439, 7437, 7438, 15401, 7440, RCHAR, 7441, 4305, 7442, 7443, 15402, 2954, 3692, RCHAR, RCHAR, RCHAR, 2912, 1856, RCHAR, RCHAR, 4161, 1674, 2655, 2220, RCHAR, 7446, 15403, 7445, 2526, 7447, 7444, RCHAR, RCHAR, 2451, 15404, RCHAR, RCHAR, 7451, 6874, RCHAR, 15406, 4659, 15407, 2906, 7449, 15408, 15409, 15410, RCHAR, RCHAR, 4234, 3558, RCHAR, RCHAR, RCHAR, RCHAR, 1514, 15411, 2980, 2559, RCHAR, RCHAR, RCHAR, 15412, 3876, 15413, 1535, RCHAR, RCHAR, RCHAR, 4306, 4210, RCHAR, 7452, 15414, 3420, RCHAR, RCHAR, RCHAR, RCHAR, 2628, RCHAR, 15415, 15416, 7453, 15417, 7454, 2863, 7455, 15418, 4307, RCHAR, RCHAR, 7450, 7457, 7459, RCHAR, 7458, RCHAR, 7456, RCHAR, RCHAR, 7460, RCHAR, RCHAR, 7461, 15419, 15420, 3097, 15421, 1663, RCHAR, RCHAR, 15422, 15423, 15424, 7462, RCHAR, RCHAR, 4065, 15425, RCHAR, 7463, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7464, 15426, 4333, 15427, RCHAR, RCHAR, RCHAR, RCHAR, 5468, 7465, RCHAR, RCHAR, RCHAR, 7466, 7467, RCHAR, RCHAR, 15428, 7471, 15429, 7468, RCHAR, 7469, RCHAR, 7470, 7472, 15430, RCHAR, RCHAR, RCHAR, 15431, 15432, RCHAR, RCHAR, 2949, RCHAR, RCHAR, 15433, 4128, 15434, 15435, 2950, 15436, 15437, 7473, RCHAR, 3748, RCHAR, 7474, 7758, 4085, 15438, 7475, RCHAR, 7476, 15439, 7477, 1746, 15440, 7479, RCHAR, 2876, 15441, RCHAR, RCHAR, 7480, RCHAR, 15442, 2071, RCHAR, 15443, 15444, 15445, 7481, 7485, 15446, 7483, 15447, RCHAR, 15448, 15449, 7484, RCHAR, RCHAR, 1774, 7482, 7486, RCHAR, RCHAR, 15450, RCHAR, 7487, RCHAR, 1449, RCHAR, 7488, 7489, RCHAR, RCHAR, RCHAR, RCHAR, 15451, 15452, 15453, 2793, 15454, 15455, RCHAR, 7490, RCHAR, 15456, 15457, 1918, RCHAR, 15458, 7493, RCHAR, RCHAR, 7492, RCHAR, 7491, RCHAR, RCHAR, 7036, 15459, 3913, 15460, RCHAR, RCHAR, 15461, 15462, 7494, 7495, 15463, 15464, RCHAR, 15465, 15466, 15467, RCHAR, 15468, RCHAR, 15469, 15470, RCHAR, 15471, RCHAR, 7496, 15472, 15473, 7497, 15474, 7498, 15475, 15476, 7499, 15477, 15478, 15479, RCHAR, 15480, 15481, RCHAR, 1843, 15482, RCHAR, RCHAR, 15483, 15484, 15485, RCHAR, 15489, 7500, 15486, 15487, RCHAR, 15488, 15490, RCHAR, RCHAR, 15491, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7501, 3574, 15492, RCHAR, 15493, 7503, 1624, 15494, 7506, 7505, 15495, 15496, RCHAR, 15497, 1507, RCHAR, RCHAR, RCHAR, 2006, RCHAR, 3892, 3315, 2351, RCHAR, 2319, 2702, 15498, 2879, RCHAR, 15499, RCHAR, 7508, 15501, 15502, 7507, 4169, 1857, 3715, 3537, 15503, RCHAR, 15504, 2911, 4275, 15500, 2126, RCHAR, 15505, RCHAR, 15506, RCHAR, 15507, 7511, RCHAR, 15508, 7510, 15517, 15509, RCHAR, RCHAR, RCHAR, RCHAR, 15510, 3990, 3489, 15511, 15512, 15513, RCHAR, 15514, 15515, 1551, 15516, RCHAR, 7512, 7509, RCHAR, RCHAR, 3808, 4209, 7513, 15518, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15519, RCHAR, 7514, 15520, RCHAR, RCHAR, 15521, 7516, 3175, 1750, 1751, 7515, RCHAR, 15522, 15523, 15524, 1858, 2179, 15525, 15526, 1859, 15527, 15528, 3414, RCHAR, RCHAR, 4293, RCHAR, RCHAR, RCHAR, 15529, 15530, RCHAR, 15531, 15532, 2221, RCHAR, RCHAR, 15533, 7517, 15534, RCHAR, RCHAR, 7518, 7519, 7520, RCHAR, 7522, 7521, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3846, RCHAR, 7523, 15535, RCHAR, 15536, 15537, 7524, 15538, 7525, RCHAR, RCHAR, 15539, RCHAR, 7526, 15540, 15541, RCHAR, 15542, 15543, RCHAR, RCHAR, RCHAR, 15544, RCHAR, RCHAR, 15545, 7528, 7527, 15546, 7529, RCHAR, 15547, RCHAR, RCHAR, RCHAR, 15548, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3749, 6529, RCHAR, RCHAR, 2828, RCHAR, 15549, 1897, 15550, RCHAR, 15551, 15552, 15553, RCHAR, 7530, 15554, 7531, RCHAR, 4617, 5666, 3716, RCHAR, RCHAR, 1500, 15555, 1436, RCHAR, 15556, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2527, 3963, 2819, RCHAR, RCHAR, RCHAR, 15557, 7532, RCHAR, 4104, RCHAR, 15558, 15559, 7533, 4195, RCHAR, 1537, RCHAR, RCHAR, RCHAR, 2476, 15560, 7534, 1675, 7535, 15561, 15562, 15563, 7536, RCHAR, 15564, 15565, 15566, 7538, 7539, 15567, 7541, 7537, 15568, RCHAR, 7540, RCHAR, 15569, 15570, 1844, RCHAR, RCHAR, 15571, 7542, RCHAR, 7543, RCHAR, RCHAR, 15572, 15573, 15574, 15575, 15576, RCHAR, RCHAR, RCHAR, 15577, 15578, 15579, 15580, 7544, 7545, RCHAR, 15581, 15582, 7546, RCHAR, RCHAR, 7548, 15583, 15584, 15585, 7547, RCHAR, 7550, 7553, 15586, 15587, RCHAR, 7549, 7551, 7552, RCHAR, 15588, 7554, RCHAR, 2007, 15589, 15590, RCHAR, 15591, 15592, RCHAR, 15593, 15594, 15595, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2620, 7555, 7556, 2320, RCHAR, 15596, RCHAR, 15597, RCHAR, 15598, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7557, 15599, RCHAR, 1721, RCHAR, RCHAR, RCHAR, 3618, 7558, 7559, RCHAR, 15600, 15601, 15602, 3253, 3552, 15603, RCHAR, RCHAR, RCHAR, 15604, 15605, RCHAR, 7560, 15606, RCHAR, 15607, RCHAR, 3664, RCHAR, 15608, 3145, 1559, 2051, RCHAR, 2052, 15609, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3278, 7565, 2053, 15610, 15611, 1676, RCHAR, RCHAR, 7564, 15612, 15613, 7562, 15614, 7563, 15615, 7561, RCHAR, RCHAR, 7575, RCHAR, RCHAR, RCHAR, RCHAR, 15616, RCHAR, RCHAR, 15617, 15618, 15619, 7566, 7567, RCHAR, 15620, 7568, 7569, RCHAR, 15621, 15622, RCHAR, RCHAR, 7571, 15623, RCHAR, 7570, RCHAR, 15624, 15625, 2688, RCHAR, 7572, 15626, 15627, 15628, 7574, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15629, 15630, RCHAR, 1898, 7573, 15631, 15632, 3098, 2180, RCHAR, RCHAR, 15633, RCHAR, RCHAR, 7576, RCHAR, RCHAR, RCHAR, RCHAR, 15634, RCHAR, 15635, RCHAR, 15636, 15637, 15638, RCHAR, RCHAR, 15639, 3146, RCHAR, RCHAR, 7577, RCHAR, 15640, 15641, RCHAR, 3490, RCHAR, RCHAR, 15642, RCHAR, 15643, 15644, 7578, 15645, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7583, RCHAR, 7581, 15647, 7580, 7582, 15648, 7579, RCHAR, 15646, RCHAR, RCHAR, 15649, 15650, 15651, 7585, 15652, RCHAR, RCHAR, 15653, RCHAR, RCHAR, 15654, 7584, 15655, 7587, RCHAR, RCHAR, 2008, 7586, RCHAR, 15656, RCHAR, 7588, RCHAR, RCHAR, 7589, RCHAR, 7591, 7590, RCHAR, RCHAR, RCHAR, 7592, 7594, 7593, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 2347, RCHAR, 15657, RCHAR, 15658, 7595, 15659, 15660, 7596, RCHAR, 15661, RCHAR, 15662, 15663, 15664, RCHAR, 1719, 15665, RCHAR, 15666, 7597, RCHAR, 15667, 15668, 7598, 15669, RCHAR, 15670, 2900, RCHAR, 15671, RCHAR, 15672, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15673, 7599, 15674, 7600, 15675, 7601, 7602, 15676, 15677, 15678, 2321, RCHAR, RCHAR, 15679, 15680, RCHAR, 7603, 7604, 15681, RCHAR, 7605, 7606, 15682, 15683, 7607, 15684, RCHAR, 15685, 3682, 7609, 15686, 3765, 7610, 7608, RCHAR, 7612, 15687, 15688, 7611, 15689, RCHAR, 7613, RCHAR, 15690, 15691, 7614, RCHAR, 15692, RCHAR, 15693, 15694, 15695, 15696, 15697, 15698, 15699, 7615, RCHAR, 15700, 15701, RCHAR, 15702, 15703, 15704, 15705, RCHAR, 15706, RCHAR, 15707, RCHAR, RCHAR, RCHAR, 15708, RCHAR, 7616, 15709, 7617, 15710, 15711, RCHAR, RCHAR, 7618, 15712, RCHAR, 7619, 7620, RCHAR, 7621, 15713, 7622, 7623, 7624, 7625, 15714, RCHAR, 15715, 7626, 7627, RCHAR, 5660, 7628, 15716, 15717, 15718, RCHAR, 15719, RCHAR, 15720, 15721, 6385, 1899, 15722, RCHAR, RCHAR, RCHAR, 1692, 2367, 7630, 7629, 4046, RCHAR, RCHAR, 15723, RCHAR, RCHAR, 15724, 15725, 7632, 7633, 7631, RCHAR, 7634, RCHAR, RCHAR, 4013, 15726, 15727, 15728, 7635, RCHAR, 1970, 15729, RCHAR, RCHAR, 15730, RCHAR, RCHAR, 15731, RCHAR, 15732, RCHAR, 15733, 15734, RCHAR, 15735, RCHAR, 15736, 15737, 15738, 15739, 15740, 4328, RCHAR, RCHAR, RCHAR, 15741, 7636, 15742, RCHAR, 15743, 15744, 15745, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15746, 15747, RCHAR, RCHAR, 7638, 15748, 15749, 15750, 15751, RCHAR, 15752, 15753, 15754, RCHAR, 15755, 1439, 15756, 15757, 7639, 3864, 7637, 15758, RCHAR, 7640, 7641, RCHAR, RCHAR, 15759, RCHAR, RCHAR, 15760, 15761, 7642, 7643, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15762, 15763, 7644, 15764, 4025, 2456, 15765, 2439, 3022, RCHAR, 15766, 15767, 15768, RCHAR, 7645, RCHAR, RCHAR, 15769, 15770, 7648, RCHAR, 15771, 15772, RCHAR, 15773, 15774, 7646, 15775, RCHAR, RCHAR, RCHAR, RCHAR, 7649, 15776, 15777, 2242, 7647, RCHAR, RCHAR, RCHAR, 15778, 7650, 15779, 7651, 7652, RCHAR, 7656, RCHAR, 2453, 15780, 15781, RCHAR, RCHAR, 3169, RCHAR, 15782, RCHAR, 15783, RCHAR, 7657, 7654, 7653, 7655, 15784, RCHAR, 15785, 2130, RCHAR, 15786, 15787, RCHAR, RCHAR, RCHAR, 15788, 7661, 7660, 7659, 15789, RCHAR, 1428, RCHAR, 15790, 15791, 15792, 15793, RCHAR, RCHAR, 15794, RCHAR, 15795, 15796, RCHAR, 15797, RCHAR, 7671, RCHAR, 7667, RCHAR, 7668, 7664, 7670, 15798, 7666, 1757, RCHAR, 15799, 4367, 15800, 7669, 7665, 7663, 7662, 15801, RCHAR, 15802, 15803, 15804, 7673, 15805, RCHAR, 15806, RCHAR, RCHAR, 7676, 15807, 15808, 7675, 7674, 15809, 15810, 15811, 15812, 15813, RCHAR, RCHAR, 3800, 7672, 1492, 7677, 15814, 7679, RCHAR, RCHAR, 15815, 15816, 15817, RCHAR, 1770, 7658, 1526, RCHAR, 15818, 7681, RCHAR, RCHAR, 15819, RCHAR, 15820, 15821, 15822, 7680, 7678, 3208, 15823, 15824, RCHAR, RCHAR, RCHAR, 15825, 15826, 15827, RCHAR, 4027, 15828, 15829, RCHAR, 15830, 4287, 15831, RCHAR, 7682, 15832, 15839, 15833, 15834, 15835, 7683, RCHAR, RCHAR, 15836, RCHAR, RCHAR, RCHAR, 7684, 15841, 15837, 15838, 15840, RCHAR, RCHAR, 15842, RCHAR, 15843, RCHAR, 15844, RCHAR, RCHAR, 15845, 7685, 15846, 7686, RCHAR, RCHAR, 15847, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 3316, 15848, 7687, RCHAR, 3688, RCHAR, 7692, 7688, RCHAR, RCHAR, RCHAR, 7689, RCHAR, 15849, 3964, 4077, RCHAR, 3525, 15850, RCHAR, 15851, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15853, 7693, RCHAR, RCHAR, 7694, 3507, 7691, 7690, RCHAR, 15852, RCHAR, RCHAR, 1607, RCHAR, RCHAR, 15854, 7702, RCHAR, RCHAR, 7701, RCHAR, 15855, 15856, RCHAR, RCHAR, 1588, 15857, 15858, 15859, 7699, RCHAR, RCHAR, RCHAR, 7698, RCHAR, RCHAR, 7696, RCHAR, 1782, RCHAR, 7695, 2555, 1606, RCHAR, RCHAR, 15860, 15861, RCHAR, 15862, 15863, 15864, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15865, 2322, 15866, 15868, 7705, 7704, RCHAR, 7703, 15869, 15870, 7700, 15867, 7706, 15871, 7707, RCHAR, 15872, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7712, 7711, RCHAR, 15873, 15874, RCHAR, RCHAR, RCHAR, RCHAR, 7713, RCHAR, RCHAR, 1516, 7708, 7709, 15875, 2339, 4066, 15877, 15876, 7710, 15878, RCHAR, RCHAR, RCHAR, 15879, 15880, 15881, 3965, RCHAR, RCHAR, 7718, 15882, RCHAR, 7714, RCHAR, RCHAR, RCHAR, 15883, 15884, RCHAR, RCHAR, 7719, 15885, 15886, RCHAR, 15887, RCHAR, RCHAR, RCHAR, RCHAR, 15888, 15889, RCHAR, 15890, 7716, RCHAR, 7715, 15891, RCHAR, RCHAR, 15892, 15893, 2127, RCHAR, RCHAR, 15894, 15895, RCHAR, 15896, 15897, 15898, 15899, RCHAR, 7720, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15900, RCHAR, RCHAR, 7721, RCHAR, RCHAR, RCHAR, RCHAR, 7722, 15901, 7717, 15902, RCHAR, 15903, 7697, RCHAR, 15904, 7723, RCHAR, 3354, 15905, RCHAR, RCHAR, 7727, 15906, 7728, 7726, 15907, RCHAR, RCHAR, 15908, RCHAR, 7725, 7731, 15909, 7724, RCHAR, 7729, 15910, RCHAR, 15911, 15912, RCHAR, RCHAR, RCHAR, RCHAR, 7730, RCHAR, RCHAR, RCHAR, 7733, 15913, 15914, 15915, 15916, RCHAR, 7732, 15917, RCHAR, RCHAR, RCHAR, 15918, 15919, 15920, RCHAR, RCHAR, RCHAR, RCHAR, 15921, 7735, 15922, RCHAR, 15923, RCHAR, 15924, RCHAR, 7736, 15925, 7737, 15926, RCHAR, 4364, 15927, 15928, RCHAR, RCHAR, RCHAR, 7734, 3176, 2426, RCHAR, RCHAR, 7738, 15929, RCHAR, RCHAR, RCHAR, 15931, RCHAR, RCHAR, RCHAR, RCHAR, 15932, RCHAR, RCHAR, 15930, RCHAR, RCHAR, RCHAR, 15933, RCHAR, 15934, 15935, 15936, RCHAR, RCHAR, 15937, 15938, RCHAR, RCHAR, 15939, 7739, 7740, 15940, 15941, 7741, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7742, RCHAR, RCHAR, 2181, 7743, 15942, 15943, 15944, 7744, RCHAR, 2552, 15945, 7745, 15946, 15947, 15948, 15949, RCHAR, 15950, 7746, RCHAR, RCHAR, 7747, 7748, RCHAR, 15951, 15952, RCHAR, 7751, 7749, 4351, RCHAR, 7750, 15953, 4308, 15954, RCHAR, RCHAR, 15955, RCHAR, 7752, 15956, 4288, RCHAR, RCHAR, RCHAR, RCHAR, 15957, 7753, 3665, RCHAR, 15958, 7754, 7756, RCHAR, 15959, 7757, 15960, 15961, 15962, RCHAR, RCHAR, 15963, 15964, 15965, RCHAR, RCHAR, 7755, 2332, 4086, 4014, 5068, RCHAR, 5703, 4038, RCHAR, RCHAR, RCHAR, RCHAR, 1608, RCHAR, 15966, RCHAR, 15967, RCHAR, RCHAR, 15968, 7759, 1927, 7760, 7761, 7762, RCHAR, 2340, RCHAR, 7763, 15969, RCHAR, RCHAR, 5973, 4100, RCHAR, 3168, 7764, 7766, 7765, 15970, 7767, RCHAR, RCHAR, RCHAR, 15971, 7768, RCHAR, 15972, 7769, RCHAR, RCHAR, RCHAR, 15973, 15974, 15975, 7770, 15976, 15977, 15978, RCHAR, 7771, 15979, 7772, 7773, 15980, 7774, RCHAR, 7775, 7776, 7777, RCHAR, 15981, RCHAR, RCHAR, 15982, 15983, RCHAR, RCHAR, RCHAR, 7778, 7779, 15984, RCHAR, RCHAR, RCHAR, RCHAR, 3387, 15985, 15986, 15987, 15988, 2222, 15989, 7781, 15990, 15991, RCHAR, 15992, 15993, 15994, RCHAR, RCHAR, RCHAR, 15995, 3052, 7782, 15996, RCHAR, RCHAR, RCHAR, 15997, RCHAR, RCHAR, RCHAR, 15998, 15999, 7783, RCHAR, RCHAR, 16000, RCHAR, 16001, 16002, RCHAR, 16003, RCHAR, RCHAR, 16004, RCHAR, 16005, 16006, 3760, 16007, 16008, 7784, 16009, RCHAR, 16010, RCHAR, 16011, 16012, 16013, 16014, 16015, RCHAR, RCHAR, 7785, 6226, RCHAR, RCHAR, 7107, 7502, RCHAR, RCHAR, 7786, 16016, 7787, 16017, 16018, 16019, 16020, RCHAR, 16021, RCHAR, RCHAR, 16022, 16023, 7789, 7790, 7791, 4309, 7788, RCHAR, RCHAR, 7792, 7793, 16024, 16025, 7795, RCHAR, 7794, 16026, 16027, 16028, 16029, 16030, 7797, 16031, RCHAR, 16032, 7798, 7796, RCHAR, RCHAR, 16033, RCHAR, RCHAR, 16034, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4251, RCHAR, 16035, 16036, 16037, 16038, RCHAR, 16039, 7799, 16040, 16041, RCHAR, RCHAR, RCHAR, RCHAR, 7800, 6255, 16042, RCHAR, 7801, 16043, 16044, 16045, RCHAR, 16046, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x00A1,0x017E] -v # seg 5 at pos 21248 8963, 80, 81, 9009, 78, 8964, 87, 14, 9006, 9005, RCHAR, 137, RCHAR, 9007, 8949, 74, 61, RCHAR, RCHAR, 12, RCHAR, 182, RCHAR, 8946, RCHAR, 9004, RCHAR, RCHAR, RCHAR, RCHAR, 8965, 9683, 9682, 9685, 9691, 9684, 9690, 9588, 9695, 9699, 9698, 9701, 9700, 9713, 9712, 9715, 9714, RCHAR, 9729, 9731, 9730, 9733, 9737, 9732, 62, 9599, 9748, 9747, 9750, 9749, 9763, 9603, 9633, 9777, 9776, 9779, 9785, 9778, 9784, 9620, 9789, 9793, 9792, 9795, 9794, 9807, 9806, 9809, 9808, 9622, 9823, 9825, 9824, 9827, 9831, 9826, 63, 9631, 9842, 9841, 9844, 9843, 9857, 9635, 9858, 9688, 9782, 9686, 9780, 9689, 9783, 9692, 9786, 9693, 9787, 9696, 9790, 9694, 9788, 9697, 9791, 9589, 9621, 9704, 9798, RCHAR, RCHAR, 9703, 9797, 9705, 9799, 9702, 9796, 9707, 9801, 9708, 9802, 9710, 9804, 9709, RCHAR, 9711, 9805, 9591, 9623, 9720, 9814, 9718, 9812, RCHAR, RCHAR, 9719, 9813, 9717, 9624, 9593, 9625, 9721, 9815, 9722, 9816, 9626, 9723, 9817, 9725, 9819, 9724, 9818, 9596, 9628, 9595, 9627, 9726, 9820, 9728, 9822, 9727, 9821, 9629, 9598, 9630, 9736, 9830, RCHAR, RCHAR, 9735, 9829, 9600, 9632, 9738, 9832, 9740, 9834, 9739, 9833, 9741, 9835, 9742, 9836, 9744, 9838, 9743, 9837, 9746, 9840, 9745, 9839, 9602, 9634, 9757, 9851, 9754, 9848, 9751, 9845, 9756, 9850, 9753, 9847, 9755, 9849, 9762, 9856, 9765, 9859, 9764, 9766, 9860, 9768, 9862, 9767, 9861, // [0x01CD,0x01DC] -v # seg 7 at pos 21470 9687, 9781, 9716, 9810, 9734, 9828, 9752, 9846, 9761, 9855, 9758, 9852, 9760, 9854, 9759, 9853, // [0x01F5,0x01F5] -> [ 9800, 9800] # seg 9 // [0x02C7,0x02C7] -> [ 8945, 8945] # seg 11 // [0x02D8,0x02DD] -v # seg 13 at pos 21486 8944, 8947, 8951, 8950, RCHAR, 8948, // [0x0384,0x0390] -v # seg 15 at pos 21492 8953, 8954, 9370, RCHAR, 9371, 9372, 9373, RCHAR, 9376, RCHAR, 9378, 9381, 9391, // [0x03A3,0x03B0] -v # seg 18 at pos 21505 487, 488, 489, 490, 491, 492, 493, 9374, 9379, 9386, 9387, 9388, 9389, 9396, // [0x03C2,0x03CE] -v # seg 20 at pos 21519 9393, 519, 520, 521, 522, 523, 524, 525, 9390, 9395, 9392, 9394, 9397, // [0x0402,0x040C] -> [ 9433, 9443] # seg 23 // [0x040E,0x0415] -v # seg 25 at pos 21532 9444, 9445, 564, 565, 566, 567, 568, 569, // [0x0430,0x0435] -> [ 612, 617] # seg 27 // [0x0452,0x045C] -> [ 9481, 9491] # seg 31 // [0x045E,0x045F] -> [ 9492, 9493] # seg 33 // [0x2010,0x2026] -v # seg 35 at pos 21540 29, RCHAR, RCHAR, RCHAR, 28, 28, 33, RCHAR, 37, 38, RCHAR, RCHAR, 39, 40, RCHAR, RCHAR, 180, 181, RCHAR, RCHAR, RCHAR, 36, 35, // [0x2030,0x2033] -v # seg 37 at pos 21563 176, RCHAR, 75, 76, // [0x203B,0x203E] -v # seg 39 at pos 21567 101, RCHAR, RCHAR, 16, // [0x2103,0x2103] -> [ 77, 77] # seg 41 // [0x2116,0x2116] -> [ 9010, 9010] # seg 43 // [0x2122,0x2122] -> [ 9008, 9008] # seg 45 // [0x212B,0x212B] -> [ 175, 175] # seg 47 // [0x2190,0x2193] -v # seg 49 at pos 21571 104, 105, 103, 106, // [0x21D2,0x21D4] -v # seg 51 at pos 21575 138, RCHAR, 139, // [0x2200,0x2212] -v # seg 53 at pos 21578 140, RCHAR, 156, 141, RCHAR, RCHAR, RCHAR, 157, 119, RCHAR, RCHAR, 120, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 60, // [0x221A,0x222C] -v # seg 55 at pos 21597 162, RCHAR, RCHAR, 164, 70, RCHAR, 153, RCHAR, RCHAR, RCHAR, RCHAR, 33, RCHAR, 135, 136, 126, 125, 166, 167, // [0x2234,0x2235] -v # seg 57 at pos 21616 71, 165, // [0x223D,0x223D] -> [ 163, 163] # seg 59 // [0x2252,0x2252] -> [ 159, 159] # seg 61 // [0x2260,0x226B] -v # seg 63 at pos 21618 65, 158, RCHAR, RCHAR, RCHAR, RCHAR, 68, 69, RCHAR, RCHAR, 160, 161, // [0x2282,0x2287] -v # seg 65 at pos 21630 123, 124, RCHAR, RCHAR, 121, 122, // [0x22A5,0x22A5] -> [ 154, 154] # seg 67 // [0x2312,0x2312] -> [ 155, 155] # seg 69 // [0x2500,0x2503] -v # seg 71 at pos 21636 658, 669, 659, 670, // [0x250C,0x2542] -v # seg 73 at pos 21640 660, RCHAR, RCHAR, 671, 661, RCHAR, RCHAR, 672, 663, RCHAR, RCHAR, 674, 662, RCHAR, RCHAR, 673, 664, 685, RCHAR, RCHAR, 680, RCHAR, RCHAR, 675, 666, 687, RCHAR, RCHAR, 682, RCHAR, RCHAR, 677, 665, RCHAR, RCHAR, 681, 686, RCHAR, RCHAR, 676, 667, RCHAR, RCHAR, 683, 688, RCHAR, RCHAR, 678, 668, RCHAR, RCHAR, 684, RCHAR, RCHAR, 689, // [0x254B,0x254B] -> [ 679, 679] # seg 75 // [0x25A0,0x25A1] -v # seg 77 at pos 21695 96, 95, // [0x25B2,0x25B3] -v # seg 79 at pos 21697 98, 97, // [0x25BC,0x25BD] -v # seg 81 at pos 21699 100, 99, // [0x25C6,0x25CF] -v # seg 83 at pos 21701 94, 93, RCHAR, RCHAR, RCHAR, 90, RCHAR, RCHAR, 92, 91, // [0x25EF,0x25EF] -> [ 187, 187] # seg 85 // [0x2605,0x2606] -v # seg 87 at pos 21711 89, 88, // [0x2640,0x2642] -v # seg 89 at pos 21713 73, RCHAR, 72, // [0x266A,0x266F] -v # seg 91 at pos 21716 179, RCHAR, RCHAR, 178, RCHAR, 177, // [0xFF01,0xFF0F] -v # seg 97 at pos 21722 9, RCHAR, 83, 79, 82, 84, RCHAR, 41, 42, 85, 59, 3, 60, 4, 30, // [0xFF10,0xFF19] -> [ 203, 212] # seg 98 // [0xFF1A,0xFF20] -v # seg 99 at pos 21737 6, 7, 66, 64, 67, 8, 86, // [0xFF21,0xFF3A] -> [ 220, 245] # seg 100 // [0xFF3B,0xFF40] -v # seg 101 at pos 21744 45, 31, 46, 15, 17, 13, // [0xFF41,0xFF5A] -> [ 252, 277] # seg 102 // [0xFF5B,0xFF5E] -v # seg 103 at pos 21750 47, 34, 48, 8952, // [0xFFE0,0xFFE5] -v # seg 105 at pos 21754 80, 81, 137, 16, 8964, 78, }; // Reverse table overlay with CP932 extensions const unsigned short CodePageJISX0208_R[2286] = { // hot segments (indexes into segment table) 0, // number of segments 729, // segment table 0x0000, 0x2116, 0x2117, 0x2121, 0x2122, 0x2160, 0x216A, 0x2170, 0x217A, 0x2211, 0x2212, 0x221F, 0x2220, 0x222E, 0x222F, 0x22BF, 0x22C0, 0x2460, 0x2474, 0x301D, 0x301E, 0x301F, 0x3020, 0x3231, 0x3233, 0x3239, 0x323A, 0x32A4, 0x32A9, 0x3303, 0x3304, 0x330D, 0x330E, 0x3314, 0x3315, 0x3318, 0x3319, 0x3322, 0x3324, 0x3326, 0x3328, 0x332B, 0x332C, 0x3336, 0x3337, 0x333B, 0x333C, 0x3349, 0x334B, 0x334D, 0x334E, 0x3351, 0x3352, 0x3357, 0x3358, 0x337B, 0x337F, 0x338E, 0x3390, 0x339C, 0x339F, 0x33A1, 0x33A2, 0x33C4, 0x33C5, 0x33CD, 0x33CE, 0x4E28, 0x4E29, 0x4EE1, 0x4EE2, 0x4EFC, 0x4EFD, 0x4F00, 0x4F01, 0x4F03, 0x4F04, 0x4F39, 0x4F3A, 0x4F56, 0x4F57, 0x4F8A, 0x4F8B, 0x4F92, 0x4F93, 0x4F94, 0x4F95, 0x4F9A, 0x4F9B, 0x4FC9, 0x4FCA, 0x4FCD, 0x4FCE, 0x4FFF, 0x5000, 0x501E, 0x501F, 0x5022, 0x5023, 0x5040, 0x5041, 0x5042, 0x5043, 0x5046, 0x5047, 0x5070, 0x5071, 0x5094, 0x5095, 0x50D8, 0x50D9, 0x50F4, 0x50F5, 0x514A, 0x514B, 0x5164, 0x5165, 0x519D, 0x519E, 0x51BE, 0x51BF, 0x51EC, 0x51ED, 0x5215, 0x5216, 0x529C, 0x529D, 0x52A6, 0x52A7, 0x52AF, 0x52B0, 0x52C0, 0x52C1, 0x52DB, 0x52DC, 0x5300, 0x5301, 0x5307, 0x5308, 0x5324, 0x5325, 0x5372, 0x5373, 0x5393, 0x5394, 0x53B2, 0x53B3, 0x53DD, 0x53DE, 0x548A, 0x548B, 0x549C, 0x549D, 0x54A9, 0x54AA, 0x54FF, 0x5500, 0x5586, 0x5587, 0x5759, 0x575A, 0x5765, 0x5766, 0x57AC, 0x57AD, 0x57C7, 0x57C9, 0x5861, 0x5862, 0x589E, 0x589F, 0x58B2, 0x58B3, 0x590B, 0x590C, 0x5953, 0x5954, 0x595B, 0x595C, 0x595D, 0x595E, 0x5963, 0x5964, 0x59A4, 0x59A5, 0x59BA, 0x59BB, 0x5B56, 0x5B57, 0x5BC0, 0x5BC1, 0x5BD8, 0x5BD9, 0x5BEC, 0x5BED, 0x5C1E, 0x5C1F, 0x5CA6, 0x5CA7, 0x5CBA, 0x5CBB, 0x5CF5, 0x5CF6, 0x5D27, 0x5D28, 0x5D42, 0x5D43, 0x5D53, 0x5D54, 0x5D6D, 0x5D6E, 0x5DB8, 0x5DBA, 0x5DD0, 0x5DD1, 0x5F21, 0x5F22, 0x5F34, 0x5F35, 0x5F45, 0x5F46, 0x5F67, 0x5F68, 0x5FB7, 0x5FB8, 0x5FDE, 0x5FDF, 0x605D, 0x605E, 0x6085, 0x6086, 0x608A, 0x608B, 0x60D5, 0x60D6, 0x60DE, 0x60DF, 0x60F2, 0x60F3, 0x6111, 0x6112, 0x6120, 0x6121, 0x6130, 0x6131, 0x6137, 0x6138, 0x6198, 0x6199, 0x6213, 0x6214, 0x62A6, 0x62A7, 0x63F5, 0x63F6, 0x6460, 0x6461, 0x649D, 0x649E, 0x64CE, 0x64CF, 0x654E, 0x654F, 0x6600, 0x6601, 0x6609, 0x660A, 0x6615, 0x6616, 0x661E, 0x661F, 0x6624, 0x6625, 0x662E, 0x662F, 0x6631, 0x6632, 0x663B, 0x663C, 0x6657, 0x6658, 0x6659, 0x665A, 0x6665, 0x6666, 0x6673, 0x6674, 0x6699, 0x669A, 0x66A0, 0x66A1, 0x66B2, 0x66B3, 0x66BF, 0x66C0, 0x66FA, 0x66FC, 0x670E, 0x670F, 0x6766, 0x6767, 0x67BB, 0x67BC, 0x67C0, 0x67C1, 0x6801, 0x6802, 0x6844, 0x6845, 0x6852, 0x6853, 0x68C8, 0x68C9, 0x68CF, 0x68D0, 0x6968, 0x6969, 0x6998, 0x6999, 0x69E2, 0x69E3, 0x6A30, 0x6A31, 0x6A46, 0x6A47, 0x6A6B, 0x6A6C, 0x6A73, 0x6A74, 0x6A7E, 0x6A7F, 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6BD6, 0x6BD7, 0x6C3F, 0x6C40, 0x6C5C, 0x6C5D, 0x6C6F, 0x6C70, 0x6C86, 0x6C87, 0x6CDA, 0x6CDB, 0x6D04, 0x6D05, 0x6D6F, 0x6D70, 0x6D87, 0x6D88, 0x6D96, 0x6D97, 0x6DAC, 0x6DAD, 0x6DCF, 0x6DD0, 0x6DF2, 0x6DF3, 0x6DF8, 0x6DF9, 0x6DFC, 0x6DFD, 0x6E27, 0x6E28, 0x6E39, 0x6E3A, 0x6E3C, 0x6E3D, 0x6E5C, 0x6E5D, 0x6EBF, 0x6EC0, 0x6F88, 0x6F89, 0x6FB5, 0x6FB6, 0x6FF5, 0x6FF6, 0x7005, 0x7006, 0x7007, 0x7008, 0x7028, 0x7029, 0x7085, 0x7086, 0x70AB, 0x70AC, 0x70BB, 0x70BC, 0x7104, 0x7105, 0x710F, 0x7110, 0x7146, 0x7148, 0x715C, 0x715D, 0x71C1, 0x71C2, 0x71FE, 0x71FF, 0x72B1, 0x72B2, 0x72BE, 0x72BF, 0x7324, 0x7325, 0x7377, 0x7378, 0x73BD, 0x73BE, 0x73C9, 0x73CA, 0x73D2, 0x73D3, 0x73D6, 0x73D7, 0x73E3, 0x73E4, 0x73F5, 0x73F6, 0x7407, 0x7408, 0x7426, 0x7427, 0x7429, 0x742B, 0x742E, 0x742F, 0x7462, 0x7463, 0x7489, 0x748A, 0x749F, 0x74A0, 0x7501, 0x7502, 0x752F, 0x7530, 0x756F, 0x7570, 0x7682, 0x7683, 0x769B, 0x769D, 0x769E, 0x769F, 0x76A6, 0x76A7, 0x7746, 0x7747, 0x7821, 0x7822, 0x784E, 0x784F, 0x7864, 0x7865, 0x787A, 0x787B, 0x7930, 0x7931, 0x7994, 0x7995, 0x799B, 0x799C, 0x7AD1, 0x7AD2, 0x7AE7, 0x7AE8, 0x7AEB, 0x7AEC, 0x7B9E, 0x7B9F, 0x7D48, 0x7D49, 0x7D5C, 0x7D5D, 0x7DA0, 0x7DA1, 0x7DB7, 0x7DB8, 0x7DD6, 0x7DD7, 0x7E52, 0x7E53, 0x7E8A, 0x7E8B, 0x7F47, 0x7F48, 0x7FA1, 0x7FA2, 0x8301, 0x8302, 0x8362, 0x8363, 0x837F, 0x8380, 0x83C7, 0x83C8, 0x83F6, 0x83F7, 0x8448, 0x8449, 0x84B4, 0x84B5, 0x84DC, 0x84DD, 0x8553, 0x8554, 0x8559, 0x855A, 0x856B, 0x856C, 0x85B0, 0x85B1, 0x8807, 0x8808, 0x88F5, 0x88F6, 0x891C, 0x891D, 0x8A12, 0x8A13, 0x8A37, 0x8A38, 0x8A79, 0x8A7A, 0x8AA7, 0x8AA8, 0x8ABE, 0x8ABF, 0x8ADF, 0x8AE0, 0x8AF6, 0x8AF7, 0x8B53, 0x8B54, 0x8B7F, 0x8B80, 0x8CF0, 0x8CF1, 0x8CF4, 0x8CF5, 0x8D12, 0x8D13, 0x8D76, 0x8D77, 0x8ECF, 0x8ED0, 0x9067, 0x9068, 0x90DE, 0x90DF, 0x9115, 0x9116, 0x9127, 0x9128, 0x91D7, 0x91D8, 0x91DA, 0x91DB, 0x91DE, 0x91DF, 0x91E4, 0x91E6, 0x91ED, 0x91EF, 0x9206, 0x9207, 0x920A, 0x920B, 0x9210, 0x9211, 0x9239, 0x923B, 0x923C, 0x923D, 0x9240, 0x9241, 0x924E, 0x924F, 0x9251, 0x9252, 0x9259, 0x925A, 0x9267, 0x9268, 0x9277, 0x9279, 0x9288, 0x9289, 0x92A7, 0x92A8, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, 0x92DA, 0x92E0, 0x92E1, 0x92E7, 0x92E8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FF, 0x9300, 0x9302, 0x9303, 0x931D, 0x931F, 0x9321, 0x9322, 0x9325, 0x9326, 0x9348, 0x9349, 0x9357, 0x9358, 0x9370, 0x9371, 0x93A4, 0x93A5, 0x93C6, 0x93C7, 0x93DE, 0x93DF, 0x93F8, 0x93F9, 0x9431, 0x9432, 0x9445, 0x9446, 0x9448, 0x9449, 0x9592, 0x9593, 0x969D, 0x969E, 0x96AF, 0x96B0, 0x9733, 0x9734, 0x973B, 0x973C, 0x9743, 0x9744, 0x974D, 0x974E, 0x974F, 0x9750, 0x9751, 0x9752, 0x9755, 0x9756, 0x9830, 0x9831, 0x9857, 0x9858, 0x9865, 0x9866, 0x9927, 0x9928, 0x999E, 0x999F, 0x9A4E, 0x9A4F, 0x9AD9, 0x9ADA, 0x9ADC, 0x9ADD, 0x9B72, 0x9B73, 0x9B75, 0x9B76, 0x9B8F, 0x9B90, 0x9BB1, 0x9BB2, 0x9BBB, 0x9BBC, 0x9C00, 0x9C01, 0x9D6B, 0x9D6C, 0x9D70, 0x9D71, 0x9E19, 0x9E1A, 0x9ED1, 0x9ED2, 0xE000, 0xE758, 0xF929, 0xF92A, 0xF9DC, 0xF9DD, 0xFA0E, 0xFA18, 0xFA1B, 0xFA2E, 0xFF02, 0xFF03, 0xFF07, 0xFF08, 0xFF5E, 0xFF5F, 0xFF61, 0xFF85, 0xFF8B, 0xFF8F, 0xFF94, 0xFF96, 0xFF9C, 0xFFA0, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, // compressed segments RCHAR, 1193, RCHAR, 1195, RCHAR, 1148, RCHAR, 8634, RCHAR, 1211, RCHAR, 1215, RCHAR, 1210, RCHAR, 1216, RCHAR, 1128, RCHAR, 1191, RCHAR, 1192, RCHAR, 1201, RCHAR, 1203, RCHAR, 1196, RCHAR, 1165, RCHAR, 1169, RCHAR, 1160, RCHAR, 1163, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 1172, RCHAR, 1166, RCHAR, 1174, RCHAR, RCHAR, RCHAR, 1162, RCHAR, 1167, RCHAR, 1168, RCHAR, RCHAR, RCHAR, 1178, RCHAR, 1175, RCHAR, 1181, RCHAR, 1180, RCHAR, 1194, RCHAR, 8284, RCHAR, 8285, RCHAR, 8286, RCHAR, 8287, RCHAR, 8288, RCHAR, 8289, RCHAR, 8290, RCHAR, 8292, RCHAR, 8291, RCHAR, 8294, RCHAR, 8293, RCHAR, 8277, RCHAR, 8295, RCHAR, 8298, RCHAR, 8299, RCHAR, 8297, RCHAR, 8296, RCHAR, 8302, RCHAR, 8300, RCHAR, 8301, RCHAR, 8303, RCHAR, 8305, RCHAR, 8304, RCHAR, 8306, RCHAR, 8307, RCHAR, 8308, RCHAR, 8309, RCHAR, 8310, RCHAR, 8311, RCHAR, 8312, RCHAR, 8313, RCHAR, 8487, RCHAR, 8314, RCHAR, 8315, RCHAR, 8316, RCHAR, 8317, RCHAR, 8318, RCHAR, 8319, RCHAR, 8320, RCHAR, 8321, RCHAR, 8322, RCHAR, 8325, RCHAR, 8324, RCHAR, 8326, RCHAR, 8327, RCHAR, 8328, RCHAR, 8329, RCHAR, 8330, RCHAR, 8331, RCHAR, RCHAR, RCHAR, 3405, RCHAR, 8336, RCHAR, 8337, RCHAR, 8338, RCHAR, 8339, RCHAR, 8340, RCHAR, 8341, RCHAR, 8342, RCHAR, 8343, RCHAR, 8344, RCHAR, 8345, RCHAR, 8346, RCHAR, 8348, RCHAR, 8349, RCHAR, 8350, RCHAR, 8351, RCHAR, 8352, RCHAR, 8353, RCHAR, 8354, RCHAR, 8357, RCHAR, 8355, RCHAR, 8358, RCHAR, 8359, RCHAR, 8361, RCHAR, 8362, RCHAR, 8363, RCHAR, 8283, RCHAR, 8364, RCHAR, 8365, RCHAR, 8366, RCHAR, 8367, RCHAR, 8368, RCHAR, 8369, RCHAR, 8371, RCHAR, 8370, RCHAR, 8373, RCHAR, 8374, RCHAR, 8372, RCHAR, 8376, RCHAR, 8375, RCHAR, 8377, RCHAR, 8378, RCHAR, 8379, RCHAR, 8380, RCHAR, 8381, RCHAR, 8382, RCHAR, 8383, RCHAR, 8384, RCHAR, 8385, RCHAR, 8388, RCHAR, 8386, RCHAR, 8390, RCHAR, 8391, RCHAR, 8389, RCHAR, 8279, RCHAR, 8387, RCHAR, 8393, RCHAR, 8394, RCHAR, 8392, RCHAR, 8396, RCHAR, 8397, RCHAR, 8398, RCHAR, 8399, RCHAR, 8400, RCHAR, RCHAR, RCHAR, 8402, RCHAR, 8404, RCHAR, 8405, RCHAR, 8407, RCHAR, 8408, RCHAR, 8409, RCHAR, 8406, RCHAR, 8280, RCHAR, 8410, RCHAR, 8412, RCHAR, 8414, RCHAR, 8415, RCHAR, 8416, RCHAR, 8418, RCHAR, 8417, RCHAR, 8419, RCHAR, 8420, RCHAR, 8421, RCHAR, 8422, RCHAR, 8423, RCHAR, 8424, RCHAR, 8425, RCHAR, 8427, RCHAR, 8426, RCHAR, 8428, RCHAR, 8429, RCHAR, 8431, RCHAR, 8430, RCHAR, 8432, RCHAR, 8433, RCHAR, 8434, RCHAR, 8436, RCHAR, 8435, RCHAR, 8437, RCHAR, 8440, RCHAR, 8438, RCHAR, 8441, RCHAR, 8439, RCHAR, 8442, RCHAR, 8443, RCHAR, 8444, RCHAR, 8445, RCHAR, 8446, RCHAR, 8447, RCHAR, 8448, RCHAR, 8449, RCHAR, 8450, RCHAR, 8278, RCHAR, 8452, RCHAR, 8451, RCHAR, 8454, RCHAR, 8453, RCHAR, 8457, RCHAR, 8458, RCHAR, 8459, RCHAR, 8460, RCHAR, 8461, RCHAR, 8463, RCHAR, 8464, RCHAR, 8465, RCHAR, 8468, RCHAR, 8466, RCHAR, 8467, RCHAR, 8470, RCHAR, 8469, RCHAR, 8471, RCHAR, RCHAR, RCHAR, 8474, RCHAR, 8475, RCHAR, 8476, RCHAR, 8477, RCHAR, 8478, RCHAR, 8347, RCHAR, 8479, RCHAR, 8480, RCHAR, RCHAR, RCHAR, 8482, RCHAR, 8484, RCHAR, 8486, RCHAR, 8488, RCHAR, 8489, RCHAR, 8490, RCHAR, 8491, RCHAR, 8492, RCHAR, 8496, RCHAR, 8498, RCHAR, 8499, RCHAR, 8500, RCHAR, 8502, RCHAR, 8503, RCHAR, 8505, RCHAR, 8506, RCHAR, 8508, RCHAR, 8507, RCHAR, 8509, RCHAR, 8510, RCHAR, 8272, RCHAR, 8511, RCHAR, 8512, RCHAR, 8514, RCHAR, 8515, RCHAR, 8516, RCHAR, 8517, RCHAR, 8518, RCHAR, 8519, RCHAR, 8520, RCHAR, 8276, RCHAR, 8521, RCHAR, 8522, RCHAR, 8523, RCHAR, 8525, RCHAR, 8528, RCHAR, 8529, RCHAR, 8273, RCHAR, 8530, RCHAR, 8531, RCHAR, 8532, RCHAR, 8533, RCHAR, 8534, RCHAR, 8535, RCHAR, 8537, RCHAR, 8538, RCHAR, 8539, RCHAR, 8540, RCHAR, 8541, RCHAR, 8542, RCHAR, 8543, RCHAR, 8545, RCHAR, 8548, RCHAR, 8549, RCHAR, 8551, RCHAR, 8552, RCHAR, 8554, RCHAR, 8553, RCHAR, 8555, RCHAR, 8558, RCHAR, 8556, RCHAR, 8560, RCHAR, 8562, RCHAR, 8561, RCHAR, RCHAR, RCHAR, 8565, RCHAR, 8564, RCHAR, 8566, RCHAR, 8568, RCHAR, 8567, RCHAR, 8570, RCHAR, 8572, RCHAR, 8275, RCHAR, 8571, RCHAR, 8577, RCHAR, 8581, RCHAR, 8579, RCHAR, 8575, RCHAR, 8576, RCHAR, 8580, RCHAR, 8574, RCHAR, 8281, RCHAR, 8584, RCHAR, 8587, RCHAR, 8589, RCHAR, RCHAR, RCHAR, 8583, RCHAR, 8582, RCHAR, 8274, RCHAR, 8591, RCHAR, 8590, RCHAR, 8592, RCHAR, 8593, RCHAR, 8594, RCHAR, 8595, RCHAR, 8596, RCHAR, 8597, RCHAR, 8598, RCHAR, 8599, RCHAR, 8602, RCHAR, 8603, RCHAR, 8604, RCHAR, 8605, RCHAR, 8606, RCHAR, 8607, RCHAR, 8608, RCHAR, 8609, RCHAR, 8610, RCHAR, 3990, RCHAR, 8611, RCHAR, 8612, RCHAR, 8615, RCHAR, 8617, RCHAR, 8618, RCHAR, 8619, RCHAR, 8620, RCHAR, 8622, RCHAR, 8621, RCHAR, 8623, RCHAR, 8624, RCHAR, 8625, RCHAR, 8626, RCHAR, 8628, RCHAR, 8627, RCHAR, 8630, RCHAR, 8631, RCHAR, 8836, RCHAR, 8403, RCHAR, 8600, RCHAR, RCHAR, 8493, RCHAR, RCHAR, 8647, RCHAR, 8646, RCHAR, 32, RCHAR, RCHAR, 417, RCHAR, 437, RCHAR, 447, RCHAR, RCHAR, 8644, RCHAR, 8645, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0, RCHAR, 2, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 4, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 20, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 22, RCHAR, 32, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 51, RCHAR, 87, RCHAR, 91, RCHAR, 93, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x2116,0x2116] -> [ 1193, 1193] # seg 1 // [0x2121,0x2121] -> [ 1195, 1195] # seg 3 // [0x2160,0x2169] -> [ 1148, 1157] # seg 5 // [0x2170,0x2179] -> [ 8634, 8643] # seg 7 // [0x2211,0x2211] -> [ 1211, 1211] # seg 9 // [0x221F,0x221F] -> [ 1215, 1215] # seg 11 // [0x222E,0x222E] -> [ 1210, 1210] # seg 13 // [0x22BF,0x22BF] -> [ 1216, 1216] # seg 15 // [0x2460,0x2473] -> [ 1128, 1147] # seg 17 // [0x301D,0x301D] -> [ 1191, 1191] # seg 19 // [0x301F,0x301F] -> [ 1192, 1192] # seg 21 // [0x3231,0x3232] -> [ 1201, 1202] # seg 23 // [0x3239,0x3239] -> [ 1203, 1203] # seg 25 // [0x32A4,0x32A8] -> [ 1196, 1200] # seg 27 // [0x3303,0x3303] -> [ 1165, 1165] # seg 29 // [0x330D,0x330D] -> [ 1169, 1169] # seg 31 // [0x3314,0x3314] -> [ 1160, 1160] # seg 33 // [0x3318,0x3318] -> [ 1163, 1163] # seg 35 // [0x3322,0x3323] -v # seg 37 at pos 0 1161, 1171, // [0x3326,0x3327] -v # seg 39 at pos 2 1170, 1164, // [0x332B,0x332B] -> [ 1172, 1172] # seg 41 // [0x3336,0x3336] -> [ 1166, 1166] # seg 43 // [0x333B,0x333B] -> [ 1174, 1174] # seg 45 // [0x3349,0x334A] -v # seg 47 at pos 4 1159, 1173, // [0x334D,0x334D] -> [ 1162, 1162] # seg 49 // [0x3351,0x3351] -> [ 1167, 1167] # seg 51 // [0x3357,0x3357] -> [ 1168, 1168] # seg 53 // [0x337B,0x337E] -v # seg 55 at pos 6 1190, 1206, 1205, 1204, // [0x338E,0x338F] -> [ 1178, 1179] # seg 57 // [0x339C,0x339E] -> [ 1175, 1177] # seg 59 // [0x33A1,0x33A1] -> [ 1181, 1181] # seg 61 // [0x33C4,0x33C4] -> [ 1180, 1180] # seg 63 // [0x33CD,0x33CD] -> [ 1194, 1194] # seg 65 // [0x4E28,0x4E28] -> [ 8284, 8284] # seg 67 // [0x4EE1,0x4EE1] -> [ 8285, 8285] # seg 69 // [0x4EFC,0x4EFC] -> [ 8286, 8286] # seg 71 // [0x4F00,0x4F00] -> [ 8287, 8287] # seg 73 // [0x4F03,0x4F03] -> [ 8288, 8288] # seg 75 // [0x4F39,0x4F39] -> [ 8289, 8289] # seg 77 // [0x4F56,0x4F56] -> [ 8290, 8290] # seg 79 // [0x4F8A,0x4F8A] -> [ 8292, 8292] # seg 81 // [0x4F92,0x4F92] -> [ 8291, 8291] # seg 83 // [0x4F94,0x4F94] -> [ 8294, 8294] # seg 85 // [0x4F9A,0x4F9A] -> [ 8293, 8293] # seg 87 // [0x4FC9,0x4FC9] -> [ 8277, 8277] # seg 89 // [0x4FCD,0x4FCD] -> [ 8295, 8295] # seg 91 // [0x4FFF,0x4FFF] -> [ 8298, 8298] # seg 93 // [0x501E,0x501E] -> [ 8299, 8299] # seg 95 // [0x5022,0x5022] -> [ 8297, 8297] # seg 97 // [0x5040,0x5040] -> [ 8296, 8296] # seg 99 // [0x5042,0x5042] -> [ 8302, 8302] # seg 101 // [0x5046,0x5046] -> [ 8300, 8300] # seg 103 // [0x5070,0x5070] -> [ 8301, 8301] # seg 105 // [0x5094,0x5094] -> [ 8303, 8303] # seg 107 // [0x50D8,0x50D8] -> [ 8305, 8305] # seg 109 // [0x50F4,0x50F4] -> [ 8304, 8304] # seg 111 // [0x514A,0x514A] -> [ 8306, 8306] # seg 113 // [0x5164,0x5164] -> [ 8307, 8307] # seg 115 // [0x519D,0x519D] -> [ 8308, 8308] # seg 117 // [0x51BE,0x51BE] -> [ 8309, 8309] # seg 119 // [0x51EC,0x51EC] -> [ 8310, 8310] # seg 121 // [0x5215,0x5215] -> [ 8311, 8311] # seg 123 // [0x529C,0x529C] -> [ 8312, 8312] # seg 125 // [0x52A6,0x52A6] -> [ 8313, 8313] # seg 127 // [0x52AF,0x52AF] -> [ 8487, 8487] # seg 129 // [0x52C0,0x52C0] -> [ 8314, 8314] # seg 131 // [0x52DB,0x52DB] -> [ 8315, 8315] # seg 133 // [0x5300,0x5300] -> [ 8316, 8316] # seg 135 // [0x5307,0x5307] -> [ 8317, 8317] # seg 137 // [0x5324,0x5324] -> [ 8318, 8318] # seg 139 // [0x5372,0x5372] -> [ 8319, 8319] # seg 141 // [0x5393,0x5393] -> [ 8320, 8320] # seg 143 // [0x53B2,0x53B2] -> [ 8321, 8321] # seg 145 // [0x53DD,0x53DD] -> [ 8322, 8322] # seg 147 // [0x548A,0x548A] -> [ 8325, 8325] # seg 149 // [0x549C,0x549C] -> [ 8324, 8324] # seg 151 // [0x54A9,0x54A9] -> [ 8326, 8326] # seg 153 // [0x54FF,0x54FF] -> [ 8327, 8327] # seg 155 // [0x5586,0x5586] -> [ 8328, 8328] # seg 157 // [0x5759,0x5759] -> [ 8329, 8329] # seg 159 // [0x5765,0x5765] -> [ 8330, 8330] # seg 161 // [0x57AC,0x57AC] -> [ 8331, 8331] # seg 163 // [0x57C7,0x57C8] -v # seg 165 at pos 10 8333, 8332, // [0x5861,0x5861] -> [ 3405, 3405] # seg 167 // [0x589E,0x589E] -> [ 8336, 8336] # seg 169 // [0x58B2,0x58B2] -> [ 8337, 8337] # seg 171 // [0x590B,0x590B] -> [ 8338, 8338] # seg 173 // [0x5953,0x5953] -> [ 8339, 8339] # seg 175 // [0x595B,0x595B] -> [ 8340, 8340] # seg 177 // [0x595D,0x595D] -> [ 8341, 8341] # seg 179 // [0x5963,0x5963] -> [ 8342, 8342] # seg 181 // [0x59A4,0x59A4] -> [ 8343, 8343] # seg 183 // [0x59BA,0x59BA] -> [ 8344, 8344] # seg 185 // [0x5B56,0x5B56] -> [ 8345, 8345] # seg 187 // [0x5BC0,0x5BC0] -> [ 8346, 8346] # seg 189 // [0x5BD8,0x5BD8] -> [ 8348, 8348] # seg 191 // [0x5BEC,0x5BEC] -> [ 8349, 8349] # seg 193 // [0x5C1E,0x5C1E] -> [ 8350, 8350] # seg 195 // [0x5CA6,0x5CA6] -> [ 8351, 8351] # seg 197 // [0x5CBA,0x5CBA] -> [ 8352, 8352] # seg 199 // [0x5CF5,0x5CF5] -> [ 8353, 8353] # seg 201 // [0x5D27,0x5D27] -> [ 8354, 8354] # seg 203 // [0x5D42,0x5D42] -> [ 8357, 8357] # seg 205 // [0x5D53,0x5D53] -> [ 8355, 8355] # seg 207 // [0x5D6D,0x5D6D] -> [ 8358, 8358] # seg 209 // [0x5DB8,0x5DB9] -> [ 8359, 8360] # seg 211 // [0x5DD0,0x5DD0] -> [ 8361, 8361] # seg 213 // [0x5F21,0x5F21] -> [ 8362, 8362] # seg 215 // [0x5F34,0x5F34] -> [ 8363, 8363] # seg 217 // [0x5F45,0x5F45] -> [ 8283, 8283] # seg 219 // [0x5F67,0x5F67] -> [ 8364, 8364] # seg 221 // [0x5FB7,0x5FB7] -> [ 8365, 8365] # seg 223 // [0x5FDE,0x5FDE] -> [ 8366, 8366] # seg 225 // [0x605D,0x605D] -> [ 8367, 8367] # seg 227 // [0x6085,0x6085] -> [ 8368, 8368] # seg 229 // [0x608A,0x608A] -> [ 8369, 8369] # seg 231 // [0x60D5,0x60D5] -> [ 8371, 8371] # seg 233 // [0x60DE,0x60DE] -> [ 8370, 8370] # seg 235 // [0x60F2,0x60F2] -> [ 8373, 8373] # seg 237 // [0x6111,0x6111] -> [ 8374, 8374] # seg 239 // [0x6120,0x6120] -> [ 8372, 8372] # seg 241 // [0x6130,0x6130] -> [ 8376, 8376] # seg 243 // [0x6137,0x6137] -> [ 8375, 8375] # seg 245 // [0x6198,0x6198] -> [ 8377, 8377] # seg 247 // [0x6213,0x6213] -> [ 8378, 8378] # seg 249 // [0x62A6,0x62A6] -> [ 8379, 8379] # seg 251 // [0x63F5,0x63F5] -> [ 8380, 8380] # seg 253 // [0x6460,0x6460] -> [ 8381, 8381] # seg 255 // [0x649D,0x649D] -> [ 8382, 8382] # seg 257 // [0x64CE,0x64CE] -> [ 8383, 8383] # seg 259 // [0x654E,0x654E] -> [ 8384, 8384] # seg 261 // [0x6600,0x6600] -> [ 8385, 8385] # seg 263 // [0x6609,0x6609] -> [ 8388, 8388] # seg 265 // [0x6615,0x6615] -> [ 8386, 8386] # seg 267 // [0x661E,0x661E] -> [ 8390, 8390] # seg 269 // [0x6624,0x6624] -> [ 8391, 8391] # seg 271 // [0x662E,0x662E] -> [ 8389, 8389] # seg 273 // [0x6631,0x6631] -> [ 8279, 8279] # seg 275 // [0x663B,0x663B] -> [ 8387, 8387] # seg 277 // [0x6657,0x6657] -> [ 8393, 8393] # seg 279 // [0x6659,0x6659] -> [ 8394, 8394] # seg 281 // [0x6665,0x6665] -> [ 8392, 8392] # seg 283 // [0x6673,0x6673] -> [ 8396, 8396] # seg 285 // [0x6699,0x6699] -> [ 8397, 8397] # seg 287 // [0x66A0,0x66A0] -> [ 8398, 8398] # seg 289 // [0x66B2,0x66B2] -> [ 8399, 8399] # seg 291 // [0x66BF,0x66BF] -> [ 8400, 8400] # seg 293 // [0x66FA,0x66FB] -v # seg 295 at pos 12 8401, 8282, // [0x670E,0x670E] -> [ 8402, 8402] # seg 297 // [0x6766,0x6766] -> [ 8404, 8404] # seg 299 // [0x67BB,0x67BB] -> [ 8405, 8405] # seg 301 // [0x67C0,0x67C0] -> [ 8407, 8407] # seg 303 // [0x6801,0x6801] -> [ 8408, 8408] # seg 305 // [0x6844,0x6844] -> [ 8409, 8409] # seg 307 // [0x6852,0x6852] -> [ 8406, 8406] # seg 309 // [0x68C8,0x68C8] -> [ 8280, 8280] # seg 311 // [0x68CF,0x68CF] -> [ 8410, 8410] # seg 313 // [0x6968,0x6968] -> [ 8412, 8412] # seg 315 // [0x6998,0x6998] -> [ 8414, 8414] # seg 317 // [0x69E2,0x69E2] -> [ 8415, 8415] # seg 319 // [0x6A30,0x6A30] -> [ 8416, 8416] # seg 321 // [0x6A46,0x6A46] -> [ 8418, 8418] # seg 323 // [0x6A6B,0x6A6B] -> [ 8417, 8417] # seg 325 // [0x6A73,0x6A73] -> [ 8419, 8419] # seg 327 // [0x6A7E,0x6A7E] -> [ 8420, 8420] # seg 329 // [0x6AE2,0x6AE2] -> [ 8421, 8421] # seg 331 // [0x6AE4,0x6AE4] -> [ 8422, 8422] # seg 333 // [0x6BD6,0x6BD6] -> [ 8423, 8423] # seg 335 // [0x6C3F,0x6C3F] -> [ 8424, 8424] # seg 337 // [0x6C5C,0x6C5C] -> [ 8425, 8425] # seg 339 // [0x6C6F,0x6C6F] -> [ 8427, 8427] # seg 341 // [0x6C86,0x6C86] -> [ 8426, 8426] # seg 343 // [0x6CDA,0x6CDA] -> [ 8428, 8428] # seg 345 // [0x6D04,0x6D04] -> [ 8429, 8429] # seg 347 // [0x6D6F,0x6D6F] -> [ 8431, 8431] # seg 349 // [0x6D87,0x6D87] -> [ 8430, 8430] # seg 351 // [0x6D96,0x6D96] -> [ 8432, 8432] # seg 353 // [0x6DAC,0x6DAC] -> [ 8433, 8433] # seg 355 // [0x6DCF,0x6DCF] -> [ 8434, 8434] # seg 357 // [0x6DF2,0x6DF2] -> [ 8436, 8436] # seg 359 // [0x6DF8,0x6DF8] -> [ 8435, 8435] # seg 361 // [0x6DFC,0x6DFC] -> [ 8437, 8437] # seg 363 // [0x6E27,0x6E27] -> [ 8440, 8440] # seg 365 // [0x6E39,0x6E39] -> [ 8438, 8438] # seg 367 // [0x6E3C,0x6E3C] -> [ 8441, 8441] # seg 369 // [0x6E5C,0x6E5C] -> [ 8439, 8439] # seg 371 // [0x6EBF,0x6EBF] -> [ 8442, 8442] # seg 373 // [0x6F88,0x6F88] -> [ 8443, 8443] # seg 375 // [0x6FB5,0x6FB5] -> [ 8444, 8444] # seg 377 // [0x6FF5,0x6FF5] -> [ 8445, 8445] # seg 379 // [0x7005,0x7005] -> [ 8446, 8446] # seg 381 // [0x7007,0x7007] -> [ 8447, 8447] # seg 383 // [0x7028,0x7028] -> [ 8448, 8448] # seg 385 // [0x7085,0x7085] -> [ 8449, 8449] # seg 387 // [0x70AB,0x70AB] -> [ 8450, 8450] # seg 389 // [0x70BB,0x70BB] -> [ 8278, 8278] # seg 391 // [0x7104,0x7104] -> [ 8452, 8452] # seg 393 // [0x710F,0x710F] -> [ 8451, 8451] # seg 395 // [0x7146,0x7147] -> [ 8454, 8455] # seg 397 // [0x715C,0x715C] -> [ 8453, 8453] # seg 399 // [0x71C1,0x71C1] -> [ 8457, 8457] # seg 401 // [0x71FE,0x71FE] -> [ 8458, 8458] # seg 403 // [0x72B1,0x72B1] -> [ 8459, 8459] # seg 405 // [0x72BE,0x72BE] -> [ 8460, 8460] # seg 407 // [0x7324,0x7324] -> [ 8461, 8461] # seg 409 // [0x7377,0x7377] -> [ 8463, 8463] # seg 411 // [0x73BD,0x73BD] -> [ 8464, 8464] # seg 413 // [0x73C9,0x73C9] -> [ 8465, 8465] # seg 415 // [0x73D2,0x73D2] -> [ 8468, 8468] # seg 417 // [0x73D6,0x73D6] -> [ 8466, 8466] # seg 419 // [0x73E3,0x73E3] -> [ 8467, 8467] # seg 421 // [0x73F5,0x73F5] -> [ 8470, 8470] # seg 423 // [0x7407,0x7407] -> [ 8469, 8469] # seg 425 // [0x7426,0x7426] -> [ 8471, 8471] # seg 427 // [0x7429,0x742A] -v # seg 429 at pos 14 8473, 8472, // [0x742E,0x742E] -> [ 8474, 8474] # seg 431 // [0x7462,0x7462] -> [ 8475, 8475] # seg 433 // [0x7489,0x7489] -> [ 8476, 8476] # seg 435 // [0x749F,0x749F] -> [ 8477, 8477] # seg 437 // [0x7501,0x7501] -> [ 8478, 8478] # seg 439 // [0x752F,0x752F] -> [ 8347, 8347] # seg 441 // [0x756F,0x756F] -> [ 8479, 8479] # seg 443 // [0x7682,0x7682] -> [ 8480, 8480] # seg 445 // [0x769B,0x769C] -v # seg 447 at pos 16 8483, 8481, // [0x769E,0x769E] -> [ 8482, 8482] # seg 449 // [0x76A6,0x76A6] -> [ 8484, 8484] # seg 451 // [0x7746,0x7746] -> [ 8486, 8486] # seg 453 // [0x7821,0x7821] -> [ 8488, 8488] # seg 455 // [0x784E,0x784E] -> [ 8489, 8489] # seg 457 // [0x7864,0x7864] -> [ 8490, 8490] # seg 459 // [0x787A,0x787A] -> [ 8491, 8491] # seg 461 // [0x7930,0x7930] -> [ 8492, 8492] # seg 463 // [0x7994,0x7994] -> [ 8496, 8496] # seg 465 // [0x799B,0x799B] -> [ 8498, 8498] # seg 467 // [0x7AD1,0x7AD1] -> [ 8499, 8499] # seg 469 // [0x7AE7,0x7AE7] -> [ 8500, 8500] # seg 471 // [0x7AEB,0x7AEB] -> [ 8502, 8502] # seg 473 // [0x7B9E,0x7B9E] -> [ 8503, 8503] # seg 475 // [0x7D48,0x7D48] -> [ 8505, 8505] # seg 477 // [0x7D5C,0x7D5C] -> [ 8506, 8506] # seg 479 // [0x7DA0,0x7DA0] -> [ 8508, 8508] # seg 481 // [0x7DB7,0x7DB7] -> [ 8507, 8507] # seg 483 // [0x7DD6,0x7DD6] -> [ 8509, 8509] # seg 485 // [0x7E52,0x7E52] -> [ 8510, 8510] # seg 487 // [0x7E8A,0x7E8A] -> [ 8272, 8272] # seg 489 // [0x7F47,0x7F47] -> [ 8511, 8511] # seg 491 // [0x7FA1,0x7FA1] -> [ 8512, 8512] # seg 493 // [0x8301,0x8301] -> [ 8514, 8514] # seg 495 // [0x8362,0x8362] -> [ 8515, 8515] # seg 497 // [0x837F,0x837F] -> [ 8516, 8516] # seg 499 // [0x83C7,0x83C7] -> [ 8517, 8517] # seg 501 // [0x83F6,0x83F6] -> [ 8518, 8518] # seg 503 // [0x8448,0x8448] -> [ 8519, 8519] # seg 505 // [0x84B4,0x84B4] -> [ 8520, 8520] # seg 507 // [0x84DC,0x84DC] -> [ 8276, 8276] # seg 509 // [0x8553,0x8553] -> [ 8521, 8521] # seg 511 // [0x8559,0x8559] -> [ 8522, 8522] # seg 513 // [0x856B,0x856B] -> [ 8523, 8523] # seg 515 // [0x85B0,0x85B0] -> [ 8525, 8525] # seg 517 // [0x8807,0x8807] -> [ 8528, 8528] # seg 519 // [0x88F5,0x88F5] -> [ 8529, 8529] # seg 521 // [0x891C,0x891C] -> [ 8273, 8273] # seg 523 // [0x8A12,0x8A12] -> [ 8530, 8530] # seg 525 // [0x8A37,0x8A37] -> [ 8531, 8531] # seg 527 // [0x8A79,0x8A79] -> [ 8532, 8532] # seg 529 // [0x8AA7,0x8AA7] -> [ 8533, 8533] # seg 531 // [0x8ABE,0x8ABE] -> [ 8534, 8534] # seg 533 // [0x8ADF,0x8ADF] -> [ 8535, 8535] # seg 535 // [0x8AF6,0x8AF6] -> [ 8537, 8537] # seg 537 // [0x8B53,0x8B53] -> [ 8538, 8538] # seg 539 // [0x8B7F,0x8B7F] -> [ 8539, 8539] # seg 541 // [0x8CF0,0x8CF0] -> [ 8540, 8540] # seg 543 // [0x8CF4,0x8CF4] -> [ 8541, 8541] # seg 545 // [0x8D12,0x8D12] -> [ 8542, 8542] # seg 547 // [0x8D76,0x8D76] -> [ 8543, 8543] # seg 549 // [0x8ECF,0x8ECF] -> [ 8545, 8545] # seg 551 // [0x9067,0x9067] -> [ 8548, 8548] # seg 553 // [0x90DE,0x90DE] -> [ 8549, 8549] # seg 555 // [0x9115,0x9115] -> [ 8551, 8551] # seg 557 // [0x9127,0x9127] -> [ 8552, 8552] # seg 559 // [0x91D7,0x91D7] -> [ 8554, 8554] # seg 561 // [0x91DA,0x91DA] -> [ 8553, 8553] # seg 563 // [0x91DE,0x91DE] -> [ 8555, 8555] # seg 565 // [0x91E4,0x91E5] -> [ 8558, 8559] # seg 567 // [0x91ED,0x91EE] -> [ 8556, 8557] # seg 569 // [0x9206,0x9206] -> [ 8560, 8560] # seg 571 // [0x920A,0x920A] -> [ 8562, 8562] # seg 573 // [0x9210,0x9210] -> [ 8561, 8561] # seg 575 // [0x9239,0x923A] -v # seg 577 at pos 18 8569, 8563, // [0x923C,0x923C] -> [ 8565, 8565] # seg 579 // [0x9240,0x9240] -> [ 8564, 8564] # seg 581 // [0x924E,0x924E] -> [ 8566, 8566] # seg 583 // [0x9251,0x9251] -> [ 8568, 8568] # seg 585 // [0x9259,0x9259] -> [ 8567, 8567] # seg 587 // [0x9267,0x9267] -> [ 8570, 8570] # seg 589 // [0x9277,0x9278] -> [ 8572, 8573] # seg 591 // [0x9288,0x9288] -> [ 8275, 8275] # seg 593 // [0x92A7,0x92A7] -> [ 8571, 8571] # seg 595 // [0x92D0,0x92D0] -> [ 8577, 8577] # seg 597 // [0x92D3,0x92D3] -> [ 8581, 8581] # seg 599 // [0x92D5,0x92D5] -> [ 8579, 8579] # seg 601 // [0x92D7,0x92D7] -> [ 8575, 8575] # seg 603 // [0x92D9,0x92D9] -> [ 8576, 8576] # seg 605 // [0x92E0,0x92E0] -> [ 8580, 8580] # seg 607 // [0x92E7,0x92E7] -> [ 8574, 8574] # seg 609 // [0x92F9,0x92F9] -> [ 8281, 8281] # seg 611 // [0x92FB,0x92FB] -> [ 8584, 8584] # seg 613 // [0x92FF,0x92FF] -> [ 8587, 8587] # seg 615 // [0x9302,0x9302] -> [ 8589, 8589] # seg 617 // [0x931D,0x931E] -v # seg 619 at pos 20 8588, 8586, // [0x9321,0x9321] -> [ 8583, 8583] # seg 621 // [0x9325,0x9325] -> [ 8582, 8582] # seg 623 // [0x9348,0x9348] -> [ 8274, 8274] # seg 625 // [0x9357,0x9357] -> [ 8591, 8591] # seg 627 // [0x9370,0x9370] -> [ 8590, 8590] # seg 629 // [0x93A4,0x93A4] -> [ 8592, 8592] # seg 631 // [0x93C6,0x93C6] -> [ 8593, 8593] # seg 633 // [0x93DE,0x93DE] -> [ 8594, 8594] # seg 635 // [0x93F8,0x93F8] -> [ 8595, 8595] # seg 637 // [0x9431,0x9431] -> [ 8596, 8596] # seg 639 // [0x9445,0x9445] -> [ 8597, 8597] # seg 641 // [0x9448,0x9448] -> [ 8598, 8598] # seg 643 // [0x9592,0x9592] -> [ 8599, 8599] # seg 645 // [0x969D,0x969D] -> [ 8602, 8602] # seg 647 // [0x96AF,0x96AF] -> [ 8603, 8603] # seg 649 // [0x9733,0x9733] -> [ 8604, 8604] # seg 651 // [0x973B,0x973B] -> [ 8605, 8605] # seg 653 // [0x9743,0x9743] -> [ 8606, 8606] # seg 655 // [0x974D,0x974D] -> [ 8607, 8607] # seg 657 // [0x974F,0x974F] -> [ 8608, 8608] # seg 659 // [0x9751,0x9751] -> [ 8609, 8609] # seg 661 // [0x9755,0x9755] -> [ 8610, 8610] # seg 663 // [0x9830,0x9830] -> [ 3990, 3990] # seg 665 // [0x9857,0x9857] -> [ 8611, 8611] # seg 667 // [0x9865,0x9865] -> [ 8612, 8612] # seg 669 // [0x9927,0x9927] -> [ 8615, 8615] # seg 671 // [0x999E,0x999E] -> [ 8617, 8617] # seg 673 // [0x9A4E,0x9A4E] -> [ 8618, 8618] # seg 675 // [0x9AD9,0x9AD9] -> [ 8619, 8619] # seg 677 // [0x9ADC,0x9ADC] -> [ 8620, 8620] # seg 679 // [0x9B72,0x9B72] -> [ 8622, 8622] # seg 681 // [0x9B75,0x9B75] -> [ 8621, 8621] # seg 683 // [0x9B8F,0x9B8F] -> [ 8623, 8623] # seg 685 // [0x9BB1,0x9BB1] -> [ 8624, 8624] # seg 687 // [0x9BBB,0x9BBB] -> [ 8625, 8625] # seg 689 // [0x9C00,0x9C00] -> [ 8626, 8626] # seg 691 // [0x9D6B,0x9D6B] -> [ 8628, 8628] # seg 693 // [0x9D70,0x9D70] -> [ 8627, 8627] # seg 695 // [0x9E19,0x9E19] -> [ 8630, 8630] # seg 697 // [0x9ED1,0x9ED1] -> [ 8631, 8631] # seg 699 // [0xE000,0xE757] -> [ 8836, 10715] # seg 701 // [0xF929,0xF929] -> [ 8403, 8403] # seg 703 // [0xF9DC,0xF9DC] -> [ 8600, 8600] # seg 705 // [0xFA0E,0xFA17] -v # seg 707 at pos 22 8323, 8334, 8335, 8356, 8395, 8411, 8413, 8456, 8462, 8485, // [0xFA18,0xFA1A] -> [ 8493, 8495] # seg 708 // [0xFA1B,0xFA2D] -v # seg 709 at pos 32 8497, 8501, 8504, 8513, 8524, 8526, 8527, 8536, 8544, 8546, 8547, 8550, 8578, 8585, 8601, 8613, 8614, 8616, 8629, // [0xFF02,0xFF02] -> [ 8647, 8647] # seg 711 // [0xFF07,0xFF07] -> [ 8646, 8646] # seg 713 // [0xFF5E,0xFF5E] -> [ 32, 32] # seg 715 // [0xFF61,0xFF84] -v # seg 717 at pos 51 2, 53, 54, 1, 5, 457, 376, 378, 380, 382, 384, 442, 444, 446, 410, 27, 377, 379, 381, 383, 385, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 411, 413, 415, // [0xFF85,0xFF8A] -> [ 417, 422] # seg 718 // [0xFF8B,0xFF8E] -v # seg 719 at pos 87 425, 428, 431, 434, // [0xFF8F,0xFF93] -> [ 437, 441] # seg 720 // [0xFF94,0xFF95] -v # seg 721 at pos 91 443, 445, // [0xFF96,0xFF9B] -> [ 447, 452] # seg 722 // [0xFF9C,0xFF9F] -v # seg 723 at pos 93 454, 458, 10, 11, // [0xFFE2,0xFFE2] -> [ 8644, 8644] # seg 725 // [0xFFE4,0xFFE4] -> [ 8645, 8645] # seg 727 }; // Traditional Chinese Big5 with ETEN extensions // Needs special handling for ETEN outside BMP: // 11205 -> 0x200CC, 11207 -> 0x2008A, 11213 -> 0x27607 const unsigned short CodePageBig5[13551] = { // hot segments (indexes into segment table) 0, // number of segments 34, // segment table 0, 2041, 5024, 5258, 5268, 5278, 5287, 5290, 5316, 5342, 5359, 5366, 5383, 5390, 5427, 5432, 5464, 5466, 5495, 10896, 10906, 10916, 10926, 10966, 11049, 11135, 11142, 11174, 11175, 11201, 11213, 11254, 18997, 19782, // compressed segments 0xEEB8, 0xE311, RCHAR, 0xFF10, 0x2160, 0x3021, RCHAR, 0xFF21, 0xFF41, 0x0391, 0x03A3, 0x03B1, 0x03C3, 0x3105, RCHAR, 0x2400, RCHAR, RCHAR, RCHAR, 0x2460, 0x2474, 0x2170, RCHAR, 0x3041, 0x30A1, RCHAR, 0x0416, 0x0451, 0x0436, RCHAR, 0xF7EE, RCHAR, 0xE000, RCHAR, // uncompressed segments RCHAR, RCHAR, 0x0000, RCHAR, RCHAR, RCHAR, 0x00EA, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x00ED, RCHAR, 0x00F2, RCHAR, 0x00F4, RCHAR, RCHAR, RCHAR, 0x160D, RCHAR, RCHAR, 0x1635, RCHAR, RCHAR, RCHAR, 0x163C, RCHAR, 0x1648, RCHAR, RCHAR, // [ 0, 2040] -> [0xEEB8,0xF6B0] # seg 0 // [ 2041, 5023] -> [0xE311,0xEEB7] # seg 1 // [ 5024, 5257] -v # seg 2 at pos 0 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0x2215, 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, // [ 5258, 5267] -> [0xFF10,0xFF19] # seg 3 // [ 5268, 5277] -> [0x2160,0x2169] # seg 4 // [ 5278, 5286] -> [0x3021,0x3029] # seg 5 // [ 5287, 5289] -v # seg 6 at pos 234 0x5341, 0x5344, 0x5345, // [ 5290, 5315] -> [0xFF21,0xFF3A] # seg 7 // [ 5316, 5341] -> [0xFF41,0xFF5A] # seg 8 // [ 5342, 5358] -> [0x0391,0x03A1] # seg 9 // [ 5359, 5365] -> [0x03A3,0x03A9] # seg 10 // [ 5366, 5382] -> [0x03B1,0x03C1] # seg 11 // [ 5383, 5389] -> [0x03C3,0x03C9] # seg 12 // [ 5390, 5426] -> [0x3105,0x3129] # seg 13 // [ 5427, 5431] -v # seg 14 at pos 237 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, // [ 5432, 5463] -> [0x2400,0x241F] # seg 15 // [ 5464, 5465] -v # seg 16 at pos 242 0x2421, 0x20AC, // [ 5495, 10895] -v # seg 18 at pos 244 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, // [ 10896, 10905] -> [0x2460,0x2469] # seg 19 // [ 10906, 10915] -> [0x2474,0x247D] # seg 20 // [ 10916, 10925] -> [0x2170,0x2179] # seg 21 // [ 10926, 10965] -v # seg 22 at pos 5645 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338, 0x5369, 0x53B6, 0x590A, 0x5B80, 0x5DDB, 0x2F33, 0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, 0x65E0, 0x7592, 0x7676, 0x8FB5, 0x96B6, 0x00A8, 0x02C6, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D, 0x273D, // [ 10966, 11048] -> [0x3041,0x3093] # seg 23 // [ 11049, 11134] -> [0x30A1,0x30F6] # seg 24 // [ 11135, 11141] -v # seg 25 at pos 5685 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, // [ 11142, 11173] -> [0x0416,0x0435] # seg 26 // [ 11174, 11174] -> [0x0451,0x0451] # seg 27 // [ 11175, 11200] -> [0x0436,0x044F] # seg 28 // [ 11201, 11212] -v # seg 29 at pos 5692 0x21E7, 0x21B8, 0x21B9, 0x31CF, 0xF7E6, 0x4E5A, 0xF7E8, 0x5202, 0x4491, 0x9FB0, 0x5188, 0x9FB1, // [ 11213, 11253] -> [0xF7EE,0xF816] # seg 30 // [ 11254, 18996] -v # seg 31 at pos 5704 0xFFE2, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121, 0x309B, 0x309C, 0x2E80, 0x2E84, 0x2E86, 0x2E87, 0x2E88, 0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2E9D, 0x2EA5, 0x2EA7, 0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2EC6, 0x2ECA, 0x2ECC, 0x2ECD, 0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x2EE3, 0xF83C, 0xF83D, 0xF83E, 0x0283, 0x0250, 0x025B, 0x0254, 0x0275, 0x0153, 0x00F8, 0x014B, 0x028A, 0x026A, 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, 0x2550, 0x256D, 0x256E, 0x2570, 0x256F, 0xFFED, // [ 18997, 19781] -> [0xE000,0xE310] # seg 32 }; // Reverse const unsigned short CodePageBig5_R[22007] = { // hot segments (indexes into segment table) 2, 128, 157, // number of segments 180, // segment table 0x0000, 0x00A7, 0x00B8, 0x00D7, 0x00D8, 0x00F7, 0x00F9, 0x014B, 0x014C, 0x0153, 0x0154, 0x0250, 0x025C, 0x026A, 0x026B, 0x0275, 0x0276, 0x0283, 0x028B, 0x02C6, 0x02CE, 0x02D9, 0x02DA, 0x0391, 0x03A2, 0x03A3, 0x03AA, 0x03B1, 0x03C2, 0x03C3, 0x03CA, 0x0401, 0x0402, 0x0410, 0x0416, 0x0436, 0x0450, 0x0451, 0x0452, 0x2013, 0x201E, 0x2025, 0x2028, 0x2032, 0x203C, 0x20AC, 0x20AD, 0x2103, 0x210A, 0x2116, 0x2117, 0x2121, 0x2122, 0x2160, 0x216A, 0x2170, 0x217A, 0x2190, 0x219A, 0x21B8, 0x21BA, 0x21E7, 0x21E8, 0x2215, 0x2236, 0x2252, 0x2253, 0x2260, 0x2268, 0x2295, 0x229A, 0x22A5, 0x22A6, 0x22BF, 0x22C0, 0x2400, 0x2420, 0x2421, 0x2422, 0x2460, 0x246A, 0x2474, 0x247E, 0x2500, 0x2503, 0x250C, 0x251D, 0x2524, 0x2525, 0x252C, 0x252D, 0x2534, 0x2535, 0x253C, 0x253D, 0x2550, 0x2575, 0x2581, 0x2589, 0x2596, 0x25A0, 0x25A2, 0x25B2, 0x25B4, 0x25BC, 0x25BE, 0x25C6, 0x25D0, 0x25E2, 0x25E6, 0x2605, 0x2607, 0x2640, 0x2643, 0x273D, 0x273E, 0x2E80, 0x2E8E, 0x2E95, 0x2E9E, 0x2EA5, 0x2EAF, 0x2EB6, 0x2EBF, 0x2EC6, 0x2EE4, 0x2F33, 0x2F34, 0x3000, 0x3020, 0x3021, 0x302A, 0x3038, 0x3041, 0x3094, 0x309B, 0x30A1, 0x30F7, 0x30FC, 0x3105, 0x312A, 0x31CF, 0x31D0, 0x3231, 0x3232, 0x32A3, 0x32A4, 0x338E, 0x3390, 0x339C, 0x33A2, 0x33C4, 0x33C5, 0x33CE, 0x33D6, 0x4491, 0x4492, 0x4E00, 0xA000, 0xE000, 0xE311, 0xEEB8, 0xF6B1, 0xF849, 0xFA0C, 0xFA0E, 0xFE30, 0xFE6C, 0xFF01, 0xFF10, 0xFF1A, 0xFF21, 0xFF3B, 0xFF41, 0xFF5B, 0xFF5F, 0xFFE0, 0xFFE6, 0xFFED, 0xFFEE, // compressed segments RCHAR, RCHAR, RCHAR, 5135, RCHAR, RCHAR, RCHAR, 11301, RCHAR, 11299, RCHAR, RCHAR, RCHAR, 11303, RCHAR, 11298, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5427, RCHAR, 5342, RCHAR, 5359, RCHAR, 5366, RCHAR, 5383, RCHAR, 11141, RCHAR, 11135, 11142, 11175, RCHAR, 11174, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5465, RCHAR, RCHAR, RCHAR, 11259, RCHAR, 11260, RCHAR, 5268, RCHAR, 10916, RCHAR, RCHAR, RCHAR, 11202, RCHAR, 11201, RCHAR, RCHAR, RCHAR, 5146, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5156, RCHAR, 5159, RCHAR, 5432, RCHAR, 5464, RCHAR, 10896, RCHAR, 10906, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5233, RCHAR, 5232, RCHAR, 5231, RCHAR, 5230, RCHAR, RCHAR, RCHAR, 5215, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10965, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10940, RCHAR, RCHAR, RCHAR, 5278, RCHAR, RCHAR, 10966, RCHAR, RCHAR, 11049, RCHAR, RCHAR, 5390, RCHAR, 11204, RCHAR, 11258, RCHAR, 5118, RCHAR, 5202, RCHAR, RCHAR, RCHAR, 5204, RCHAR, RCHAR, RCHAR, 11209, RCHAR, RCHAR, RCHAR, 18997, 2041, 0, 10896, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5258, RCHAR, 5290, RCHAR, 5316, RCHAR, RCHAR, RCHAR, RCHAR, 18996, RCHAR, // uncompressed segments RCHAR, 21024, RCHAR, RCHAR, RCHAR, 21041, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21043, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21055, RCHAR, 21063, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21071, RCHAR, 21082, RCHAR, 21085, RCHAR, RCHAR, RCHAR, 21095, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21102, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21112, RCHAR, RCHAR, RCHAR, 21145, RCHAR, 21153, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21158, RCHAR, 21161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21178, RCHAR, RCHAR, 21215, RCHAR, 21228, RCHAR, 21230, RCHAR, 21232, RCHAR, 21234, RCHAR, 21244, RCHAR, 21248, RCHAR, 21250, RCHAR, RCHAR, RCHAR, 21253, RCHAR, 21267, RCHAR, 21276, RCHAR, 21286, RCHAR, 21295, RCHAR, RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, 21325, RCHAR, RCHAR, 21334, RCHAR, RCHAR, 21340, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21349, RCHAR, RCHAR, RCHAR, 21355, RCHAR, RCHAR, RCHAR, 32, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 21363, RCHAR, 21365, RCHAR, 21425, RCHAR, 21440, RCHAR, 21447, RCHAR, 21453, RCHAR, 21457, RCHAR, RCHAR, RCHAR, // [0x00D7,0x00D7] -> [ 5135, 5135] # seg 3 // [0x0416,0x0435] -> [ 11142, 11173] # seg 34 // [0x273D,0x273D] -> [ 10965, 10965] # seg 114 // [0x2F33,0x2F33] -> [ 10940, 10940] # seg 126 // [0x3000,0x301F] -v # seg 128 at pos 0 5024, 5026, 5027, 5104, RCHAR, 10959, 10960, 10961, 5073, 5074, 5069, 5070, 5077, 5078, 5081, 5082, 5065, 5066, 5186, RCHAR, 5061, 5062, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5095, 5096, RCHAR, // [0x3041,0x3093] -> [ 10966, 11048] # seg 133 // [0x30A1,0x30F6] -> [ 11049, 11134] # seg 136 // [0x3105,0x3129] -> [ 5390, 5426] # seg 139 // [0x31CF,0x31CF] -> [ 11204, 11204] # seg 141 // [0x3231,0x3231] -> [ 11258, 11258] # seg 143 // [0x32A3,0x32A3] -> [ 5118, 5118] # seg 145 // [0x338E,0x338F] -> [ 5202, 5203] # seg 147 // [0x33C4,0x33C4] -> [ 5204, 5204] # seg 151 // [0x4491,0x4491] -> [ 11209, 11209] # seg 155 // [0x4E00,0x9FFF] -v # seg 157 at pos 32 5495, 5497, RCHAR, 5498, RCHAR, RCHAR, RCHAR, 11309, 5517, 5515, 5518, 5516, 11310, 5560, 11319, 11317, 5559, 5558, RCHAR, RCHAR, 5654, 5653, 5652, RCHAR, 5655, 5651, RCHAR, RCHAR, RCHAR, RCHAR, 5778, 5779, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6220, RCHAR, RCHAR, RCHAR, RCHAR, 5519, RCHAR, 5561, 11320, RCHAR, 5562, 11339, 5945, 11697, RCHAR, RCHAR, 10926, RCHAR, 5520, 5563, RCHAR, 5656, 11340, RCHAR, RCHAR, 10927, RCHAR, RCHAR, 11304, 5499, RCHAR, 5522, RCHAR, 11311, 5523, RCHAR, RCHAR, 5564, RCHAR, 5657, 5659, 5658, RCHAR, RCHAR, 5780, 5781, RCHAR, RCHAR, 6221, RCHAR, 6998, 5496, 11206, RCHAR, 11305, 5500, 5525, 5524, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5782, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6222, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7455, 13042, RCHAR, RCHAR, 8418, 14366, 14367, 10928, 5501, RCHAR, 5566, RCHAR, RCHAR, 6223, 5502, 11312, 5526, RCHAR, RCHAR, 5567, 5569, 11321, 5570, 5568, RCHAR, RCHAR, RCHAR, 5783, RCHAR, 6224, RCHAR, RCHAR, 6225, 6599, 10929, 5527, 5571, RCHAR, 5784, 5786, 5785, RCHAR, 5946, RCHAR, RCHAR, 6226, 6227, 6600, 6601, RCHAR, RCHAR, RCHAR, RCHAR, 6999, RCHAR, RCHAR, 14368, RCHAR, RCHAR, 18485, 5503, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5573, 5572, 11322, 5574, 5580, RCHAR, 5575, 5576, 11324, 11323, 5578, 5579, RCHAR, 5577, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5662, 5663, 5664, 5665, 5661, 5668, 11346, RCHAR, 11342, 11345, 5669, 5685, RCHAR, 11344, RCHAR, 5666, 5667, 5660, RCHAR, RCHAR, 11341, 11343, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5799, 11382, 5796, 5800, 11392, 11380, 5797, 11384, RCHAR, RCHAR, RCHAR, 5798, RCHAR, 5801, RCHAR, 5787, 11383, 5802, 11387, RCHAR, 11391, 11388, RCHAR, RCHAR, 11385, 5788, 5790, 5803, RCHAR, 5792, 11377, 5795, 5793, 5794, 11393, 11390, 11381, 5791, RCHAR, RCHAR, 11378, 5789, RCHAR, RCHAR, RCHAR, 11386, RCHAR, RCHAR, RCHAR, RCHAR, 11389, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11379, 11499, RCHAR, 5968, 5955, RCHAR, RCHAR, 11500, 5952, RCHAR, 5970, RCHAR, 5960, RCHAR, 5959, 11488, 5963, 5958, 11493, 11501, RCHAR, 11497, RCHAR, 5961, RCHAR, RCHAR, 5964, 5949, 5973, 11490, RCHAR, RCHAR, 11709, 5947, 5969, 5948, 5956, 5957, 11495, 11491, 5962, 5954, 11487, 5950, 11498, 5971, 5974, 5953, 5966, 5972, 5951, 11496, 5967, 11502, 11489, 5965, 11492, RCHAR, RCHAR, 11494, RCHAR, 6241, 11711, 11723, 6233, RCHAR, 11724, 6228, 6238, RCHAR, RCHAR, 6231, 11705, 6239, 11704, 11708, 11715, 11713, 6247, 6242, 11699, 11701, 6244, 6232, 11702, 11714, 11721, 6237, 11707, 11700, 6236, 11703, 6240, 11706, RCHAR, 6235, RCHAR, 6230, RCHAR, 6245, 11716, 6246, 11720, RCHAR, 11718, 11722, 6243, 11710, 11698, RCHAR, 11712, 6234, 11717, 6229, 11719, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6616, 6604, RCHAR, RCHAR, 12058, 12066, RCHAR, 6603, 6611, 6623, RCHAR, 12072, 12070, 12065, RCHAR, RCHAR, RCHAR, 6605, 12071, 12061, 6619, 6610, 6618, 12056, RCHAR, 12068, RCHAR, 12059, 6614, 12060, RCHAR, 12055, 6621, 6608, 6617, 6607, RCHAR, 12057, 12062, RCHAR, 12069, 6615, 6612, 12064, 6620, 12067, 12063, 6609, 6622, 6613, 6606, 6602, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12073, RCHAR, 7025, 7003, RCHAR, 7019, RCHAR, 7024, 12513, 12512, 12517, 12518, 7006, RCHAR, 7015, RCHAR, RCHAR, RCHAR, 7028, RCHAR, 7016, RCHAR, RCHAR, RCHAR, RCHAR, 12506, 7009, 12507, RCHAR, 7030, RCHAR, 7021, 7000, 7001, 12526, 7472, RCHAR, 7014, 7013, 12508, 7017, 13058, 7008, 12519, 7023, 7022, 7012, 12511, 12520, RCHAR, 12505, 7011, 12521, 7020, 12509, 7002, RCHAR, 7005, 7004, 12522, 7018, 7007, 7027, 7029, 12516, 7026, RCHAR, 12524, 12510, 12525, RCHAR, 12514, RCHAR, 12523, RCHAR, 12515, RCHAR, RCHAR, RCHAR, RCHAR, 7010, RCHAR, RCHAR, RCHAR, 13066, 13054, RCHAR, 7460, RCHAR, 13059, 13065, 7459, 13052, 7463, 13056, 13049, 7461, 13053, 7466, 7471, RCHAR, 13070, RCHAR, 13048, RCHAR, 7467, RCHAR, 13069, RCHAR, RCHAR, 7462, 13055, 7458, 13050, 13046, 13060, 13047, 13045, 13057, 13063, 13064, 7464, RCHAR, RCHAR, 13686, 13061, 13044, 13062, RCHAR, 7474, 13067, 7473, 13043, RCHAR, 13051, 13068, 7469, 7468, 7465, 7470, RCHAR, RCHAR, 7456, RCHAR, RCHAR, 7457, RCHAR, RCHAR, 7952, RCHAR, 13689, 13682, RCHAR, 7949, RCHAR, 13690, RCHAR, RCHAR, RCHAR, 13680, 13683, 7948, 13684, RCHAR, RCHAR, 7951, 13688, RCHAR, 13678, 13677, 7953, RCHAR, 7954, 7950, 7955, 13676, 13687, 13685, 13679, RCHAR, RCHAR, RCHAR, 7947, 13681, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8425, 8419, 14372, 8428, 14378, 14381, 8421, 8422, 14375, 8420, 14384, 8426, 14385, RCHAR, 14380, 8427, RCHAR, 14369, 8424, 14370, RCHAR, 14379, 14377, RCHAR, 14373, 8423, 14371, 8429, 14376, 14383, 14374, 14382, RCHAR, RCHAR, 8876, 8873, RCHAR, 8874, RCHAR, 15066, 15058, 8872, 8869, 15059, RCHAR, RCHAR, 8871, 15062, RCHAR, 15064, RCHAR, RCHAR, 15071, RCHAR, RCHAR, 15070, 15065, 8868, 15057, 8866, 15060, 8877, 15063, RCHAR, 15067, 8870, 8867, 15069, 15068, 8875, RCHAR, 15061, RCHAR, 9256, 15681, RCHAR, 15678, 9257, RCHAR, 9255, RCHAR, 15685, 15682, 15675, 9254, RCHAR, 9258, 15676, 9253, 9261, 15679, 15680, 9259, 9260, 15686, 15683, 15684, RCHAR, RCHAR, RCHAR, 9649, 16321, 9646, 16318, 9648, 9650, RCHAR, 16319, 9647, RCHAR, 16320, RCHAR, 16317, RCHAR, RCHAR, 9945, 16890, 9946, 16888, RCHAR, 16889, 16887, 16886, RCHAR, RCHAR, 16891, 9944, RCHAR, RCHAR, 17356, 17357, RCHAR, 15677, 17355, 9947, 10393, 17721, 17722, RCHAR, 10636, 10637, 18307, 18306, 10720, 10719, 18636, RCHAR, 5504, 5528, 5582, RCHAR, 5581, 5671, 5670, 5806, 5805, 5807, 5804, RCHAR, 5976, 5975, 5977, RCHAR, RCHAR, RCHAR, RCHAR, 6249, RCHAR, 6248, 6250, RCHAR, 6624, RCHAR, 5206, 12527, 5207, 7475, 5209, 5208, 13691, RCHAR, 5210, 8878, 5211, RCHAR, 5505, RCHAR, 5583, 5808, 6251, RCHAR, 5506, 5586, 5584, 5585, RCHAR, RCHAR, 5809, RCHAR, RCHAR, RCHAR, 5978, 6253, 6252, 6254, RCHAR, RCHAR, RCHAR, 7031, RCHAR, RCHAR, RCHAR, 9651, RCHAR, 10930, RCHAR, RCHAR, RCHAR, RCHAR, 11318, 11211, 5672, 5673, RCHAR, RCHAR, 5810, RCHAR, 11503, RCHAR, 6626, 6625, 12529, 12528, 7476, 10931, 5587, 11325, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11725, RCHAR, 6627, RCHAR, 7034, RCHAR, 7032, 7033, RCHAR, RCHAR, RCHAR, RCHAR, 9652, 10932, 5674, RCHAR, RCHAR, RCHAR, 5811, 11394, RCHAR, RCHAR, RCHAR, RCHAR, 5979, 5980, RCHAR, 11504, RCHAR, RCHAR, 11726, 6255, 11727, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12531, 12532, 7037, RCHAR, 12533, RCHAR, 12530, 7038, 7036, 7035, 12534, RCHAR, 13071, RCHAR, RCHAR, RCHAR, 13692, RCHAR, RCHAR, 14386, 15072, RCHAR, RCHAR, RCHAR, 9262, 9653, 16322, RCHAR, 5507, 5521, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7477, 7957, RCHAR, 8879, RCHAR, 11306, 5588, RCHAR, 5677, 5675, 5676, RCHAR, RCHAR, 6256, RCHAR, RCHAR, 5508, 5509, 11208, 5529, RCHAR, RCHAR, 5589, 5590, 5591, 11396, 5678, RCHAR, 11347, RCHAR, 5815, RCHAR, 11397, 5813, 5814, 11395, RCHAR, RCHAR, 5816, 5812, RCHAR, RCHAR, RCHAR, RCHAR, 11505, 6575, 11506, RCHAR, RCHAR, 11507, RCHAR, RCHAR, 5982, 5981, RCHAR, RCHAR, 5985, 5983, 5984, RCHAR, RCHAR, RCHAR, 6262, RCHAR, 6261, 11732, 11729, 11730, RCHAR, 11728, 6263, 6259, 6258, RCHAR, 6260, 6257, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6264, RCHAR, 6629, 12074, RCHAR, 11731, 6634, RCHAR, 12075, 6630, 6633, 6632, 6631, 6628, RCHAR, RCHAR, RCHAR, 12537, RCHAR, 7041, 12540, 7039, RCHAR, RCHAR, RCHAR, 12536, 7042, 7040, 7043, 12538, 12539, RCHAR, 12535, 12541, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7961, 7478, 13072, 13074, 13073, 13075, 7479, RCHAR, RCHAR, 7958, RCHAR, 7959, 7960, RCHAR, 8431, 14388, RCHAR, 14387, 14389, 14390, 8432, RCHAR, 8430, 15073, 15074, 8881, 8880, 15412, RCHAR, RCHAR, 9263, 9264, 9265, 9267, 15687, 15688, 9266, RCHAR, RCHAR, RCHAR, 9654, RCHAR, 9655, RCHAR, RCHAR, 17723, 18309, 18308, 18637, RCHAR, 5510, RCHAR, RCHAR, RCHAR, 5680, 5679, RCHAR, RCHAR, 5817, RCHAR, RCHAR, 11398, RCHAR, RCHAR, 5987, 5988, 5986, 5989, 11508, 11509, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6266, 11733, RCHAR, 6265, RCHAR, 12076, 6638, 12077, 6637, RCHAR, RCHAR, RCHAR, 6635, RCHAR, 6636, RCHAR, RCHAR, RCHAR, 12542, RCHAR, RCHAR, RCHAR, RCHAR, 7480, 13077, RCHAR, 7483, 13076, 7667, 7482, 7481, RCHAR, 7964, RCHAR, 7963, 7962, 8433, RCHAR, RCHAR, 8436, 8437, 8435, RCHAR, 8434, RCHAR, RCHAR, 15075, RCHAR, 15076, RCHAR, RCHAR, RCHAR, 15690, 9268, 15689, RCHAR, 9656, 16892, 9948, RCHAR, 17724, 10540, 10933, 5530, 5592, 11326, RCHAR, 5593, 5594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5681, 5682, RCHAR, 5818, 11510, 11734, 11735, RCHAR, 6639, 12543, 7485, 7484, 13694, 13693, RCHAR, RCHAR, 5511, 5595, 5683, RCHAR, 7486, 11307, RCHAR, 11348, 5684, RCHAR, 11400, 5820, 5819, 11399, 5990, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7044, RCHAR, RCHAR, 13078, RCHAR, 8438, 15077, 8882, RCHAR, RCHAR, 16323, RCHAR, RCHAR, 18053, 10934, 5596, RCHAR, RCHAR, 11736, 12078, 7489, 7487, 7488, 5512, RCHAR, 5531, 5288, 5599, RCHAR, 5598, 5597, 5687, 5686, RCHAR, 11349, 11401, RCHAR, RCHAR, RCHAR, 6270, 6267, 6269, 6268, RCHAR, RCHAR, 6640, RCHAR, RCHAR, 7965, RCHAR, 5513, RCHAR, 5600, RCHAR, 5689, 5688, RCHAR, 11511, RCHAR, RCHAR, 6271, RCHAR, RCHAR, 10935, RCHAR, RCHAR, 11327, RCHAR, 5691, 5690, 5821, 5822, 11512, 5991, RCHAR, 5992, RCHAR, 6272, 6273, 6274, RCHAR, 6641, 12079, RCHAR, RCHAR, 7045, RCHAR, RCHAR, 11308, RCHAR, 5601, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11402, RCHAR, RCHAR, RCHAR, 11513, 11514, RCHAR, RCHAR, 11737, RCHAR, 11738, RCHAR, 12081, 12080, 12083, 12082, 6642, RCHAR, 13079, 7047, 12544, 7046, RCHAR, RCHAR, RCHAR, RCHAR, 13695, 7966, RCHAR, 13696, RCHAR, RCHAR, RCHAR, RCHAR, 15078, 8883, RCHAR, RCHAR, RCHAR, RCHAR, 9269, RCHAR, 17725, RCHAR, 10936, RCHAR, RCHAR, 11328, RCHAR, 5692, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7490, RCHAR, RCHAR, RCHAR, RCHAR, 5514, 5532, 5603, 5602, RCHAR, 5604, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6276, RCHAR, 6275, 6277, RCHAR, RCHAR, RCHAR, 6643, RCHAR, RCHAR, RCHAR, 7048, RCHAR, 16324, 10220, 5533, 5694, 5709, 5704, RCHAR, 5699, 5698, 5705, 5703, 5696, 5710, 5697, 5693, 5708, 5707, 5706, 5695, RCHAR, 5702, RCHAR, RCHAR, 5701, RCHAR, RCHAR, 5711, 5700, RCHAR, RCHAR, RCHAR, RCHAR, 5828, RCHAR, 5834, 5830, RCHAR, 5836, 11403, 5833, 5823, 5826, 5829, 5825, 5832, 5835, 5824, 5827, 5831, 5837, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11523, 11520, RCHAR, 6005, 11521, 5993, 5995, 6019, 6014, RCHAR, RCHAR, RCHAR, 11528, 11522, 5997, 5999, 11527, 6006, 11517, 6018, 6020, 5994, 6011, RCHAR, 11515, 6017, RCHAR, 6002, RCHAR, 6012, 6013, 11516, 6010, 6008, RCHAR, 6009, 6015, 11524, 5996, RCHAR, 6016, 11526, 6004, 6001, RCHAR, 11519, 6000, 11529, 6003, RCHAR, 6007, RCHAR, RCHAR, RCHAR, 5998, 11525, RCHAR, RCHAR, RCHAR, RCHAR, 11518, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11755, 11754, 6295, 11757, 11759, 11748, 11751, 11758, 6296, RCHAR, RCHAR, 11745, 11749, RCHAR, RCHAR, 11753, 12098, 6291, 12102, 6278, 11750, 6279, 6292, 6285, 6281, RCHAR, 11746, 6284, 6289, 6298, 11747, 11740, 6283, 11741, 11743, RCHAR, 6286, RCHAR, 6288, 11739, 11744, RCHAR, RCHAR, 6297, 6293, 11752, 6299, RCHAR, 6290, 11742, 6287, RCHAR, RCHAR, 6282, 6280, RCHAR, 11756, RCHAR, 6294, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12097, 12085, 12100, RCHAR, RCHAR, 12087, 6650, 6664, 6646, 6663, 6655, 6660, 6644, 12086, 12092, 6659, 12104, 6661, RCHAR, 6651, RCHAR, RCHAR, 12094, 12091, 6649, RCHAR, 12084, 6662, 12099, 6654, 12101, 6665, 6645, 6656, 6653, 12089, 6657, 12095, 12096, 6652, 6658, 6648, RCHAR, RCHAR, RCHAR, RCHAR, 6647, 12088, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12093, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12103, RCHAR, 12564, 7061, 12546, RCHAR, 12551, 7054, 7065, 12549, 7049, 7059, 7064, 12556, RCHAR, 7060, 7063, RCHAR, RCHAR, 12559, 7055, 12550, RCHAR, RCHAR, RCHAR, 12562, 12563, RCHAR, 7057, 12561, 7053, 7068, RCHAR, 12553, RCHAR, 7051, RCHAR, 12566, 12554, 12558, 7056, 7067, 12555, 7062, 12560, 12567, 13094, RCHAR, 12565, 7069, 7050, 12557, 12548, RCHAR, 7058, RCHAR, RCHAR, 12547, RCHAR, RCHAR, 12552, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12545, 7066, RCHAR, RCHAR, 13086, RCHAR, 7509, 13100, 7507, 7504, 13091, 7500, 13095, 7511, 13085, 13090, 13089, 7052, 7506, 13098, RCHAR, 13101, 13082, RCHAR, 7984, RCHAR, 13102, 7512, RCHAR, 7498, 7495, 13093, 7492, RCHAR, 13099, RCHAR, 7499, 13103, RCHAR, 13083, 13097, 7502, 13084, 13087, 13092, RCHAR, RCHAR, 7503, 7501, 7513, RCHAR, RCHAR, RCHAR, RCHAR, 7508, RCHAR, 7496, 7648, RCHAR, 7497, 13088, 7510, 7505, 13096, 7494, RCHAR, RCHAR, RCHAR, 7493, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13080, 13081, 13701, RCHAR, RCHAR, RCHAR, 7967, 7970, 13712, 7990, 13715, 7968, 13708, 7974, 7980, 8255, RCHAR, RCHAR, 7978, 13705, 7991, 7971, 7979, 13713, 14404, 13718, 13706, RCHAR, 13697, 13710, 13704, 7977, 13716, RCHAR, RCHAR, 7973, 7993, 7986, RCHAR, 7975, 7972, RCHAR, 7983, RCHAR, 13717, 13703, 13709, 13711, 13699, 13714, 7969, 13698, RCHAR, 7976, 7992, 7988, 13700, 7982, RCHAR, RCHAR, 7989, 7985, 7981, RCHAR, 13707, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7987, RCHAR, RCHAR, RCHAR, 14402, 14398, RCHAR, 14413, 14391, 14400, 8452, 8453, 8445, 14409, 8455, 14396, 14395, 14393, 14411, 8443, 14405, 14394, 8446, 14403, 8441, 14399, 14406, 14408, RCHAR, RCHAR, 14412, 8450, 14392, 8444, 14397, RCHAR, 8439, RCHAR, 8451, 14407, 8447, 8448, 8454, 8442, 5212, 8440, 14401, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8449, RCHAR, RCHAR, 14410, RCHAR, RCHAR, RCHAR, 8899, 8894, RCHAR, 15093, 15089, RCHAR, 15083, 8888, 8884, 15092, 8885, 15086, 15088, RCHAR, 15091, RCHAR, 8890, RCHAR, 8897, 8891, RCHAR, RCHAR, 15081, 8892, 8893, 15084, 8898, RCHAR, 15082, 15087, 8889, 15080, 8895, 8887, RCHAR, RCHAR, RCHAR, 8886, 15085, 15090, RCHAR, 8896, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15079, RCHAR, 9276, 15707, RCHAR, 15704, RCHAR, 9270, 9282, 9283, RCHAR, 9273, 15702, 9275, 15694, 9281, RCHAR, 15706, 9272, 15708, 9271, RCHAR, 15703, 15705, 9274, 15701, 15695, 15692, RCHAR, RCHAR, 13702, 15698, RCHAR, 15691, 15697, 15696, RCHAR, 15693, RCHAR, 9278, RCHAR, RCHAR, RCHAR, RCHAR, 9277, RCHAR, RCHAR, RCHAR, 9279, 15699, 9657, 15700, RCHAR, RCHAR, RCHAR, 16333, RCHAR, 16326, RCHAR, 9669, 16330, 9661, 9665, 16329, RCHAR, 9664, 9660, 9663, 9658, 9668, 16331, 16327, 9667, 16325, 9666, 16332, 16328, 9280, RCHAR, 9670, 16334, 9662, 9659, RCHAR, RCHAR, RCHAR, RCHAR, 16899, 16901, 9950, 16902, 16900, 16898, 16897, 9952, 16896, 9953, RCHAR, RCHAR, RCHAR, RCHAR, 16894, 16895, 9949, 9954, 9951, RCHAR, RCHAR, 16893, RCHAR, 10221, RCHAR, 17360, 17358, 17363, 17361, RCHAR, 17359, 17362, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10394, 17728, 17729, 10541, RCHAR, 17730, 17726, 17731, 17727, 10222, RCHAR, RCHAR, RCHAR, 18054, 18056, 10544, 18055, 10543, 10542, RCHAR, RCHAR, RCHAR, RCHAR, 10545, 18311, 18312, RCHAR, 10639, 10638, 10640, 18310, RCHAR, 18487, 18486, RCHAR, 10721, 10723, 10722, 18488, 10778, 18751, RCHAR, RCHAR, RCHAR, 10819, RCHAR, 18750, 18823, RCHAR, RCHAR, 11313, RCHAR, RCHAR, 5713, 5712, RCHAR, 5840, 5839, 11405, 5838, 11404, RCHAR, RCHAR, 6023, 11532, RCHAR, 11531, RCHAR, RCHAR, 6021, 6024, RCHAR, RCHAR, 11530, RCHAR, 6022, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11760, RCHAR, 11761, 6300, RCHAR, RCHAR, RCHAR, RCHAR, 6666, RCHAR, 12568, 12569, 7070, 7071, RCHAR, RCHAR, 13105, 7514, 7516, 13104, 7515, 13719, 7994, RCHAR, RCHAR, RCHAR, RCHAR, 8456, 8457, 14414, RCHAR, 8901, RCHAR, 8900, RCHAR, 15709, 16336, 16335, RCHAR, 18883, 5534, 11329, RCHAR, 11350, 11351, RCHAR, RCHAR, RCHAR, RCHAR, 5843, 5847, 11407, RCHAR, 5845, 5844, 11406, 5846, 5842, RCHAR, RCHAR, 5841, 11408, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6034, RCHAR, RCHAR, 6031, RCHAR, 6027, 11533, RCHAR, RCHAR, RCHAR, 11534, RCHAR, 6029, RCHAR, 11536, 6025, 11537, 11535, 6028, 6030, 6033, 6032, 6026, 11538, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6305, 11774, RCHAR, 6307, RCHAR, 6306, RCHAR, 11775, 6304, 6303, 11765, RCHAR, 11764, RCHAR, 11762, 11767, 11766, 11763, 11772, 11773, 11770, 11768, 6302, RCHAR, RCHAR, RCHAR, 11771, 6308, 11776, RCHAR, RCHAR, 11769, RCHAR, 6667, 6301, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6668, 12109, RCHAR, RCHAR, 12115, RCHAR, RCHAR, RCHAR, 6674, 12113, 12119, RCHAR, 12110, 12114, 12116, 12118, 12112, RCHAR, 12111, 12106, 12107, 6669, RCHAR, 6671, 6670, 12108, 12117, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6673, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12105, 12579, RCHAR, 12578, 12583, 12574, RCHAR, 12577, 12576, RCHAR, 12580, RCHAR, 12584, 7072, 7075, RCHAR, RCHAR, 12575, 12581, RCHAR, RCHAR, RCHAR, 7074, 12570, RCHAR, 6672, 13119, 12582, RCHAR, 12573, RCHAR, 7073, 12572, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13110, RCHAR, RCHAR, 7517, 7521, 13126, 13108, 13122, 7522, 13124, RCHAR, 13130, RCHAR, 13134, RCHAR, RCHAR, 13125, 13113, 13121, RCHAR, 13135, 13133, 13123, 13118, 13111, 13727, 13109, 7526, 13116, 7527, 7523, 13106, 13128, 13114, RCHAR, RCHAR, 13112, 13131, 7524, RCHAR, 13137, 7518, 7520, 13120, 13115, 7076, 7519, 13117, 13132, 13136, 13127, RCHAR, 13129, RCHAR, RCHAR, RCHAR, 13107, RCHAR, RCHAR, RCHAR, RCHAR, 13722, RCHAR, 13731, 13730, 8002, 13723, RCHAR, 8003, 8001, RCHAR, 13725, 7998, 13729, RCHAR, 13724, 13726, 13720, 7996, RCHAR, 13739, 13738, 13735, 7995, 7999, 8000, 12571, 13732, 7997, 7525, 13734, 13721, 13737, 13736, RCHAR, 13740, RCHAR, 14428, RCHAR, 13733, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13728, 14420, 8467, 8470, 8465, 14419, 14423, 14418, RCHAR, 8459, 8469, 14415, 8463, 14422, RCHAR, 8461, 8460, 14425, 8462, 14427, RCHAR, 14424, 8458, RCHAR, RCHAR, RCHAR, 8468, 14429, 14417, 14426, RCHAR, RCHAR, 14416, RCHAR, RCHAR, 8464, RCHAR, 8466, RCHAR, 14421, RCHAR, 14430, RCHAR, RCHAR, 15101, 8902, 15107, RCHAR, RCHAR, 8907, 15103, 15110, 15095, 8909, 8903, 15100, 9284, 15099, 15108, 8904, RCHAR, 8908, 15098, 15104, 15109, 15094, 8906, 15102, RCHAR, RCHAR, 15106, 15112, 15096, 15105, RCHAR, 8905, 15111, RCHAR, RCHAR, RCHAR, 15097, RCHAR, RCHAR, RCHAR, 9288, 15711, 9286, 9285, 15713, 15718, RCHAR, 15714, RCHAR, 15717, 9291, RCHAR, 9644, 9290, RCHAR, 15710, 15716, RCHAR, 9289, 15715, RCHAR, 15712, RCHAR, 9287, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16341, 18959, 16343, 16338, 9672, 16340, RCHAR, 9671, 16342, RCHAR, RCHAR, 9674, 16344, 9673, 16337, 16339, RCHAR, RCHAR, RCHAR, RCHAR, 9958, 16905, RCHAR, 9957, 16906, 9956, 16904, 9955, 16903, RCHAR, 10224, 10223, 17732, 17734, RCHAR, 17733, 10395, 10396, RCHAR, RCHAR, 10397, 18057, 10546, RCHAR, RCHAR, 18639, 18638, 10820, RCHAR, 5535, 5605, RCHAR, RCHAR, 6035, RCHAR, RCHAR, RCHAR, RCHAR, 12120, RCHAR, RCHAR, RCHAR, RCHAR, 8004, 8005, RCHAR, 14431, 8910, 15113, 15719, RCHAR, RCHAR, RCHAR, 11330, RCHAR, RCHAR, 11539, RCHAR, RCHAR, RCHAR, 10937, RCHAR, 11777, 12121, 12585, 7077, RCHAR, RCHAR, 17735, RCHAR, 10641, 5536, 5714, 11352, RCHAR, 5848, 5849, RCHAR, 6309, RCHAR, RCHAR, RCHAR, 7528, RCHAR, 8912, RCHAR, 8913, 8911, RCHAR, 5537, RCHAR, 5606, 5608, 5607, 11331, 5609, 5715, 11353, RCHAR, 5716, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5850, 5851, RCHAR, RCHAR, RCHAR, 11409, RCHAR, 6036, RCHAR, 11540, RCHAR, RCHAR, RCHAR, 6313, 11778, RCHAR, 6311, 6312, 6310, 12586, RCHAR, RCHAR, RCHAR, 6678, 6677, 6679, 6676, RCHAR, 12122, 6314, 6675, RCHAR, 7078, 7079, RCHAR, 7080, RCHAR, 13138, RCHAR, RCHAR, RCHAR, 8006, 13741, 7529, RCHAR, RCHAR, RCHAR, RCHAR, 8471, RCHAR, 8915, 8914, 15114, RCHAR, 9292, 9675, RCHAR, 17364, 18489, 18640, 5538, 5717, RCHAR, 5718, 11415, 5853, 5856, RCHAR, 11413, 11411, 5855, 11414, 11416, 11410, 5858, 5857, 5854, 5852, 11412, RCHAR, RCHAR, RCHAR, RCHAR, 6047, RCHAR, RCHAR, 6044, 11545, 11548, 11547, RCHAR, 6038, 6046, RCHAR, RCHAR, 6043, 11544, 11542, 6042, RCHAR, RCHAR, RCHAR, 6037, 6040, RCHAR, 11543, 11550, 11546, 6041, 6045, 6048, 11541, 11549, 6039, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6319, 6327, RCHAR, 11790, 11783, 6328, 11794, 11779, 11786, RCHAR, RCHAR, 6318, 11780, 6316, 11787, 11791, 6315, RCHAR, 11792, 11785, RCHAR, 11788, RCHAR, 6330, 6321, 11795, 11793, RCHAR, 6326, 6324, 11784, 6323, 11782, 11781, 6322, 6320, 6329, 6325, 6317, RCHAR, 11789, RCHAR, 6681, RCHAR, 6688, 12136, 6680, 12128, 12124, RCHAR, 12140, 12123, RCHAR, 6683, 12133, 6686, 6689, RCHAR, 6684, 12137, 6687, RCHAR, 7087, 12143, 12125, RCHAR, RCHAR, 12127, 12134, 12138, 12142, 12139, 12132, 12135, RCHAR, RCHAR, 12129, 6691, 12131, 12130, 12141, 6682, 12126, 6690, RCHAR, 6685, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7093, 12594, RCHAR, 7092, RCHAR, RCHAR, 12592, RCHAR, 7081, RCHAR, 7086, RCHAR, 12591, 12588, 12593, 7082, 12587, RCHAR, 7085, 7083, RCHAR, 12595, 7084, 7088, RCHAR, RCHAR, 7089, RCHAR, 7091, RCHAR, RCHAR, RCHAR, 7090, RCHAR, RCHAR, RCHAR, 12589, 12590, RCHAR, RCHAR, RCHAR, RCHAR, 12596, RCHAR, 13145, 7530, 13755, 13144, 13163, RCHAR, RCHAR, 7536, RCHAR, 13161, RCHAR, 7535, 7531, 13170, 13154, 13157, RCHAR, 7539, 13167, 13159, 7532, 7540, RCHAR, 13164, 13162, RCHAR, RCHAR, 13147, 13168, 13156, 13151, RCHAR, 13141, 13169, 13153, 13140, RCHAR, 7538, 13158, 13171, 13155, 13143, 13148, 13139, RCHAR, 7537, RCHAR, 13152, 13149, 7533, 13142, RCHAR, 13166, 7534, RCHAR, 13150, 13146, RCHAR, RCHAR, 13165, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8007, 13748, RCHAR, 13745, 13762, 13750, 13763, RCHAR, 8009, RCHAR, RCHAR, RCHAR, 13759, 13756, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13757, 13760, 13764, RCHAR, 13160, 13766, 14451, RCHAR, 8010, 13767, 13743, 13753, RCHAR, 13758, RCHAR, RCHAR, 8008, 8011, 13765, 13768, 13747, 13744, RCHAR, RCHAR, 13746, RCHAR, RCHAR, 13751, 13749, 8012, RCHAR, 13761, RCHAR, RCHAR, 13752, RCHAR, 13754, 13742, 14439, 14437, 8480, 8478, 14447, 14438, 14448, 14444, 14436, 14450, 14435, 14442, 8477, 8476, 8475, 14440, 14445, 8472, 8479, RCHAR, 14433, RCHAR, 14443, 14432, 14441, 8473, 14446, 14434, 8474, 14449, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15118, 8920, 8919, 8921, 15130, 15120, 15126, 15115, 15129, 15128, 15132, 15125, 8916, 15124, 8922, RCHAR, 15117, 8917, RCHAR, 15131, 8918, 15119, 15122, 15127, 15121, 15116, RCHAR, RCHAR, RCHAR, RCHAR, 15123, 15721, 9296, 15724, 15723, 15726, 15728, 18962, 9294, RCHAR, 15722, RCHAR, 15720, RCHAR, 15729, 15727, 15725, RCHAR, 15731, RCHAR, 15730, 9298, 9293, RCHAR, 9295, 9297, RCHAR, RCHAR, 15732, 16351, RCHAR, RCHAR, 16350, 16349, RCHAR, 16352, 16345, RCHAR, 16346, 16354, 16347, RCHAR, 9676, 16356, RCHAR, 16355, 16348, RCHAR, 16910, 9961, 16908, 16913, 16912, 16353, RCHAR, 9960, RCHAR, 16911, 16907, 16915, 16914, 9959, RCHAR, 16909, RCHAR, 9677, RCHAR, RCHAR, RCHAR, 10225, RCHAR, RCHAR, RCHAR, 17365, 17736, 17737, 17738, 10547, RCHAR, RCHAR, 10548, RCHAR, 18058, RCHAR, 18314, 18313, RCHAR, RCHAR, 18490, 18491, 18641, 18752, RCHAR, 5539, 5540, RCHAR, 5541, 5610, 5719, 11417, 5859, 5860, RCHAR, 6051, 6052, 6050, 6049, RCHAR, 6331, RCHAR, RCHAR, 11796, 6333, 6332, 11797, RCHAR, RCHAR, RCHAR, 6692, RCHAR, 7094, 12597, RCHAR, 13173, RCHAR, 7541, 8014, 13172, 8013, RCHAR, 8923, RCHAR, 15133, 9678, RCHAR, 9962, 16916, RCHAR, 10549, RCHAR, 10724, 10938, 11354, RCHAR, 5720, 11355, 5863, RCHAR, 5861, 5862, 5864, RCHAR, 6054, 6053, RCHAR, 11551, 6055, RCHAR, RCHAR, 11552, 11798, RCHAR, 11799, RCHAR, 6334, 6336, 6338, 6335, 6339, 6337, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6696, 6693, 6695, 6697, 6694, 12598, 12144, RCHAR, RCHAR, RCHAR, 12600, 12599, 7100, RCHAR, 7096, RCHAR, RCHAR, 7097, 7099, 7101, 7098, RCHAR, 7103, 7102, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7546, 13175, 13174, 7545, RCHAR, 7544, 7543, 7547, 7542, RCHAR, RCHAR, 13774, 13771, 8016, 13770, 13775, RCHAR, 8018, 13773, 8015, 8017, 13772, RCHAR, 14452, RCHAR, 14453, 14454, RCHAR, RCHAR, RCHAR, RCHAR, 8924, 8932, 15134, 8926, 8930, 15135, 8931, 8927, 8928, 8925, 8929, 9301, 13769, 9302, 9300, RCHAR, 9299, 16357, 9679, 16917, 16918, RCHAR, RCHAR, 10398, 10550, RCHAR, 5542, RCHAR, 5865, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6698, RCHAR, 12601, 7104, RCHAR, RCHAR, 7550, 7549, 7548, 8019, 8020, 13776, 8933, 9680, 5543, 11332, 5611, 11356, RCHAR, RCHAR, 11418, 5866, RCHAR, RCHAR, RCHAR, 6340, RCHAR, RCHAR, RCHAR, RCHAR, 14455, RCHAR, RCHAR, 5544, RCHAR, 5612, 11419, RCHAR, RCHAR, 11553, RCHAR, 11554, RCHAR, 6056, RCHAR, RCHAR, RCHAR, 13777, 8021, RCHAR, 14456, RCHAR, RCHAR, RCHAR, 9963, 5545, 5565, 5613, 11357, 5721, RCHAR, 6060, 6059, 6057, 6058, RCHAR, RCHAR, 11800, 6342, 6343, 11801, 6341, RCHAR, RCHAR, 6702, 12145, 6701, 6699, 6700, 7107, 7105, RCHAR, RCHAR, 12603, 7106, 12602, RCHAR, 7095, 13176, RCHAR, RCHAR, 7552, 7553, RCHAR, RCHAR, 7551, RCHAR, 8934, 15136, 9303, 9304, RCHAR, 15733, 9964, 17366, 17367, RCHAR, 10642, 18753, 11315, 5614, RCHAR, 5546, RCHAR, 11359, 11358, RCHAR, RCHAR, RCHAR, RCHAR, 5867, 11421, 11422, 11420, RCHAR, 11423, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11562, RCHAR, 11557, 11559, 11561, 11558, 6064, 11555, RCHAR, 11556, 6061, 6062, 11560, 11563, 6063, 11564, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11815, RCHAR, 11809, 11804, 6345, 11812, 11810, 11803, 11816, 11819, 11814, 11807, 6347, 11813, 6348, 11808, 11811, 11802, 11806, 11818, 6349, RCHAR, 6350, RCHAR, 11805, 11817, 6344, 6346, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12162, 12155, 12161, 12154, 12156, 12150, 12148, RCHAR, 12163, 12160, 12146, RCHAR, 6704, 12158, 12159, RCHAR, 12157, 12149, 12147, 6703, 12153, 12151, RCHAR, RCHAR, 12152, 12164, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7112, RCHAR, 7111, RCHAR, 12604, 7108, 12606, RCHAR, 7113, 12607, RCHAR, RCHAR, 7116, RCHAR, 7114, 12608, 12165, 12610, RCHAR, 7110, RCHAR, 7109, RCHAR, 12605, 12609, 7115, RCHAR, RCHAR, RCHAR, RCHAR, 7555, 7554, RCHAR, RCHAR, RCHAR, 13178, 13182, 13184, 7556, 13187, RCHAR, 7560, 13189, RCHAR, 7562, RCHAR, 7558, 7566, RCHAR, 7563, 13180, 7557, RCHAR, 13179, 13177, 13191, 13181, RCHAR, 7559, 13190, 7564, 13186, 13185, 7565, 13183, 7561, RCHAR, RCHAR, RCHAR, RCHAR, 13192, RCHAR, 13188, 13792, 13799, 13788, 8024, 13784, 13800, 13778, 13797, 13795, 13789, RCHAR, 13798, 13791, RCHAR, 13783, 13801, 13781, 13794, 13779, RCHAR, 13802, RCHAR, 8025, RCHAR, 13796, 14459, 13782, 8022, RCHAR, 13786, RCHAR, 8023, 13785, 13790, RCHAR, RCHAR, 13787, RCHAR, RCHAR, RCHAR, 13793, RCHAR, RCHAR, RCHAR, RCHAR, 14463, RCHAR, RCHAR, RCHAR, 14466, 14458, RCHAR, 14460, RCHAR, 14465, 14464, 8481, RCHAR, 13780, 14462, RCHAR, RCHAR, 8482, RCHAR, 14457, 14461, RCHAR, RCHAR, RCHAR, RCHAR, 15143, RCHAR, 15150, 15141, RCHAR, 15148, 15139, 15147, 15151, 15138, 15142, 15137, RCHAR, 8935, RCHAR, 15140, 8936, 15146, 15145, 15144, RCHAR, RCHAR, 15149, RCHAR, RCHAR, RCHAR, RCHAR, 15737, 15739, 9306, 15740, RCHAR, 15735, RCHAR, 15734, 15744, RCHAR, 15742, 9305, 15745, 15736, 15741, 15743, 15738, RCHAR, RCHAR, RCHAR, RCHAR, 16361, 16366, 16360, 16365, RCHAR, 16358, 16368, 16364, 16369, 16363, 16359, 16367, RCHAR, 16370, 16362, RCHAR, 16919, 9968, RCHAR, 9966, RCHAR, 9965, 9967, RCHAR, RCHAR, 17368, RCHAR, 17634, 17739, RCHAR, RCHAR, 18059, 18060, RCHAR, 10551, RCHAR, 18315, RCHAR, 10643, RCHAR, 18316, RCHAR, 18493, 10726, RCHAR, 10725, 18492, 10779, RCHAR, 18642, RCHAR, RCHAR, 10939, RCHAR, 5547, 5868, 11424, 11565, 6206, 7567, RCHAR, RCHAR, 5548, 5724, 5723, 5722, RCHAR, RCHAR, 6065, RCHAR, RCHAR, 7117, RCHAR, 14467, 5549, 5550, 5551, 5615, RCHAR, RCHAR, 6705, RCHAR, 12166, RCHAR, RCHAR, RCHAR, 8026, 5552, 11333, RCHAR, RCHAR, 5725, 5726, 11360, RCHAR, 5869, RCHAR, RCHAR, RCHAR, 11566, RCHAR, 6066, RCHAR, 11567, RCHAR, RCHAR, 6356, RCHAR, RCHAR, 11821, 6354, 6353, 11820, 6351, 11822, 6352, 6355, RCHAR, 6706, RCHAR, 6708, 12170, 12167, 12168, 12169, 12171, 6707, RCHAR, RCHAR, 12612, 12611, RCHAR, 7119, RCHAR, 7118, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7570, 13194, RCHAR, 7569, 7571, 7568, RCHAR, RCHAR, RCHAR, RCHAR, 8028, 13193, RCHAR, 8029, 13804, RCHAR, 8030, 13803, 8027, RCHAR, RCHAR, RCHAR, RCHAR, 14470, 14472, 8483, 14471, 14469, 14468, RCHAR, RCHAR, RCHAR, 15154, 8941, 8939, RCHAR, 8940, 15152, 15153, RCHAR, 8937, 15749, 15747, RCHAR, 9308, 15748, 9309, 9307, 8938, RCHAR, RCHAR, 16373, 16371, 16372, 15746, 16921, 9969, 16920, 17369, 17370, 16374, 17740, RCHAR, 5553, 5727, 5871, 11425, 5870, RCHAR, 6357, 8484, RCHAR, 5616, 5728, 6709, 8031, 10941, 11361, RCHAR, 11362, RCHAR, 11426, RCHAR, RCHAR, 6068, 11571, 11569, 6069, 11568, 11570, 11572, RCHAR, 6067, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6361, 6362, 6359, RCHAR, RCHAR, 6358, 12175, 6360, RCHAR, RCHAR, RCHAR, 6710, RCHAR, 12174, 12176, 12173, 12177, 6711, 7122, 12613, RCHAR, 12615, 7120, 12616, 7121, 12614, RCHAR, 12172, 13195, 13198, 13199, 13196, 7575, 7574, 7572, 7573, 13197, RCHAR, RCHAR, RCHAR, RCHAR, 7576, RCHAR, RCHAR, 8033, 8034, RCHAR, 8035, 14473, 14475, 14477, 8486, 8485, 8032, 14476, 14474, RCHAR, 15158, RCHAR, RCHAR, 15156, 15162, 8942, 15163, 15160, 8943, 15157, 15155, 15161, 9311, 15751, 15159, 9313, 15752, 9312, 9315, 15753, 9310, 9314, RCHAR, 16379, 16377, 16376, 16378, 16375, RCHAR, RCHAR, 10400, RCHAR, 18061, 18062, RCHAR, 18317, 18494, 10854, 10942, RCHAR, 6363, 6070, RCHAR, RCHAR, 6712, RCHAR, RCHAR, RCHAR, 5554, 5617, RCHAR, 5729, 11427, RCHAR, 6071, 11573, RCHAR, 12178, 6713, RCHAR, 8944, 5555, RCHAR, RCHAR, RCHAR, 5872, RCHAR, RCHAR, 8487, 5556, 5618, 5619, RCHAR, 5731, 5730, RCHAR, 11428, 5873, RCHAR, 11574, RCHAR, 6072, RCHAR, RCHAR, 11824, 11825, 11826, RCHAR, 6364, 6365, 11823, 6366, RCHAR, RCHAR, RCHAR, 6714, 12179, RCHAR, 12618, 7123, RCHAR, 12617, RCHAR, 7577, 13200, 7578, 13201, RCHAR, RCHAR, RCHAR, 8036, RCHAR, RCHAR, RCHAR, 14478, RCHAR, RCHAR, 15165, 15164, RCHAR, 8945, RCHAR, 9316, 15754, 9681, 16380, 9970, RCHAR, 10727, 18644, 10943, RCHAR, RCHAR, RCHAR, 11827, RCHAR, 12180, 7579, 13805, 8488, RCHAR, RCHAR, RCHAR, 10226, RCHAR, RCHAR, RCHAR, 10944, 6074, RCHAR, 6073, 6715, RCHAR, 12619, RCHAR, 7581, 7853, 7582, 7580, 8037, RCHAR, 15166, 8946, 9317, RCHAR, 11316, 11429, RCHAR, 11576, 6075, 11575, 6076, RCHAR, RCHAR, 6370, 11830, 11829, 6369, 6367, 6368, 11828, RCHAR, RCHAR, 6717, 12181, 6720, 6716, 6722, 6718, 6719, 6721, RCHAR, RCHAR, RCHAR, 7126, 7125, 7124, RCHAR, RCHAR, RCHAR, 13203, 7583, 7586, 7584, RCHAR, 13202, 7589, RCHAR, 7585, 13204, 7588, 7587, RCHAR, RCHAR, RCHAR, 13807, 13806, RCHAR, 8040, 8038, 8039, 13808, 8489, 14480, 8490, 14479, RCHAR, RCHAR, 15755, RCHAR, RCHAR, 9319, 15167, 9318, RCHAR, 8947, RCHAR, 16923, 16381, 9971, 16922, 17741, 18063, 18064, RCHAR, 5620, RCHAR, 5732, RCHAR, RCHAR, RCHAR, 11363, RCHAR, RCHAR, 6078, 6080, RCHAR, 11432, 11579, 11578, 11577, RCHAR, 11431, 11430, 5875, 6079, 6077, 5874, RCHAR, RCHAR, RCHAR, 6371, 11831, RCHAR, 6372, 11584, RCHAR, 11586, 11585, 11832, RCHAR, RCHAR, 11581, RCHAR, 6084, 6082, RCHAR, 11580, 11582, 11588, RCHAR, 6081, RCHAR, 11583, 11592, 6374, RCHAR, 11589, 6083, RCHAR, 11587, 11590, RCHAR, 6373, RCHAR, 6375, 11591, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11852, 11839, 11837, 11851, 11846, 6727, 6376, 11847, 11850, 6723, 11849, 6377, 6382, 6380, 11840, RCHAR, 11835, 11842, 6387, 11853, 6724, 11843, RCHAR, 6725, 6383, 11845, RCHAR, 12196, 6726, 11834, 6384, 6728, 6385, 6381, 6386, 11844, 11833, 11848, 6378, RCHAR, RCHAR, 11836, 11841, 11838, 6379, RCHAR, 12182, RCHAR, 12183, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12193, 12623, 12194, 6734, 12197, 12187, 6733, 12189, RCHAR, 12190, RCHAR, RCHAR, 12192, 6729, RCHAR, RCHAR, 7130, RCHAR, 18960, 12188, 12184, 7131, RCHAR, RCHAR, 12198, 7127, 12621, 12191, RCHAR, 12620, 12186, 12195, RCHAR, RCHAR, 6732, 7128, 6738, 7129, 12199, 12622, 6731, 7133, 6737, 6736, 6735, 7132, 12200, 7134, 6730, RCHAR, 12185, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7590, 12626, 12628, RCHAR, 12630, 7135, 7141, 13207, 12634, 12625, 7592, 13205, RCHAR, 7140, 7138, 12636, RCHAR, 13206, RCHAR, 12627, RCHAR, 7139, 12631, 7142, 12633, RCHAR, RCHAR, 7137, 12632, 12635, 12629, RCHAR, 7136, 7593, RCHAR, 12624, 7591, RCHAR, RCHAR, RCHAR, RCHAR, 7594, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13209, 13218, 8043, RCHAR, 7596, 7601, 8044, 13220, 7608, 13810, 13210, 7600, 7603, 7598, 13208, 13222, 13225, 13825, RCHAR, 13223, 13814, 7599, 7606, 7610, 13217, 13809, 13221, 7595, 13811, 13224, 13813, 13213, RCHAR, 8041, RCHAR, 13211, 13212, 7605, RCHAR, RCHAR, 7604, 13215, 7609, 13219, 7602, 13216, RCHAR, 7607, 8045, 8042, 13812, RCHAR, 13214, RCHAR, 7597, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8050, 8054, 13816, 8495, 8052, 13820, 8056, 14481, 13822, 8497, 8048, 8051, 13823, RCHAR, 13824, 13830, 8058, 8498, RCHAR, 13826, 13831, 13819, 8508, RCHAR, 8499, 8057, 13817, 13832, RCHAR, 8507, 8055, 8492, 13829, RCHAR, 8059, 13821, 13815, 8049, 13818, RCHAR, 13827, RCHAR, 8491, 8496, 8046, 13828, RCHAR, 8494, RCHAR, RCHAR, RCHAR, 8047, RCHAR, RCHAR, RCHAR, 8506, 15169, 14492, RCHAR, 14484, 15168, RCHAR, 14488, 14490, RCHAR, RCHAR, 14487, RCHAR, 8505, RCHAR, 14486, 8509, RCHAR, RCHAR, RCHAR, 15184, RCHAR, RCHAR, 8504, 8949, 14493, 15170, RCHAR, RCHAR, 8502, 14485, 14489, 8948, 8493, 14482, 14483, 8950, 8501, 8503, 8500, 14491, RCHAR, RCHAR, 15174, 15175, 15180, 9324, 15187, RCHAR, 8956, RCHAR, 8955, 15182, RCHAR, 9323, 15171, 8954, RCHAR, 15186, 8952, 8953, RCHAR, 15183, 15772, 9321, 8053, RCHAR, 15185, 9328, 15177, RCHAR, 9322, RCHAR, 9327, 15172, 15176, 15173, 15179, 8957, 9320, 8951, RCHAR, 15758, 15181, RCHAR, 9326, RCHAR, 9329, RCHAR, 15178, RCHAR, 9325, 15757, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15762, 9685, 15756, 16393, 15771, 9333, RCHAR, 9331, 9683, 15768, 15764, 9337, RCHAR, 16384, RCHAR, RCHAR, RCHAR, 9335, 15763, RCHAR, 16382, RCHAR, 15767, RCHAR, 15770, 15761, RCHAR, 9336, RCHAR, RCHAR, 9330, 16383, 9684, 15769, 9332, 9334, 15766, 9338, 15765, 15760, 15759, 9682, 15773, 16386, 16925, 9687, RCHAR, 16392, RCHAR, 16390, RCHAR, 16926, RCHAR, 9688, 16391, RCHAR, 16388, 9973, 16924, RCHAR, 16385, 16387, 9974, 9690, 9972, 9689, 9976, 16389, 9686, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17379, RCHAR, 17371, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16932, 17372, 16928, RCHAR, RCHAR, 10227, 16930, 16929, 9975, 16927, 16931, 17380, 17376, 17378, RCHAR, 17373, 17374, RCHAR, 17377, 17375, 10401, RCHAR, RCHAR, 10404, 10403, 10402, 10552, 18065, 10553, 17742, 10644, 18318, 10645, 10728, 10780, 18645, RCHAR, 18646, 18647, RCHAR, RCHAR, 18928, 5621, 11364, 5733, RCHAR, 5877, 5878, 5876, RCHAR, 5879, 6086, 6085, RCHAR, 11854, 6389, 6388, RCHAR, RCHAR, 12637, 7611, 7612, RCHAR, RCHAR, RCHAR, 8060, 14494, 8510, 8511, 14496, 14498, 14497, RCHAR, 15189, RCHAR, 15188, 8958, 15190, RCHAR, 15774, 9339, RCHAR, 9691, RCHAR, 9977, 10228, 9978, RCHAR, 5622, RCHAR, RCHAR, RCHAR, 11593, RCHAR, RCHAR, 11855, 6391, 6390, 6392, 6739, 12201, 12202, RCHAR, RCHAR, 12638, 7143, 7613, 8061, 13833, 5623, RCHAR, 5557, 5624, RCHAR, 11365, 5737, 5736, 5734, 5735, RCHAR, RCHAR, RCHAR, 5882, 11439, 11441, 5881, 11433, RCHAR, 11434, RCHAR, 11440, 11436, 11438, 5880, 11435, 11442, 11437, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6093, 6102, 6100, 11603, 11600, 11608, 6098, 11609, RCHAR, 6091, 11606, RCHAR, 6097, 11602, 11601, 6095, 11607, 6096, 6393, 6090, 11604, RCHAR, 11594, 6087, RCHAR, 6106, 11599, 11605, 6092, 6094, RCHAR, 11595, RCHAR, 11596, 11597, RCHAR, 6105, 6099, 6104, 11598, 6103, 6089, 6088, 6101, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6407, 11867, 11860, 6402, 6421, 11856, 11863, 11865, 11868, 6416, RCHAR, 11864, 11857, 6414, 11861, RCHAR, 11869, 6399, RCHAR, 11866, 6409, 6408, 11859, 6397, RCHAR, RCHAR, 6398, RCHAR, 6396, RCHAR, 6420, 6412, 6406, 6394, 11862, 6405, 6395, 6413, 6422, 12203, 6410, 11858, 6400, 6403, 6404, RCHAR, 6418, 6419, 6417, 6411, 6415, 6401, 6740, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12209, 6752, 6744, 6746, 6751, 12221, 6749, 12639, 7144, 6754, 12206, 12214, 6750, 12213, 12210, 12218, 12220, 6743, 6747, 6753, 7146, 12215, 6745, 6756, 12208, RCHAR, RCHAR, RCHAR, 6748, 7145, 6742, RCHAR, 12205, 12212, 12204, 12207, 12211, 12640, 6755, RCHAR, 12216, 12217, 12219, 6741, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7160, 12652, 7158, 7159, 12642, 12658, RCHAR, 7149, RCHAR, RCHAR, 13226, 12660, 12654, RCHAR, 12645, RCHAR, 12663, 12648, 7155, 13249, 12651, 7157, 7148, RCHAR, 12665, 12653, 7151, 12646, 12643, 12644, 7152, 12659, 12666, 7154, 12650, 12649, 7162, 7161, 7147, 7153, 7156, 12662, RCHAR, RCHAR, 12656, 7150, 12641, 12664, 12655, 12657, 12661, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13227, RCHAR, 7621, 7641, 7640, RCHAR, 7629, RCHAR, 13245, 13241, 13238, 13256, 7624, 7616, RCHAR, RCHAR, 13243, 8077, 7620, 13251, RCHAR, 7642, 7639, 13247, 13230, RCHAR, RCHAR, 7638, 13253, 13229, 7627, 7631, 13252, RCHAR, 13239, 7632, 7626, 13228, RCHAR, 8063, 13255, 13237, 7637, 13240, 13254, 7636, RCHAR, 13834, RCHAR, 7617, 13235, 7622, 7633, RCHAR, 7628, 13244, 13234, 13232, 13250, 7614, 7634, 7618, 8062, 13248, 7619, RCHAR, 7615, 7630, 7625, 7623, 13236, 7635, 13233, 13246, 13242, 13836, 13835, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13231, 13852, RCHAR, 8065, RCHAR, 13858, 13841, 13855, 14499, 8068, 13859, 13862, 8067, 13844, 13861, 13860, 8069, 13837, 8064, 8072, RCHAR, 8070, 13857, RCHAR, 13847, 8074, 13864, 13856, 13865, 8082, 8080, 13854, 13853, RCHAR, 13851, 13845, 8073, RCHAR, 8071, 12647, 13838, RCHAR, 14529, 13839, 8066, 8079, 14501, RCHAR, 8075, 8076, 13840, 13863, 14500, 13848, 13843, 8078, 13849, 13846, RCHAR, RCHAR, 8083, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8526, RCHAR, RCHAR, 14504, 14523, 14528, 14516, 8522, 14533, 8519, 14502, RCHAR, 14503, 8512, 8521, 14510, 8524, 8525, 14511, RCHAR, 14524, 14530, 8520, RCHAR, 8514, 14509, 14505, 14532, 14514, 14515, 14506, 14526, 14517, 14527, 14519, RCHAR, 8515, 15191, 8518, 8516, 14531, 14522, 14518, RCHAR, RCHAR, 14507, 8968, 14521, 8523, 14513, RCHAR, 14512, RCHAR, RCHAR, RCHAR, 8517, 8513, 15212, 14525, 14520, RCHAR, 14508, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15207, RCHAR, 15192, 15203, RCHAR, 15210, 8966, 8081, 15208, 8961, RCHAR, RCHAR, RCHAR, 8960, 15215, RCHAR, 15193, 15206, 15194, 15205, 8964, 15209, 13850, RCHAR, RCHAR, RCHAR, 15216, 15201, 8967, 15788, 9340, RCHAR, 15214, 15213, 8969, 15775, 9341, 15776, RCHAR, 15197, 15198, 15195, 15200, 15196, 15217, 8963, 9342, 8965, 8970, RCHAR, 15199, RCHAR, 15211, RCHAR, RCHAR, 15204, RCHAR, RCHAR, 15779, RCHAR, 8959, 9345, 16400, 15784, 15783, 15785, RCHAR, RCHAR, 15782, 9346, RCHAR, 9352, 9349, RCHAR, 9350, 15777, 15780, 15790, 9358, 9356, RCHAR, 15781, 13842, 9343, 15787, 15778, RCHAR, 9359, 15786, 8962, 9348, 15202, RCHAR, RCHAR, 9351, RCHAR, 9355, 9357, 9354, 9353, RCHAR, 9347, 15789, 9344, 9360, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9695, 9696, 16399, 9705, 9702, RCHAR, 9693, 9700, 16401, 9698, 9692, RCHAR, 9699, RCHAR, 16398, 9980, 9694, RCHAR, 9701, 9979, 16397, 16396, RCHAR, 9703, RCHAR, 9704, RCHAR, 16395, 16394, 9981, 16404, 9697, 16402, RCHAR, RCHAR, RCHAR, RCHAR, 9982, RCHAR, 9987, 16935, 16937, RCHAR, 9984, RCHAR, 16938, 16934, RCHAR, 16936, 9985, 9988, RCHAR, 16933, 9983, 9986, 10230, 16403, 10229, RCHAR, RCHAR, 10235, 17384, RCHAR, 10233, 10234, 17387, 17383, 10231, 17381, 10405, 17385, RCHAR, 17386, 17382, RCHAR, 10232, 17743, RCHAR, 17746, RCHAR, RCHAR, 17747, 17745, 17748, 10406, 17744, RCHAR, RCHAR, 18069, 10555, 18068, 18067, 18066, 10554, 10556, RCHAR, 18319, 10647, 10646, RCHAR, RCHAR, 18496, 18495, 18498, 10781, 10729, 18649, 18497, RCHAR, RCHAR, 18648, 10783, 10782, 10821, 18754, 18824, 5625, RCHAR, RCHAR, 13866, 16405, 10945, RCHAR, 5883, 11610, 6109, 6107, RCHAR, 6108, RCHAR, 11870, 6423, 6757, RCHAR, 12222, RCHAR, 12223, RCHAR, 6758, 12668, RCHAR, 7163, 7164, 12667, RCHAR, RCHAR, RCHAR, RCHAR, 7649, RCHAR, 7645, RCHAR, 13257, 7652, 7651, 7644, 7647, 7650, 7646, RCHAR, RCHAR, 13870, 7643, 8084, RCHAR, RCHAR, RCHAR, 8086, 8087, 13869, 13872, 8085, 13867, 13871, RCHAR, 13868, RCHAR, 8527, RCHAR, RCHAR, 14534, RCHAR, RCHAR, 8971, 15218, 9706, 9361, 15791, 9362, 9363, 15793, 15792, 15794, 16407, RCHAR, RCHAR, 16406, 16940, 16939, 9989, 9990, 17749, RCHAR, RCHAR, 5626, RCHAR, RCHAR, RCHAR, RCHAR, 13873, RCHAR, RCHAR, RCHAR, 8089, 8088, 14535, RCHAR, 17388, 10648, 18650, 5627, RCHAR, 7165, RCHAR, 7654, 7653, 13874, 13875, 8528, 15219, 8972, 16408, RCHAR, 5628, 5738, RCHAR, 6424, 11871, RCHAR, 12224, 6759, 7655, RCHAR, 13876, 8090, 8529, RCHAR, 15795, 15796, RCHAR, RCHAR, 16941, 10236, 18825, 5629, RCHAR, 11872, 6425, 6760, RCHAR, 12225, RCHAR, 7166, 12672, 12670, 12671, 7167, 12669, RCHAR, RCHAR, RCHAR, RCHAR, 7657, 7658, 13258, 7659, 7656, 13877, RCHAR, 13878, 14536, RCHAR, RCHAR, 8974, 8973, RCHAR, RCHAR, 16942, 17389, RCHAR, 17751, 17750, 18070, 10946, 11334, 6761, RCHAR, RCHAR, 5630, 5739, RCHAR, 5885, 5884, RCHAR, RCHAR, 5886, 5887, 11444, 11443, 11611, 6110, 11614, 11613, 11612, 11615, RCHAR, RCHAR, RCHAR, RCHAR, 6426, 11878, 11874, 11883, RCHAR, RCHAR, 6433, RCHAR, 6431, 11879, 11875, 11882, 6430, 6437, 11877, 11873, 6436, 11880, 6429, 11881, 6432, 6434, 11885, 11884, 11876, 6428, 6427, 6435, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12230, 12236, RCHAR, 6767, 6764, 12227, 12232, RCHAR, 6770, 6762, 12231, 6765, 6768, RCHAR, RCHAR, 12234, RCHAR, 6763, 12239, 6766, RCHAR, 6769, 12228, 12233, 12237, 12229, 12226, RCHAR, RCHAR, 12238, 12235, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7175, 7168, 7171, RCHAR, 7174, RCHAR, 12675, RCHAR, 7169, 12673, RCHAR, 7173, RCHAR, RCHAR, 7170, RCHAR, 12676, 7172, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13262, 7661, 13261, 13263, 7660, 7665, 12674, RCHAR, 13260, 13264, RCHAR, 7662, 13259, 7664, RCHAR, 7663, RCHAR, 13885, RCHAR, 13880, RCHAR, 8091, 8095, 8092, 13883, 13886, RCHAR, 8093, RCHAR, 8094, 8099, 14545, 13884, 8097, 13881, 13879, RCHAR, 8098, RCHAR, 13882, RCHAR, RCHAR, RCHAR, 8535, RCHAR, 14537, 8532, 8533, 8531, 14542, 14541, 14538, 8537, RCHAR, RCHAR, 14540, 8096, RCHAR, RCHAR, 14544, 14539, 8534, 8530, 8536, 14543, RCHAR, RCHAR, RCHAR, 8977, RCHAR, 15222, 15221, 15220, 8975, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8976, 15799, 15802, 9365, RCHAR, RCHAR, 9364, 15803, 15798, 9367, 15800, RCHAR, 9366, 15797, RCHAR, 15801, 9712, 9709, 16417, 16416, RCHAR, 16415, 16410, RCHAR, 16411, RCHAR, RCHAR, RCHAR, 9710, RCHAR, 9707, 9711, 16409, 9708, 16412, 16413, 16418, RCHAR, RCHAR, 16414, RCHAR, RCHAR, 16943, RCHAR, RCHAR, RCHAR, 9992, RCHAR, 17392, 9991, 17390, 17391, 10237, 10408, 17752, RCHAR, 10407, RCHAR, RCHAR, 18072, 18073, RCHAR, 10557, RCHAR, 18071, 10649, RCHAR, 18651, 10784, 18755, 18756, RCHAR, 5631, RCHAR, 5888, 5889, 6111, RCHAR, 11886, 6771, 7176, 7666, RCHAR, RCHAR, 7491, RCHAR, 8100, 8101, 7956, 13887, RCHAR, 8538, 15224, 15223, RCHAR, RCHAR, 5632, 5890, 11887, 6439, RCHAR, 6438, RCHAR, 12240, 12241, RCHAR, 12677, 12678, 7177, 7178, RCHAR, 7179, 13265, RCHAR, RCHAR, 7668, RCHAR, 8103, RCHAR, 8102, 14546, 14816, 15225, 16419, RCHAR, RCHAR, 10238, 10558, 5633, RCHAR, 5742, 5743, 5741, 5744, 5740, RCHAR, RCHAR, 5893, RCHAR, 11452, 5892, 5894, RCHAR, RCHAR, 11447, 11446, 11449, 11448, 11451, 5891, 11445, 11450, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11616, 6121, 11617, 11621, 6120, RCHAR, 11625, 11620, 11623, 6113, 6114, 6115, 6116, RCHAR, 6123, RCHAR, 11619, 6118, 6124, RCHAR, 11618, 11624, RCHAR, 6117, 11622, 6119, 6112, 6122, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6460, RCHAR, 11889, 6440, RCHAR, 6450, 6451, 6443, 6461, 6445, 11897, 6456, 11892, 6446, 11907, 11908, 11900, 11893, 6459, 11905, 6454, 6452, RCHAR, 11906, RCHAR, 11904, 11896, 11888, 11895, 6447, RCHAR, 6453, RCHAR, 6441, 11899, 11898, 11890, RCHAR, 6455, 11902, 11891, 6458, 11909, 6442, RCHAR, 6449, 11894, 11903, 6457, RCHAR, 6444, 6448, RCHAR, 11901, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12273, 6779, 6792, RCHAR, 12268, 12258, 6785, 12256, 6778, 12251, 6788, 12264, 12245, 12247, RCHAR, RCHAR, RCHAR, RCHAR, 12250, 12242, 12263, 12279, 6783, 12252, 12270, RCHAR, 12244, 12277, 12278, 12281, 12272, 12257, 12265, 6789, 6776, 6784, 6796, 6773, 6775, RCHAR, RCHAR, RCHAR, 12249, 6793, 6786, 12275, 12246, 6795, 6790, 12255, RCHAR, RCHAR, 6794, 12262, 12254, 6787, 12274, 12266, RCHAR, 6781, 12280, 12253, 6777, 12271, 12261, 6782, 12267, 6774, 12243, 6791, 7194, 6780, 12260, 12259, 12248, RCHAR, 12276, RCHAR, 12269, RCHAR, RCHAR, 6772, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12698, 7201, 12699, RCHAR, 12687, 7190, 7202, RCHAR, 12680, RCHAR, 12689, 12697, RCHAR, 12679, 12706, 7180, RCHAR, RCHAR, RCHAR, 12705, 12700, RCHAR, 12701, 7188, 7199, 12691, RCHAR, 12692, 12702, 12693, RCHAR, 12688, 12682, 12683, 12696, 12690, RCHAR, RCHAR, 7181, 7185, 12704, 12684, 7197, 7193, RCHAR, RCHAR, 7196, 7203, 7186, 7198, 12695, 7200, 7183, RCHAR, 7182, 12681, RCHAR, 12685, 7191, 12703, 12694, 12686, 7195, 7192, RCHAR, 7184, 7187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13286, RCHAR, 13270, 13271, 13275, RCHAR, 13290, 13287, RCHAR, 13280, 13279, 7675, 13283, 13298, 13266, RCHAR, 13299, 13285, 13303, 13291, 7674, 13289, 7669, 7690, 7680, RCHAR, 7684, 7683, 13267, RCHAR, 13296, 13302, 13294, 13301, RCHAR, RCHAR, 13282, 13268, 13300, 13284, 7672, 7685, RCHAR, 13293, 7678, RCHAR, RCHAR, RCHAR, 13292, 13269, 7686, RCHAR, 7688, 13295, 7689, 7671, 13276, 13297, RCHAR, RCHAR, 7677, 7687, 13278, 13288, 13273, 13277, 7682, 13272, 7670, 7679, 7676, 13281, 7189, 13910, 7673, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7681, RCHAR, 13913, 13935, 13924, 8123, RCHAR, 8118, 13907, 8119, 13923, RCHAR, 13916, 13929, 8115, 13889, 13931, 8105, 13897, 8108, 8107, RCHAR, 8124, RCHAR, 13891, 13925, 13926, 8110, 8106, 13905, RCHAR, 8117, 13900, RCHAR, 13927, 8113, 13919, 13932, 13894, 13899, 13893, RCHAR, 8112, 13912, 14568, 13895, 8116, 13904, 13928, 8111, 13901, 13898, 13915, 8114, 8104, 8126, 13918, 13917, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13890, 8109, 13930, 13906, 13908, RCHAR, 13921, 13920, 13888, 8120, 8122, 13896, 13903, 13911, 8121, 13902, 13914, 13933, RCHAR, 13922, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13934, RCHAR, RCHAR, RCHAR, RCHAR, 13892, RCHAR, RCHAR, RCHAR, RCHAR, 14588, 8546, RCHAR, 14586, 14565, 14570, 14563, RCHAR, 14582, 14549, 14556, RCHAR, 14580, 14590, 14566, RCHAR, 14553, 14572, 14577, 14557, RCHAR, 14574, 14554, RCHAR, RCHAR, 14561, 14562, 8548, 14581, 14579, RCHAR, 14550, 14584, RCHAR, 14585, 14587, 8552, 8544, RCHAR, 13274, 14558, 14576, 14559, 8541, 8557, 14583, 8555, 8551, 14548, 8543, RCHAR, 14551, 8556, RCHAR, 14567, 14547, RCHAR, 8549, 14571, 14555, 8550, 14564, 8540, 8125, 14573, 13909, 14552, RCHAR, RCHAR, 14578, 8545, 14575, 8542, 14569, 8553, 14560, 14589, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8547, 14701, RCHAR, RCHAR, 8554, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15239, 15237, RCHAR, 15259, 15235, RCHAR, 15253, 8539, 8980, 15231, 15258, RCHAR, 15236, 15250, 8985, 8978, RCHAR, 15256, RCHAR, 15229, 15255, RCHAR, 8996, 15246, 15262, 8994, 15238, 8979, 15240, 15254, 8988, 15233, 8992, 8982, 15242, 15232, 15226, RCHAR, 15252, 8989, 15261, 15227, 8986, RCHAR, 15248, RCHAR, 8987, 15234, 15245, 15241, 15243, RCHAR, 8981, 15260, 8995, 15244, RCHAR, 15263, RCHAR, RCHAR, 15228, 15249, 8984, 8993, 8991, 15230, 15251, 8990, RCHAR, RCHAR, 8983, 15247, RCHAR, RCHAR, RCHAR, RCHAR, 15257, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15815, RCHAR, 15811, 15807, 15827, 15824, 9370, RCHAR, RCHAR, 15831, 15814, 9381, 15821, RCHAR, RCHAR, 15810, 15820, 9378, 15840, RCHAR, 15837, 15823, 15808, RCHAR, RCHAR, 15828, 15830, 9374, 15818, 15813, 15804, 9371, 9379, RCHAR, 15833, 9380, 15805, 15839, 15826, 15832, 9377, RCHAR, RCHAR, 15829, RCHAR, 15836, RCHAR, 9382, RCHAR, 9376, 15822, 15809, 15841, 15806, 15834, 9373, RCHAR, 15816, RCHAR, 15817, 9372, 9369, 15812, 9375, RCHAR, 9368, RCHAR, 15835, 15838, 15819, 16432, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16424, RCHAR, 16420, 9725, RCHAR, RCHAR, 9714, 9719, 9715, 16434, 16445, 9713, 16426, 16435, 15825, 16436, RCHAR, RCHAR, 9720, RCHAR, 16451, 9724, 9727, 16422, RCHAR, 9723, RCHAR, 16449, 16450, 16440, 16439, 16431, RCHAR, RCHAR, 16441, 16448, 16447, RCHAR, 9718, 9716, 16433, 16430, RCHAR, 16427, 16446, 9726, 16444, 9722, 9721, RCHAR, 16438, RCHAR, 16421, 16423, 16425, 16443, 16437, 9717, RCHAR, 16428, RCHAR, 16442, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16429, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10000, 16961, 9993, 16946, RCHAR, 16957, 9995, 16964, RCHAR, 16953, RCHAR, 16948, RCHAR, RCHAR, 16965, 16944, 16955, RCHAR, 10002, 16960, 16966, 16954, 9994, 16956, 16945, 10001, RCHAR, RCHAR, 16963, 16950, 9997, RCHAR, 16952, 16949, 10003, 16951, 9996, 9999, 16959, 16947, 16962, RCHAR, 16958, RCHAR, RCHAR, RCHAR, 10240, 17403, 10245, 10246, RCHAR, RCHAR, RCHAR, 10239, 17402, RCHAR, 17399, 17400, 10243, 17394, 17398, 10242, RCHAR, 17395, RCHAR, RCHAR, RCHAR, RCHAR, 10244, 10241, RCHAR, 17393, 17397, 17401, RCHAR, RCHAR, RCHAR, 17758, 17755, 17764, RCHAR, 17763, 17761, 17756, RCHAR, 10412, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17757, 10411, 9998, 17760, 10410, 17765, 17759, 17754, 17396, RCHAR, RCHAR, RCHAR, 10409, RCHAR, 17753, 18077, RCHAR, 18076, 17762, 10559, RCHAR, 18080, 18081, 18075, 18079, RCHAR, 18074, RCHAR, RCHAR, RCHAR, RCHAR, 18323, 18078, 10652, 10650, 18321, RCHAR, RCHAR, RCHAR, 18324, RCHAR, 18320, 18322, 10651, RCHAR, RCHAR, RCHAR, 18500, 18501, 10730, 18499, RCHAR, RCHAR, RCHAR, 18654, 10785, 18652, 18653, 18757, RCHAR, RCHAR, 10855, 18828, 18826, 18827, 18829, RCHAR, RCHAR, RCHAR, 18929, RCHAR, 5634, 5895, RCHAR, 6462, RCHAR, 11910, RCHAR, RCHAR, 12282, RCHAR, RCHAR, RCHAR, 12707, 12709, RCHAR, 12708, RCHAR, 12710, 7691, 13305, 12711, RCHAR, 13304, 13306, 13307, 13936, 8128, 13937, 13939, 8129, 8127, 13938, RCHAR, 14596, 14594, 14593, RCHAR, 14592, 14591, 8558, 14595, 8997, 15264, 15266, 8998, 15265, 9384, RCHAR, 9383, 15842, RCHAR, RCHAR, 16453, 16452, 16454, RCHAR, RCHAR, 9728, RCHAR, 16967, 10004, RCHAR, 17404, 10247, 17766, 10731, 5635, 5745, 5896, 6125, 6463, 6464, RCHAR, RCHAR, 6797, RCHAR, RCHAR, 12712, RCHAR, RCHAR, RCHAR, RCHAR, 8559, RCHAR, RCHAR, RCHAR, 15968, 9729, 10248, 5636, RCHAR, 5897, RCHAR, RCHAR, 11912, 6465, 11911, RCHAR, 12283, 6798, 12284, RCHAR, 6799, RCHAR, 12714, 7205, 7204, RCHAR, 13312, 13310, 13311, 13309, RCHAR, 13308, RCHAR, RCHAR, 13940, 13943, 8131, 13941, 8130, 13942, RCHAR, 14597, RCHAR, RCHAR, 15267, 15268, 15269, RCHAR, 15845, 15844, 9385, 15843, 15846, 16455, RCHAR, RCHAR, 16456, 16457, RCHAR, 16968, 10005, 10249, 17767, RCHAR, 10653, 11335, RCHAR, 6800, 12285, 7206, RCHAR, RCHAR, 7692, RCHAR, 8132, 13944, RCHAR, 8561, 8560, RCHAR, RCHAR, 15270, 15271, 9386, 9387, 16459, 16458, 17405, 18655, 5637, 11336, 5746, RCHAR, 6126, 11626, RCHAR, 6801, 8562, 5638, RCHAR, 12286, 6802, 12287, RCHAR, 10006, 5639, RCHAR, RCHAR, 11913, RCHAR, 12288, RCHAR, 12719, 12718, 12716, RCHAR, 12715, 12720, 12717, RCHAR, RCHAR, 7693, 7694, RCHAR, RCHAR, 8133, 13945, RCHAR, 13946, 13947, RCHAR, RCHAR, RCHAR, 14602, 14603, 14601, RCHAR, 14599, 14600, 8563, 15272, 15849, 15848, 15847, 15850, 16461, 16460, 9730, 16462, RCHAR, 10007, 16969, RCHAR, 17406, 17768, 18502, RCHAR, 5640, 5748, 5747, RCHAR, 6466, 11337, 11366, 5898, RCHAR, 11453, 11627, 11628, 6467, RCHAR, 11914, RCHAR, 6803, 12289, 12290, RCHAR, 7207, 7211, 12721, 7210, 7208, 7209, RCHAR, 13313, 7695, 8136, RCHAR, 8134, 8135, 13948, RCHAR, RCHAR, 8999, 5641, RCHAR, 11367, RCHAR, 5749, RCHAR, RCHAR, 11370, RCHAR, RCHAR, 5752, 11369, 5751, 5750, 6127, 11368, RCHAR, RCHAR, 11454, RCHAR, RCHAR, RCHAR, 11458, 11460, 11461, 5908, 5909, 11457, 5904, RCHAR, 11455, RCHAR, 11459, 5905, RCHAR, 5900, RCHAR, 5901, RCHAR, 5907, 11456, 5899, 6128, 5902, 5903, 5906, RCHAR, RCHAR, RCHAR, 11645, 11643, 11630, 6140, 11637, 6135, 11631, RCHAR, 11639, RCHAR, 11636, 6138, 11635, 6145, 11644, 6147, RCHAR, 6149, RCHAR, 11629, RCHAR, 6136, 11646, RCHAR, 6143, 6146, RCHAR, 11937, 6130, 6153, 6144, 11632, 6133, 6148, 11640, 6131, 6132, 11935, 11633, 6139, 6150, 11647, 11634, 6137, RCHAR, 6142, 11915, 6151, 11641, 6141, RCHAR, 6152, 6129, 11638, 6134, 11642, 11936, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6479, 6495, 11922, 6486, RCHAR, 11943, 6471, RCHAR, 6474, 11934, RCHAR, 11920, 11924, 6482, 6484, 11927, 6491, 6477, 6475, 6476, 6490, 11939, 6485, 11926, 11928, 6483, 6488, 11929, 11942, RCHAR, 6804, 6494, RCHAR, 6472, 11941, RCHAR, 11945, 11925, 11947, 11932, 6481, 11921, 6480, 6498, 6487, RCHAR, 11919, 12299, 6493, 6497, 11933, 11938, RCHAR, 6499, 6492, 6478, 6468, RCHAR, 6473, RCHAR, 11923, 6469, 11946, RCHAR, 11917, 11916, 11930, 11918, 6496, 7212, 6489, 11931, 6470, RCHAR, 6819, RCHAR, RCHAR, RCHAR, 11944, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12306, 12309, RCHAR, 12312, 12301, RCHAR, RCHAR, 12315, 12318, 12320, 12298, 6805, 6810, 12726, 6826, 12313, 12321, 12305, 12297, RCHAR, RCHAR, RCHAR, 12753, 6813, 12310, 12302, 12304, 6818, RCHAR, 12307, 6812, 12294, 12316, RCHAR, 12319, RCHAR, RCHAR, 6809, RCHAR, 6821, 12291, 6823, 6807, 6827, 12317, 12293, 6824, 12747, 11940, 6811, 6806, 12300, 12292, 6825, 6817, 12311, 6822, 6820, 12303, 6814, 12295, 6815, 6816, 12296, 12314, 6808, 12308, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12729, 7220, 7225, RCHAR, RCHAR, RCHAR, 12738, 12744, 12740, 12727, 12730, 12723, 12724, 7232, 7217, 12739, 12748, 7227, 7213, RCHAR, 7222, 12731, 7224, 12732, 12742, RCHAR, RCHAR, RCHAR, 7226, 12757, 12725, 7219, 7218, 7230, 12722, 12755, 12743, 12756, 12750, 12736, 12751, RCHAR, 12745, 12754, 12752, 7231, 12737, 7216, 7215, 7223, 7229, 12749, 7228, 12734, 7696, RCHAR, 12758, 12733, 12728, 7221, 7233, 7214, RCHAR, 12741, 12746, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7730, 13315, 13319, RCHAR, 7711, 7709, RCHAR, RCHAR, 7700, 13317, 13316, 7720, RCHAR, 13322, 7714, RCHAR, 13340, 13352, 7697, 13337, 13330, 7732, 13314, RCHAR, 13342, RCHAR, 7729, 7717, 7728, 7707, 13326, 13344, 13336, 7708, 7702, 13350, RCHAR, 13343, 13345, 7710, 7718, 13347, 13324, 13341, 13329, 13349, 7723, 7699, 7721, 13334, 13332, 13333, 7712, 13328, 13327, 7701, 13321, 13351, 7703, 13331, 7733, RCHAR, 7727, 13320, 7724, 7722, 7731, 13338, 7726, 12735, 13339, 7725, 13346, 7698, 13335, 7716, 13323, 7715, RCHAR, 7713, 7705, 7704, 13949, 13348, RCHAR, RCHAR, 13325, RCHAR, RCHAR, 13970, RCHAR, 7706, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8165, 7719, 8147, 13964, 8161, RCHAR, 13952, 8144, 8140, 13982, 8146, 8150, 8145, 8154, 13986, 13977, RCHAR, RCHAR, 13959, 8159, 8153, 13971, 8137, 13983, 13976, 8141, 13965, 8156, 13994, 13995, RCHAR, 8138, 13981, 8158, 13969, 13955, 13956, 8162, 13960, 13967, 13961, RCHAR, 8160, 8168, 13957, 13950, 13951, RCHAR, 13953, 8143, 13966, RCHAR, 8157, 8166, RCHAR, RCHAR, 13968, 13992, 13984, 8139, 13990, 8151, RCHAR, 8149, RCHAR, 13996, 8148, 13974, 13962, 13972, 8171, 13978, 13975, 13958, 8167, 13988, 13985, 13993, 8142, 13973, 8170, RCHAR, 13980, RCHAR, RCHAR, 8152, 8155, RCHAR, 13979, 8169, 13963, 13318, RCHAR, RCHAR, 13989, 13987, 13991, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13954, 8164, RCHAR, RCHAR, RCHAR, 14634, 14633, 14607, 8569, RCHAR, 14632, 14610, 14611, RCHAR, 8579, 14641, 8574, 14631, RCHAR, 14604, 8580, 8570, 14619, 14609, 14612, 14636, 8564, 14643, 14635, 8573, 14624, 8584, RCHAR, RCHAR, 8583, 8577, RCHAR, RCHAR, 14642, 8565, 14622, 14613, 14626, 14638, 8585, RCHAR, 8567, 14621, RCHAR, 14614, 8576, RCHAR, 8575, 14617, 14627, 14637, 14608, 14618, 8568, 14628, 8581, 8572, 14615, 8571, 14606, 14620, 14640, 8163, 9027, 14623, 15273, 14625, 14639, 8578, 14616, 8566, 8582, 9405, 14605, RCHAR, 14630, RCHAR, RCHAR, RCHAR, 14629, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15301, 9024, 15290, 15295, 9013, RCHAR, 15275, 9026, RCHAR, 9004, 15274, 15307, 9028, 15278, 15294, RCHAR, 15280, 15310, 15306, 9002, 9012, 15876, 9025, 9010, 15276, RCHAR, 15305, 9014, 15302, 15315, 15282, 15291, RCHAR, RCHAR, 15313, 15303, 9009, RCHAR, RCHAR, 15289, 9003, 9001, 9019, RCHAR, RCHAR, 15287, 15284, 15285, RCHAR, 15309, RCHAR, 15314, 15312, 9007, 15316, 9011, 9018, RCHAR, 15277, 15852, 15286, RCHAR, 9005, 9023, 9020, 9008, 15296, 15281, 9021, 15298, 9015, 9017, 9000, RCHAR, 15300, 15292, 15279, 9016, 15308, 15311, 15288, 15299, RCHAR, 9006, 9388, 15297, 15851, RCHAR, 15304, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15283, 15861, 15871, 9391, 15870, 15882, 9393, 15868, RCHAR, 15872, 9404, RCHAR, 15863, 9396, RCHAR, 15875, 16470, 9408, 9407, 15877, 15860, 15887, 9402, RCHAR, 9392, 15880, RCHAR, 15884, 15889, 15878, 15866, 9395, 9398, 9406, 9401, RCHAR, 15869, 15293, RCHAR, RCHAR, 15865, 15888, 9397, RCHAR, 9400, 15890, 9389, 15879, 15853, 15885, 10016, RCHAR, 15867, RCHAR, 9390, 15862, 9394, 15854, 9022, 15858, RCHAR, 15883, 15859, 15857, 9399, RCHAR, 15881, RCHAR, 15856, 15874, 15873, 15886, 15864, 9403, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16473, RCHAR, 9743, 9733, 16485, 16465, 9735, 16477, 9742, 9737, 16475, 16971, 16481, 16487, 16480, 16463, 16478, 16489, 16491, 9732, 16490, 9738, 9744, RCHAR, 9741, RCHAR, 16484, 9740, 16479, RCHAR, 16467, 16472, RCHAR, 16483, 9739, 9736, 9731, 9734, 16471, RCHAR, 15855, 16466, 16469, 16486, 16474, 16464, 16970, 16488, 16468, 16482, RCHAR, RCHAR, RCHAR, RCHAR, 16973, 10020, RCHAR, RCHAR, 10008, RCHAR, RCHAR, 10012, 16975, 16981, 16979, 10010, 10011, 10018, 16982, 16974, 10013, RCHAR, 16978, 16977, 16983, 10019, RCHAR, 10014, 10017, 16976, 10021, 10015, 10022, 10009, 16980, RCHAR, 16972, RCHAR, RCHAR, 17419, RCHAR, RCHAR, 10254, 17416, 17418, RCHAR, 10252, 17414, 17415, 17410, RCHAR, RCHAR, 16476, 17411, 10253, 17407, RCHAR, 10250, 17420, 10251, 17408, 17409, 17413, 10256, RCHAR, 10255, RCHAR, RCHAR, 17412, 10418, 17772, 17778, 10419, 17769, 10416, 10413, 17780, 10417, RCHAR, 10414, 17771, 17774, 17775, 17776, 17779, RCHAR, 17417, 17770, 10415, 17777, 17781, 17773, RCHAR, RCHAR, RCHAR, 18084, 10561, 18087, 10562, 18095, 18086, 18083, RCHAR, 18085, 18089, 18092, 18091, 18094, 18082, RCHAR, 10560, 18090, 18093, 18096, 18088, 18325, 18326, 18330, 18331, RCHAR, 18328, 18329, 18327, RCHAR, 10654, RCHAR, RCHAR, RCHAR, RCHAR, 10732, 18506, RCHAR, RCHAR, 18503, 18504, 18505, 10733, RCHAR, 18657, 18656, RCHAR, 18760, 10822, 18758, 18761, 18759, 18830, 10856, 10870, 18905, 18884, RCHAR, 18904, 18950, 18951, 5642, RCHAR, RCHAR, RCHAR, RCHAR, 5910, 11462, RCHAR, RCHAR, 11648, RCHAR, 6154, RCHAR, 6157, RCHAR, 11649, RCHAR, 6155, 6156, RCHAR, RCHAR, RCHAR, RCHAR, 11956, 11958, 11953, 11950, 11952, RCHAR, RCHAR, RCHAR, 6503, RCHAR, RCHAR, RCHAR, 6501, RCHAR, RCHAR, 11954, 6502, 11951, 11948, 6500, 11955, RCHAR, 11949, 6504, 11957, RCHAR, RCHAR, RCHAR, RCHAR, 12323, RCHAR, 12327, RCHAR, RCHAR, 6836, RCHAR, RCHAR, RCHAR, RCHAR, 12330, RCHAR, 6828, 6831, 6833, 6835, 6832, 12326, 12325, RCHAR, 6830, 12328, 12329, RCHAR, 12322, 6834, RCHAR, 6829, RCHAR, RCHAR, RCHAR, 12324, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12772, 12773, 12774, 7238, RCHAR, 7234, 12763, RCHAR, 12771, 12776, 7239, RCHAR, 12761, 12767, 12760, 12770, RCHAR, RCHAR, 12766, 7235, 7237, 12775, RCHAR, 12759, 12762, 12768, RCHAR, 12769, 12777, 12765, RCHAR, 7236, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7738, 13359, RCHAR, RCHAR, 13361, 13357, RCHAR, 13369, 13355, 13368, 7734, 13353, 14000, 13363, 7737, RCHAR, 13364, 13367, RCHAR, 13371, RCHAR, 13360, RCHAR, 13365, RCHAR, RCHAR, 7735, 7736, 13370, 13358, 13354, 13372, RCHAR, 13362, RCHAR, RCHAR, 13366, RCHAR, RCHAR, RCHAR, 13356, RCHAR, 8172, 8173, 14010, 8179, RCHAR, 13998, 14007, 13997, 8176, 14005, 14003, RCHAR, 14004, 8174, RCHAR, 14008, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14001, 13999, 8175, 14002, 14006, RCHAR, RCHAR, RCHAR, 8177, RCHAR, RCHAR, RCHAR, 14009, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14649, 14656, 14658, 14664, RCHAR, 8598, 14644, RCHAR, 8590, RCHAR, 14659, 8595, 14665, 8586, RCHAR, 14662, RCHAR, 14646, 14663, 14645, RCHAR, 8600, RCHAR, 14657, 8587, 14666, RCHAR, 8592, 14650, 8597, 14661, 14648, 14655, 14651, 14647, 8589, 8596, 8594, 8591, 8599, 8588, 14654, RCHAR, 8593, RCHAR, 8178, RCHAR, 14660, RCHAR, 14652, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14653, RCHAR, RCHAR, 15324, RCHAR, 9031, RCHAR, RCHAR, 15320, 15326, 15322, RCHAR, 9033, 15321, 15325, 15317, RCHAR, 15319, 9032, RCHAR, RCHAR, RCHAR, RCHAR, 15323, 15318, RCHAR, 9034, RCHAR, 9029, RCHAR, RCHAR, 15327, RCHAR, 9030, 15896, 15893, 15905, 15899, 15901, 9409, 15895, 15903, RCHAR, RCHAR, 15902, 15900, RCHAR, 15906, 9412, 15897, 15904, RCHAR, 9410, RCHAR, RCHAR, 15892, 15894, 9411, 15891, 15907, RCHAR, 15898, RCHAR, RCHAR, 16495, 9751, RCHAR, RCHAR, 16506, 16504, 9745, 16494, 16497, 16498, 16493, 9755, 9756, 16492, 16507, 16502, 9749, 9746, 16501, 16499, RCHAR, RCHAR, 9752, 16503, 9747, RCHAR, 9748, RCHAR, 16500, 9750, 16496, RCHAR, 16505, 9753, 16508, 16509, 9754, RCHAR, RCHAR, 10024, 10031, 16984, 16990, RCHAR, 16988, 10027, 10026, 10023, 16986, RCHAR, RCHAR, RCHAR, 10029, 10028, 10025, RCHAR, 16989, 16985, 16987, RCHAR, 10030, RCHAR, RCHAR, RCHAR, 10260, 17423, RCHAR, 10257, 10258, 17425, 10259, 17422, RCHAR, 17421, 17785, 17424, RCHAR, 17786, 10420, 17784, RCHAR, RCHAR, 17783, RCHAR, 17782, 10421, RCHAR, RCHAR, 10563, RCHAR, RCHAR, 18097, 18098, RCHAR, RCHAR, RCHAR, RCHAR, 18334, 18333, 10655, RCHAR, 18332, 18507, 18508, RCHAR, RCHAR, 18658, 18762, RCHAR, RCHAR, 18831, 18930, 10890, 18940, 5643, RCHAR, 6505, 6506, RCHAR, RCHAR, 6837, RCHAR, RCHAR, RCHAR, RCHAR, 10032, 5644, RCHAR, 6507, 7240, 8601, 5645, RCHAR, 7739, 9035, 11338, RCHAR, 12331, 12778, RCHAR, 15328, RCHAR, 10033, 5646, 6508, 12332, 12333, 14011, 8180, RCHAR, RCHAR, 14667, RCHAR, RCHAR, 8602, 15329, RCHAR, RCHAR, 9413, RCHAR, 10422, 5647, 14012, 5648, RCHAR, 5912, 11463, 5911, 6160, 6159, 6158, 11650, RCHAR, RCHAR, RCHAR, 6509, RCHAR, 6510, 11959, RCHAR, 12334, RCHAR, 12337, 6839, 12335, RCHAR, 6838, 12336, 6840, RCHAR, 12781, 12780, 12779, 7241, RCHAR, 13374, 13375, 7740, 13373, 13376, 8182, 7741, RCHAR, RCHAR, 8181, 14016, 14015, RCHAR, 14013, 14014, RCHAR, 14017, 14669, 14668, 14672, RCHAR, 14671, 14670, 9036, 15332, RCHAR, 15331, 9037, 15330, 15908, RCHAR, 15909, 9414, RCHAR, 16510, 16511, RCHAR, RCHAR, 17791, 10423, 17790, 17789, 17787, 17788, 10656, 18099, 18509, 18832, RCHAR, 5649, RCHAR, 11371, 5753, 11372, RCHAR, RCHAR, RCHAR, 11464, 11465, RCHAR, RCHAR, RCHAR, RCHAR, 11656, RCHAR, RCHAR, 11652, RCHAR, 11651, 6511, 11655, 6162, 11653, 6161, 11657, 11654, RCHAR, RCHAR, 11963, 12338, 11961, 11968, RCHAR, 6512, RCHAR, 6515, 11969, 11965, RCHAR, 11966, RCHAR, 11960, 6514, 11962, 6513, 11967, RCHAR, 11964, RCHAR, RCHAR, 12342, 6842, 6843, RCHAR, 12345, 12339, RCHAR, 12344, RCHAR, 12340, 6841, 12343, 12341, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12787, 12784, RCHAR, 12786, 7246, 7245, 7243, 12783, 12788, 7242, 7244, 12785, 13384, 12782, 12789, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13379, 13383, RCHAR, 13382, 14019, 14030, RCHAR, RCHAR, 13385, RCHAR, 13380, 14018, 7745, RCHAR, RCHAR, 7744, 13378, 13381, 7746, RCHAR, 7743, 7742, 13377, 13386, RCHAR, RCHAR, RCHAR, 14021, 14028, RCHAR, 8184, 14027, 14024, RCHAR, 8186, RCHAR, RCHAR, RCHAR, 14026, RCHAR, RCHAR, 14020, 14022, 14025, 14023, 8185, 14029, 8183, 8603, RCHAR, RCHAR, 14676, 14675, 14673, RCHAR, 8606, 8605, 14677, RCHAR, 14674, 15333, 9038, 8604, RCHAR, RCHAR, RCHAR, 14679, 14678, RCHAR, 15336, 15334, 9415, RCHAR, 9039, 15335, 15911, RCHAR, RCHAR, RCHAR, RCHAR, 9416, 15910, 15919, 15918, 15916, RCHAR, 15915, 15912, 15913, 15914, 15917, 15920, RCHAR, RCHAR, 16516, 16513, 16514, 9757, 16512, 16518, 16517, 16515, RCHAR, 16992, 16993, 10034, RCHAR, 10035, 16991, RCHAR, 10262, 17426, 10261, 10424, RCHAR, 10425, 10564, 18101, 18100, 18335, 18510, 10734, 18660, 18659, 18661, 5754, 12346, 7247, 7747, 13387, 5755, 11373, 5650, RCHAR, RCHAR, 11466, RCHAR, RCHAR, RCHAR, 11662, 11660, 11661, 11658, 6163, 11659, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11977, RCHAR, 6518, 11975, 11971, 11974, RCHAR, 11970, 6520, 11973, RCHAR, 6517, 6516, RCHAR, 6519, 11976, 11972, RCHAR, RCHAR, RCHAR, RCHAR, 6847, 6850, 12354, 12353, 12352, 6844, 12361, 12351, RCHAR, 6846, 12794, RCHAR, 12358, 12356, 6849, RCHAR, 12348, 12359, RCHAR, 12350, 12360, 12357, 12349, RCHAR, 6845, 12362, 12347, 6848, RCHAR, RCHAR, RCHAR, RCHAR, 12799, 12790, 12801, RCHAR, 12793, 12804, 12805, 12791, 12803, 12800, 12798, 12802, 7253, RCHAR, 7251, RCHAR, RCHAR, 12796, RCHAR, 12792, RCHAR, 12795, 12806, 12797, 7252, 12355, RCHAR, 7248, 7250, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13401, 13390, 13388, RCHAR, 13389, RCHAR, 13396, RCHAR, 13397, 13393, 7752, 13398, 13395, 13392, RCHAR, 7750, 13391, 7748, 7751, 13394, 13402, 7249, 7749, 13400, 13399, 7753, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14035, RCHAR, RCHAR, RCHAR, 14036, 8196, RCHAR, 14042, RCHAR, RCHAR, 14044, 14037, 8190, 14041, 14040, 8191, 8197, RCHAR, 8198, 14043, 8188, 14034, 14032, 14038, 14031, 8195, 14033, 14039, 14045, 8189, 8194, 8192, 8193, RCHAR, RCHAR, RCHAR, 8187, RCHAR, RCHAR, RCHAR, RCHAR, 8613, 14686, 8612, 14690, RCHAR, 14680, RCHAR, 14691, RCHAR, RCHAR, RCHAR, 14681, 14682, RCHAR, 14692, 14689, 14687, 14688, 14684, 14683, RCHAR, 14693, 8609, RCHAR, 14685, RCHAR, 8614, 8608, 8615, 8616, RCHAR, 8611, 8610, RCHAR, RCHAR, 15337, 9041, 9040, RCHAR, RCHAR, 15342, RCHAR, 9417, 9042, RCHAR, RCHAR, 9044, 15343, 8607, 9043, 15339, 15341, 15338, RCHAR, 15340, RCHAR, RCHAR, RCHAR, 15930, RCHAR, RCHAR, 15929, 15926, 9420, 16519, 9421, 15925, RCHAR, 9419, RCHAR, 15927, 15924, 15921, 15928, 15922, 15923, 9418, RCHAR, RCHAR, RCHAR, RCHAR, 16997, RCHAR, 16523, RCHAR, 16522, 16524, RCHAR, 16994, 9760, RCHAR, 16520, RCHAR, 9758, RCHAR, 9762, 9761, 16521, 16525, RCHAR, 9759, RCHAR, 17001, 10038, 10263, 10039, 10036, 16998, 16996, RCHAR, 16999, RCHAR, 17002, 10037, 17000, 16995, RCHAR, RCHAR, 17429, 17432, 17794, 17427, RCHAR, 18102, 17433, RCHAR, 10426, 17431, 10264, 17428, 17430, 17434, 17795, RCHAR, 17793, RCHAR, RCHAR, RCHAR, RCHAR, 10427, 17792, RCHAR, RCHAR, RCHAR, 10565, RCHAR, RCHAR, RCHAR, RCHAR, 10658, 18512, 10657, 18514, 18511, 18513, 10786, 18763, 5756, 11978, 12807, 12808, 7754, 14694, 9763, 10428, 10735, 18764, 5757, RCHAR, 11979, 5213, RCHAR, RCHAR, 12363, RCHAR, 12364, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12809, 12810, 7755, 7756, RCHAR, RCHAR, RCHAR, 14046, RCHAR, 14697, 14696, 14695, 15344, RCHAR, 15345, 15346, 9045, RCHAR, RCHAR, 15932, 15931, RCHAR, RCHAR, 16526, 9764, 9765, RCHAR, 17006, 17003, 17004, 17005, 17436, 17435, 10265, 17796, 18336, 5758, RCHAR, 6851, RCHAR, 7757, 14698, RCHAR, 5759, RCHAR, 12811, 7758, RCHAR, RCHAR, 8199, 8200, RCHAR, 5760, 5761, 11467, 6165, 6164, 6852, 12365, 14047, 5762, 5763, 5764, 5765, RCHAR, RCHAR, RCHAR, 6166, 6167, 11664, 11663, RCHAR, RCHAR, 6521, 11982, 11980, 11981, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12366, 12367, RCHAR, RCHAR, 6856, 6854, RCHAR, 6855, 6853, RCHAR, RCHAR, RCHAR, RCHAR, 7254, RCHAR, RCHAR, RCHAR, RCHAR, 7258, 7257, 12812, 7256, 7255, RCHAR, 12813, RCHAR, RCHAR, 7761, 13404, 13403, 7759, 7760, RCHAR, RCHAR, RCHAR, 8202, 8201, 14049, RCHAR, RCHAR, 14048, 7762, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8617, 14700, 8618, 14699, RCHAR, RCHAR, RCHAR, 15347, 15933, 9422, 16527, RCHAR, RCHAR, RCHAR, 17007, RCHAR, 10430, 10429, RCHAR, RCHAR, 10736, 5766, 11983, RCHAR, RCHAR, 7763, 15348, 9046, 10947, RCHAR, 11665, 11666, RCHAR, RCHAR, 11984, 6523, 6524, RCHAR, RCHAR, 6522, RCHAR, RCHAR, RCHAR, RCHAR, 6860, 6861, 6858, 6859, RCHAR, 12368, RCHAR, RCHAR, 12369, 6857, RCHAR, RCHAR, RCHAR, RCHAR, 12814, RCHAR, 7262, 7263, RCHAR, 7766, 12820, RCHAR, 7268, 7266, 12821, 12816, 7265, 7264, 7259, 12819, 12818, 12815, 7267, RCHAR, 12817, 7260, RCHAR, 7261, RCHAR, RCHAR, 7767, 13408, 13409, 7768, 13405, 13407, 13411, 13410, 13406, RCHAR, 7764, 7765, RCHAR, 14057, 8207, 8206, 14051, 8204, RCHAR, 14054, 8208, 14055, 8209, 14052, 8203, 8205, 14056, RCHAR, 14053, 14050, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14713, RCHAR, 14702, 8620, 8623, 8622, 8627, 8626, 14714, 14712, 14705, 14709, 14708, 8624, 14711, 14707, 14715, 14706, 8625, 8619, 8621, RCHAR, 14704, RCHAR, RCHAR, RCHAR, RCHAR, 15350, 9050, 15354, 9049, 15351, 9048, RCHAR, 14703, 14710, 15353, RCHAR, 9051, 15355, 15352, 15349, RCHAR, RCHAR, 15936, 15940, 15942, 15938, 15937, 15935, 9425, 9423, 9428, 9429, 15939, 9426, 15934, 9427, 9047, 15941, 9424, RCHAR, RCHAR, RCHAR, 16529, RCHAR, 16528, 16536, 16530, 16535, 16532, 9766, 16534, RCHAR, RCHAR, 9767, RCHAR, 9768, RCHAR, 16533, 16531, RCHAR, RCHAR, RCHAR, RCHAR, 10041, 17008, RCHAR, RCHAR, 10040, 17011, 17009, 17010, RCHAR, RCHAR, 10042, RCHAR, RCHAR, RCHAR, 17440, RCHAR, 10268, 17441, RCHAR, RCHAR, 10266, 17442, 10267, 17439, 17443, RCHAR, 17437, RCHAR, RCHAR, 10431, 17797, 10432, 10566, RCHAR, 17438, 10567, RCHAR, RCHAR, RCHAR, 10659, 18337, RCHAR, 10738, 18515, 10737, RCHAR, 18662, 10823, 10824, RCHAR, RCHAR, 18946, 10948, RCHAR, 6862, 12370, RCHAR, 8210, 8211, 5767, 5913, 11468, RCHAR, 11667, 6168, RCHAR, 6525, RCHAR, 6863, 6864, 6865, 13413, 12822, 7269, RCHAR, RCHAR, 7769, 13412, RCHAR, RCHAR, 14059, 8213, RCHAR, 14058, 8212, RCHAR, RCHAR, 14716, 9430, 15946, 15943, 15944, 15945, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17012, RCHAR, 17444, RCHAR, RCHAR, RCHAR, 18104, 18103, RCHAR, 18516, 5768, 11985, 7270, RCHAR, RCHAR, RCHAR, 8214, 14717, RCHAR, RCHAR, 15356, RCHAR, 9431, 16537, RCHAR, 17445, 18105, 5769, RCHAR, RCHAR, 6526, 6868, 12371, 6869, 6867, RCHAR, 6866, 12823, 7271, RCHAR, RCHAR, 7272, 7273, RCHAR, RCHAR, RCHAR, 7771, 13414, 7770, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14060, 7772, 8215, 14718, 8628, 8629, RCHAR, 9052, RCHAR, 9053, 9432, 9770, 16538, 9769, RCHAR, 17013, 10043, RCHAR, 17446, 18106, 5770, 6169, 11988, 11987, 6527, 11986, 6528, 11989, RCHAR, 12377, 6872, 6871, 12379, 12378, 6876, RCHAR, 6875, RCHAR, RCHAR, 6870, RCHAR, 12373, 12374, 12375, RCHAR, 6877, 12372, 6873, 12376, 6874, RCHAR, RCHAR, RCHAR, RCHAR, 12826, 12830, 12828, 12827, RCHAR, 12831, RCHAR, RCHAR, RCHAR, 12832, 12833, 12825, RCHAR, 12824, RCHAR, 7275, 7276, RCHAR, 12834, 12829, RCHAR, 13423, RCHAR, 12835, 7277, 7274, RCHAR, RCHAR, RCHAR, 13417, RCHAR, 13416, RCHAR, 13418, 13419, 13421, 13420, 13425, 7776, 7773, 7777, 13415, 7778, 13424, 7775, 13422, 7774, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14063, 14065, 14061, 14062, RCHAR, RCHAR, 14066, 14068, 14069, 14064, 14067, 8216, RCHAR, RCHAR, 14722, RCHAR, 14727, 14719, 14723, RCHAR, RCHAR, 14728, 14724, 8630, 8638, RCHAR, 8633, 14720, 14721, 9057, 8641, 8634, RCHAR, 8639, 8632, 14726, 8640, 14725, 8636, 8631, 8637, 14729, 15361, 15363, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8635, RCHAR, RCHAR, 15358, 9055, 15364, 9056, 15362, 15357, 15360, 15365, 9054, 15359, RCHAR, 9434, 15950, 15949, RCHAR, 9437, 9435, 15947, 9433, 15948, RCHAR, 9436, RCHAR, RCHAR, RCHAR, 16546, RCHAR, 16548, RCHAR, 16547, 16539, 16543, 16542, 16540, 9772, 9773, 9771, 16541, 16544, 16545, RCHAR, 9774, RCHAR, 10048, 17021, RCHAR, 10045, 17015, 10047, 10049, RCHAR, RCHAR, 10046, 17020, 17016, 10044, 17019, 17014, 17018, 17017, RCHAR, RCHAR, 17448, 10271, 10272, 10269, RCHAR, 10270, RCHAR, RCHAR, 17447, RCHAR, 17800, RCHAR, RCHAR, 10433, RCHAR, 17798, 17799, RCHAR, 18107, 18110, 18108, 18109, 18338, RCHAR, RCHAR, 10660, 18663, 18765, RCHAR, 10825, 18833, 18834, 10871, 5771, 6878, RCHAR, 14070, RCHAR, 14730, RCHAR, 5772, 6170, RCHAR, 6529, RCHAR, 12380, 12381, 7278, RCHAR, RCHAR, 14071, 8217, 8642, 10050, 17022, 17801, 18111, 5773, RCHAR, RCHAR, RCHAR, 11995, 11990, 11992, 11994, 11993, 11991, 6530, RCHAR, RCHAR, RCHAR, RCHAR, 6879, 12390, RCHAR, 12385, 12382, RCHAR, RCHAR, 12389, RCHAR, RCHAR, 6881, 6882, 12388, 12387, 12386, 12383, 12384, 12391, 6880, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7282, RCHAR, 7288, 7287, 12844, 12838, 12836, RCHAR, 7285, 13432, 7280, 12841, 12845, 12847, 12843, 12837, 7286, 12842, 12840, 7279, 12848, 7289, 12846, 7283, 12839, RCHAR, 7284, 7281, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7780, RCHAR, 13433, RCHAR, RCHAR, 13426, 13428, 13430, RCHAR, 13431, 13429, 7781, RCHAR, 13434, RCHAR, 13427, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14075, 8218, 14083, RCHAR, 14072, RCHAR, 14084, RCHAR, 14073, 14074, RCHAR, RCHAR, 14082, 14081, 14078, 7779, 8219, 14076, 14079, 8220, 14080, 14077, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14741, RCHAR, 14745, 8649, RCHAR, 15371, 8652, 14743, 18956, RCHAR, 14740, 14735, 14737, 14738, 14731, RCHAR, 8648, RCHAR, RCHAR, 8647, RCHAR, 8643, 14734, RCHAR, 8650, RCHAR, 8651, 14733, 14736, 14744, 8645, 8646, 14742, 14732, RCHAR, RCHAR, RCHAR, 15373, 9059, 15375, 14739, 15377, 9063, 15378, 15374, RCHAR, 9060, 15370, 9062, 15367, 15372, 15376, 15369, RCHAR, RCHAR, 8644, RCHAR, 15366, 9061, 15368, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9440, 15952, 9444, RCHAR, 9442, RCHAR, RCHAR, 9058, RCHAR, 15959, 15960, 9439, RCHAR, RCHAR, 15958, 15961, 9441, 9438, 15954, 15951, 15956, 15953, 9445, 15955, RCHAR, RCHAR, 15957, 9443, RCHAR, RCHAR, RCHAR, RCHAR, 9776, 16555, RCHAR, 16549, 16553, 16559, 16560, 16556, 16557, 16554, RCHAR, 16551, RCHAR, 9778, 9775, 16550, 16552, RCHAR, 9777, 16558, RCHAR, 10054, RCHAR, RCHAR, 17028, 17023, 10053, RCHAR, RCHAR, 10051, RCHAR, 17030, 10052, 17026, 17027, 17024, 17031, 17449, RCHAR, 10055, 17025, RCHAR, 17032, 17029, RCHAR, RCHAR, RCHAR, 17453, RCHAR, RCHAR, 17450, RCHAR, 10273, RCHAR, 17454, 17456, 17455, 17451, 17452, RCHAR, RCHAR, 17806, RCHAR, 10434, RCHAR, 17803, 17805, 17802, 17807, RCHAR, RCHAR, 17804, RCHAR, 18113, 18116, 18112, 10568, 18114, 18115, 18117, 10569, 10571, 10570, 18339, RCHAR, 18341, RCHAR, 18340, RCHAR, RCHAR, RCHAR, 18517, RCHAR, RCHAR, 18766, 18835, 5774, RCHAR, RCHAR, 11668, 6531, 11997, 6532, 6533, 11996, RCHAR, 12396, 12395, 6883, 6886, 6885, 6884, 12392, 12394, 12393, RCHAR, RCHAR, 12851, 7291, 12855, 12854, 12853, 12849, 7290, 7294, 7297, RCHAR, RCHAR, 7298, 12850, 12852, 7296, 7295, 7293, 7292, 13441, RCHAR, 13439, 13435, 7782, RCHAR, 13436, 7783, 13437, 13438, 13440, RCHAR, 7784, RCHAR, RCHAR, 14088, RCHAR, 14087, 14086, 14085, RCHAR, RCHAR, RCHAR, RCHAR, 14749, 8653, RCHAR, 14746, 14748, RCHAR, 8654, RCHAR, 8655, 14747, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15387, RCHAR, 15380, 15381, RCHAR, 9066, 9064, 9065, 15389, RCHAR, 15388, 15385, 15384, 15383, 15382, 15386, 15379, RCHAR, 15962, 15967, 15965, RCHAR, RCHAR, RCHAR, 15964, 15963, 15966, RCHAR, 16561, RCHAR, 9779, 10056, 17034, RCHAR, 10057, 17033, 17458, 17457, 10274, RCHAR, 17808, 10435, 18118, 10739, 18518, RCHAR, 18768, 18767, 11374, 6887, 6888, 13442, RCHAR, 8657, 5775, 6173, 6172, 6171, RCHAR, RCHAR, RCHAR, 11998, RCHAR, RCHAR, 6535, 6534, RCHAR, 6891, RCHAR, 12398, 12401, 12399, RCHAR, 6889, 6890, RCHAR, RCHAR, 12397, 12400, RCHAR, 7305, RCHAR, RCHAR, RCHAR, 12862, 12864, 12863, 7302, 12858, RCHAR, RCHAR, 7300, 7299, RCHAR, 7303, 7301, RCHAR, 7304, 12861, 12856, 12857, 12860, 12859, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13445, 13446, 13444, RCHAR, 13443, 7785, RCHAR, RCHAR, RCHAR, RCHAR, 8225, RCHAR, 14089, 14091, 14093, 8224, RCHAR, RCHAR, 8222, RCHAR, 14090, 8223, 14092, 8221, RCHAR, RCHAR, 14759, 14750, 14753, 14757, 8661, 14755, RCHAR, 14754, 14751, 14752, 8659, 14758, 8658, RCHAR, 8663, 8662, 8660, RCHAR, 14756, RCHAR, RCHAR, RCHAR, 15395, RCHAR, 15394, RCHAR, RCHAR, 15390, RCHAR, RCHAR, 9067, 15393, 15392, 9068, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9450, RCHAR, 15969, RCHAR, 9451, 9447, 9449, RCHAR, 9446, 9448, RCHAR, RCHAR, RCHAR, 16562, RCHAR, 9782, 16564, 16563, RCHAR, 15391, 9784, 9783, 9780, 9781, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17039, RCHAR, 17037, 10058, 17038, RCHAR, 17040, 17036, 17035, RCHAR, RCHAR, 17459, 10277, 10275, 10276, RCHAR, RCHAR, RCHAR, RCHAR, 17809, 17810, 10437, RCHAR, 10436, 18120, 18121, 18119, RCHAR, 18519, 18520, RCHAR, RCHAR, 5776, 11469, 6174, RCHAR, 11999, 6537, 6536, 12000, RCHAR, RCHAR, 12403, 6892, 12402, 6893, RCHAR, RCHAR, 7306, 12867, 12865, 12871, 7307, 12866, 12870, 12868, 12869, RCHAR, RCHAR, 13447, 13449, RCHAR, 7786, RCHAR, 13448, 7787, 8228, 8227, 8226, 14094, RCHAR, RCHAR, RCHAR, RCHAR, 14762, 8664, 8665, RCHAR, 14761, 14760, RCHAR, RCHAR, RCHAR, RCHAR, 15396, 9070, 9069, 15397, 15398, RCHAR, 9453, 9452, RCHAR, 16568, 15970, 15972, 15971, 16567, 16565, 16569, 16566, RCHAR, 9785, RCHAR, RCHAR, RCHAR, 17041, 10059, 17042, 17043, RCHAR, RCHAR, 10278, 10279, RCHAR, 10572, RCHAR, RCHAR, 10787, 5777, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12404, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12872, 7308, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7938, 7937, RCHAR, RCHAR, 8230, 14096, 8229, 14095, RCHAR, RCHAR, RCHAR, RCHAR, 14763, RCHAR, 9071, 15399, 9072, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10573, 18122, RCHAR, 5914, 6538, 12001, RCHAR, 6895, RCHAR, 6894, 12405, 12406, RCHAR, RCHAR, 12874, 12876, 7309, RCHAR, 12878, 12881, 12879, RCHAR, RCHAR, RCHAR, 12880, 12877, 12873, 7310, 12882, 12875, RCHAR, RCHAR, RCHAR, RCHAR, 13458, 7793, 13467, 7790, RCHAR, 13460, 7794, RCHAR, 7788, RCHAR, 13455, 13468, 13456, 13453, 7792, RCHAR, 7789, RCHAR, 13459, 13462, 7791, 13463, 7795, 13464, 13454, 13461, 13465, 13457, 13452, 13450, RCHAR, RCHAR, 13466, RCHAR, RCHAR, 14098, RCHAR, RCHAR, RCHAR, RCHAR, 14103, RCHAR, RCHAR, RCHAR, 14099, 14105, 8233, 13451, 14100, 8231, 14097, 8238, 14101, 8237, 14102, 8239, 8234, 8240, 8235, RCHAR, 8236, RCHAR, 8232, RCHAR, 14104, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8668, 14774, RCHAR, 14777, 14765, 14770, 14764, 8670, RCHAR, 14768, RCHAR, RCHAR, RCHAR, 14766, 8669, RCHAR, 14773, 14772, 14769, 14771, 14767, 9076, 14776, 8666, 14775, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15415, RCHAR, 9083, 15410, RCHAR, 9082, 15400, RCHAR, 15402, 9075, 15407, 15406, 15409, 9080, 15404, 15403, RCHAR, RCHAR, 9079, 9074, 15405, 9077, 15411, 15413, RCHAR, 15408, 15401, 9078, RCHAR, RCHAR, 9461, 9073, RCHAR, RCHAR, 15414, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15976, 9454, RCHAR, 15978, RCHAR, 9455, RCHAR, RCHAR, 9457, 15981, RCHAR, 15973, 9081, 15979, RCHAR, RCHAR, RCHAR, RCHAR, 15975, RCHAR, 8667, 9460, RCHAR, RCHAR, 9456, RCHAR, 9458, 9459, RCHAR, 9788, 15980, 15974, 9462, RCHAR, 15977, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16579, 16574, RCHAR, RCHAR, 16584, 9786, 16576, 9790, 16582, 16573, 16570, 16585, 10065, 9791, 16581, 16571, 9789, 16575, 9793, 16572, 16577, 9792, 16580, 16583, RCHAR, RCHAR, RCHAR, RCHAR, 17061, 17062, 17046, 17053, 17051, RCHAR, RCHAR, 10063, 17058, 16578, RCHAR, 17049, RCHAR, 17059, 10062, 17048, 17047, 17057, 17054, 17056, RCHAR, 17044, 17060, 10060, RCHAR, 17055, 17064, 17052, 10064, 10061, 17050, 17045, 17063, 9787, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17462, RCHAR, RCHAR, 17460, 17466, 10283, 17464, 17463, 10285, 17469, 10284, RCHAR, 17470, 17467, 10281, 17468, 17461, 10282, 10280, 17814, 17465, RCHAR, RCHAR, 17471, RCHAR, RCHAR, 17811, RCHAR, RCHAR, RCHAR, 10442, 10440, 17813, RCHAR, 17815, 17812, 10441, 10438, 10439, 10443, RCHAR, RCHAR, 10575, RCHAR, 18127, RCHAR, 18126, 18124, 18123, 18125, RCHAR, 10574, 10576, RCHAR, RCHAR, 10661, RCHAR, RCHAR, 18343, 18342, RCHAR, RCHAR, 18521, RCHAR, 18523, 18525, 18524, 18522, RCHAR, RCHAR, 10741, 10740, RCHAR, RCHAR, 10789, 10788, 10790, 18665, 18664, RCHAR, 18836, 18769, 18837, 10857, RCHAR, 10858, 18885, RCHAR, RCHAR, 10895, 5915, RCHAR, 12002, RCHAR, RCHAR, 12408, 12409, 12407, RCHAR, RCHAR, 6896, RCHAR, 12410, 12411, 12412, RCHAR, RCHAR, 12883, 12889, RCHAR, RCHAR, 12887, 7311, 12885, RCHAR, 12886, 12888, RCHAR, RCHAR, RCHAR, 12884, 7796, RCHAR, 13469, 7798, 13471, 7797, 13470, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14107, 8241, RCHAR, 14109, 14106, 13472, RCHAR, 8242, RCHAR, 18961, 14108, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14780, RCHAR, 8671, 14778, 8672, 14779, 8673, RCHAR, RCHAR, RCHAR, 9084, 15419, 15416, 15418, 9085, 9086, 15417, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15982, RCHAR, RCHAR, 15983, RCHAR, 9463, 15985, 15984, RCHAR, 5214, RCHAR, 16589, 16590, 16586, RCHAR, 16587, 9794, 9795, 16588, RCHAR, 10071, RCHAR, RCHAR, 10067, 10072, 10068, 10070, 10066, RCHAR, 10069, RCHAR, RCHAR, RCHAR, RCHAR, 10286, 17065, RCHAR, 17817, RCHAR, 17816, RCHAR, 18128, 10577, 10578, 18527, 18344, RCHAR, 18526, RCHAR, 18838, 18906, 5916, RCHAR, RCHAR, 6175, RCHAR, 12003, 6539, RCHAR, 6899, 12415, 6897, 12413, 6902, 6898, 6903, 6901, 12414, 6900, 7315, 7314, 12900, 7323, 12893, 12899, 7319, 12892, 12898, 12896, 7318, 7320, 12895, 7313, 12894, 7324, 7321, 7325, 7322, 12891, 12890, 12897, 7316, 7312, 7317, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13487, 13480, RCHAR, 8247, 13479, RCHAR, 7802, 7809, 7806, 7812, 7811, 7807, RCHAR, 13473, 13476, RCHAR, 13475, 7803, 13477, 13486, 7804, 13474, 13483, 13484, 7805, 13481, 7810, 7800, 7808, 13478, 7799, 13482, RCHAR, RCHAR, 13485, RCHAR, RCHAR, RCHAR, 14126, 14117, 8244, 14124, 14121, 14113, 14122, 8246, 14114, RCHAR, 14110, RCHAR, RCHAR, 8679, 14119, RCHAR, 8243, 14125, RCHAR, 8250, 8252, 14112, RCHAR, RCHAR, 8251, 14115, 8245, 14123, 14116, 14120, RCHAR, 14118, 8248, 14111, 8253, 7801, 8249, 8254, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8675, 14787, 14789, 14791, 14795, RCHAR, 14785, 14783, 8677, RCHAR, 14790, 14794, 14786, 14782, RCHAR, 14781, RCHAR, RCHAR, RCHAR, 14792, 14784, 14788, 8678, RCHAR, 8676, 14796, 8674, 14793, RCHAR, 15436, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9089, 15428, 9476, 15438, 9092, 15442, 9098, 15423, RCHAR, RCHAR, 15439, 15420, RCHAR, 15441, 15424, RCHAR, 9105, 9102, 15440, 15434, 9088, 9096, 9095, RCHAR, 9094, 9100, RCHAR, 15421, 9101, 15435, 9097, 9087, 15437, 9090, 9091, 9099, 15426, 15425, 15422, RCHAR, 15430, 15427, 15431, 9104, RCHAR, 15443, 9093, 15432, 15433, RCHAR, 15429, RCHAR, RCHAR, RCHAR, 9103, RCHAR, RCHAR, RCHAR, RCHAR, 15990, 9468, 9477, 9473, 15987, RCHAR, 9470, 9474, 15999, 9464, 15991, RCHAR, 9472, RCHAR, RCHAR, 15994, 15989, 9471, 9475, 15988, RCHAR, 9469, RCHAR, 15998, 9466, 15997, 15996, 9478, 15750, 9465, RCHAR, 15995, 15986, RCHAR, 9479, 15993, 9467, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15992, RCHAR, RCHAR, RCHAR, RCHAR, 9798, 9803, 9796, 16603, 16594, 16606, 16598, 16604, 9804, 9797, 16591, 16597, 16607, 16600, 16605, 16593, RCHAR, RCHAR, 16601, 9799, 16599, 9802, 9801, 16595, 16596, 16592, 16602, 9800, 16609, 16608, RCHAR, RCHAR, RCHAR, 17076, 17072, 10079, RCHAR, 17066, 10073, 10089, 17078, 10081, 10077, 17069, 10084, 10087, 17080, 10076, 17071, 10085, 17082, 17079, 17067, 10080, 10074, 10088, 17074, 10083, 17068, 10078, 17081, 10082, 10075, 17075, 10086, 17073, RCHAR, RCHAR, 17077, RCHAR, RCHAR, RCHAR, 17473, 17479, 10292, 17482, 10287, 10288, 17474, 17481, 17476, 10293, 10290, RCHAR, 17472, RCHAR, 10289, 17478, 17480, 10291, 17477, 17475, RCHAR, RCHAR, RCHAR, RCHAR, 17827, 10447, 10448, 10444, RCHAR, 10445, RCHAR, 17823, 17821, RCHAR, 17825, 10450, 17826, 17819, 17818, 17822, 17820, 10446, 17824, 18129, 10581, 10580, 18130, RCHAR, 18132, 18131, 10582, RCHAR, RCHAR, RCHAR, 18349, 18346, 18347, RCHAR, 18345, 18348, 10663, 18350, RCHAR, 10662, RCHAR, 18528, RCHAR, 10791, 10793, 18666, 10792, 18770, 18840, 18842, 18839, 18841, 10877, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5917, RCHAR, 6904, 12764, 7326, RCHAR, RCHAR, 7813, 14127, 14128, RCHAR, RCHAR, RCHAR, 16610, 10090, 17083, RCHAR, RCHAR, 10294, RCHAR, 17829, 17828, 10583, 18351, RCHAR, 18529, 10826, 11470, RCHAR, RCHAR, 6540, 6176, RCHAR, RCHAR, 12416, RCHAR, RCHAR, 12906, 12901, 12905, 12903, 7327, 12904, 12902, RCHAR, 13488, RCHAR, 14129, 14130, 14799, 14800, 8681, 8682, 14798, 14801, 14797, 8680, RCHAR, 9106, RCHAR, 8683, 15444, RCHAR, 9480, 16000, 9481, RCHAR, 9805, 16613, 16611, 16612, 17086, 17085, 17084, RCHAR, RCHAR, RCHAR, 17830, RCHAR, 10449, 17831, 18530, 10827, 18771, 5918, 6542, 6541, 12418, 6905, RCHAR, RCHAR, 12417, 12908, RCHAR, 7328, 13489, 12907, RCHAR, RCHAR, RCHAR, 7815, 13492, 13490, 13491, 7814, RCHAR, 14132, 14133, 14131, RCHAR, 8686, 14803, 14802, 14804, 8685, 8684, RCHAR, RCHAR, 16001, 16003, RCHAR, 9482, 16002, 16614, 9806, 17484, RCHAR, 17483, 10451, 17832, 10453, 10452, 18133, 18352, 10664, 5919, 12419, 6906, 12911, 7330, 12910, 12909, RCHAR, 7329, RCHAR, 13498, RCHAR, 13500, 13493, 13494, 7816, 13495, 7817, 13499, 13496, 13497, 7818, RCHAR, 8256, 8257, RCHAR, 14134, RCHAR, RCHAR, RCHAR, 14805, 14806, RCHAR, 15448, 9109, 9107, 9108, 15445, 15446, RCHAR, 15447, 16008, RCHAR, 16009, 9483, 16006, 16005, 16007, 16004, 9809, 16615, 9807, 9808, 17088, 10091, 17087, 17340, RCHAR, 17485, 17486, 10295, RCHAR, 10296, 10092, 17833, 17834, 18134, 10584, 5920, RCHAR, 5921, 6907, 6543, 7331, 12420, RCHAR, RCHAR, RCHAR, 8258, 5922, 6909, 12421, 12422, 6908, 6910, 5923, RCHAR, 12423, 7333, 12912, 7335, 7332, 7334, RCHAR, 13503, 7819, RCHAR, 13502, 13501, RCHAR, 14807, RCHAR, RCHAR, 15449, RCHAR, 9484, RCHAR, 9810, 16617, 16616, RCHAR, 17089, RCHAR, RCHAR, RCHAR, 18353, RCHAR, RCHAR, 5924, 11669, 12004, 6911, 12424, RCHAR, 12914, RCHAR, RCHAR, RCHAR, 7336, 12913, 7337, RCHAR, RCHAR, RCHAR, 13505, RCHAR, RCHAR, 7821, 13504, 13506, RCHAR, 7820, RCHAR, RCHAR, RCHAR, RCHAR, 14136, 14137, 14135, 8259, RCHAR, RCHAR, RCHAR, 8687, RCHAR, 8688, RCHAR, 9111, RCHAR, 15451, 15450, 9110, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16010, RCHAR, RCHAR, 16011, RCHAR, RCHAR, RCHAR, RCHAR, 16618, RCHAR, RCHAR, 10096, 10095, 10093, 10094, 10097, RCHAR, 17487, 10298, 10297, 17835, 18135, RCHAR, RCHAR, RCHAR, 10743, 10742, 5925, RCHAR, RCHAR, 12713, RCHAR, 8690, 8260, 8689, 9112, RCHAR, 5926, 11375, 5927, 5928, RCHAR, RCHAR, 12005, 11672, RCHAR, 11673, 6178, RCHAR, 11670, 6177, RCHAR, 6180, 11671, 6182, 6181, 11674, 6179, RCHAR, RCHAR, RCHAR, 6548, 6546, 12007, RCHAR, 6545, RCHAR, RCHAR, RCHAR, 6550, 6552, 6549, RCHAR, 12010, 12006, 6553, RCHAR, 6547, 6183, RCHAR, 6551, 12009, RCHAR, RCHAR, 12008, RCHAR, 6544, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12430, 6915, 6916, 12432, RCHAR, 12426, 12429, 12438, 12436, RCHAR, 6917, 12442, 6920, 12439, 12431, 12428, RCHAR, RCHAR, 14139, 12437, 6912, 12440, 12425, 12434, 6914, 6919, 12435, 6923, 6921, RCHAR, 12427, 6918, RCHAR, 12433, 6922, 6913, 12441, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7342, RCHAR, 7351, 7340, 7338, 12916, 7346, 7343, 12918, RCHAR, RCHAR, 7345, 12917, 12915, 12920, 7350, 7348, 14138, RCHAR, 12921, 12919, 7339, RCHAR, RCHAR, 7341, 7344, RCHAR, 7347, RCHAR, 7349, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13516, 7823, RCHAR, 13507, 13509, RCHAR, 13510, RCHAR, 13518, 13514, 13512, RCHAR, 13515, 13519, 7824, 7828, 13508, RCHAR, 13517, RCHAR, 7826, RCHAR, 7825, 13513, 13511, RCHAR, 7822, 7827, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8266, 14147, RCHAR, RCHAR, 14145, 8268, RCHAR, RCHAR, RCHAR, RCHAR, 14140, 14821, RCHAR, 8267, 14144, RCHAR, RCHAR, 14141, 8263, 8269, 14146, 8265, 14143, 9113, 8264, 14142, 8270, 8262, 8261, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14813, 14811, RCHAR, 14817, RCHAR, 14809, 14822, 14814, RCHAR, 14808, 8694, 8700, 14819, RCHAR, 14812, RCHAR, 8697, RCHAR, RCHAR, 8695, 14820, 8692, 8691, 14815, 8696, 8271, RCHAR, 14818, 14810, 8693, 8698, 8699, RCHAR, RCHAR, RCHAR, RCHAR, 9118, 9114, RCHAR, 9119, 15454, RCHAR, RCHAR, 15453, 15455, 9116, 15452, 9117, 15458, 15457, 15456, RCHAR, 9115, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16015, RCHAR, 16018, 9490, 16017, 9489, 9485, 9486, 9487, 16014, 16013, 9488, RCHAR, 16016, 16012, RCHAR, RCHAR, 16620, 16630, 9813, 9812, RCHAR, 16624, 16626, RCHAR, 16621, RCHAR, 16625, 16619, 16628, 9811, 16627, 16623, RCHAR, 16629, RCHAR, 16622, 10100, 17090, 17096, 10104, 10106, 10103, 10102, RCHAR, 10101, 10099, 17091, 17094, 10098, 17095, RCHAR, 10105, 17093, RCHAR, 17092, 10299, RCHAR, 10300, 17490, 17488, 17489, RCHAR, RCHAR, 17837, RCHAR, 17836, 10454, 18137, 10585, 18136, RCHAR, 18354, 18531, 10744, 18843, 18844, 10794, 5929, RCHAR, 6554, 14148, 9120, 10107, 17097, 5930, RCHAR, 7353, 7352, 14149, RCHAR, RCHAR, RCHAR, 16631, 5931, 6924, RCHAR, RCHAR, 14150, 14151, 14152, 9121, 9814, 5932, RCHAR, 6555, 12443, 7354, 12922, 7829, RCHAR, 14153, 8701, RCHAR, 9122, 9815, 10108, 10301, 18138, 5933, 6556, RCHAR, RCHAR, 7355, 13520, 8272, RCHAR, 9123, 15459, 16019, RCHAR, RCHAR, RCHAR, RCHAR, 5934, 8273, 14823, 9124, 5935, 12011, 12444, 6925, RCHAR, RCHAR, 12924, RCHAR, RCHAR, 7358, RCHAR, 7356, 7357, 7359, RCHAR, RCHAR, 12923, RCHAR, RCHAR, 13525, 13522, 13524, 7830, 7832, 7831, 13521, 7833, 13523, RCHAR, 14154, 14155, RCHAR, 14156, 14826, RCHAR, 14827, RCHAR, 14825, 14828, RCHAR, 8702, RCHAR, 14824, RCHAR, 9125, RCHAR, RCHAR, 16024, 16020, 16023, 16025, 16022, 16021, RCHAR, 16632, 16633, 16634, 9816, 9817, 17099, 17098, 17100, RCHAR, 17492, 17491, RCHAR, 17839, RCHAR, 17840, 17838, RCHAR, 10586, RCHAR, 18139, 18140, RCHAR, 18532, 18667, 18772, 5936, 6184, RCHAR, 10109, 5937, RCHAR, 13526, 14157, RCHAR, 10834, 11471, RCHAR, RCHAR, RCHAR, 11472, 11474, 5938, 11475, 11473, RCHAR, RCHAR, 11682, 11683, 11677, RCHAR, RCHAR, RCHAR, RCHAR, 11681, 6186, RCHAR, 6187, 11678, 11676, 11675, 11679, 6185, 11680, 12445, RCHAR, RCHAR, RCHAR, 12016, 6559, 12015, 12017, RCHAR, 6558, 12022, 6562, 12012, 12026, 12032, 6569, 12029, 6566, RCHAR, 12019, 12025, 12027, RCHAR, 12014, 6565, 6560, 12020, 6567, 6570, 6564, RCHAR, 6557, 12024, 12018, 12031, 6572, 6568, 6563, 12023, 7360, 12021, 6561, 6571, RCHAR, 12013, RCHAR, 12028, 12030, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6942, 6936, 6944, 6941, 12452, 12455, 6937, RCHAR, 12446, RCHAR, 6930, 6940, RCHAR, 6943, 6945, 12467, 12458, RCHAR, 6929, 12466, 6933, 6931, 6926, 12450, RCHAR, 12465, 12454, 12457, 12470, RCHAR, 6946, 12464, 6938, 12459, 12469, 12456, 12460, 12463, RCHAR, RCHAR, 12448, 12468, 12462, RCHAR, RCHAR, 12447, RCHAR, 12451, 6939, 6934, 6927, 6932, 6928, 6947, 12449, 12941, 6935, RCHAR, RCHAR, 12461, 12090, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12944, 7374, RCHAR, 12928, RCHAR, 12939, 12935, RCHAR, 12954, RCHAR, 12946, RCHAR, 12936, RCHAR, 12945, 12930, 12934, 12957, 7377, 12949, 12940, 7361, 12955, 12926, RCHAR, 12948, RCHAR, 7376, 7371, 12925, 7369, 7368, 7373, 12947, 7365, 7372, 12453, 14158, 12942, RCHAR, RCHAR, 12932, 7375, 12933, 12937, 7378, 12927, 12951, RCHAR, 12950, 12958, 7367, 7364, 12956, 12952, 12943, 12938, 7370, 7366, 12929, 7362, 12953, 7363, RCHAR, 12931, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13532, 13534, 13539, 13559, 7847, 7837, RCHAR, 13531, 7848, 7849, 13542, 13549, 13555, RCHAR, 13536, RCHAR, 13543, RCHAR, RCHAR, 7850, 13557, 13552, 7845, 7843, 13548, 13544, 13530, 7834, 13535, 13527, RCHAR, 7842, 7844, 13540, 13537, 7839, 13553, 7836, 13538, 13560, 13546, RCHAR, 13545, 7835, RCHAR, 7846, RCHAR, 7838, 13528, 13533, 13550, 13556, 7851, 13529, 13541, 13547, 7841, RCHAR, RCHAR, 13558, 13551, 13554, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7840, RCHAR, 14174, 14162, 8281, 14191, 14199, 14202, 8279, 14170, 14195, 14171, 14185, 8292, 14181, 8289, RCHAR, 14182, 14159, RCHAR, 14196, RCHAR, RCHAR, 8298, 14193, 14183, 14204, 14178, 14860, RCHAR, 14207, 8296, 14176, 14188, 8299, 8278, 14180, 14205, 14173, 14166, 14177, RCHAR, 14165, 14163, 8274, 14197, 14172, 14200, RCHAR, 14201, 8282, 8287, 8283, 8291, 14192, 8284, 14184, 14168, RCHAR, 8276, 14160, 14194, 14203, 14167, 8290, 14208, 14179, RCHAR, 14175, RCHAR, 8275, 8295, RCHAR, 14190, 8297, RCHAR, 14186, 8286, 8280, 8288, 8277, 8294, 14187, 14169, 14189, 14164, 14198, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14206, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14859, RCHAR, 14881, 8656, 14864, RCHAR, 14862, 14841, 8706, 14857, 14877, 14853, 8714, 14876, 14851, 8293, 14867, 14852, 14874, 8713, 8705, RCHAR, 14830, 14838, RCHAR, 14863, 14855, 14880, 14858, 8719, 14875, RCHAR, 8710, RCHAR, 14861, 14869, 14842, 14868, RCHAR, 14885, 14837, 14870, RCHAR, 14883, RCHAR, 14831, 8285, RCHAR, 14845, 14844, 8712, RCHAR, 14848, 14850, 14865, 14882, 8715, RCHAR, 8716, RCHAR, 14836, 8708, 14840, 14878, 8717, RCHAR, 8709, 8711, 8718, 14884, 14871, 14866, RCHAR, RCHAR, 14847, 14846, 8707, 14832, 8704, 14856, 14833, 14854, RCHAR, RCHAR, 14843, 14879, RCHAR, RCHAR, RCHAR, 8703, RCHAR, RCHAR, RCHAR, 14839, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14835, 14873, 14834, 9138, 15499, RCHAR, RCHAR, 15482, RCHAR, RCHAR, 15460, 15490, 9130, 15475, 15485, 9133, 15478, 9131, 15463, 15493, 15462, 15481, RCHAR, 15461, RCHAR, RCHAR, 15479, 15488, 15486, 15474, 15469, 15467, RCHAR, 15468, 15487, 15498, 15476, 9132, RCHAR, 15471, RCHAR, 15491, RCHAR, 9135, 15470, 15464, 15480, 9139, RCHAR, RCHAR, 9127, 9136, 15472, 15466, RCHAR, 9129, 14872, 9128, 15483, RCHAR, 9126, 9141, 9134, 15484, 15473, 15465, 15492, 15477, 9140, 15496, 9137, 15495, RCHAR, 15489, 15494, RCHAR, RCHAR, RCHAR, 15497, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16065, 16066, 16053, 16052, 16048, 9502, RCHAR, 9494, 16068, 16067, 14829, 16045, 16049, 16043, RCHAR, 16062, 16047, RCHAR, 16069, 16040, 16038, 16050, 16060, 16055, 9504, 16029, RCHAR, 16059, RCHAR, RCHAR, RCHAR, 9505, 14849, 16041, 16032, 16035, 16073, 16042, 16033, 16031, 16028, RCHAR, 9498, 16051, 9497, 9501, 16046, 16054, 9491, 16070, 16074, 9493, RCHAR, 16037, 16057, 16061, 16034, 16071, 9500, RCHAR, 9499, 16026, 9503, 16064, 16036, 16056, 16030, 16044, 16039, 9495, 9496, 16058, 16075, 16072, 16063, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16027, RCHAR, 9492, 16651, RCHAR, 16642, 16645, RCHAR, 9823, 16647, 16636, 16643, 16649, 9820, 9824, 9818, RCHAR, RCHAR, 16638, 16654, RCHAR, RCHAR, 16648, RCHAR, 16639, 16663, 16657, 16635, 17119, 16641, 9819, RCHAR, 16652, RCHAR, 16662, 9827, RCHAR, 16659, 16640, 16646, 16650, 16644, 16664, 16661, 16658, 9821, 9822, 9826, 16637, 16665, 9825, 16655, RCHAR, RCHAR, 16653, RCHAR, RCHAR, RCHAR, 16656, 17132, 17113, 17118, 17131, 17117, 17109, 17114, RCHAR, 10112, RCHAR, 17102, 17126, 17128, 17101, 10111, 17130, 17122, 10118, 17129, 17115, 10120, 17107, 16660, 17123, 17120, 17103, 17134, 10114, RCHAR, RCHAR, 10115, 17105, 17121, RCHAR, 17133, 17124, 17111, 10117, 10113, 17125, 17112, 17135, 17106, 17116, 17127, 17108, 17110, RCHAR, 10310, 17104, 10119, 10303, 10110, RCHAR, RCHAR, RCHAR, RCHAR, 10116, 10307, 17508, RCHAR, 17498, 17493, 17499, 17509, 17513, 17512, 10309, 10308, RCHAR, RCHAR, 17500, 17514, 17503, 17495, RCHAR, 17497, 17496, 17502, 17507, 17494, 17501, 17506, 10306, RCHAR, 17504, RCHAR, 10304, 17505, 10302, 10305, 17856, 17510, RCHAR, RCHAR, 10458, RCHAR, 17848, 17852, 17844, 17847, RCHAR, 17855, 10456, 17860, 17853, RCHAR, 17845, 17861, 17854, 10459, 10460, 17858, RCHAR, 17846, 10455, 10457, 17841, 17849, 17843, RCHAR, 17859, 17857, 17842, 17850, RCHAR, RCHAR, RCHAR, 18147, 10461, 17851, 10588, 10590, 10587, RCHAR, 18152, 18144, 18142, 18146, 18143, RCHAR, RCHAR, 18148, 18150, 10591, 10593, RCHAR, 18149, 10594, 10592, 18151, RCHAR, RCHAR, RCHAR, RCHAR, 10589, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 10665, 18355, 18361, 10667, 18145, 18360, RCHAR, 18367, 18358, 18365, 18364, 18141, 18359, 17511, 18368, 18357, 18362, RCHAR, 18366, 18356, RCHAR, 18536, 10666, 18363, RCHAR, RCHAR, 18672, 18537, 18535, 18533, 18534, 18538, RCHAR, 10795, 18670, 18668, 18673, 18671, RCHAR, 18674, 10796, 18669, RCHAR, RCHAR, 18773, RCHAR, RCHAR, 18845, 18846, 18847, RCHAR, RCHAR, 18941, 18931, 11476, 6573, RCHAR, 6948, RCHAR, 12960, 12959, 7379, 7852, 13562, RCHAR, RCHAR, 13561, RCHAR, 8300, 8721, RCHAR, 8720, 8722, RCHAR, 15500, 16076, 16666, 16668, 16667, RCHAR, 10121, 17136, 17515, 18907, 5939, RCHAR, 12035, 12036, 12034, 12033, 6574, RCHAR, 12474, 12472, RCHAR, RCHAR, 12471, RCHAR, 6949, 6951, 6950, 12473, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12972, 12969, 12967, RCHAR, RCHAR, 7380, 12970, 7385, 12964, 12979, RCHAR, 12981, 12965, RCHAR, 7382, 12982, 12977, 12963, 12968, 12978, 12974, 12971, RCHAR, 7387, 12980, 12966, RCHAR, RCHAR, 12975, 12961, 7386, 7383, 12973, RCHAR, 12976, 12962, 7384, 7381, RCHAR, RCHAR, RCHAR, RCHAR, 7862, 13569, 7861, RCHAR, 13572, 13575, 7858, 7856, 13564, 13573, 13571, 13568, 13576, 13577, 13579, 13580, 13563, 7855, 13566, 13565, 13578, 7857, 13567, 7859, 7854, 13570, 7863, RCHAR, 7860, 13574, RCHAR, RCHAR, RCHAR, 8307, 14223, RCHAR, 14212, 8304, RCHAR, 14891, 14221, 14209, 8302, 14214, 8305, 14218, 14216, 8308, 8301, RCHAR, RCHAR, 14210, 14213, 8306, RCHAR, 14211, RCHAR, 14222, 14220, 14215, 14217, 14219, 8303, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14892, 14898, 14888, 14894, 8723, 14890, 8729, RCHAR, RCHAR, 8728, RCHAR, 8727, 14897, 8730, 8731, 14887, 14900, 8732, 8726, 8725, 14896, 8733, 14886, 14889, 14899, 14895, RCHAR, RCHAR, 15532, 15521, 8724, RCHAR, RCHAR, RCHAR, RCHAR, 9148, 15509, 15530, 15510, 9143, RCHAR, 15507, RCHAR, 15516, 15508, 9145, 15502, 15529, 9146, 15526, 15527, 15503, 9151, 15518, RCHAR, 15512, 15519, 15506, RCHAR, 15531, 15523, 15517, 15501, 9147, 15524, RCHAR, 9150, 15528, RCHAR, 15522, 9144, 15520, RCHAR, 15514, 9142, 15505, 15513, 15525, 15511, RCHAR, RCHAR, 15515, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9515, 14893, 16094, 16103, 16093, 16089, 16086, 9516, 16084, 9149, 16077, 9514, 16083, 9513, 16088, 16085, 16101, 16096, 16090, 16095, 9509, 16087, 16106, 16078, 16079, 16102, 9510, 16107, 9512, 16108, 16092, 15504, 16098, 16091, 16100, 16097, RCHAR, RCHAR, RCHAR, 16082, 9507, 16105, 9508, 16080, 9511, 16678, 16099, 16104, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16675, 9506, 9828, 16685, 16681, RCHAR, 16679, 16674, 16689, RCHAR, RCHAR, RCHAR, 9832, RCHAR, 16670, 16682, 16683, 16673, 16672, 16686, RCHAR, 16676, 16671, 16677, RCHAR, 16688, 16669, 16687, 16684, 9830, 9829, RCHAR, RCHAR, 9831, 16680, 17532, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17138, 10127, 17142, 17139, 17146, 17152, 17141, RCHAR, 17161, 10124, 17155, 17144, 17156, 17151, 17158, 17143, 10129, 10128, 17145, 17159, 17137, 17157, 10122, RCHAR, 17149, 17148, 17153, 17140, 10126, RCHAR, 10130, 17147, 17154, 10131, 17150, RCHAR, RCHAR, RCHAR, RCHAR, 10123, 10125, 17528, 17526, RCHAR, RCHAR, 17533, 17530, 17534, RCHAR, 17519, 17527, 17538, 17160, 17523, 10314, 16081, 17518, 17531, 17525, 17522, 17517, 17516, 17537, RCHAR, 17521, 17520, 10312, 17529, RCHAR, 10311, RCHAR, RCHAR, 10313, 17524, 17536, RCHAR, 17865, 17866, RCHAR, 10465, 17863, 10462, 17871, RCHAR, 10466, 17873, 17862, 17535, 17875, 17864, RCHAR, 10463, 17870, RCHAR, 17872, 17867, 17874, 17869, 17868, 10464, RCHAR, RCHAR, 18154, 18155, RCHAR, 18157, 10595, 10596, 18158, 18156, RCHAR, 18153, RCHAR, 18371, 18374, 18370, RCHAR, 10671, 18372, 10670, 10669, 10668, 18373, 18543, 18541, RCHAR, 18540, 18369, 18542, 18375, 18539, RCHAR, 18677, 18643, 18675, 10797, 18676, 18678, RCHAR, 18776, 10828, 18775, 18774, 10829, RCHAR, 10859, 18886, 18909, 18908, 18910, 5940, 12475, RCHAR, 12983, 12984, RCHAR, RCHAR, RCHAR, 14224, RCHAR, 18376, 18777, 5941, 6952, 12476, RCHAR, RCHAR, RCHAR, 13581, 7864, RCHAR, 14226, 14225, 8309, RCHAR, 8734, 16109, 9517, RCHAR, 9518, RCHAR, RCHAR, RCHAR, 9833, 10830, 5942, RCHAR, RCHAR, RCHAR, 12477, 6576, 12479, 12478, 6953, RCHAR, 12985, RCHAR, 12992, 7388, 12990, 12988, RCHAR, 12995, 12986, 12987, 7389, RCHAR, 7393, RCHAR, RCHAR, 12996, 7392, 12994, 12991, 12989, 7390, 7391, 12993, RCHAR, RCHAR, RCHAR, RCHAR, 7866, 13582, RCHAR, 7871, 13598, 7870, 13600, RCHAR, RCHAR, 13588, 7868, 13599, RCHAR, 13583, 7869, 13595, 13591, 13593, 13587, 13594, RCHAR, RCHAR, 7865, 13590, RCHAR, 13589, 13585, RCHAR, 13596, RCHAR, RCHAR, 13592, 13584, RCHAR, 13586, 7867, 13597, RCHAR, RCHAR, RCHAR, RCHAR, 8312, 14237, RCHAR, RCHAR, RCHAR, 14233, 14235, 14230, 14229, 14227, RCHAR, 14234, 14236, 14232, RCHAR, 14231, 8310, 8311, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14239, 8742, 14902, 14908, 14903, 14904, 18958, 14909, RCHAR, 8744, RCHAR, 8736, 8743, 14901, 14228, 8739, 8737, 14907, 14906, 8738, 8740, 14905, 8735, RCHAR, 8741, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15534, 9158, RCHAR, RCHAR, 15545, 15544, RCHAR, 15539, 9160, 15543, 15535, 15536, 9152, 9154, RCHAR, 15541, 15533, 9156, 9155, 15537, 15542, 15540, 9157, 15538, RCHAR, RCHAR, 14238, 9153, RCHAR, RCHAR, 16110, 16117, 9520, RCHAR, 16121, 9524, 16113, 16111, RCHAR, 16120, RCHAR, 9519, 16119, 9521, 9522, 16112, 9523, 16118, 16114, 16115, 16116, 9159, RCHAR, RCHAR, RCHAR, 16690, 16702, RCHAR, 9838, 16697, 16699, RCHAR, 9836, 16691, 16695, RCHAR, 16698, 9834, 9837, 16701, 16693, 16694, 16700, 16692, 16696, 9835, 17163, RCHAR, 17162, 10133, 17168, 10135, RCHAR, RCHAR, 10132, 17164, 10136, 17165, RCHAR, RCHAR, 17166, 17169, RCHAR, 10134, RCHAR, 17543, RCHAR, RCHAR, 17546, RCHAR, 17540, 17542, RCHAR, RCHAR, 17541, 17544, 17545, 17167, 17539, RCHAR, RCHAR, 10469, 17879, 17882, 17884, 17877, 17878, 17881, 17883, 10470, 10468, 10467, 17880, 17876, 18159, 10597, RCHAR, 18160, RCHAR, RCHAR, 18378, 10672, 18380, 10673, 18377, 18379, 10746, RCHAR, 18544, 10745, 18681, 18680, RCHAR, 18679, RCHAR, RCHAR, 18848, 18849, 18851, 18850, RCHAR, 11477, 5943, RCHAR, 6954, 13601, 8313, RCHAR, 14910, 10315, RCHAR, 17885, RCHAR, RCHAR, 6188, RCHAR, RCHAR, RCHAR, 7873, RCHAR, RCHAR, RCHAR, 7872, RCHAR, 14240, 8314, 14242, 14241, RCHAR, RCHAR, 14911, 8745, 15546, 15549, 15548, RCHAR, 15547, 16122, 16124, 16123, RCHAR, 9840, RCHAR, RCHAR, RCHAR, 9839, RCHAR, 10137, 17170, 17172, 17171, RCHAR, RCHAR, 10316, RCHAR, RCHAR, RCHAR, 17887, 17886, RCHAR, 18161, 10598, RCHAR, RCHAR, 10674, 18546, 18545, 10860, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6189, 12480, 6955, 13604, 13602, RCHAR, RCHAR, 13603, 14244, 14245, 14918, 14243, RCHAR, 14912, 14916, 14915, 14917, 8746, 14914, 14913, 14919, RCHAR, 15552, 15550, RCHAR, 15551, 16127, 16125, RCHAR, RCHAR, 16126, 16703, 17173, 17174, 10317, RCHAR, 17888, 18162, 10599, RCHAR, 18381, 18547, 10747, RCHAR, 18682, 18852, 6190, RCHAR, 6957, 6958, 12481, RCHAR, RCHAR, 12482, 6956, RCHAR, 7399, RCHAR, 7397, RCHAR, 7396, 7403, 7395, 7404, 12997, 7401, RCHAR, 7398, 7402, 7400, 7394, RCHAR, RCHAR, 7881, RCHAR, 7875, 13608, 7880, RCHAR, RCHAR, 7882, 7876, RCHAR, 7877, RCHAR, 13606, RCHAR, RCHAR, 7874, RCHAR, 13607, 7879, RCHAR, RCHAR, 13605, 7878, RCHAR, RCHAR, 8325, RCHAR, 8327, RCHAR, RCHAR, 14248, 8326, 8315, 8319, RCHAR, 8765, 14924, 14250, 8320, RCHAR, RCHAR, 14253, 14254, 8324, RCHAR, 14256, RCHAR, 14258, RCHAR, 14259, 14247, 14246, 14260, 8323, 14257, 14255, RCHAR, 8321, 8317, 8328, 14251, 14252, 14249, RCHAR, 8322, RCHAR, RCHAR, 8318, RCHAR, 8316, 14923, 8760, 8755, RCHAR, RCHAR, 8750, RCHAR, 8766, 8751, RCHAR, 8747, 8762, 8759, 8761, RCHAR, 8752, 8757, 8748, 8749, 14931, 14928, 14920, 14925, RCHAR, 8763, 14932, 8764, 8754, RCHAR, RCHAR, 14922, RCHAR, 14930, 14926, 14929, 14927, 8758, 14921, 8753, RCHAR, RCHAR, RCHAR, 15555, 9162, 9165, RCHAR, 15557, RCHAR, 9173, 15556, 9167, RCHAR, 9529, 15558, RCHAR, 9172, 15554, 9174, RCHAR, RCHAR, RCHAR, 9163, RCHAR, 8756, 9166, RCHAR, 9164, 9168, 9170, 9161, 9175, 9171, RCHAR, 9169, 15553, RCHAR, RCHAR, RCHAR, RCHAR, 9536, RCHAR, 9532, RCHAR, RCHAR, RCHAR, 9539, RCHAR, 16130, 9540, 16142, 16135, 9525, 16143, 16137, 9535, 16138, RCHAR, 9534, 16141, 9528, 16139, 16129, 9527, 16714, 9533, RCHAR, 9530, RCHAR, 9538, RCHAR, 16128, RCHAR, 16132, 9526, 16131, 16133, 16134, 9537, 16136, 16140, 16144, RCHAR, 9541, 9846, 16709, 16715, 16712, 16704, 16716, 16705, RCHAR, 16711, RCHAR, 9841, 9847, 16717, RCHAR, RCHAR, 9843, RCHAR, 9853, 9848, 16719, 16713, 9844, 16706, 9854, 16707, 16708, 9855, 9852, 9531, RCHAR, 9842, 16720, 9856, RCHAR, 9849, 16718, 9845, 9850, 9851, RCHAR, 10145, 17179, 17188, 17185, 17187, RCHAR, 10142, 17180, RCHAR, 17186, 10138, 17182, 10146, 17178, 17183, 17190, 16710, 17184, 17177, 10139, 17176, 10140, 17191, 10141, 17189, 10144, 17175, RCHAR, 10143, RCHAR, 17181, 17549, 17563, 17558, 17560, 17548, 10318, RCHAR, 17547, 10321, 10320, RCHAR, 17562, 17554, 17551, 17557, RCHAR, 17550, RCHAR, 17552, 17561, 17559, RCHAR, 10319, 17566, 17564, 17555, 17565, 17556, RCHAR, 17892, 10471, 17899, RCHAR, RCHAR, 18384, 10478, 17553, 17890, 10474, 17891, 17896, RCHAR, RCHAR, 10476, 10477, 17889, 17898, 17900, 17893, 17895, 17897, 17894, 17901, 10473, 10479, 10475, RCHAR, 10472, 18165, RCHAR, 10604, 18163, RCHAR, RCHAR, 18167, RCHAR, 18168, 10602, 18169, 18166, RCHAR, 18164, 10605, 10601, 18170, RCHAR, 10603, 10600, RCHAR, RCHAR, RCHAR, 10675, RCHAR, RCHAR, 10676, 18383, 18382, 18385, 18386, RCHAR, 10677, 18548, 18553, 10748, RCHAR, 18550, RCHAR, 18549, 18552, 18551, RCHAR, 18686, RCHAR, 10798, 18685, 18683, RCHAR, 18684, RCHAR, RCHAR, RCHAR, 10832, 10831, 18778, 18779, 10833, RCHAR, 18853, 18854, 10872, RCHAR, 10878, RCHAR, 18911, 18942, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6191, RCHAR, 13609, RCHAR, 13610, 14933, 15559, 16145, 10148, RCHAR, 10147, 17567, 17902, RCHAR, 18687, 6192, 12998, 7405, 7883, 14935, 14934, 9542, 16146, 9543, 17192, 10322, RCHAR, RCHAR, RCHAR, 10887, 6193, 12037, 12999, RCHAR, RCHAR, 7884, RCHAR, 13611, 13612, RCHAR, 14261, RCHAR, 8329, 8767, RCHAR, 14937, 14936, 14938, RCHAR, 15560, 15561, 9176, 9857, 9544, 9858, RCHAR, 17196, 17193, 17195, 17194, 10149, RCHAR, 17568, 17904, 17903, 11684, 7407, 7406, 13000, RCHAR, 13613, RCHAR, RCHAR, 14263, 14262, 8330, RCHAR, 14940, 14941, 14939, RCHAR, RCHAR, 8769, 8768, RCHAR, 9178, 9177, RCHAR, 16147, 16723, 16721, 16722, 9859, 17198, 17197, RCHAR, 17571, 17570, 17569, 17905, RCHAR, 18912, 6194, 6959, RCHAR, 6960, 7408, 7409, 13002, 13001, 13614, RCHAR, 7890, 7888, 7885, 7889, 7887, 7886, RCHAR, RCHAR, 8331, 14266, RCHAR, 8774, 8333, 8338, 14268, 8340, 8339, 8342, 14267, 14264, 8336, 8332, 8334, 14265, 8341, 8337, 8335, 8776, 8775, 8773, 8777, RCHAR, 8771, 8772, RCHAR, 8770, RCHAR, 14942, RCHAR, RCHAR, 15563, RCHAR, 9180, 9181, 9179, RCHAR, 15562, RCHAR, 15564, RCHAR, 16150, 16152, RCHAR, 9553, 16153, 9546, 16149, 9545, 9555, 9551, 9552, 9548, 16148, 9547, 16154, 16151, RCHAR, 9554, RCHAR, 9549, 9550, 16725, RCHAR, 16727, 16726, RCHAR, 16728, 9860, 16724, RCHAR, RCHAR, 10153, 17199, 10150, 10154, 10152, 10151, 17572, RCHAR, 17575, RCHAR, 17574, RCHAR, 17573, 10323, 17906, 17907, 10480, 17908, 10481, RCHAR, RCHAR, 10607, RCHAR, 10606, 18387, RCHAR, RCHAR, 10678, 18388, 18554, 10749, 10750, RCHAR, 18688, RCHAR, 10835, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6195, RCHAR, 7892, 7891, 14943, 14944, RCHAR, 9182, 16729, 9556, 16730, 17200, 6196, RCHAR, 12483, 6962, 6961, RCHAR, 13003, 7410, 13004, 13617, RCHAR, 13616, RCHAR, 13615, RCHAR, RCHAR, 14270, 8345, RCHAR, RCHAR, 14269, 8344, RCHAR, RCHAR, RCHAR, 14271, 8343, RCHAR, 14946, 14949, 14947, 14948, 14952, 14945, 14953, 14950, 14951, 9184, 15565, RCHAR, RCHAR, 9183, RCHAR, 16158, 16156, RCHAR, RCHAR, 9557, 16155, 16157, RCHAR, 9558, RCHAR, 16731, RCHAR, 16732, 10155, RCHAR, 17910, 17912, 17909, 17911, 18171, 18389, RCHAR, RCHAR, 18887, 6197, 6963, 13005, 13007, 13006, RCHAR, 13620, 7894, RCHAR, 13618, RCHAR, 7893, 13621, RCHAR, 13622, 13619, RCHAR, RCHAR, 14283, 8353, 14275, 14281, RCHAR, RCHAR, 8348, 8351, 14274, 8346, 14278, 14959, 8350, RCHAR, 14273, RCHAR, 14279, 14276, 14282, 14272, 14280, 8349, 8352, 14277, 8347, RCHAR, 8779, 14955, 8778, 14962, 14961, 8785, RCHAR, 8786, 14963, 8780, 14960, 8784, 14965, 14956, RCHAR, 14958, 8781, 14954, 14957, 14964, 8782, 14966, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8783, RCHAR, 9185, 15570, 15576, 15568, 15577, RCHAR, 15567, 15572, 15578, 15575, 15574, 15573, RCHAR, 15566, 15571, RCHAR, RCHAR, 15569, RCHAR, 9563, 9560, 16167, 16172, 16174, 16171, 16164, 16166, 16176, 16173, 16168, 16177, 16165, 16175, 9561, 9567, 9565, 16159, 9566, 9562, 16160, 16162, 16161, 16169, 16170, RCHAR, 9564, RCHAR, 9559, RCHAR, RCHAR, 16163, RCHAR, 16742, 9862, RCHAR, 16733, 9863, 9866, 16738, RCHAR, 16735, 9865, RCHAR, RCHAR, 16739, 16740, 16734, 16743, 16736, 16741, 9864, RCHAR, 9861, 16737, RCHAR, 17206, 10158, 10156, 10159, 10157, 17205, 17202, 17201, RCHAR, 17204, RCHAR, RCHAR, 17203, 17589, 10329, 17580, 17579, RCHAR, 10324, 17585, 17584, 17576, 17587, 17581, 10328, 17578, 17586, 17577, 10325, 10327, 17582, 10326, 17583, RCHAR, 17588, 17916, RCHAR, 10486, 17913, RCHAR, 17917, RCHAR, RCHAR, 10483, 17915, 10488, RCHAR, 10485, RCHAR, 17914, RCHAR, 10487, 17918, 10482, RCHAR, RCHAR, RCHAR, RCHAR, 10609, 10611, RCHAR, 18174, 10610, 18172, 10484, 18173, 10608, 10679, 10681, 18391, 10680, 18390, RCHAR, 18559, 10751, 18558, 10752, 18556, 18555, 18560, 18561, 18689, RCHAR, 18557, RCHAR, RCHAR, 18783, 18780, 18781, 18782, 10861, RCHAR, 18857, 18856, 18855, 18888, RCHAR, 18932, 18913, 10879, 6198, 7411, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 8787, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9568, RCHAR, RCHAR, 16744, RCHAR, RCHAR, 10330, RCHAR, 17919, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18914, 6199, 6577, 6965, 6964, RCHAR, 7414, RCHAR, 13008, 7412, 13009, 7413, RCHAR, RCHAR, 13627, 13623, RCHAR, RCHAR, 7895, 13626, 13625, 13624, 7896, 13628, 13629, RCHAR, RCHAR, RCHAR, 14290, 14288, 14292, 14293, 14299, RCHAR, 14295, 14297, RCHAR, 14289, 14284, RCHAR, 14296, RCHAR, RCHAR, 14298, 14291, 14294, 14285, 8355, 14287, 14286, 8354, 8356, RCHAR, 8790, 14968, 14970, 14969, 14974, 8788, RCHAR, 14971, 14967, 14972, 14973, 8789, 8791, 14975, RCHAR, 15582, 15581, RCHAR, 15579, 15580, 9187, 9189, 9186, 9188, 16184, 16185, 16180, RCHAR, 16181, 9570, 9575, 9569, 9576, 9571, 16182, RCHAR, RCHAR, 16183, 16179, 9577, 9573, RCHAR, RCHAR, 9572, 9574, RCHAR, 16178, RCHAR, 16746, 9868, RCHAR, RCHAR, 16748, 9870, 16751, 16747, 16745, 16750, 9869, 16749, RCHAR, 9867, RCHAR, RCHAR, 10161, 10164, 17208, RCHAR, 10162, 17207, 10160, 10163, 17590, 17591, 17592, 10331, RCHAR, 17593, RCHAR, 10332, 10490, 17922, 17923, 17921, 17920, 17924, 10489, 18178, 18176, 18177, 18179, 18175, 18180, 18393, RCHAR, 18394, 18392, 10682, 18562, 10753, 18563, 18691, 18690, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6200, 8357, RCHAR, RCHAR, 8792, RCHAR, RCHAR, RCHAR, 9190, RCHAR, RCHAR, 9872, RCHAR, 9871, RCHAR, RCHAR, RCHAR, RCHAR, 10491, 10579, 10683, 6201, 7415, 8793, RCHAR, 17925, 10949, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11686, RCHAR, RCHAR, 6202, RCHAR, 6205, 6204, 6203, RCHAR, RCHAR, 11685, RCHAR, 12039, RCHAR, 12041, 6578, RCHAR, RCHAR, 6580, 12038, 12040, 6579, 12043, 12042, 12044, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12487, 12485, 6968, 12484, 6973, 6970, 6967, RCHAR, 6974, RCHAR, 6969, 6972, RCHAR, 6971, 12486, RCHAR, 6966, RCHAR, RCHAR, RCHAR, 7421, 13011, 13017, 7418, 7425, RCHAR, 7420, 13014, 13016, 7423, 13010, 13013, 7419, 7416, 13012, 7422, 13015, 7424, 7417, RCHAR, RCHAR, RCHAR, RCHAR, 13631, 13634, 7898, RCHAR, 7908, 7904, 13632, RCHAR, RCHAR, 7912, 7905, 7910, 7900, RCHAR, 7897, 7899, 7911, 13633, 7903, 7906, 7902, 7907, 13635, 7909, 7901, 13630, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 14300, 8358, 14302, RCHAR, 8360, 8362, RCHAR, 14301, 8359, 8363, RCHAR, 8361, RCHAR, RCHAR, RCHAR, 8799, 14980, 8807, 14977, RCHAR, 8808, 8797, RCHAR, 14978, RCHAR, RCHAR, 8802, RCHAR, 14979, 8795, 8794, RCHAR, 8805, 8804, 8803, 8801, 8806, 14976, 8796, 8798, 8800, RCHAR, RCHAR, 9192, 9195, RCHAR, 9199, 9193, 9198, 9196, RCHAR, 9191, RCHAR, 9197, 9194, RCHAR, RCHAR, RCHAR, 16189, 9580, 9578, RCHAR, 16190, RCHAR, 9581, 9579, 16188, 16187, RCHAR, 9876, 16186, 9874, 9873, 16752, 9582, 9875, 16753, 9878, 16754, 9877, 10166, 17210, 10165, 10170, 10168, 10169, 10334, 10167, 17209, 16755, 10333, 10335, RCHAR, 10492, 10493, RCHAR, 18181, RCHAR, 10800, 10799, 6207, RCHAR, RCHAR, 11482, 7426, RCHAR, 11479, 11480, 11478, RCHAR, 11481, RCHAR, RCHAR, 11690, 11687, 11692, 11688, 6208, 6211, RCHAR, 11689, 6210, 11691, RCHAR, RCHAR, 6209, RCHAR, RCHAR, RCHAR, RCHAR, 12047, 12049, 6583, 12045, 12048, 12046, 6581, 6584, RCHAR, 6582, RCHAR, RCHAR, RCHAR, RCHAR, 12489, 12493, 12490, RCHAR, 6977, RCHAR, 6978, RCHAR, 12492, RCHAR, 12494, 12496, RCHAR, 6975, 12495, RCHAR, RCHAR, 6976, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 13642, 12491, 13018, 13027, 13025, 13020, 13021, 13026, 13028, 7428, RCHAR, 13023, 13019, 7427, 7429, 13022, 13029, 13024, RCHAR, RCHAR, 7913, 13645, 13637, 13643, 13644, 7914, RCHAR, 13636, 13638, 12488, 13640, 13641, 13639, 8365, RCHAR, RCHAR, RCHAR, 14309, 16756, 14310, 14307, 7915, 8367, 14306, 14312, 14311, 8364, 14315, 14305, 14314, 14303, 14313, 14308, 8366, RCHAR, 14987, RCHAR, 14982, 14988, 14983, 14981, 14984, 8809, RCHAR, 14986, RCHAR, 14985, 8810, 9201, 9200, 15589, 15592, 15584, 15588, 9202, 15587, 15585, 15591, 15586, 15583, 15590, RCHAR, 16196, 9585, 17594, 16193, 16194, 16192, 14304, 9584, 16197, 16191, 9583, 9586, 16195, 16757, 9879, 16758, 16759, RCHAR, 17211, 10171, 17595, 17596, RCHAR, RCHAR, 17597, 17927, 17926, 18183, RCHAR, 18182, 18396, 18397, 18395, 18564, 10754, 6212, 6980, 6979, 7432, 7431, 13031, 13032, 13030, RCHAR, 7430, 13649, RCHAR, 13650, 13646, 7916, 13647, RCHAR, 13648, RCHAR, RCHAR, RCHAR, RCHAR, 14318, 14320, 14316, 14319, 8368, 14317, 8369, RCHAR, RCHAR, 14495, 8813, 8812, RCHAR, 8811, RCHAR, 14989, 14990, RCHAR, RCHAR, 15594, 15596, 9206, 9203, RCHAR, 9205, 9204, 15595, 15593, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16204, 16201, 16202, 9590, 16203, 16198, 16199, 9587, RCHAR, 9588, 16200, 9589, RCHAR, 16763, RCHAR, 16764, 16761, 16762, 9880, 16760, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17215, 17212, 17214, 10174, 17218, 10173, 17216, 17219, 17217, 17213, 10172, RCHAR, 17599, RCHAR, 17600, 17598, RCHAR, 17602, 10336, 10337, 17929, 10495, 17601, 17928, 10494, 18186, 18187, 10612, 18185, RCHAR, 18184, RCHAR, 18398, 10684, RCHAR, 18692, 18785, 18784, RCHAR, 10836, 10862, 18786, 18889, RCHAR, 10880, 6213, 6585, RCHAR, 8814, RCHAR, 10613, 6214, 6981, 7917, 8370, 10338, 6586, RCHAR, 12498, 12497, 13033, RCHAR, 7435, 7433, 7437, 13035, RCHAR, 7436, 7434, RCHAR, RCHAR, RCHAR, RCHAR, 13034, 7920, 13656, RCHAR, 7919, 7921, 13661, 7923, 13658, 13659, 13651, 7922, 13662, RCHAR, RCHAR, 13653, RCHAR, 13654, 13652, 7918, RCHAR, 13660, 13655, 13657, RCHAR, RCHAR, RCHAR, 14332, RCHAR, 14331, 14329, 14321, 14336, 14324, 14334, 14341, 14333, 8378, RCHAR, 8374, 14322, RCHAR, 14328, 8376, RCHAR, 14327, 8377, 8379, 14330, RCHAR, 8371, 8372, 14342, 14340, RCHAR, 14339, 14325, RCHAR, 14337, RCHAR, 8375, RCHAR, RCHAR, RCHAR, RCHAR, 8373, 14338, 14323, 14326, 14335, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 15631, 15000, RCHAR, 14993, 15012, 15021, 14996, 8825, RCHAR, 15009, 8815, 8817, 8829, 14994, RCHAR, RCHAR, 8818, 8820, 8830, 8819, RCHAR, RCHAR, RCHAR, RCHAR, 8828, 15002, RCHAR, 14991, 8826, 15001, 8822, 15019, 8827, 15017, 15005, 15015, 8824, 14992, 15018, 15013, RCHAR, 15020, 8816, RCHAR, RCHAR, 8831, 8821, RCHAR, RCHAR, 14998, RCHAR, 15006, 15010, RCHAR, 15014, 8823, 14997, 14995, 15007, RCHAR, RCHAR, RCHAR, RCHAR, 15004, 15003, RCHAR, 15008, 15011, RCHAR, 15016, RCHAR, RCHAR, RCHAR, 15599, RCHAR, 9207, 15609, 15601, 9212, 9216, 15618, 15626, 15611, 9208, RCHAR, 15615, 14999, RCHAR, 9209, 15622, 15627, 15619, RCHAR, 15621, 15630, 15623, 15605, 15614, RCHAR, RCHAR, 9217, RCHAR, 9213, 15603, 15616, 9211, 15610, 9210, 15624, 15607, 15600, 9214, 15629, RCHAR, RCHAR, 15602, 15620, 15617, 15612, 15598, 15597, 15606, 15625, 9215, 15628, 15604, 15608, 9595, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9603, 9598, 16237, 16234, 16210, 9593, RCHAR, 18957, RCHAR, 9592, 9599, RCHAR, RCHAR, RCHAR, 16208, 9597, 16220, 16206, 16207, 9591, 16236, 9601, 16223, 16228, 16222, 16782, 16218, 16226, 16224, 16211, 16205, 16232, 9600, 16233, RCHAR, 16227, RCHAR, 16216, 16214, 16209, RCHAR, RCHAR, RCHAR, 16217, 16230, 16213, 16229, 16235, RCHAR, RCHAR, 9596, RCHAR, 16225, 16231, 16221, 16215, 9594, RCHAR, RCHAR, RCHAR, 15613, 16219, 9602, 16212, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16788, 9883, 16787, 16784, 16803, 9887, RCHAR, 16800, 16792, 16802, 16777, 16790, RCHAR, 9889, RCHAR, 16769, RCHAR, 16767, 16801, RCHAR, 16799, 16798, 16781, 16780, 16770, 9891, RCHAR, 16776, 16786, 16797, 9894, 16804, RCHAR, 10182, 9896, 9890, 16774, RCHAR, 16783, 16766, 16768, 9881, 9893, 9886, 16775, 16791, 16785, 9892, 16765, 10177, 16793, 16796, 9888, RCHAR, 16779, 9895, 9885, RCHAR, RCHAR, RCHAR, 9884, 16789, 16795, 9882, RCHAR, 16772, 16794, RCHAR, RCHAR, 16773, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16778, 17225, RCHAR, 17230, 10179, 10181, 17236, 10175, 17251, 17242, 17231, 17232, 17241, RCHAR, 10188, 17240, 17224, 17239, 17227, 17252, 10187, 10185, 17228, RCHAR, 17247, RCHAR, 17233, 17246, RCHAR, 17248, 17223, 10180, RCHAR, 17249, RCHAR, RCHAR, 17237, RCHAR, 10184, 17234, RCHAR, RCHAR, 10186, 17243, RCHAR, RCHAR, RCHAR, 10178, 17229, 17244, RCHAR, 17238, 16771, 17245, 17226, RCHAR, 10183, RCHAR, 17250, RCHAR, 10176, 17221, RCHAR, RCHAR, RCHAR, RCHAR, 17616, 17609, 10340, RCHAR, 17604, 17619, 17611, 17235, RCHAR, 17621, 17605, RCHAR, 10339, 17615, 10341, 10349, 10347, 17617, 10348, 17607, RCHAR, 17608, 17613, 17618, RCHAR, 17220, 10342, 17626, 17623, 17627, 17614, 17610, 17624, 17940, 17612, RCHAR, 10345, RCHAR, 10344, 17222, 10346, 17620, 17622, 10343, 17625, 17603, RCHAR, 17606, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17949, RCHAR, 17933, 10499, 17947, RCHAR, RCHAR, 17931, 10500, RCHAR, 17942, RCHAR, 17938, 10505, 17948, 17932, 17935, 10497, 17950, RCHAR, 17943, 17946, 10503, 10508, 10506, 17939, 17934, RCHAR, 10501, 10502, 17930, 10498, RCHAR, 10496, 10504, 17945, 10507, RCHAR, 17941, 17951, 10509, RCHAR, RCHAR, RCHAR, 17937, RCHAR, 17944, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18200, 18214, 18202, 18209, 17936, 18207, 18190, 18212, 10616, 18194, 18211, 18201, RCHAR, RCHAR, 10615, RCHAR, RCHAR, 18216, 18203, RCHAR, 18208, 18210, 18188, 18213, 18199, 18204, 18192, 18196, 18215, 18206, 18189, 18193, 18195, 18205, RCHAR, 10614, 18198, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18191, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18197, 18402, 18407, 10691, 18409, RCHAR, 10685, RCHAR, 18405, 18411, 10690, 10686, RCHAR, 10687, 18401, 18408, 10689, 18406, 10688, 18400, 18404, 18403, RCHAR, 18399, 18410, RCHAR, RCHAR, RCHAR, 10755, 18571, 18574, 18570, 18572, 18573, 18567, 18568, 18565, RCHAR, RCHAR, 18569, 18566, 10756, 10757, RCHAR, RCHAR, 18694, RCHAR, 18696, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18695, 18697, RCHAR, 10802, RCHAR, 18693, 10801, 10803, RCHAR, RCHAR, RCHAR, 18788, 18789, 10837, 18787, RCHAR, 18859, 18858, 18860, 10864, 18861, 10863, 18862, 18890, 18893, 18892, 10873, 18891, RCHAR, RCHAR, RCHAR, 10883, 10881, 10882, 10888, 18934, 18935, 18933, 18943, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6587, RCHAR, RCHAR, 13663, 14343, 16238, 17952, RCHAR, RCHAR, 6588, RCHAR, 6982, 7438, RCHAR, RCHAR, 13664, RCHAR, 13665, 7924, RCHAR, 8382, 14345, 14344, 8386, 8381, 14346, 8383, 8385, 8384, 8380, RCHAR, RCHAR, RCHAR, 8832, RCHAR, RCHAR, 15025, 15023, RCHAR, 15024, 15022, RCHAR, 9218, RCHAR, 9221, 9223, 9222, RCHAR, RCHAR, 9219, 9220, RCHAR, 16240, 16239, 9604, 16241, RCHAR, 16242, 9605, RCHAR, RCHAR, RCHAR, 16812, 16810, 17258, RCHAR, 16808, 16809, 9897, 16805, 16813, 16807, 16811, 17254, RCHAR, RCHAR, 17256, RCHAR, 17257, 10193, 17253, 10192, 17255, 10189, 10190, 10191, 16806, RCHAR, RCHAR, 10352, 17630, 17628, 17629, 10350, 10353, 10351, RCHAR, RCHAR, RCHAR, 17953, 17954, 10510, RCHAR, 18217, 18219, 18218, 10617, 10692, 18414, 18413, 18412, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6589, RCHAR, 11376, RCHAR, 11485, 5944, 11483, 11486, 11484, RCHAR, RCHAR, RCHAR, 11694, RCHAR, 6218, RCHAR, 6219, 11696, 6216, 11695, 11693, 6217, 6215, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12050, 12053, 6592, 12052, 12051, RCHAR, 6591, 6590, RCHAR, 6594, 12054, 6593, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 12503, 6984, 6985, 6986, 12504, 12500, 6983, 12501, RCHAR, 12502, 12499, RCHAR, RCHAR, RCHAR, 7445, RCHAR, RCHAR, 7442, 13036, 7443, 7446, 13037, RCHAR, 7441, 7439, 7440, 7444, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7925, 13668, 7933, 13667, RCHAR, 13670, 7929, 13669, 8394, 7927, 7930, 7926, 7931, 7932, 7928, RCHAR, RCHAR, RCHAR, 13666, 8390, 14348, RCHAR, 14352, RCHAR, RCHAR, 14351, 8395, 8391, 8392, 14347, 14349, 14350, 8387, 8389, RCHAR, 8393, 8388, RCHAR, RCHAR, 15028, 15026, 15027, 8834, 8835, RCHAR, 15029, 8833, 9224, RCHAR, 9226, 9225, RCHAR, 15632, RCHAR, RCHAR, 15633, 16244, RCHAR, 16243, RCHAR, RCHAR, 9898, 9899, 16814, 9900, RCHAR, 17261, RCHAR, 17259, RCHAR, 17260, 10194, RCHAR, 17631, 10511, RCHAR, 10950, RCHAR, 10195, 6595, RCHAR, 7447, 13038, RCHAR, RCHAR, 13671, 7934, 8396, 14353, 14355, 8398, 8397, 8399, 8400, 14354, 8838, 8839, 8837, 9227, 8836, 15030, RCHAR, RCHAR, RCHAR, 9228, 16245, 16815, 9901, 10196, 17632, 17636, 10356, 17633, 10357, 10355, 17637, 10358, 17635, RCHAR, 17955, 10354, 10512, RCHAR, 18790, RCHAR, RCHAR, 6596, 7936, 7935, RCHAR, RCHAR, RCHAR, RCHAR, 8401, 14357, 14356, 8402, RCHAR, RCHAR, 15034, 8843, 8840, 15033, 8842, 15031, 8841, RCHAR, 15032, RCHAR, 15634, 9229, RCHAR, 16248, RCHAR, 9606, 16246, 9607, 9608, 16247, 9609, RCHAR, 16816, RCHAR, 9905, 9902, 9907, 16818, 9903, 16817, 9906, RCHAR, RCHAR, 9904, RCHAR, 17264, 17266, RCHAR, RCHAR, 10197, 17265, 10198, 17263, 17262, RCHAR, 17639, 17638, 10359, 17640, 17960, 10514, 17959, 17956, 10513, 17957, 17958, RCHAR, 18220, 18221, 10618, RCHAR, 10695, RCHAR, RCHAR, 18415, RCHAR, RCHAR, 10693, 10694, 18416, RCHAR, RCHAR, 10758, 10759, 18575, RCHAR, RCHAR, 10838, 18792, 10840, RCHAR, 18791, 18793, 10839, 18863, RCHAR, 18915, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6597, RCHAR, RCHAR, RCHAR, 8844, RCHAR, 15635, RCHAR, 16249, 9908, 9909, RCHAR, 6598, RCHAR, 9610, 10515, 6987, RCHAR, RCHAR, RCHAR, 9910, RCHAR, 10804, 6988, 13672, RCHAR, 14358, RCHAR, 14360, RCHAR, 14359, RCHAR, 15038, 15035, 8845, RCHAR, 8846, 15036, 15037, RCHAR, 15637, 15642, 9230, 15636, 15638, 15645, 15640, 15644, 15641, 15639, 15643, 9231, RCHAR, RCHAR, 16252, RCHAR, 16250, 9612, RCHAR, 9611, 16251, 9613, RCHAR, RCHAR, RCHAR, RCHAR, 16821, RCHAR, RCHAR, 16820, 9911, 16819, 17267, RCHAR, 17269, 17271, 17270, RCHAR, 10199, 17268, 17647, 10360, 17645, 17648, 10361, RCHAR, 17643, RCHAR, 17646, 17644, 17641, 10362, 17642, RCHAR, RCHAR, RCHAR, RCHAR, 17961, RCHAR, RCHAR, 17963, 17962, RCHAR, 18222, RCHAR, 18223, RCHAR, RCHAR, RCHAR, 18417, RCHAR, 10761, RCHAR, 10760, 18698, 18699, 10841, 18794, RCHAR, 10874, RCHAR, 6989, 8403, 15647, 15646, 16254, 16253, RCHAR, RCHAR, 10200, 17273, 17272, 17651, 17649, 17652, 17650, RCHAR, RCHAR, 10516, 17964, 17965, 17966, RCHAR, 18418, RCHAR, 18576, RCHAR, 18795, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6990, RCHAR, RCHAR, 16822, 17274, RCHAR, 6991, RCHAR, RCHAR, 9232, RCHAR, 16823, 10363, 17653, 10517, RCHAR, 18224, 18225, 10696, 18700, 6992, 7939, 7940, 13673, 8404, 8405, 14361, 8406, RCHAR, 8850, RCHAR, 8852, 15040, 15041, 15039, 8847, 8848, 8851, 8849, RCHAR, RCHAR, 15648, 9233, 9234, RCHAR, RCHAR, 16261, 9616, 16256, 16255, RCHAR, 16260, 9614, RCHAR, RCHAR, 9918, RCHAR, 16257, 16262, 16259, 16258, RCHAR, 9615, RCHAR, 9916, RCHAR, 16825, 9912, RCHAR, 16826, RCHAR, RCHAR, 16824, RCHAR, 9915, 9913, 9917, RCHAR, 9914, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17275, RCHAR, 17280, 17276, 17279, 10201, RCHAR, 17070, 17278, 17277, RCHAR, 10366, 10364, 10367, 10365, 17654, 17655, 17656, 10368, RCHAR, RCHAR, RCHAR, 17970, 10519, 17968, RCHAR, 10520, 17967, 17969, 10518, 18229, 18226, RCHAR, 18227, 18228, 18419, 10698, RCHAR, 10697, RCHAR, 18578, 18577, 10762, RCHAR, RCHAR, RCHAR, 10805, 10842, 10865, 18864, 18916, 18917, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6993, 14362, RCHAR, RCHAR, 15042, 15649, 15650, 9235, RCHAR, 9236, 16263, 9617, RCHAR, RCHAR, 10202, RCHAR, 17657, RCHAR, 10369, 17973, 10521, 17972, 17974, 17971, 18422, 18230, 18231, RCHAR, 10619, RCHAR, 18421, RCHAR, RCHAR, 18420, RCHAR, 18579, 18918, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6994, RCHAR, RCHAR, RCHAR, 6995, RCHAR, RCHAR, 7448, 13039, RCHAR, 13674, RCHAR, 8407, RCHAR, 8410, 8408, 14363, RCHAR, 8412, RCHAR, 8409, RCHAR, RCHAR, 8411, RCHAR, 8854, RCHAR, 15043, RCHAR, RCHAR, 15044, 16265, RCHAR, 8853, 8855, 8856, RCHAR, 15652, RCHAR, 15651, 9237, RCHAR, 9238, RCHAR, 15653, 16264, 9240, 9618, RCHAR, 9239, RCHAR, RCHAR, RCHAR, 9919, 16266, 9620, 9619, 16267, 16270, 16268, 16269, 9621, RCHAR, 9924, 9922, RCHAR, RCHAR, 9921, 16828, RCHAR, 9923, RCHAR, RCHAR, 16827, 17281, RCHAR, 16829, 9920, 16830, 17284, 17282, 17283, 17288, 10373, 17287, 17290, 17289, 17286, 17285, RCHAR, 10203, RCHAR, RCHAR, RCHAR, RCHAR, 17660, RCHAR, 17659, 10372, 10370, 10371, RCHAR, 17658, RCHAR, 17977, RCHAR, 10522, RCHAR, 17976, 17975, 10523, RCHAR, 18236, 18235, RCHAR, 18233, RCHAR, 18232, 10621, 10620, 18237, 18580, 10763, 18424, 10699, 18423, 18234, RCHAR, 18581, 10806, RCHAR, 10866, 18865, RCHAR, 18919, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 6996, 13675, 17291, 6997, RCHAR, RCHAR, 15655, 15654, 16831, RCHAR, RCHAR, 17293, RCHAR, 17292, RCHAR, 10374, 17978, 17979, 10622, RCHAR, RCHAR, 18920, 7449, 8414, 8413, 15045, 15047, 8858, 15046, 8857, 8859, 15048, RCHAR, RCHAR, RCHAR, 15657, 15659, 15658, RCHAR, 15661, RCHAR, RCHAR, RCHAR, 9241, 15660, 15656, RCHAR, RCHAR, RCHAR, 15662, RCHAR, 16277, RCHAR, 16280, 16282, 16272, 16276, 16273, 9623, 9626, 9628, 16274, 16275, 9627, 16278, 16281, 16279, 9629, RCHAR, 9625, 16271, 9622, RCHAR, 9624, RCHAR, RCHAR, 9926, 16837, 16835, 16834, RCHAR, 16840, RCHAR, 16839, 16838, RCHAR, 16833, 9925, 16832, RCHAR, 16836, 9927, RCHAR, RCHAR, 17296, RCHAR, 17300, 17297, 17299, 17298, 17295, 17301, 17304, 17302, 17303, 10205, RCHAR, 10204, 17294, 17305, 17665, 17668, 17670, 17669, RCHAR, 17663, 17667, 17662, RCHAR, 17664, 10375, 17661, RCHAR, 17666, RCHAR, RCHAR, 17992, 17981, 10524, RCHAR, RCHAR, 10525, 17980, 17985, 17991, 17983, 17990, RCHAR, 17987, RCHAR, 17986, 17989, 17984, 17982, RCHAR, 17988, RCHAR, 18244, 18242, 10623, 18241, 18247, 18245, RCHAR, 10624, 18240, 18238, RCHAR, 18239, 10626, 18243, 10625, 18246, 18425, 18431, RCHAR, RCHAR, 18426, 10703, 18432, 10702, 18430, 18429, 10701, 18428, 10700, 18427, RCHAR, 18587, 18589, 18588, RCHAR, 18585, 10765, 18582, 18586, 18591, RCHAR, 18590, 18583, 18584, 10764, 18701, 10809, RCHAR, 18702, 10807, 10808, RCHAR, RCHAR, 18796, 10843, 18894, RCHAR, 10875, RCHAR, 18921, 10876, 18922, 18923, 18937, 18936, 10891, 18947, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7450, RCHAR, RCHAR, 15050, RCHAR, 15049, RCHAR, 9242, 9243, 15663, RCHAR, 16283, 16843, RCHAR, RCHAR, 9630, 9928, 16841, RCHAR, 16844, 9929, RCHAR, 17306, 16842, 17671, 10376, 17993, RCHAR, RCHAR, RCHAR, 18250, 18248, RCHAR, RCHAR, 18249, RCHAR, RCHAR, 18433, RCHAR, 10704, 18592, 10812, 10766, 10810, 10811, 18797, 10867, RCHAR, 7451, RCHAR, RCHAR, RCHAR, 17672, RCHAR, RCHAR, 13040, RCHAR, 8860, RCHAR, 15664, RCHAR, RCHAR, 9244, 15665, RCHAR, RCHAR, RCHAR, 16285, 16284, 9931, 9631, 9632, RCHAR, 16288, 16287, 16286, RCHAR, RCHAR, 16845, 16848, RCHAR, 16847, 16846, 9930, 17310, 17308, 17307, RCHAR, RCHAR, 17309, RCHAR, 10377, 17674, 17675, 10378, RCHAR, 17673, RCHAR, 17995, 17994, 17997, 10526, 17996, RCHAR, 18251, 18253, 18252, RCHAR, RCHAR, 18434, 18437, 18435, 18436, 18593, 10767, RCHAR, RCHAR, RCHAR, 18703, 18704, 18705, RCHAR, 10844, 10868, 18924, 7452, RCHAR, 9633, 9932, 17676, RCHAR, 18594, RCHAR, RCHAR, 18938, 13041, RCHAR, 10892, 7453, 16849, RCHAR, 17677, RCHAR, 17998, RCHAR, RCHAR, 18438, 18595, 7454, RCHAR, 15666, 15667, RCHAR, 9245, 9246, 16290, 9635, 9634, 16289, RCHAR, 17311, RCHAR, 17678, 17680, 17679, 10381, 10380, 10379, RCHAR, 10706, 18439, RCHAR, 10705, 18597, 18596, RCHAR, 10845, 18798, 7941, 15051, RCHAR, RCHAR, RCHAR, 15670, 15668, 15669, RCHAR, RCHAR, 16299, RCHAR, 16294, 16291, 16298, RCHAR, RCHAR, RCHAR, 16300, RCHAR, RCHAR, 9637, 16297, 16293, RCHAR, RCHAR, 16292, 16296, 16295, 9636, RCHAR, RCHAR, 16860, 16855, 16853, 16862, 16854, RCHAR, 16850, RCHAR, 16856, RCHAR, RCHAR, 16851, 17320, 16852, 16863, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16859, 9933, 16858, 16857, RCHAR, 16861, RCHAR, RCHAR, RCHAR, RCHAR, 17312, 17315, RCHAR, RCHAR, 17314, RCHAR, 17322, 17317, 17321, RCHAR, 17319, 17318, 17316, RCHAR, 17313, RCHAR, 10208, 10207, RCHAR, 10209, 10206, 17323, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17686, 17689, RCHAR, 17687, 17691, RCHAR, RCHAR, RCHAR, 17692, RCHAR, 17684, 10386, 17685, RCHAR, 17683, 17690, RCHAR, 17682, 17681, 10385, 10383, 10382, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17688, 18007, 18013, 10529, 18008, RCHAR, 18011, 18015, 10530, 18010, RCHAR, 18002, RCHAR, 18001, 18014, 18005, RCHAR, 18003, 18012, 18004, 10528, 10527, RCHAR, 17999, 18000, 18009, RCHAR, RCHAR, RCHAR, 18006, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18256, 18259, RCHAR, RCHAR, RCHAR, RCHAR, 10384, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 18257, 18263, 18261, 18255, 18266, RCHAR, 18254, RCHAR, 10628, 18262, RCHAR, RCHAR, RCHAR, 18258, 10627, 18265, RCHAR, RCHAR, 18264, RCHAR, RCHAR, RCHAR, RCHAR, 18442, 18441, RCHAR, RCHAR, RCHAR, 18448, RCHAR, 18444, 18447, 10708, RCHAR, RCHAR, 18445, 18446, RCHAR, 18440, 18443, 10707, RCHAR, RCHAR, RCHAR, 10769, 18608, 18603, 18607, RCHAR, 18610, 18606, RCHAR, 18602, RCHAR, 10771, 18605, 18609, 10770, 18600, 18260, 18604, RCHAR, RCHAR, 18601, RCHAR, 18598, RCHAR, 18599, 10768, 18709, 18711, 18714, 18710, 18715, RCHAR, 18708, RCHAR, 18706, RCHAR, 10813, 18712, 10815, 10814, 18707, 18713, RCHAR, RCHAR, RCHAR, RCHAR, 18803, 10846, 18804, RCHAR, 18802, 18799, RCHAR, RCHAR, 18801, 18800, 18866, RCHAR, RCHAR, RCHAR, RCHAR, 18868, 18867, RCHAR, RCHAR, 18897, RCHAR, 18896, 18895, 18898, RCHAR, 10884, 10885, 18944, 18948, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7942, 14364, 15054, RCHAR, 8861, 15052, RCHAR, RCHAR, 15053, RCHAR, RCHAR, RCHAR, 15671, 15672, 9249, 9247, 15673, 9248, 16305, RCHAR, 16308, 16302, 16309, 16301, 16303, RCHAR, 16304, 16307, RCHAR, RCHAR, 9640, 16312, 16311, 9638, 16306, 16310, 9639, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 16873, RCHAR, 9938, RCHAR, 16868, 9934, RCHAR, 16865, 16871, 16874, RCHAR, 9939, RCHAR, 16870, 16867, 16875, 16866, RCHAR, 16872, 9935, RCHAR, 16864, 9936, RCHAR, 9937, 16869, RCHAR, RCHAR, RCHAR, 17341, 17328, 17329, 17332, 17330, RCHAR, 17324, RCHAR, RCHAR, 17327, 17337, 17331, RCHAR, RCHAR, 10210, RCHAR, 17339, 17336, 10211, 17338, 17325, 17334, 17335, RCHAR, 17333, RCHAR, RCHAR, RCHAR, RCHAR, 17696, 17698, 17701, RCHAR, RCHAR, 17695, RCHAR, 10387, 17703, 17694, 17704, RCHAR, 17700, 17702, 17706, 17699, 17707, 17697, 17693, 10388, RCHAR, 17705, 10389, 10532, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 17326, 18041, 18032, 10534, 18028, 10535, RCHAR, RCHAR, 18037, 18031, 18021, 10533, 18034, 18029, 18030, RCHAR, 18016, 18023, 18038, RCHAR, 18035, RCHAR, 18027, RCHAR, 18039, 18022, 18017, 18036, RCHAR, 18019, 18033, 18024, 18040, 18020, 10531, 18018, 18025, 18026, RCHAR, RCHAR, RCHAR, 18273, RCHAR, 18271, RCHAR, 18276, RCHAR, 18288, 18279, 18272, 18268, 18281, 18274, 18277, 18270, 18284, 18267, 18275, 18280, 18282, 18285, 18269, RCHAR, 18289, 18290, 18283, 18287, 18278, RCHAR, 18464, 18467, RCHAR, 10709, RCHAR, 18466, 18471, 18469, 10710, 18460, 18450, 18449, 10712, 18462, 18463, 18459, 18451, RCHAR, 18456, 18286, RCHAR, 18452, 10711, 18458, RCHAR, 18457, RCHAR, 18453, 18465, RCHAR, 18454, 18615, 18468, 18470, 18461, 18455, 18616, 18618, 18612, 10772, RCHAR, 18625, 18623, 10773, 18622, 18621, 18614, 18611, 18617, 18626, 18613, 18619, RCHAR, 18724, 18729, 18719, 18722, 10816, 18726, RCHAR, 18733, 18620, RCHAR, 18720, 18730, 18734, 18725, 18718, 18728, RCHAR, 18727, 18732, 18731, 18624, 18723, 18717, 18721, 10847, 10848, 18716, RCHAR, 18815, 18806, 18814, 18811, 18812, 18805, 18808, 18816, 18810, 18809, 18807, RCHAR, 18813, RCHAR, 18869, RCHAR, 18870, RCHAR, 18872, 18871, 18874, 18873, 18900, 18899, 18925, RCHAR, 18926, RCHAR, 18939, 10889, 10893, RCHAR, 18949, 10894, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 7943, RCHAR, RCHAR, RCHAR, 10629, 18472, RCHAR, 10849, 10850, RCHAR, 7944, 15055, RCHAR, 8862, 16313, RCHAR, RCHAR, 16877, 16878, 16876, 17343, 17342, 10212, 17709, 17344, 17708, RCHAR, RCHAR, 18043, 10536, 10538, 18042, RCHAR, RCHAR, 10537, RCHAR, 18291, 18293, 18292, 18473, 10713, RCHAR, 10817, 18817, 18875, RCHAR, RCHAR, 18952, 7945, RCHAR, 15674, RCHAR, 9641, RCHAR, RCHAR, RCHAR, 16880, 16879, RCHAR, 17345, RCHAR, RCHAR, RCHAR, 10539, 10630, 18627, 18945, RCHAR, RCHAR, RCHAR, 7946, 9250, RCHAR, 9642, RCHAR, 18044, RCHAR, 18735, 8415, RCHAR, RCHAR, RCHAR, RCHAR, 17346, RCHAR, RCHAR, RCHAR, 10869, 8416, 9643, 10213, 18736, 8417, RCHAR, 16314, 9941, 16881, 16882, RCHAR, 9940, RCHAR, 17347, 10217, 10215, 10216, 10214, 17710, 10390, RCHAR, RCHAR, RCHAR, 18295, 18294, 18297, 18296, 10631, RCHAR, RCHAR, 18474, RCHAR, 18476, 18475, 10714, 18628, RCHAR, 18737, 18738, 10818, 18876, 18901, 10886, RCHAR, 14365, 16883, 17348, 18045, 15056, RCHAR, 17349, 17712, 17711, RCHAR, RCHAR, RCHAR, RCHAR, 18739, 10851, RCHAR, 18877, 18902, RCHAR, RCHAR, RCHAR, 8863, 16315, 16316, RCHAR, 16884, 8864, RCHAR, 10391, 17713, RCHAR, 18478, 10715, 18479, 18477, 18740, RCHAR, 18818, RCHAR, 8865, RCHAR, 17352, 17351, 17350, 17714, RCHAR, RCHAR, 17718, 17717, 17716, 17715, 10392, 18046, 18299, 10632, 18298, 18480, 18631, 18630, 10774, 18629, 18743, 18742, 18741, RCHAR, RCHAR, 9251, RCHAR, 16885, 10218, RCHAR, 18047, 18048, 18632, 18744, RCHAR, RCHAR, 18819, 18878, 18927, 18954, 9252, 10219, 17719, 18049, 18481, 18745, RCHAR, RCHAR, 9645, RCHAR, 17353, 17720, 18050, 18051, 18052, 18304, RCHAR, 18300, 10716, 18303, 18302, 10633, 18301, 10635, RCHAR, 10634, 18483, 18482, 10717, 10718, RCHAR, RCHAR, 10776, 18633, 10775, RCHAR, 18748, 18749, 18747, 18746, 10853, RCHAR, 18820, 18821, 18822, 10852, 18879, 18882, 18881, 18880, RCHAR, RCHAR, 18953, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 9942, RCHAR, RCHAR, 10399, 18305, 18484, RCHAR, 10777, 18634, RCHAR, RCHAR, 18955, RCHAR, RCHAR, RCHAR, 9943, RCHAR, RCHAR, RCHAR, 17354, RCHAR, 18635, RCHAR, 18903, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11210, 11212, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x00A7,0x00B7] -v # seg 1 at pos 21024 5103, 10951, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5120, 5205, 5137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5040, // [0x00F7,0x00F8] -v # seg 5 at pos 21041 5136, 11300, // [0x014B,0x014B] -> [ 11301, 11301] # seg 7 // [0x0153,0x0153] -> [ 11299, 11299] # seg 9 // [0x0250,0x025B] -v # seg 11 at pos 21043 11295, RCHAR, RCHAR, RCHAR, 11297, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11296, // [0x026A,0x026A] -> [ 11303, 11303] # seg 13 // [0x0275,0x0275] -> [ 11298, 11298] # seg 15 // [0x0283,0x028A] -v # seg 17 at pos 21055 11294, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11302, // [0x02C6,0x02CD] -v # seg 19 at pos 21063 10952, 5430, RCHAR, 5428, 5429, 5431, RCHAR, 5123, // [0x02D9,0x02D9] -> [ 5427, 5427] # seg 21 // [0x0391,0x03A1] -> [ 5342, 5358] # seg 23 // [0x03A3,0x03A9] -> [ 5359, 5365] # seg 25 // [0x03B1,0x03C1] -> [ 5366, 5382] # seg 27 // [0x03C3,0x03C9] -> [ 5383, 5389] # seg 29 // [0x0401,0x0401] -> [ 11141, 11141] # seg 31 // [0x0410,0x0415] -> [ 11135, 11140] # seg 33 // [0x0436,0x044F] -> [ 11175, 11200] # seg 35 // [0x0451,0x0451] -> [ 11174, 11174] # seg 37 // [0x2013,0x201D] -v # seg 39 at pos 21071 5046, 5048, RCHAR, RCHAR, RCHAR, 5091, 5092, RCHAR, RCHAR, 5093, 5094, // [0x2025,0x2027] -v # seg 41 at pos 21082 5036, 5035, 5029, // [0x2032,0x203B] -v # seg 43 at pos 21085 5098, RCHAR, RCHAR, 5097, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5102, // [0x20AC,0x20AC] -> [ 5465, 5465] # seg 45 // [0x2103,0x2109] -v # seg 47 at pos 21095 5191, RCHAR, 5119, RCHAR, RCHAR, RCHAR, 5192, // [0x2116,0x2116] -> [ 11259, 11259] # seg 49 // [0x2121,0x2121] -> [ 11260, 11260] # seg 51 // [0x2160,0x2169] -> [ 5268, 5277] # seg 53 // [0x2170,0x2179] -> [ 10916, 10925] # seg 55 // [0x2190,0x2199] -v # seg 57 at pos 21102 5172, 5170, 5173, 5171, RCHAR, RCHAR, 5174, 5175, 5177, 5176, // [0x21B8,0x21B9] -> [ 11202, 11203] # seg 59 // [0x21E7,0x21E7] -> [ 11201, 11201] # seg 61 // [0x2215,0x2235] -v # seg 63 at pos 21112 5182, RCHAR, RCHAR, RCHAR, RCHAR, 5138, RCHAR, RCHAR, RCHAR, 5145, 5158, 5157, RCHAR, RCHAR, 5179, RCHAR, 5178, RCHAR, RCHAR, RCHAR, 5154, 5155, 5162, RCHAR, RCHAR, 5163, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 5165, 5164, // [0x2252,0x2252] -> [ 5146, 5146] # seg 65 // [0x2260,0x2267] -v # seg 67 at pos 21145 5144, 5147, RCHAR, RCHAR, RCHAR, RCHAR, 5142, 5143, // [0x2295,0x2299] -v # seg 69 at pos 21153 5168, RCHAR, RCHAR, RCHAR, 5169, // [0x22A5,0x22A5] -> [ 5156, 5156] # seg 71 // [0x22BF,0x22BF] -> [ 5159, 5159] # seg 73 // [0x2400,0x241F] -> [ 5432, 5463] # seg 75 // [0x2421,0x2421] -> [ 5464, 5464] # seg 77 // [0x2460,0x2469] -> [ 10896, 10905] # seg 79 // [0x2474,0x247D] -> [ 10906, 10915] # seg 81 // [0x2500,0x2502] -v # seg 83 at pos 21158 5236, RCHAR, 5237, // [0x250C,0x251C] -v # seg 85 at pos 21161 5239, RCHAR, RCHAR, RCHAR, 5240, RCHAR, RCHAR, RCHAR, 5241, RCHAR, RCHAR, RCHAR, 5242, RCHAR, RCHAR, RCHAR, 5234, // [0x2524,0x2524] -> [ 5233, 5233] # seg 87 // [0x252C,0x252C] -> [ 5232, 5232] # seg 89 // [0x2534,0x2534] -> [ 5231, 5231] # seg 91 // [0x253C,0x253C] -> [ 5230, 5230] # seg 93 // [0x2550,0x2574] -v # seg 95 at pos 21178 5247, 18990, 18972, 18981, 18963, 18974, 18983, 18965, 18978, 18987, 18969, 18980, 18989, 18971, 5248, 18984, 18966, 5250, 18986, 18968, 18973, 18982, 18964, 18979, 18988, 18970, 5249, 18985, 18967, 5243, 5244, 5246, 5245, 5255, 5256, 5257, 5050, // [0x2581,0x2588] -> [ 5215, 5222] # seg 97 // [0x2589,0x2595] -v # seg 98 at pos 21215 5229, 5228, 5227, 5226, 5225, 5224, 5223, RCHAR, RCHAR, RCHAR, RCHAR, 5235, 5238, // [0x25A0,0x25A1] -v # seg 100 at pos 21228 5115, 5114, // [0x25B2,0x25B3] -v # seg 102 at pos 21230 5108, 5107, // [0x25BC,0x25BD] -v # seg 104 at pos 21232 5117, 5116, // [0x25C6,0x25CF] -v # seg 106 at pos 21234 5113, 5112, RCHAR, RCHAR, RCHAR, 5105, RCHAR, RCHAR, 5109, 5106, // [0x25E2,0x25E5] -v # seg 108 at pos 21244 5251, 5252, 5254, 5253, // [0x2605,0x2606] -v # seg 110 at pos 21248 5111, 5110, // [0x2640,0x2642] -v # seg 112 at pos 21250 5166, RCHAR, 5167, // [0x2E80,0x2E8D] -v # seg 116 at pos 21253 11263, RCHAR, RCHAR, RCHAR, 11264, RCHAR, 11265, 11266, 11267, RCHAR, 11268, RCHAR, 11269, 11270, // [0x2E95,0x2E9D] -v # seg 118 at pos 21267 11271, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11272, 11273, // [0x2EA5,0x2EAE] -v # seg 120 at pos 21276 11274, RCHAR, 11275, RCHAR, RCHAR, 11276, RCHAR, 11277, RCHAR, 11278, // [0x2EB6,0x2EBE] -v # seg 122 at pos 21286 11279, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11280, RCHAR, 11281, // [0x2EC6,0x2EE3] -v # seg 124 at pos 21295 11282, RCHAR, RCHAR, RCHAR, 11283, RCHAR, 11284, 11285, RCHAR, 11286, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11287, 11288, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 11289, RCHAR, RCHAR, RCHAR, RCHAR, 11290, // [0x3021,0x3029] -> [ 5278, 5286] # seg 130 // [0x3038,0x3040] -v # seg 132 at pos 21325 5287, 5288, 5289, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x309B,0x30A0] -v # seg 135 at pos 21334 11261, 11262, 10955, 10956, RCHAR, RCHAR, // [0x30FC,0x3104] -v # seg 138 at pos 21340 10962, 10953, 10954, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x339C,0x33A1] -v # seg 149 at pos 21349 5197, 5198, 5199, RCHAR, RCHAR, 5201, // [0x33CE,0x33D5] -v # seg 153 at pos 21355 5200, RCHAR, RCHAR, 5161, 5160, RCHAR, RCHAR, 5196, // [0xE000,0xE310] -> [ 18997, 19781] # seg 159 // [0xE311,0xEEB7] -> [ 2041, 5023] # seg 160 // [0xEEB8,0xF6B0] -> [ 0, 2040] # seg 161 // [0xF6B1,0xF848] -> [ 10896, 11303] # seg 162 // [0xFA0C,0xFA0D] -v # seg 164 at pos 21363 11314, 14598, // [0xFE30,0xFE6B] -v # seg 166 at pos 21365 5034, 5047, RCHAR, 5049, 5051, 5055, 5056, 5059, 5060, 5063, 5064, 5067, 5068, 5071, 5072, 5075, 5076, 5079, 5080, 5083, 5084, RCHAR, RCHAR, RCHAR, RCHAR, 5124, 5125, 5128, 5129, 5126, 5127, 5052, 5037, 5038, 5039, RCHAR, 5041, 5042, 5043, 5044, RCHAR, 5085, 5086, 5087, 5088, 5089, 5090, 5130, 5131, 5132, 5148, 5149, 5150, 5151, 5152, RCHAR, 5183, 5193, 5194, 5195, // [0xFF01,0xFF0F] -v # seg 168 at pos 21425 5033, 11257, 5099, 5184, 5189, 5100, 11256, 5053, 5054, 5101, 5133, 5025, 5134, 5028, 5180, // [0xFF10,0xFF19] -> [ 5258, 5267] # seg 169 // [0xFF1A,0xFF20] -v # seg 170 at pos 21440 5031, 5030, 5139, 5141, 5140, 5032, 5190, // [0xFF21,0xFF3A] -> [ 5290, 5315] # seg 171 // [0xFF3B,0xFF40] -v # seg 172 at pos 21447 10963, 5181, 10964, RCHAR, 5122, RCHAR, // [0xFF41,0xFF5A] -> [ 5316, 5341] # seg 173 // [0xFF5B,0xFF5E] -v # seg 174 at pos 21453 5057, 5045, 5058, 5153, // [0xFFE0,0xFFE5] -v # seg 176 at pos 21457 5187, 5188, 11254, 5121, 11255, 5185, // [0xFFED,0xFFED] -> [ 18996, 18996] # seg 178 }; // Windows Thai, extends iso-8859-11 const unsigned short CodePageWindows874[54] = { // hot segments (indexes into segment table) 1, 0, // number of segments 6, // segment table 0, 128, 161, 219, 223, 252, // compressed segments 0x0000, RCHAR, 0x0E01, RCHAR, 0x0E3F, RCHAR, // uncompressed segments RCHAR, 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 160] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x0082, 0x0083, 0x0084, 0x2026, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, // [ 161, 218] -> [0x0E01,0x0E3A] # seg 2 // [ 223, 251] -> [0x0E3F,0x0E5B] # seg 4 }; // Reverse const unsigned short CodePageWindows874_R[91] = { // hot segments (indexes into segment table) 1, 0, // number of segments 12, // segment table 0x0000, 0x0080, 0x0081, 0x00A1, 0x0E01, 0x0E3B, 0x0E3F, 0x0E5C, 0x2013, 0x2027, 0x20AC, 0x20AD, // compressed segments 0, RCHAR, RCHAR, RCHAR, 161, RCHAR, 223, RCHAR, RCHAR, RCHAR, 128, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 32, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x00A0] -v # seg 2 at pos 0 129, 130, 131, 132, RCHAR, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 152, 153, 154, 155, 156, 157, 158, 159, 160, // [0x0E01,0x0E3A] -> [ 161, 218] # seg 4 // [0x0E3F,0x0E5B] -> [ 223, 251] # seg 6 // [0x2013,0x2026] -v # seg 8 at pos 32 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, RCHAR, RCHAR, 147, 148, RCHAR, RCHAR, RCHAR, RCHAR, 149, RCHAR, RCHAR, RCHAR, 133, // [0x20AC,0x20AC] -> [ 128, 128] # seg 10 }; // Windows Central Europe const unsigned short CodePageWindows1250[137] = { // hot segments (indexes into segment table) 1, 0, // number of segments 2, // segment table 0, 128, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 255] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, }; // Reverse const unsigned short CodePageWindows1250_R[322] = { // hot segments (indexes into segment table) 1, 0, // number of segments 16, // segment table 0x0000, 0x0080, 0x0081, 0x011C, 0x0139, 0x017F, 0x02C7, 0x02C8, 0x02D8, 0x02DE, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 155, RCHAR, RCHAR, RCHAR, 225, RCHAR, 231, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x011B] -v # seg 2 at pos 0 129, RCHAR, 131, RCHAR, RCHAR, RCHAR, RCHAR, 136, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 152, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 160, RCHAR, RCHAR, RCHAR, 164, RCHAR, 166, 167, 168, 169, RCHAR, 171, 172, 173, 174, RCHAR, 176, 177, RCHAR, RCHAR, 180, 181, 182, 183, 184, RCHAR, RCHAR, 187, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 193, 194, RCHAR, 196, RCHAR, RCHAR, 199, RCHAR, 201, RCHAR, 203, RCHAR, 205, 206, RCHAR, RCHAR, RCHAR, RCHAR, 211, 212, RCHAR, 214, 215, RCHAR, RCHAR, 218, RCHAR, 220, 221, RCHAR, 223, RCHAR, 225, 226, RCHAR, 228, RCHAR, RCHAR, 231, RCHAR, 233, RCHAR, 235, RCHAR, 237, 238, RCHAR, RCHAR, RCHAR, RCHAR, 243, 244, RCHAR, 246, 247, RCHAR, RCHAR, 250, RCHAR, 252, 253, RCHAR, RCHAR, RCHAR, RCHAR, 195, 227, 165, 185, 198, 230, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, 207, 239, 208, 240, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 202, 234, 204, 236, // [0x0139,0x017E] -v # seg 4 at pos 155 197, 229, RCHAR, RCHAR, 188, 190, RCHAR, RCHAR, 163, 179, 209, 241, RCHAR, RCHAR, 210, 242, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 213, 245, RCHAR, RCHAR, 192, 224, RCHAR, RCHAR, 216, 248, 140, 156, RCHAR, RCHAR, 170, 186, 138, 154, 222, 254, 141, 157, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, 219, 251, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 143, 159, 175, 191, 142, 158, // [0x02C7,0x02C7] -> [ 161, 161] # seg 6 // [0x02D8,0x02DD] -v # seg 8 at pos 225 162, 255, RCHAR, 178, RCHAR, 189, // [0x2013,0x203A] -v # seg 10 at pos 231 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 12 // [0x2122,0x2122] -> [ 153, 153] # seg 14 }; // Windows Cyrillic const unsigned short CodePageWindows1251[76] = { // hot segments (indexes into segment table) 1, 0, // number of segments 3, // segment table 0, 128, 192, // compressed segments 0x0000, RCHAR, 0x0410, // uncompressed segments RCHAR, 0x0000, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 191] -v # seg 1 at pos 0 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, // [ 192, 255] -> [0x0410,0x044F] # seg 2 }; // Reverse const unsigned short CodePageWindows1251_R[175] = { // hot segments (indexes into segment table) 1, 0, // number of segments 17, // segment table 0x0000, 0x0080, 0x0098, 0x00BC, 0x0401, 0x0410, 0x0450, 0x0451, 0x0460, 0x0490, 0x0492, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2116, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, 192, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 136, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 36, RCHAR, RCHAR, 51, RCHAR, 66, RCHAR, 68, RCHAR, RCHAR, RCHAR, 108, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0098,0x00BB] -v # seg 2 at pos 0 152, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 160, RCHAR, RCHAR, RCHAR, 164, RCHAR, 166, 167, RCHAR, 169, RCHAR, 171, 172, 173, 174, RCHAR, 176, 177, RCHAR, RCHAR, RCHAR, 181, 182, 183, RCHAR, RCHAR, RCHAR, 187, // [0x0401,0x040F] -v # seg 4 at pos 36 168, 128, 129, 170, 189, 178, 175, 163, 138, 140, 142, 141, RCHAR, 161, 143, // [0x0410,0x044F] -> [ 192, 255] # seg 5 // [0x0451,0x045F] -v # seg 7 at pos 51 184, 144, 131, 186, 190, 179, 191, 188, 154, 156, 158, 157, RCHAR, 162, 159, // [0x0490,0x0491] -v # seg 9 at pos 66 165, 180, // [0x2013,0x203A] -v # seg 11 at pos 68 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 136, 136] # seg 13 // [0x2116,0x2122] -v # seg 15 at pos 108 185, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 153, }; // Windows Latin1, extents iso-8859-1 const unsigned short CodePageWindows1252[44] = { // hot segments (indexes into segment table) 1, 0, // number of segments 3, // segment table 0, 128, 160, // compressed segments 0x0000, RCHAR, 0x00A0, // uncompressed segments RCHAR, 0x0000, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 159] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, // [ 160, 255] -> [0x00A0,0x00FF] # seg 2 }; // Reverse const unsigned short CodePageWindows1252_R[160] = { // hot segments (indexes into segment table) 1, 0, // number of segments 21, // segment table 0x0000, 0x0080, 0x0081, 0x00A0, 0x0100, 0x0152, 0x0162, 0x0178, 0x017F, 0x0192, 0x0193, 0x02C6, 0x02C7, 0x02DC, 0x02DD, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, 160, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 131, RCHAR, 136, RCHAR, 152, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, 31, RCHAR, 47, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 54, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x009F] -v # seg 2 at pos 0 129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 141, RCHAR, 143, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 157, RCHAR, RCHAR, // [0x00A0,0x00FF] -> [ 160, 255] # seg 3 // [0x0152,0x0161] -v # seg 5 at pos 31 140, 156, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 138, 154, // [0x0178,0x017E] -v # seg 7 at pos 47 159, RCHAR, RCHAR, RCHAR, RCHAR, 142, 158, // [0x0192,0x0192] -> [ 131, 131] # seg 9 // [0x02C6,0x02C6] -> [ 136, 136] # seg 11 // [0x02DC,0x02DC] -> [ 152, 152] # seg 13 // [0x2013,0x203A] -v # seg 15 at pos 54 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 17 // [0x2122,0x2122] -> [ 153, 153] # seg 19 }; // Windows Greek const unsigned short CodePageWindows1253[83] = { // hot segments (indexes into segment table) 1, 0, // number of segments 6, // segment table 0, 128, 190, 210, 211, 255, // compressed segments 0x0000, RCHAR, 0x038E, RCHAR, 0x03A3, RCHAR, // uncompressed segments RCHAR, 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 189] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A, 0x2039, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, RCHAR, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, // [ 190, 209] -> [0x038E,0x03A1] # seg 2 // [ 211, 254] -> [0x03A3,0x03CE] # seg 4 }; // Reverse const unsigned short CodePageWindows1253_R[165] = { // hot segments (indexes into segment table) 1, 0, // number of segments 17, // segment table 0x0000, 0x0080, 0x0081, 0x00BE, 0x0192, 0x0193, 0x0384, 0x038E, 0x03A2, 0x03A3, 0x03CF, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, 131, RCHAR, RCHAR, 190, RCHAR, 211, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, 61, RCHAR, RCHAR, RCHAR, RCHAR, 71, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x00BD] -v # seg 2 at pos 0 129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 136, RCHAR, 138, RCHAR, 140, 141, 142, 143, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 152, RCHAR, 154, RCHAR, 156, 157, 158, 159, 160, RCHAR, RCHAR, 163, 164, 165, 166, 167, 168, 169, RCHAR, 171, 172, 173, 174, RCHAR, 176, 177, 178, 179, RCHAR, 181, 182, 183, RCHAR, RCHAR, RCHAR, 187, RCHAR, 189, // [0x0192,0x0192] -> [ 131, 131] # seg 4 // [0x0384,0x038D] -v # seg 6 at pos 61 180, 161, 162, RCHAR, 184, 185, 186, RCHAR, 188, RCHAR, // [0x038E,0x03A1] -> [ 190, 209] # seg 7 // [0x03A3,0x03CE] -> [ 211, 254] # seg 9 // [0x2013,0x203A] -v # seg 11 at pos 71 150, 151, 175, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 13 // [0x2122,0x2122] -> [ 153, 153] # seg 15 }; // Windows Turkish, extents iso-8859-9 const unsigned short CodePageWindows1254[74] = { // hot segments (indexes into segment table) 1, 0, // number of segments 13, // segment table 0, 128, 160, 208, 209, 221, 222, 223, 240, 241, 253, 254, 255, // compressed segments 0x0000, RCHAR, 0x00A0, 0x011E, 0x00D1, 0x0130, 0x015E, 0x00DF, 0x011F, 0x00F1, 0x0131, 0x015F, 0x00FF, // uncompressed segments RCHAR, 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 159] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x009E, 0x0178, // [ 160, 207] -> [0x00A0,0x00CF] # seg 2 // [ 208, 208] -> [0x011E,0x011E] # seg 3 // [ 209, 220] -> [0x00D1,0x00DC] # seg 4 // [ 221, 221] -> [0x0130,0x0130] # seg 5 // [ 222, 222] -> [0x015E,0x015E] # seg 6 // [ 223, 239] -> [0x00DF,0x00EF] # seg 7 // [ 240, 240] -> [0x011F,0x011F] # seg 8 // [ 241, 252] -> [0x00F1,0x00FC] # seg 9 // [ 253, 253] -> [0x0131,0x0131] # seg 10 // [ 254, 254] -> [0x015F,0x015F] # seg 11 // [ 255, 255] -> [0x00FF,0x00FF] # seg 12 }; // Reverse const unsigned short CodePageWindows1254_R[213] = { // hot segments (indexes into segment table) 1, 0, // number of segments 30, // segment table 0x0000, 0x0080, 0x0081, 0x00A0, 0x00D0, 0x00D1, 0x00DF, 0x00F0, 0x00F1, 0x0100, 0x011E, 0x0120, 0x0130, 0x0132, 0x0152, 0x0162, 0x0178, 0x0179, 0x0192, 0x0193, 0x02C6, 0x02C7, 0x02DC, 0x02DD, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, 160, RCHAR, RCHAR, 223, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 159, RCHAR, 131, RCHAR, 136, RCHAR, 152, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, 31, RCHAR, RCHAR, 45, RCHAR, 60, RCHAR, 62, RCHAR, 64, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 80, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x009F] -v # seg 2 at pos 0 129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 141, 142, 143, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 157, 158, RCHAR, // [0x00A0,0x00CF] -> [ 160, 207] # seg 3 // [0x00D1,0x00DE] -v # seg 5 at pos 31 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, RCHAR, RCHAR, // [0x00DF,0x00EF] -> [ 223, 239] # seg 6 // [0x00F1,0x00FF] -v # seg 8 at pos 45 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, RCHAR, RCHAR, 255, // [0x011E,0x011F] -v # seg 10 at pos 60 208, 240, // [0x0130,0x0131] -v # seg 12 at pos 62 221, 253, // [0x0152,0x0161] -v # seg 14 at pos 64 140, 156, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 222, 254, 138, 154, // [0x0178,0x0178] -> [ 159, 159] # seg 16 // [0x0192,0x0192] -> [ 131, 131] # seg 18 // [0x02C6,0x02C6] -> [ 136, 136] # seg 20 // [0x02DC,0x02DC] -> [ 152, 152] # seg 22 // [0x2013,0x203A] -v # seg 24 at pos 80 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 26 // [0x2122,0x2122] -> [ 153, 153] # seg 28 }; // Windows Hebrew const unsigned short CodePageWindows1255[94] = { // hot segments (indexes into segment table) 1, 0, // number of segments 9, // segment table 0, 128, 192, 212, 217, 224, 251, 253, 255, // compressed segments 0x0000, RCHAR, 0x05B0, 0x05F0, RCHAR, 0x05D0, RCHAR, 0x200E, RCHAR, // uncompressed segments RCHAR, 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 191] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x008A, 0x2039, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x009A, 0x203A, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, // [ 192, 211] -> [0x05B0,0x05C3] # seg 2 // [ 212, 216] -> [0x05F0,0x05F4] # seg 3 // [ 224, 250] -> [0x05D0,0x05EA] # seg 5 // [ 253, 254] -> [0x200E,0x200F] # seg 7 }; // Reverse const unsigned short CodePageWindows1255_R[192] = { // hot segments (indexes into segment table) 1, 0, // number of segments 26, // segment table 0x0000, 0x0080, 0x0081, 0x00C0, 0x00D7, 0x00D8, 0x00F7, 0x00F8, 0x0192, 0x0193, 0x02C6, 0x02C7, 0x02DC, 0x02DD, 0x05B0, 0x05C4, 0x05D0, 0x05EB, 0x05F0, 0x05F5, 0x200E, 0x203B, 0x20AA, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, 170, RCHAR, 186, RCHAR, 131, RCHAR, 136, RCHAR, 152, RCHAR, 192, RCHAR, 224, RCHAR, 212, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 63, RCHAR, 108, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x00BF] -v # seg 2 at pos 0 129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 138, RCHAR, 140, 141, 142, 143, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 154, RCHAR, 156, 157, 158, 159, 160, 161, 162, 163, RCHAR, 165, 166, 167, 168, 169, RCHAR, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, RCHAR, 187, 188, 189, 190, 191, // [0x00D7,0x00D7] -> [ 170, 170] # seg 4 // [0x00F7,0x00F7] -> [ 186, 186] # seg 6 // [0x0192,0x0192] -> [ 131, 131] # seg 8 // [0x02C6,0x02C6] -> [ 136, 136] # seg 10 // [0x02DC,0x02DC] -> [ 152, 152] # seg 12 // [0x05B0,0x05C3] -> [ 192, 211] # seg 14 // [0x05D0,0x05EA] -> [ 224, 250] # seg 16 // [0x05F0,0x05F4] -> [ 212, 216] # seg 18 // [0x200E,0x203A] -v # seg 20 at pos 63 253, 254, RCHAR, RCHAR, RCHAR, 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AA,0x20AC] -v # seg 22 at pos 108 164, RCHAR, 128, // [0x2122,0x2122] -> [ 153, 153] # seg 24 }; // Windows Arabic const unsigned short CodePageWindows1256[121] = { // hot segments (indexes into segment table) 1, 0, // number of segments 4, // segment table 0, 128, 193, 215, // compressed segments 0x0000, RCHAR, 0x0621, RCHAR, // uncompressed segments RCHAR, 0x0000, RCHAR, 0x0041, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 192] -v # seg 1 at pos 0 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, 0x06C1, // [ 193, 214] -> [0x0621,0x0636] # seg 2 // [ 215, 255] -v # seg 3 at pos 65 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2, }; // Reverse const unsigned short CodePageWindows1256_R[311] = { // hot segments (indexes into segment table) 1, 0, // number of segments 28, // segment table 0x0000, 0x0080, 0x00A0, 0x00BF, 0x00D7, 0x00FD, 0x0152, 0x0154, 0x0192, 0x0193, 0x02C6, 0x02C7, 0x060C, 0x0621, 0x0637, 0x0653, 0x0679, 0x0699, 0x06A9, 0x06C2, 0x06D2, 0x06D3, 0x200C, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 131, RCHAR, 136, RCHAR, RCHAR, 193, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 255, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, 31, RCHAR, 69, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 71, RCHAR, 92, RCHAR, 120, RCHAR, 152, RCHAR, RCHAR, RCHAR, 177, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x00A0,0x00BE] -v # seg 2 at pos 0 160, RCHAR, 162, 163, 164, 165, 166, 167, 168, 169, RCHAR, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, RCHAR, 187, 188, 189, 190, // [0x00D7,0x00FC] -v # seg 4 at pos 31 215, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 224, RCHAR, 226, RCHAR, RCHAR, RCHAR, RCHAR, 231, 232, 233, 234, 235, RCHAR, RCHAR, 238, 239, RCHAR, RCHAR, RCHAR, RCHAR, 244, RCHAR, RCHAR, 247, RCHAR, 249, RCHAR, 251, 252, // [0x0152,0x0153] -v # seg 6 at pos 69 140, 156, // [0x0192,0x0192] -> [ 131, 131] # seg 8 // [0x02C6,0x02C6] -> [ 136, 136] # seg 10 // [0x060C,0x0620] -v # seg 12 at pos 71 161, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 186, RCHAR, RCHAR, RCHAR, 191, RCHAR, // [0x0621,0x0636] -> [ 193, 214] # seg 13 // [0x0637,0x0652] -v # seg 14 at pos 92 216, 217, 218, 219, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 220, 221, 222, 223, 225, 227, 228, 229, 230, 236, 237, 240, 241, 242, 243, 245, 246, 248, 250, // [0x0679,0x0698] -v # seg 16 at pos 120 138, RCHAR, RCHAR, RCHAR, RCHAR, 129, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 141, RCHAR, 143, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 154, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 142, // [0x06A9,0x06C1] -v # seg 18 at pos 152 152, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 159, RCHAR, RCHAR, RCHAR, 170, RCHAR, RCHAR, 192, // [0x06D2,0x06D2] -> [ 255, 255] # seg 20 // [0x200C,0x203A] -v # seg 22 at pos 177 157, 158, 253, 254, RCHAR, RCHAR, RCHAR, 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 24 // [0x2122,0x2122] -> [ 153, 153] # seg 26 }; // Windows Baltic Rim const unsigned short CodePageWindows1257[137] = { // hot segments (indexes into segment table) 1, 0, // number of segments 2, // segment table 0, 128, // compressed segments 0x0000, RCHAR, // uncompressed segments RCHAR, 0x0000, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 128, 255] -v # seg 1 at pos 0 0x20AC, 0x0081, 0x201A, 0x0083, 0x201E, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008A, 0x2039, 0x008C, 0x00A8, 0x02C7, 0x00B8, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x009A, 0x203A, 0x009C, 0x00AF, 0x02DB, 0x009F, 0x00A0, RCHAR, 0x00A2, 0x00A3, 0x00A4, RCHAR, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9, }; // Reverse const unsigned short CodePageWindows1257_R[342] = { // hot segments (indexes into segment table) 1, 0, // number of segments 14, // segment table 0x0000, 0x0080, 0x0081, 0x017F, 0x02C7, 0x02C8, 0x02D9, 0x02DC, 0x2013, 0x203B, 0x20AC, 0x20AD, 0x2122, 0x2123, // compressed segments 0, RCHAR, RCHAR, RCHAR, 142, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 128, RCHAR, 153, RCHAR, // uncompressed segments RCHAR, RCHAR, 0, RCHAR, RCHAR, RCHAR, 254, RCHAR, 257, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x0081,0x017E] -v # seg 2 at pos 0 129, RCHAR, 131, RCHAR, RCHAR, RCHAR, RCHAR, 136, RCHAR, 138, RCHAR, 140, RCHAR, RCHAR, RCHAR, 144, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 152, RCHAR, 154, RCHAR, 156, RCHAR, RCHAR, 159, 160, RCHAR, 162, 163, 164, RCHAR, 166, 167, 141, 169, RCHAR, 171, 172, 173, 174, 157, 176, 177, 178, 179, 180, 181, 182, 183, 143, 185, RCHAR, 187, 188, 189, 190, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 196, 197, 175, RCHAR, RCHAR, 201, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 211, RCHAR, 213, 214, 215, 168, RCHAR, RCHAR, RCHAR, 220, RCHAR, RCHAR, 223, RCHAR, RCHAR, RCHAR, RCHAR, 228, 229, 191, RCHAR, RCHAR, 233, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 243, RCHAR, 245, 246, 247, 184, RCHAR, RCHAR, RCHAR, 252, RCHAR, RCHAR, RCHAR, 194, 226, RCHAR, RCHAR, 192, 224, 195, 227, RCHAR, RCHAR, RCHAR, RCHAR, 200, 232, RCHAR, RCHAR, RCHAR, RCHAR, 199, 231, RCHAR, RCHAR, 203, 235, 198, 230, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 204, 236, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 206, 238, RCHAR, RCHAR, 193, 225, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 205, 237, RCHAR, RCHAR, RCHAR, 207, 239, RCHAR, RCHAR, RCHAR, RCHAR, 217, 249, 209, 241, 210, 242, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 212, 244, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 170, 186, RCHAR, RCHAR, 218, 250, RCHAR, RCHAR, RCHAR, RCHAR, 208, 240, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 219, 251, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 216, 248, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 202, 234, 221, 253, 222, 254, // [0x02C7,0x02C7] -> [ 142, 142] # seg 4 // [0x02D9,0x02DB] -v # seg 6 at pos 254 255, RCHAR, 158, // [0x2013,0x203A] -v # seg 8 at pos 257 150, 151, RCHAR, RCHAR, RCHAR, 145, 146, 130, RCHAR, 147, 148, 132, RCHAR, 134, 135, 149, RCHAR, RCHAR, RCHAR, 133, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 137, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 139, 155, // [0x20AC,0x20AC] -> [ 128, 128] # seg 10 // [0x2122,0x2122] -> [ 153, 153] # seg 12 }; // koi8 with extra cyrillic letters from koi8-ru const unsigned short CodePageKOI8[120] = { // hot segments (indexes into segment table) 2, 0, 4, // number of segments 5, // segment table 0, 128, 154, 159, 160, // compressed segments 0x0000, RCHAR, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, 0x0060, RCHAR, 0x0000, // [ 0, 127] -> [0x0000,0x007F] # seg 0 // [ 160, 255] -v # seg 4 at pos 0 RCHAR, RCHAR, RCHAR, 0x0451, 0x0454, RCHAR, 0x0456, 0x0457, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0491, 0x045E, RCHAR, RCHAR, RCHAR, RCHAR, 0x0401, 0x0404, RCHAR, 0x0406, 0x0407, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0x0490, 0x040E, 0x00A9, 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A, // [ 154, 158] -v # seg 2 at pos 96 0x00A0, RCHAR, RCHAR, RCHAR, 0x00B7, }; // Reverse const unsigned short CodePageKOI8_R[180] = { // hot segments (indexes into segment table) 2, 0, 8, // number of segments 10, // segment table 0x0000, 0x0080, 0x00A0, 0x00A1, 0x00A9, 0x00AA, 0x00B7, 0x00B8, 0x0400, 0x0492, // compressed segments 0, RCHAR, 154, RCHAR, 191, RCHAR, 158, RCHAR, RCHAR, RCHAR, // uncompressed segments RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 0, RCHAR, // [0x0000,0x007F] -> [ 0, 127] # seg 0 // [0x00A0,0x00A0] -> [ 154, 154] # seg 2 // [0x00A9,0x00A9] -> [ 191, 191] # seg 4 // [0x00B7,0x00B7] -> [ 158, 158] # seg 6 // [0x0400,0x0491] -v # seg 8 at pos 0 RCHAR, 179, RCHAR, RCHAR, 180, RCHAR, 182, 183, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 190, RCHAR, 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209, RCHAR, 163, RCHAR, RCHAR, 164, RCHAR, 166, 167, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 174, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, RCHAR, 189, 173, }; const unsigned short *vtkDICOMCharacterSet::Table[256] = { CodePageASCII, CodePageJISX0201, 0, 0, 0, 0, 0, 0, CodePageISO8859_1, CodePageISO8859_2, CodePageISO8859_3, CodePageISO8859_4, CodePageISO8859_5, CodePageISO8859_6, CodePageISO8859_7, CodePageISO8859_8, CodePageISO8859_9, CodePageISO8859_10, CodePageISO8859_11, CodePageISO8859_13, CodePageISO8859_14, CodePageISO8859_15, CodePageISO8859_16, 0, CodePageKSX1001, CodePageGB18030, 0, 0, 0, 0, 0, 0, CodePageASCII, CodePageJISX0201, CodePageJISX0208, 0, CodePageJISX0212, 0, 0, 0, CodePageISO8859_1, CodePageISO8859_2, CodePageISO8859_3, CodePageISO8859_4, CodePageISO8859_5, CodePageISO8859_6, CodePageISO8859_7, CodePageISO8859_8, CodePageISO8859_9, CodePageISO8859_10, CodePageISO8859_11, CodePageISO8859_13, CodePageISO8859_14, CodePageISO8859_15, CodePageISO8859_16, 0, CodePageKSX1001, CodePageGB18030, 0, 0, 0, 0, 0, 0, 0, CodePageGB18030, CodePageGB18030, CodePageBig5, 0, CodePageJISX0208, CodePageJISX0208, 0, 0, 0, 0, 0, CodePageWindows874, 0, 0, 0, CodePageWindows1250, CodePageWindows1251, CodePageWindows1252, CodePageWindows1253, CodePageWindows1254, CodePageWindows1255, CodePageWindows1256, CodePageWindows1257, 0, 0, CodePageKOI8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; const unsigned short *vtkDICOMCharacterSet::Reverse[256] = { CodePageASCII_R, CodePageJISX0201_R, 0, 0, 0, 0, 0, 0, CodePageISO8859_1_R, CodePageISO8859_2_R, CodePageISO8859_3_R, CodePageISO8859_4_R, CodePageISO8859_5_R, CodePageISO8859_6_R, CodePageISO8859_7_R, CodePageISO8859_8_R, CodePageISO8859_9_R, CodePageISO8859_10_R, CodePageISO8859_11_R, CodePageISO8859_13_R, CodePageISO8859_14_R, CodePageISO8859_15_R, CodePageISO8859_16_R, 0, CodePageKSX1001_R, CodePageGBK_R, 0, 0, 0, 0, 0, 0, CodePageASCII_R, CodePageJISX0201_R, CodePageJISX_R, 0, CodePageJISX_R, 0, 0, 0, CodePageISO8859_1_R, CodePageISO8859_2_R, CodePageISO8859_3_R, CodePageISO8859_4_R, CodePageISO8859_5_R, CodePageISO8859_6_R, CodePageISO8859_7_R, CodePageISO8859_8_R, CodePageISO8859_9_R, CodePageISO8859_10_R, CodePageISO8859_11_R, CodePageISO8859_13_R, CodePageISO8859_14_R, CodePageISO8859_15_R, CodePageISO8859_16_R, 0, CodePageKSX1001_R, CodePageGBK_R, 0, 0, 0, 0, 0, 0, 0, CodePageGB18030_R, CodePageGBK_R, CodePageBig5_R, 0, CodePageJISX_R, CodePageJISX0208_R, 0, 0, 0, 0, 0, CodePageWindows874_R, 0, 0, 0, CodePageWindows1250_R, CodePageWindows1251_R, CodePageWindows1252_R, CodePageWindows1253_R, CodePageWindows1254_R, CodePageWindows1255_R, CodePageWindows1256_R, CodePageWindows1257_R, 0, 0, CodePageKOI8_R, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; vtk-dicom-0.8.12/Source/vtkDICOMCharacterSetTables.h000066400000000000000000000016761356440565500221430ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMCharacterSetTables_h #define vtkDICOMCharacterSetTables_h #include "vtkDICOMCharacterSet.h" // The vtkDICOMCharacterSetTables module contains auto-generated // code for the vtkDICOMCharacterSet class. As such, it does not // provide any classes of its own. //! The unicode "REPLACEMENT CHARACTER" #define RCHAR 0xFFFD #endif /* vtkDICOMCharacterSetTables_h */ // VTK-HeaderTest-Exclude: vtkDICOMCharacterSetTables.h vtk-dicom-0.8.12/Source/vtkDICOMCompiler.cxx000066400000000000000000001316741356440565500205670ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMCompiler.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMFile.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMItem.h" #include "vtkDICOMImageCodec.h" #include "vtkObjectFactory.h" #include "vtkStringArray.h" #include "vtkUnsignedShortArray.h" #include "vtkErrorCode.h" #include #include #include vtkStandardNewMacro(vtkDICOMCompiler); vtkCxxSetObjectMacro(vtkDICOMCompiler, MetaData, vtkDICOMMetaData); char vtkDICOMCompiler::StudyUID[64] = {}; /*---------------------------------------------------------------------------- The top section of this file defines "Encoder" classes that compile the meta data into data elements that can be written to a file. The encoder class hierarchy is as follows: EncoderBase (the base class) Encoder (template specialization for little-endian encoding) DefaultEncoder (encoder for implicit little-endian syntax) LittleEndianEncoder (encoder for explicit little-endian syntax) Encoder (template specialization for big-endian encoding) BigEndianEncoder (encoder for explicit big-endian syntax) The vtkDICOMCompiler utilizes the DefaultEncoder, LittleEndianEncoder, or the BigEndianEncoder depending on the transfer syntax. ----------------------------------------------------------------------------*/ class vtkDICOMCompilerInternalFriendship { public: static bool FlushBuffer(vtkDICOMCompiler *comp, unsigned char* &cp, unsigned char* &ep) { return comp->FlushBuffer(cp, ep); } static void CompileError(vtkDICOMCompiler *comp, const char *message) { return comp->CompileError(message); } static unsigned int ComputePixelDataSize(vtkDICOMCompiler *comp) { return comp->ComputePixelDataSize(); } }; namespace { // Useful constants to replace commonly-used literals. const unsigned short HxFFFE = 0xFFFE; // sequence group const unsigned short HxE000 = 0xE000; // item start const unsigned short HxE00D = 0xE00D; // item end const unsigned short HxE0DD = 0xE0DD; // sequence end const unsigned short Hx0000 = 0x0000; // empty element const unsigned int HxFFFFFFFF = 0xFFFFFFFF; // unknown length // The encoder has two specializations: little-endian, big-endian. const int LE = 0; const int BE = 1; // The encoder types that are available. class DefaultEncoder; class LittleEndianEncoder; class BigEndianEncoder; // The base class for the encoder classes. class EncoderBase { public: // Virtual destructor for completeness. virtual ~EncoderBase() {} // Whether to use implicit VRs (default: explicit VRs). void SetImplicitVR(bool i) { this->ImplicitVR = i; } // Set the instance UID to use. void SetSOPInstanceUID(const char *uid) { this->SOPInstanceUID = uid; }; // Set the series UID to use. void SetSeriesInstanceUID(const char *uid) { this->SeriesInstanceUID = uid; }; // Set the study UID to use. void SetStudyInstanceUID(const char *uid) { this->StudyInstanceUID = uid; }; // Write the data element head, return the length (8 or 12) virtual size_t WriteElementHead( unsigned char* cp, vtkDICOMTag tag, vtkDICOMVR vr, unsigned int vl) = 0; // Write all data elements between iter and iterend. virtual bool WriteElements( unsigned char* &cp, unsigned char* &ep, vtkDICOMDataElementIterator iter, vtkDICOMDataElementIterator iterend) = 0; // Copy bytes from sp to end marker cp into the value "v". // If the parameter "v" is NULL, then it will be ignored. void CopyBuffer( vtkDICOMValue *v, unsigned char *sp, unsigned char *cp); // If there are fewer than "n" bytes left in the buffer, then flush // the buffer and move the write pointer cp to the start of the buffer. bool CheckBuffer( unsigned char* &cp, unsigned char* &ep, size_t n); // Count the number of bytes required to write the specified data, // returns 0xffffffff if size cannot be computed or is larger than // can be stored in a 32-bit unsigned integer. unsigned int DataSize( vtkDICOMDataElementIterator iter, vtkDICOMDataElementIterator iterEnd); protected: // Constructor that initializes all of the members. EncoderBase(vtkDICOMCompiler *comp, int idx) : Compiler(comp), SOPInstanceUID(0), SeriesInstanceUID(0), StudyInstanceUID(0), Index(idx), Depth(0), ImplicitVR(0) {} // the vtkDICOMCompiler::FlushBuffer method is used to refill the buffer vtkDICOMCompiler *Compiler; // the instance UID and series UID const char *SOPInstanceUID; const char *SeriesInstanceUID; const char *StudyInstanceUID; // the instance index to use with the meta data int Index; // the sequence depth int Depth; // if this is set, then VRs are implicit bool ImplicitVR; }; //---------------------------------------------------------------------------- template class Encoder : public EncoderBase { public: // Encode two, four, or eight bytes from unsigned integers. static void PutInt16(unsigned char* ip, unsigned short i); static void PutInt32(unsigned char* ip, unsigned int i); static void PutInt64(unsigned char* ip, unsigned long long i); // Write "n" values from "v" into "ip". static void PutValues(unsigned char *ip, const char *v, size_t n); static void PutValues(unsigned char *ip, const unsigned char *v, size_t n); static void PutValues(unsigned char *ip, const short *v, size_t n); static void PutValues(unsigned char *ip, const unsigned short *v, size_t n); static void PutValues(unsigned char *ip, const int *v, size_t n); static void PutValues(unsigned char *ip, const unsigned int *v, size_t n); static void PutValues(unsigned char *ip, const float *v, size_t n); static void PutValues(unsigned char *ip, const double *v, size_t n); static void PutValues(unsigned char *ip, const vtkDICOMTag *v, size_t n); // Write "n" values into the buffer from the provided pointer. // The buffer will be flushed as necessary. template bool WriteData( unsigned char* &cp, unsigned char* &ep, const T *ptr, size_t n); // write the head of a data element, return length (8 or 12) size_t WriteElementHead( unsigned char* cp, vtkDICOMTag tag, vtkDICOMVR vr, unsigned int vl); // write one data element bool WriteDataElement( unsigned char* &cp, unsigned char* &ep, const vtkDICOMDataElement &elem); // Write all elements from iter to iterend. bool WriteElements( unsigned char* &cp, unsigned char* &ep, vtkDICOMDataElementIterator iter, vtkDICOMDataElementIterator iterend); protected: Encoder(vtkDICOMCompiler *comp, int idx) : EncoderBase(comp, idx) {} private: Encoder() {}; }; //---------------------------------------------------------------------------- // The little-endian implicit-vr encoder. class DefaultEncoder : public Encoder { public: DefaultEncoder(vtkDICOMCompiler *comp, int idx) : Encoder(comp, idx) { this->ImplicitVR = true; } }; // The little-endian encoder. class LittleEndianEncoder : public Encoder { public: LittleEndianEncoder(vtkDICOMCompiler *comp, int idx) : Encoder(comp, idx) {} }; // The big-endian encoder. class BigEndianEncoder : public Encoder { public: BigEndianEncoder(vtkDICOMCompiler *comp, int idx) : Encoder(comp, idx) {} }; //---------------------------------------------------------------------------- inline bool EncoderBase::CheckBuffer( unsigned char* &cp, unsigned char* &ep, size_t n) { bool r = true; if (n > static_cast(ep - cp)) { r = vtkDICOMCompilerInternalFriendship::FlushBuffer( this->Compiler, cp, ep); r &= (n <= static_cast(ep - cp)); } return r; } //---------------------------------------------------------------------------- unsigned int EncoderBase::DataSize( vtkDICOMDataElementIterator iter, vtkDICOMDataElementIterator iterEnd) { unsigned int l = 0; while (iter != iterEnd) { const vtkDICOMValue &v = iter->GetValue(this->Index); vtkDICOMVR vr = v.GetVR(); unsigned int vl = v.GetVL(); if (vr == vtkDICOMVR::SQ) { size_t n = v.GetNumberOfValues(); const vtkDICOMItem *ptr = v.GetSequenceData(); for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++) { unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End()); // check for overflow or ll == 0xffffffff if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8) { vl = HxFFFFFFFF; } else { vl += ll + 8; } } } // terminate if length is unknown if (vl == HxFFFFFFFF) { l = vl; break; } // force vl to even assert((vl & 1) == 0); vl += (vl & 1); // get header size unsigned int hl = (this->ImplicitVR || !vr.HasLongVL() ? 8 : 12); // check for overflow if (HxFFFFFFFF - l <= vl || HxFFFFFFFF - l - vl <= hl) { l = HxFFFFFFFF; break; } l += vl + hl; ++iter; } return l; } //---------------------------------------------------------------------------- template<> inline void Encoder::PutInt16(unsigned char *op, unsigned short i) { op[0] = static_cast(i); op[1] = static_cast(i >> 8); } template<> inline void Encoder::PutInt32(unsigned char *op, unsigned int i) { op[0] = static_cast(i); op[1] = static_cast(i >> 8); op[2] = static_cast(i >> 16); op[3] = static_cast(i >> 24); } template<> inline void Encoder::PutInt64(unsigned char *op, unsigned long long i) { op[0] = static_cast(i); op[1] = static_cast(i >> 8); op[2] = static_cast(i >> 16); op[3] = static_cast(i >> 24); i >>= 32; op[4] = static_cast(i); op[5] = static_cast(i >> 8); op[6] = static_cast(i >> 16); op[7] = static_cast(i >> 24); } template<> inline void Encoder::PutInt16(unsigned char *op, unsigned short i) { op[0] = static_cast(i >> 8); op[1] = static_cast(i); } template<> inline void Encoder::PutInt32(unsigned char *op, unsigned int i) { op[0] = static_cast(i >> 24); op[1] = static_cast(i >> 16); op[2] = static_cast(i >> 8); op[3] = static_cast(i); } template<> inline void Encoder::PutInt64(unsigned char *op, unsigned long long i) { unsigned int j = static_cast(i >> 32); op[0] = static_cast(j >> 24); op[1] = static_cast(j >> 16); op[2] = static_cast(j >> 8); op[3] = static_cast(j); j = static_cast(i); op[4] = static_cast(j >> 24); op[5] = static_cast(j >> 16); op[6] = static_cast(j >> 8); op[7] = static_cast(j); } //---------------------------------------------------------------------------- template void Encoder::PutValues( unsigned char *op, const char *ip, size_t n) { do { *op++ = static_cast(*ip++); } while (--n); } template void Encoder::PutValues( unsigned char *op, const unsigned char *ip, size_t n) { do { *op++ = *ip++; } while (--n); } template void Encoder::PutValues( unsigned char *op, const short *ip, size_t n) { do { Encoder::PutInt16(op, *ip); ip++; op += 2; } while (--n); } template void Encoder::PutValues( unsigned char *op, const unsigned short *ip, size_t n) { do { Encoder::PutInt16(op, *ip); ip++; op += 2; } while (--n); } template void Encoder::PutValues( unsigned char *op, const int *ip, size_t n) { do { Encoder::PutInt32(op, *ip); ip++; op += 4; } while (--n); } template void Encoder::PutValues( unsigned char *op, const unsigned int *ip, size_t n) { do { Encoder::PutInt32(op, *ip); ip++; op += 4; } while (--n); } template void Encoder::PutValues( unsigned char *op, const float *ip, size_t n) { union { float f; unsigned int i; } u; do { u.f = *ip; Encoder::PutInt32(op, u.i); ip++; op += 4; } while (--n); } template void Encoder::PutValues( unsigned char *op, const double *ip, size_t n) { union { double d; unsigned long long l; } u; do { u.d = *ip; Encoder::PutInt64(op, u.l); ip++; op += 8; } while (--n); } template void Encoder::PutValues( unsigned char *op, const vtkDICOMTag *ip, size_t n) { do { Encoder::PutInt16(op, ip->GetGroup()); Encoder::PutInt16(op+2, ip->GetElement()); ip++; op += 4; } while (--n); } //---------------------------------------------------------------------------- // Write "n" elements of type "T". template template bool Encoder::WriteData( unsigned char* &cp, unsigned char* &ep, const T *ptr, size_t n) { while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T))) { size_t m = (ep - cp)/sizeof(T); if (m > n) { m = n; } Encoder::PutValues(cp, ptr, m); cp += m*sizeof(T); ptr += m; n -= m; } return (n == 0); } //---------------------------------------------------------------------------- template size_t Encoder::WriteElementHead( unsigned char* cp, vtkDICOMTag tag, vtkDICOMVR vr, unsigned int vl) { const char *vrt = vr.GetText(); size_t hl = 8; // data element head length Encoder::PutInt16(cp, tag.GetGroup()); Encoder::PutInt16(cp+2, tag.GetElement()); cp[4] = vrt[0]; cp[5] = vrt[1]; Encoder::PutInt16(cp+6, static_cast(vl)); if (this->ImplicitVR) { Encoder::PutInt32(cp+4, vl); } else if (vr.HasLongVL()) { hl = 12; cp[6] = 0; cp[7] = 0; Encoder::PutInt32(cp+8, vl); } else if (vl > 65534) { // CP-1066 allows overlength values to be written as UN hl = 12; cp[4] = 'U'; cp[5] = 'N'; cp[6] = 0; cp[7] = 0; Encoder::PutInt32(cp+8, vl); } return hl; } //---------------------------------------------------------------------------- template bool Encoder::WriteDataElement( unsigned char* &cp, unsigned char* &ep, const vtkDICOMDataElement &elem) { vtkDICOMTag tag = elem.GetTag(); const vtkDICOMValue &v = elem.GetValue(this->Index); vtkDICOMVR vr = v.GetVR(); unsigned int vl = v.GetVL(); // do not write invalid values if (!v.IsValid()) { return true; } // handle elements of unknown length if (vl == HxFFFFFFFF) { if (vr == vtkDICOMVR::UN || vr == vtkDICOMVR::OB) { // if VR is UN then it is a sequence encoded as implicit LE // (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation) // if VR is OB then it is a sequence of fragments // (see DICOM Part 5, Annex A.4 and Table A.4-1) #ifndef NDEBUG // make sure sequence end delimiter is present size_t n = v.GetNumberOfValues(); const unsigned char *ptr = v.GetUnsignedCharData(); assert(n > 8); assert(ptr[n-8] + (ptr[n-7] << 8) == HxFFFE && ptr[n-6] + (ptr[n-5] << 8) == HxE0DD); assert(ptr[n-4] + (ptr[n-3] << 8) + (ptr[n-2] << 16) + (ptr[n-1] << 24) == 0); #endif } else if (vr != vtkDICOMVR::SQ) { // only UN, OB, and SQ can have unknown length vtkDICOMCompilerInternalFriendship::CompileError( this->Compiler, "Illegal item length 0xFFFFFFFF encountered."); return false; } } else if (vr == vtkDICOMVR::SQ) { // compute the true vl for the sequence size_t n = v.GetNumberOfValues(); const vtkDICOMItem *ptr = v.GetSequenceData(); for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++) { unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End()); // check for overflow or ll == 0xffffffff if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8) { vl = HxFFFFFFFF; } else { vl += ll + 8; } } } else { // vl must be even assert((vl & 1) == 0); vl += (vl & 1); } // write the data element head (tag, vr, vl) if (!this->CheckBuffer(cp, ep, 12)) { return false; } cp += this->Encoder::WriteElementHead(cp, tag, vr, vl); // write the value bool r = true; switch (vr.GetType()) { case VTK_CHAR: { const char *ptr = v.GetCharData(); r = this->WriteData(cp, ep, ptr, vl); break; } case VTK_UNSIGNED_CHAR: { size_t n = vl; if (vl == HxFFFFFFFF) { n = v.GetNumberOfValues(); n += (n & 1); } const unsigned char *ptr = v.GetUnsignedCharData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_SHORT: { size_t n = vl/sizeof(short); const short *ptr = v.GetShortData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_UNSIGNED_SHORT: { size_t n = vl/sizeof(unsigned short); const unsigned short *ptr = v.GetUnsignedShortData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_INT: { size_t n = vl/sizeof(int); const int *ptr = v.GetIntData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_UNSIGNED_INT: { size_t n = vl/sizeof(unsigned int); const unsigned int *ptr = v.GetUnsignedIntData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_FLOAT: { size_t n = vl/sizeof(float); const float *ptr = v.GetFloatData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_DOUBLE: { size_t n = vl/sizeof(double); const double *ptr = v.GetDoubleData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_DICOM_TAG: { size_t n = vl/sizeof(vtkDICOMTag); const vtkDICOMTag *ptr = v.GetTagData(); r = this->WriteData(cp, ep, ptr, n); break; } case VTK_DICOM_ITEM: { size_t n = v.GetNumberOfValues(); const vtkDICOMItem *ptr = v.GetSequenceData(); for (size_t i = 0; i < n && r; i++) { unsigned int il = 0xFFFFFFFF; if (!ptr[i].IsDelimited()) { // compute the bytes in the item il = this->DataSize(ptr[i].Begin(), ptr[i].End()); } if ((r = this->CheckBuffer(cp, ep, 8)) == false) { break; } // item start Encoder::PutInt16(cp, HxFFFE); Encoder::PutInt16(cp+2, HxE000); Encoder::PutInt32(cp+4, il); cp += 8; this->Depth++; r = this->WriteElements(cp, ep, ptr[i].Begin(), ptr[i].End()); this->Depth--; if (il == HxFFFFFFFF && r) { if ((r = this->CheckBuffer(cp, ep, 8)) == false) { break; } // item delimiter Encoder::PutInt16(cp, HxFFFE); Encoder::PutInt16(cp+2, HxE00D); Encoder::PutInt32(cp+4, 0); cp += 8; } } if (vl == HxFFFFFFFF && r) { if ((r = this->CheckBuffer(cp, ep, 8)) != false) { // sequence delimiter Encoder::PutInt16(cp, HxFFFE); Encoder::PutInt16(cp+2, HxE0DD); Encoder::PutInt32(cp+4, 0); cp += 8; } } break; } } return r; } //---------------------------------------------------------------------------- template bool Encoder::WriteElements( unsigned char* &cp, unsigned char* &ep, vtkDICOMDataElementIterator iter, vtkDICOMDataElementIterator iterEnd) { while (iter != iterEnd) { // check for group length tag and length-to-end tag if (iter->GetTag().GetElement() == Hx0000 || iter->GetTag() == vtkDICOMTag(0x0008, 0x0001)) { unsigned short group = iter->GetTag().GetGroup(); unsigned int groupLength = HxFFFFFFFF; vtkDICOMDataElementIterator groupEnd = iter; if (iter->GetTag().GetElement() == Hx0000) { groupEnd = ++iter; while (groupEnd != iterEnd && groupEnd->GetTag().GetGroup() == group) { ++groupEnd; } groupLength = this->DataSize(iter, groupEnd); } // check for retired LengthToEnd tag unsigned int lengthToEnd = HxFFFFFFFF; bool hadLengthToEnd = false; if (group == 0x0008 && iter != iterEnd && iter->GetTag() == vtkDICOMTag(0x0008, 0x0001)) { hadLengthToEnd = true; lengthToEnd = this->DataSize(++iter, iterEnd); } // check for uncounted PixelData element size in 0x7FE0 group if (this->Depth == 0 && ((groupLength != HxFFFFFFFF && group == 0x7FE0 && iterEnd == groupEnd) || lengthToEnd != HxFFFFFFFF)) { // add the size of the missing PixelData element unsigned int pl = vtkDICOMCompilerInternalFriendship::ComputePixelDataSize( this->Compiler); unsigned int hl = (this->ImplicitVR ? 8 : 12); // check for overflow of lengthToEnd if (HxFFFFFFFF - lengthToEnd <= pl || HxFFFFFFFF - lengthToEnd - pl <= hl) { lengthToEnd = HxFFFFFFFF; } else { lengthToEnd += pl + hl; } // check for overflow of groupLength if (group == 0x7FE0) { if (HxFFFFFFFF - groupLength <= pl || HxFFFFFFFF - groupLength - pl <= hl) { groupLength = HxFFFFFFFF; } else { groupLength += pl + hl; } } } if (groupLength != HxFFFFFFFF) { // subtract the size of LengthToEnd element if it is invalid if (lengthToEnd == HxFFFFFFFF && hadLengthToEnd) { groupLength -= 12; } // write out group length with correct value this->WriteDataElement(cp, ep, vtkDICOMDataElement(vtkDICOMTag(group, 0x0000), vtkDICOMValue(vtkDICOMVR::UL, groupLength))); } if (lengthToEnd != HxFFFFFFFF) { // write out LengthToEnd with correct value this->WriteDataElement(cp, ep, vtkDICOMDataElement(vtkDICOMTag(0x0008, 0x0001), vtkDICOMValue(vtkDICOMVR::UL, lengthToEnd))); } } else if (this->Depth == 0 && this->SOPInstanceUID && iter->GetTag() == vtkDICOMTag(DC::SOPInstanceUID)) { this->WriteDataElement(cp, ep, vtkDICOMDataElement( vtkDICOMTag(DC::SOPInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, this->SOPInstanceUID))); ++iter; } else if (this->Depth == 0 && this->SeriesInstanceUID && iter->GetTag() == vtkDICOMTag(DC::SeriesInstanceUID)) { this->WriteDataElement(cp, ep, vtkDICOMDataElement( vtkDICOMTag(DC::SeriesInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, this->SeriesInstanceUID))); ++iter; } else if (this->Depth == 0 && this->StudyInstanceUID && iter->GetTag() == vtkDICOMTag(DC::StudyInstanceUID)) { this->WriteDataElement(cp, ep, vtkDICOMDataElement( vtkDICOMTag(DC::StudyInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, this->StudyInstanceUID))); ++iter; } else { this->WriteDataElement(cp, ep, *iter); ++iter; } } return true; } } // end anonymous namespace //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // Constructor vtkDICOMCompiler::vtkDICOMCompiler() { this->FileName = NULL; this->SOPInstanceUID = NULL; this->SeriesInstanceUID = NULL; this->StudyInstanceUID = NULL; this->ImplementationClassUID = NULL; this->ImplementationVersionName = NULL; this->SourceApplicationEntityTitle = NULL; this->TransferSyntaxUID = NULL; this->MetaData = NULL; this->OutputFile = NULL; this->Buffer = NULL; this->BufferSize = 8192; this->ChunkSize = 0; this->Index = 0; this->FrameCounter = 0; this->FrameData = 0; this->FrameLength = 0; this->BigEndian = false; this->Compressed = false; this->KeepOriginalPixelDataVR = false; this->ErrorCode = 0; this->SeriesUIDs = 0; // This is our default implementation UID const char *impuid = vtkDICOMUtilities::GetImplementationClassUID(); this->ImplementationClassUID = new char[strlen(impuid) + 1]; strcpy(this->ImplementationClassUID, impuid); // This is our default implementation name const char *impname = vtkDICOMUtilities::GetImplementationVersionName(); this->ImplementationVersionName = new char[strlen(impname) + 1]; strcpy(this->ImplementationVersionName, impname); // This is our default transfer syntax const char *tsyntax = "1.2.840.10008.1.2.1"; this->TransferSyntaxUID = new char[strlen(tsyntax) + 1]; strcpy(this->TransferSyntaxUID, tsyntax); } //---------------------------------------------------------------------------- // Destructor vtkDICOMCompiler::~vtkDICOMCompiler() { this->Close(); delete [] this->FileName; delete [] this->SOPInstanceUID; delete [] this->SeriesInstanceUID; delete [] this->StudyInstanceUID; delete [] this->ImplementationClassUID; delete [] this->ImplementationVersionName; delete [] this->SourceApplicationEntityTitle; delete [] this->TransferSyntaxUID; if (this->MetaData) { this->MetaData->Delete(); } if (this->SeriesUIDs) { this->SeriesUIDs->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMCompiler::SetBufferSize(int size) { if (size < 256) { size = 256; } if (size > (2147483647 - 8)) { size = (2147483647 - 8); } if (this->BufferSize != size) { this->BufferSize = size; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMCompiler::GenerateSeriesUIDs() { if (this->SeriesUIDs == 0) { this->SeriesUIDs = vtkStringArray::New(); } this->SeriesUIDs->Initialize(); if (this->MetaData) { int n = this->MetaData->GetNumberOfInstances(); this->SeriesUIDs->SetNumberOfValues(n + 1); // allocate n+1 this->SeriesUIDs->SetNumberOfValues(n); // but set to n values vtkDICOMUtilities::GenerateUIDs(DC::SOPInstanceUID, this->SeriesUIDs); this->SeriesUIDs->InsertNextValue( vtkDICOMUtilities::GenerateUID(DC::SeriesInstanceUID)); } } //---------------------------------------------------------------------------- void vtkDICOMCompiler::WriteHeader() { this->FrameCounter = 0; this->WriteFile(this->MetaData, this->Index); } //---------------------------------------------------------------------------- void vtkDICOMCompiler::Close() { if (this->Compressed && this->FrameCounter > 0) { this->WriteFragments(); } if (this->OutputFile) { this->OutputFile->Close(); delete this->OutputFile; this->OutputFile = NULL; } } //---------------------------------------------------------------------------- void vtkDICOMCompiler::CloseAndRemove() { if (this->Compressed && this->FrameCounter > 0) { this->FreeFragments(); } if (this->OutputFile) { this->OutputFile->Close(); delete this->OutputFile; this->OutputFile = NULL; vtkDICOMFile::Remove(this->FileName); } } //---------------------------------------------------------------------------- bool vtkDICOMCompiler::WriteFragments() { bool fileError = false; if (this->OutputFile && this->ErrorCode == 0) { // Compressed frames unsigned int numFrames = this->FrameCounter; size_t n = 0; // Offset table: // - Item tag (FFFE, E000) // - Length of table in bytes (4 bytes) // - Offsets to frames(4 bytes each) unsigned int tableLength = 4*numFrames; unsigned char *buffer = new unsigned char[8 + tableLength]; Encoder::PutInt16(buffer, HxFFFE); Encoder::PutInt16(buffer+2, HxE000); Encoder::PutInt32(buffer+4, tableLength); const unsigned int maxOffset = HxFFFFFFFF - 1; unsigned int offset = 0; for (unsigned int i = 0; i < numFrames; i++) { Encoder::PutInt32(buffer + 8 + i*4, offset); // make sure offsets don't exceed 32-bit limit if (maxOffset - offset >= this->FrameLength[i]) { offset += this->FrameLength[i]; } else { tableLength = 0; vtkDICOMUtilities::PackUnsignedInt(tableLength, buffer + 4); break; } } // write the offset table to the file n = this->OutputFile->Write(buffer, tableLength + 8); if (n < tableLength + 8) { fileError = true; } for (unsigned int i = 0; i < numFrames && !fileError; i++) { // Fragment value header // - Item tag (FFFE, E000) // - Length of item in bytes (4 bytes) Encoder::PutInt16(buffer, HxFFFE); Encoder::PutInt16(buffer+2, HxE000); Encoder::PutInt32(buffer+4, this->FrameLength[i]); n = this->OutputFile->Write(buffer, 8); if (n < 8) { fileError = true; break; } // - Fragment data assert((this->FrameLength[i] & 1) == 0); n = this->OutputFile->Write(this->FrameData[i], this->FrameLength[i]); if (n < this->FrameLength[i]) { fileError = true; break; } } if (!fileError) { // After final fragment: // - Sequence delimiter tag (FFFE, E0DD) // - Zero length Encoder::PutInt16(buffer, HxFFFE); Encoder::PutInt16(buffer+2, HxE0DD); Encoder::PutInt32(buffer+4, 0); n = this->OutputFile->Write(buffer, 8); if (n < 8) { fileError = true; } } delete [] buffer; } this->FreeFragments(); if (fileError) { this->DiskFullError(); } return !fileError; } //---------------------------------------------------------------------------- void vtkDICOMCompiler::FreeFragments() { unsigned int numFrames = this->FrameCounter; for (unsigned int i = 0; i < numFrames; i++) { delete [] this->FrameData[i]; } delete [] this->FrameData; delete [] this->FrameLength; this->FrameData = 0; this->FrameCounter = 0; } //---------------------------------------------------------------------------- bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx) { // Check that the file name has been set. if (!this->FileName) { this->SetErrorCode(vtkErrorCode::NoFileNameError); vtkErrorMacro("WriteFile: No file name has been set"); return false; } // Generate fresh UIDs if at index zero if ((this->SOPInstanceUID == 0 || this->SeriesInstanceUID == 0) && (idx == 0 || this->SeriesUIDs == 0 || this->SeriesUIDs->GetNumberOfValues() != data->GetNumberOfInstances() + 1)) { this->GenerateSeriesUIDs(); } this->OutputFile = new vtkDICOMFile(this->FileName, vtkDICOMFile::Out); if (this->OutputFile->GetError()) { this->SetErrorCode(vtkErrorCode::CannotOpenFileError); const char *errText = "Can't open the file "; if (this->OutputFile->GetError() == vtkDICOMFile::AccessDenied) { errText = "No permission to write the file "; } else if (this->OutputFile->GetError() == vtkDICOMFile::FileIsDirectory) { errText = "The selected file is a directory "; } delete this->OutputFile; this->OutputFile = 0; vtkErrorMacro("WriteFile: " << errText << this->FileName); return false; } this->Buffer = new unsigned char [this->BufferSize]; // guard against anyone changing BufferSize while compiling the file this->ChunkSize = this->BufferSize; unsigned char *cp = this->Buffer; unsigned char *ep = cp + this->ChunkSize; // variable to keep track of return values bool r = true; // only write preamble and meta header if transfer syntax is set if (this->TransferSyntaxUID != 0) { // write the preamble memset(cp, '\0', 128); cp += 128; cp[0] = 'D'; cp[1] = 'I'; cp[2] = 'C'; cp[3] = 'M'; cp += 4; r = this->WriteMetaHeader(cp, ep, data, idx); } if (r) { r = this->WriteMetaData(cp, ep, data, idx); } if (r) { r = this->FlushBuffer(cp, ep); } delete [] this->Buffer; // delete the file if an error occurred if (!r) { if (this->GetErrorCode() == vtkErrorCode::NoError) { this->DiskFullError(); } else { this->CloseAndRemove(); } } return r; } //---------------------------------------------------------------------------- void vtkDICOMCompiler::WritePixelData(const unsigned char *cp, vtkIdType size) { if (this->OutputFile == 0) { return; } size_t n = this->OutputFile->Write(cp, size); if (n != static_cast(size)) { this->DiskFullError(); } } //---------------------------------------------------------------------------- void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size) { if (this->OutputFile == 0) { return; } union { char c[2]; short s; } endiancheck; // this will set endiancheck.s to 1 on little endian architectures endiancheck.c[0] = 1; endiancheck.c[1] = 0; size_t n = 0; if (this->Compressed) { // if this is the first frame, do some set-up if (this->FrameCounter == 0) { unsigned int numFrames = this->MetaData->Get(DC::NumberOfFrames).AsUnsignedInt(); numFrames = (numFrames == 0 ? 1 : numFrames); this->FrameData = new unsigned char *[numFrames]; this->FrameLength = new unsigned int[numFrames]; for (unsigned int i = 0; i < numFrames; i++) { this->FrameData[i] = 0; this->FrameLength[i] = 0; } } vtkDICOMImageCodec codec(this->TransferSyntaxUID); size_t fl = 0; unsigned char *fd = 0; int errCode = codec.Encode(this->MetaData, cp, size, &fd, &fl); this->FrameLength[this->FrameCounter] = static_cast(fl); this->FrameData[this->FrameCounter] = fd; if (this->ErrorCode == 0 && errCode != vtkDICOMImageCodec::NoError) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("Writing compressed DICOM is not supported."); } // mark all data as accepted n = size; } else if (((this->BigEndian != 0) ^ (endiancheck.s != 1)) && this->MetaData->Get(DC::BitsAllocated).AsInt() > 8) { // Swap bytes before writing int scalarSize = (this->MetaData->Get(DC::BitsAllocated).AsInt() + 7)/8; unsigned char *buf = new unsigned char[size]; unsigned char *dp = buf; if (scalarSize == 2) { for (vtkIdType i = 0; i < size; i += 2) { dp[0] = cp[1]; dp[1] = cp[0]; dp += 2; cp += 2; } } else if (scalarSize == 4) { for (vtkIdType i = 0; i < size; i += 4) { dp[0] = cp[3]; dp[1] = cp[2]; dp[2] = cp[1]; dp[3] = cp[0]; dp += 4; cp += 4; } } else if (scalarSize == 8) { for (vtkIdType i = 0; i < size; i += 8) { dp[0] = cp[7]; dp[1] = cp[6]; dp[2] = cp[5]; dp[3] = cp[4]; dp[4] = cp[3]; dp[5] = cp[2]; dp[6] = cp[1]; dp[7] = cp[0]; dp += 8; cp += 8; } } n = this->OutputFile->Write(buf, size); delete [] buf; } else { // For uncompressed frames, write the data raw n = this->OutputFile->Write(cp, size); } if (n != static_cast(size)) { this->DiskFullError(); } this->FrameCounter++; } //---------------------------------------------------------------------------- bool vtkDICOMCompiler::WriteMetaHeader( unsigned char* &cp, unsigned char* &ep, vtkDICOMMetaData *meta, int idx) { // if no transfer syntax is set, do not write header if (this->TransferSyntaxUID == 0) { return true; } // create the encoder LittleEndianEncoder encoder(this, idx); unsigned int l = 0; // length will be computed later unsigned char metaver[2] = { 0, 1 }; // meta header version const char *instanceUID = this->SOPInstanceUID; const char *implementationUID = this->ImplementationClassUID; // use the same class as the input meta data std::string classUIDString = meta->Get(DC::SOPClassUID).AsString(); if (classUIDString == "") { // if not present (e.g. DICOMDIR) get it from the meta header classUIDString = meta->Get(DC::MediaStorageSOPClassUID).AsString(); } const char *classUID = classUIDString.c_str(); if (instanceUID == 0) { instanceUID = this->SeriesUIDs->GetValue(idx); } if (implementationUID == 0) { implementationUID = vtkDICOMUtilities::GetImplementationClassUID(); } vtkDICOMItem item; item.Set( DC::FileMetaInformationGroupLength, vtkDICOMValue(vtkDICOMVR::UL, l)); item.Set( DC::FileMetaInformationVersion, vtkDICOMValue(vtkDICOMVR::OB, metaver, 2)); item.Set( DC::MediaStorageSOPClassUID, vtkDICOMValue(vtkDICOMVR::UI, classUID)); item.Set( DC::MediaStorageSOPInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, instanceUID)); item.Set( DC::TransferSyntaxUID, vtkDICOMValue(vtkDICOMVR::UI, this->TransferSyntaxUID)); item.Set( DC::ImplementationClassUID, vtkDICOMValue(vtkDICOMVR::UI, implementationUID)); if (this->ImplementationVersionName) { item.Set( DC::ImplementationVersionName, vtkDICOMValue(vtkDICOMVR::SH, this->ImplementationVersionName)); } if (this->SourceApplicationEntityTitle) { item.Set( DC::SourceApplicationEntityTitle, vtkDICOMValue(vtkDICOMVR::AE, this->SourceApplicationEntityTitle)); } // keep private information stored in meta header const char *creatorUID = meta->Get(DC::PrivateInformationCreatorUID).GetCharData(); if (creatorUID) { item.Set(DC::PrivateInformationCreatorUID, creatorUID); item.Set(DC::PrivateInformation, meta->Get(DC::PrivateInformation)); } vtkDICOMDataElementIterator iter = item.Begin(); vtkDICOMDataElementIterator iterEnd = item.End(); if (iter != iterEnd) { encoder.WriteElements(cp, ep, iter, iterEnd); } return true; } //---------------------------------------------------------------------------- bool vtkDICOMCompiler::WriteMetaData( unsigned char* &cp, unsigned char* &ep, vtkDICOMMetaData *meta, int idx) { // the encoders to choose from LittleEndianEncoder encoderLE(this, idx); BigEndianEncoder encoderBE(this, idx); EncoderBase *encoder = &encoderLE; this->Compressed = false; this->BigEndian = false; // anything not listed here is assumed to be Explicit LE std::string tsyntax = (this->TransferSyntaxUID ? this->TransferSyntaxUID : ""); if (tsyntax == "" || // If no meta header, use Implicit LE tsyntax == "1.2.840.10008.1.2" || // Implicit LE tsyntax == "1.2.840.10008.1.20") // Papyrus Implicit LE { encoder->SetImplicitVR(true); } else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE { encoder = &encoderBE; this->BigEndian = true; } else if (tsyntax == "1.2.840.113619.5.2") // GE LE with BE data { encoder->SetImplicitVR(true); this->BigEndian = true; } else if (tsyntax != "1.2.840.10008.1.2.1") // Explicit LE { this->Compressed = true; } const char *instanceUID = this->SOPInstanceUID; const char *seriesUID = this->SeriesInstanceUID; const char *studyUID = this->StudyInstanceUID; if (instanceUID == 0) { instanceUID = this->SeriesUIDs->GetValue(idx); } if (seriesUID == 0) { seriesUID = this->SeriesUIDs->GetValue(this->SeriesUIDs->GetMaxId()); } if (studyUID == 0 && meta->Get(DC::StudyInstanceUID).AsString() == "") { // study UID is only generated once per session if (vtkDICOMCompiler::StudyUID[0] == '\0') { std::string uid = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID); strcpy(vtkDICOMCompiler::StudyUID, uid.c_str()); } studyUID = vtkDICOMCompiler::StudyUID; } encoder->SetSOPInstanceUID(instanceUID); encoder->SetSeriesInstanceUID(seriesUID); encoder->SetStudyInstanceUID(studyUID); vtkDICOMDataElementIterator iter = meta->Begin(); vtkDICOMDataElementIterator iterEnd = meta->End(); // skip past the meta header while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002) { ++iter; } // if last element is PixelData, don't write it yet bool hasPixelData = false; if (iterEnd != iter) { vtkDICOMDataElementIterator finalElement = iterEnd; --finalElement; if (finalElement->GetTag() == vtkDICOMTag(DC::PixelData)) { iterEnd = finalElement; hasPixelData = true; } } // write the meta data, get boolean status value bool r = encoder->WriteElements(cp, ep, iter, iterEnd); // write the PixelData element head if (r && hasPixelData && (r = encoder->CheckBuffer(cp, ep, 12)) != false) { vtkDICOMVR vr = vtkDICOMVR::OW; int bitsAllocated = this->MetaData->Get(DC::BitsAllocated).AsInt(); if ((bitsAllocated > 0 && bitsAllocated <= 8) || this->Compressed) { vr = vtkDICOMVR::OB; } if (this->KeepOriginalPixelDataVR) { vtkDICOMVR vrOriginal = this->MetaData->Get(idx, DC::PixelData).GetVR(); if (vrOriginal.IsValid()) { vr = vrOriginal; } } unsigned int vl = this->ComputePixelDataSize(); // write the data element head size_t l = encoder->WriteElementHead( cp, vtkDICOMTag(DC::PixelData), vr, vl); cp += l; } return r; } //---------------------------------------------------------------------------- unsigned int vtkDICOMCompiler::ComputePixelDataSize() { unsigned int vl = HxFFFFFFFF; if (!this->Compressed) { // compute the size vtkDICOMMetaData *meta = this->MetaData; int bitsAllocated = meta->Get(this->Index, DC::BitsAllocated).AsInt(); if (bitsAllocated > 0) { vl = meta->Get(this->Index, DC::Columns).AsUnsignedInt(); vl *= meta->Get(this->Index, DC::Rows).AsUnsignedInt(); unsigned int m = meta->Get(this->Index, DC::SamplesPerPixel).AsUnsignedInt(); unsigned int n = meta->Get(this->Index, DC::NumberOfFrames).AsUnsignedInt(); vl *= ((m > 1) ? m : 1); vl *= ((n > 1) ? n : 1); if (bitsAllocated % 8 == 0) { vl *= bitsAllocated/8; } else { // this will only occur in ancient data vl = (vl*bitsAllocated + 7)/8; vl += (vl & 1); // make it even } } } return vl; } //---------------------------------------------------------------------------- bool vtkDICOMCompiler::FlushBuffer( unsigned char* &ucp, unsigned char* &ep) { bool rval = true; const unsigned char *cp = ucp; unsigned char *dp = this->Buffer; ucp = dp; ep = dp + this->ChunkSize; if (cp) { size_t n = cp - dp; size_t m = this->OutputFile->Write(dp, n); rval = (n == m); } return rval; } //---------------------------------------------------------------------------- void vtkDICOMCompiler::CompileError(const char* message) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("Error while writing file " << this->FileName << ": " << message); } //---------------------------------------------------------------------------- void vtkDICOMCompiler::DiskFullError() { this->CloseAndRemove(); this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError); vtkErrorMacro("Error while writing file " << this->FileName << ": Out of disk space."); } //---------------------------------------------------------------------------- void vtkDICOMCompiler::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "FileName: " << (this->FileName ? this->FileName : "(NULL)") << "\n"; os << indent << "SOPInstanceUID: " << (this->SOPInstanceUID ? this->SOPInstanceUID : "(NULL)") << "\n"; os << indent << "SeriesInstanceUID: " << (this->SeriesInstanceUID ? this->SeriesInstanceUID : "(NULL)") << "\n"; os << indent << "StudyInstanceUID: " << (this->StudyInstanceUID ? this->StudyInstanceUID : "(NULL)") << "\n"; os << indent << "ImplementationClassUID: " << (this->ImplementationClassUID ? this->ImplementationClassUID : "(NULL)") << "\n"; os << indent << "ImplementationVersionName: " << (this->ImplementationVersionName ? this->ImplementationVersionName : "(NULL)") << "\n"; os << indent << "SourceApplicationEntityTitle: " << (this->SourceApplicationEntityTitle ? this->SourceApplicationEntityTitle : "(NULL)") << "\n"; os << indent << "TransferSyntaxUID: " << (this->TransferSyntaxUID ? this->TransferSyntaxUID : "(NULL)") << "\n"; os << indent << "MetaData: " << this->MetaData << "\n"; os << indent << "Index: " << this->Index << "\n"; os << indent << "BufferSize: " << this->BufferSize << "\n"; os << indent << "KeepOriginalPixelDataVR: " << (this->KeepOriginalPixelDataVR ? "On\n" : "Off\n"); } vtk-dicom-0.8.12/Source/vtkDICOMCompiler.h000066400000000000000000000203241356440565500202010ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMCompiler_h #define vtkDICOMCompiler_h #include "vtkObject.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkStringArray; class vtkDICOMFile; class vtkDICOMMetaData; class vtkDICOMCompilerInternalFriendship; //! A writer for DICOM meta data. /*! * This class provides routines for compiling a vtkDICOMMetaData * object into a DICOM file. */ class VTKDICOM_EXPORT vtkDICOMCompiler : public vtkObject { public: //! Create a new vtkDICOMCompiler instance. static vtkDICOMCompiler *New(); //! VTK dynamic type information macro. vtkTypeMacro(vtkDICOMCompiler, vtkObject); //! Print a summary of the contents of this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set the file name. vtkSetStringMacro(FileName); vtkGetStringMacro(FileName); //@} //@{ //! Set the SOP Instance UID. /*! * If you do not supply a UID, a random UID will be generated. * Each DICOM file must have a globally unique UID. */ vtkSetStringMacro(SOPInstanceUID); vtkGetStringMacro(SOPInstanceUID); //@} //@{ //! Set the Series Instance UID. /*! * If you do not supply a UID, a random UID will be generated. * Each DICOM series must have a globally unique UID. */ vtkSetStringMacro(SeriesInstanceUID); vtkGetStringMacro(SeriesInstanceUID); //@} //@{ //! Set the Study Instance UID. /*! * If you do not supply a UID, a random UID will be generated. * Each DICOM study must have a globally unique UID. */ vtkSetStringMacro(StudyInstanceUID); vtkGetStringMacro(StudyInstanceUID); //@} //@{ //! Set the Implementation Class UID. /*! * If you do not supply a UID, a default one will be used. */ vtkSetStringMacro(ImplementationClassUID); vtkGetStringMacro(ImplementationClassUID); //@} //@{ //! Set the Implementation Version Name. /*! * If you do not supply a name, a default one will be used. */ vtkSetStringMacro(ImplementationVersionName); vtkGetStringMacro(ImplementationVersionName); //@} //@{ //! Set the Source Application Entity Title. /*! * Provide a short name (16 chars max) for the network node that * is running the implementation. The name should have no spaces * or punctuation and should consist only of letters and digits. */ vtkSetStringMacro(SourceApplicationEntityTitle); vtkGetStringMacro(SourceApplicationEntityTitle); //@} //@{ //! Set the Transfer Syntax UID. /*! * The transfer syntax should be left at its default value of * 1.2.840.10008.1.2.1 (uncompressed little-endian with explicit VR) * unless you are cloning the PixelData byte for byte from another * image, in which case you should use the transfer syntax from that * image. */ vtkSetStringMacro(TransferSyntaxUID); vtkGetStringMacro(TransferSyntaxUID); //@} //@{ //! Set the metadata object to write to the file. void SetMetaData(vtkDICOMMetaData *); vtkDICOMMetaData *GetMetaData() { return this->MetaData; } //@} //@{ //! Set the instance index to use when accessing vtkDICOMMataData. vtkSetMacro(Index, int); int GetIndex() { return this->Index; } //@} //@{ //! Set the buffer size, the default is 8192 (8k). /*! * A larger buffer size results in fewer IO calls. The * minimum buffer size is 256 bytes. */ void SetBufferSize(int size); int GetBufferSize() { return this->BufferSize; } //@} //@{ //! Write the metadata to the file. virtual void WriteHeader(); //! Write all of the pixel data in one go. /*! * This method assumes that the supplied buffer is already in * the correct format (endianness, compression, fragments, etc) * and writes it out to the file as the PixelData value. */ virtual void WritePixelData(const unsigned char *cp, vtkIdType size); //! Write one frame to the end of the file. virtual void WriteFrame(const unsigned char *cp, vtkIdType size); //! Close the file. virtual void Close(); //! Close the file and delete it. /*! * This method should be called if, for any reason, the writing * of the file could not be completed. */ virtual void CloseAndRemove(); //! Get the IO error code. unsigned long GetErrorCode() { return this->ErrorCode; } //@} //@{ //! Generate a series UID and instance UIDs for the meta data. /*! * This will be called automatically whenever you provide a * new meta data object for the compiler. Note that new UIDs * will not be generated if you have already provided them with * SetSOPInstanceUID() and SetSeriesInstanceUID(). */ void GenerateSeriesUIDs(); //@} //@{ //! Use the original PixelData VR when writing pixel data element. /*! * This is really only useful when cloning data sets. It ensures * that the written data uses the same VR as the original data. */ vtkSetMacro(KeepOriginalPixelDataVR, bool); vtkBooleanMacro(KeepOriginalPixelDataVR, bool); vtkGetMacro(KeepOriginalPixelDataVR, bool); //@} protected: vtkDICOMCompiler(); ~vtkDICOMCompiler(); //! Internal method for flushing the IO buffer. /*! * This is an internal method that flushes the buffer to the file. * If called with cp = 0, it will initialize cp to the beginning of * the write buffer, and ep to the end of the buffer, without writing * anything to the file. The caller should then write to the buffer, * incrementing the pointer cp while doing so. When cp approaches the * end of the buffer (which is stored in ep), FlushBuffer should be * called to flush the buffer contents to the file. Every call will * reset cp to the beginning of the buffer and ep to the end of the * buffer. */ virtual bool FlushBuffer(unsigned char* &cp, unsigned char* &ep); //! Report an error while compiling the file. virtual void CompileError(const char *message); //! React to "disk full" by deleting file and reporting error. virtual void DiskFullError(); //! Set the error code. void SetErrorCode(unsigned long e) { this->ErrorCode = e; } //! Generate the file from the provided metadata object. virtual bool WriteFile(vtkDICOMMetaData *data, int idx); //! Write just the meta header (group 0x0002). bool WriteMetaHeader( unsigned char* &cp, unsigned char* &ep, vtkDICOMMetaData *data, int idx); //! Write the meta data following the meta header. bool WriteMetaData( unsigned char* &cp, unsigned char* &ep, vtkDICOMMetaData *data, int idx); //! Write the fragments of the compressed data bool WriteFragments(); //! Free any fragments that are stored in memory. void FreeFragments(); //! Compute the size of the pixel data (0xffffffff if compressed). unsigned int ComputePixelDataSize(); char *FileName; char *SOPInstanceUID; char *SeriesInstanceUID; char *StudyInstanceUID; char *ImplementationClassUID; char *ImplementationVersionName; char *SourceApplicationEntityTitle; char *TransferSyntaxUID; vtkDICOMMetaData *MetaData; vtkStringArray *SeriesUIDs; vtkDICOMFile *OutputFile; unsigned char *Buffer; unsigned char **FrameData; unsigned int *FrameLength; unsigned int FrameCounter; int BufferSize; int ChunkSize; int Index; bool BigEndian; bool Compressed; bool KeepOriginalPixelDataVR; unsigned long ErrorCode; static char StudyUID[64]; // used to share FlushBuffer with internal classes friend class vtkDICOMCompilerInternalFriendship; private: #ifdef VTK_DICOM_DELETE vtkDICOMCompiler(const vtkDICOMCompiler&) VTK_DICOM_DELETE; void operator=(const vtkDICOMCompiler&) VTK_DICOM_DELETE; #else vtkDICOMCompiler(const vtkDICOMCompiler&) = delete; void operator=(const vtkDICOMCompiler&) = delete; #endif }; #endif /* vtkDICOMCompiler_h */ vtk-dicom-0.8.12/Source/vtkDICOMDataElement.cxx000066400000000000000000000012731356440565500211670ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMDataElement.h" ostream& operator<<(ostream& os, const vtkDICOMDataElement& v) { os << v.GetTag() << "," << v.GetVR() << "," << v.GetValue(); return os; } vtk-dicom-0.8.12/Source/vtkDICOMDataElement.h000066400000000000000000000104121356440565500206070ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMDataElement_h #define vtkDICOMDataElement_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMTag.h" #include "vtkDICOMValue.h" //! A data element in a DICOM data set. /*! * The DataElement contains an encoded attribute value, along * with the tag that identifies the attribute. The data elements * in a vtkDICOMMetaData object can be per-instance, with a different * value for each data set instance used to build the the meta data * for the image series. */ class VTKDICOM_EXPORT vtkDICOMDataElement { public: //@{ vtkDICOMDataElement() : Tag(), Value(), Next(0), Prev(0) {} vtkDICOMDataElement(const vtkDICOMTag& t, const vtkDICOMValue &v) : Tag(t), Value(v), Next(0), Prev(0) {} //@} //@{ //! Get the tag for this data element. vtkDICOMTag GetTag() const { return this->Tag; } //! Get the VR for this data element. vtkDICOMVR GetVR() const { return this->Value.GetVR(); } //@} //@{ //! Check whether this data element carries per-instance values. bool IsPerInstance() const { return (this->Value.GetMultiplexData() != 0); } //! Get the number of value instances in this data element. int GetNumberOfInstances() const { return static_cast(this->Value.GetNumberOfValues()); } //! Get the value of the data element, if not multi-valued. const vtkDICOMValue& GetValue() const { return this->Value; } //! Get value instance i, if the data element is multi-valued. const vtkDICOMValue& GetValue(int i) const { const vtkDICOMValue *vptr = this->Value.GetMultiplexData(); return (vptr == 0 ? this->Value : vptr[i]); } //@} //@{ bool operator==(const vtkDICOMDataElement& o) const { return (this->Tag == o.Tag && this->Value == o.Value); } bool operator!=(const vtkDICOMDataElement& o) const { return (this->Tag != o.Tag || this->Value != o.Value); } //@} private: vtkDICOMTag Tag; vtkDICOMValue Value; // for storing elements in a linked list vtkDICOMDataElement *Next; vtkDICOMDataElement *Prev; // the classes that need to manipulate lists of elements friend class vtkDICOMDataElementIterator; friend class vtkDICOMMetaData; friend class vtkDICOMItem; }; //! A const iterator for a vtkDataElement list. class VTKDICOM_EXPORT vtkDICOMDataElementIterator { public: //@{ vtkDICOMDataElementIterator() : Pointer(0) {} //@} //@{ vtkDICOMDataElementIterator& operator++() { if (this->Pointer) { this->Pointer = this->Pointer->Next; } return *this; } vtkDICOMDataElementIterator operator++(int) { const vtkDICOMDataElement *ptr = this->Pointer; if (ptr) { this->Pointer = this->Pointer->Next; } return vtkDICOMDataElementIterator(ptr); } vtkDICOMDataElementIterator& operator--() { if (this->Pointer) { this->Pointer = this->Pointer->Prev; } return *this; } vtkDICOMDataElementIterator operator--(int) { const vtkDICOMDataElement *ptr = this->Pointer; if (ptr) { this->Pointer = this->Pointer->Prev; } return vtkDICOMDataElementIterator(ptr); } //@} //@{ const vtkDICOMDataElement *operator->() const { return this->Pointer; } const vtkDICOMDataElement& operator*() const { return *this->Pointer; } //@} //@{ bool operator==(const vtkDICOMDataElementIterator& it) const { return (this->Pointer == it.Pointer); } bool operator!=(const vtkDICOMDataElementIterator& it) const { return (this->Pointer != it.Pointer); } //@} private: vtkDICOMDataElementIterator(const vtkDICOMDataElement *ptr) { this->Pointer = ptr; } const vtkDICOMDataElement *Pointer; friend class vtkDICOMMetaData; friend class vtkDICOMItem; }; VTKDICOM_EXPORT ostream& operator<<(ostream& os, const vtkDICOMDataElement& v); #endif /* vtkDICOMDataElement_h */ // VTK-HeaderTest-Exclude: vtkDICOMDataElement.h vtk-dicom-0.8.12/Source/vtkDICOMDictEntry.cxx000066400000000000000000000015711356440565500207120ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMDictEntry.h" const vtkDICOMDictEntry::Entry vtkDICOMDictEntry::InvalidEntry = { 0, 0, 0, 0, 0, "" }; ostream& operator<<(ostream& o, const vtkDICOMDictEntry& a) { if (!a.IsValid()) { o << "INVALID"; } else { o << a.GetTag() << "," << a.GetVR() << "," << a.GetVM() << "," << "\"" << a.GetName() << "\""; } return o; } vtk-dicom-0.8.12/Source/vtkDICOMDictEntry.h000066400000000000000000000042711356440565500203370ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMDictEntry_h #define vtkDICOMDictEntry_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMVR.h" #include "vtkDICOMVM.h" #include "vtkDICOMTag.h" //! An entry in the DICOM dictionary. class VTKDICOM_EXPORT vtkDICOMDictEntry { public: //! A struct to statically store DICOM dictionary entries. struct Entry { unsigned short Group; unsigned short Element; unsigned char Flags; unsigned char VR; unsigned short VM; const char *Name; }; //! Construct an invalid DictEntry object. vtkDICOMDictEntry() : I(&InvalidEntry) {} //! Check whether the returned entry is valid. bool IsValid() const { return (this->I != &InvalidEntry); } //! Get the DICOM tag for this dictionary entry. vtkDICOMTag GetTag() const { return vtkDICOMTag(this->I->Group, this->I->Element); } //! Get the VR for this dictionary entry. vtkDICOMVR GetVR() const { return vtkDICOMVR(static_cast(this->I->VR)); } //! Get the VM for this dictionary entry. vtkDICOMVM GetVM() const { return vtkDICOMVM(static_cast(this->I->VM)); } //! Get a human-readable name for this dictionary entry. const char *GetName() const { return this->I->Name; } //! Check whether this entry has been retired from the DICOM standard. bool IsRetired() const { return (this->I->Flags == 1); } private: vtkDICOMDictEntry(const Entry *o) : I(o) {} friend class vtkDICOMDictionary; const Entry *I; static const Entry InvalidEntry; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMDictEntry& a); #endif /* vtkDICOMDictEntry_h */ // VTK-HeaderTest-Exclude: vtkDICOMDictEntry.h vtk-dicom-0.8.12/Source/vtkDICOMDictHash.cxx000066400000000000000000023176261356440565500205110ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/ #include "vtkDICOMDictionary.h" #include "vtkDICOMDictHash.h" namespace { typedef vtkDICOMVR VR; typedef vtkDICOMVM VM; typedef vtkDICOMDictEntry::Entry DictEntry; const DictEntry DictContents[] = { { 0x0002, 0x0000, 0, VR::UL, VM::M1, "FileMetaInformationGroupLength" }, { 0x0002, 0x0001, 0, VR::OB, VM::M1, "FileMetaInformationVersion" }, { 0x0002, 0x0002, 0, VR::UI, VM::M1, "MediaStorageSOPClassUID" }, { 0x0002, 0x0003, 0, VR::UI, VM::M1, "MediaStorageSOPInstanceUID" }, { 0x0002, 0x0010, 0, VR::UI, VM::M1, "TransferSyntaxUID" }, { 0x0002, 0x0012, 0, VR::UI, VM::M1, "ImplementationClassUID" }, { 0x0002, 0x0013, 0, VR::SH, VM::M1, "ImplementationVersionName" }, { 0x0002, 0x0016, 0, VR::AE, VM::M1, "SourceApplicationEntityTitle" }, { 0x0002, 0x0017, 0, VR::AE, VM::M1, "SendingApplicationEntityTitle" }, { 0x0002, 0x0018, 0, VR::AE, VM::M1, "ReceivingApplicationEntityTitle" }, { 0x0002, 0x0026, 0, VR::UR, VM::M1, "SourcePresentationAddress" }, { 0x0002, 0x0027, 0, VR::UR, VM::M1, "SendingPresentationAddress" }, { 0x0002, 0x0028, 0, VR::UR, VM::M1, "ReceivingPresentationAddress" }, { 0x0002, 0x0031, 0, VR::OB, VM::M1, "RTVMetaInformationVersion" }, { 0x0002, 0x0032, 0, VR::UI, VM::M1, "RTVCommunicationSOPClassUID" }, { 0x0002, 0x0033, 0, VR::UI, VM::M1, "RTVCommunicationSOPInstanceUID" }, { 0x0002, 0x0035, 0, VR::OB, VM::M1, "RTVSourceIdentifier" }, { 0x0002, 0x0036, 0, VR::OB, VM::M1, "RTVFlowIdentifier" }, { 0x0002, 0x0037, 0, VR::UL, VM::M1, "RTVFlowRTPSamplingRate" }, { 0x0002, 0x0038, 0, VR::FD, VM::M1, "RTVFlowActualFrameDuration" }, { 0x0002, 0x0100, 0, VR::UI, VM::M1, "PrivateInformationCreatorUID" }, { 0x0002, 0x0102, 0, VR::OB, VM::M1, "PrivateInformation" }, { 0x0004, 0x1130, 0, VR::CS, VM::M1, "FileSetID" }, { 0x0004, 0x1141, 0, VR::CS, VM::M1T8, "FileSetDescriptorFileID" }, { 0x0004, 0x1142, 0, VR::CS, VM::M1, "SpecificCharacterSetOfFileSetDescriptorFile" }, { 0x0004, 0x1200, 0, VR::UL, VM::M1, "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity" }, { 0x0004, 0x1202, 0, VR::UL, VM::M1, "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity" }, { 0x0004, 0x1212, 0, VR::US, VM::M1, "FileSetConsistencyFlag" }, { 0x0004, 0x1220, 0, VR::SQ, VM::M1, "DirectoryRecordSequence" }, { 0x0004, 0x1400, 0, VR::UL, VM::M1, "OffsetOfTheNextDirectoryRecord" }, { 0x0004, 0x1410, 0, VR::US, VM::M1, "RecordInUseFlag" }, { 0x0004, 0x1420, 0, VR::UL, VM::M1, "OffsetOfReferencedLowerLevelDirectoryEntity" }, { 0x0004, 0x1430, 0, VR::CS, VM::M1, "DirectoryRecordType" }, { 0x0004, 0x1432, 0, VR::UI, VM::M1, "PrivateRecordUID" }, { 0x0004, 0x1500, 0, VR::CS, VM::M1T8, "ReferencedFileID" }, { 0x0004, 0x1504, 1, VR::UL, VM::M1, "MRDRDirectoryRecordOffset" }, { 0x0004, 0x1510, 0, VR::UI, VM::M1, "ReferencedSOPClassUIDInFile" }, { 0x0004, 0x1511, 0, VR::UI, VM::M1, "ReferencedSOPInstanceUIDInFile" }, { 0x0004, 0x1512, 0, VR::UI, VM::M1, "ReferencedTransferSyntaxUIDInFile" }, { 0x0004, 0x151A, 0, VR::UI, VM::M1TN, "ReferencedRelatedGeneralSOPClassUIDInFile" }, { 0x0004, 0x1600, 1, VR::UL, VM::M1, "NumberOfReferences" }, { 0x0006, 0x0001, 0, VR::SQ, VM::M1, "CurrentFrameFunctionalGroupsSequence" }, { 0x0008, 0x0001, 1, VR::UL, VM::M1, "LengthToEnd" }, { 0x0008, 0x0005, 0, VR::CS, VM::M1TN, "SpecificCharacterSet" }, { 0x0008, 0x0006, 0, VR::SQ, VM::M1, "LanguageCodeSequence" }, { 0x0008, 0x0008, 0, VR::CS, VM::M2TN, "ImageType" }, { 0x0008, 0x0010, 1, VR::SH, VM::M1, "RecognitionCode" }, { 0x0008, 0x0012, 0, VR::DA, VM::M1, "InstanceCreationDate" }, { 0x0008, 0x0013, 0, VR::TM, VM::M1, "InstanceCreationTime" }, { 0x0008, 0x0014, 0, VR::UI, VM::M1, "InstanceCreatorUID" }, { 0x0008, 0x0015, 0, VR::DT, VM::M1, "InstanceCoercionDateTime" }, { 0x0008, 0x0016, 0, VR::UI, VM::M1, "SOPClassUID" }, { 0x0008, 0x0018, 0, VR::UI, VM::M1, "SOPInstanceUID" }, { 0x0008, 0x001A, 0, VR::UI, VM::M1TN, "RelatedGeneralSOPClassUID" }, { 0x0008, 0x001B, 0, VR::UI, VM::M1, "OriginalSpecializedSOPClassUID" }, { 0x0008, 0x0020, 0, VR::DA, VM::M1, "StudyDate" }, { 0x0008, 0x0021, 0, VR::DA, VM::M1, "SeriesDate" }, { 0x0008, 0x0022, 0, VR::DA, VM::M1, "AcquisitionDate" }, { 0x0008, 0x0023, 0, VR::DA, VM::M1, "ContentDate" }, { 0x0008, 0x0024, 1, VR::DA, VM::M1, "OverlayDate" }, { 0x0008, 0x0025, 1, VR::DA, VM::M1, "CurveDate" }, { 0x0008, 0x002A, 0, VR::DT, VM::M1, "AcquisitionDateTime" }, { 0x0008, 0x0030, 0, VR::TM, VM::M1, "StudyTime" }, { 0x0008, 0x0031, 0, VR::TM, VM::M1, "SeriesTime" }, { 0x0008, 0x0032, 0, VR::TM, VM::M1, "AcquisitionTime" }, { 0x0008, 0x0033, 0, VR::TM, VM::M1, "ContentTime" }, { 0x0008, 0x0034, 1, VR::TM, VM::M1, "OverlayTime" }, { 0x0008, 0x0035, 1, VR::TM, VM::M1, "CurveTime" }, { 0x0008, 0x0040, 1, VR::US, VM::M1, "DataSetType" }, { 0x0008, 0x0041, 1, VR::LO, VM::M1, "DataSetSubtype" }, { 0x0008, 0x0042, 1, VR::CS, VM::M1, "NuclearMedicineSeriesType" }, { 0x0008, 0x0050, 0, VR::SH, VM::M1, "AccessionNumber" }, { 0x0008, 0x0051, 0, VR::SQ, VM::M1, "IssuerOfAccessionNumberSequence" }, { 0x0008, 0x0052, 0, VR::CS, VM::M1, "QueryRetrieveLevel" }, { 0x0008, 0x0053, 0, VR::CS, VM::M1, "QueryRetrieveView" }, { 0x0008, 0x0054, 0, VR::AE, VM::M1TN, "RetrieveAETitle" }, { 0x0008, 0x0055, 0, VR::AE, VM::M1, "StationAETitle" }, { 0x0008, 0x0056, 0, VR::CS, VM::M1, "InstanceAvailability" }, { 0x0008, 0x0058, 0, VR::UI, VM::M1TN, "FailedSOPInstanceUIDList" }, { 0x0008, 0x0060, 0, VR::CS, VM::M1, "Modality" }, { 0x0008, 0x0061, 0, VR::CS, VM::M1TN, "ModalitiesInStudy" }, { 0x0008, 0x0062, 0, VR::UI, VM::M1TN, "SOPClassesInStudy" }, { 0x0008, 0x0063, 0, VR::SQ, VM::M1, "AnatomicRegionsInStudyCodeSequence" }, { 0x0008, 0x0064, 0, VR::CS, VM::M1, "ConversionType" }, { 0x0008, 0x0068, 0, VR::CS, VM::M1, "PresentationIntentType" }, { 0x0008, 0x0070, 0, VR::LO, VM::M1, "Manufacturer" }, { 0x0008, 0x0080, 0, VR::LO, VM::M1, "InstitutionName" }, { 0x0008, 0x0081, 0, VR::ST, VM::M1, "InstitutionAddress" }, { 0x0008, 0x0082, 0, VR::SQ, VM::M1, "InstitutionCodeSequence" }, { 0x0008, 0x0090, 0, VR::PN, VM::M1, "ReferringPhysicianName" }, { 0x0008, 0x0092, 0, VR::ST, VM::M1, "ReferringPhysicianAddress" }, { 0x0008, 0x0094, 0, VR::SH, VM::M1TN, "ReferringPhysicianTelephoneNumbers" }, { 0x0008, 0x0096, 0, VR::SQ, VM::M1, "ReferringPhysicianIdentificationSequence" }, { 0x0008, 0x009C, 0, VR::PN, VM::M1TN, "ConsultingPhysicianName" }, { 0x0008, 0x009D, 0, VR::SQ, VM::M1, "ConsultingPhysicianIdentificationSequence" }, { 0x0008, 0x0100, 0, VR::SH, VM::M1, "CodeValue" }, { 0x0008, 0x0101, 3, VR::LO, VM::M1, "ExtendedCodeValue" }, { 0x0008, 0x0102, 0, VR::SH, VM::M1, "CodingSchemeDesignator" }, { 0x0008, 0x0103, 0, VR::SH, VM::M1, "CodingSchemeVersion" }, { 0x0008, 0x0104, 0, VR::LO, VM::M1, "CodeMeaning" }, { 0x0008, 0x0105, 0, VR::CS, VM::M1, "MappingResource" }, { 0x0008, 0x0106, 0, VR::DT, VM::M1, "ContextGroupVersion" }, { 0x0008, 0x0107, 0, VR::DT, VM::M1, "ContextGroupLocalVersion" }, { 0x0008, 0x0108, 3, VR::LT, VM::M1, "ExtendedCodeMeaning" }, { 0x0008, 0x0109, 0, VR::SQ, VM::M1, "CodingSchemeResourcesSequence" }, { 0x0008, 0x010A, 0, VR::CS, VM::M1, "CodingSchemeURLType" }, { 0x0008, 0x010B, 0, VR::CS, VM::M1, "ContextGroupExtensionFlag" }, { 0x0008, 0x010C, 0, VR::UI, VM::M1, "CodingSchemeUID" }, { 0x0008, 0x010D, 0, VR::UI, VM::M1, "ContextGroupExtensionCreatorUID" }, { 0x0008, 0x010E, 0, VR::UR, VM::M1, "CodingSchemeURL" }, { 0x0008, 0x010F, 0, VR::CS, VM::M1, "ContextIdentifier" }, { 0x0008, 0x0110, 0, VR::SQ, VM::M1, "CodingSchemeIdentificationSequence" }, { 0x0008, 0x0112, 0, VR::LO, VM::M1, "CodingSchemeRegistry" }, { 0x0008, 0x0114, 0, VR::ST, VM::M1, "CodingSchemeExternalID" }, { 0x0008, 0x0115, 0, VR::ST, VM::M1, "CodingSchemeName" }, { 0x0008, 0x0116, 0, VR::ST, VM::M1, "CodingSchemeResponsibleOrganization" }, { 0x0008, 0x0117, 0, VR::UI, VM::M1, "ContextUID" }, { 0x0008, 0x0118, 0, VR::UI, VM::M1, "MappingResourceUID" }, { 0x0008, 0x0119, 0, VR::UC, VM::M1, "LongCodeValue" }, { 0x0008, 0x0120, 0, VR::UR, VM::M1, "URNCodeValue" }, { 0x0008, 0x0121, 0, VR::SQ, VM::M1, "EquivalentCodeSequence" }, { 0x0008, 0x0122, 0, VR::LO, VM::M1, "MappingResourceName" }, { 0x0008, 0x0123, 0, VR::SQ, VM::M1, "ContextGroupIdentificationSequence" }, { 0x0008, 0x0124, 0, VR::SQ, VM::M1, "MappingResourceIdentificationSequence" }, { 0x0008, 0x0201, 0, VR::SH, VM::M1, "TimezoneOffsetFromUTC" }, { 0x0008, 0x0220, 0, VR::SQ, VM::M1, "ResponsibleGroupCodeSequence" }, { 0x0008, 0x0221, 0, VR::CS, VM::M1, "EquipmentModality" }, { 0x0008, 0x0222, 0, VR::LO, VM::M1, "ManufacturerRelatedModelGroup" }, { 0x0008, 0x0300, 0, VR::SQ, VM::M1, "PrivateDataElementCharacteristicsSequence" }, { 0x0008, 0x0301, 0, VR::US, VM::M1, "PrivateGroupReference" }, { 0x0008, 0x0302, 0, VR::LO, VM::M1, "PrivateCreatorReference" }, { 0x0008, 0x0303, 0, VR::CS, VM::M1, "BlockIdentifyingInformationStatus" }, { 0x0008, 0x0304, 0, VR::US, VM::M1TN, "NonidentifyingPrivateElements" }, { 0x0008, 0x0305, 0, VR::SQ, VM::M1, "DeidentificationActionSequence" }, { 0x0008, 0x0306, 0, VR::US, VM::M1TN, "IdentifyingPrivateElements" }, { 0x0008, 0x0307, 0, VR::CS, VM::M1, "DeidentificationAction" }, { 0x0008, 0x0308, 0, VR::US, VM::M1, "PrivateDataElement" }, { 0x0008, 0x0309, 0, VR::UL, VM::M1T3, "PrivateDataElementValueMultiplicity" }, { 0x0008, 0x030A, 0, VR::CS, VM::M1, "PrivateDataElementValueRepresentation" }, { 0x0008, 0x030B, 0, VR::UL, VM::M1T2, "PrivateDataElementNumberOfItems" }, { 0x0008, 0x030C, 0, VR::UC, VM::M1, "PrivateDataElementName" }, { 0x0008, 0x030D, 0, VR::UC, VM::M1, "PrivateDataElementKeyword" }, { 0x0008, 0x030E, 0, VR::UT, VM::M1, "PrivateDataElementDescription" }, { 0x0008, 0x030F, 0, VR::UT, VM::M1, "PrivateDataElementEncoding" }, { 0x0008, 0x0310, 0, VR::SQ, VM::M1, "PrivateDataElementDefinitionSequence" }, { 0x0008, 0x1000, 1, VR::AE, VM::M1, "NetworkID" }, { 0x0008, 0x1010, 0, VR::SH, VM::M1, "StationName" }, { 0x0008, 0x1030, 0, VR::LO, VM::M1, "StudyDescription" }, { 0x0008, 0x1032, 0, VR::SQ, VM::M1, "ProcedureCodeSequence" }, { 0x0008, 0x103E, 0, VR::LO, VM::M1, "SeriesDescription" }, { 0x0008, 0x103F, 0, VR::SQ, VM::M1, "SeriesDescriptionCodeSequence" }, { 0x0008, 0x1040, 0, VR::LO, VM::M1, "InstitutionalDepartmentName" }, { 0x0008, 0x1041, 0, VR::SQ, VM::M1, "InstitutionalDepartmentTypeCodeSequence" }, { 0x0008, 0x1048, 0, VR::PN, VM::M1TN, "PhysiciansOfRecord" }, { 0x0008, 0x1049, 0, VR::SQ, VM::M1, "PhysiciansOfRecordIdentificationSequence" }, { 0x0008, 0x1050, 0, VR::PN, VM::M1TN, "PerformingPhysicianName" }, { 0x0008, 0x1052, 0, VR::SQ, VM::M1, "PerformingPhysicianIdentificationSequence" }, { 0x0008, 0x1060, 0, VR::PN, VM::M1TN, "NameOfPhysiciansReadingStudy" }, { 0x0008, 0x1062, 0, VR::SQ, VM::M1, "PhysiciansReadingStudyIdentificationSequence" }, { 0x0008, 0x1070, 0, VR::PN, VM::M1TN, "OperatorsName" }, { 0x0008, 0x1072, 0, VR::SQ, VM::M1, "OperatorIdentificationSequence" }, { 0x0008, 0x1080, 0, VR::LO, VM::M1TN, "AdmittingDiagnosesDescription" }, { 0x0008, 0x1084, 0, VR::SQ, VM::M1, "AdmittingDiagnosesCodeSequence" }, { 0x0008, 0x1090, 0, VR::LO, VM::M1, "ManufacturerModelName" }, { 0x0008, 0x1100, 1, VR::SQ, VM::M1, "ReferencedResultsSequence" }, { 0x0008, 0x1110, 0, VR::SQ, VM::M1, "ReferencedStudySequence" }, { 0x0008, 0x1111, 0, VR::SQ, VM::M1, "ReferencedPerformedProcedureStepSequence" }, { 0x0008, 0x1115, 0, VR::SQ, VM::M1, "ReferencedSeriesSequence" }, { 0x0008, 0x1120, 0, VR::SQ, VM::M1, "ReferencedPatientSequence" }, { 0x0008, 0x1125, 0, VR::SQ, VM::M1, "ReferencedVisitSequence" }, { 0x0008, 0x1130, 1, VR::SQ, VM::M1, "ReferencedOverlaySequence" }, { 0x0008, 0x1134, 0, VR::SQ, VM::M1, "ReferencedStereometricInstanceSequence" }, { 0x0008, 0x113A, 0, VR::SQ, VM::M1, "ReferencedWaveformSequence" }, { 0x0008, 0x1140, 0, VR::SQ, VM::M1, "ReferencedImageSequence" }, { 0x0008, 0x1145, 1, VR::SQ, VM::M1, "ReferencedCurveSequence" }, { 0x0008, 0x114A, 0, VR::SQ, VM::M1, "ReferencedInstanceSequence" }, { 0x0008, 0x114B, 0, VR::SQ, VM::M1, "ReferencedRealWorldValueMappingInstanceSequence" }, { 0x0008, 0x1150, 0, VR::UI, VM::M1, "ReferencedSOPClassUID" }, { 0x0008, 0x1155, 0, VR::UI, VM::M1, "ReferencedSOPInstanceUID" }, { 0x0008, 0x1156, 0, VR::SQ, VM::M1, "DefinitionSourceSequence" }, { 0x0008, 0x115A, 0, VR::UI, VM::M1TN, "SOPClassesSupported" }, { 0x0008, 0x1160, 0, VR::IS, VM::M1TN, "ReferencedFrameNumber" }, { 0x0008, 0x1161, 0, VR::UL, VM::M1TN, "SimpleFrameList" }, { 0x0008, 0x1162, 0, VR::UL, VM::M3T3N, "CalculatedFrameList" }, { 0x0008, 0x1163, 0, VR::FD, VM::M2, "TimeRange" }, { 0x0008, 0x1164, 0, VR::SQ, VM::M1, "FrameExtractionSequence" }, { 0x0008, 0x1167, 0, VR::UI, VM::M1, "MultiFrameSourceSOPInstanceUID" }, { 0x0008, 0x1190, 0, VR::UR, VM::M1, "RetrieveURL" }, { 0x0008, 0x1195, 0, VR::UI, VM::M1, "TransactionUID" }, { 0x0008, 0x1196, 0, VR::US, VM::M1, "WarningReason" }, { 0x0008, 0x1197, 0, VR::US, VM::M1, "FailureReason" }, { 0x0008, 0x1198, 0, VR::SQ, VM::M1, "FailedSOPSequence" }, { 0x0008, 0x1199, 0, VR::SQ, VM::M1, "ReferencedSOPSequence" }, { 0x0008, 0x119A, 0, VR::SQ, VM::M1, "OtherFailuresSequence" }, { 0x0008, 0x1200, 0, VR::SQ, VM::M1, "StudiesContainingOtherReferencedInstancesSequence" }, { 0x0008, 0x1250, 0, VR::SQ, VM::M1, "RelatedSeriesSequence" }, { 0x0008, 0x2110, 1, VR::CS, VM::M1, "LossyImageCompressionRetired" }, { 0x0008, 0x2111, 0, VR::ST, VM::M1, "DerivationDescription" }, { 0x0008, 0x2112, 0, VR::SQ, VM::M1, "SourceImageSequence" }, { 0x0008, 0x2120, 0, VR::SH, VM::M1, "StageName" }, { 0x0008, 0x2122, 0, VR::IS, VM::M1, "StageNumber" }, { 0x0008, 0x2124, 0, VR::IS, VM::M1, "NumberOfStages" }, { 0x0008, 0x2127, 0, VR::SH, VM::M1, "ViewName" }, { 0x0008, 0x2128, 0, VR::IS, VM::M1, "ViewNumber" }, { 0x0008, 0x2129, 0, VR::IS, VM::M1, "NumberOfEventTimers" }, { 0x0008, 0x212A, 0, VR::IS, VM::M1, "NumberOfViewsInStage" }, { 0x0008, 0x2130, 0, VR::DS, VM::M1TN, "EventElapsedTimes" }, { 0x0008, 0x2132, 0, VR::LO, VM::M1TN, "EventTimerNames" }, { 0x0008, 0x2133, 0, VR::SQ, VM::M1, "EventTimerSequence" }, { 0x0008, 0x2134, 0, VR::FD, VM::M1, "EventTimeOffset" }, { 0x0008, 0x2135, 0, VR::SQ, VM::M1, "EventCodeSequence" }, { 0x0008, 0x2142, 0, VR::IS, VM::M1, "StartTrim" }, { 0x0008, 0x2143, 0, VR::IS, VM::M1, "StopTrim" }, { 0x0008, 0x2144, 0, VR::IS, VM::M1, "RecommendedDisplayFrameRate" }, { 0x0008, 0x2200, 1, VR::CS, VM::M1, "TransducerPosition" }, { 0x0008, 0x2204, 1, VR::CS, VM::M1, "TransducerOrientation" }, { 0x0008, 0x2208, 1, VR::CS, VM::M1, "AnatomicStructure" }, { 0x0008, 0x2218, 0, VR::SQ, VM::M1, "AnatomicRegionSequence" }, { 0x0008, 0x2220, 0, VR::SQ, VM::M1, "AnatomicRegionModifierSequence" }, { 0x0008, 0x2228, 0, VR::SQ, VM::M1, "PrimaryAnatomicStructureSequence" }, { 0x0008, 0x2229, 1, VR::SQ, VM::M1, "AnatomicStructureSpaceOrRegionSequence" }, { 0x0008, 0x2230, 0, VR::SQ, VM::M1, "PrimaryAnatomicStructureModifierSequence" }, { 0x0008, 0x2240, 1, VR::SQ, VM::M1, "TransducerPositionSequence" }, { 0x0008, 0x2242, 1, VR::SQ, VM::M1, "TransducerPositionModifierSequence" }, { 0x0008, 0x2244, 1, VR::SQ, VM::M1, "TransducerOrientationSequence" }, { 0x0008, 0x2246, 1, VR::SQ, VM::M1, "TransducerOrientationModifierSequence" }, { 0x0008, 0x2251, 1, VR::SQ, VM::M1, "AnatomicStructureSpaceOrRegionCodeSequenceTrial" }, { 0x0008, 0x2253, 1, VR::SQ, VM::M1, "AnatomicPortalOfEntranceCodeSequenceTrial" }, { 0x0008, 0x2255, 1, VR::SQ, VM::M1, "AnatomicApproachDirectionCodeSequenceTrial" }, { 0x0008, 0x2256, 1, VR::ST, VM::M1, "AnatomicPerspectiveDescriptionTrial" }, { 0x0008, 0x2257, 1, VR::SQ, VM::M1, "AnatomicPerspectiveCodeSequenceTrial" }, { 0x0008, 0x2258, 1, VR::ST, VM::M1, "AnatomicLocationOfExaminingInstrumentDescriptionTrial" }, { 0x0008, 0x2259, 1, VR::SQ, VM::M1, "AnatomicLocationOfExaminingInstrumentCodeSequenceTrial" }, { 0x0008, 0x225A, 1, VR::SQ, VM::M1, "AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial" }, { 0x0008, 0x225C, 1, VR::SQ, VM::M1, "OnAxisBackgroundAnatomicStructureCodeSequenceTrial" }, { 0x0008, 0x3001, 0, VR::SQ, VM::M1, "AlternateRepresentationSequence" }, { 0x0008, 0x3002, 0, VR::UI, VM::M1TN, "AvailableTransferSyntaxUID" }, { 0x0008, 0x3010, 0, VR::UI, VM::M1TN, "IrradiationEventUID" }, { 0x0008, 0x3011, 0, VR::SQ, VM::M1, "SourceIrradiationEventSequence" }, { 0x0008, 0x3012, 0, VR::UI, VM::M1, "RadiopharmaceuticalAdministrationEventUID" }, { 0x0008, 0x4000, 1, VR::LT, VM::M1, "IdentifyingComments" }, { 0x0008, 0x9007, 0, VR::CS, VM::M4, "FrameType" }, { 0x0008, 0x9092, 0, VR::SQ, VM::M1, "ReferencedImageEvidenceSequence" }, { 0x0008, 0x9121, 0, VR::SQ, VM::M1, "ReferencedRawDataSequence" }, { 0x0008, 0x9123, 0, VR::UI, VM::M1, "CreatorVersionUID" }, { 0x0008, 0x9124, 0, VR::SQ, VM::M1, "DerivationImageSequence" }, { 0x0008, 0x9154, 0, VR::SQ, VM::M1, "SourceImageEvidenceSequence" }, { 0x0008, 0x9205, 0, VR::CS, VM::M1, "PixelPresentation" }, { 0x0008, 0x9206, 0, VR::CS, VM::M1, "VolumetricProperties" }, { 0x0008, 0x9207, 0, VR::CS, VM::M1, "VolumeBasedCalculationTechnique" }, { 0x0008, 0x9208, 0, VR::CS, VM::M1, "ComplexImageComponent" }, { 0x0008, 0x9209, 0, VR::CS, VM::M1, "AcquisitionContrast" }, { 0x0008, 0x9215, 0, VR::SQ, VM::M1, "DerivationCodeSequence" }, { 0x0008, 0x9237, 0, VR::SQ, VM::M1, "ReferencedPresentationStateSequence" }, { 0x0008, 0x9410, 0, VR::SQ, VM::M1, "ReferencedOtherPlaneSequence" }, { 0x0008, 0x9458, 0, VR::SQ, VM::M1, "FrameDisplaySequence" }, { 0x0008, 0x9459, 0, VR::FL, VM::M1, "RecommendedDisplayFrameRateInFloat" }, { 0x0008, 0x9460, 0, VR::CS, VM::M1, "SkipFrameRangeFlag" }, { 0x0010, 0x0010, 0, VR::PN, VM::M1, "PatientName" }, { 0x0010, 0x0020, 0, VR::LO, VM::M1, "PatientID" }, { 0x0010, 0x0021, 0, VR::LO, VM::M1, "IssuerOfPatientID" }, { 0x0010, 0x0022, 0, VR::CS, VM::M1, "TypeOfPatientID" }, { 0x0010, 0x0024, 0, VR::SQ, VM::M1, "IssuerOfPatientIDQualifiersSequence" }, { 0x0010, 0x0026, 0, VR::SQ, VM::M1, "SourcePatientGroupIdentificationSequence" }, { 0x0010, 0x0027, 0, VR::SQ, VM::M1, "GroupOfPatientsIdentificationSequence" }, { 0x0010, 0x0028, 0, VR::US, VM::M3, "SubjectRelativePositionInImage" }, { 0x0010, 0x0030, 0, VR::DA, VM::M1, "PatientBirthDate" }, { 0x0010, 0x0032, 0, VR::TM, VM::M1, "PatientBirthTime" }, { 0x0010, 0x0033, 0, VR::LO, VM::M1, "PatientBirthDateInAlternativeCalendar" }, { 0x0010, 0x0034, 0, VR::LO, VM::M1, "PatientDeathDateInAlternativeCalendar" }, { 0x0010, 0x0035, 0, VR::CS, VM::M1, "PatientAlternativeCalendar" }, { 0x0010, 0x0040, 0, VR::CS, VM::M1, "PatientSex" }, { 0x0010, 0x0050, 0, VR::SQ, VM::M1, "PatientInsurancePlanCodeSequence" }, { 0x0010, 0x0101, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageCodeSequence" }, { 0x0010, 0x0102, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageModifierCodeSequence" }, { 0x0010, 0x0200, 0, VR::CS, VM::M1, "QualityControlSubject" }, { 0x0010, 0x0201, 0, VR::SQ, VM::M1, "QualityControlSubjectTypeCodeSequence" }, { 0x0010, 0x0212, 0, VR::UC, VM::M1, "StrainDescription" }, { 0x0010, 0x0213, 0, VR::LO, VM::M1, "StrainNomenclature" }, { 0x0010, 0x0214, 0, VR::LO, VM::M1, "StrainStockNumber" }, { 0x0010, 0x0215, 0, VR::SQ, VM::M1, "StrainSourceRegistryCodeSequence" }, { 0x0010, 0x0216, 0, VR::SQ, VM::M1, "StrainStockSequence" }, { 0x0010, 0x0217, 0, VR::LO, VM::M1, "StrainSource" }, { 0x0010, 0x0218, 0, VR::UT, VM::M1, "StrainAdditionalInformation" }, { 0x0010, 0x0219, 0, VR::SQ, VM::M1, "StrainCodeSequence" }, { 0x0010, 0x0221, 0, VR::SQ, VM::M1, "GeneticModificationsSequence" }, { 0x0010, 0x0222, 0, VR::UC, VM::M1, "GeneticModificationsDescription" }, { 0x0010, 0x0223, 0, VR::LO, VM::M1, "GeneticModificationsNomenclature" }, { 0x0010, 0x0229, 0, VR::SQ, VM::M1, "GeneticModificationsCodeSequence" }, { 0x0010, 0x1000, 1, VR::LO, VM::M1TN, "OtherPatientIDs" }, { 0x0010, 0x1001, 0, VR::PN, VM::M1TN, "OtherPatientNames" }, { 0x0010, 0x1002, 0, VR::SQ, VM::M1, "OtherPatientIDsSequence" }, { 0x0010, 0x1005, 0, VR::PN, VM::M1, "PatientBirthName" }, { 0x0010, 0x1010, 0, VR::AS, VM::M1, "PatientAge" }, { 0x0010, 0x1020, 0, VR::DS, VM::M1, "PatientSize" }, { 0x0010, 0x1021, 0, VR::SQ, VM::M1, "PatientSizeCodeSequence" }, { 0x0010, 0x1022, 0, VR::DS, VM::M1, "PatientBodyMassIndex" }, { 0x0010, 0x1023, 0, VR::DS, VM::M1, "MeasuredAPDimension" }, { 0x0010, 0x1024, 0, VR::DS, VM::M1, "MeasuredLateralDimension" }, { 0x0010, 0x1030, 0, VR::DS, VM::M1, "PatientWeight" }, { 0x0010, 0x1040, 0, VR::LO, VM::M1, "PatientAddress" }, { 0x0010, 0x1050, 1, VR::LO, VM::M1TN, "InsurancePlanIdentification" }, { 0x0010, 0x1060, 0, VR::PN, VM::M1, "PatientMotherBirthName" }, { 0x0010, 0x1080, 0, VR::LO, VM::M1, "MilitaryRank" }, { 0x0010, 0x1081, 0, VR::LO, VM::M1, "BranchOfService" }, { 0x0010, 0x1090, 1, VR::LO, VM::M1, "MedicalRecordLocator" }, { 0x0010, 0x1100, 0, VR::SQ, VM::M1, "ReferencedPatientPhotoSequence" }, { 0x0010, 0x2000, 0, VR::LO, VM::M1TN, "MedicalAlerts" }, { 0x0010, 0x2110, 0, VR::LO, VM::M1TN, "Allergies" }, { 0x0010, 0x2150, 0, VR::LO, VM::M1, "CountryOfResidence" }, { 0x0010, 0x2152, 0, VR::LO, VM::M1, "RegionOfResidence" }, { 0x0010, 0x2154, 0, VR::SH, VM::M1TN, "PatientTelephoneNumbers" }, { 0x0010, 0x2155, 0, VR::LT, VM::M1, "PatientTelecomInformation" }, { 0x0010, 0x2160, 0, VR::SH, VM::M1, "EthnicGroup" }, { 0x0010, 0x2180, 0, VR::SH, VM::M1, "Occupation" }, { 0x0010, 0x21A0, 0, VR::CS, VM::M1, "SmokingStatus" }, { 0x0010, 0x21B0, 0, VR::LT, VM::M1, "AdditionalPatientHistory" }, { 0x0010, 0x21C0, 0, VR::US, VM::M1, "PregnancyStatus" }, { 0x0010, 0x21D0, 0, VR::DA, VM::M1, "LastMenstrualDate" }, { 0x0010, 0x21F0, 0, VR::LO, VM::M1, "PatientReligiousPreference" }, { 0x0010, 0x2201, 0, VR::LO, VM::M1, "PatientSpeciesDescription" }, { 0x0010, 0x2202, 0, VR::SQ, VM::M1, "PatientSpeciesCodeSequence" }, { 0x0010, 0x2203, 0, VR::CS, VM::M1, "PatientSexNeutered" }, { 0x0010, 0x2210, 0, VR::CS, VM::M1, "AnatomicalOrientationType" }, { 0x0010, 0x2292, 0, VR::LO, VM::M1, "PatientBreedDescription" }, { 0x0010, 0x2293, 0, VR::SQ, VM::M1, "PatientBreedCodeSequence" }, { 0x0010, 0x2294, 0, VR::SQ, VM::M1, "BreedRegistrationSequence" }, { 0x0010, 0x2295, 0, VR::LO, VM::M1, "BreedRegistrationNumber" }, { 0x0010, 0x2296, 0, VR::SQ, VM::M1, "BreedRegistryCodeSequence" }, { 0x0010, 0x2297, 0, VR::PN, VM::M1, "ResponsiblePerson" }, { 0x0010, 0x2298, 0, VR::CS, VM::M1, "ResponsiblePersonRole" }, { 0x0010, 0x2299, 0, VR::LO, VM::M1, "ResponsibleOrganization" }, { 0x0010, 0x4000, 0, VR::LT, VM::M1, "PatientComments" }, { 0x0010, 0x9431, 0, VR::FL, VM::M1, "ExaminedBodyThickness" }, { 0x0012, 0x0010, 0, VR::LO, VM::M1, "ClinicalTrialSponsorName" }, { 0x0012, 0x0020, 0, VR::LO, VM::M1, "ClinicalTrialProtocolID" }, { 0x0012, 0x0021, 0, VR::LO, VM::M1, "ClinicalTrialProtocolName" }, { 0x0012, 0x0030, 0, VR::LO, VM::M1, "ClinicalTrialSiteID" }, { 0x0012, 0x0031, 0, VR::LO, VM::M1, "ClinicalTrialSiteName" }, { 0x0012, 0x0040, 0, VR::LO, VM::M1, "ClinicalTrialSubjectID" }, { 0x0012, 0x0042, 0, VR::LO, VM::M1, "ClinicalTrialSubjectReadingID" }, { 0x0012, 0x0050, 0, VR::LO, VM::M1, "ClinicalTrialTimePointID" }, { 0x0012, 0x0051, 0, VR::ST, VM::M1, "ClinicalTrialTimePointDescription" }, { 0x0012, 0x0052, 0, VR::FD, VM::M1, "LongitudinalTemporalOffsetFromEvent" }, { 0x0012, 0x0053, 0, VR::CS, VM::M1, "LongitudinalTemporalEventType" }, { 0x0012, 0x0060, 0, VR::LO, VM::M1, "ClinicalTrialCoordinatingCenterName" }, { 0x0012, 0x0062, 0, VR::CS, VM::M1, "PatientIdentityRemoved" }, { 0x0012, 0x0063, 0, VR::LO, VM::M1TN, "DeidentificationMethod" }, { 0x0012, 0x0064, 0, VR::SQ, VM::M1, "DeidentificationMethodCodeSequence" }, { 0x0012, 0x0071, 0, VR::LO, VM::M1, "ClinicalTrialSeriesID" }, { 0x0012, 0x0072, 0, VR::LO, VM::M1, "ClinicalTrialSeriesDescription" }, { 0x0012, 0x0081, 0, VR::LO, VM::M1, "ClinicalTrialProtocolEthicsCommitteeName" }, { 0x0012, 0x0082, 0, VR::LO, VM::M1, "ClinicalTrialProtocolEthicsCommitteeApprovalNumber" }, { 0x0012, 0x0083, 0, VR::SQ, VM::M1, "ConsentForClinicalTrialUseSequence" }, { 0x0012, 0x0084, 0, VR::CS, VM::M1, "DistributionType" }, { 0x0012, 0x0085, 0, VR::CS, VM::M1, "ConsentForDistributionFlag" }, { 0x0012, 0x0086, 0, VR::DA, VM::M1, "EthicsCommitteeApprovalEffectivenessStartDate" }, { 0x0012, 0x0087, 0, VR::DA, VM::M1, "EthicsCommitteeApprovalEffectivenessEndDate" }, { 0x0014, 0x0023, 1, VR::ST, VM::M1, "CADFileFormat" }, { 0x0014, 0x0024, 1, VR::ST, VM::M1, "ComponentReferenceSystem" }, { 0x0014, 0x0025, 2, VR::ST, VM::M1, "ComponentManufacturingProcedure" }, { 0x0014, 0x0028, 2, VR::ST, VM::M1, "ComponentManufacturer" }, { 0x0014, 0x0030, 2, VR::DS, VM::M1TN, "MaterialThickness" }, { 0x0014, 0x0032, 2, VR::DS, VM::M1TN, "MaterialPipeDiameter" }, { 0x0014, 0x0034, 2, VR::DS, VM::M1TN, "MaterialIsolationDiameter" }, { 0x0014, 0x0042, 2, VR::ST, VM::M1, "MaterialGrade" }, { 0x0014, 0x0044, 2, VR::ST, VM::M1, "MaterialPropertiesDescription" }, { 0x0014, 0x0045, 1, VR::ST, VM::M1, "MaterialPropertiesFileFormatRetired" }, { 0x0014, 0x0046, 2, VR::LT, VM::M1, "MaterialNotes" }, { 0x0014, 0x0050, 2, VR::CS, VM::M1, "ComponentShape" }, { 0x0014, 0x0052, 2, VR::CS, VM::M1, "CurvatureType" }, { 0x0014, 0x0054, 2, VR::DS, VM::M1, "OuterDiameter" }, { 0x0014, 0x0056, 2, VR::DS, VM::M1, "InnerDiameter" }, { 0x0014, 0x0100, 2, VR::LO, VM::M1TN, "ComponentWelderIDs" }, { 0x0014, 0x0101, 2, VR::CS, VM::M1, "SecondaryApprovalStatus" }, { 0x0014, 0x0102, 2, VR::DA, VM::M1, "SecondaryReviewDate" }, { 0x0014, 0x0103, 2, VR::TM, VM::M1, "SecondaryReviewTime" }, { 0x0014, 0x0104, 2, VR::PN, VM::M1, "SecondaryReviewerName" }, { 0x0014, 0x0105, 2, VR::ST, VM::M1, "RepairID" }, { 0x0014, 0x0106, 2, VR::SQ, VM::M1, "MultipleComponentApprovalSequence" }, { 0x0014, 0x0107, 2, VR::CS, VM::M1TN, "OtherApprovalStatus" }, { 0x0014, 0x0108, 2, VR::CS, VM::M1TN, "OtherSecondaryApprovalStatus" }, { 0x0014, 0x1010, 2, VR::ST, VM::M1, "ActualEnvironmentalConditions" }, { 0x0014, 0x1020, 2, VR::DA, VM::M1, "ExpiryDate" }, { 0x0014, 0x1040, 2, VR::ST, VM::M1, "EnvironmentalConditions" }, { 0x0014, 0x2002, 2, VR::SQ, VM::M1, "EvaluatorSequence" }, { 0x0014, 0x2004, 2, VR::IS, VM::M1, "EvaluatorNumber" }, { 0x0014, 0x2006, 2, VR::PN, VM::M1, "EvaluatorName" }, { 0x0014, 0x2008, 2, VR::IS, VM::M1, "EvaluationAttempt" }, { 0x0014, 0x2012, 2, VR::SQ, VM::M1, "IndicationSequence" }, { 0x0014, 0x2014, 2, VR::IS, VM::M1, "IndicationNumber" }, { 0x0014, 0x2016, 2, VR::SH, VM::M1, "IndicationLabel" }, { 0x0014, 0x2018, 2, VR::ST, VM::M1, "IndicationDescription" }, { 0x0014, 0x201A, 2, VR::CS, VM::M1TN, "IndicationType" }, { 0x0014, 0x201C, 2, VR::CS, VM::M1, "IndicationDisposition" }, { 0x0014, 0x201E, 2, VR::SQ, VM::M1, "IndicationROISequence" }, { 0x0014, 0x2030, 2, VR::SQ, VM::M1, "IndicationPhysicalPropertySequence" }, { 0x0014, 0x2032, 2, VR::SH, VM::M1, "PropertyLabel" }, { 0x0014, 0x2202, 2, VR::IS, VM::M1, "CoordinateSystemNumberOfAxes" }, { 0x0014, 0x2204, 2, VR::SQ, VM::M1, "CoordinateSystemAxesSequence" }, { 0x0014, 0x2206, 2, VR::ST, VM::M1, "CoordinateSystemAxisDescription" }, { 0x0014, 0x2208, 2, VR::CS, VM::M1, "CoordinateSystemDataSetMapping" }, { 0x0014, 0x220A, 2, VR::IS, VM::M1, "CoordinateSystemAxisNumber" }, { 0x0014, 0x220C, 2, VR::CS, VM::M1, "CoordinateSystemAxisType" }, { 0x0014, 0x220E, 2, VR::CS, VM::M1, "CoordinateSystemAxisUnits" }, { 0x0014, 0x2210, 2, VR::OB, VM::M1, "CoordinateSystemAxisValues" }, { 0x0014, 0x2220, 2, VR::SQ, VM::M1, "CoordinateSystemTransformSequence" }, { 0x0014, 0x2222, 2, VR::ST, VM::M1, "TransformDescription" }, { 0x0014, 0x2224, 2, VR::IS, VM::M1, "TransformNumberOfAxes" }, { 0x0014, 0x2226, 2, VR::IS, VM::M1TN, "TransformOrderOfAxes" }, { 0x0014, 0x2228, 2, VR::CS, VM::M1, "TransformedAxisUnits" }, { 0x0014, 0x222A, 2, VR::DS, VM::M1TN, "CoordinateSystemTransformRotationAndScaleMatrix" }, { 0x0014, 0x222C, 2, VR::DS, VM::M1TN, "CoordinateSystemTransformTranslationMatrix" }, { 0x0014, 0x3011, 2, VR::DS, VM::M1, "InternalDetectorFrameTime" }, { 0x0014, 0x3012, 2, VR::DS, VM::M1, "NumberOfFramesIntegrated" }, { 0x0014, 0x3020, 2, VR::SQ, VM::M1, "DetectorTemperatureSequence" }, { 0x0014, 0x3022, 2, VR::ST, VM::M1, "SensorName" }, { 0x0014, 0x3024, 2, VR::DS, VM::M1, "HorizontalOffsetOfSensor" }, { 0x0014, 0x3026, 2, VR::DS, VM::M1, "VerticalOffsetOfSensor" }, { 0x0014, 0x3028, 2, VR::DS, VM::M1, "SensorTemperature" }, { 0x0014, 0x3040, 2, VR::SQ, VM::M1, "DarkCurrentSequence" }, { 0x0014, 0x3050, 2, VR::OX, VM::M1, "DarkCurrentCounts" }, { 0x0014, 0x3060, 2, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" }, { 0x0014, 0x3070, 2, VR::OX, VM::M1, "AirCounts" }, { 0x0014, 0x3071, 2, VR::DS, VM::M1, "KVUsedInGainCalibration" }, { 0x0014, 0x3072, 2, VR::DS, VM::M1, "MAUsedInGainCalibration" }, { 0x0014, 0x3073, 2, VR::DS, VM::M1, "NumberOfFramesUsedForIntegration" }, { 0x0014, 0x3074, 2, VR::LO, VM::M1, "FilterMaterialUsedInGainCalibration" }, { 0x0014, 0x3075, 2, VR::DS, VM::M1, "FilterThicknessUsedInGainCalibration" }, { 0x0014, 0x3076, 2, VR::DA, VM::M1, "DateOfGainCalibration" }, { 0x0014, 0x3077, 2, VR::TM, VM::M1, "TimeOfGainCalibration" }, { 0x0014, 0x3080, 2, VR::OB, VM::M1, "BadPixelImage" }, { 0x0014, 0x3099, 2, VR::LT, VM::M1, "CalibrationNotes" }, { 0x0014, 0x4002, 2, VR::SQ, VM::M1, "PulserEquipmentSequence" }, { 0x0014, 0x4004, 2, VR::CS, VM::M1, "PulserType" }, { 0x0014, 0x4006, 2, VR::LT, VM::M1, "PulserNotes" }, { 0x0014, 0x4008, 2, VR::SQ, VM::M1, "ReceiverEquipmentSequence" }, { 0x0014, 0x400A, 2, VR::CS, VM::M1, "AmplifierType" }, { 0x0014, 0x400C, 2, VR::LT, VM::M1, "ReceiverNotes" }, { 0x0014, 0x400E, 2, VR::SQ, VM::M1, "PreAmplifierEquipmentSequence" }, { 0x0014, 0x400F, 2, VR::LT, VM::M1, "PreAmplifierNotes" }, { 0x0014, 0x4010, 2, VR::SQ, VM::M1, "TransmitTransducerSequence" }, { 0x0014, 0x4011, 2, VR::SQ, VM::M1, "ReceiveTransducerSequence" }, { 0x0014, 0x4012, 2, VR::US, VM::M1, "NumberOfElements" }, { 0x0014, 0x4013, 2, VR::CS, VM::M1, "ElementShape" }, { 0x0014, 0x4014, 2, VR::DS, VM::M1, "ElementDimensionA" }, { 0x0014, 0x4015, 2, VR::DS, VM::M1, "ElementDimensionB" }, { 0x0014, 0x4016, 2, VR::DS, VM::M1, "ElementPitchA" }, { 0x0014, 0x4017, 2, VR::DS, VM::M1, "MeasuredBeamDimensionA" }, { 0x0014, 0x4018, 2, VR::DS, VM::M1, "MeasuredBeamDimensionB" }, { 0x0014, 0x4019, 2, VR::DS, VM::M1, "LocationOfMeasuredBeamDiameter" }, { 0x0014, 0x401A, 2, VR::DS, VM::M1, "NominalFrequency" }, { 0x0014, 0x401B, 2, VR::DS, VM::M1, "MeasuredCenterFrequency" }, { 0x0014, 0x401C, 2, VR::DS, VM::M1, "MeasuredBandwidth" }, { 0x0014, 0x401D, 2, VR::DS, VM::M1, "ElementPitchB" }, { 0x0014, 0x4020, 2, VR::SQ, VM::M1, "PulserSettingsSequence" }, { 0x0014, 0x4022, 2, VR::DS, VM::M1, "PulseWidth" }, { 0x0014, 0x4024, 2, VR::DS, VM::M1, "ExcitationFrequency" }, { 0x0014, 0x4026, 2, VR::CS, VM::M1, "ModulationType" }, { 0x0014, 0x4028, 2, VR::DS, VM::M1, "Damping" }, { 0x0014, 0x4030, 2, VR::SQ, VM::M1, "ReceiverSettingsSequence" }, { 0x0014, 0x4031, 2, VR::DS, VM::M1, "AcquiredSoundpathLength" }, { 0x0014, 0x4032, 2, VR::CS, VM::M1, "AcquisitionCompressionType" }, { 0x0014, 0x4033, 2, VR::IS, VM::M1, "AcquisitionSampleSize" }, { 0x0014, 0x4034, 2, VR::DS, VM::M1, "RectifierSmoothing" }, { 0x0014, 0x4035, 2, VR::SQ, VM::M1, "DACSequence" }, { 0x0014, 0x4036, 2, VR::CS, VM::M1, "DACType" }, { 0x0014, 0x4038, 2, VR::DS, VM::M1TN, "DACGainPoints" }, { 0x0014, 0x403A, 2, VR::DS, VM::M1TN, "DACTimePoints" }, { 0x0014, 0x403C, 2, VR::DS, VM::M1TN, "DACAmplitude" }, { 0x0014, 0x4040, 2, VR::SQ, VM::M1, "PreAmplifierSettingsSequence" }, { 0x0014, 0x4050, 2, VR::SQ, VM::M1, "TransmitTransducerSettingsSequence" }, { 0x0014, 0x4051, 2, VR::SQ, VM::M1, "ReceiveTransducerSettingsSequence" }, { 0x0014, 0x4052, 2, VR::DS, VM::M1, "IncidentAngle" }, { 0x0014, 0x4054, 2, VR::ST, VM::M1, "CouplingTechnique" }, { 0x0014, 0x4056, 2, VR::ST, VM::M1, "CouplingMedium" }, { 0x0014, 0x4057, 2, VR::DS, VM::M1, "CouplingVelocity" }, { 0x0014, 0x4058, 2, VR::DS, VM::M1, "ProbeCenterLocationX" }, { 0x0014, 0x4059, 2, VR::DS, VM::M1, "ProbeCenterLocationZ" }, { 0x0014, 0x405A, 2, VR::DS, VM::M1, "SoundPathLength" }, { 0x0014, 0x405C, 2, VR::ST, VM::M1, "DelayLawIdentifier" }, { 0x0014, 0x4060, 2, VR::SQ, VM::M1, "GateSettingsSequence" }, { 0x0014, 0x4062, 2, VR::DS, VM::M1, "GateThreshold" }, { 0x0014, 0x4064, 2, VR::DS, VM::M1, "VelocityOfSound" }, { 0x0014, 0x4070, 2, VR::SQ, VM::M1, "CalibrationSettingsSequence" }, { 0x0014, 0x4072, 2, VR::ST, VM::M1, "CalibrationProcedure" }, { 0x0014, 0x4074, 2, VR::SH, VM::M1, "ProcedureVersion" }, { 0x0014, 0x4076, 2, VR::DA, VM::M1, "ProcedureCreationDate" }, { 0x0014, 0x4078, 2, VR::DA, VM::M1, "ProcedureExpirationDate" }, { 0x0014, 0x407A, 2, VR::DA, VM::M1, "ProcedureLastModifiedDate" }, { 0x0014, 0x407C, 2, VR::TM, VM::M1TN, "CalibrationTime" }, { 0x0014, 0x407E, 2, VR::DA, VM::M1TN, "CalibrationDate" }, { 0x0014, 0x4080, 2, VR::SQ, VM::M1, "ProbeDriveEquipmentSequence" }, { 0x0014, 0x4081, 2, VR::CS, VM::M1, "DriveType" }, { 0x0014, 0x4082, 2, VR::LT, VM::M1, "ProbeDriveNotes" }, { 0x0014, 0x4083, 2, VR::SQ, VM::M1, "DriveProbeSequence" }, { 0x0014, 0x4084, 2, VR::DS, VM::M1, "ProbeInductance" }, { 0x0014, 0x4085, 2, VR::DS, VM::M1, "ProbeResistance" }, { 0x0014, 0x4086, 2, VR::SQ, VM::M1, "ReceiveProbeSequence" }, { 0x0014, 0x4087, 2, VR::SQ, VM::M1, "ProbeDriveSettingsSequence" }, { 0x0014, 0x4088, 2, VR::DS, VM::M1, "BridgeResistors" }, { 0x0014, 0x4089, 2, VR::DS, VM::M1, "ProbeOrientationAngle" }, { 0x0014, 0x408B, 2, VR::DS, VM::M1, "UserSelectedGainY" }, { 0x0014, 0x408C, 2, VR::DS, VM::M1, "UserSelectedPhase" }, { 0x0014, 0x408D, 2, VR::DS, VM::M1, "UserSelectedOffsetX" }, { 0x0014, 0x408E, 2, VR::DS, VM::M1, "UserSelectedOffsetY" }, { 0x0014, 0x4091, 2, VR::SQ, VM::M1, "ChannelSettingsSequence" }, { 0x0014, 0x4092, 2, VR::DS, VM::M1, "ChannelThreshold" }, { 0x0014, 0x409A, 2, VR::SQ, VM::M1, "ScannerSettingsSequence" }, { 0x0014, 0x409B, 2, VR::ST, VM::M1, "ScanProcedure" }, { 0x0014, 0x409C, 2, VR::DS, VM::M1, "TranslationRateX" }, { 0x0014, 0x409D, 2, VR::DS, VM::M1, "TranslationRateY" }, { 0x0014, 0x409F, 2, VR::DS, VM::M1, "ChannelOverlap" }, { 0x0014, 0x40A0, 2, VR::LO, VM::M1, "ImageQualityIndicatorType" }, { 0x0014, 0x40A1, 2, VR::LO, VM::M1, "ImageQualityIndicatorMaterial" }, { 0x0014, 0x40A2, 2, VR::LO, VM::M1, "ImageQualityIndicatorSize" }, { 0x0014, 0x5002, 2, VR::IS, VM::M1, "LINACEnergy" }, { 0x0014, 0x5004, 2, VR::IS, VM::M1, "LINACOutput" }, { 0x0014, 0x5100, 2, VR::US, VM::M1, "ActiveAperture" }, { 0x0014, 0x5101, 2, VR::DS, VM::M1, "TotalAperture" }, { 0x0014, 0x5102, 2, VR::DS, VM::M1, "ApertureElevation" }, { 0x0014, 0x5103, 2, VR::DS, VM::M1, "MainLobeAngle" }, { 0x0014, 0x5104, 2, VR::DS, VM::M1, "MainRoofAngle" }, { 0x0014, 0x5105, 2, VR::CS, VM::M1, "ConnectorType" }, { 0x0014, 0x5106, 2, VR::SH, VM::M1, "WedgeModelNumber" }, { 0x0014, 0x5107, 2, VR::DS, VM::M1, "WedgeAngleFloat" }, { 0x0014, 0x5108, 2, VR::DS, VM::M1, "WedgeRoofAngle" }, { 0x0014, 0x5109, 2, VR::CS, VM::M1, "WedgeElement1Position" }, { 0x0014, 0x510A, 2, VR::DS, VM::M1, "WedgeMaterialVelocity" }, { 0x0014, 0x510B, 2, VR::SH, VM::M1, "WedgeMaterial" }, { 0x0014, 0x510C, 2, VR::DS, VM::M1, "WedgeOffsetZ" }, { 0x0014, 0x510D, 2, VR::DS, VM::M1, "WedgeOriginOffsetX" }, { 0x0014, 0x510E, 2, VR::DS, VM::M1, "WedgeTimeDelay" }, { 0x0014, 0x510F, 2, VR::SH, VM::M1, "WedgeName" }, { 0x0014, 0x5110, 2, VR::SH, VM::M1, "WedgeManufacturerName" }, { 0x0014, 0x5111, 2, VR::LO, VM::M1, "WedgeDescription" }, { 0x0014, 0x5112, 2, VR::DS, VM::M1, "NominalBeamAngle" }, { 0x0014, 0x5113, 2, VR::DS, VM::M1, "WedgeOffsetX" }, { 0x0014, 0x5114, 2, VR::DS, VM::M1, "WedgeOffsetY" }, { 0x0014, 0x5115, 2, VR::DS, VM::M1, "WedgeTotalLength" }, { 0x0014, 0x5116, 2, VR::DS, VM::M1, "WedgeInContactLength" }, { 0x0014, 0x5117, 2, VR::DS, VM::M1, "WedgeFrontGap" }, { 0x0014, 0x5118, 2, VR::DS, VM::M1, "WedgeTotalHeight" }, { 0x0014, 0x5119, 2, VR::DS, VM::M1, "WedgeFrontHeight" }, { 0x0014, 0x511A, 2, VR::DS, VM::M1, "WedgeRearHeight" }, { 0x0014, 0x511B, 2, VR::DS, VM::M1, "WedgeTotalWidth" }, { 0x0014, 0x511C, 2, VR::DS, VM::M1, "WedgeInContactWidth" }, { 0x0014, 0x511D, 2, VR::DS, VM::M1, "WedgeChamferHeight" }, { 0x0014, 0x511E, 2, VR::CS, VM::M1, "WedgeCurve" }, { 0x0014, 0x511F, 2, VR::DS, VM::M1, "RadiusAlongWedge" }, { 0x0016, 0x0001, 0, VR::DS, VM::M1, "WhitePoint" }, { 0x0016, 0x0002, 0, VR::DS, VM::M3, "PrimaryChromaticities" }, { 0x0016, 0x0003, 0, VR::UT, VM::M1, "BatteryLevel" }, { 0x0016, 0x0004, 0, VR::DS, VM::M1, "ExposureTimeInSeconds" }, { 0x0016, 0x0005, 0, VR::DS, VM::M1, "FNumber" }, { 0x0016, 0x0006, 0, VR::IS, VM::M1, "OECFRows" }, { 0x0016, 0x0007, 0, VR::IS, VM::M1, "OECFColumns" }, { 0x0016, 0x0008, 0, VR::UC, VM::M1TN, "OECFColumnNames" }, { 0x0016, 0x0009, 0, VR::DS, VM::M1TN, "OECFValues" }, { 0x0016, 0x000A, 0, VR::IS, VM::M1, "SpatialFrequencyResponseRows" }, { 0x0016, 0x000B, 0, VR::IS, VM::M1, "SpatialFrequencyResponseColumns" }, { 0x0016, 0x000C, 0, VR::UC, VM::M1TN, "SpatialFrequencyResponseColumnNames" }, { 0x0016, 0x000D, 0, VR::DS, VM::M1TN, "SpatialFrequencyResponseValues" }, { 0x0016, 0x000E, 0, VR::IS, VM::M1, "ColorFilterArrayPatternRows" }, { 0x0016, 0x000F, 0, VR::IS, VM::M1, "ColorFilterArrayPatternColumns" }, { 0x0016, 0x0010, 0, VR::DS, VM::M1TN, "ColorFilterArrayPatternValues" }, { 0x0016, 0x0011, 0, VR::US, VM::M1, "FlashFiringStatus" }, { 0x0016, 0x0012, 0, VR::US, VM::M1, "FlashReturnStatus" }, { 0x0016, 0x0013, 0, VR::US, VM::M1, "FlashMode" }, { 0x0016, 0x0014, 0, VR::US, VM::M1, "FlashFunctionPresent" }, { 0x0016, 0x0015, 0, VR::US, VM::M1, "FlashRedEyeMode" }, { 0x0016, 0x0016, 0, VR::US, VM::M1, "ExposureProgram" }, { 0x0016, 0x0017, 0, VR::UT, VM::M1, "SpectralSensitivity" }, { 0x0016, 0x0018, 0, VR::IS, VM::M1, "PhotographicSensitivity" }, { 0x0016, 0x0019, 0, VR::IS, VM::M1, "SelfTimerMode" }, { 0x0016, 0x001A, 0, VR::US, VM::M1, "SensitivityType" }, { 0x0016, 0x001B, 0, VR::IS, VM::M1, "StandardOutputSensitivity" }, { 0x0016, 0x001C, 0, VR::IS, VM::M1, "RecommendedExposureIndex" }, { 0x0016, 0x001D, 0, VR::IS, VM::M1, "ISOSpeed" }, { 0x0016, 0x001E, 0, VR::IS, VM::M1, "ISOSpeedLatitudeyyy" }, { 0x0016, 0x001F, 0, VR::IS, VM::M1, "ISOSpeedLatitudezzz" }, { 0x0016, 0x0020, 0, VR::UT, VM::M1, "EXIFVersion" }, { 0x0016, 0x0021, 0, VR::DS, VM::M1, "ShutterSpeedValue" }, { 0x0016, 0x0022, 0, VR::DS, VM::M1, "ApertureValue" }, { 0x0016, 0x0023, 0, VR::DS, VM::M1, "BrightnessValue" }, { 0x0016, 0x0024, 0, VR::DS, VM::M1, "ExposureBiasValue" }, { 0x0016, 0x0025, 0, VR::DS, VM::M1, "MaxApertureValue" }, { 0x0016, 0x0026, 0, VR::DS, VM::M1, "SubjectDistance" }, { 0x0016, 0x0027, 0, VR::US, VM::M1, "MeteringMode" }, { 0x0016, 0x0028, 0, VR::US, VM::M1, "LightSource" }, { 0x0016, 0x0029, 0, VR::DS, VM::M1, "FocalLength" }, { 0x0016, 0x002A, 0, VR::IS, VM::M2T4, "SubjectArea" }, { 0x0016, 0x002B, 0, VR::OB, VM::M1, "MakerNote" }, { 0x0016, 0x0030, 0, VR::DS, VM::M1, "Temperature" }, { 0x0016, 0x0031, 0, VR::DS, VM::M1, "Humidity" }, { 0x0016, 0x0032, 0, VR::DS, VM::M1, "Pressure" }, { 0x0016, 0x0033, 0, VR::DS, VM::M1, "WaterDepth" }, { 0x0016, 0x0034, 0, VR::DS, VM::M1, "Acceleration" }, { 0x0016, 0x0035, 0, VR::DS, VM::M1, "CameraElevationAngle" }, { 0x0016, 0x0036, 0, VR::DS, VM::M1T2, "FlashEnergy" }, { 0x0016, 0x0037, 0, VR::IS, VM::M2, "SubjectLocation" }, { 0x0016, 0x0038, 0, VR::DS, VM::M1, "PhotographicExposureIndex" }, { 0x0016, 0x0039, 0, VR::US, VM::M1, "SensingMethod" }, { 0x0016, 0x003A, 0, VR::US, VM::M1, "FileSource" }, { 0x0016, 0x003B, 0, VR::US, VM::M1, "SceneType" }, { 0x0016, 0x0041, 0, VR::US, VM::M1, "CustomRendered" }, { 0x0016, 0x0042, 0, VR::US, VM::M1, "ExposureMode" }, { 0x0016, 0x0043, 0, VR::US, VM::M1, "WhiteBalance" }, { 0x0016, 0x0044, 0, VR::DS, VM::M1, "DigitalZoomRatio" }, { 0x0016, 0x0045, 0, VR::IS, VM::M1, "FocalLengthIn35mmFilm" }, { 0x0016, 0x0046, 0, VR::US, VM::M1, "SceneCaptureType" }, { 0x0016, 0x0047, 0, VR::US, VM::M1, "GainControl" }, { 0x0016, 0x0048, 0, VR::US, VM::M1, "Contrast" }, { 0x0016, 0x0049, 0, VR::US, VM::M1, "Saturation" }, { 0x0016, 0x004A, 0, VR::US, VM::M1, "Sharpness" }, { 0x0016, 0x004B, 0, VR::OB, VM::M1, "DeviceSettingDescription" }, { 0x0016, 0x004C, 0, VR::US, VM::M1, "SubjectDistanceRange" }, { 0x0016, 0x004D, 0, VR::UT, VM::M1, "CameraOwnerName" }, { 0x0016, 0x004E, 0, VR::DS, VM::M4, "LensSpecification" }, { 0x0016, 0x004F, 0, VR::UT, VM::M1, "LensMake" }, { 0x0016, 0x0050, 0, VR::UT, VM::M1, "LensModel" }, { 0x0016, 0x0051, 0, VR::UT, VM::M1, "LensSerialNumber" }, { 0x0016, 0x0061, 0, VR::CS, VM::M1, "InteroperabilityIndex" }, { 0x0016, 0x0062, 0, VR::OB, VM::M1, "InteroperabilityVersion" }, { 0x0016, 0x0070, 0, VR::OB, VM::M1, "GPSVersionID" }, { 0x0016, 0x0071, 0, VR::CS, VM::M1, "GPSLatitudeRef" }, { 0x0016, 0x0072, 0, VR::DS, VM::M3, "GPSLatitude" }, { 0x0016, 0x0073, 0, VR::CS, VM::M1, "GPSLongitudeRef" }, { 0x0016, 0x0074, 0, VR::DS, VM::M3, "GPSLongitude" }, { 0x0016, 0x0075, 0, VR::US, VM::M1, "GPSAltitudeRef" }, { 0x0016, 0x0076, 0, VR::DS, VM::M1, "GPSAltitude" }, { 0x0016, 0x0077, 0, VR::DT, VM::M1, "GPSTimeStamp" }, { 0x0016, 0x0078, 0, VR::UT, VM::M1, "GPSSatellites" }, { 0x0016, 0x0079, 0, VR::CS, VM::M1, "GPSStatus" }, { 0x0016, 0x007A, 0, VR::CS, VM::M1, "GPSMeasureMode" }, { 0x0016, 0x007B, 0, VR::DS, VM::M1, "GPSDOP" }, { 0x0016, 0x007C, 0, VR::CS, VM::M1, "GPSSpeedRef" }, { 0x0016, 0x007D, 0, VR::DS, VM::M1, "GPSSpeed" }, { 0x0016, 0x007E, 0, VR::CS, VM::M1, "GPSTrackRef" }, { 0x0016, 0x007F, 0, VR::DS, VM::M1, "GPSTrack" }, { 0x0016, 0x0080, 0, VR::CS, VM::M1, "GPSImgDirectionRef" }, { 0x0016, 0x0081, 0, VR::DS, VM::M1, "GPSImgDirection" }, { 0x0016, 0x0082, 0, VR::UT, VM::M1, "GPSMapDatum" }, { 0x0016, 0x0083, 0, VR::CS, VM::M1, "GPSDestLatitudeRef" }, { 0x0016, 0x0084, 0, VR::DS, VM::M3, "GPSDestLatitude" }, { 0x0016, 0x0085, 0, VR::CS, VM::M1, "GPSDestLongitudeRef" }, { 0x0016, 0x0086, 0, VR::DS, VM::M3, "GPSDestLongitude" }, { 0x0016, 0x0087, 0, VR::CS, VM::M1, "GPSDestBearingRef" }, { 0x0016, 0x0088, 0, VR::DS, VM::M1, "GPSDestBearing" }, { 0x0016, 0x0089, 0, VR::CS, VM::M1, "GPSDestDistanceRef" }, { 0x0016, 0x008A, 0, VR::DS, VM::M1, "GPSDestDistance" }, { 0x0016, 0x008B, 0, VR::OB, VM::M1, "GPSProcessingMethod" }, { 0x0016, 0x008C, 0, VR::OB, VM::M1, "GPSAreaInformation" }, { 0x0016, 0x008D, 0, VR::DT, VM::M1, "GPSDateStamp" }, { 0x0016, 0x008E, 0, VR::IS, VM::M1, "GPSDifferential" }, { 0x0018, 0x0010, 0, VR::LO, VM::M1, "ContrastBolusAgent" }, { 0x0018, 0x0012, 0, VR::SQ, VM::M1, "ContrastBolusAgentSequence" }, { 0x0018, 0x0013, 0, VR::FL, VM::M1, "ContrastBolusT1Relaxivity" }, { 0x0018, 0x0014, 0, VR::SQ, VM::M1, "ContrastBolusAdministrationRouteSequence" }, { 0x0018, 0x0015, 0, VR::CS, VM::M1, "BodyPartExamined" }, { 0x0018, 0x0020, 0, VR::CS, VM::M1TN, "ScanningSequence" }, { 0x0018, 0x0021, 0, VR::CS, VM::M1TN, "SequenceVariant" }, { 0x0018, 0x0022, 0, VR::CS, VM::M1TN, "ScanOptions" }, { 0x0018, 0x0023, 0, VR::CS, VM::M1, "MRAcquisitionType" }, { 0x0018, 0x0024, 0, VR::SH, VM::M1, "SequenceName" }, { 0x0018, 0x0025, 0, VR::CS, VM::M1, "AngioFlag" }, { 0x0018, 0x0026, 0, VR::SQ, VM::M1, "InterventionDrugInformationSequence" }, { 0x0018, 0x0027, 0, VR::TM, VM::M1, "InterventionDrugStopTime" }, { 0x0018, 0x0028, 0, VR::DS, VM::M1, "InterventionDrugDose" }, { 0x0018, 0x0029, 0, VR::SQ, VM::M1, "InterventionDrugCodeSequence" }, { 0x0018, 0x002A, 0, VR::SQ, VM::M1, "AdditionalDrugSequence" }, { 0x0018, 0x0030, 1, VR::LO, VM::M1TN, "Radionuclide" }, { 0x0018, 0x0031, 0, VR::LO, VM::M1, "Radiopharmaceutical" }, { 0x0018, 0x0032, 1, VR::DS, VM::M1, "EnergyWindowCenterline" }, { 0x0018, 0x0033, 1, VR::DS, VM::M1TN, "EnergyWindowTotalWidth" }, { 0x0018, 0x0034, 0, VR::LO, VM::M1, "InterventionDrugName" }, { 0x0018, 0x0035, 0, VR::TM, VM::M1, "InterventionDrugStartTime" }, { 0x0018, 0x0036, 0, VR::SQ, VM::M1, "InterventionSequence" }, { 0x0018, 0x0037, 1, VR::CS, VM::M1, "TherapyType" }, { 0x0018, 0x0038, 0, VR::CS, VM::M1, "InterventionStatus" }, { 0x0018, 0x0039, 1, VR::CS, VM::M1, "TherapyDescription" }, { 0x0018, 0x003A, 0, VR::ST, VM::M1, "InterventionDescription" }, { 0x0018, 0x0040, 0, VR::IS, VM::M1, "CineRate" }, { 0x0018, 0x0042, 0, VR::CS, VM::M1, "InitialCineRunState" }, { 0x0018, 0x0050, 0, VR::DS, VM::M1, "SliceThickness" }, { 0x0018, 0x0060, 0, VR::DS, VM::M1, "KVP" }, { 0x0018, 0x0070, 0, VR::IS, VM::M1, "CountsAccumulated" }, { 0x0018, 0x0071, 0, VR::CS, VM::M1, "AcquisitionTerminationCondition" }, { 0x0018, 0x0072, 0, VR::DS, VM::M1, "EffectiveDuration" }, { 0x0018, 0x0073, 0, VR::CS, VM::M1, "AcquisitionStartCondition" }, { 0x0018, 0x0074, 0, VR::IS, VM::M1, "AcquisitionStartConditionData" }, { 0x0018, 0x0075, 0, VR::IS, VM::M1, "AcquisitionTerminationConditionData" }, { 0x0018, 0x0080, 0, VR::DS, VM::M1, "RepetitionTime" }, { 0x0018, 0x0081, 0, VR::DS, VM::M1, "EchoTime" }, { 0x0018, 0x0082, 0, VR::DS, VM::M1, "InversionTime" }, { 0x0018, 0x0083, 0, VR::DS, VM::M1, "NumberOfAverages" }, { 0x0018, 0x0084, 0, VR::DS, VM::M1, "ImagingFrequency" }, { 0x0018, 0x0085, 0, VR::SH, VM::M1, "ImagedNucleus" }, { 0x0018, 0x0086, 0, VR::IS, VM::M1TN, "EchoNumbers" }, { 0x0018, 0x0087, 0, VR::DS, VM::M1, "MagneticFieldStrength" }, { 0x0018, 0x0088, 0, VR::DS, VM::M1, "SpacingBetweenSlices" }, { 0x0018, 0x0089, 0, VR::IS, VM::M1, "NumberOfPhaseEncodingSteps" }, { 0x0018, 0x0090, 0, VR::DS, VM::M1, "DataCollectionDiameter" }, { 0x0018, 0x0091, 0, VR::IS, VM::M1, "EchoTrainLength" }, { 0x0018, 0x0093, 0, VR::DS, VM::M1, "PercentSampling" }, { 0x0018, 0x0094, 0, VR::DS, VM::M1, "PercentPhaseFieldOfView" }, { 0x0018, 0x0095, 0, VR::DS, VM::M1, "PixelBandwidth" }, { 0x0018, 0x1000, 0, VR::LO, VM::M1, "DeviceSerialNumber" }, { 0x0018, 0x1002, 0, VR::UI, VM::M1, "DeviceUID" }, { 0x0018, 0x1003, 0, VR::LO, VM::M1, "DeviceID" }, { 0x0018, 0x1004, 0, VR::LO, VM::M1, "PlateID" }, { 0x0018, 0x1005, 0, VR::LO, VM::M1, "GeneratorID" }, { 0x0018, 0x1006, 0, VR::LO, VM::M1, "GridID" }, { 0x0018, 0x1007, 0, VR::LO, VM::M1, "CassetteID" }, { 0x0018, 0x1008, 0, VR::LO, VM::M1, "GantryID" }, { 0x0018, 0x1009, 0, VR::UT, VM::M1, "UniqueDeviceIdentifier" }, { 0x0018, 0x100A, 0, VR::SQ, VM::M1, "UDISequence" }, { 0x0018, 0x100B, 0, VR::UI, VM::M1TN, "ManufacturerDeviceClassUID" }, { 0x0018, 0x1010, 0, VR::LO, VM::M1, "SecondaryCaptureDeviceID" }, { 0x0018, 0x1011, 1, VR::LO, VM::M1, "HardcopyCreationDeviceID" }, { 0x0018, 0x1012, 0, VR::DA, VM::M1, "DateOfSecondaryCapture" }, { 0x0018, 0x1014, 0, VR::TM, VM::M1, "TimeOfSecondaryCapture" }, { 0x0018, 0x1016, 0, VR::LO, VM::M1, "SecondaryCaptureDeviceManufacturer" }, { 0x0018, 0x1017, 1, VR::LO, VM::M1, "HardcopyDeviceManufacturer" }, { 0x0018, 0x1018, 0, VR::LO, VM::M1, "SecondaryCaptureDeviceManufacturerModelName" }, { 0x0018, 0x1019, 0, VR::LO, VM::M1TN, "SecondaryCaptureDeviceSoftwareVersions" }, { 0x0018, 0x101A, 1, VR::LO, VM::M1TN, "HardcopyDeviceSoftwareVersion" }, { 0x0018, 0x101B, 1, VR::LO, VM::M1, "HardcopyDeviceManufacturerModelName" }, { 0x0018, 0x1020, 0, VR::LO, VM::M1TN, "SoftwareVersions" }, { 0x0018, 0x1022, 0, VR::SH, VM::M1, "VideoImageFormatAcquired" }, { 0x0018, 0x1023, 0, VR::LO, VM::M1, "DigitalImageFormatAcquired" }, { 0x0018, 0x1030, 0, VR::LO, VM::M1, "ProtocolName" }, { 0x0018, 0x1040, 0, VR::LO, VM::M1, "ContrastBolusRoute" }, { 0x0018, 0x1041, 0, VR::DS, VM::M1, "ContrastBolusVolume" }, { 0x0018, 0x1042, 0, VR::TM, VM::M1, "ContrastBolusStartTime" }, { 0x0018, 0x1043, 0, VR::TM, VM::M1, "ContrastBolusStopTime" }, { 0x0018, 0x1044, 0, VR::DS, VM::M1, "ContrastBolusTotalDose" }, { 0x0018, 0x1045, 0, VR::IS, VM::M1, "SyringeCounts" }, { 0x0018, 0x1046, 0, VR::DS, VM::M1TN, "ContrastFlowRate" }, { 0x0018, 0x1047, 0, VR::DS, VM::M1TN, "ContrastFlowDuration" }, { 0x0018, 0x1048, 0, VR::CS, VM::M1, "ContrastBolusIngredient" }, { 0x0018, 0x1049, 0, VR::DS, VM::M1, "ContrastBolusIngredientConcentration" }, { 0x0018, 0x1050, 0, VR::DS, VM::M1, "SpatialResolution" }, { 0x0018, 0x1060, 0, VR::DS, VM::M1, "TriggerTime" }, { 0x0018, 0x1061, 0, VR::LO, VM::M1, "TriggerSourceOrType" }, { 0x0018, 0x1062, 0, VR::IS, VM::M1, "NominalInterval" }, { 0x0018, 0x1063, 0, VR::DS, VM::M1, "FrameTime" }, { 0x0018, 0x1064, 0, VR::LO, VM::M1, "CardiacFramingType" }, { 0x0018, 0x1065, 0, VR::DS, VM::M1TN, "FrameTimeVector" }, { 0x0018, 0x1066, 0, VR::DS, VM::M1, "FrameDelay" }, { 0x0018, 0x1067, 0, VR::DS, VM::M1, "ImageTriggerDelay" }, { 0x0018, 0x1068, 0, VR::DS, VM::M1, "MultiplexGroupTimeOffset" }, { 0x0018, 0x1069, 0, VR::DS, VM::M1, "TriggerTimeOffset" }, { 0x0018, 0x106A, 0, VR::CS, VM::M1, "SynchronizationTrigger" }, { 0x0018, 0x106C, 0, VR::US, VM::M2, "SynchronizationChannel" }, { 0x0018, 0x106E, 0, VR::UL, VM::M1, "TriggerSamplePosition" }, { 0x0018, 0x1070, 0, VR::LO, VM::M1, "RadiopharmaceuticalRoute" }, { 0x0018, 0x1071, 0, VR::DS, VM::M1, "RadiopharmaceuticalVolume" }, { 0x0018, 0x1072, 0, VR::TM, VM::M1, "RadiopharmaceuticalStartTime" }, { 0x0018, 0x1073, 0, VR::TM, VM::M1, "RadiopharmaceuticalStopTime" }, { 0x0018, 0x1074, 0, VR::DS, VM::M1, "RadionuclideTotalDose" }, { 0x0018, 0x1075, 0, VR::DS, VM::M1, "RadionuclideHalfLife" }, { 0x0018, 0x1076, 0, VR::DS, VM::M1, "RadionuclidePositronFraction" }, { 0x0018, 0x1077, 0, VR::DS, VM::M1, "RadiopharmaceuticalSpecificActivity" }, { 0x0018, 0x1078, 0, VR::DT, VM::M1, "RadiopharmaceuticalStartDateTime" }, { 0x0018, 0x1079, 0, VR::DT, VM::M1, "RadiopharmaceuticalStopDateTime" }, { 0x0018, 0x1080, 0, VR::CS, VM::M1, "BeatRejectionFlag" }, { 0x0018, 0x1081, 0, VR::IS, VM::M1, "LowRRValue" }, { 0x0018, 0x1082, 0, VR::IS, VM::M1, "HighRRValue" }, { 0x0018, 0x1083, 0, VR::IS, VM::M1, "IntervalsAcquired" }, { 0x0018, 0x1084, 0, VR::IS, VM::M1, "IntervalsRejected" }, { 0x0018, 0x1085, 0, VR::LO, VM::M1, "PVCRejection" }, { 0x0018, 0x1086, 0, VR::IS, VM::M1, "SkipBeats" }, { 0x0018, 0x1088, 0, VR::IS, VM::M1, "HeartRate" }, { 0x0018, 0x1090, 0, VR::IS, VM::M1, "CardiacNumberOfImages" }, { 0x0018, 0x1094, 0, VR::IS, VM::M1, "TriggerWindow" }, { 0x0018, 0x1100, 0, VR::DS, VM::M1, "ReconstructionDiameter" }, { 0x0018, 0x1110, 0, VR::DS, VM::M1, "DistanceSourceToDetector" }, { 0x0018, 0x1111, 0, VR::DS, VM::M1, "DistanceSourceToPatient" }, { 0x0018, 0x1114, 0, VR::DS, VM::M1, "EstimatedRadiographicMagnificationFactor" }, { 0x0018, 0x1120, 0, VR::DS, VM::M1, "GantryDetectorTilt" }, { 0x0018, 0x1121, 0, VR::DS, VM::M1, "GantryDetectorSlew" }, { 0x0018, 0x1130, 0, VR::DS, VM::M1, "TableHeight" }, { 0x0018, 0x1131, 0, VR::DS, VM::M1, "TableTraverse" }, { 0x0018, 0x1134, 0, VR::CS, VM::M1, "TableMotion" }, { 0x0018, 0x1135, 0, VR::DS, VM::M1TN, "TableVerticalIncrement" }, { 0x0018, 0x1136, 0, VR::DS, VM::M1TN, "TableLateralIncrement" }, { 0x0018, 0x1137, 0, VR::DS, VM::M1TN, "TableLongitudinalIncrement" }, { 0x0018, 0x1138, 0, VR::DS, VM::M1, "TableAngle" }, { 0x0018, 0x113A, 0, VR::CS, VM::M1, "TableType" }, { 0x0018, 0x1140, 0, VR::CS, VM::M1, "RotationDirection" }, { 0x0018, 0x1141, 1, VR::DS, VM::M1, "AngularPosition" }, { 0x0018, 0x1142, 0, VR::DS, VM::M1TN, "RadialPosition" }, { 0x0018, 0x1143, 0, VR::DS, VM::M1, "ScanArc" }, { 0x0018, 0x1144, 0, VR::DS, VM::M1, "AngularStep" }, { 0x0018, 0x1145, 0, VR::DS, VM::M1, "CenterOfRotationOffset" }, { 0x0018, 0x1146, 1, VR::DS, VM::M1TN, "RotationOffset" }, { 0x0018, 0x1147, 0, VR::CS, VM::M1, "FieldOfViewShape" }, { 0x0018, 0x1149, 0, VR::IS, VM::M1T2, "FieldOfViewDimensions" }, { 0x0018, 0x1150, 0, VR::IS, VM::M1, "ExposureTime" }, { 0x0018, 0x1151, 0, VR::IS, VM::M1, "XRayTubeCurrent" }, { 0x0018, 0x1152, 0, VR::IS, VM::M1, "Exposure" }, { 0x0018, 0x1153, 0, VR::IS, VM::M1, "ExposureInuAs" }, { 0x0018, 0x1154, 0, VR::DS, VM::M1, "AveragePulseWidth" }, { 0x0018, 0x1155, 0, VR::CS, VM::M1, "RadiationSetting" }, { 0x0018, 0x1156, 0, VR::CS, VM::M1, "RectificationType" }, { 0x0018, 0x115A, 0, VR::CS, VM::M1, "RadiationMode" }, { 0x0018, 0x115E, 0, VR::DS, VM::M1, "ImageAndFluoroscopyAreaDoseProduct" }, { 0x0018, 0x1160, 0, VR::SH, VM::M1, "FilterType" }, { 0x0018, 0x1161, 0, VR::LO, VM::M1TN, "TypeOfFilters" }, { 0x0018, 0x1162, 0, VR::DS, VM::M1, "IntensifierSize" }, { 0x0018, 0x1164, 0, VR::DS, VM::M2, "ImagerPixelSpacing" }, { 0x0018, 0x1166, 0, VR::CS, VM::M1TN, "Grid" }, { 0x0018, 0x1170, 0, VR::IS, VM::M1, "GeneratorPower" }, { 0x0018, 0x1180, 0, VR::SH, VM::M1, "CollimatorGridName" }, { 0x0018, 0x1181, 0, VR::CS, VM::M1, "CollimatorType" }, { 0x0018, 0x1182, 0, VR::IS, VM::M1T2, "FocalDistance" }, { 0x0018, 0x1183, 0, VR::DS, VM::M1T2, "XFocusCenter" }, { 0x0018, 0x1184, 0, VR::DS, VM::M1T2, "YFocusCenter" }, { 0x0018, 0x1190, 0, VR::DS, VM::M1TN, "FocalSpots" }, { 0x0018, 0x1191, 0, VR::CS, VM::M1, "AnodeTargetMaterial" }, { 0x0018, 0x11A0, 0, VR::DS, VM::M1, "BodyPartThickness" }, { 0x0018, 0x11A2, 0, VR::DS, VM::M1, "CompressionForce" }, { 0x0018, 0x11A3, 0, VR::DS, VM::M1, "CompressionPressure" }, { 0x0018, 0x11A4, 0, VR::LO, VM::M1, "PaddleDescription" }, { 0x0018, 0x11A5, 0, VR::DS, VM::M1, "CompressionContactArea" }, { 0x0018, 0x1200, 0, VR::DA, VM::M1TN, "DateOfLastCalibration" }, { 0x0018, 0x1201, 0, VR::TM, VM::M1TN, "TimeOfLastCalibration" }, { 0x0018, 0x1202, 0, VR::DT, VM::M1, "DateTimeOfLastCalibration" }, { 0x0018, 0x1210, 0, VR::SH, VM::M1TN, "ConvolutionKernel" }, { 0x0018, 0x1240, 1, VR::IS, VM::M1TN, "UpperLowerPixelValues" }, { 0x0018, 0x1242, 0, VR::IS, VM::M1, "ActualFrameDuration" }, { 0x0018, 0x1243, 0, VR::IS, VM::M1, "CountRate" }, { 0x0018, 0x1244, 0, VR::US, VM::M1, "PreferredPlaybackSequencing" }, { 0x0018, 0x1250, 0, VR::SH, VM::M1, "ReceiveCoilName" }, { 0x0018, 0x1251, 0, VR::SH, VM::M1, "TransmitCoilName" }, { 0x0018, 0x1260, 0, VR::SH, VM::M1, "PlateType" }, { 0x0018, 0x1261, 0, VR::LO, VM::M1, "PhosphorType" }, { 0x0018, 0x1271, 0, VR::FD, VM::M1, "WaterEquivalentDiameter" }, { 0x0018, 0x1272, 0, VR::SQ, VM::M1, "WaterEquivalentDiameterCalculationMethodCodeSequence" }, { 0x0018, 0x1300, 0, VR::DS, VM::M1, "ScanVelocity" }, { 0x0018, 0x1301, 0, VR::CS, VM::M1TN, "WholeBodyTechnique" }, { 0x0018, 0x1302, 0, VR::IS, VM::M1, "ScanLength" }, { 0x0018, 0x1310, 0, VR::US, VM::M4, "AcquisitionMatrix" }, { 0x0018, 0x1312, 0, VR::CS, VM::M1, "InPlanePhaseEncodingDirection" }, { 0x0018, 0x1314, 0, VR::DS, VM::M1, "FlipAngle" }, { 0x0018, 0x1315, 0, VR::CS, VM::M1, "VariableFlipAngleFlag" }, { 0x0018, 0x1316, 0, VR::DS, VM::M1, "SAR" }, { 0x0018, 0x1318, 0, VR::DS, VM::M1, "dBdt" }, { 0x0018, 0x1320, 0, VR::FL, VM::M1, "B1rms" }, { 0x0018, 0x1400, 0, VR::LO, VM::M1, "AcquisitionDeviceProcessingDescription" }, { 0x0018, 0x1401, 0, VR::LO, VM::M1, "AcquisitionDeviceProcessingCode" }, { 0x0018, 0x1402, 0, VR::CS, VM::M1, "CassetteOrientation" }, { 0x0018, 0x1403, 0, VR::CS, VM::M1, "CassetteSize" }, { 0x0018, 0x1404, 0, VR::US, VM::M1, "ExposuresOnPlate" }, { 0x0018, 0x1405, 0, VR::IS, VM::M1, "RelativeXRayExposure" }, { 0x0018, 0x1411, 0, VR::DS, VM::M1, "ExposureIndex" }, { 0x0018, 0x1412, 0, VR::DS, VM::M1, "TargetExposureIndex" }, { 0x0018, 0x1413, 0, VR::DS, VM::M1, "DeviationIndex" }, { 0x0018, 0x1450, 0, VR::DS, VM::M1, "ColumnAngulation" }, { 0x0018, 0x1460, 0, VR::DS, VM::M1, "TomoLayerHeight" }, { 0x0018, 0x1470, 0, VR::DS, VM::M1, "TomoAngle" }, { 0x0018, 0x1480, 0, VR::DS, VM::M1, "TomoTime" }, { 0x0018, 0x1490, 0, VR::CS, VM::M1, "TomoType" }, { 0x0018, 0x1491, 0, VR::CS, VM::M1, "TomoClass" }, { 0x0018, 0x1495, 0, VR::IS, VM::M1, "NumberOfTomosynthesisSourceImages" }, { 0x0018, 0x1500, 0, VR::CS, VM::M1, "PositionerMotion" }, { 0x0018, 0x1508, 0, VR::CS, VM::M1, "PositionerType" }, { 0x0018, 0x1510, 0, VR::DS, VM::M1, "PositionerPrimaryAngle" }, { 0x0018, 0x1511, 0, VR::DS, VM::M1, "PositionerSecondaryAngle" }, { 0x0018, 0x1520, 0, VR::DS, VM::M1TN, "PositionerPrimaryAngleIncrement" }, { 0x0018, 0x1521, 0, VR::DS, VM::M1TN, "PositionerSecondaryAngleIncrement" }, { 0x0018, 0x1530, 0, VR::DS, VM::M1, "DetectorPrimaryAngle" }, { 0x0018, 0x1531, 0, VR::DS, VM::M1, "DetectorSecondaryAngle" }, { 0x0018, 0x1600, 0, VR::CS, VM::M1T3, "ShutterShape" }, { 0x0018, 0x1602, 0, VR::IS, VM::M1, "ShutterLeftVerticalEdge" }, { 0x0018, 0x1604, 0, VR::IS, VM::M1, "ShutterRightVerticalEdge" }, { 0x0018, 0x1606, 0, VR::IS, VM::M1, "ShutterUpperHorizontalEdge" }, { 0x0018, 0x1608, 0, VR::IS, VM::M1, "ShutterLowerHorizontalEdge" }, { 0x0018, 0x1610, 0, VR::IS, VM::M2, "CenterOfCircularShutter" }, { 0x0018, 0x1612, 0, VR::IS, VM::M1, "RadiusOfCircularShutter" }, { 0x0018, 0x1620, 0, VR::IS, VM::M2T2N, "VerticesOfThePolygonalShutter" }, { 0x0018, 0x1622, 0, VR::US, VM::M1, "ShutterPresentationValue" }, { 0x0018, 0x1623, 0, VR::US, VM::M1, "ShutterOverlayGroup" }, { 0x0018, 0x1624, 0, VR::US, VM::M3, "ShutterPresentationColorCIELabValue" }, { 0x0018, 0x1630, 0, VR::CS, VM::M1, "OutlineShapeType" }, { 0x0018, 0x1631, 0, VR::FD, VM::M1, "OutlineLeftVerticalEdge" }, { 0x0018, 0x1632, 0, VR::FD, VM::M1, "OutlineRightVerticalEdge" }, { 0x0018, 0x1633, 0, VR::FD, VM::M1, "OutlineUpperHorizontalEdge" }, { 0x0018, 0x1634, 0, VR::FD, VM::M1, "OutlineLowerHorizontalEdge" }, { 0x0018, 0x1635, 0, VR::FD, VM::M2, "CenterOfCircularOutline" }, { 0x0018, 0x1636, 0, VR::FD, VM::M1, "DiameterOfCircularOutline" }, { 0x0018, 0x1637, 0, VR::UL, VM::M1, "NumberOfPolygonalVertices" }, { 0x0018, 0x1638, 0, VR::OF, VM::M1, "VerticesOfThePolygonalOutline" }, { 0x0018, 0x1700, 0, VR::CS, VM::M1T3, "CollimatorShape" }, { 0x0018, 0x1702, 0, VR::IS, VM::M1, "CollimatorLeftVerticalEdge" }, { 0x0018, 0x1704, 0, VR::IS, VM::M1, "CollimatorRightVerticalEdge" }, { 0x0018, 0x1706, 0, VR::IS, VM::M1, "CollimatorUpperHorizontalEdge" }, { 0x0018, 0x1708, 0, VR::IS, VM::M1, "CollimatorLowerHorizontalEdge" }, { 0x0018, 0x1710, 0, VR::IS, VM::M2, "CenterOfCircularCollimator" }, { 0x0018, 0x1712, 0, VR::IS, VM::M1, "RadiusOfCircularCollimator" }, { 0x0018, 0x1720, 0, VR::IS, VM::M2T2N, "VerticesOfThePolygonalCollimator" }, { 0x0018, 0x1800, 0, VR::CS, VM::M1, "AcquisitionTimeSynchronized" }, { 0x0018, 0x1801, 0, VR::SH, VM::M1, "TimeSource" }, { 0x0018, 0x1802, 0, VR::CS, VM::M1, "TimeDistributionProtocol" }, { 0x0018, 0x1803, 0, VR::LO, VM::M1, "NTPSourceAddress" }, { 0x0018, 0x2001, 0, VR::IS, VM::M1TN, "PageNumberVector" }, { 0x0018, 0x2002, 0, VR::SH, VM::M1TN, "FrameLabelVector" }, { 0x0018, 0x2003, 0, VR::DS, VM::M1TN, "FramePrimaryAngleVector" }, { 0x0018, 0x2004, 0, VR::DS, VM::M1TN, "FrameSecondaryAngleVector" }, { 0x0018, 0x2005, 0, VR::DS, VM::M1TN, "SliceLocationVector" }, { 0x0018, 0x2006, 0, VR::SH, VM::M1TN, "DisplayWindowLabelVector" }, { 0x0018, 0x2010, 0, VR::DS, VM::M2, "NominalScannedPixelSpacing" }, { 0x0018, 0x2020, 0, VR::CS, VM::M1, "DigitizingDeviceTransportDirection" }, { 0x0018, 0x2030, 0, VR::DS, VM::M1, "RotationOfScannedFilm" }, { 0x0018, 0x2041, 0, VR::SQ, VM::M1, "BiopsyTargetSequence" }, { 0x0018, 0x2042, 0, VR::UI, VM::M1, "TargetUID" }, { 0x0018, 0x2043, 0, VR::FL, VM::M2, "LocalizingCursorPosition" }, { 0x0018, 0x2044, 0, VR::FL, VM::M3, "CalculatedTargetPosition" }, { 0x0018, 0x2045, 0, VR::SH, VM::M1, "TargetLabel" }, { 0x0018, 0x2046, 0, VR::FL, VM::M1, "DisplayedZValue" }, { 0x0018, 0x3100, 0, VR::CS, VM::M1, "IVUSAcquisition" }, { 0x0018, 0x3101, 0, VR::DS, VM::M1, "IVUSPullbackRate" }, { 0x0018, 0x3102, 0, VR::DS, VM::M1, "IVUSGatedRate" }, { 0x0018, 0x3103, 0, VR::IS, VM::M1, "IVUSPullbackStartFrameNumber" }, { 0x0018, 0x3104, 0, VR::IS, VM::M1, "IVUSPullbackStopFrameNumber" }, { 0x0018, 0x3105, 0, VR::IS, VM::M1TN, "LesionNumber" }, { 0x0018, 0x4000, 1, VR::LT, VM::M1, "AcquisitionComments" }, { 0x0018, 0x5000, 0, VR::SH, VM::M1TN, "OutputPower" }, { 0x0018, 0x5010, 0, VR::LO, VM::M1TN, "TransducerData" }, { 0x0018, 0x5012, 0, VR::DS, VM::M1, "FocusDepth" }, { 0x0018, 0x5020, 0, VR::LO, VM::M1, "ProcessingFunction" }, { 0x0018, 0x5021, 1, VR::LO, VM::M1, "PostprocessingFunction" }, { 0x0018, 0x5022, 0, VR::DS, VM::M1, "MechanicalIndex" }, { 0x0018, 0x5024, 0, VR::DS, VM::M1, "BoneThermalIndex" }, { 0x0018, 0x5026, 0, VR::DS, VM::M1, "CranialThermalIndex" }, { 0x0018, 0x5027, 0, VR::DS, VM::M1, "SoftTissueThermalIndex" }, { 0x0018, 0x5028, 0, VR::DS, VM::M1, "SoftTissueFocusThermalIndex" }, { 0x0018, 0x5029, 0, VR::DS, VM::M1, "SoftTissueSurfaceThermalIndex" }, { 0x0018, 0x5030, 1, VR::DS, VM::M1, "DynamicRange" }, { 0x0018, 0x5040, 1, VR::DS, VM::M1, "TotalGain" }, { 0x0018, 0x5050, 0, VR::IS, VM::M1, "DepthOfScanField" }, { 0x0018, 0x5100, 0, VR::CS, VM::M1, "PatientPosition" }, { 0x0018, 0x5101, 0, VR::CS, VM::M1, "ViewPosition" }, { 0x0018, 0x5104, 0, VR::SQ, VM::M1, "ProjectionEponymousNameCodeSequence" }, { 0x0018, 0x5210, 1, VR::DS, VM::M6, "ImageTransformationMatrix" }, { 0x0018, 0x5212, 1, VR::DS, VM::M3, "ImageTranslationVector" }, { 0x0018, 0x6000, 0, VR::DS, VM::M1, "Sensitivity" }, { 0x0018, 0x6011, 0, VR::SQ, VM::M1, "SequenceOfUltrasoundRegions" }, { 0x0018, 0x6012, 0, VR::US, VM::M1, "RegionSpatialFormat" }, { 0x0018, 0x6014, 0, VR::US, VM::M1, "RegionDataType" }, { 0x0018, 0x6016, 0, VR::UL, VM::M1, "RegionFlags" }, { 0x0018, 0x6018, 0, VR::UL, VM::M1, "RegionLocationMinX0" }, { 0x0018, 0x601A, 0, VR::UL, VM::M1, "RegionLocationMinY0" }, { 0x0018, 0x601C, 0, VR::UL, VM::M1, "RegionLocationMaxX1" }, { 0x0018, 0x601E, 0, VR::UL, VM::M1, "RegionLocationMaxY1" }, { 0x0018, 0x6020, 0, VR::SL, VM::M1, "ReferencePixelX0" }, { 0x0018, 0x6022, 0, VR::SL, VM::M1, "ReferencePixelY0" }, { 0x0018, 0x6024, 0, VR::US, VM::M1, "PhysicalUnitsXDirection" }, { 0x0018, 0x6026, 0, VR::US, VM::M1, "PhysicalUnitsYDirection" }, { 0x0018, 0x6028, 0, VR::FD, VM::M1, "ReferencePixelPhysicalValueX" }, { 0x0018, 0x602A, 0, VR::FD, VM::M1, "ReferencePixelPhysicalValueY" }, { 0x0018, 0x602C, 0, VR::FD, VM::M1, "PhysicalDeltaX" }, { 0x0018, 0x602E, 0, VR::FD, VM::M1, "PhysicalDeltaY" }, { 0x0018, 0x6030, 0, VR::UL, VM::M1, "TransducerFrequency" }, { 0x0018, 0x6031, 0, VR::CS, VM::M1, "TransducerType" }, { 0x0018, 0x6032, 0, VR::UL, VM::M1, "PulseRepetitionFrequency" }, { 0x0018, 0x6034, 0, VR::FD, VM::M1, "DopplerCorrectionAngle" }, { 0x0018, 0x6036, 0, VR::FD, VM::M1, "SteeringAngle" }, { 0x0018, 0x6038, 1, VR::UL, VM::M1, "DopplerSampleVolumeXPositionRetired" }, { 0x0018, 0x6039, 0, VR::SL, VM::M1, "DopplerSampleVolumeXPosition" }, { 0x0018, 0x603A, 1, VR::UL, VM::M1, "DopplerSampleVolumeYPositionRetired" }, { 0x0018, 0x603B, 0, VR::SL, VM::M1, "DopplerSampleVolumeYPosition" }, { 0x0018, 0x603C, 1, VR::UL, VM::M1, "TMLinePositionX0Retired" }, { 0x0018, 0x603D, 0, VR::SL, VM::M1, "TMLinePositionX0" }, { 0x0018, 0x603E, 1, VR::UL, VM::M1, "TMLinePositionY0Retired" }, { 0x0018, 0x603F, 0, VR::SL, VM::M1, "TMLinePositionY0" }, { 0x0018, 0x6040, 1, VR::UL, VM::M1, "TMLinePositionX1Retired" }, { 0x0018, 0x6041, 0, VR::SL, VM::M1, "TMLinePositionX1" }, { 0x0018, 0x6042, 1, VR::UL, VM::M1, "TMLinePositionY1Retired" }, { 0x0018, 0x6043, 0, VR::SL, VM::M1, "TMLinePositionY1" }, { 0x0018, 0x6044, 0, VR::US, VM::M1, "PixelComponentOrganization" }, { 0x0018, 0x6046, 0, VR::UL, VM::M1, "PixelComponentMask" }, { 0x0018, 0x6048, 0, VR::UL, VM::M1, "PixelComponentRangeStart" }, { 0x0018, 0x604A, 0, VR::UL, VM::M1, "PixelComponentRangeStop" }, { 0x0018, 0x604C, 0, VR::US, VM::M1, "PixelComponentPhysicalUnits" }, { 0x0018, 0x604E, 0, VR::US, VM::M1, "PixelComponentDataType" }, { 0x0018, 0x6050, 0, VR::UL, VM::M1, "NumberOfTableBreakPoints" }, { 0x0018, 0x6052, 0, VR::UL, VM::M1TN, "TableOfXBreakPoints" }, { 0x0018, 0x6054, 0, VR::FD, VM::M1TN, "TableOfYBreakPoints" }, { 0x0018, 0x6056, 0, VR::UL, VM::M1, "NumberOfTableEntries" }, { 0x0018, 0x6058, 0, VR::UL, VM::M1TN, "TableOfPixelValues" }, { 0x0018, 0x605A, 0, VR::FL, VM::M1TN, "TableOfParameterValues" }, { 0x0018, 0x6060, 0, VR::FL, VM::M1TN, "RWaveTimeVector" }, { 0x0018, 0x7000, 0, VR::CS, VM::M1, "DetectorConditionsNominalFlag" }, { 0x0018, 0x7001, 0, VR::DS, VM::M1, "DetectorTemperature" }, { 0x0018, 0x7004, 0, VR::CS, VM::M1, "DetectorType" }, { 0x0018, 0x7005, 0, VR::CS, VM::M1, "DetectorConfiguration" }, { 0x0018, 0x7006, 0, VR::LT, VM::M1, "DetectorDescription" }, { 0x0018, 0x7008, 0, VR::LT, VM::M1, "DetectorMode" }, { 0x0018, 0x700A, 0, VR::SH, VM::M1, "DetectorID" }, { 0x0018, 0x700C, 0, VR::DA, VM::M1, "DateOfLastDetectorCalibration" }, { 0x0018, 0x700E, 0, VR::TM, VM::M1, "TimeOfLastDetectorCalibration" }, { 0x0018, 0x7010, 0, VR::IS, VM::M1, "ExposuresOnDetectorSinceLastCalibration" }, { 0x0018, 0x7011, 0, VR::IS, VM::M1, "ExposuresOnDetectorSinceManufactured" }, { 0x0018, 0x7012, 0, VR::DS, VM::M1, "DetectorTimeSinceLastExposure" }, { 0x0018, 0x7014, 0, VR::DS, VM::M1, "DetectorActiveTime" }, { 0x0018, 0x7016, 0, VR::DS, VM::M1, "DetectorActivationOffsetFromExposure" }, { 0x0018, 0x701A, 0, VR::DS, VM::M2, "DetectorBinning" }, { 0x0018, 0x7020, 0, VR::DS, VM::M2, "DetectorElementPhysicalSize" }, { 0x0018, 0x7022, 0, VR::DS, VM::M2, "DetectorElementSpacing" }, { 0x0018, 0x7024, 0, VR::CS, VM::M1, "DetectorActiveShape" }, { 0x0018, 0x7026, 0, VR::DS, VM::M1T2, "DetectorActiveDimensions" }, { 0x0018, 0x7028, 0, VR::DS, VM::M2, "DetectorActiveOrigin" }, { 0x0018, 0x702A, 0, VR::LO, VM::M1, "DetectorManufacturerName" }, { 0x0018, 0x702B, 0, VR::LO, VM::M1, "DetectorManufacturerModelName" }, { 0x0018, 0x7030, 0, VR::DS, VM::M2, "FieldOfViewOrigin" }, { 0x0018, 0x7032, 0, VR::DS, VM::M1, "FieldOfViewRotation" }, { 0x0018, 0x7034, 0, VR::CS, VM::M1, "FieldOfViewHorizontalFlip" }, { 0x0018, 0x7036, 0, VR::FL, VM::M2, "PixelDataAreaOriginRelativeToFOV" }, { 0x0018, 0x7038, 0, VR::FL, VM::M1, "PixelDataAreaRotationAngleRelativeToFOV" }, { 0x0018, 0x7040, 0, VR::LT, VM::M1, "GridAbsorbingMaterial" }, { 0x0018, 0x7041, 0, VR::LT, VM::M1, "GridSpacingMaterial" }, { 0x0018, 0x7042, 0, VR::DS, VM::M1, "GridThickness" }, { 0x0018, 0x7044, 0, VR::DS, VM::M1, "GridPitch" }, { 0x0018, 0x7046, 0, VR::IS, VM::M2, "GridAspectRatio" }, { 0x0018, 0x7048, 0, VR::DS, VM::M1, "GridPeriod" }, { 0x0018, 0x704C, 0, VR::DS, VM::M1, "GridFocalDistance" }, { 0x0018, 0x7050, 0, VR::CS, VM::M1TN, "FilterMaterial" }, { 0x0018, 0x7052, 0, VR::DS, VM::M1TN, "FilterThicknessMinimum" }, { 0x0018, 0x7054, 0, VR::DS, VM::M1TN, "FilterThicknessMaximum" }, { 0x0018, 0x7056, 0, VR::FL, VM::M1TN, "FilterBeamPathLengthMinimum" }, { 0x0018, 0x7058, 0, VR::FL, VM::M1TN, "FilterBeamPathLengthMaximum" }, { 0x0018, 0x7060, 0, VR::CS, VM::M1, "ExposureControlMode" }, { 0x0018, 0x7062, 0, VR::LT, VM::M1, "ExposureControlModeDescription" }, { 0x0018, 0x7064, 0, VR::CS, VM::M1, "ExposureStatus" }, { 0x0018, 0x7065, 0, VR::DS, VM::M1, "PhototimerSetting" }, { 0x0018, 0x8150, 0, VR::DS, VM::M1, "ExposureTimeInuS" }, { 0x0018, 0x8151, 0, VR::DS, VM::M1, "XRayTubeCurrentInuA" }, { 0x0018, 0x9004, 0, VR::CS, VM::M1, "ContentQualification" }, { 0x0018, 0x9005, 0, VR::SH, VM::M1, "PulseSequenceName" }, { 0x0018, 0x9006, 0, VR::SQ, VM::M1, "MRImagingModifierSequence" }, { 0x0018, 0x9008, 0, VR::CS, VM::M1, "EchoPulseSequence" }, { 0x0018, 0x9009, 0, VR::CS, VM::M1, "InversionRecovery" }, { 0x0018, 0x9010, 0, VR::CS, VM::M1, "FlowCompensation" }, { 0x0018, 0x9011, 0, VR::CS, VM::M1, "MultipleSpinEcho" }, { 0x0018, 0x9012, 0, VR::CS, VM::M1, "MultiPlanarExcitation" }, { 0x0018, 0x9014, 0, VR::CS, VM::M1, "PhaseContrast" }, { 0x0018, 0x9015, 0, VR::CS, VM::M1, "TimeOfFlightContrast" }, { 0x0018, 0x9016, 0, VR::CS, VM::M1, "Spoiling" }, { 0x0018, 0x9017, 0, VR::CS, VM::M1, "SteadyStatePulseSequence" }, { 0x0018, 0x9018, 0, VR::CS, VM::M1, "EchoPlanarPulseSequence" }, { 0x0018, 0x9019, 0, VR::FD, VM::M1, "TagAngleFirstAxis" }, { 0x0018, 0x9020, 0, VR::CS, VM::M1, "MagnetizationTransfer" }, { 0x0018, 0x9021, 0, VR::CS, VM::M1, "T2Preparation" }, { 0x0018, 0x9022, 0, VR::CS, VM::M1, "BloodSignalNulling" }, { 0x0018, 0x9024, 0, VR::CS, VM::M1, "SaturationRecovery" }, { 0x0018, 0x9025, 0, VR::CS, VM::M1, "SpectrallySelectedSuppression" }, { 0x0018, 0x9026, 0, VR::CS, VM::M1, "SpectrallySelectedExcitation" }, { 0x0018, 0x9027, 0, VR::CS, VM::M1, "SpatialPresaturation" }, { 0x0018, 0x9028, 0, VR::CS, VM::M1, "Tagging" }, { 0x0018, 0x9029, 0, VR::CS, VM::M1, "OversamplingPhase" }, { 0x0018, 0x9030, 0, VR::FD, VM::M1, "TagSpacingFirstDimension" }, { 0x0018, 0x9032, 0, VR::CS, VM::M1, "GeometryOfKSpaceTraversal" }, { 0x0018, 0x9033, 0, VR::CS, VM::M1, "SegmentedKSpaceTraversal" }, { 0x0018, 0x9034, 0, VR::CS, VM::M1, "RectilinearPhaseEncodeReordering" }, { 0x0018, 0x9035, 0, VR::FD, VM::M1, "TagThickness" }, { 0x0018, 0x9036, 0, VR::CS, VM::M1, "PartialFourierDirection" }, { 0x0018, 0x9037, 0, VR::CS, VM::M1, "CardiacSynchronizationTechnique" }, { 0x0018, 0x9041, 0, VR::LO, VM::M1, "ReceiveCoilManufacturerName" }, { 0x0018, 0x9042, 0, VR::SQ, VM::M1, "MRReceiveCoilSequence" }, { 0x0018, 0x9043, 0, VR::CS, VM::M1, "ReceiveCoilType" }, { 0x0018, 0x9044, 0, VR::CS, VM::M1, "QuadratureReceiveCoil" }, { 0x0018, 0x9045, 0, VR::SQ, VM::M1, "MultiCoilDefinitionSequence" }, { 0x0018, 0x9046, 0, VR::LO, VM::M1, "MultiCoilConfiguration" }, { 0x0018, 0x9047, 0, VR::SH, VM::M1, "MultiCoilElementName" }, { 0x0018, 0x9048, 0, VR::CS, VM::M1, "MultiCoilElementUsed" }, { 0x0018, 0x9049, 0, VR::SQ, VM::M1, "MRTransmitCoilSequence" }, { 0x0018, 0x9050, 0, VR::LO, VM::M1, "TransmitCoilManufacturerName" }, { 0x0018, 0x9051, 0, VR::CS, VM::M1, "TransmitCoilType" }, { 0x0018, 0x9052, 0, VR::FD, VM::M1T2, "SpectralWidth" }, { 0x0018, 0x9053, 0, VR::FD, VM::M1T2, "ChemicalShiftReference" }, { 0x0018, 0x9054, 0, VR::CS, VM::M1, "VolumeLocalizationTechnique" }, { 0x0018, 0x9058, 0, VR::US, VM::M1, "MRAcquisitionFrequencyEncodingSteps" }, { 0x0018, 0x9059, 0, VR::CS, VM::M1, "Decoupling" }, { 0x0018, 0x9060, 0, VR::CS, VM::M1T2, "DecoupledNucleus" }, { 0x0018, 0x9061, 0, VR::FD, VM::M1T2, "DecouplingFrequency" }, { 0x0018, 0x9062, 0, VR::CS, VM::M1, "DecouplingMethod" }, { 0x0018, 0x9063, 0, VR::FD, VM::M1T2, "DecouplingChemicalShiftReference" }, { 0x0018, 0x9064, 0, VR::CS, VM::M1, "KSpaceFiltering" }, { 0x0018, 0x9065, 0, VR::CS, VM::M1T2, "TimeDomainFiltering" }, { 0x0018, 0x9066, 0, VR::US, VM::M1T2, "NumberOfZeroFills" }, { 0x0018, 0x9067, 0, VR::CS, VM::M1, "BaselineCorrection" }, { 0x0018, 0x9069, 0, VR::FD, VM::M1, "ParallelReductionFactorInPlane" }, { 0x0018, 0x9070, 0, VR::FD, VM::M1, "CardiacRRIntervalSpecified" }, { 0x0018, 0x9073, 0, VR::FD, VM::M1, "AcquisitionDuration" }, { 0x0018, 0x9074, 0, VR::DT, VM::M1, "FrameAcquisitionDateTime" }, { 0x0018, 0x9075, 0, VR::CS, VM::M1, "DiffusionDirectionality" }, { 0x0018, 0x9076, 0, VR::SQ, VM::M1, "DiffusionGradientDirectionSequence" }, { 0x0018, 0x9077, 0, VR::CS, VM::M1, "ParallelAcquisition" }, { 0x0018, 0x9078, 0, VR::CS, VM::M1, "ParallelAcquisitionTechnique" }, { 0x0018, 0x9079, 0, VR::FD, VM::M1TN, "InversionTimes" }, { 0x0018, 0x9080, 0, VR::ST, VM::M1, "MetaboliteMapDescription" }, { 0x0018, 0x9081, 0, VR::CS, VM::M1, "PartialFourier" }, { 0x0018, 0x9082, 0, VR::FD, VM::M1, "EffectiveEchoTime" }, { 0x0018, 0x9083, 0, VR::SQ, VM::M1, "MetaboliteMapCodeSequence" }, { 0x0018, 0x9084, 0, VR::SQ, VM::M1, "ChemicalShiftSequence" }, { 0x0018, 0x9085, 0, VR::CS, VM::M1, "CardiacSignalSource" }, { 0x0018, 0x9087, 0, VR::FD, VM::M1, "DiffusionBValue" }, { 0x0018, 0x9089, 0, VR::FD, VM::M3, "DiffusionGradientOrientation" }, { 0x0018, 0x9090, 0, VR::FD, VM::M3, "VelocityEncodingDirection" }, { 0x0018, 0x9091, 0, VR::FD, VM::M1, "VelocityEncodingMinimumValue" }, { 0x0018, 0x9092, 0, VR::SQ, VM::M1, "VelocityEncodingAcquisitionSequence" }, { 0x0018, 0x9093, 0, VR::US, VM::M1, "NumberOfKSpaceTrajectories" }, { 0x0018, 0x9094, 0, VR::CS, VM::M1, "CoverageOfKSpace" }, { 0x0018, 0x9095, 0, VR::UL, VM::M1, "SpectroscopyAcquisitionPhaseRows" }, { 0x0018, 0x9096, 1, VR::FD, VM::M1, "ParallelReductionFactorInPlaneRetired" }, { 0x0018, 0x9098, 0, VR::FD, VM::M1T2, "TransmitterFrequency" }, { 0x0018, 0x9100, 0, VR::CS, VM::M1T2, "ResonantNucleus" }, { 0x0018, 0x9101, 0, VR::CS, VM::M1, "FrequencyCorrection" }, { 0x0018, 0x9103, 0, VR::SQ, VM::M1, "MRSpectroscopyFOVGeometrySequence" }, { 0x0018, 0x9104, 0, VR::FD, VM::M1, "SlabThickness" }, { 0x0018, 0x9105, 0, VR::FD, VM::M3, "SlabOrientation" }, { 0x0018, 0x9106, 0, VR::FD, VM::M3, "MidSlabPosition" }, { 0x0018, 0x9107, 0, VR::SQ, VM::M1, "MRSpatialSaturationSequence" }, { 0x0018, 0x9112, 0, VR::SQ, VM::M1, "MRTimingAndRelatedParametersSequence" }, { 0x0018, 0x9114, 0, VR::SQ, VM::M1, "MREchoSequence" }, { 0x0018, 0x9115, 0, VR::SQ, VM::M1, "MRModifierSequence" }, { 0x0018, 0x9117, 0, VR::SQ, VM::M1, "MRDiffusionSequence" }, { 0x0018, 0x9118, 0, VR::SQ, VM::M1, "CardiacSynchronizationSequence" }, { 0x0018, 0x9119, 0, VR::SQ, VM::M1, "MRAveragesSequence" }, { 0x0018, 0x9125, 0, VR::SQ, VM::M1, "MRFOVGeometrySequence" }, { 0x0018, 0x9126, 0, VR::SQ, VM::M1, "VolumeLocalizationSequence" }, { 0x0018, 0x9127, 0, VR::UL, VM::M1, "SpectroscopyAcquisitionDataColumns" }, { 0x0018, 0x9147, 0, VR::CS, VM::M1, "DiffusionAnisotropyType" }, { 0x0018, 0x9151, 0, VR::DT, VM::M1, "FrameReferenceDateTime" }, { 0x0018, 0x9152, 0, VR::SQ, VM::M1, "MRMetaboliteMapSequence" }, { 0x0018, 0x9155, 0, VR::FD, VM::M1, "ParallelReductionFactorOutOfPlane" }, { 0x0018, 0x9159, 0, VR::UL, VM::M1, "SpectroscopyAcquisitionOutOfPlanePhaseSteps" }, { 0x0018, 0x9166, 1, VR::CS, VM::M1, "BulkMotionStatus" }, { 0x0018, 0x9168, 0, VR::FD, VM::M1, "ParallelReductionFactorSecondInPlane" }, { 0x0018, 0x9169, 0, VR::CS, VM::M1, "CardiacBeatRejectionTechnique" }, { 0x0018, 0x9170, 0, VR::CS, VM::M1, "RespiratoryMotionCompensationTechnique" }, { 0x0018, 0x9171, 0, VR::CS, VM::M1, "RespiratorySignalSource" }, { 0x0018, 0x9172, 0, VR::CS, VM::M1, "BulkMotionCompensationTechnique" }, { 0x0018, 0x9173, 0, VR::CS, VM::M1, "BulkMotionSignalSource" }, { 0x0018, 0x9174, 0, VR::CS, VM::M1, "ApplicableSafetyStandardAgency" }, { 0x0018, 0x9175, 0, VR::LO, VM::M1, "ApplicableSafetyStandardDescription" }, { 0x0018, 0x9176, 0, VR::SQ, VM::M1, "OperatingModeSequence" }, { 0x0018, 0x9177, 0, VR::CS, VM::M1, "OperatingModeType" }, { 0x0018, 0x9178, 0, VR::CS, VM::M1, "OperatingMode" }, { 0x0018, 0x9179, 0, VR::CS, VM::M1, "SpecificAbsorptionRateDefinition" }, { 0x0018, 0x9180, 0, VR::CS, VM::M1, "GradientOutputType" }, { 0x0018, 0x9181, 0, VR::FD, VM::M1, "SpecificAbsorptionRateValue" }, { 0x0018, 0x9182, 0, VR::FD, VM::M1, "GradientOutput" }, { 0x0018, 0x9183, 0, VR::CS, VM::M1, "FlowCompensationDirection" }, { 0x0018, 0x9184, 0, VR::FD, VM::M1, "TaggingDelay" }, { 0x0018, 0x9185, 0, VR::ST, VM::M1, "RespiratoryMotionCompensationTechniqueDescription" }, { 0x0018, 0x9186, 0, VR::SH, VM::M1, "RespiratorySignalSourceID" }, { 0x0018, 0x9195, 1, VR::FD, VM::M1, "ChemicalShiftMinimumIntegrationLimitInHz" }, { 0x0018, 0x9196, 1, VR::FD, VM::M1, "ChemicalShiftMaximumIntegrationLimitInHz" }, { 0x0018, 0x9197, 0, VR::SQ, VM::M1, "MRVelocityEncodingSequence" }, { 0x0018, 0x9198, 0, VR::CS, VM::M1, "FirstOrderPhaseCorrection" }, { 0x0018, 0x9199, 0, VR::CS, VM::M1, "WaterReferencedPhaseCorrection" }, { 0x0018, 0x9200, 0, VR::CS, VM::M1, "MRSpectroscopyAcquisitionType" }, { 0x0018, 0x9214, 0, VR::CS, VM::M1, "RespiratoryCyclePosition" }, { 0x0018, 0x9217, 0, VR::FD, VM::M1, "VelocityEncodingMaximumValue" }, { 0x0018, 0x9218, 0, VR::FD, VM::M1, "TagSpacingSecondDimension" }, { 0x0018, 0x9219, 0, VR::SS, VM::M1, "TagAngleSecondAxis" }, { 0x0018, 0x9220, 0, VR::FD, VM::M1, "FrameAcquisitionDuration" }, { 0x0018, 0x9226, 0, VR::SQ, VM::M1, "MRImageFrameTypeSequence" }, { 0x0018, 0x9227, 0, VR::SQ, VM::M1, "MRSpectroscopyFrameTypeSequence" }, { 0x0018, 0x9231, 0, VR::US, VM::M1, "MRAcquisitionPhaseEncodingStepsInPlane" }, { 0x0018, 0x9232, 0, VR::US, VM::M1, "MRAcquisitionPhaseEncodingStepsOutOfPlane" }, { 0x0018, 0x9234, 0, VR::UL, VM::M1, "SpectroscopyAcquisitionPhaseColumns" }, { 0x0018, 0x9236, 0, VR::CS, VM::M1, "CardiacCyclePosition" }, { 0x0018, 0x9239, 0, VR::SQ, VM::M1, "SpecificAbsorptionRateSequence" }, { 0x0018, 0x9240, 0, VR::US, VM::M1, "RFEchoTrainLength" }, { 0x0018, 0x9241, 0, VR::US, VM::M1, "GradientEchoTrainLength" }, { 0x0018, 0x9250, 0, VR::CS, VM::M1, "ArterialSpinLabelingContrast" }, { 0x0018, 0x9251, 0, VR::SQ, VM::M1, "MRArterialSpinLabelingSequence" }, { 0x0018, 0x9252, 0, VR::LO, VM::M1, "ASLTechniqueDescription" }, { 0x0018, 0x9253, 0, VR::US, VM::M1, "ASLSlabNumber" }, { 0x0018, 0x9254, 0, VR::FD, VM::M1, "ASLSlabThickness" }, { 0x0018, 0x9255, 0, VR::FD, VM::M3, "ASLSlabOrientation" }, { 0x0018, 0x9256, 0, VR::FD, VM::M3, "ASLMidSlabPosition" }, { 0x0018, 0x9257, 0, VR::CS, VM::M1, "ASLContext" }, { 0x0018, 0x9258, 0, VR::UL, VM::M1, "ASLPulseTrainDuration" }, { 0x0018, 0x9259, 0, VR::CS, VM::M1, "ASLCrusherFlag" }, { 0x0018, 0x925A, 0, VR::FD, VM::M1, "ASLCrusherFlowLimit" }, { 0x0018, 0x925B, 0, VR::LO, VM::M1, "ASLCrusherDescription" }, { 0x0018, 0x925C, 0, VR::CS, VM::M1, "ASLBolusCutoffFlag" }, { 0x0018, 0x925D, 0, VR::SQ, VM::M1, "ASLBolusCutoffTimingSequence" }, { 0x0018, 0x925E, 0, VR::LO, VM::M1, "ASLBolusCutoffTechnique" }, { 0x0018, 0x925F, 0, VR::UL, VM::M1, "ASLBolusCutoffDelayTime" }, { 0x0018, 0x9260, 0, VR::SQ, VM::M1, "ASLSlabSequence" }, { 0x0018, 0x9295, 0, VR::FD, VM::M1, "ChemicalShiftMinimumIntegrationLimitInppm" }, { 0x0018, 0x9296, 0, VR::FD, VM::M1, "ChemicalShiftMaximumIntegrationLimitInppm" }, { 0x0018, 0x9297, 0, VR::CS, VM::M1, "WaterReferenceAcquisition" }, { 0x0018, 0x9298, 0, VR::IS, VM::M1, "EchoPeakPosition" }, { 0x0018, 0x9301, 0, VR::SQ, VM::M1, "CTAcquisitionTypeSequence" }, { 0x0018, 0x9302, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x0018, 0x9303, 0, VR::FD, VM::M1, "TubeAngle" }, { 0x0018, 0x9304, 0, VR::SQ, VM::M1, "CTAcquisitionDetailsSequence" }, { 0x0018, 0x9305, 0, VR::FD, VM::M1, "RevolutionTime" }, { 0x0018, 0x9306, 0, VR::FD, VM::M1, "SingleCollimationWidth" }, { 0x0018, 0x9307, 0, VR::FD, VM::M1, "TotalCollimationWidth" }, { 0x0018, 0x9308, 0, VR::SQ, VM::M1, "CTTableDynamicsSequence" }, { 0x0018, 0x9309, 0, VR::FD, VM::M1, "TableSpeed" }, { 0x0018, 0x9310, 0, VR::FD, VM::M1, "TableFeedPerRotation" }, { 0x0018, 0x9311, 0, VR::FD, VM::M1, "SpiralPitchFactor" }, { 0x0018, 0x9312, 0, VR::SQ, VM::M1, "CTGeometrySequence" }, { 0x0018, 0x9313, 0, VR::FD, VM::M3, "DataCollectionCenterPatient" }, { 0x0018, 0x9314, 0, VR::SQ, VM::M1, "CTReconstructionSequence" }, { 0x0018, 0x9315, 0, VR::CS, VM::M1, "ReconstructionAlgorithm" }, { 0x0018, 0x9316, 0, VR::CS, VM::M1, "ConvolutionKernelGroup" }, { 0x0018, 0x9317, 0, VR::FD, VM::M2, "ReconstructionFieldOfView" }, { 0x0018, 0x9318, 0, VR::FD, VM::M3, "ReconstructionTargetCenterPatient" }, { 0x0018, 0x9319, 0, VR::FD, VM::M1, "ReconstructionAngle" }, { 0x0018, 0x9320, 0, VR::SH, VM::M1, "ImageFilter" }, { 0x0018, 0x9321, 0, VR::SQ, VM::M1, "CTExposureSequence" }, { 0x0018, 0x9322, 0, VR::FD, VM::M2, "ReconstructionPixelSpacing" }, { 0x0018, 0x9323, 0, VR::CS, VM::M1TN, "ExposureModulationType" }, { 0x0018, 0x9324, 0, VR::FD, VM::M1, "EstimatedDoseSaving" }, { 0x0018, 0x9325, 0, VR::SQ, VM::M1, "CTXRayDetailsSequence" }, { 0x0018, 0x9326, 0, VR::SQ, VM::M1, "CTPositionSequence" }, { 0x0018, 0x9327, 0, VR::FD, VM::M1, "TablePosition" }, { 0x0018, 0x9328, 0, VR::FD, VM::M1, "ExposureTimeInms" }, { 0x0018, 0x9329, 0, VR::SQ, VM::M1, "CTImageFrameTypeSequence" }, { 0x0018, 0x9330, 0, VR::FD, VM::M1, "XRayTubeCurrentInmA" }, { 0x0018, 0x9332, 0, VR::FD, VM::M1, "ExposureInmAs" }, { 0x0018, 0x9333, 0, VR::CS, VM::M1, "ConstantVolumeFlag" }, { 0x0018, 0x9334, 0, VR::CS, VM::M1, "FluoroscopyFlag" }, { 0x0018, 0x9335, 0, VR::FD, VM::M1, "DistanceSourceToDataCollectionCenter" }, { 0x0018, 0x9337, 0, VR::US, VM::M1, "ContrastBolusAgentNumber" }, { 0x0018, 0x9338, 0, VR::SQ, VM::M1, "ContrastBolusIngredientCodeSequence" }, { 0x0018, 0x9340, 0, VR::SQ, VM::M1, "ContrastAdministrationProfileSequence" }, { 0x0018, 0x9341, 0, VR::SQ, VM::M1, "ContrastBolusUsageSequence" }, { 0x0018, 0x9342, 0, VR::CS, VM::M1, "ContrastBolusAgentAdministered" }, { 0x0018, 0x9343, 0, VR::CS, VM::M1, "ContrastBolusAgentDetected" }, { 0x0018, 0x9344, 0, VR::CS, VM::M1, "ContrastBolusAgentPhase" }, { 0x0018, 0x9345, 0, VR::FD, VM::M1, "CTDIvol" }, { 0x0018, 0x9346, 0, VR::SQ, VM::M1, "CTDIPhantomTypeCodeSequence" }, { 0x0018, 0x9351, 0, VR::FL, VM::M1, "CalciumScoringMassFactorPatient" }, { 0x0018, 0x9352, 0, VR::FL, VM::M3, "CalciumScoringMassFactorDevice" }, { 0x0018, 0x9353, 0, VR::FL, VM::M1, "EnergyWeightingFactor" }, { 0x0018, 0x9360, 0, VR::SQ, VM::M1, "CTAdditionalXRaySourceSequence" }, { 0x0018, 0x9361, 0, VR::CS, VM::M1, "MultienergyCTAcquisition" }, { 0x0018, 0x9362, 0, VR::SQ, VM::M1, "MultienergyCTAcquisitionSequence" }, { 0x0018, 0x9363, 0, VR::SQ, VM::M1, "MultienergyCTProcessingSequence" }, { 0x0018, 0x9364, 0, VR::SQ, VM::M1, "MultienergyCTCharacteristicsSequence" }, { 0x0018, 0x9365, 0, VR::SQ, VM::M1, "MultienergyCTXRaySourceSequence" }, { 0x0018, 0x9366, 0, VR::US, VM::M1, "XRaySourceIndex" }, { 0x0018, 0x9367, 0, VR::UC, VM::M1, "XRaySourceID" }, { 0x0018, 0x9368, 0, VR::CS, VM::M1, "MultienergySourceTechnique" }, { 0x0018, 0x9369, 0, VR::DT, VM::M1, "SourceStartDateTime" }, { 0x0018, 0x936A, 0, VR::DT, VM::M1, "SourceEndDateTime" }, { 0x0018, 0x936B, 0, VR::US, VM::M1, "SwitchingPhaseNumber" }, { 0x0018, 0x936C, 0, VR::DS, VM::M1, "SwitchingPhaseNominalDuration" }, { 0x0018, 0x936D, 0, VR::DS, VM::M1, "SwitchingPhaseTransitionDuration" }, { 0x0018, 0x936E, 0, VR::DS, VM::M1, "EffectiveBinEnergy" }, { 0x0018, 0x936F, 0, VR::SQ, VM::M1, "MultienergyCTXRayDetectorSequence" }, { 0x0018, 0x9370, 0, VR::US, VM::M1, "XRayDetectorIndex" }, { 0x0018, 0x9371, 0, VR::UC, VM::M1, "XRayDetectorID" }, { 0x0018, 0x9372, 0, VR::CS, VM::M1, "MultienergyDetectorType" }, { 0x0018, 0x9373, 0, VR::ST, VM::M1, "XRayDetectorLabel" }, { 0x0018, 0x9374, 0, VR::DS, VM::M1, "NominalMaxEnergy" }, { 0x0018, 0x9375, 0, VR::DS, VM::M1, "NominalMinEnergy" }, { 0x0018, 0x9376, 0, VR::US, VM::M1TN, "ReferencedXRayDetectorIndex" }, { 0x0018, 0x9377, 0, VR::US, VM::M1TN, "ReferencedXRaySourceIndex" }, { 0x0018, 0x9378, 0, VR::US, VM::M1TN, "ReferencedPathIndex" }, { 0x0018, 0x9379, 0, VR::SQ, VM::M1, "MultienergyCTPathSequence" }, { 0x0018, 0x937A, 0, VR::US, VM::M1, "MultienergyCTPathIndex" }, { 0x0018, 0x937B, 0, VR::UT, VM::M1, "MultienergyAcquisitionDescription" }, { 0x0018, 0x937C, 0, VR::FD, VM::M1, "MonoenergeticEnergyEquivalent" }, { 0x0018, 0x937D, 0, VR::SQ, VM::M1, "MaterialCodeSequence" }, { 0x0018, 0x937E, 0, VR::CS, VM::M1, "DecompositionMethod" }, { 0x0018, 0x937F, 0, VR::UT, VM::M1, "DecompositionDescription" }, { 0x0018, 0x9380, 0, VR::SQ, VM::M1, "DecompositionAlgorithmIdentificationSequence" }, { 0x0018, 0x9381, 0, VR::SQ, VM::M1, "DecompositionMaterialSequence" }, { 0x0018, 0x9382, 0, VR::SQ, VM::M1, "MaterialAttenuationSequence" }, { 0x0018, 0x9383, 0, VR::DS, VM::M1, "PhotonEnergy" }, { 0x0018, 0x9384, 0, VR::DS, VM::M1, "XRayMassAttenuationCoefficient" }, { 0x0018, 0x9401, 0, VR::SQ, VM::M1, "ProjectionPixelCalibrationSequence" }, { 0x0018, 0x9402, 0, VR::FL, VM::M1, "DistanceSourceToIsocenter" }, { 0x0018, 0x9403, 0, VR::FL, VM::M1, "DistanceObjectToTableTop" }, { 0x0018, 0x9404, 0, VR::FL, VM::M2, "ObjectPixelSpacingInCenterOfBeam" }, { 0x0018, 0x9405, 0, VR::SQ, VM::M1, "PositionerPositionSequence" }, { 0x0018, 0x9406, 0, VR::SQ, VM::M1, "TablePositionSequence" }, { 0x0018, 0x9407, 0, VR::SQ, VM::M1, "CollimatorShapeSequence" }, { 0x0018, 0x9410, 0, VR::CS, VM::M1, "PlanesInAcquisition" }, { 0x0018, 0x9412, 0, VR::SQ, VM::M1, "XAXRFFrameCharacteristicsSequence" }, { 0x0018, 0x9417, 0, VR::SQ, VM::M1, "FrameAcquisitionSequence" }, { 0x0018, 0x9420, 0, VR::CS, VM::M1, "XRayReceptorType" }, { 0x0018, 0x9423, 0, VR::LO, VM::M1, "AcquisitionProtocolName" }, { 0x0018, 0x9424, 0, VR::LT, VM::M1, "AcquisitionProtocolDescription" }, { 0x0018, 0x9425, 0, VR::CS, VM::M1, "ContrastBolusIngredientOpaque" }, { 0x0018, 0x9426, 0, VR::FL, VM::M1, "DistanceReceptorPlaneToDetectorHousing" }, { 0x0018, 0x9427, 0, VR::CS, VM::M1, "IntensifierActiveShape" }, { 0x0018, 0x9428, 0, VR::FL, VM::M1T2, "IntensifierActiveDimensions" }, { 0x0018, 0x9429, 0, VR::FL, VM::M2, "PhysicalDetectorSize" }, { 0x0018, 0x9430, 0, VR::FL, VM::M2, "PositionOfIsocenterProjection" }, { 0x0018, 0x9432, 0, VR::SQ, VM::M1, "FieldOfViewSequence" }, { 0x0018, 0x9433, 0, VR::LO, VM::M1, "FieldOfViewDescription" }, { 0x0018, 0x9434, 0, VR::SQ, VM::M1, "ExposureControlSensingRegionsSequence" }, { 0x0018, 0x9435, 0, VR::CS, VM::M1, "ExposureControlSensingRegionShape" }, { 0x0018, 0x9436, 0, VR::SS, VM::M1, "ExposureControlSensingRegionLeftVerticalEdge" }, { 0x0018, 0x9437, 0, VR::SS, VM::M1, "ExposureControlSensingRegionRightVerticalEdge" }, { 0x0018, 0x9438, 0, VR::SS, VM::M1, "ExposureControlSensingRegionUpperHorizontalEdge" }, { 0x0018, 0x9439, 0, VR::SS, VM::M1, "ExposureControlSensingRegionLowerHorizontalEdge" }, { 0x0018, 0x9440, 0, VR::SS, VM::M2, "CenterOfCircularExposureControlSensingRegion" }, { 0x0018, 0x9441, 0, VR::US, VM::M1, "RadiusOfCircularExposureControlSensingRegion" }, { 0x0018, 0x9442, 0, VR::SS, VM::M2TN, "VerticesOfThePolygonalExposureControlSensingRegion" }, { 0x0018, 0x9447, 0, VR::FL, VM::M1, "ColumnAngulationPatient" }, { 0x0018, 0x9449, 0, VR::FL, VM::M1, "BeamAngle" }, { 0x0018, 0x9451, 0, VR::SQ, VM::M1, "FrameDetectorParametersSequence" }, { 0x0018, 0x9452, 0, VR::FL, VM::M1, "CalculatedAnatomyThickness" }, { 0x0018, 0x9455, 0, VR::SQ, VM::M1, "CalibrationSequence" }, { 0x0018, 0x9456, 0, VR::SQ, VM::M1, "ObjectThicknessSequence" }, { 0x0018, 0x9457, 0, VR::CS, VM::M1, "PlaneIdentification" }, { 0x0018, 0x9461, 0, VR::FL, VM::M1T2, "FieldOfViewDimensionsInFloat" }, { 0x0018, 0x9462, 0, VR::SQ, VM::M1, "IsocenterReferenceSystemSequence" }, { 0x0018, 0x9463, 0, VR::FL, VM::M1, "PositionerIsocenterPrimaryAngle" }, { 0x0018, 0x9464, 0, VR::FL, VM::M1, "PositionerIsocenterSecondaryAngle" }, { 0x0018, 0x9465, 0, VR::FL, VM::M1, "PositionerIsocenterDetectorRotationAngle" }, { 0x0018, 0x9466, 0, VR::FL, VM::M1, "TableXPositionToIsocenter" }, { 0x0018, 0x9467, 0, VR::FL, VM::M1, "TableYPositionToIsocenter" }, { 0x0018, 0x9468, 0, VR::FL, VM::M1, "TableZPositionToIsocenter" }, { 0x0018, 0x9469, 0, VR::FL, VM::M1, "TableHorizontalRotationAngle" }, { 0x0018, 0x9470, 0, VR::FL, VM::M1, "TableHeadTiltAngle" }, { 0x0018, 0x9471, 0, VR::FL, VM::M1, "TableCradleTiltAngle" }, { 0x0018, 0x9472, 0, VR::SQ, VM::M1, "FrameDisplayShutterSequence" }, { 0x0018, 0x9473, 0, VR::FL, VM::M1, "AcquiredImageAreaDoseProduct" }, { 0x0018, 0x9474, 0, VR::CS, VM::M1, "CArmPositionerTabletopRelationship" }, { 0x0018, 0x9476, 0, VR::SQ, VM::M1, "XRayGeometrySequence" }, { 0x0018, 0x9477, 0, VR::SQ, VM::M1, "IrradiationEventIdentificationSequence" }, { 0x0018, 0x9504, 0, VR::SQ, VM::M1, "XRay3DFrameTypeSequence" }, { 0x0018, 0x9506, 0, VR::SQ, VM::M1, "ContributingSourcesSequence" }, { 0x0018, 0x9507, 0, VR::SQ, VM::M1, "XRay3DAcquisitionSequence" }, { 0x0018, 0x9508, 0, VR::FL, VM::M1, "PrimaryPositionerScanArc" }, { 0x0018, 0x9509, 0, VR::FL, VM::M1, "SecondaryPositionerScanArc" }, { 0x0018, 0x9510, 0, VR::FL, VM::M1, "PrimaryPositionerScanStartAngle" }, { 0x0018, 0x9511, 0, VR::FL, VM::M1, "SecondaryPositionerScanStartAngle" }, { 0x0018, 0x9514, 0, VR::FL, VM::M1, "PrimaryPositionerIncrement" }, { 0x0018, 0x9515, 0, VR::FL, VM::M1, "SecondaryPositionerIncrement" }, { 0x0018, 0x9516, 0, VR::DT, VM::M1, "StartAcquisitionDateTime" }, { 0x0018, 0x9517, 0, VR::DT, VM::M1, "EndAcquisitionDateTime" }, { 0x0018, 0x9518, 0, VR::SS, VM::M1, "PrimaryPositionerIncrementSign" }, { 0x0018, 0x9519, 0, VR::SS, VM::M1, "SecondaryPositionerIncrementSign" }, { 0x0018, 0x9524, 0, VR::LO, VM::M1, "ApplicationName" }, { 0x0018, 0x9525, 0, VR::LO, VM::M1, "ApplicationVersion" }, { 0x0018, 0x9526, 0, VR::LO, VM::M1, "ApplicationManufacturer" }, { 0x0018, 0x9527, 0, VR::CS, VM::M1, "AlgorithmType" }, { 0x0018, 0x9528, 0, VR::LO, VM::M1, "AlgorithmDescription" }, { 0x0018, 0x9530, 0, VR::SQ, VM::M1, "XRay3DReconstructionSequence" }, { 0x0018, 0x9531, 0, VR::LO, VM::M1, "ReconstructionDescription" }, { 0x0018, 0x9538, 0, VR::SQ, VM::M1, "PerProjectionAcquisitionSequence" }, { 0x0018, 0x9541, 0, VR::SQ, VM::M1, "DetectorPositionSequence" }, { 0x0018, 0x9542, 0, VR::SQ, VM::M1, "XRayAcquisitionDoseSequence" }, { 0x0018, 0x9543, 0, VR::FD, VM::M1, "XRaySourceIsocenterPrimaryAngle" }, { 0x0018, 0x9544, 0, VR::FD, VM::M1, "XRaySourceIsocenterSecondaryAngle" }, { 0x0018, 0x9545, 0, VR::FD, VM::M1, "BreastSupportIsocenterPrimaryAngle" }, { 0x0018, 0x9546, 0, VR::FD, VM::M1, "BreastSupportIsocenterSecondaryAngle" }, { 0x0018, 0x9547, 0, VR::FD, VM::M1, "BreastSupportXPositionToIsocenter" }, { 0x0018, 0x9548, 0, VR::FD, VM::M1, "BreastSupportYPositionToIsocenter" }, { 0x0018, 0x9549, 0, VR::FD, VM::M1, "BreastSupportZPositionToIsocenter" }, { 0x0018, 0x9550, 0, VR::FD, VM::M1, "DetectorIsocenterPrimaryAngle" }, { 0x0018, 0x9551, 0, VR::FD, VM::M1, "DetectorIsocenterSecondaryAngle" }, { 0x0018, 0x9552, 0, VR::FD, VM::M1, "DetectorXPositionToIsocenter" }, { 0x0018, 0x9553, 0, VR::FD, VM::M1, "DetectorYPositionToIsocenter" }, { 0x0018, 0x9554, 0, VR::FD, VM::M1, "DetectorZPositionToIsocenter" }, { 0x0018, 0x9555, 0, VR::SQ, VM::M1, "XRayGridSequence" }, { 0x0018, 0x9556, 0, VR::SQ, VM::M1, "XRayFilterSequence" }, { 0x0018, 0x9557, 0, VR::FD, VM::M3, "DetectorActiveAreaTLHCPosition" }, { 0x0018, 0x9558, 0, VR::FD, VM::M6, "DetectorActiveAreaOrientation" }, { 0x0018, 0x9559, 0, VR::CS, VM::M1, "PositionerPrimaryAngleDirection" }, { 0x0018, 0x9601, 0, VR::SQ, VM::M1, "DiffusionBMatrixSequence" }, { 0x0018, 0x9602, 0, VR::FD, VM::M1, "DiffusionBValueXX" }, { 0x0018, 0x9603, 0, VR::FD, VM::M1, "DiffusionBValueXY" }, { 0x0018, 0x9604, 0, VR::FD, VM::M1, "DiffusionBValueXZ" }, { 0x0018, 0x9605, 0, VR::FD, VM::M1, "DiffusionBValueYY" }, { 0x0018, 0x9606, 0, VR::FD, VM::M1, "DiffusionBValueYZ" }, { 0x0018, 0x9607, 0, VR::FD, VM::M1, "DiffusionBValueZZ" }, { 0x0018, 0x9621, 0, VR::SQ, VM::M1, "FunctionalMRSequence" }, { 0x0018, 0x9622, 0, VR::CS, VM::M1, "FunctionalSettlingPhaseFramesPresent" }, { 0x0018, 0x9623, 0, VR::DT, VM::M1, "FunctionalSyncPulse" }, { 0x0018, 0x9624, 0, VR::CS, VM::M1, "SettlingPhaseFrame" }, { 0x0018, 0x9701, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" }, { 0x0018, 0x9715, 0, VR::FD, VM::M1, "StartDensityThreshold" }, { 0x0018, 0x9716, 0, VR::FD, VM::M1, "StartRelativeDensityDifferenceThreshold" }, { 0x0018, 0x9717, 0, VR::FD, VM::M1, "StartCardiacTriggerCountThreshold" }, { 0x0018, 0x9718, 0, VR::FD, VM::M1, "StartRespiratoryTriggerCountThreshold" }, { 0x0018, 0x9719, 0, VR::FD, VM::M1, "TerminationCountsThreshold" }, { 0x0018, 0x9720, 0, VR::FD, VM::M1, "TerminationDensityThreshold" }, { 0x0018, 0x9721, 0, VR::FD, VM::M1, "TerminationRelativeDensityThreshold" }, { 0x0018, 0x9722, 0, VR::FD, VM::M1, "TerminationTimeThreshold" }, { 0x0018, 0x9723, 0, VR::FD, VM::M1, "TerminationCardiacTriggerCountThreshold" }, { 0x0018, 0x9724, 0, VR::FD, VM::M1, "TerminationRespiratoryTriggerCountThreshold" }, { 0x0018, 0x9725, 0, VR::CS, VM::M1, "DetectorGeometry" }, { 0x0018, 0x9726, 0, VR::FD, VM::M1, "TransverseDetectorSeparation" }, { 0x0018, 0x9727, 0, VR::FD, VM::M1, "AxialDetectorDimension" }, { 0x0018, 0x9729, 0, VR::US, VM::M1, "RadiopharmaceuticalAgentNumber" }, { 0x0018, 0x9732, 0, VR::SQ, VM::M1, "PETFrameAcquisitionSequence" }, { 0x0018, 0x9733, 0, VR::SQ, VM::M1, "PETDetectorMotionDetailsSequence" }, { 0x0018, 0x9734, 0, VR::SQ, VM::M1, "PETTableDynamicsSequence" }, { 0x0018, 0x9735, 0, VR::SQ, VM::M1, "PETPositionSequence" }, { 0x0018, 0x9736, 0, VR::SQ, VM::M1, "PETFrameCorrectionFactorsSequence" }, { 0x0018, 0x9737, 0, VR::SQ, VM::M1, "RadiopharmaceuticalUsageSequence" }, { 0x0018, 0x9738, 0, VR::CS, VM::M1, "AttenuationCorrectionSource" }, { 0x0018, 0x9739, 0, VR::US, VM::M1, "NumberOfIterations" }, { 0x0018, 0x9740, 0, VR::US, VM::M1, "NumberOfSubsets" }, { 0x0018, 0x9749, 0, VR::SQ, VM::M1, "PETReconstructionSequence" }, { 0x0018, 0x9751, 0, VR::SQ, VM::M1, "PETFrameTypeSequence" }, { 0x0018, 0x9755, 0, VR::CS, VM::M1, "TimeOfFlightInformationUsed" }, { 0x0018, 0x9756, 0, VR::CS, VM::M1, "ReconstructionType" }, { 0x0018, 0x9758, 0, VR::CS, VM::M1, "DecayCorrected" }, { 0x0018, 0x9759, 0, VR::CS, VM::M1, "AttenuationCorrected" }, { 0x0018, 0x9760, 0, VR::CS, VM::M1, "ScatterCorrected" }, { 0x0018, 0x9761, 0, VR::CS, VM::M1, "DeadTimeCorrected" }, { 0x0018, 0x9762, 0, VR::CS, VM::M1, "GantryMotionCorrected" }, { 0x0018, 0x9763, 0, VR::CS, VM::M1, "PatientMotionCorrected" }, { 0x0018, 0x9764, 0, VR::CS, VM::M1, "CountLossNormalizationCorrected" }, { 0x0018, 0x9765, 0, VR::CS, VM::M1, "RandomsCorrected" }, { 0x0018, 0x9766, 0, VR::CS, VM::M1, "NonUniformRadialSamplingCorrected" }, { 0x0018, 0x9767, 0, VR::CS, VM::M1, "SensitivityCalibrated" }, { 0x0018, 0x9768, 0, VR::CS, VM::M1, "DetectorNormalizationCorrection" }, { 0x0018, 0x9769, 0, VR::CS, VM::M1, "IterativeReconstructionMethod" }, { 0x0018, 0x9770, 0, VR::CS, VM::M1, "AttenuationCorrectionTemporalRelationship" }, { 0x0018, 0x9771, 0, VR::SQ, VM::M1, "PatientPhysiologicalStateSequence" }, { 0x0018, 0x9772, 0, VR::SQ, VM::M1, "PatientPhysiologicalStateCodeSequence" }, { 0x0018, 0x9801, 0, VR::FD, VM::M1TN, "DepthsOfFocus" }, { 0x0018, 0x9803, 0, VR::SQ, VM::M1, "ExcludedIntervalsSequence" }, { 0x0018, 0x9804, 0, VR::DT, VM::M1, "ExclusionStartDateTime" }, { 0x0018, 0x9805, 0, VR::FD, VM::M1, "ExclusionDuration" }, { 0x0018, 0x9806, 0, VR::SQ, VM::M1, "USImageDescriptionSequence" }, { 0x0018, 0x9807, 0, VR::SQ, VM::M1, "ImageDataTypeSequence" }, { 0x0018, 0x9808, 0, VR::CS, VM::M1, "DataType" }, { 0x0018, 0x9809, 0, VR::SQ, VM::M1, "TransducerScanPatternCodeSequence" }, { 0x0018, 0x980B, 0, VR::CS, VM::M1, "AliasedDataType" }, { 0x0018, 0x980C, 0, VR::CS, VM::M1, "PositionMeasuringDeviceUsed" }, { 0x0018, 0x980D, 0, VR::SQ, VM::M1, "TransducerGeometryCodeSequence" }, { 0x0018, 0x980E, 0, VR::SQ, VM::M1, "TransducerBeamSteeringCodeSequence" }, { 0x0018, 0x980F, 0, VR::SQ, VM::M1, "TransducerApplicationCodeSequence" }, { 0x0018, 0x9810, 0, VR::XS, VM::M1, "ZeroVelocityPixelValue" }, { 0x0018, 0x9900, 0, VR::LO, VM::M1, "ReferenceLocationLabel" }, { 0x0018, 0x9901, 0, VR::UT, VM::M1, "ReferenceLocationDescription" }, { 0x0018, 0x9902, 0, VR::SQ, VM::M1, "ReferenceBasisCodeSequence" }, { 0x0018, 0x9903, 0, VR::SQ, VM::M1, "ReferenceGeometryCodeSequence" }, { 0x0018, 0x9904, 0, VR::DS, VM::M1, "OffsetDistance" }, { 0x0018, 0x9905, 0, VR::CS, VM::M1, "OffsetDirection" }, { 0x0018, 0x9906, 0, VR::SQ, VM::M1, "PotentialScheduledProtocolCodeSequence" }, { 0x0018, 0x9907, 0, VR::SQ, VM::M1, "PotentialRequestedProcedureCodeSequence" }, { 0x0018, 0x9908, 0, VR::UC, VM::M1TN, "PotentialReasonsForProcedure" }, { 0x0018, 0x9909, 0, VR::SQ, VM::M1, "PotentialReasonsForProcedureCodeSequence" }, { 0x0018, 0x990A, 0, VR::UC, VM::M1TN, "PotentialDiagnosticTasks" }, { 0x0018, 0x990B, 0, VR::SQ, VM::M1, "ContraindicationsCodeSequence" }, { 0x0018, 0x990C, 0, VR::SQ, VM::M1, "ReferencedDefinedProtocolSequence" }, { 0x0018, 0x990D, 0, VR::SQ, VM::M1, "ReferencedPerformedProtocolSequence" }, { 0x0018, 0x990E, 0, VR::SQ, VM::M1, "PredecessorProtocolSequence" }, { 0x0018, 0x990F, 0, VR::UT, VM::M1, "ProtocolPlanningInformation" }, { 0x0018, 0x9910, 0, VR::UT, VM::M1, "ProtocolDesignRationale" }, { 0x0018, 0x9911, 0, VR::SQ, VM::M1, "PatientSpecificationSequence" }, { 0x0018, 0x9912, 0, VR::SQ, VM::M1, "ModelSpecificationSequence" }, { 0x0018, 0x9913, 0, VR::SQ, VM::M1, "ParametersSpecificationSequence" }, { 0x0018, 0x9914, 0, VR::SQ, VM::M1, "InstructionSequence" }, { 0x0018, 0x9915, 0, VR::US, VM::M1, "InstructionIndex" }, { 0x0018, 0x9916, 0, VR::LO, VM::M1, "InstructionText" }, { 0x0018, 0x9917, 0, VR::UT, VM::M1, "InstructionDescription" }, { 0x0018, 0x9918, 0, VR::CS, VM::M1, "InstructionPerformedFlag" }, { 0x0018, 0x9919, 0, VR::DT, VM::M1, "InstructionPerformedDateTime" }, { 0x0018, 0x991A, 0, VR::UT, VM::M1, "InstructionPerformanceComment" }, { 0x0018, 0x991B, 0, VR::SQ, VM::M1, "PatientPositioningInstructionSequence" }, { 0x0018, 0x991C, 0, VR::SQ, VM::M1, "PositioningMethodCodeSequence" }, { 0x0018, 0x991D, 0, VR::SQ, VM::M1, "PositioningLandmarkSequence" }, { 0x0018, 0x991E, 0, VR::UI, VM::M1, "TargetFrameOfReferenceUID" }, { 0x0018, 0x991F, 0, VR::SQ, VM::M1, "AcquisitionProtocolElementSpecificationSequence" }, { 0x0018, 0x9920, 0, VR::SQ, VM::M1, "AcquisitionProtocolElementSequence" }, { 0x0018, 0x9921, 0, VR::US, VM::M1, "ProtocolElementNumber" }, { 0x0018, 0x9922, 0, VR::LO, VM::M1, "ProtocolElementName" }, { 0x0018, 0x9923, 0, VR::UT, VM::M1, "ProtocolElementCharacteristicsSummary" }, { 0x0018, 0x9924, 0, VR::UT, VM::M1, "ProtocolElementPurpose" }, { 0x0018, 0x9930, 0, VR::CS, VM::M1, "AcquisitionMotion" }, { 0x0018, 0x9931, 0, VR::SQ, VM::M1, "AcquisitionStartLocationSequence" }, { 0x0018, 0x9932, 0, VR::SQ, VM::M1, "AcquisitionEndLocationSequence" }, { 0x0018, 0x9933, 0, VR::SQ, VM::M1, "ReconstructionProtocolElementSpecificationSequence" }, { 0x0018, 0x9934, 0, VR::SQ, VM::M1, "ReconstructionProtocolElementSequence" }, { 0x0018, 0x9935, 0, VR::SQ, VM::M1, "StorageProtocolElementSpecificationSequence" }, { 0x0018, 0x9936, 0, VR::SQ, VM::M1, "StorageProtocolElementSequence" }, { 0x0018, 0x9937, 0, VR::LO, VM::M1, "RequestedSeriesDescription" }, { 0x0018, 0x9938, 0, VR::US, VM::M1TN, "SourceAcquisitionProtocolElementNumber" }, { 0x0018, 0x9939, 0, VR::US, VM::M1TN, "SourceAcquisitionBeamNumber" }, { 0x0018, 0x993A, 0, VR::US, VM::M1TN, "SourceReconstructionProtocolElementNumber" }, { 0x0018, 0x993B, 0, VR::SQ, VM::M1, "ReconstructionStartLocationSequence" }, { 0x0018, 0x993C, 0, VR::SQ, VM::M1, "ReconstructionEndLocationSequence" }, { 0x0018, 0x993D, 0, VR::SQ, VM::M1, "ReconstructionAlgorithmSequence" }, { 0x0018, 0x993E, 0, VR::SQ, VM::M1, "ReconstructionTargetCenterLocationSequence" }, { 0x0018, 0x9941, 0, VR::UT, VM::M1, "ImageFilterDescription" }, { 0x0018, 0x9942, 0, VR::FD, VM::M1, "CTDIvolNotificationTrigger" }, { 0x0018, 0x9943, 0, VR::FD, VM::M1, "DLPNotificationTrigger" }, { 0x0018, 0x9944, 0, VR::CS, VM::M1, "AutoKVPSelectionType" }, { 0x0018, 0x9945, 0, VR::FD, VM::M1, "AutoKVPUpperBound" }, { 0x0018, 0x9946, 0, VR::FD, VM::M1, "AutoKVPLowerBound" }, { 0x0018, 0x9947, 0, VR::CS, VM::M1, "ProtocolDefinedPatientPosition" }, { 0x0018, 0xA001, 0, VR::SQ, VM::M1, "ContributingEquipmentSequence" }, { 0x0018, 0xA002, 0, VR::DT, VM::M1, "ContributionDateTime" }, { 0x0018, 0xA003, 0, VR::ST, VM::M1, "ContributionDescription" }, { 0x0020, 0x000D, 0, VR::UI, VM::M1, "StudyInstanceUID" }, { 0x0020, 0x000E, 0, VR::UI, VM::M1, "SeriesInstanceUID" }, { 0x0020, 0x0010, 0, VR::SH, VM::M1, "StudyID" }, { 0x0020, 0x0011, 0, VR::IS, VM::M1, "SeriesNumber" }, { 0x0020, 0x0012, 0, VR::IS, VM::M1, "AcquisitionNumber" }, { 0x0020, 0x0013, 0, VR::IS, VM::M1, "InstanceNumber" }, { 0x0020, 0x0014, 1, VR::IS, VM::M1, "IsotopeNumber" }, { 0x0020, 0x0015, 1, VR::IS, VM::M1, "PhaseNumber" }, { 0x0020, 0x0016, 1, VR::IS, VM::M1, "IntervalNumber" }, { 0x0020, 0x0017, 1, VR::IS, VM::M1, "TimeSlotNumber" }, { 0x0020, 0x0018, 1, VR::IS, VM::M1, "AngleNumber" }, { 0x0020, 0x0019, 0, VR::IS, VM::M1, "ItemNumber" }, { 0x0020, 0x0020, 0, VR::CS, VM::M2, "PatientOrientation" }, { 0x0020, 0x0022, 1, VR::IS, VM::M1, "OverlayNumber" }, { 0x0020, 0x0024, 1, VR::IS, VM::M1, "CurveNumber" }, { 0x0020, 0x0026, 1, VR::IS, VM::M1, "LUTNumber" }, { 0x0020, 0x0030, 1, VR::DS, VM::M3, "ImagePosition" }, { 0x0020, 0x0032, 0, VR::DS, VM::M3, "ImagePositionPatient" }, { 0x0020, 0x0035, 1, VR::DS, VM::M6, "ImageOrientation" }, { 0x0020, 0x0037, 0, VR::DS, VM::M6, "ImageOrientationPatient" }, { 0x0020, 0x0050, 1, VR::DS, VM::M1, "Location" }, { 0x0020, 0x0052, 0, VR::UI, VM::M1, "FrameOfReferenceUID" }, { 0x0020, 0x0060, 0, VR::CS, VM::M1, "Laterality" }, { 0x0020, 0x0062, 0, VR::CS, VM::M1, "ImageLaterality" }, { 0x0020, 0x0070, 1, VR::LO, VM::M1, "ImageGeometryType" }, { 0x0020, 0x0080, 1, VR::CS, VM::M1TN, "MaskingImage" }, { 0x0020, 0x00AA, 1, VR::IS, VM::M1, "ReportNumber" }, { 0x0020, 0x0100, 0, VR::IS, VM::M1, "TemporalPositionIdentifier" }, { 0x0020, 0x0105, 0, VR::IS, VM::M1, "NumberOfTemporalPositions" }, { 0x0020, 0x0110, 0, VR::DS, VM::M1, "TemporalResolution" }, { 0x0020, 0x0200, 0, VR::UI, VM::M1, "SynchronizationFrameOfReferenceUID" }, { 0x0020, 0x0242, 0, VR::UI, VM::M1, "SOPInstanceUIDOfConcatenationSource" }, { 0x0020, 0x1000, 1, VR::IS, VM::M1, "SeriesInStudy" }, { 0x0020, 0x1001, 1, VR::IS, VM::M1, "AcquisitionsInSeries" }, { 0x0020, 0x1002, 0, VR::IS, VM::M1, "ImagesInAcquisition" }, { 0x0020, 0x1003, 1, VR::IS, VM::M1, "ImagesInSeries" }, { 0x0020, 0x1004, 1, VR::IS, VM::M1, "AcquisitionsInStudy" }, { 0x0020, 0x1005, 1, VR::IS, VM::M1, "ImagesInStudy" }, { 0x0020, 0x1020, 1, VR::LO, VM::M1TN, "Reference" }, { 0x0020, 0x103F, 0, VR::LO, VM::M1, "TargetPositionReferenceIndicator" }, { 0x0020, 0x1040, 0, VR::LO, VM::M1, "PositionReferenceIndicator" }, { 0x0020, 0x1041, 0, VR::DS, VM::M1, "SliceLocation" }, { 0x0020, 0x1070, 1, VR::IS, VM::M1TN, "OtherStudyNumbers" }, { 0x0020, 0x1200, 0, VR::IS, VM::M1, "NumberOfPatientRelatedStudies" }, { 0x0020, 0x1202, 0, VR::IS, VM::M1, "NumberOfPatientRelatedSeries" }, { 0x0020, 0x1204, 0, VR::IS, VM::M1, "NumberOfPatientRelatedInstances" }, { 0x0020, 0x1206, 0, VR::IS, VM::M1, "NumberOfStudyRelatedSeries" }, { 0x0020, 0x1208, 0, VR::IS, VM::M1, "NumberOfStudyRelatedInstances" }, { 0x0020, 0x1209, 0, VR::IS, VM::M1, "NumberOfSeriesRelatedInstances" }, { 0x0020, 0x3100, 1, VR::CS, VM::M1TN, "SourceImageIDs" }, { 0x0020, 0x3401, 1, VR::CS, VM::M1, "ModifyingDeviceID" }, { 0x0020, 0x3402, 1, VR::CS, VM::M1, "ModifiedImageID" }, { 0x0020, 0x3403, 1, VR::DA, VM::M1, "ModifiedImageDate" }, { 0x0020, 0x3404, 1, VR::LO, VM::M1, "ModifyingDeviceManufacturer" }, { 0x0020, 0x3405, 1, VR::TM, VM::M1, "ModifiedImageTime" }, { 0x0020, 0x3406, 1, VR::LO, VM::M1, "ModifiedImageDescription" }, { 0x0020, 0x4000, 0, VR::LT, VM::M1, "ImageComments" }, { 0x0020, 0x5000, 1, VR::AT, VM::M1TN, "OriginalImageIdentification" }, { 0x0020, 0x5002, 1, VR::LO, VM::M1TN, "OriginalImageIdentificationNomenclature" }, { 0x0020, 0x9056, 0, VR::SH, VM::M1, "StackID" }, { 0x0020, 0x9057, 0, VR::UL, VM::M1, "InStackPositionNumber" }, { 0x0020, 0x9071, 0, VR::SQ, VM::M1, "FrameAnatomySequence" }, { 0x0020, 0x9072, 0, VR::CS, VM::M1, "FrameLaterality" }, { 0x0020, 0x9111, 0, VR::SQ, VM::M1, "FrameContentSequence" }, { 0x0020, 0x9113, 0, VR::SQ, VM::M1, "PlanePositionSequence" }, { 0x0020, 0x9116, 0, VR::SQ, VM::M1, "PlaneOrientationSequence" }, { 0x0020, 0x9128, 0, VR::UL, VM::M1, "TemporalPositionIndex" }, { 0x0020, 0x9153, 0, VR::FD, VM::M1, "NominalCardiacTriggerDelayTime" }, { 0x0020, 0x9154, 0, VR::FL, VM::M1, "NominalCardiacTriggerTimePriorToRPeak" }, { 0x0020, 0x9155, 0, VR::FL, VM::M1, "ActualCardiacTriggerTimePriorToRPeak" }, { 0x0020, 0x9156, 0, VR::US, VM::M1, "FrameAcquisitionNumber" }, { 0x0020, 0x9157, 0, VR::UL, VM::M1TN, "DimensionIndexValues" }, { 0x0020, 0x9158, 0, VR::LT, VM::M1, "FrameComments" }, { 0x0020, 0x9161, 0, VR::UI, VM::M1, "ConcatenationUID" }, { 0x0020, 0x9162, 0, VR::US, VM::M1, "InConcatenationNumber" }, { 0x0020, 0x9163, 0, VR::US, VM::M1, "InConcatenationTotalNumber" }, { 0x0020, 0x9164, 0, VR::UI, VM::M1, "DimensionOrganizationUID" }, { 0x0020, 0x9165, 0, VR::AT, VM::M1, "DimensionIndexPointer" }, { 0x0020, 0x9167, 0, VR::AT, VM::M1, "FunctionalGroupPointer" }, { 0x0020, 0x9170, 0, VR::SQ, VM::M1, "UnassignedSharedConvertedAttributesSequence" }, { 0x0020, 0x9171, 0, VR::SQ, VM::M1, "UnassignedPerFrameConvertedAttributesSequence" }, { 0x0020, 0x9172, 0, VR::SQ, VM::M1, "ConversionSourceAttributesSequence" }, { 0x0020, 0x9213, 0, VR::LO, VM::M1, "DimensionIndexPrivateCreator" }, { 0x0020, 0x9221, 0, VR::SQ, VM::M1, "DimensionOrganizationSequence" }, { 0x0020, 0x9222, 0, VR::SQ, VM::M1, "DimensionIndexSequence" }, { 0x0020, 0x9228, 0, VR::UL, VM::M1, "ConcatenationFrameOffsetNumber" }, { 0x0020, 0x9238, 0, VR::LO, VM::M1, "FunctionalGroupPrivateCreator" }, { 0x0020, 0x9241, 0, VR::FL, VM::M1, "NominalPercentageOfCardiacPhase" }, { 0x0020, 0x9245, 0, VR::FL, VM::M1, "NominalPercentageOfRespiratoryPhase" }, { 0x0020, 0x9246, 0, VR::FL, VM::M1, "StartingRespiratoryAmplitude" }, { 0x0020, 0x9247, 0, VR::CS, VM::M1, "StartingRespiratoryPhase" }, { 0x0020, 0x9248, 0, VR::FL, VM::M1, "EndingRespiratoryAmplitude" }, { 0x0020, 0x9249, 0, VR::CS, VM::M1, "EndingRespiratoryPhase" }, { 0x0020, 0x9250, 0, VR::CS, VM::M1, "RespiratoryTriggerType" }, { 0x0020, 0x9251, 0, VR::FD, VM::M1, "RRIntervalTimeNominal" }, { 0x0020, 0x9252, 0, VR::FD, VM::M1, "ActualCardiacTriggerDelayTime" }, { 0x0020, 0x9253, 0, VR::SQ, VM::M1, "RespiratorySynchronizationSequence" }, { 0x0020, 0x9254, 0, VR::FD, VM::M1, "RespiratoryIntervalTime" }, { 0x0020, 0x9255, 0, VR::FD, VM::M1, "NominalRespiratoryTriggerDelayTime" }, { 0x0020, 0x9256, 0, VR::FD, VM::M1, "RespiratoryTriggerDelayThreshold" }, { 0x0020, 0x9257, 0, VR::FD, VM::M1, "ActualRespiratoryTriggerDelayTime" }, { 0x0020, 0x9301, 0, VR::FD, VM::M3, "ImagePositionVolume" }, { 0x0020, 0x9302, 0, VR::FD, VM::M6, "ImageOrientationVolume" }, { 0x0020, 0x9307, 0, VR::CS, VM::M1, "UltrasoundAcquisitionGeometry" }, { 0x0020, 0x9308, 0, VR::FD, VM::M3, "ApexPosition" }, { 0x0020, 0x9309, 0, VR::FD, VM::M16, "VolumeToTransducerMappingMatrix" }, { 0x0020, 0x930A, 0, VR::FD, VM::M16, "VolumeToTableMappingMatrix" }, { 0x0020, 0x930B, 0, VR::CS, VM::M1, "VolumeToTransducerRelationship" }, { 0x0020, 0x930C, 0, VR::CS, VM::M1, "PatientFrameOfReferenceSource" }, { 0x0020, 0x930D, 0, VR::FD, VM::M1, "TemporalPositionTimeOffset" }, { 0x0020, 0x930E, 0, VR::SQ, VM::M1, "PlanePositionVolumeSequence" }, { 0x0020, 0x930F, 0, VR::SQ, VM::M1, "PlaneOrientationVolumeSequence" }, { 0x0020, 0x9310, 0, VR::SQ, VM::M1, "TemporalPositionSequence" }, { 0x0020, 0x9311, 0, VR::CS, VM::M1, "DimensionOrganizationType" }, { 0x0020, 0x9312, 0, VR::UI, VM::M1, "VolumeFrameOfReferenceUID" }, { 0x0020, 0x9313, 0, VR::UI, VM::M1, "TableFrameOfReferenceUID" }, { 0x0020, 0x9421, 0, VR::LO, VM::M1, "DimensionDescriptionLabel" }, { 0x0020, 0x9450, 0, VR::SQ, VM::M1, "PatientOrientationInFrameSequence" }, { 0x0020, 0x9453, 0, VR::LO, VM::M1, "FrameLabel" }, { 0x0020, 0x9518, 0, VR::US, VM::M1TN, "AcquisitionIndex" }, { 0x0020, 0x9529, 0, VR::SQ, VM::M1, "ContributingSOPInstancesReferenceSequence" }, { 0x0020, 0x9536, 0, VR::US, VM::M1, "ReconstructionIndex" }, { 0x0022, 0x0001, 0, VR::US, VM::M1, "LightPathFilterPassThroughWavelength" }, { 0x0022, 0x0002, 0, VR::US, VM::M2, "LightPathFilterPassBand" }, { 0x0022, 0x0003, 0, VR::US, VM::M1, "ImagePathFilterPassThroughWavelength" }, { 0x0022, 0x0004, 0, VR::US, VM::M2, "ImagePathFilterPassBand" }, { 0x0022, 0x0005, 0, VR::CS, VM::M1, "PatientEyeMovementCommanded" }, { 0x0022, 0x0006, 0, VR::SQ, VM::M1, "PatientEyeMovementCommandCodeSequence" }, { 0x0022, 0x0007, 0, VR::FL, VM::M1, "SphericalLensPower" }, { 0x0022, 0x0008, 0, VR::FL, VM::M1, "CylinderLensPower" }, { 0x0022, 0x0009, 0, VR::FL, VM::M1, "CylinderAxis" }, { 0x0022, 0x000A, 0, VR::FL, VM::M1, "EmmetropicMagnification" }, { 0x0022, 0x000B, 0, VR::FL, VM::M1, "IntraOcularPressure" }, { 0x0022, 0x000C, 0, VR::FL, VM::M1, "HorizontalFieldOfView" }, { 0x0022, 0x000D, 0, VR::CS, VM::M1, "PupilDilated" }, { 0x0022, 0x000E, 0, VR::FL, VM::M1, "DegreeOfDilation" }, { 0x0022, 0x0010, 0, VR::FL, VM::M1, "StereoBaselineAngle" }, { 0x0022, 0x0011, 0, VR::FL, VM::M1, "StereoBaselineDisplacement" }, { 0x0022, 0x0012, 0, VR::FL, VM::M1, "StereoHorizontalPixelOffset" }, { 0x0022, 0x0013, 0, VR::FL, VM::M1, "StereoVerticalPixelOffset" }, { 0x0022, 0x0014, 0, VR::FL, VM::M1, "StereoRotation" }, { 0x0022, 0x0015, 0, VR::SQ, VM::M1, "AcquisitionDeviceTypeCodeSequence" }, { 0x0022, 0x0016, 0, VR::SQ, VM::M1, "IlluminationTypeCodeSequence" }, { 0x0022, 0x0017, 0, VR::SQ, VM::M1, "LightPathFilterTypeStackCodeSequence" }, { 0x0022, 0x0018, 0, VR::SQ, VM::M1, "ImagePathFilterTypeStackCodeSequence" }, { 0x0022, 0x0019, 0, VR::SQ, VM::M1, "LensesCodeSequence" }, { 0x0022, 0x001A, 0, VR::SQ, VM::M1, "ChannelDescriptionCodeSequence" }, { 0x0022, 0x001B, 0, VR::SQ, VM::M1, "RefractiveStateSequence" }, { 0x0022, 0x001C, 0, VR::SQ, VM::M1, "MydriaticAgentCodeSequence" }, { 0x0022, 0x001D, 0, VR::SQ, VM::M1, "RelativeImagePositionCodeSequence" }, { 0x0022, 0x001E, 0, VR::FL, VM::M1, "CameraAngleOfView" }, { 0x0022, 0x0020, 0, VR::SQ, VM::M1, "StereoPairsSequence" }, { 0x0022, 0x0021, 0, VR::SQ, VM::M1, "LeftImageSequence" }, { 0x0022, 0x0022, 0, VR::SQ, VM::M1, "RightImageSequence" }, { 0x0022, 0x0028, 0, VR::CS, VM::M1, "StereoPairsPresent" }, { 0x0022, 0x0030, 0, VR::FL, VM::M1, "AxialLengthOfTheEye" }, { 0x0022, 0x0031, 0, VR::SQ, VM::M1, "OphthalmicFrameLocationSequence" }, { 0x0022, 0x0032, 0, VR::FL, VM::M2T2N, "ReferenceCoordinates" }, { 0x0022, 0x0035, 0, VR::FL, VM::M1, "DepthSpatialResolution" }, { 0x0022, 0x0036, 0, VR::FL, VM::M1, "MaximumDepthDistortion" }, { 0x0022, 0x0037, 0, VR::FL, VM::M1, "AlongScanSpatialResolution" }, { 0x0022, 0x0038, 0, VR::FL, VM::M1, "MaximumAlongScanDistortion" }, { 0x0022, 0x0039, 0, VR::CS, VM::M1, "OphthalmicImageOrientation" }, { 0x0022, 0x0041, 0, VR::FL, VM::M1, "DepthOfTransverseImage" }, { 0x0022, 0x0042, 0, VR::SQ, VM::M1, "MydriaticAgentConcentrationUnitsSequence" }, { 0x0022, 0x0048, 0, VR::FL, VM::M1, "AcrossScanSpatialResolution" }, { 0x0022, 0x0049, 0, VR::FL, VM::M1, "MaximumAcrossScanDistortion" }, { 0x0022, 0x004E, 0, VR::DS, VM::M1, "MydriaticAgentConcentration" }, { 0x0022, 0x0055, 0, VR::FL, VM::M1, "IlluminationWaveLength" }, { 0x0022, 0x0056, 0, VR::FL, VM::M1, "IlluminationPower" }, { 0x0022, 0x0057, 0, VR::FL, VM::M1, "IlluminationBandwidth" }, { 0x0022, 0x0058, 0, VR::SQ, VM::M1, "MydriaticAgentSequence" }, { 0x0022, 0x1007, 0, VR::SQ, VM::M1, "OphthalmicAxialMeasurementsRightEyeSequence" }, { 0x0022, 0x1008, 0, VR::SQ, VM::M1, "OphthalmicAxialMeasurementsLeftEyeSequence" }, { 0x0022, 0x1009, 0, VR::CS, VM::M1, "OphthalmicAxialMeasurementsDeviceType" }, { 0x0022, 0x1010, 0, VR::CS, VM::M1, "OphthalmicAxialLengthMeasurementsType" }, { 0x0022, 0x1012, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthSequence" }, { 0x0022, 0x1019, 0, VR::FL, VM::M1, "OphthalmicAxialLength" }, { 0x0022, 0x1024, 0, VR::SQ, VM::M1, "LensStatusCodeSequence" }, { 0x0022, 0x1025, 0, VR::SQ, VM::M1, "VitreousStatusCodeSequence" }, { 0x0022, 0x1028, 0, VR::SQ, VM::M1, "IOLFormulaCodeSequence" }, { 0x0022, 0x1029, 0, VR::LO, VM::M1, "IOLFormulaDetail" }, { 0x0022, 0x1033, 0, VR::FL, VM::M1, "KeratometerIndex" }, { 0x0022, 0x1035, 0, VR::SQ, VM::M1, "SourceOfOphthalmicAxialLengthCodeSequence" }, { 0x0022, 0x1036, 0, VR::SQ, VM::M1, "SourceOfCornealSizeDataCodeSequence" }, { 0x0022, 0x1037, 0, VR::FL, VM::M1, "TargetRefraction" }, { 0x0022, 0x1039, 0, VR::CS, VM::M1, "RefractiveProcedureOccurred" }, { 0x0022, 0x1040, 0, VR::SQ, VM::M1, "RefractiveSurgeryTypeCodeSequence" }, { 0x0022, 0x1044, 0, VR::SQ, VM::M1, "OphthalmicUltrasoundMethodCodeSequence" }, { 0x0022, 0x1045, 0, VR::SQ, VM::M1, "SurgicallyInducedAstigmatismSequence" }, { 0x0022, 0x1046, 0, VR::CS, VM::M1, "TypeOfOpticalCorrection" }, { 0x0022, 0x1047, 0, VR::SQ, VM::M1, "ToricIOLPowerSequence" }, { 0x0022, 0x1048, 0, VR::SQ, VM::M1, "PredictedToricErrorSequence" }, { 0x0022, 0x1049, 0, VR::CS, VM::M1, "PreSelectedForImplantation" }, { 0x0022, 0x104A, 0, VR::SQ, VM::M1, "ToricIOLPowerForExactEmmetropiaSequence" }, { 0x0022, 0x104B, 0, VR::SQ, VM::M1, "ToricIOLPowerForExactTargetRefractionSequence" }, { 0x0022, 0x1050, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthMeasurementsSequence" }, { 0x0022, 0x1053, 0, VR::FL, VM::M1, "IOLPower" }, { 0x0022, 0x1054, 0, VR::FL, VM::M1, "PredictedRefractiveError" }, { 0x0022, 0x1059, 0, VR::FL, VM::M1, "OphthalmicAxialLengthVelocity" }, { 0x0022, 0x1065, 0, VR::LO, VM::M1, "LensStatusDescription" }, { 0x0022, 0x1066, 0, VR::LO, VM::M1, "VitreousStatusDescription" }, { 0x0022, 0x1090, 0, VR::SQ, VM::M1, "IOLPowerSequence" }, { 0x0022, 0x1092, 0, VR::SQ, VM::M1, "LensConstantSequence" }, { 0x0022, 0x1093, 0, VR::LO, VM::M1, "IOLManufacturer" }, { 0x0022, 0x1094, 1, VR::LO, VM::M1, "LensConstantDescription" }, { 0x0022, 0x1095, 0, VR::LO, VM::M1, "ImplantName" }, { 0x0022, 0x1096, 0, VR::SQ, VM::M1, "KeratometryMeasurementTypeCodeSequence" }, { 0x0022, 0x1097, 0, VR::LO, VM::M1, "ImplantPartNumber" }, { 0x0022, 0x1100, 0, VR::SQ, VM::M1, "ReferencedOphthalmicAxialMeasurementsSequence" }, { 0x0022, 0x1101, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence" }, { 0x0022, 0x1103, 0, VR::SQ, VM::M1, "RefractiveErrorBeforeRefractiveSurgeryCodeSequence" }, { 0x0022, 0x1121, 0, VR::FL, VM::M1, "IOLPowerForExactEmmetropia" }, { 0x0022, 0x1122, 0, VR::FL, VM::M1, "IOLPowerForExactTargetRefraction" }, { 0x0022, 0x1125, 0, VR::SQ, VM::M1, "AnteriorChamberDepthDefinitionCodeSequence" }, { 0x0022, 0x1127, 0, VR::SQ, VM::M1, "LensThicknessSequence" }, { 0x0022, 0x1128, 0, VR::SQ, VM::M1, "AnteriorChamberDepthSequence" }, { 0x0022, 0x112A, 0, VR::SQ, VM::M1, "CalculationCommentSequence" }, { 0x0022, 0x112B, 0, VR::CS, VM::M1, "CalculationCommentType" }, { 0x0022, 0x112C, 0, VR::LT, VM::M1, "CalculationComment" }, { 0x0022, 0x1130, 0, VR::FL, VM::M1, "LensThickness" }, { 0x0022, 0x1131, 0, VR::FL, VM::M1, "AnteriorChamberDepth" }, { 0x0022, 0x1132, 0, VR::SQ, VM::M1, "SourceOfLensThicknessDataCodeSequence" }, { 0x0022, 0x1133, 0, VR::SQ, VM::M1, "SourceOfAnteriorChamberDepthDataCodeSequence" }, { 0x0022, 0x1134, 0, VR::SQ, VM::M1, "SourceOfRefractiveMeasurementsSequence" }, { 0x0022, 0x1135, 0, VR::SQ, VM::M1, "SourceOfRefractiveMeasurementsCodeSequence" }, { 0x0022, 0x1140, 0, VR::CS, VM::M1, "OphthalmicAxialLengthMeasurementModified" }, { 0x0022, 0x1150, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthDataSourceCodeSequence" }, { 0x0022, 0x1153, 1, VR::SQ, VM::M1, "OphthalmicAxialLengthAcquisitionMethodCodeSequence" }, { 0x0022, 0x1155, 0, VR::FL, VM::M1, "SignalToNoiseRatio" }, { 0x0022, 0x1159, 0, VR::LO, VM::M1, "OphthalmicAxialLengthDataSourceDescription" }, { 0x0022, 0x1210, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthMeasurementsTotalLengthSequence" }, { 0x0022, 0x1211, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence" }, { 0x0022, 0x1212, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthMeasurementsLengthSummationSequence" }, { 0x0022, 0x1220, 0, VR::SQ, VM::M1, "UltrasoundOphthalmicAxialLengthMeasurementsSequence" }, { 0x0022, 0x1225, 0, VR::SQ, VM::M1, "OpticalOphthalmicAxialLengthMeasurementsSequence" }, { 0x0022, 0x1230, 0, VR::SQ, VM::M1, "UltrasoundSelectedOphthalmicAxialLengthSequence" }, { 0x0022, 0x1250, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthSelectionMethodCodeSequence" }, { 0x0022, 0x1255, 0, VR::SQ, VM::M1, "OpticalSelectedOphthalmicAxialLengthSequence" }, { 0x0022, 0x1257, 0, VR::SQ, VM::M1, "SelectedSegmentalOphthalmicAxialLengthSequence" }, { 0x0022, 0x1260, 0, VR::SQ, VM::M1, "SelectedTotalOphthalmicAxialLengthSequence" }, { 0x0022, 0x1262, 0, VR::SQ, VM::M1, "OphthalmicAxialLengthQualityMetricSequence" }, { 0x0022, 0x1265, 1, VR::SQ, VM::M1, "OphthalmicAxialLengthQualityMetricTypeCodeSequence" }, { 0x0022, 0x1273, 1, VR::LO, VM::M1, "OphthalmicAxialLengthQualityMetricTypeDescription" }, { 0x0022, 0x1300, 0, VR::SQ, VM::M1, "IntraocularLensCalculationsRightEyeSequence" }, { 0x0022, 0x1310, 0, VR::SQ, VM::M1, "IntraocularLensCalculationsLeftEyeSequence" }, { 0x0022, 0x1330, 0, VR::SQ, VM::M1, "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence" }, { 0x0022, 0x1415, 0, VR::CS, VM::M1, "OphthalmicMappingDeviceType" }, { 0x0022, 0x1420, 0, VR::SQ, VM::M1, "AcquisitionMethodCodeSequence" }, { 0x0022, 0x1423, 0, VR::SQ, VM::M1, "AcquisitionMethodAlgorithmSequence" }, { 0x0022, 0x1436, 0, VR::SQ, VM::M1, "OphthalmicThicknessMapTypeCodeSequence" }, { 0x0022, 0x1443, 0, VR::SQ, VM::M1, "OphthalmicThicknessMappingNormalsSequence" }, { 0x0022, 0x1445, 0, VR::SQ, VM::M1, "RetinalThicknessDefinitionCodeSequence" }, { 0x0022, 0x1450, 0, VR::SQ, VM::M1, "PixelValueMappingToCodedConceptSequence" }, { 0x0022, 0x1452, 0, VR::XS, VM::M1, "MappedPixelValue" }, { 0x0022, 0x1454, 0, VR::LO, VM::M1, "PixelValueMappingExplanation" }, { 0x0022, 0x1458, 0, VR::SQ, VM::M1, "OphthalmicThicknessMapQualityThresholdSequence" }, { 0x0022, 0x1460, 0, VR::FL, VM::M1, "OphthalmicThicknessMapThresholdQualityRating" }, { 0x0022, 0x1463, 0, VR::FL, VM::M2, "AnatomicStructureReferencePoint" }, { 0x0022, 0x1465, 0, VR::SQ, VM::M1, "RegistrationToLocalizerSequence" }, { 0x0022, 0x1466, 0, VR::CS, VM::M1, "RegisteredLocalizerUnits" }, { 0x0022, 0x1467, 0, VR::FL, VM::M2, "RegisteredLocalizerTopLeftHandCorner" }, { 0x0022, 0x1468, 0, VR::FL, VM::M2, "RegisteredLocalizerBottomRightHandCorner" }, { 0x0022, 0x1470, 0, VR::SQ, VM::M1, "OphthalmicThicknessMapQualityRatingSequence" }, { 0x0022, 0x1472, 0, VR::SQ, VM::M1, "RelevantOPTAttributesSequence" }, { 0x0022, 0x1512, 0, VR::SQ, VM::M1, "TransformationMethodCodeSequence" }, { 0x0022, 0x1513, 0, VR::SQ, VM::M1, "TransformationAlgorithmSequence" }, { 0x0022, 0x1515, 0, VR::CS, VM::M1, "OphthalmicAxialLengthMethod" }, { 0x0022, 0x1517, 0, VR::FL, VM::M1, "OphthalmicFOV" }, { 0x0022, 0x1518, 0, VR::SQ, VM::M1, "TwoDimensionalToThreeDimensionalMapSequence" }, { 0x0022, 0x1525, 0, VR::SQ, VM::M1, "WideFieldOphthalmicPhotographyQualityRatingSequence" }, { 0x0022, 0x1526, 0, VR::SQ, VM::M1, "WideFieldOphthalmicPhotographyQualityThresholdSequence" }, { 0x0022, 0x1527, 0, VR::FL, VM::M1, "WideFieldOphthalmicPhotographyThresholdQualityRating" }, { 0x0022, 0x1528, 0, VR::FL, VM::M1, "XCoordinatesCenterPixelViewAngle" }, { 0x0022, 0x1529, 0, VR::FL, VM::M1, "YCoordinatesCenterPixelViewAngle" }, { 0x0022, 0x1530, 0, VR::UL, VM::M1, "NumberOfMapPoints" }, { 0x0022, 0x1531, 0, VR::OF, VM::M1, "TwoDimensionalToThreeDimensionalMapData" }, { 0x0022, 0x1612, 0, VR::SQ, VM::M1, "DerivationAlgorithmSequence" }, { 0x0022, 0x1615, 0, VR::SQ, VM::M1, "OphthalmicImageTypeCodeSequence" }, { 0x0022, 0x1616, 0, VR::LO, VM::M1, "OphthalmicImageTypeDescription" }, { 0x0022, 0x1618, 0, VR::SQ, VM::M1, "ScanPatternTypeCodeSequence" }, { 0x0022, 0x1620, 0, VR::SQ, VM::M1, "ReferencedSurfaceMeshIdentificationSequence" }, { 0x0022, 0x1622, 0, VR::CS, VM::M1, "OphthalmicVolumetricPropertiesFlag" }, { 0x0022, 0x1624, 0, VR::FL, VM::M1, "OphthalmicAnatomicReferencePointXCoordinate" }, { 0x0022, 0x1626, 0, VR::FL, VM::M1, "OphthalmicAnatomicReferencePointYCoordinate" }, { 0x0022, 0x1628, 0, VR::SQ, VM::M1, "OphthalmicEnFaceImageQualityRatingSequence" }, { 0x0022, 0x1630, 0, VR::DS, VM::M1, "QualityThreshold" }, { 0x0022, 0x1640, 0, VR::SQ, VM::M1, "OCTBscanAnalysisAcquisitionParametersSequence" }, { 0x0022, 0x1642, 0, VR::UL, VM::M1, "NumberofBscansPerFrame" }, { 0x0022, 0x1643, 0, VR::FL, VM::M1, "BscanSlabThickness" }, { 0x0022, 0x1644, 0, VR::FL, VM::M1, "DistanceBetweenBscanSlabs" }, { 0x0022, 0x1645, 0, VR::FL, VM::M1, "BscanCycleTime" }, { 0x0022, 0x1646, 0, VR::FL, VM::M1TN, "BscanCycleTimeVector" }, { 0x0022, 0x1649, 0, VR::FL, VM::M1, "AscanRate" }, { 0x0022, 0x1650, 0, VR::FL, VM::M1, "BscanRate" }, { 0x0022, 0x1658, 0, VR::UL, VM::M1, "SurfaceMeshZPixelOffset" }, { 0x0024, 0x0010, 0, VR::FL, VM::M1, "VisualFieldHorizontalExtent" }, { 0x0024, 0x0011, 0, VR::FL, VM::M1, "VisualFieldVerticalExtent" }, { 0x0024, 0x0012, 0, VR::CS, VM::M1, "VisualFieldShape" }, { 0x0024, 0x0016, 0, VR::SQ, VM::M1, "ScreeningTestModeCodeSequence" }, { 0x0024, 0x0018, 0, VR::FL, VM::M1, "MaximumStimulusLuminance" }, { 0x0024, 0x0020, 0, VR::FL, VM::M1, "BackgroundLuminance" }, { 0x0024, 0x0021, 0, VR::SQ, VM::M1, "StimulusColorCodeSequence" }, { 0x0024, 0x0024, 0, VR::SQ, VM::M1, "BackgroundIlluminationColorCodeSequence" }, { 0x0024, 0x0025, 0, VR::FL, VM::M1, "StimulusArea" }, { 0x0024, 0x0028, 0, VR::FL, VM::M1, "StimulusPresentationTime" }, { 0x0024, 0x0032, 0, VR::SQ, VM::M1, "FixationSequence" }, { 0x0024, 0x0033, 0, VR::SQ, VM::M1, "FixationMonitoringCodeSequence" }, { 0x0024, 0x0034, 0, VR::SQ, VM::M1, "VisualFieldCatchTrialSequence" }, { 0x0024, 0x0035, 0, VR::US, VM::M1, "FixationCheckedQuantity" }, { 0x0024, 0x0036, 0, VR::US, VM::M1, "PatientNotProperlyFixatedQuantity" }, { 0x0024, 0x0037, 0, VR::CS, VM::M1, "PresentedVisualStimuliDataFlag" }, { 0x0024, 0x0038, 0, VR::US, VM::M1, "NumberOfVisualStimuli" }, { 0x0024, 0x0039, 0, VR::CS, VM::M1, "ExcessiveFixationLossesDataFlag" }, { 0x0024, 0x0040, 0, VR::CS, VM::M1, "ExcessiveFixationLosses" }, { 0x0024, 0x0042, 0, VR::US, VM::M1, "StimuliRetestingQuantity" }, { 0x0024, 0x0044, 0, VR::LT, VM::M1, "CommentsOnPatientPerformanceOfVisualField" }, { 0x0024, 0x0045, 0, VR::CS, VM::M1, "FalseNegativesEstimateFlag" }, { 0x0024, 0x0046, 0, VR::FL, VM::M1, "FalseNegativesEstimate" }, { 0x0024, 0x0048, 0, VR::US, VM::M1, "NegativeCatchTrialsQuantity" }, { 0x0024, 0x0050, 0, VR::US, VM::M1, "FalseNegativesQuantity" }, { 0x0024, 0x0051, 0, VR::CS, VM::M1, "ExcessiveFalseNegativesDataFlag" }, { 0x0024, 0x0052, 0, VR::CS, VM::M1, "ExcessiveFalseNegatives" }, { 0x0024, 0x0053, 0, VR::CS, VM::M1, "FalsePositivesEstimateFlag" }, { 0x0024, 0x0054, 0, VR::FL, VM::M1, "FalsePositivesEstimate" }, { 0x0024, 0x0055, 0, VR::CS, VM::M1, "CatchTrialsDataFlag" }, { 0x0024, 0x0056, 0, VR::US, VM::M1, "PositiveCatchTrialsQuantity" }, { 0x0024, 0x0057, 0, VR::CS, VM::M1, "TestPointNormalsDataFlag" }, { 0x0024, 0x0058, 0, VR::SQ, VM::M1, "TestPointNormalsSequence" }, { 0x0024, 0x0059, 0, VR::CS, VM::M1, "GlobalDeviationProbabilityNormalsFlag" }, { 0x0024, 0x0060, 0, VR::US, VM::M1, "FalsePositivesQuantity" }, { 0x0024, 0x0061, 0, VR::CS, VM::M1, "ExcessiveFalsePositivesDataFlag" }, { 0x0024, 0x0062, 0, VR::CS, VM::M1, "ExcessiveFalsePositives" }, { 0x0024, 0x0063, 0, VR::CS, VM::M1, "VisualFieldTestNormalsFlag" }, { 0x0024, 0x0064, 0, VR::SQ, VM::M1, "ResultsNormalsSequence" }, { 0x0024, 0x0065, 0, VR::SQ, VM::M1, "AgeCorrectedSensitivityDeviationAlgorithmSequence" }, { 0x0024, 0x0066, 0, VR::FL, VM::M1, "GlobalDeviationFromNormal" }, { 0x0024, 0x0067, 0, VR::SQ, VM::M1, "GeneralizedDefectSensitivityDeviationAlgorithmSequence" }, { 0x0024, 0x0068, 0, VR::FL, VM::M1, "LocalizedDeviationFromNormal" }, { 0x0024, 0x0069, 0, VR::LO, VM::M1, "PatientReliabilityIndicator" }, { 0x0024, 0x0070, 0, VR::FL, VM::M1, "VisualFieldMeanSensitivity" }, { 0x0024, 0x0071, 0, VR::FL, VM::M1, "GlobalDeviationProbability" }, { 0x0024, 0x0072, 0, VR::CS, VM::M1, "LocalDeviationProbabilityNormalsFlag" }, { 0x0024, 0x0073, 0, VR::FL, VM::M1, "LocalizedDeviationProbability" }, { 0x0024, 0x0074, 0, VR::CS, VM::M1, "ShortTermFluctuationCalculated" }, { 0x0024, 0x0075, 0, VR::FL, VM::M1, "ShortTermFluctuation" }, { 0x0024, 0x0076, 0, VR::CS, VM::M1, "ShortTermFluctuationProbabilityCalculated" }, { 0x0024, 0x0077, 0, VR::FL, VM::M1, "ShortTermFluctuationProbability" }, { 0x0024, 0x0078, 0, VR::CS, VM::M1, "CorrectedLocalizedDeviationFromNormalCalculated" }, { 0x0024, 0x0079, 0, VR::FL, VM::M1, "CorrectedLocalizedDeviationFromNormal" }, { 0x0024, 0x0080, 0, VR::CS, VM::M1, "CorrectedLocalizedDeviationFromNormalProbabilityCalculated" }, { 0x0024, 0x0081, 0, VR::FL, VM::M1, "CorrectedLocalizedDeviationFromNormalProbability" }, { 0x0024, 0x0083, 0, VR::SQ, VM::M1, "GlobalDeviationProbabilitySequence" }, { 0x0024, 0x0085, 0, VR::SQ, VM::M1, "LocalizedDeviationProbabilitySequence" }, { 0x0024, 0x0086, 0, VR::CS, VM::M1, "FovealSensitivityMeasured" }, { 0x0024, 0x0087, 0, VR::FL, VM::M1, "FovealSensitivity" }, { 0x0024, 0x0088, 0, VR::FL, VM::M1, "VisualFieldTestDuration" }, { 0x0024, 0x0089, 0, VR::SQ, VM::M1, "VisualFieldTestPointSequence" }, { 0x0024, 0x0090, 0, VR::FL, VM::M1, "VisualFieldTestPointXCoordinate" }, { 0x0024, 0x0091, 0, VR::FL, VM::M1, "VisualFieldTestPointYCoordinate" }, { 0x0024, 0x0092, 0, VR::FL, VM::M1, "AgeCorrectedSensitivityDeviationValue" }, { 0x0024, 0x0093, 0, VR::CS, VM::M1, "StimulusResults" }, { 0x0024, 0x0094, 0, VR::FL, VM::M1, "SensitivityValue" }, { 0x0024, 0x0095, 0, VR::CS, VM::M1, "RetestStimulusSeen" }, { 0x0024, 0x0096, 0, VR::FL, VM::M1, "RetestSensitivityValue" }, { 0x0024, 0x0097, 0, VR::SQ, VM::M1, "VisualFieldTestPointNormalsSequence" }, { 0x0024, 0x0098, 0, VR::FL, VM::M1, "QuantifiedDefect" }, { 0x0024, 0x0100, 0, VR::FL, VM::M1, "AgeCorrectedSensitivityDeviationProbabilityValue" }, { 0x0024, 0x0102, 0, VR::CS, VM::M1, "GeneralizedDefectCorrectedSensitivityDeviationFlag" }, { 0x0024, 0x0103, 0, VR::FL, VM::M1, "GeneralizedDefectCorrectedSensitivityDeviationValue" }, { 0x0024, 0x0104, 0, VR::FL, VM::M1, "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue" }, { 0x0024, 0x0105, 0, VR::FL, VM::M1, "MinimumSensitivityValue" }, { 0x0024, 0x0106, 0, VR::CS, VM::M1, "BlindSpotLocalized" }, { 0x0024, 0x0107, 0, VR::FL, VM::M1, "BlindSpotXCoordinate" }, { 0x0024, 0x0108, 0, VR::FL, VM::M1, "BlindSpotYCoordinate" }, { 0x0024, 0x0110, 0, VR::SQ, VM::M1, "VisualAcuityMeasurementSequence" }, { 0x0024, 0x0112, 0, VR::SQ, VM::M1, "RefractiveParametersUsedOnPatientSequence" }, { 0x0024, 0x0113, 0, VR::CS, VM::M1, "MeasurementLaterality" }, { 0x0024, 0x0114, 0, VR::SQ, VM::M1, "OphthalmicPatientClinicalInformationLeftEyeSequence" }, { 0x0024, 0x0115, 0, VR::SQ, VM::M1, "OphthalmicPatientClinicalInformationRightEyeSequence" }, { 0x0024, 0x0117, 0, VR::CS, VM::M1, "FovealPointNormativeDataFlag" }, { 0x0024, 0x0118, 0, VR::FL, VM::M1, "FovealPointProbabilityValue" }, { 0x0024, 0x0120, 0, VR::CS, VM::M1, "ScreeningBaselineMeasured" }, { 0x0024, 0x0122, 0, VR::SQ, VM::M1, "ScreeningBaselineMeasuredSequence" }, { 0x0024, 0x0124, 0, VR::CS, VM::M1, "ScreeningBaselineType" }, { 0x0024, 0x0126, 0, VR::FL, VM::M1, "ScreeningBaselineValue" }, { 0x0024, 0x0202, 0, VR::LO, VM::M1, "AlgorithmSource" }, { 0x0024, 0x0306, 0, VR::LO, VM::M1, "DataSetName" }, { 0x0024, 0x0307, 0, VR::LO, VM::M1, "DataSetVersion" }, { 0x0024, 0x0308, 0, VR::LO, VM::M1, "DataSetSource" }, { 0x0024, 0x0309, 0, VR::LO, VM::M1, "DataSetDescription" }, { 0x0024, 0x0317, 0, VR::SQ, VM::M1, "VisualFieldTestReliabilityGlobalIndexSequence" }, { 0x0024, 0x0320, 0, VR::SQ, VM::M1, "VisualFieldGlobalResultsIndexSequence" }, { 0x0024, 0x0325, 0, VR::SQ, VM::M1, "DataObservationSequence" }, { 0x0024, 0x0338, 0, VR::CS, VM::M1, "IndexNormalsFlag" }, { 0x0024, 0x0341, 0, VR::FL, VM::M1, "IndexProbability" }, { 0x0024, 0x0344, 0, VR::SQ, VM::M1, "IndexProbabilitySequence" }, { 0x0028, 0x0002, 0, VR::US, VM::M1, "SamplesPerPixel" }, { 0x0028, 0x0003, 0, VR::US, VM::M1, "SamplesPerPixelUsed" }, { 0x0028, 0x0004, 0, VR::CS, VM::M1, "PhotometricInterpretation" }, { 0x0028, 0x0005, 1, VR::US, VM::M1, "ImageDimensions" }, { 0x0028, 0x0006, 0, VR::US, VM::M1, "PlanarConfiguration" }, { 0x0028, 0x0008, 0, VR::IS, VM::M1, "NumberOfFrames" }, { 0x0028, 0x0009, 0, VR::AT, VM::M1TN, "FrameIncrementPointer" }, { 0x0028, 0x000A, 0, VR::AT, VM::M1TN, "FrameDimensionPointer" }, { 0x0028, 0x0010, 0, VR::US, VM::M1, "Rows" }, { 0x0028, 0x0011, 0, VR::US, VM::M1, "Columns" }, { 0x0028, 0x0012, 1, VR::US, VM::M1, "Planes" }, { 0x0028, 0x0014, 0, VR::US, VM::M1, "UltrasoundColorDataPresent" }, { 0x0028, 0x0030, 0, VR::DS, VM::M2, "PixelSpacing" }, { 0x0028, 0x0031, 0, VR::DS, VM::M2, "ZoomFactor" }, { 0x0028, 0x0032, 0, VR::DS, VM::M2, "ZoomCenter" }, { 0x0028, 0x0034, 0, VR::IS, VM::M2, "PixelAspectRatio" }, { 0x0028, 0x0040, 1, VR::CS, VM::M1, "ImageFormat" }, { 0x0028, 0x0050, 1, VR::LO, VM::M1TN, "ManipulatedImage" }, { 0x0028, 0x0051, 0, VR::CS, VM::M1TN, "CorrectedImage" }, { 0x0028, 0x005F, 1, VR::LO, VM::M1, "CompressionRecognitionCode" }, { 0x0028, 0x0060, 1, VR::CS, VM::M1, "CompressionCode" }, { 0x0028, 0x0061, 1, VR::SH, VM::M1, "CompressionOriginator" }, { 0x0028, 0x0062, 1, VR::LO, VM::M1, "CompressionLabel" }, { 0x0028, 0x0063, 1, VR::SH, VM::M1, "CompressionDescription" }, { 0x0028, 0x0065, 1, VR::CS, VM::M1TN, "CompressionSequence" }, { 0x0028, 0x0066, 1, VR::AT, VM::M1TN, "CompressionStepPointers" }, { 0x0028, 0x0068, 1, VR::US, VM::M1, "RepeatInterval" }, { 0x0028, 0x0069, 1, VR::US, VM::M1, "BitsGrouped" }, { 0x0028, 0x0070, 1, VR::US, VM::M1TN, "PerimeterTable" }, { 0x0028, 0x0071, 1, VR::XS, VM::M1, "PerimeterValue" }, { 0x0028, 0x0080, 1, VR::US, VM::M1, "PredictorRows" }, { 0x0028, 0x0081, 1, VR::US, VM::M1, "PredictorColumns" }, { 0x0028, 0x0082, 1, VR::US, VM::M1TN, "PredictorConstants" }, { 0x0028, 0x0090, 1, VR::CS, VM::M1, "BlockedPixels" }, { 0x0028, 0x0091, 1, VR::US, VM::M1, "BlockRows" }, { 0x0028, 0x0092, 1, VR::US, VM::M1, "BlockColumns" }, { 0x0028, 0x0093, 1, VR::US, VM::M1, "RowOverlap" }, { 0x0028, 0x0094, 1, VR::US, VM::M1, "ColumnOverlap" }, { 0x0028, 0x0100, 0, VR::US, VM::M1, "BitsAllocated" }, { 0x0028, 0x0101, 0, VR::US, VM::M1, "BitsStored" }, { 0x0028, 0x0102, 0, VR::US, VM::M1, "HighBit" }, { 0x0028, 0x0103, 0, VR::US, VM::M1, "PixelRepresentation" }, { 0x0028, 0x0104, 1, VR::XS, VM::M1, "SmallestValidPixelValue" }, { 0x0028, 0x0105, 1, VR::XS, VM::M1, "LargestValidPixelValue" }, { 0x0028, 0x0106, 0, VR::XS, VM::M1, "SmallestImagePixelValue" }, { 0x0028, 0x0107, 0, VR::XS, VM::M1, "LargestImagePixelValue" }, { 0x0028, 0x0108, 0, VR::XS, VM::M1, "SmallestPixelValueInSeries" }, { 0x0028, 0x0109, 0, VR::XS, VM::M1, "LargestPixelValueInSeries" }, { 0x0028, 0x0110, 1, VR::XS, VM::M1, "SmallestImagePixelValueInPlane" }, { 0x0028, 0x0111, 1, VR::XS, VM::M1, "LargestImagePixelValueInPlane" }, { 0x0028, 0x0120, 0, VR::XS, VM::M1, "PixelPaddingValue" }, { 0x0028, 0x0121, 0, VR::XS, VM::M1, "PixelPaddingRangeLimit" }, { 0x0028, 0x0122, 0, VR::FL, VM::M1, "FloatPixelPaddingValue" }, { 0x0028, 0x0123, 0, VR::FD, VM::M1, "DoubleFloatPixelPaddingValue" }, { 0x0028, 0x0124, 0, VR::FL, VM::M1, "FloatPixelPaddingRangeLimit" }, { 0x0028, 0x0125, 0, VR::FD, VM::M1, "DoubleFloatPixelPaddingRangeLimit" }, { 0x0028, 0x0200, 1, VR::US, VM::M1, "ImageLocation" }, { 0x0028, 0x0300, 0, VR::CS, VM::M1, "QualityControlImage" }, { 0x0028, 0x0301, 0, VR::CS, VM::M1, "BurnedInAnnotation" }, { 0x0028, 0x0302, 0, VR::CS, VM::M1, "RecognizableVisualFeatures" }, { 0x0028, 0x0303, 0, VR::CS, VM::M1, "LongitudinalTemporalInformationModified" }, { 0x0028, 0x0304, 0, VR::UI, VM::M1, "ReferencedColorPaletteInstanceUID" }, { 0x0028, 0x0400, 1, VR::LO, VM::M1, "TransformLabel" }, { 0x0028, 0x0401, 1, VR::LO, VM::M1, "TransformVersionNumber" }, { 0x0028, 0x0402, 1, VR::US, VM::M1, "NumberOfTransformSteps" }, { 0x0028, 0x0403, 1, VR::LO, VM::M1TN, "SequenceOfCompressedData" }, { 0x0028, 0x0404, 1, VR::AT, VM::M1TN, "DetailsOfCoefficients" }, { 0x0028, 0x0410, 1, VR::US, VM::M1, "RowsForNthOrderCoefficients" }, { 0x0028, 0x0411, 1, VR::US, VM::M1, "ColumnsForNthOrderCoefficients" }, { 0x0028, 0x0412, 1, VR::LO, VM::M1TN, "CoefficientCoding" }, { 0x0028, 0x0413, 1, VR::AT, VM::M1TN, "CoefficientCodingPointers" }, { 0x0028, 0x0700, 1, VR::LO, VM::M1, "DCTLabel" }, { 0x0028, 0x0701, 1, VR::CS, VM::M1TN, "DataBlockDescription" }, { 0x0028, 0x0702, 1, VR::AT, VM::M1TN, "DataBlock" }, { 0x0028, 0x0710, 1, VR::US, VM::M1, "NormalizationFactorFormat" }, { 0x0028, 0x0720, 1, VR::US, VM::M1, "ZonalMapNumberFormat" }, { 0x0028, 0x0721, 1, VR::AT, VM::M1TN, "ZonalMapLocation" }, { 0x0028, 0x0722, 1, VR::US, VM::M1, "ZonalMapFormat" }, { 0x0028, 0x0730, 1, VR::US, VM::M1, "AdaptiveMapFormat" }, { 0x0028, 0x0740, 1, VR::US, VM::M1, "CodeNumberFormat" }, { 0x0028, 0x0810, 1, VR::CS, VM::M1TN, "CodeLabel" }, { 0x0028, 0x0812, 1, VR::US, VM::M1, "NumberOfTables" }, { 0x0028, 0x0813, 1, VR::AT, VM::M1TN, "CodeTableLocation" }, { 0x0028, 0x0814, 1, VR::US, VM::M1, "BitsForCodeWord" }, { 0x0028, 0x0818, 1, VR::AT, VM::M1TN, "ImageDataLocation" }, { 0x0028, 0x0A02, 0, VR::CS, VM::M1, "PixelSpacingCalibrationType" }, { 0x0028, 0x0A04, 0, VR::LO, VM::M1, "PixelSpacingCalibrationDescription" }, { 0x0028, 0x1040, 0, VR::CS, VM::M1, "PixelIntensityRelationship" }, { 0x0028, 0x1041, 0, VR::SS, VM::M1, "PixelIntensityRelationshipSign" }, { 0x0028, 0x1050, 0, VR::DS, VM::M1TN, "WindowCenter" }, { 0x0028, 0x1051, 0, VR::DS, VM::M1TN, "WindowWidth" }, { 0x0028, 0x1052, 0, VR::DS, VM::M1, "RescaleIntercept" }, { 0x0028, 0x1053, 0, VR::DS, VM::M1, "RescaleSlope" }, { 0x0028, 0x1054, 0, VR::LO, VM::M1, "RescaleType" }, { 0x0028, 0x1055, 0, VR::LO, VM::M1TN, "WindowCenterWidthExplanation" }, { 0x0028, 0x1056, 0, VR::CS, VM::M1, "VOILUTFunction" }, { 0x0028, 0x1080, 1, VR::CS, VM::M1, "GrayScale" }, { 0x0028, 0x1090, 0, VR::CS, VM::M1, "RecommendedViewingMode" }, { 0x0028, 0x1100, 1, VR::XS, VM::M3, "GrayLookupTableDescriptor" }, { 0x0028, 0x1101, 0, VR::XS, VM::M3, "RedPaletteColorLookupTableDescriptor" }, { 0x0028, 0x1102, 0, VR::XS, VM::M3, "GreenPaletteColorLookupTableDescriptor" }, { 0x0028, 0x1103, 0, VR::XS, VM::M3, "BluePaletteColorLookupTableDescriptor" }, { 0x0028, 0x1104, 0, VR::US, VM::M3, "AlphaPaletteColorLookupTableDescriptor" }, { 0x0028, 0x1111, 1, VR::XS, VM::M4, "LargeRedPaletteColorLookupTableDescriptor" }, { 0x0028, 0x1112, 1, VR::XS, VM::M4, "LargeGreenPaletteColorLookupTableDescriptor" }, { 0x0028, 0x1113, 1, VR::XS, VM::M4, "LargeBluePaletteColorLookupTableDescriptor" }, { 0x0028, 0x1199, 0, VR::UI, VM::M1, "PaletteColorLookupTableUID" }, { 0x0028, 0x1200, 1, VR::OW, VM::M1, "GrayLookupTableData" }, { 0x0028, 0x1201, 0, VR::OW, VM::M1, "RedPaletteColorLookupTableData" }, { 0x0028, 0x1202, 0, VR::OW, VM::M1, "GreenPaletteColorLookupTableData" }, { 0x0028, 0x1203, 0, VR::OW, VM::M1, "BluePaletteColorLookupTableData" }, { 0x0028, 0x1204, 0, VR::OW, VM::M1, "AlphaPaletteColorLookupTableData" }, { 0x0028, 0x1211, 1, VR::OW, VM::M1, "LargeRedPaletteColorLookupTableData" }, { 0x0028, 0x1212, 1, VR::OW, VM::M1, "LargeGreenPaletteColorLookupTableData" }, { 0x0028, 0x1213, 1, VR::OW, VM::M1, "LargeBluePaletteColorLookupTableData" }, { 0x0028, 0x1214, 1, VR::UI, VM::M1, "LargePaletteColorLookupTableUID" }, { 0x0028, 0x1221, 0, VR::OW, VM::M1, "SegmentedRedPaletteColorLookupTableData" }, { 0x0028, 0x1222, 0, VR::OW, VM::M1, "SegmentedGreenPaletteColorLookupTableData" }, { 0x0028, 0x1223, 0, VR::OW, VM::M1, "SegmentedBluePaletteColorLookupTableData" }, { 0x0028, 0x1224, 0, VR::OW, VM::M1, "SegmentedAlphaPaletteColorLookupTableData" }, { 0x0028, 0x1230, 0, VR::SQ, VM::M1, "StoredValueColorRangeSequence" }, { 0x0028, 0x1231, 0, VR::FD, VM::M1, "MinimumStoredValueMapped" }, { 0x0028, 0x1232, 0, VR::FD, VM::M1, "MaximumStoredValueMapped" }, { 0x0028, 0x1300, 0, VR::CS, VM::M1, "BreastImplantPresent" }, { 0x0028, 0x1350, 0, VR::CS, VM::M1, "PartialView" }, { 0x0028, 0x1351, 0, VR::ST, VM::M1, "PartialViewDescription" }, { 0x0028, 0x1352, 0, VR::SQ, VM::M1, "PartialViewCodeSequence" }, { 0x0028, 0x135A, 0, VR::CS, VM::M1, "SpatialLocationsPreserved" }, { 0x0028, 0x1401, 0, VR::SQ, VM::M1, "DataFrameAssignmentSequence" }, { 0x0028, 0x1402, 0, VR::CS, VM::M1, "DataPathAssignment" }, { 0x0028, 0x1403, 0, VR::US, VM::M1, "BitsMappedToColorLookupTable" }, { 0x0028, 0x1404, 0, VR::SQ, VM::M1, "BlendingLUT1Sequence" }, { 0x0028, 0x1405, 0, VR::CS, VM::M1, "BlendingLUT1TransferFunction" }, { 0x0028, 0x1406, 0, VR::FD, VM::M1, "BlendingWeightConstant" }, { 0x0028, 0x1407, 0, VR::US, VM::M3, "BlendingLookupTableDescriptor" }, { 0x0028, 0x1408, 0, VR::OW, VM::M1, "BlendingLookupTableData" }, { 0x0028, 0x140B, 0, VR::SQ, VM::M1, "EnhancedPaletteColorLookupTableSequence" }, { 0x0028, 0x140C, 0, VR::SQ, VM::M1, "BlendingLUT2Sequence" }, { 0x0028, 0x140D, 0, VR::CS, VM::M1, "BlendingLUT2TransferFunction" }, { 0x0028, 0x140E, 0, VR::CS, VM::M1, "DataPathID" }, { 0x0028, 0x140F, 0, VR::CS, VM::M1, "RGBLUTTransferFunction" }, { 0x0028, 0x1410, 0, VR::CS, VM::M1, "AlphaLUTTransferFunction" }, { 0x0028, 0x2000, 0, VR::OB, VM::M1, "ICCProfile" }, { 0x0028, 0x2002, 0, VR::CS, VM::M1, "ColorSpace" }, { 0x0028, 0x2110, 0, VR::CS, VM::M1, "LossyImageCompression" }, { 0x0028, 0x2112, 0, VR::DS, VM::M1TN, "LossyImageCompressionRatio" }, { 0x0028, 0x2114, 0, VR::CS, VM::M1TN, "LossyImageCompressionMethod" }, { 0x0028, 0x3000, 0, VR::SQ, VM::M1, "ModalityLUTSequence" }, { 0x0028, 0x3002, 0, VR::XS, VM::M3, "LUTDescriptor" }, { 0x0028, 0x3003, 0, VR::LO, VM::M1, "LUTExplanation" }, { 0x0028, 0x3004, 0, VR::LO, VM::M1, "ModalityLUTType" }, { 0x0028, 0x3006, 0, VR::OW, VM::M1, "LUTData" }, { 0x0028, 0x3010, 0, VR::SQ, VM::M1, "VOILUTSequence" }, { 0x0028, 0x3110, 0, VR::SQ, VM::M1, "SoftcopyVOILUTSequence" }, { 0x0028, 0x4000, 1, VR::LT, VM::M1, "ImagePresentationComments" }, { 0x0028, 0x5000, 1, VR::SQ, VM::M1, "BiPlaneAcquisitionSequence" }, { 0x0028, 0x6010, 0, VR::US, VM::M1, "RepresentativeFrameNumber" }, { 0x0028, 0x6020, 0, VR::US, VM::M1TN, "FrameNumbersOfInterest" }, { 0x0028, 0x6022, 0, VR::LO, VM::M1TN, "FrameOfInterestDescription" }, { 0x0028, 0x6023, 0, VR::CS, VM::M1TN, "FrameOfInterestType" }, { 0x0028, 0x6030, 1, VR::US, VM::M1TN, "MaskPointers" }, { 0x0028, 0x6040, 0, VR::US, VM::M1TN, "RWavePointer" }, { 0x0028, 0x6100, 0, VR::SQ, VM::M1, "MaskSubtractionSequence" }, { 0x0028, 0x6101, 0, VR::CS, VM::M1, "MaskOperation" }, { 0x0028, 0x6102, 0, VR::US, VM::M2T2N, "ApplicableFrameRange" }, { 0x0028, 0x6110, 0, VR::US, VM::M1TN, "MaskFrameNumbers" }, { 0x0028, 0x6112, 0, VR::US, VM::M1, "ContrastFrameAveraging" }, { 0x0028, 0x6114, 0, VR::FL, VM::M2, "MaskSubPixelShift" }, { 0x0028, 0x6120, 0, VR::SS, VM::M1, "TIDOffset" }, { 0x0028, 0x6190, 0, VR::ST, VM::M1, "MaskOperationExplanation" }, { 0x0028, 0x7000, 0, VR::SQ, VM::M1, "EquipmentAdministratorSequence" }, { 0x0028, 0x7001, 0, VR::US, VM::M1, "NumberOfDisplaySubsystems" }, { 0x0028, 0x7002, 0, VR::US, VM::M1, "CurrentConfigurationID" }, { 0x0028, 0x7003, 0, VR::US, VM::M1, "DisplaySubsystemID" }, { 0x0028, 0x7004, 0, VR::SH, VM::M1, "DisplaySubsystemName" }, { 0x0028, 0x7005, 0, VR::LO, VM::M1, "DisplaySubsystemDescription" }, { 0x0028, 0x7006, 0, VR::CS, VM::M1, "SystemStatus" }, { 0x0028, 0x7007, 0, VR::LO, VM::M1, "SystemStatusComment" }, { 0x0028, 0x7008, 0, VR::SQ, VM::M1, "TargetLuminanceCharacteristicsSequence" }, { 0x0028, 0x7009, 0, VR::US, VM::M1, "LuminanceCharacteristicsID" }, { 0x0028, 0x700A, 0, VR::SQ, VM::M1, "DisplaySubsystemConfigurationSequence" }, { 0x0028, 0x700B, 0, VR::US, VM::M1, "ConfigurationID" }, { 0x0028, 0x700C, 0, VR::SH, VM::M1, "ConfigurationName" }, { 0x0028, 0x700D, 0, VR::LO, VM::M1, "ConfigurationDescription" }, { 0x0028, 0x700E, 0, VR::US, VM::M1, "ReferencedTargetLuminanceCharacteristicsID" }, { 0x0028, 0x700F, 0, VR::SQ, VM::M1, "QAResultsSequence" }, { 0x0028, 0x7010, 0, VR::SQ, VM::M1, "DisplaySubsystemQAResultsSequence" }, { 0x0028, 0x7011, 0, VR::SQ, VM::M1, "ConfigurationQAResultsSequence" }, { 0x0028, 0x7012, 0, VR::SQ, VM::M1, "MeasurementEquipmentSequence" }, { 0x0028, 0x7013, 0, VR::CS, VM::M1TN, "MeasurementFunctions" }, { 0x0028, 0x7014, 0, VR::CS, VM::M1, "MeasurementEquipmentType" }, { 0x0028, 0x7015, 0, VR::SQ, VM::M1, "VisualEvaluationResultSequence" }, { 0x0028, 0x7016, 0, VR::SQ, VM::M1, "DisplayCalibrationResultSequence" }, { 0x0028, 0x7017, 0, VR::US, VM::M1, "DDLValue" }, { 0x0028, 0x7018, 0, VR::FL, VM::M2, "CIExyWhitePoint" }, { 0x0028, 0x7019, 0, VR::CS, VM::M1, "DisplayFunctionType" }, { 0x0028, 0x701A, 0, VR::FL, VM::M1, "GammaValue" }, { 0x0028, 0x701B, 0, VR::US, VM::M1, "NumberOfLuminancePoints" }, { 0x0028, 0x701C, 0, VR::SQ, VM::M1, "LuminanceResponseSequence" }, { 0x0028, 0x701D, 0, VR::FL, VM::M1, "TargetMinimumLuminance" }, { 0x0028, 0x701E, 0, VR::FL, VM::M1, "TargetMaximumLuminance" }, { 0x0028, 0x701F, 0, VR::FL, VM::M1, "LuminanceValue" }, { 0x0028, 0x7020, 0, VR::LO, VM::M1, "LuminanceResponseDescription" }, { 0x0028, 0x7021, 0, VR::CS, VM::M1, "WhitePointFlag" }, { 0x0028, 0x7022, 0, VR::SQ, VM::M1, "DisplayDeviceTypeCodeSequence" }, { 0x0028, 0x7023, 0, VR::SQ, VM::M1, "DisplaySubsystemSequence" }, { 0x0028, 0x7024, 0, VR::SQ, VM::M1, "LuminanceResultSequence" }, { 0x0028, 0x7025, 0, VR::CS, VM::M1, "AmbientLightValueSource" }, { 0x0028, 0x7026, 0, VR::CS, VM::M1TN, "MeasuredCharacteristics" }, { 0x0028, 0x7027, 0, VR::SQ, VM::M1, "LuminanceUniformityResultSequence" }, { 0x0028, 0x7028, 0, VR::SQ, VM::M1, "VisualEvaluationTestSequence" }, { 0x0028, 0x7029, 0, VR::CS, VM::M1, "TestResult" }, { 0x0028, 0x702A, 0, VR::LO, VM::M1, "TestResultComment" }, { 0x0028, 0x702B, 0, VR::CS, VM::M1, "TestImageValidation" }, { 0x0028, 0x702C, 0, VR::SQ, VM::M1, "TestPatternCodeSequence" }, { 0x0028, 0x702D, 0, VR::SQ, VM::M1, "MeasurementPatternCodeSequence" }, { 0x0028, 0x702E, 0, VR::SQ, VM::M1, "VisualEvaluationMethodCodeSequence" }, { 0x0028, 0x7FE0, 0, VR::UR, VM::M1, "PixelDataProviderURL" }, { 0x0028, 0x9001, 0, VR::UL, VM::M1, "DataPointRows" }, { 0x0028, 0x9002, 0, VR::UL, VM::M1, "DataPointColumns" }, { 0x0028, 0x9003, 0, VR::CS, VM::M1, "SignalDomainColumns" }, { 0x0028, 0x9099, 1, VR::US, VM::M1, "LargestMonochromePixelValue" }, { 0x0028, 0x9108, 0, VR::CS, VM::M1, "DataRepresentation" }, { 0x0028, 0x9110, 0, VR::SQ, VM::M1, "PixelMeasuresSequence" }, { 0x0028, 0x9132, 0, VR::SQ, VM::M1, "FrameVOILUTSequence" }, { 0x0028, 0x9145, 0, VR::SQ, VM::M1, "PixelValueTransformationSequence" }, { 0x0028, 0x9235, 0, VR::CS, VM::M1, "SignalDomainRows" }, { 0x0028, 0x9411, 0, VR::FL, VM::M1, "DisplayFilterPercentage" }, { 0x0028, 0x9415, 0, VR::SQ, VM::M1, "FramePixelShiftSequence" }, { 0x0028, 0x9416, 0, VR::US, VM::M1, "SubtractionItemID" }, { 0x0028, 0x9422, 0, VR::SQ, VM::M1, "PixelIntensityRelationshipLUTSequence" }, { 0x0028, 0x9443, 0, VR::SQ, VM::M1, "FramePixelDataPropertiesSequence" }, { 0x0028, 0x9444, 0, VR::CS, VM::M1, "GeometricalProperties" }, { 0x0028, 0x9445, 0, VR::FL, VM::M1, "GeometricMaximumDistortion" }, { 0x0028, 0x9446, 0, VR::CS, VM::M1TN, "ImageProcessingApplied" }, { 0x0028, 0x9454, 0, VR::CS, VM::M1, "MaskSelectionMode" }, { 0x0028, 0x9474, 0, VR::CS, VM::M1, "LUTFunction" }, { 0x0028, 0x9478, 0, VR::FL, VM::M1, "MaskVisibilityPercentage" }, { 0x0028, 0x9501, 0, VR::SQ, VM::M1, "PixelShiftSequence" }, { 0x0028, 0x9502, 0, VR::SQ, VM::M1, "RegionPixelShiftSequence" }, { 0x0028, 0x9503, 0, VR::SS, VM::M2T2N, "VerticesOfTheRegion" }, { 0x0028, 0x9505, 0, VR::SQ, VM::M1, "MultiFramePresentationSequence" }, { 0x0028, 0x9506, 0, VR::US, VM::M2T2N, "PixelShiftFrameRange" }, { 0x0028, 0x9507, 0, VR::US, VM::M2T2N, "LUTFrameRange" }, { 0x0028, 0x9520, 0, VR::DS, VM::M16, "ImageToEquipmentMappingMatrix" }, { 0x0028, 0x9537, 0, VR::CS, VM::M1, "EquipmentCoordinateSystemIdentification" }, { 0x0032, 0x000A, 1, VR::CS, VM::M1, "StudyStatusID" }, { 0x0032, 0x000C, 1, VR::CS, VM::M1, "StudyPriorityID" }, { 0x0032, 0x0012, 1, VR::LO, VM::M1, "StudyIDIssuer" }, { 0x0032, 0x0032, 1, VR::DA, VM::M1, "StudyVerifiedDate" }, { 0x0032, 0x0033, 1, VR::TM, VM::M1, "StudyVerifiedTime" }, { 0x0032, 0x0034, 1, VR::DA, VM::M1, "StudyReadDate" }, { 0x0032, 0x0035, 1, VR::TM, VM::M1, "StudyReadTime" }, { 0x0032, 0x1000, 1, VR::DA, VM::M1, "ScheduledStudyStartDate" }, { 0x0032, 0x1001, 1, VR::TM, VM::M1, "ScheduledStudyStartTime" }, { 0x0032, 0x1010, 1, VR::DA, VM::M1, "ScheduledStudyStopDate" }, { 0x0032, 0x1011, 1, VR::TM, VM::M1, "ScheduledStudyStopTime" }, { 0x0032, 0x1020, 1, VR::LO, VM::M1, "ScheduledStudyLocation" }, { 0x0032, 0x1021, 1, VR::AE, VM::M1TN, "ScheduledStudyLocationAETitle" }, { 0x0032, 0x1030, 1, VR::LO, VM::M1, "ReasonForStudy" }, { 0x0032, 0x1031, 0, VR::SQ, VM::M1, "RequestingPhysicianIdentificationSequence" }, { 0x0032, 0x1032, 0, VR::PN, VM::M1, "RequestingPhysician" }, { 0x0032, 0x1033, 0, VR::LO, VM::M1, "RequestingService" }, { 0x0032, 0x1034, 0, VR::SQ, VM::M1, "RequestingServiceCodeSequence" }, { 0x0032, 0x1040, 1, VR::DA, VM::M1, "StudyArrivalDate" }, { 0x0032, 0x1041, 1, VR::TM, VM::M1, "StudyArrivalTime" }, { 0x0032, 0x1050, 1, VR::DA, VM::M1, "StudyCompletionDate" }, { 0x0032, 0x1051, 1, VR::TM, VM::M1, "StudyCompletionTime" }, { 0x0032, 0x1055, 1, VR::CS, VM::M1, "StudyComponentStatusID" }, { 0x0032, 0x1060, 0, VR::LO, VM::M1, "RequestedProcedureDescription" }, { 0x0032, 0x1064, 0, VR::SQ, VM::M1, "RequestedProcedureCodeSequence" }, { 0x0032, 0x1066, 0, VR::UT, VM::M1, "ReasonForVisit" }, { 0x0032, 0x1067, 0, VR::SQ, VM::M1, "ReasonForVisitCodeSequence" }, { 0x0032, 0x1070, 0, VR::LO, VM::M1, "RequestedContrastAgent" }, { 0x0032, 0x4000, 1, VR::LT, VM::M1, "StudyComments" }, { 0x0034, 0x0001, 0, VR::SQ, VM::M1, "FlowIdentifierSequence" }, { 0x0034, 0x0002, 0, VR::OB, VM::M1, "FlowIdentifier" }, { 0x0034, 0x0003, 0, VR::UI, VM::M1, "FlowTransferSyntaxUID" }, { 0x0034, 0x0004, 0, VR::UL, VM::M1, "FlowRTPSamplingRate" }, { 0x0034, 0x0005, 0, VR::OB, VM::M1, "SourceIdentifier" }, { 0x0034, 0x0007, 0, VR::OB, VM::M1, "FrameOriginTimestamp" }, { 0x0034, 0x0008, 0, VR::CS, VM::M1, "IncludesImagingSubject" }, { 0x0034, 0x0009, 0, VR::SQ, VM::M1, "FrameUsefulnessGroupSequence" }, { 0x0034, 0x000A, 0, VR::SQ, VM::M1, "RealTimeBulkDataFlowSequence" }, { 0x0034, 0x000B, 0, VR::SQ, VM::M1, "CameraPositionGroupSequence" }, { 0x0034, 0x000C, 0, VR::CS, VM::M1, "IncludesInformation" }, { 0x0034, 0x000D, 0, VR::SQ, VM::M1, "TimeOfFrameGroupSequence" }, { 0x0038, 0x0004, 0, VR::SQ, VM::M1, "ReferencedPatientAliasSequence" }, { 0x0038, 0x0008, 0, VR::CS, VM::M1, "VisitStatusID" }, { 0x0038, 0x0010, 0, VR::LO, VM::M1, "AdmissionID" }, { 0x0038, 0x0011, 1, VR::LO, VM::M1, "IssuerOfAdmissionID" }, { 0x0038, 0x0014, 0, VR::SQ, VM::M1, "IssuerOfAdmissionIDSequence" }, { 0x0038, 0x0016, 0, VR::LO, VM::M1, "RouteOfAdmissions" }, { 0x0038, 0x001A, 1, VR::DA, VM::M1, "ScheduledAdmissionDate" }, { 0x0038, 0x001B, 1, VR::TM, VM::M1, "ScheduledAdmissionTime" }, { 0x0038, 0x001C, 1, VR::DA, VM::M1, "ScheduledDischargeDate" }, { 0x0038, 0x001D, 1, VR::TM, VM::M1, "ScheduledDischargeTime" }, { 0x0038, 0x001E, 1, VR::LO, VM::M1, "ScheduledPatientInstitutionResidence" }, { 0x0038, 0x0020, 0, VR::DA, VM::M1, "AdmittingDate" }, { 0x0038, 0x0021, 0, VR::TM, VM::M1, "AdmittingTime" }, { 0x0038, 0x0030, 1, VR::DA, VM::M1, "DischargeDate" }, { 0x0038, 0x0032, 1, VR::TM, VM::M1, "DischargeTime" }, { 0x0038, 0x0040, 1, VR::LO, VM::M1, "DischargeDiagnosisDescription" }, { 0x0038, 0x0044, 1, VR::SQ, VM::M1, "DischargeDiagnosisCodeSequence" }, { 0x0038, 0x0050, 0, VR::LO, VM::M1, "SpecialNeeds" }, { 0x0038, 0x0060, 0, VR::LO, VM::M1, "ServiceEpisodeID" }, { 0x0038, 0x0061, 1, VR::LO, VM::M1, "IssuerOfServiceEpisodeID" }, { 0x0038, 0x0062, 0, VR::LO, VM::M1, "ServiceEpisodeDescription" }, { 0x0038, 0x0064, 0, VR::SQ, VM::M1, "IssuerOfServiceEpisodeIDSequence" }, { 0x0038, 0x0100, 0, VR::SQ, VM::M1, "PertinentDocumentsSequence" }, { 0x0038, 0x0101, 0, VR::SQ, VM::M1, "PertinentResourcesSequence" }, { 0x0038, 0x0102, 0, VR::LO, VM::M1, "ResourceDescription" }, { 0x0038, 0x0300, 0, VR::LO, VM::M1, "CurrentPatientLocation" }, { 0x0038, 0x0400, 0, VR::LO, VM::M1, "PatientInstitutionResidence" }, { 0x0038, 0x0500, 0, VR::LO, VM::M1, "PatientState" }, { 0x0038, 0x0502, 0, VR::SQ, VM::M1, "PatientClinicalTrialParticipationSequence" }, { 0x0038, 0x4000, 0, VR::LT, VM::M1, "VisitComments" }, { 0x003A, 0x0004, 0, VR::CS, VM::M1, "WaveformOriginality" }, { 0x003A, 0x0005, 0, VR::US, VM::M1, "NumberOfWaveformChannels" }, { 0x003A, 0x0010, 0, VR::UL, VM::M1, "NumberOfWaveformSamples" }, { 0x003A, 0x001A, 0, VR::DS, VM::M1, "SamplingFrequency" }, { 0x003A, 0x0020, 0, VR::SH, VM::M1, "MultiplexGroupLabel" }, { 0x003A, 0x0200, 0, VR::SQ, VM::M1, "ChannelDefinitionSequence" }, { 0x003A, 0x0202, 0, VR::IS, VM::M1, "WaveformChannelNumber" }, { 0x003A, 0x0203, 0, VR::SH, VM::M1, "ChannelLabel" }, { 0x003A, 0x0205, 0, VR::CS, VM::M1TN, "ChannelStatus" }, { 0x003A, 0x0208, 0, VR::SQ, VM::M1, "ChannelSourceSequence" }, { 0x003A, 0x0209, 0, VR::SQ, VM::M1, "ChannelSourceModifiersSequence" }, { 0x003A, 0x020A, 0, VR::SQ, VM::M1, "SourceWaveformSequence" }, { 0x003A, 0x020C, 0, VR::LO, VM::M1, "ChannelDerivationDescription" }, { 0x003A, 0x0210, 0, VR::DS, VM::M1, "ChannelSensitivity" }, { 0x003A, 0x0211, 0, VR::SQ, VM::M1, "ChannelSensitivityUnitsSequence" }, { 0x003A, 0x0212, 0, VR::DS, VM::M1, "ChannelSensitivityCorrectionFactor" }, { 0x003A, 0x0213, 0, VR::DS, VM::M1, "ChannelBaseline" }, { 0x003A, 0x0214, 0, VR::DS, VM::M1, "ChannelTimeSkew" }, { 0x003A, 0x0215, 0, VR::DS, VM::M1, "ChannelSampleSkew" }, { 0x003A, 0x0218, 0, VR::DS, VM::M1, "ChannelOffset" }, { 0x003A, 0x021A, 0, VR::US, VM::M1, "WaveformBitsStored" }, { 0x003A, 0x0220, 0, VR::DS, VM::M1, "FilterLowFrequency" }, { 0x003A, 0x0221, 0, VR::DS, VM::M1, "FilterHighFrequency" }, { 0x003A, 0x0222, 0, VR::DS, VM::M1, "NotchFilterFrequency" }, { 0x003A, 0x0223, 0, VR::DS, VM::M1, "NotchFilterBandwidth" }, { 0x003A, 0x0230, 0, VR::FL, VM::M1, "WaveformDataDisplayScale" }, { 0x003A, 0x0231, 0, VR::US, VM::M3, "WaveformDisplayBackgroundCIELabValue" }, { 0x003A, 0x0240, 0, VR::SQ, VM::M1, "WaveformPresentationGroupSequence" }, { 0x003A, 0x0241, 0, VR::US, VM::M1, "PresentationGroupNumber" }, { 0x003A, 0x0242, 0, VR::SQ, VM::M1, "ChannelDisplaySequence" }, { 0x003A, 0x0244, 0, VR::US, VM::M3, "ChannelRecommendedDisplayCIELabValue" }, { 0x003A, 0x0245, 0, VR::FL, VM::M1, "ChannelPosition" }, { 0x003A, 0x0246, 0, VR::CS, VM::M1, "DisplayShadingFlag" }, { 0x003A, 0x0247, 0, VR::FL, VM::M1, "FractionalChannelDisplayScale" }, { 0x003A, 0x0248, 0, VR::FL, VM::M1, "AbsoluteChannelDisplayScale" }, { 0x003A, 0x0300, 0, VR::SQ, VM::M1, "MultiplexedAudioChannelsDescriptionCodeSequence" }, { 0x003A, 0x0301, 0, VR::IS, VM::M1, "ChannelIdentificationCode" }, { 0x003A, 0x0302, 0, VR::CS, VM::M1, "ChannelMode" }, { 0x0040, 0x0001, 0, VR::AE, VM::M1TN, "ScheduledStationAETitle" }, { 0x0040, 0x0002, 0, VR::DA, VM::M1, "ScheduledProcedureStepStartDate" }, { 0x0040, 0x0003, 0, VR::TM, VM::M1, "ScheduledProcedureStepStartTime" }, { 0x0040, 0x0004, 0, VR::DA, VM::M1, "ScheduledProcedureStepEndDate" }, { 0x0040, 0x0005, 0, VR::TM, VM::M1, "ScheduledProcedureStepEndTime" }, { 0x0040, 0x0006, 0, VR::PN, VM::M1, "ScheduledPerformingPhysicianName" }, { 0x0040, 0x0007, 0, VR::LO, VM::M1, "ScheduledProcedureStepDescription" }, { 0x0040, 0x0008, 0, VR::SQ, VM::M1, "ScheduledProtocolCodeSequence" }, { 0x0040, 0x0009, 0, VR::SH, VM::M1, "ScheduledProcedureStepID" }, { 0x0040, 0x000A, 0, VR::SQ, VM::M1, "StageCodeSequence" }, { 0x0040, 0x000B, 0, VR::SQ, VM::M1, "ScheduledPerformingPhysicianIdentificationSequence" }, { 0x0040, 0x0010, 0, VR::SH, VM::M1TN, "ScheduledStationName" }, { 0x0040, 0x0011, 0, VR::SH, VM::M1, "ScheduledProcedureStepLocation" }, { 0x0040, 0x0012, 0, VR::LO, VM::M1, "PreMedication" }, { 0x0040, 0x0020, 0, VR::CS, VM::M1, "ScheduledProcedureStepStatus" }, { 0x0040, 0x0026, 0, VR::SQ, VM::M1, "OrderPlacerIdentifierSequence" }, { 0x0040, 0x0027, 0, VR::SQ, VM::M1, "OrderFillerIdentifierSequence" }, { 0x0040, 0x0031, 0, VR::UT, VM::M1, "LocalNamespaceEntityID" }, { 0x0040, 0x0032, 0, VR::UT, VM::M1, "UniversalEntityID" }, { 0x0040, 0x0033, 0, VR::CS, VM::M1, "UniversalEntityIDType" }, { 0x0040, 0x0035, 0, VR::CS, VM::M1, "IdentifierTypeCode" }, { 0x0040, 0x0036, 0, VR::SQ, VM::M1, "AssigningFacilitySequence" }, { 0x0040, 0x0039, 0, VR::SQ, VM::M1, "AssigningJurisdictionCodeSequence" }, { 0x0040, 0x003A, 0, VR::SQ, VM::M1, "AssigningAgencyOrDepartmentCodeSequence" }, { 0x0040, 0x0100, 0, VR::SQ, VM::M1, "ScheduledProcedureStepSequence" }, { 0x0040, 0x0220, 0, VR::SQ, VM::M1, "ReferencedNonImageCompositeSOPInstanceSequence" }, { 0x0040, 0x0241, 0, VR::AE, VM::M1, "PerformedStationAETitle" }, { 0x0040, 0x0242, 0, VR::SH, VM::M1, "PerformedStationName" }, { 0x0040, 0x0243, 0, VR::SH, VM::M1, "PerformedLocation" }, { 0x0040, 0x0244, 0, VR::DA, VM::M1, "PerformedProcedureStepStartDate" }, { 0x0040, 0x0245, 0, VR::TM, VM::M1, "PerformedProcedureStepStartTime" }, { 0x0040, 0x0250, 0, VR::DA, VM::M1, "PerformedProcedureStepEndDate" }, { 0x0040, 0x0251, 0, VR::TM, VM::M1, "PerformedProcedureStepEndTime" }, { 0x0040, 0x0252, 0, VR::CS, VM::M1, "PerformedProcedureStepStatus" }, { 0x0040, 0x0253, 0, VR::SH, VM::M1, "PerformedProcedureStepID" }, { 0x0040, 0x0254, 0, VR::LO, VM::M1, "PerformedProcedureStepDescription" }, { 0x0040, 0x0255, 0, VR::LO, VM::M1, "PerformedProcedureTypeDescription" }, { 0x0040, 0x0260, 0, VR::SQ, VM::M1, "PerformedProtocolCodeSequence" }, { 0x0040, 0x0261, 0, VR::CS, VM::M1, "PerformedProtocolType" }, { 0x0040, 0x0270, 0, VR::SQ, VM::M1, "ScheduledStepAttributesSequence" }, { 0x0040, 0x0275, 0, VR::SQ, VM::M1, "RequestAttributesSequence" }, { 0x0040, 0x0280, 0, VR::ST, VM::M1, "CommentsOnThePerformedProcedureStep" }, { 0x0040, 0x0281, 0, VR::SQ, VM::M1, "PerformedProcedureStepDiscontinuationReasonCodeSequence" }, { 0x0040, 0x0293, 0, VR::SQ, VM::M1, "QuantitySequence" }, { 0x0040, 0x0294, 0, VR::DS, VM::M1, "Quantity" }, { 0x0040, 0x0295, 0, VR::SQ, VM::M1, "MeasuringUnitsSequence" }, { 0x0040, 0x0296, 0, VR::SQ, VM::M1, "BillingItemSequence" }, { 0x0040, 0x0300, 1, VR::US, VM::M1, "TotalTimeOfFluoroscopy" }, { 0x0040, 0x0301, 1, VR::US, VM::M1, "TotalNumberOfExposures" }, { 0x0040, 0x0302, 0, VR::US, VM::M1, "EntranceDose" }, { 0x0040, 0x0303, 0, VR::US, VM::M1T2, "ExposedArea" }, { 0x0040, 0x0306, 0, VR::DS, VM::M1, "DistanceSourceToEntrance" }, { 0x0040, 0x0307, 1, VR::DS, VM::M1, "DistanceSourceToSupport" }, { 0x0040, 0x030E, 1, VR::SQ, VM::M1, "ExposureDoseSequence" }, { 0x0040, 0x0310, 0, VR::ST, VM::M1, "CommentsOnRadiationDose" }, { 0x0040, 0x0312, 0, VR::DS, VM::M1, "XRayOutput" }, { 0x0040, 0x0314, 0, VR::DS, VM::M1, "HalfValueLayer" }, { 0x0040, 0x0316, 0, VR::DS, VM::M1, "OrganDose" }, { 0x0040, 0x0318, 0, VR::CS, VM::M1, "OrganExposed" }, { 0x0040, 0x0320, 0, VR::SQ, VM::M1, "BillingProcedureStepSequence" }, { 0x0040, 0x0321, 0, VR::SQ, VM::M1, "FilmConsumptionSequence" }, { 0x0040, 0x0324, 0, VR::SQ, VM::M1, "BillingSuppliesAndDevicesSequence" }, { 0x0040, 0x0330, 1, VR::SQ, VM::M1, "ReferencedProcedureStepSequence" }, { 0x0040, 0x0340, 0, VR::SQ, VM::M1, "PerformedSeriesSequence" }, { 0x0040, 0x0400, 0, VR::LT, VM::M1, "CommentsOnTheScheduledProcedureStep" }, { 0x0040, 0x0440, 0, VR::SQ, VM::M1, "ProtocolContextSequence" }, { 0x0040, 0x0441, 0, VR::SQ, VM::M1, "ContentItemModifierSequence" }, { 0x0040, 0x0500, 0, VR::SQ, VM::M1, "ScheduledSpecimenSequence" }, { 0x0040, 0x050A, 1, VR::LO, VM::M1, "SpecimenAccessionNumber" }, { 0x0040, 0x0512, 0, VR::LO, VM::M1, "ContainerIdentifier" }, { 0x0040, 0x0513, 0, VR::SQ, VM::M1, "IssuerOfTheContainerIdentifierSequence" }, { 0x0040, 0x0515, 0, VR::SQ, VM::M1, "AlternateContainerIdentifierSequence" }, { 0x0040, 0x0518, 0, VR::SQ, VM::M1, "ContainerTypeCodeSequence" }, { 0x0040, 0x051A, 0, VR::LO, VM::M1, "ContainerDescription" }, { 0x0040, 0x0520, 0, VR::SQ, VM::M1, "ContainerComponentSequence" }, { 0x0040, 0x0550, 1, VR::SQ, VM::M1, "SpecimenSequence" }, { 0x0040, 0x0551, 0, VR::LO, VM::M1, "SpecimenIdentifier" }, { 0x0040, 0x0552, 1, VR::SQ, VM::M1, "SpecimenDescriptionSequenceTrial" }, { 0x0040, 0x0553, 1, VR::ST, VM::M1, "SpecimenDescriptionTrial" }, { 0x0040, 0x0554, 0, VR::UI, VM::M1, "SpecimenUID" }, { 0x0040, 0x0555, 0, VR::SQ, VM::M1, "AcquisitionContextSequence" }, { 0x0040, 0x0556, 0, VR::ST, VM::M1, "AcquisitionContextDescription" }, { 0x0040, 0x059A, 0, VR::SQ, VM::M1, "SpecimenTypeCodeSequence" }, { 0x0040, 0x0560, 0, VR::SQ, VM::M1, "SpecimenDescriptionSequence" }, { 0x0040, 0x0562, 0, VR::SQ, VM::M1, "IssuerOfTheSpecimenIdentifierSequence" }, { 0x0040, 0x0600, 0, VR::LO, VM::M1, "SpecimenShortDescription" }, { 0x0040, 0x0602, 0, VR::UT, VM::M1, "SpecimenDetailedDescription" }, { 0x0040, 0x0610, 0, VR::SQ, VM::M1, "SpecimenPreparationSequence" }, { 0x0040, 0x0612, 0, VR::SQ, VM::M1, "SpecimenPreparationStepContentItemSequence" }, { 0x0040, 0x0620, 0, VR::SQ, VM::M1, "SpecimenLocalizationContentItemSequence" }, { 0x0040, 0x06FA, 1, VR::LO, VM::M1, "SlideIdentifier" }, { 0x0040, 0x0710, 0, VR::SQ, VM::M1, "WholeSlideMicroscopyImageFrameTypeSequence" }, { 0x0040, 0x071A, 0, VR::SQ, VM::M1, "ImageCenterPointCoordinatesSequence" }, { 0x0040, 0x072A, 0, VR::DS, VM::M1, "XOffsetInSlideCoordinateSystem" }, { 0x0040, 0x073A, 0, VR::DS, VM::M1, "YOffsetInSlideCoordinateSystem" }, { 0x0040, 0x074A, 0, VR::DS, VM::M1, "ZOffsetInSlideCoordinateSystem" }, { 0x0040, 0x08D8, 1, VR::SQ, VM::M1, "PixelSpacingSequence" }, { 0x0040, 0x08DA, 1, VR::SQ, VM::M1, "CoordinateSystemAxisCodeSequence" }, { 0x0040, 0x08EA, 0, VR::SQ, VM::M1, "MeasurementUnitsCodeSequence" }, { 0x0040, 0x09F8, 1, VR::SQ, VM::M1, "VitalStainCodeSequenceTrial" }, { 0x0040, 0x1001, 0, VR::SH, VM::M1, "RequestedProcedureID" }, { 0x0040, 0x1002, 0, VR::LO, VM::M1, "ReasonForTheRequestedProcedure" }, { 0x0040, 0x1003, 0, VR::SH, VM::M1, "RequestedProcedurePriority" }, { 0x0040, 0x1004, 0, VR::LO, VM::M1, "PatientTransportArrangements" }, { 0x0040, 0x1005, 0, VR::LO, VM::M1, "RequestedProcedureLocation" }, { 0x0040, 0x1006, 1, VR::SH, VM::M1, "PlacerOrderNumberProcedure" }, { 0x0040, 0x1007, 1, VR::SH, VM::M1, "FillerOrderNumberProcedure" }, { 0x0040, 0x1008, 0, VR::LO, VM::M1, "ConfidentialityCode" }, { 0x0040, 0x1009, 0, VR::SH, VM::M1, "ReportingPriority" }, { 0x0040, 0x100A, 0, VR::SQ, VM::M1, "ReasonForRequestedProcedureCodeSequence" }, { 0x0040, 0x1010, 0, VR::PN, VM::M1TN, "NamesOfIntendedRecipientsOfResults" }, { 0x0040, 0x1011, 0, VR::SQ, VM::M1, "IntendedRecipientsOfResultsIdentificationSequence" }, { 0x0040, 0x1012, 0, VR::SQ, VM::M1, "ReasonForPerformedProcedureCodeSequence" }, { 0x0040, 0x1060, 1, VR::LO, VM::M1, "RequestedProcedureDescriptionTrial" }, { 0x0040, 0x1101, 0, VR::SQ, VM::M1, "PersonIdentificationCodeSequence" }, { 0x0040, 0x1102, 0, VR::ST, VM::M1, "PersonAddress" }, { 0x0040, 0x1103, 0, VR::LO, VM::M1TN, "PersonTelephoneNumbers" }, { 0x0040, 0x1104, 0, VR::LT, VM::M1, "PersonTelecomInformation" }, { 0x0040, 0x1400, 0, VR::LT, VM::M1, "RequestedProcedureComments" }, { 0x0040, 0x2001, 1, VR::LO, VM::M1, "ReasonForTheImagingServiceRequest" }, { 0x0040, 0x2004, 0, VR::DA, VM::M1, "IssueDateOfImagingServiceRequest" }, { 0x0040, 0x2005, 0, VR::TM, VM::M1, "IssueTimeOfImagingServiceRequest" }, { 0x0040, 0x2006, 1, VR::SH, VM::M1, "PlacerOrderNumberImagingServiceRequestRetired" }, { 0x0040, 0x2007, 1, VR::SH, VM::M1, "FillerOrderNumberImagingServiceRequestRetired" }, { 0x0040, 0x2008, 0, VR::PN, VM::M1, "OrderEnteredBy" }, { 0x0040, 0x2009, 0, VR::SH, VM::M1, "OrderEntererLocation" }, { 0x0040, 0x2010, 0, VR::SH, VM::M1, "OrderCallbackPhoneNumber" }, { 0x0040, 0x2011, 0, VR::LT, VM::M1, "OrderCallbackTelecomInformation" }, { 0x0040, 0x2016, 0, VR::LO, VM::M1, "PlacerOrderNumberImagingServiceRequest" }, { 0x0040, 0x2017, 0, VR::LO, VM::M1, "FillerOrderNumberImagingServiceRequest" }, { 0x0040, 0x2400, 0, VR::LT, VM::M1, "ImagingServiceRequestComments" }, { 0x0040, 0x3001, 0, VR::LO, VM::M1, "ConfidentialityConstraintOnPatientDataDescription" }, { 0x0040, 0x4001, 1, VR::CS, VM::M1, "GeneralPurposeScheduledProcedureStepStatus" }, { 0x0040, 0x4002, 1, VR::CS, VM::M1, "GeneralPurposePerformedProcedureStepStatus" }, { 0x0040, 0x4003, 1, VR::CS, VM::M1, "GeneralPurposeScheduledProcedureStepPriority" }, { 0x0040, 0x4004, 1, VR::SQ, VM::M1, "ScheduledProcessingApplicationsCodeSequence" }, { 0x0040, 0x4005, 0, VR::DT, VM::M1, "ScheduledProcedureStepStartDateTime" }, { 0x0040, 0x4006, 1, VR::CS, VM::M1, "MultipleCopiesFlag" }, { 0x0040, 0x4007, 1, VR::SQ, VM::M1, "PerformedProcessingApplicationsCodeSequence" }, { 0x0040, 0x4008, 0, VR::DT, VM::M1, "ScheduledProcedureStepExpirationDateTime" }, { 0x0040, 0x4009, 0, VR::SQ, VM::M1, "HumanPerformerCodeSequence" }, { 0x0040, 0x4010, 0, VR::DT, VM::M1, "ScheduledProcedureStepModificationDateTime" }, { 0x0040, 0x4011, 0, VR::DT, VM::M1, "ExpectedCompletionDateTime" }, { 0x0040, 0x4015, 1, VR::SQ, VM::M1, "ResultingGeneralPurposePerformedProcedureStepsSequence" }, { 0x0040, 0x4016, 1, VR::SQ, VM::M1, "ReferencedGeneralPurposeScheduledProcedureStepSequence" }, { 0x0040, 0x4018, 0, VR::SQ, VM::M1, "ScheduledWorkitemCodeSequence" }, { 0x0040, 0x4019, 0, VR::SQ, VM::M1, "PerformedWorkitemCodeSequence" }, { 0x0040, 0x4020, 1, VR::CS, VM::M1, "InputAvailabilityFlag" }, { 0x0040, 0x4021, 0, VR::SQ, VM::M1, "InputInformationSequence" }, { 0x0040, 0x4022, 1, VR::SQ, VM::M1, "RelevantInformationSequence" }, { 0x0040, 0x4023, 1, VR::UI, VM::M1, "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID" }, { 0x0040, 0x4025, 0, VR::SQ, VM::M1, "ScheduledStationNameCodeSequence" }, { 0x0040, 0x4026, 0, VR::SQ, VM::M1, "ScheduledStationClassCodeSequence" }, { 0x0040, 0x4027, 0, VR::SQ, VM::M1, "ScheduledStationGeographicLocationCodeSequence" }, { 0x0040, 0x4028, 0, VR::SQ, VM::M1, "PerformedStationNameCodeSequence" }, { 0x0040, 0x4029, 0, VR::SQ, VM::M1, "PerformedStationClassCodeSequence" }, { 0x0040, 0x4030, 0, VR::SQ, VM::M1, "PerformedStationGeographicLocationCodeSequence" }, { 0x0040, 0x4031, 1, VR::SQ, VM::M1, "RequestedSubsequentWorkitemCodeSequence" }, { 0x0040, 0x4032, 1, VR::SQ, VM::M1, "NonDICOMOutputCodeSequence" }, { 0x0040, 0x4033, 0, VR::SQ, VM::M1, "OutputInformationSequence" }, { 0x0040, 0x4034, 0, VR::SQ, VM::M1, "ScheduledHumanPerformersSequence" }, { 0x0040, 0x4035, 0, VR::SQ, VM::M1, "ActualHumanPerformersSequence" }, { 0x0040, 0x4036, 0, VR::LO, VM::M1, "HumanPerformerOrganization" }, { 0x0040, 0x4037, 0, VR::PN, VM::M1, "HumanPerformerName" }, { 0x0040, 0x4040, 0, VR::CS, VM::M1, "RawDataHandling" }, { 0x0040, 0x4041, 0, VR::CS, VM::M1, "InputReadinessState" }, { 0x0040, 0x4050, 0, VR::DT, VM::M1, "PerformedProcedureStepStartDateTime" }, { 0x0040, 0x4051, 0, VR::DT, VM::M1, "PerformedProcedureStepEndDateTime" }, { 0x0040, 0x4052, 0, VR::DT, VM::M1, "ProcedureStepCancellationDateTime" }, { 0x0040, 0x4070, 0, VR::SQ, VM::M1, "OutputDestinationSequence" }, { 0x0040, 0x4071, 0, VR::SQ, VM::M1, "DICOMStorageSequence" }, { 0x0040, 0x4072, 0, VR::SQ, VM::M1, "STOWRSStorageSequence" }, { 0x0040, 0x4073, 0, VR::UR, VM::M1, "StorageURL" }, { 0x0040, 0x4074, 0, VR::SQ, VM::M1, "XDSStorageSequence" }, { 0x0040, 0x8302, 0, VR::DS, VM::M1, "EntranceDoseInmGy" }, { 0x0040, 0x8303, 0, VR::CS, VM::M1, "EntranceDoseDerivation" }, { 0x0040, 0x9092, 0, VR::SQ, VM::M1, "ParametricMapFrameTypeSequence" }, { 0x0040, 0x9094, 0, VR::SQ, VM::M1, "ReferencedImageRealWorldValueMappingSequence" }, { 0x0040, 0x9096, 0, VR::SQ, VM::M1, "RealWorldValueMappingSequence" }, { 0x0040, 0x9098, 0, VR::SQ, VM::M1, "PixelValueMappingCodeSequence" }, { 0x0040, 0x9210, 0, VR::SH, VM::M1, "LUTLabel" }, { 0x0040, 0x9211, 0, VR::XS, VM::M1, "RealWorldValueLastValueMapped" }, { 0x0040, 0x9212, 0, VR::FD, VM::M1TN, "RealWorldValueLUTData" }, { 0x0040, 0x9213, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueLastValueMapped" }, { 0x0040, 0x9214, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueFirstValueMapped" }, { 0x0040, 0x9216, 0, VR::XS, VM::M1, "RealWorldValueFirstValueMapped" }, { 0x0040, 0x9220, 0, VR::SQ, VM::M1, "QuantityDefinitionSequence" }, { 0x0040, 0x9224, 0, VR::FD, VM::M1, "RealWorldValueIntercept" }, { 0x0040, 0x9225, 0, VR::FD, VM::M1, "RealWorldValueSlope" }, { 0x0040, 0xA007, 1, VR::CS, VM::M1, "FindingsFlagTrial" }, { 0x0040, 0xA010, 0, VR::CS, VM::M1, "RelationshipType" }, { 0x0040, 0xA020, 1, VR::SQ, VM::M1, "FindingsSequenceTrial" }, { 0x0040, 0xA021, 1, VR::UI, VM::M1, "FindingsGroupUIDTrial" }, { 0x0040, 0xA022, 1, VR::UI, VM::M1, "ReferencedFindingsGroupUIDTrial" }, { 0x0040, 0xA023, 1, VR::DA, VM::M1, "FindingsGroupRecordingDateTrial" }, { 0x0040, 0xA024, 1, VR::TM, VM::M1, "FindingsGroupRecordingTimeTrial" }, { 0x0040, 0xA026, 1, VR::SQ, VM::M1, "FindingsSourceCategoryCodeSequenceTrial" }, { 0x0040, 0xA027, 0, VR::LO, VM::M1, "VerifyingOrganization" }, { 0x0040, 0xA028, 1, VR::SQ, VM::M1, "DocumentingOrganizationIdentifierCodeSequenceTrial" }, { 0x0040, 0xA030, 0, VR::DT, VM::M1, "VerificationDateTime" }, { 0x0040, 0xA032, 0, VR::DT, VM::M1, "ObservationDateTime" }, { 0x0040, 0xA040, 0, VR::CS, VM::M1, "ValueType" }, { 0x0040, 0xA043, 0, VR::SQ, VM::M1, "ConceptNameCodeSequence" }, { 0x0040, 0xA047, 1, VR::LO, VM::M1, "MeasurementPrecisionDescriptionTrial" }, { 0x0040, 0xA050, 0, VR::CS, VM::M1, "ContinuityOfContent" }, { 0x0040, 0xA057, 1, VR::CS, VM::M1TN, "UrgencyOrPriorityAlertsTrial" }, { 0x0040, 0xA060, 1, VR::LO, VM::M1, "SequencingIndicatorTrial" }, { 0x0040, 0xA066, 1, VR::SQ, VM::M1, "DocumentIdentifierCodeSequenceTrial" }, { 0x0040, 0xA067, 1, VR::PN, VM::M1, "DocumentAuthorTrial" }, { 0x0040, 0xA068, 1, VR::SQ, VM::M1, "DocumentAuthorIdentifierCodeSequenceTrial" }, { 0x0040, 0xA070, 1, VR::SQ, VM::M1, "IdentifierCodeSequenceTrial" }, { 0x0040, 0xA073, 0, VR::SQ, VM::M1, "VerifyingObserverSequence" }, { 0x0040, 0xA074, 1, VR::OB, VM::M1, "ObjectBinaryIdentifierTrial" }, { 0x0040, 0xA075, 0, VR::PN, VM::M1, "VerifyingObserverName" }, { 0x0040, 0xA076, 1, VR::SQ, VM::M1, "DocumentingObserverIdentifierCodeSequenceTrial" }, { 0x0040, 0xA078, 0, VR::SQ, VM::M1, "AuthorObserverSequence" }, { 0x0040, 0xA07A, 0, VR::SQ, VM::M1, "ParticipantSequence" }, { 0x0040, 0xA07C, 0, VR::SQ, VM::M1, "CustodialOrganizationSequence" }, { 0x0040, 0xA080, 0, VR::CS, VM::M1, "ParticipationType" }, { 0x0040, 0xA082, 0, VR::DT, VM::M1, "ParticipationDateTime" }, { 0x0040, 0xA084, 0, VR::CS, VM::M1, "ObserverType" }, { 0x0040, 0xA085, 1, VR::SQ, VM::M1, "ProcedureIdentifierCodeSequenceTrial" }, { 0x0040, 0xA088, 0, VR::SQ, VM::M1, "VerifyingObserverIdentificationCodeSequence" }, { 0x0040, 0xA089, 1, VR::OB, VM::M1, "ObjectDirectoryBinaryIdentifierTrial" }, { 0x0040, 0xA090, 1, VR::SQ, VM::M1, "EquivalentCDADocumentSequence" }, { 0x0040, 0xA0B0, 0, VR::US, VM::M2T2N, "ReferencedWaveformChannels" }, { 0x0040, 0xA110, 1, VR::DA, VM::M1, "DateOfDocumentOrVerbalTransactionTrial" }, { 0x0040, 0xA112, 1, VR::TM, VM::M1, "TimeOfDocumentCreationOrVerbalTransactionTrial" }, { 0x0040, 0xA120, 0, VR::DT, VM::M1, "DateTime" }, { 0x0040, 0xA121, 0, VR::DA, VM::M1, "Date" }, { 0x0040, 0xA122, 0, VR::TM, VM::M1, "Time" }, { 0x0040, 0xA123, 0, VR::PN, VM::M1, "PersonName" }, { 0x0040, 0xA124, 0, VR::UI, VM::M1, "UID" }, { 0x0040, 0xA125, 1, VR::CS, VM::M2, "ReportStatusIDTrial" }, { 0x0040, 0xA130, 0, VR::CS, VM::M1, "TemporalRangeType" }, { 0x0040, 0xA132, 0, VR::UL, VM::M1TN, "ReferencedSamplePositions" }, { 0x0040, 0xA136, 1, VR::US, VM::M1TN, "ReferencedFrameNumbers" }, { 0x0040, 0xA138, 0, VR::DS, VM::M1TN, "ReferencedTimeOffsets" }, { 0x0040, 0xA13A, 0, VR::DT, VM::M1TN, "ReferencedDateTime" }, { 0x0040, 0xA160, 0, VR::UT, VM::M1, "TextValue" }, { 0x0040, 0xA161, 0, VR::FD, VM::M1TN, "FloatingPointValue" }, { 0x0040, 0xA162, 0, VR::SL, VM::M1TN, "RationalNumeratorValue" }, { 0x0040, 0xA163, 0, VR::UL, VM::M1TN, "RationalDenominatorValue" }, { 0x0040, 0xA167, 1, VR::SQ, VM::M1, "ObservationCategoryCodeSequenceTrial" }, { 0x0040, 0xA168, 0, VR::SQ, VM::M1, "ConceptCodeSequence" }, { 0x0040, 0xA16A, 1, VR::ST, VM::M1, "BibliographicCitationTrial" }, { 0x0040, 0xA170, 0, VR::SQ, VM::M1, "PurposeOfReferenceCodeSequence" }, { 0x0040, 0xA171, 0, VR::UI, VM::M1, "ObservationUID" }, { 0x0040, 0xA172, 1, VR::UI, VM::M1, "ReferencedObservationUIDTrial" }, { 0x0040, 0xA173, 1, VR::CS, VM::M1, "ReferencedObservationClassTrial" }, { 0x0040, 0xA174, 1, VR::CS, VM::M1, "ReferencedObjectObservationClassTrial" }, { 0x0040, 0xA180, 0, VR::US, VM::M1, "AnnotationGroupNumber" }, { 0x0040, 0xA192, 1, VR::DA, VM::M1, "ObservationDateTrial" }, { 0x0040, 0xA193, 1, VR::TM, VM::M1, "ObservationTimeTrial" }, { 0x0040, 0xA194, 1, VR::CS, VM::M1, "MeasurementAutomationTrial" }, { 0x0040, 0xA195, 0, VR::SQ, VM::M1, "ModifierCodeSequence" }, { 0x0040, 0xA224, 1, VR::ST, VM::M1, "IdentificationDescriptionTrial" }, { 0x0040, 0xA290, 1, VR::CS, VM::M1, "CoordinatesSetGeometricTypeTrial" }, { 0x0040, 0xA296, 1, VR::SQ, VM::M1, "AlgorithmCodeSequenceTrial" }, { 0x0040, 0xA297, 1, VR::ST, VM::M1, "AlgorithmDescriptionTrial" }, { 0x0040, 0xA29A, 1, VR::SL, VM::M2T2N, "PixelCoordinatesSetTrial" }, { 0x0040, 0xA300, 0, VR::SQ, VM::M1, "MeasuredValueSequence" }, { 0x0040, 0xA301, 0, VR::SQ, VM::M1, "NumericValueQualifierCodeSequence" }, { 0x0040, 0xA307, 1, VR::PN, VM::M1, "CurrentObserverTrial" }, { 0x0040, 0xA30A, 0, VR::DS, VM::M1TN, "NumericValue" }, { 0x0040, 0xA313, 1, VR::SQ, VM::M1, "ReferencedAccessionSequenceTrial" }, { 0x0040, 0xA33A, 1, VR::ST, VM::M1, "ReportStatusCommentTrial" }, { 0x0040, 0xA340, 1, VR::SQ, VM::M1, "ProcedureContextSequenceTrial" }, { 0x0040, 0xA352, 1, VR::PN, VM::M1, "VerbalSourceTrial" }, { 0x0040, 0xA353, 1, VR::ST, VM::M1, "AddressTrial" }, { 0x0040, 0xA354, 1, VR::LO, VM::M1, "TelephoneNumberTrial" }, { 0x0040, 0xA358, 1, VR::SQ, VM::M1, "VerbalSourceIdentifierCodeSequenceTrial" }, { 0x0040, 0xA360, 0, VR::SQ, VM::M1, "PredecessorDocumentsSequence" }, { 0x0040, 0xA370, 0, VR::SQ, VM::M1, "ReferencedRequestSequence" }, { 0x0040, 0xA372, 0, VR::SQ, VM::M1, "PerformedProcedureCodeSequence" }, { 0x0040, 0xA375, 0, VR::SQ, VM::M1, "CurrentRequestedProcedureEvidenceSequence" }, { 0x0040, 0xA380, 1, VR::SQ, VM::M1, "ReportDetailSequenceTrial" }, { 0x0040, 0xA385, 0, VR::SQ, VM::M1, "PertinentOtherEvidenceSequence" }, { 0x0040, 0xA390, 0, VR::SQ, VM::M1, "HL7StructuredDocumentReferenceSequence" }, { 0x0040, 0xA402, 1, VR::UI, VM::M1, "ObservationSubjectUIDTrial" }, { 0x0040, 0xA403, 1, VR::CS, VM::M1, "ObservationSubjectClassTrial" }, { 0x0040, 0xA404, 1, VR::SQ, VM::M1, "ObservationSubjectTypeCodeSequenceTrial" }, { 0x0040, 0xA491, 0, VR::CS, VM::M1, "CompletionFlag" }, { 0x0040, 0xA492, 0, VR::LO, VM::M1, "CompletionFlagDescription" }, { 0x0040, 0xA493, 0, VR::CS, VM::M1, "VerificationFlag" }, { 0x0040, 0xA494, 0, VR::CS, VM::M1, "ArchiveRequested" }, { 0x0040, 0xA496, 0, VR::CS, VM::M1, "PreliminaryFlag" }, { 0x0040, 0xA504, 0, VR::SQ, VM::M1, "ContentTemplateSequence" }, { 0x0040, 0xA525, 0, VR::SQ, VM::M1, "IdenticalDocumentsSequence" }, { 0x0040, 0xA600, 1, VR::CS, VM::M1, "ObservationSubjectContextFlagTrial" }, { 0x0040, 0xA601, 1, VR::CS, VM::M1, "ObserverContextFlagTrial" }, { 0x0040, 0xA603, 1, VR::CS, VM::M1, "ProcedureContextFlagTrial" }, { 0x0040, 0xA730, 0, VR::SQ, VM::M1, "ContentSequence" }, { 0x0040, 0xA731, 1, VR::SQ, VM::M1, "RelationshipSequenceTrial" }, { 0x0040, 0xA732, 1, VR::SQ, VM::M1, "RelationshipTypeCodeSequenceTrial" }, { 0x0040, 0xA744, 1, VR::SQ, VM::M1, "LanguageCodeSequenceTrial" }, { 0x0040, 0xA992, 1, VR::ST, VM::M1, "UniformResourceLocatorTrial" }, { 0x0040, 0xB020, 0, VR::SQ, VM::M1, "WaveformAnnotationSequence" }, { 0x0040, 0xDB00, 0, VR::CS, VM::M1, "TemplateIdentifier" }, { 0x0040, 0xDB06, 1, VR::DT, VM::M1, "TemplateVersion" }, { 0x0040, 0xDB07, 1, VR::DT, VM::M1, "TemplateLocalVersion" }, { 0x0040, 0xDB0B, 1, VR::CS, VM::M1, "TemplateExtensionFlag" }, { 0x0040, 0xDB0C, 1, VR::UI, VM::M1, "TemplateExtensionOrganizationUID" }, { 0x0040, 0xDB0D, 1, VR::UI, VM::M1, "TemplateExtensionCreatorUID" }, { 0x0040, 0xDB73, 0, VR::UL, VM::M1TN, "ReferencedContentItemIdentifier" }, { 0x0040, 0xE001, 0, VR::ST, VM::M1, "HL7InstanceIdentifier" }, { 0x0040, 0xE004, 0, VR::DT, VM::M1, "HL7DocumentEffectiveTime" }, { 0x0040, 0xE006, 0, VR::SQ, VM::M1, "HL7DocumentTypeCodeSequence" }, { 0x0040, 0xE008, 0, VR::SQ, VM::M1, "DocumentClassCodeSequence" }, { 0x0040, 0xE010, 0, VR::UR, VM::M1, "RetrieveURI" }, { 0x0040, 0xE011, 0, VR::UI, VM::M1, "RetrieveLocationUID" }, { 0x0040, 0xE020, 0, VR::CS, VM::M1, "TypeOfInstances" }, { 0x0040, 0xE021, 0, VR::SQ, VM::M1, "DICOMRetrievalSequence" }, { 0x0040, 0xE022, 0, VR::SQ, VM::M1, "DICOMMediaRetrievalSequence" }, { 0x0040, 0xE023, 0, VR::SQ, VM::M1, "WADORetrievalSequence" }, { 0x0040, 0xE024, 0, VR::SQ, VM::M1, "XDSRetrievalSequence" }, { 0x0040, 0xE025, 0, VR::SQ, VM::M1, "WADORSRetrievalSequence" }, { 0x0040, 0xE030, 0, VR::UI, VM::M1, "RepositoryUniqueID" }, { 0x0040, 0xE031, 0, VR::UI, VM::M1, "HomeCommunityID" }, { 0x0042, 0x0010, 0, VR::ST, VM::M1, "DocumentTitle" }, { 0x0042, 0x0011, 0, VR::OB, VM::M1, "EncapsulatedDocument" }, { 0x0042, 0x0012, 0, VR::LO, VM::M1, "MIMETypeOfEncapsulatedDocument" }, { 0x0042, 0x0013, 0, VR::SQ, VM::M1, "SourceInstanceSequence" }, { 0x0042, 0x0014, 0, VR::LO, VM::M1TN, "ListOfMIMETypes" }, { 0x0042, 0x0015, 0, VR::UL, VM::M1, "EncapsulatedDocumentLength" }, { 0x0044, 0x0001, 0, VR::ST, VM::M1, "ProductPackageIdentifier" }, { 0x0044, 0x0002, 0, VR::CS, VM::M1, "SubstanceAdministrationApproval" }, { 0x0044, 0x0003, 0, VR::LT, VM::M1, "ApprovalStatusFurtherDescription" }, { 0x0044, 0x0004, 0, VR::DT, VM::M1, "ApprovalStatusDateTime" }, { 0x0044, 0x0007, 0, VR::SQ, VM::M1, "ProductTypeCodeSequence" }, { 0x0044, 0x0008, 0, VR::LO, VM::M1TN, "ProductName" }, { 0x0044, 0x0009, 0, VR::LT, VM::M1, "ProductDescription" }, { 0x0044, 0x000A, 0, VR::LO, VM::M1, "ProductLotIdentifier" }, { 0x0044, 0x000B, 0, VR::DT, VM::M1, "ProductExpirationDateTime" }, { 0x0044, 0x0010, 0, VR::DT, VM::M1, "SubstanceAdministrationDateTime" }, { 0x0044, 0x0011, 0, VR::LO, VM::M1, "SubstanceAdministrationNotes" }, { 0x0044, 0x0012, 0, VR::LO, VM::M1, "SubstanceAdministrationDeviceID" }, { 0x0044, 0x0013, 0, VR::SQ, VM::M1, "ProductParameterSequence" }, { 0x0044, 0x0019, 0, VR::SQ, VM::M1, "SubstanceAdministrationParameterSequence" }, { 0x0044, 0x0100, 0, VR::SQ, VM::M1, "ApprovalSequence" }, { 0x0044, 0x0101, 0, VR::SQ, VM::M1, "AssertionCodeSequence" }, { 0x0044, 0x0102, 0, VR::UI, VM::M1, "AssertionUID" }, { 0x0044, 0x0103, 0, VR::SQ, VM::M1, "AsserterIdentificationSequence" }, { 0x0044, 0x0104, 0, VR::DT, VM::M1, "AssertionDateTime" }, { 0x0044, 0x0105, 0, VR::DT, VM::M1, "AssertionExpirationDateTime" }, { 0x0044, 0x0106, 0, VR::UT, VM::M1, "AssertionComments" }, { 0x0044, 0x0107, 0, VR::SQ, VM::M1, "RelatedAssertionSequence" }, { 0x0044, 0x0108, 0, VR::UI, VM::M1, "ReferencedAssertionUID" }, { 0x0044, 0x0109, 0, VR::SQ, VM::M1, "ApprovalSubjectSequence" }, { 0x0044, 0x010A, 0, VR::SQ, VM::M1, "OrganizationalRoleCodeSequence" }, { 0x0046, 0x0012, 0, VR::LO, VM::M1, "LensDescription" }, { 0x0046, 0x0014, 0, VR::SQ, VM::M1, "RightLensSequence" }, { 0x0046, 0x0015, 0, VR::SQ, VM::M1, "LeftLensSequence" }, { 0x0046, 0x0016, 0, VR::SQ, VM::M1, "UnspecifiedLateralityLensSequence" }, { 0x0046, 0x0018, 0, VR::SQ, VM::M1, "CylinderSequence" }, { 0x0046, 0x0028, 0, VR::SQ, VM::M1, "PrismSequence" }, { 0x0046, 0x0030, 0, VR::FD, VM::M1, "HorizontalPrismPower" }, { 0x0046, 0x0032, 0, VR::CS, VM::M1, "HorizontalPrismBase" }, { 0x0046, 0x0034, 0, VR::FD, VM::M1, "VerticalPrismPower" }, { 0x0046, 0x0036, 0, VR::CS, VM::M1, "VerticalPrismBase" }, { 0x0046, 0x0038, 0, VR::CS, VM::M1, "LensSegmentType" }, { 0x0046, 0x0040, 0, VR::FD, VM::M1, "OpticalTransmittance" }, { 0x0046, 0x0042, 0, VR::FD, VM::M1, "ChannelWidth" }, { 0x0046, 0x0044, 0, VR::FD, VM::M1, "PupilSize" }, { 0x0046, 0x0046, 0, VR::FD, VM::M1, "CornealSize" }, { 0x0046, 0x0047, 0, VR::SQ, VM::M1, "CornealSizeSequence" }, { 0x0046, 0x0050, 0, VR::SQ, VM::M1, "AutorefractionRightEyeSequence" }, { 0x0046, 0x0052, 0, VR::SQ, VM::M1, "AutorefractionLeftEyeSequence" }, { 0x0046, 0x0060, 0, VR::FD, VM::M1, "DistancePupillaryDistance" }, { 0x0046, 0x0062, 0, VR::FD, VM::M1, "NearPupillaryDistance" }, { 0x0046, 0x0063, 0, VR::FD, VM::M1, "IntermediatePupillaryDistance" }, { 0x0046, 0x0064, 0, VR::FD, VM::M1, "OtherPupillaryDistance" }, { 0x0046, 0x0070, 0, VR::SQ, VM::M1, "KeratometryRightEyeSequence" }, { 0x0046, 0x0071, 0, VR::SQ, VM::M1, "KeratometryLeftEyeSequence" }, { 0x0046, 0x0074, 0, VR::SQ, VM::M1, "SteepKeratometricAxisSequence" }, { 0x0046, 0x0075, 0, VR::FD, VM::M1, "RadiusOfCurvature" }, { 0x0046, 0x0076, 0, VR::FD, VM::M1, "KeratometricPower" }, { 0x0046, 0x0077, 0, VR::FD, VM::M1, "KeratometricAxis" }, { 0x0046, 0x0080, 0, VR::SQ, VM::M1, "FlatKeratometricAxisSequence" }, { 0x0046, 0x0092, 0, VR::CS, VM::M1, "BackgroundColor" }, { 0x0046, 0x0094, 0, VR::CS, VM::M1, "Optotype" }, { 0x0046, 0x0095, 0, VR::CS, VM::M1, "OptotypePresentation" }, { 0x0046, 0x0097, 0, VR::SQ, VM::M1, "SubjectiveRefractionRightEyeSequence" }, { 0x0046, 0x0098, 0, VR::SQ, VM::M1, "SubjectiveRefractionLeftEyeSequence" }, { 0x0046, 0x0100, 0, VR::SQ, VM::M1, "AddNearSequence" }, { 0x0046, 0x0101, 0, VR::SQ, VM::M1, "AddIntermediateSequence" }, { 0x0046, 0x0102, 0, VR::SQ, VM::M1, "AddOtherSequence" }, { 0x0046, 0x0104, 0, VR::FD, VM::M1, "AddPower" }, { 0x0046, 0x0106, 0, VR::FD, VM::M1, "ViewingDistance" }, { 0x0046, 0x0110, 0, VR::SQ, VM::M1, "CorneaMeasurementsSequence" }, { 0x0046, 0x0111, 0, VR::SQ, VM::M1, "SourceOfCorneaMeasurementDataCodeSequence" }, { 0x0046, 0x0112, 0, VR::SQ, VM::M1, "SteepCornealAxisSequence" }, { 0x0046, 0x0113, 0, VR::SQ, VM::M1, "FlatCornealAxisSequence" }, { 0x0046, 0x0114, 0, VR::FD, VM::M1, "CornealPower" }, { 0x0046, 0x0115, 0, VR::FD, VM::M1, "CornealAxis" }, { 0x0046, 0x0116, 0, VR::SQ, VM::M1, "CorneaMeasurementMethodCodeSequence" }, { 0x0046, 0x0117, 0, VR::FL, VM::M1, "RefractiveIndexOfCornea" }, { 0x0046, 0x0118, 0, VR::FL, VM::M1, "RefractiveIndexOfAqueousHumor" }, { 0x0046, 0x0121, 0, VR::SQ, VM::M1, "VisualAcuityTypeCodeSequence" }, { 0x0046, 0x0122, 0, VR::SQ, VM::M1, "VisualAcuityRightEyeSequence" }, { 0x0046, 0x0123, 0, VR::SQ, VM::M1, "VisualAcuityLeftEyeSequence" }, { 0x0046, 0x0124, 0, VR::SQ, VM::M1, "VisualAcuityBothEyesOpenSequence" }, { 0x0046, 0x0125, 0, VR::CS, VM::M1, "ViewingDistanceType" }, { 0x0046, 0x0135, 0, VR::SS, VM::M2, "VisualAcuityModifiers" }, { 0x0046, 0x0137, 0, VR::FD, VM::M1, "DecimalVisualAcuity" }, { 0x0046, 0x0139, 0, VR::LO, VM::M1, "OptotypeDetailedDefinition" }, { 0x0046, 0x0145, 0, VR::SQ, VM::M1, "ReferencedRefractiveMeasurementsSequence" }, { 0x0046, 0x0146, 0, VR::FD, VM::M1, "SpherePower" }, { 0x0046, 0x0147, 0, VR::FD, VM::M1, "CylinderPower" }, { 0x0046, 0x0201, 0, VR::CS, VM::M1, "CornealTopographySurface" }, { 0x0046, 0x0202, 0, VR::FL, VM::M2, "CornealVertexLocation" }, { 0x0046, 0x0203, 0, VR::FL, VM::M1, "PupilCentroidXCoordinate" }, { 0x0046, 0x0204, 0, VR::FL, VM::M1, "PupilCentroidYCoordinate" }, { 0x0046, 0x0205, 0, VR::FL, VM::M1, "EquivalentPupilRadius" }, { 0x0046, 0x0207, 0, VR::SQ, VM::M1, "CornealTopographyMapTypeCodeSequence" }, { 0x0046, 0x0208, 0, VR::IS, VM::M2T2N, "VerticesOfTheOutlineOfPupil" }, { 0x0046, 0x0210, 0, VR::SQ, VM::M1, "CornealTopographyMappingNormalsSequence" }, { 0x0046, 0x0211, 0, VR::SQ, VM::M1, "MaximumCornealCurvatureSequence" }, { 0x0046, 0x0212, 0, VR::FL, VM::M1, "MaximumCornealCurvature" }, { 0x0046, 0x0213, 0, VR::FL, VM::M2, "MaximumCornealCurvatureLocation" }, { 0x0046, 0x0215, 0, VR::SQ, VM::M1, "MinimumKeratometricSequence" }, { 0x0046, 0x0218, 0, VR::SQ, VM::M1, "SimulatedKeratometricCylinderSequence" }, { 0x0046, 0x0220, 0, VR::FL, VM::M1, "AverageCornealPower" }, { 0x0046, 0x0224, 0, VR::FL, VM::M1, "CornealISValue" }, { 0x0046, 0x0227, 0, VR::FL, VM::M1, "AnalyzedArea" }, { 0x0046, 0x0230, 0, VR::FL, VM::M1, "SurfaceRegularityIndex" }, { 0x0046, 0x0232, 0, VR::FL, VM::M1, "SurfaceAsymmetryIndex" }, { 0x0046, 0x0234, 0, VR::FL, VM::M1, "CornealEccentricityIndex" }, { 0x0046, 0x0236, 0, VR::FL, VM::M1, "KeratoconusPredictionIndex" }, { 0x0046, 0x0238, 0, VR::FL, VM::M1, "DecimalPotentialVisualAcuity" }, { 0x0046, 0x0242, 0, VR::CS, VM::M1, "CornealTopographyMapQualityEvaluation" }, { 0x0046, 0x0244, 0, VR::SQ, VM::M1, "SourceImageCornealProcessedDataSequence" }, { 0x0046, 0x0247, 0, VR::FL, VM::M3, "CornealPointLocation" }, { 0x0046, 0x0248, 0, VR::CS, VM::M1, "CornealPointEstimated" }, { 0x0046, 0x0249, 0, VR::FL, VM::M1, "AxialPower" }, { 0x0046, 0x0250, 0, VR::FL, VM::M1, "TangentialPower" }, { 0x0046, 0x0251, 0, VR::FL, VM::M1, "RefractivePower" }, { 0x0046, 0x0252, 0, VR::FL, VM::M1, "RelativeElevation" }, { 0x0046, 0x0253, 0, VR::FL, VM::M1, "CornealWavefront" }, { 0x0048, 0x0001, 0, VR::FL, VM::M1, "ImagedVolumeWidth" }, { 0x0048, 0x0002, 0, VR::FL, VM::M1, "ImagedVolumeHeight" }, { 0x0048, 0x0003, 0, VR::FL, VM::M1, "ImagedVolumeDepth" }, { 0x0048, 0x0006, 0, VR::UL, VM::M1, "TotalPixelMatrixColumns" }, { 0x0048, 0x0007, 0, VR::UL, VM::M1, "TotalPixelMatrixRows" }, { 0x0048, 0x0008, 0, VR::SQ, VM::M1, "TotalPixelMatrixOriginSequence" }, { 0x0048, 0x0010, 0, VR::CS, VM::M1, "SpecimenLabelInImage" }, { 0x0048, 0x0011, 0, VR::CS, VM::M1, "FocusMethod" }, { 0x0048, 0x0012, 0, VR::CS, VM::M1, "ExtendedDepthOfField" }, { 0x0048, 0x0013, 0, VR::US, VM::M1, "NumberOfFocalPlanes" }, { 0x0048, 0x0014, 0, VR::FL, VM::M1, "DistanceBetweenFocalPlanes" }, { 0x0048, 0x0015, 0, VR::US, VM::M3, "RecommendedAbsentPixelCIELabValue" }, { 0x0048, 0x0100, 0, VR::SQ, VM::M1, "IlluminatorTypeCodeSequence" }, { 0x0048, 0x0102, 0, VR::DS, VM::M6, "ImageOrientationSlide" }, { 0x0048, 0x0105, 0, VR::SQ, VM::M1, "OpticalPathSequence" }, { 0x0048, 0x0106, 0, VR::SH, VM::M1, "OpticalPathIdentifier" }, { 0x0048, 0x0107, 0, VR::ST, VM::M1, "OpticalPathDescription" }, { 0x0048, 0x0108, 0, VR::SQ, VM::M1, "IlluminationColorCodeSequence" }, { 0x0048, 0x0110, 0, VR::SQ, VM::M1, "SpecimenReferenceSequence" }, { 0x0048, 0x0111, 0, VR::DS, VM::M1, "CondenserLensPower" }, { 0x0048, 0x0112, 0, VR::DS, VM::M1, "ObjectiveLensPower" }, { 0x0048, 0x0113, 0, VR::DS, VM::M1, "ObjectiveLensNumericalAperture" }, { 0x0048, 0x0120, 0, VR::SQ, VM::M1, "PaletteColorLookupTableSequence" }, { 0x0048, 0x0200, 0, VR::SQ, VM::M1, "ReferencedImageNavigationSequence" }, { 0x0048, 0x0201, 0, VR::US, VM::M2, "TopLeftHandCornerOfLocalizerArea" }, { 0x0048, 0x0202, 0, VR::US, VM::M2, "BottomRightHandCornerOfLocalizerArea" }, { 0x0048, 0x0207, 0, VR::SQ, VM::M1, "OpticalPathIdentificationSequence" }, { 0x0048, 0x021A, 0, VR::SQ, VM::M1, "PlanePositionSlideSequence" }, { 0x0048, 0x021E, 0, VR::SL, VM::M1, "ColumnPositionInTotalImagePixelMatrix" }, { 0x0048, 0x021F, 0, VR::SL, VM::M1, "RowPositionInTotalImagePixelMatrix" }, { 0x0048, 0x0301, 0, VR::CS, VM::M1, "PixelOriginInterpretation" }, { 0x0048, 0x0302, 0, VR::UL, VM::M1, "NumberOfOpticalPaths" }, { 0x0048, 0x0303, 0, VR::UL, VM::M1, "TotalPixelMatrixFocalPlanes" }, { 0x0050, 0x0004, 0, VR::CS, VM::M1, "CalibrationImage" }, { 0x0050, 0x0010, 0, VR::SQ, VM::M1, "DeviceSequence" }, { 0x0050, 0x0012, 0, VR::SQ, VM::M1, "ContainerComponentTypeCodeSequence" }, { 0x0050, 0x0013, 0, VR::FD, VM::M1, "ContainerComponentThickness" }, { 0x0050, 0x0014, 0, VR::DS, VM::M1, "DeviceLength" }, { 0x0050, 0x0015, 0, VR::FD, VM::M1, "ContainerComponentWidth" }, { 0x0050, 0x0016, 0, VR::DS, VM::M1, "DeviceDiameter" }, { 0x0050, 0x0017, 0, VR::CS, VM::M1, "DeviceDiameterUnits" }, { 0x0050, 0x0018, 0, VR::DS, VM::M1, "DeviceVolume" }, { 0x0050, 0x0019, 0, VR::DS, VM::M1, "InterMarkerDistance" }, { 0x0050, 0x001A, 0, VR::CS, VM::M1, "ContainerComponentMaterial" }, { 0x0050, 0x001B, 0, VR::LO, VM::M1, "ContainerComponentID" }, { 0x0050, 0x001C, 0, VR::FD, VM::M1, "ContainerComponentLength" }, { 0x0050, 0x001D, 0, VR::FD, VM::M1, "ContainerComponentDiameter" }, { 0x0050, 0x001E, 0, VR::LO, VM::M1, "ContainerComponentDescription" }, { 0x0050, 0x0020, 0, VR::LO, VM::M1, "DeviceDescription" }, { 0x0050, 0x0021, 0, VR::ST, VM::M1, "LongDeviceDescription" }, { 0x0052, 0x0001, 0, VR::FL, VM::M1, "ContrastBolusIngredientPercentByVolume" }, { 0x0052, 0x0002, 0, VR::FD, VM::M1, "OCTFocalDistance" }, { 0x0052, 0x0003, 0, VR::FD, VM::M1, "BeamSpotSize" }, { 0x0052, 0x0004, 0, VR::FD, VM::M1, "EffectiveRefractiveIndex" }, { 0x0052, 0x0006, 0, VR::CS, VM::M1, "OCTAcquisitionDomain" }, { 0x0052, 0x0007, 0, VR::FD, VM::M1, "OCTOpticalCenterWavelength" }, { 0x0052, 0x0008, 0, VR::FD, VM::M1, "AxialResolution" }, { 0x0052, 0x0009, 0, VR::FD, VM::M1, "RangingDepth" }, { 0x0052, 0x0011, 0, VR::FD, VM::M1, "ALineRate" }, { 0x0052, 0x0012, 0, VR::US, VM::M1, "ALinesPerFrame" }, { 0x0052, 0x0013, 0, VR::FD, VM::M1, "CatheterRotationalRate" }, { 0x0052, 0x0014, 0, VR::FD, VM::M1, "ALinePixelSpacing" }, { 0x0052, 0x0016, 0, VR::SQ, VM::M1, "ModeOfPercutaneousAccessSequence" }, { 0x0052, 0x0025, 0, VR::SQ, VM::M1, "IntravascularOCTFrameTypeSequence" }, { 0x0052, 0x0026, 0, VR::CS, VM::M1, "OCTZOffsetApplied" }, { 0x0052, 0x0027, 0, VR::SQ, VM::M1, "IntravascularFrameContentSequence" }, { 0x0052, 0x0028, 0, VR::FD, VM::M1, "IntravascularLongitudinalDistance" }, { 0x0052, 0x0029, 0, VR::SQ, VM::M1, "IntravascularOCTFrameContentSequence" }, { 0x0052, 0x0030, 0, VR::SS, VM::M1, "OCTZOffsetCorrection" }, { 0x0052, 0x0031, 0, VR::CS, VM::M1, "CatheterDirectionOfRotation" }, { 0x0052, 0x0033, 0, VR::FD, VM::M1, "SeamLineLocation" }, { 0x0052, 0x0034, 0, VR::FD, VM::M1, "FirstALineLocation" }, { 0x0052, 0x0036, 0, VR::US, VM::M1, "SeamLineIndex" }, { 0x0052, 0x0038, 0, VR::US, VM::M1, "NumberOfPaddedALines" }, { 0x0052, 0x0039, 0, VR::CS, VM::M1, "InterpolationType" }, { 0x0052, 0x003A, 0, VR::CS, VM::M1, "RefractiveIndexApplied" }, { 0x0054, 0x0010, 0, VR::US, VM::M1TN, "EnergyWindowVector" }, { 0x0054, 0x0011, 0, VR::US, VM::M1, "NumberOfEnergyWindows" }, { 0x0054, 0x0012, 0, VR::SQ, VM::M1, "EnergyWindowInformationSequence" }, { 0x0054, 0x0013, 0, VR::SQ, VM::M1, "EnergyWindowRangeSequence" }, { 0x0054, 0x0014, 0, VR::DS, VM::M1, "EnergyWindowLowerLimit" }, { 0x0054, 0x0015, 0, VR::DS, VM::M1, "EnergyWindowUpperLimit" }, { 0x0054, 0x0016, 0, VR::SQ, VM::M1, "RadiopharmaceuticalInformationSequence" }, { 0x0054, 0x0017, 0, VR::IS, VM::M1, "ResidualSyringeCounts" }, { 0x0054, 0x0018, 0, VR::SH, VM::M1, "EnergyWindowName" }, { 0x0054, 0x0020, 0, VR::US, VM::M1TN, "DetectorVector" }, { 0x0054, 0x0021, 0, VR::US, VM::M1, "NumberOfDetectors" }, { 0x0054, 0x0022, 0, VR::SQ, VM::M1, "DetectorInformationSequence" }, { 0x0054, 0x0030, 0, VR::US, VM::M1TN, "PhaseVector" }, { 0x0054, 0x0031, 0, VR::US, VM::M1, "NumberOfPhases" }, { 0x0054, 0x0032, 0, VR::SQ, VM::M1, "PhaseInformationSequence" }, { 0x0054, 0x0033, 0, VR::US, VM::M1, "NumberOfFramesInPhase" }, { 0x0054, 0x0036, 0, VR::IS, VM::M1, "PhaseDelay" }, { 0x0054, 0x0038, 0, VR::IS, VM::M1, "PauseBetweenFrames" }, { 0x0054, 0x0039, 0, VR::CS, VM::M1, "PhaseDescription" }, { 0x0054, 0x0050, 0, VR::US, VM::M1TN, "RotationVector" }, { 0x0054, 0x0051, 0, VR::US, VM::M1, "NumberOfRotations" }, { 0x0054, 0x0052, 0, VR::SQ, VM::M1, "RotationInformationSequence" }, { 0x0054, 0x0053, 0, VR::US, VM::M1, "NumberOfFramesInRotation" }, { 0x0054, 0x0060, 0, VR::US, VM::M1TN, "RRIntervalVector" }, { 0x0054, 0x0061, 0, VR::US, VM::M1, "NumberOfRRIntervals" }, { 0x0054, 0x0062, 0, VR::SQ, VM::M1, "GatedInformationSequence" }, { 0x0054, 0x0063, 0, VR::SQ, VM::M1, "DataInformationSequence" }, { 0x0054, 0x0070, 0, VR::US, VM::M1TN, "TimeSlotVector" }, { 0x0054, 0x0071, 0, VR::US, VM::M1, "NumberOfTimeSlots" }, { 0x0054, 0x0072, 0, VR::SQ, VM::M1, "TimeSlotInformationSequence" }, { 0x0054, 0x0073, 0, VR::DS, VM::M1, "TimeSlotTime" }, { 0x0054, 0x0080, 0, VR::US, VM::M1TN, "SliceVector" }, { 0x0054, 0x0081, 0, VR::US, VM::M1, "NumberOfSlices" }, { 0x0054, 0x0090, 0, VR::US, VM::M1TN, "AngularViewVector" }, { 0x0054, 0x0100, 0, VR::US, VM::M1TN, "TimeSliceVector" }, { 0x0054, 0x0101, 0, VR::US, VM::M1, "NumberOfTimeSlices" }, { 0x0054, 0x0200, 0, VR::DS, VM::M1, "StartAngle" }, { 0x0054, 0x0202, 0, VR::CS, VM::M1, "TypeOfDetectorMotion" }, { 0x0054, 0x0210, 0, VR::IS, VM::M1TN, "TriggerVector" }, { 0x0054, 0x0211, 0, VR::US, VM::M1, "NumberOfTriggersInPhase" }, { 0x0054, 0x0220, 0, VR::SQ, VM::M1, "ViewCodeSequence" }, { 0x0054, 0x0222, 0, VR::SQ, VM::M1, "ViewModifierCodeSequence" }, { 0x0054, 0x0300, 0, VR::SQ, VM::M1, "RadionuclideCodeSequence" }, { 0x0054, 0x0302, 0, VR::SQ, VM::M1, "AdministrationRouteCodeSequence" }, { 0x0054, 0x0304, 0, VR::SQ, VM::M1, "RadiopharmaceuticalCodeSequence" }, { 0x0054, 0x0306, 0, VR::SQ, VM::M1, "CalibrationDataSequence" }, { 0x0054, 0x0308, 0, VR::US, VM::M1, "EnergyWindowNumber" }, { 0x0054, 0x0400, 0, VR::SH, VM::M1, "ImageID" }, { 0x0054, 0x0410, 0, VR::SQ, VM::M1, "PatientOrientationCodeSequence" }, { 0x0054, 0x0412, 0, VR::SQ, VM::M1, "PatientOrientationModifierCodeSequence" }, { 0x0054, 0x0414, 0, VR::SQ, VM::M1, "PatientGantryRelationshipCodeSequence" }, { 0x0054, 0x0500, 0, VR::CS, VM::M1, "SliceProgressionDirection" }, { 0x0054, 0x0501, 0, VR::CS, VM::M1, "ScanProgressionDirection" }, { 0x0054, 0x1000, 0, VR::CS, VM::M2, "SeriesType" }, { 0x0054, 0x1001, 0, VR::CS, VM::M1, "Units" }, { 0x0054, 0x1002, 0, VR::CS, VM::M1, "CountsSource" }, { 0x0054, 0x1004, 0, VR::CS, VM::M1, "ReprojectionMethod" }, { 0x0054, 0x1006, 0, VR::CS, VM::M1, "SUVType" }, { 0x0054, 0x1100, 0, VR::CS, VM::M1, "RandomsCorrectionMethod" }, { 0x0054, 0x1101, 0, VR::LO, VM::M1, "AttenuationCorrectionMethod" }, { 0x0054, 0x1102, 0, VR::CS, VM::M1, "DecayCorrection" }, { 0x0054, 0x1103, 0, VR::LO, VM::M1, "ReconstructionMethod" }, { 0x0054, 0x1104, 0, VR::LO, VM::M1, "DetectorLinesOfResponseUsed" }, { 0x0054, 0x1105, 0, VR::LO, VM::M1, "ScatterCorrectionMethod" }, { 0x0054, 0x1200, 0, VR::DS, VM::M1, "AxialAcceptance" }, { 0x0054, 0x1201, 0, VR::IS, VM::M2, "AxialMash" }, { 0x0054, 0x1202, 0, VR::IS, VM::M1, "TransverseMash" }, { 0x0054, 0x1203, 0, VR::DS, VM::M2, "DetectorElementSize" }, { 0x0054, 0x1210, 0, VR::DS, VM::M1, "CoincidenceWindowWidth" }, { 0x0054, 0x1220, 0, VR::CS, VM::M1TN, "SecondaryCountsType" }, { 0x0054, 0x1300, 0, VR::DS, VM::M1, "FrameReferenceTime" }, { 0x0054, 0x1310, 0, VR::IS, VM::M1, "PrimaryPromptsCountsAccumulated" }, { 0x0054, 0x1311, 0, VR::IS, VM::M1TN, "SecondaryCountsAccumulated" }, { 0x0054, 0x1320, 0, VR::DS, VM::M1, "SliceSensitivityFactor" }, { 0x0054, 0x1321, 0, VR::DS, VM::M1, "DecayFactor" }, { 0x0054, 0x1322, 0, VR::DS, VM::M1, "DoseCalibrationFactor" }, { 0x0054, 0x1323, 0, VR::DS, VM::M1, "ScatterFractionFactor" }, { 0x0054, 0x1324, 0, VR::DS, VM::M1, "DeadTimeFactor" }, { 0x0054, 0x1330, 0, VR::US, VM::M1, "ImageIndex" }, { 0x0054, 0x1400, 1, VR::CS, VM::M1TN, "CountsIncluded" }, { 0x0054, 0x1401, 1, VR::CS, VM::M1, "DeadTimeCorrectionFlag" }, { 0x0060, 0x3000, 0, VR::SQ, VM::M1, "HistogramSequence" }, { 0x0060, 0x3002, 0, VR::US, VM::M1, "HistogramNumberOfBins" }, { 0x0060, 0x3004, 0, VR::XS, VM::M1, "HistogramFirstBinValue" }, { 0x0060, 0x3006, 0, VR::XS, VM::M1, "HistogramLastBinValue" }, { 0x0060, 0x3008, 0, VR::US, VM::M1, "HistogramBinWidth" }, { 0x0060, 0x3010, 0, VR::LO, VM::M1, "HistogramExplanation" }, { 0x0060, 0x3020, 0, VR::UL, VM::M1TN, "HistogramData" }, { 0x0062, 0x0001, 0, VR::CS, VM::M1, "SegmentationType" }, { 0x0062, 0x0002, 0, VR::SQ, VM::M1, "SegmentSequence" }, { 0x0062, 0x0003, 0, VR::SQ, VM::M1, "SegmentedPropertyCategoryCodeSequence" }, { 0x0062, 0x0004, 0, VR::US, VM::M1, "SegmentNumber" }, { 0x0062, 0x0005, 0, VR::LO, VM::M1, "SegmentLabel" }, { 0x0062, 0x0006, 0, VR::ST, VM::M1, "SegmentDescription" }, { 0x0062, 0x0007, 0, VR::SQ, VM::M1, "SegmentationAlgorithmIdentificationSequence" }, { 0x0062, 0x0008, 0, VR::CS, VM::M1, "SegmentAlgorithmType" }, { 0x0062, 0x0009, 0, VR::LO, VM::M1, "SegmentAlgorithmName" }, { 0x0062, 0x000A, 0, VR::SQ, VM::M1, "SegmentIdentificationSequence" }, { 0x0062, 0x000B, 0, VR::US, VM::M1TN, "ReferencedSegmentNumber" }, { 0x0062, 0x000C, 0, VR::US, VM::M1, "RecommendedDisplayGrayscaleValue" }, { 0x0062, 0x000D, 0, VR::US, VM::M3, "RecommendedDisplayCIELabValue" }, { 0x0062, 0x000E, 0, VR::US, VM::M1, "MaximumFractionalValue" }, { 0x0062, 0x000F, 0, VR::SQ, VM::M1, "SegmentedPropertyTypeCodeSequence" }, { 0x0062, 0x0010, 0, VR::CS, VM::M1, "SegmentationFractionalType" }, { 0x0062, 0x0011, 0, VR::SQ, VM::M1, "SegmentedPropertyTypeModifierCodeSequence" }, { 0x0062, 0x0012, 0, VR::SQ, VM::M1, "UsedSegmentsSequence" }, { 0x0062, 0x0013, 0, VR::CS, VM::M1, "SegmentsOverlap" }, { 0x0062, 0x0020, 0, VR::UT, VM::M1, "TrackingID" }, { 0x0062, 0x0021, 0, VR::UI, VM::M1, "TrackingUID" }, { 0x0064, 0x0002, 0, VR::SQ, VM::M1, "DeformableRegistrationSequence" }, { 0x0064, 0x0003, 0, VR::UI, VM::M1, "SourceFrameOfReferenceUID" }, { 0x0064, 0x0005, 0, VR::SQ, VM::M1, "DeformableRegistrationGridSequence" }, { 0x0064, 0x0007, 0, VR::UL, VM::M3, "GridDimensions" }, { 0x0064, 0x0008, 0, VR::FD, VM::M3, "GridResolution" }, { 0x0064, 0x0009, 0, VR::OF, VM::M1, "VectorGridData" }, { 0x0064, 0x000F, 0, VR::SQ, VM::M1, "PreDeformationMatrixRegistrationSequence" }, { 0x0064, 0x0010, 0, VR::SQ, VM::M1, "PostDeformationMatrixRegistrationSequence" }, { 0x0066, 0x0001, 0, VR::UL, VM::M1, "NumberOfSurfaces" }, { 0x0066, 0x0002, 0, VR::SQ, VM::M1, "SurfaceSequence" }, { 0x0066, 0x0003, 0, VR::UL, VM::M1, "SurfaceNumber" }, { 0x0066, 0x0004, 0, VR::LT, VM::M1, "SurfaceComments" }, { 0x0066, 0x0009, 0, VR::CS, VM::M1, "SurfaceProcessing" }, { 0x0066, 0x000A, 0, VR::FL, VM::M1, "SurfaceProcessingRatio" }, { 0x0066, 0x000B, 0, VR::LO, VM::M1, "SurfaceProcessingDescription" }, { 0x0066, 0x000C, 0, VR::FL, VM::M1, "RecommendedPresentationOpacity" }, { 0x0066, 0x000D, 0, VR::CS, VM::M1, "RecommendedPresentationType" }, { 0x0066, 0x000E, 0, VR::CS, VM::M1, "FiniteVolume" }, { 0x0066, 0x0010, 0, VR::CS, VM::M1, "Manifold" }, { 0x0066, 0x0011, 0, VR::SQ, VM::M1, "SurfacePointsSequence" }, { 0x0066, 0x0012, 0, VR::SQ, VM::M1, "SurfacePointsNormalsSequence" }, { 0x0066, 0x0013, 0, VR::SQ, VM::M1, "SurfaceMeshPrimitivesSequence" }, { 0x0066, 0x0015, 0, VR::UL, VM::M1, "NumberOfSurfacePoints" }, { 0x0066, 0x0016, 0, VR::OF, VM::M1, "PointCoordinatesData" }, { 0x0066, 0x0017, 0, VR::FL, VM::M3, "PointPositionAccuracy" }, { 0x0066, 0x0018, 0, VR::FL, VM::M1, "MeanPointDistance" }, { 0x0066, 0x0019, 0, VR::FL, VM::M1, "MaximumPointDistance" }, { 0x0066, 0x001A, 0, VR::FL, VM::M6, "PointsBoundingBoxCoordinates" }, { 0x0066, 0x001B, 0, VR::FL, VM::M3, "AxisOfRotation" }, { 0x0066, 0x001C, 0, VR::FL, VM::M3, "CenterOfRotation" }, { 0x0066, 0x001E, 0, VR::UL, VM::M1, "NumberOfVectors" }, { 0x0066, 0x001F, 0, VR::US, VM::M1, "VectorDimensionality" }, { 0x0066, 0x0020, 0, VR::FL, VM::M1TN, "VectorAccuracy" }, { 0x0066, 0x0021, 0, VR::OF, VM::M1, "VectorCoordinateData" }, { 0x0066, 0x0023, 1, VR::OW, VM::M1, "TrianglePointIndexList" }, { 0x0066, 0x0024, 1, VR::OW, VM::M1, "EdgePointIndexList" }, { 0x0066, 0x0025, 1, VR::OW, VM::M1, "VertexPointIndexList" }, { 0x0066, 0x0026, 0, VR::SQ, VM::M1, "TriangleStripSequence" }, { 0x0066, 0x0027, 0, VR::SQ, VM::M1, "TriangleFanSequence" }, { 0x0066, 0x0028, 0, VR::SQ, VM::M1, "LineSequence" }, { 0x0066, 0x0029, 1, VR::OW, VM::M1, "PrimitivePointIndexList" }, { 0x0066, 0x002A, 0, VR::UL, VM::M1, "SurfaceCount" }, { 0x0066, 0x002B, 0, VR::SQ, VM::M1, "ReferencedSurfaceSequence" }, { 0x0066, 0x002C, 0, VR::UL, VM::M1, "ReferencedSurfaceNumber" }, { 0x0066, 0x002D, 0, VR::SQ, VM::M1, "SegmentSurfaceGenerationAlgorithmIdentificationSequence" }, { 0x0066, 0x002E, 0, VR::SQ, VM::M1, "SegmentSurfaceSourceInstanceSequence" }, { 0x0066, 0x002F, 0, VR::SQ, VM::M1, "AlgorithmFamilyCodeSequence" }, { 0x0066, 0x0030, 0, VR::SQ, VM::M1, "AlgorithmNameCodeSequence" }, { 0x0066, 0x0031, 0, VR::LO, VM::M1, "AlgorithmVersion" }, { 0x0066, 0x0032, 0, VR::LT, VM::M1, "AlgorithmParameters" }, { 0x0066, 0x0034, 0, VR::SQ, VM::M1, "FacetSequence" }, { 0x0066, 0x0035, 0, VR::SQ, VM::M1, "SurfaceProcessingAlgorithmIdentificationSequence" }, { 0x0066, 0x0036, 0, VR::LO, VM::M1, "AlgorithmName" }, { 0x0066, 0x0037, 0, VR::FL, VM::M1, "RecommendedPointRadius" }, { 0x0066, 0x0038, 0, VR::FL, VM::M1, "RecommendedLineThickness" }, { 0x0066, 0x0040, 0, VR::OL, VM::M1, "LongPrimitivePointIndexList" }, { 0x0066, 0x0041, 0, VR::OL, VM::M1, "LongTrianglePointIndexList" }, { 0x0066, 0x0042, 0, VR::OL, VM::M1, "LongEdgePointIndexList" }, { 0x0066, 0x0043, 0, VR::OL, VM::M1, "LongVertexPointIndexList" }, { 0x0066, 0x0101, 0, VR::SQ, VM::M1, "TrackSetSequence" }, { 0x0066, 0x0102, 0, VR::SQ, VM::M1, "TrackSequence" }, { 0x0066, 0x0103, 0, VR::OW, VM::M1, "RecommendedDisplayCIELabValueList" }, { 0x0066, 0x0104, 0, VR::SQ, VM::M1, "TrackingAlgorithmIdentificationSequence" }, { 0x0066, 0x0105, 0, VR::UL, VM::M1, "TrackSetNumber" }, { 0x0066, 0x0106, 0, VR::LO, VM::M1, "TrackSetLabel" }, { 0x0066, 0x0107, 0, VR::UT, VM::M1, "TrackSetDescription" }, { 0x0066, 0x0108, 0, VR::SQ, VM::M1, "TrackSetAnatomicalTypeCodeSequence" }, { 0x0066, 0x0121, 0, VR::SQ, VM::M1, "MeasurementsSequence" }, { 0x0066, 0x0124, 0, VR::SQ, VM::M1, "TrackSetStatisticsSequence" }, { 0x0066, 0x0125, 0, VR::OF, VM::M1, "FloatingPointValues" }, { 0x0066, 0x0129, 0, VR::OL, VM::M1, "TrackPointIndexList" }, { 0x0066, 0x0130, 0, VR::SQ, VM::M1, "TrackStatisticsSequence" }, { 0x0066, 0x0132, 0, VR::SQ, VM::M1, "MeasurementValuesSequence" }, { 0x0066, 0x0133, 0, VR::SQ, VM::M1, "DiffusionAcquisitionCodeSequence" }, { 0x0066, 0x0134, 0, VR::SQ, VM::M1, "DiffusionModelCodeSequence" }, { 0x0068, 0x6210, 0, VR::LO, VM::M1, "ImplantSize" }, { 0x0068, 0x6221, 0, VR::LO, VM::M1, "ImplantTemplateVersion" }, { 0x0068, 0x6222, 0, VR::SQ, VM::M1, "ReplacedImplantTemplateSequence" }, { 0x0068, 0x6223, 0, VR::CS, VM::M1, "ImplantType" }, { 0x0068, 0x6224, 0, VR::SQ, VM::M1, "DerivationImplantTemplateSequence" }, { 0x0068, 0x6225, 0, VR::SQ, VM::M1, "OriginalImplantTemplateSequence" }, { 0x0068, 0x6226, 0, VR::DT, VM::M1, "EffectiveDateTime" }, { 0x0068, 0x6230, 0, VR::SQ, VM::M1, "ImplantTargetAnatomySequence" }, { 0x0068, 0x6260, 0, VR::SQ, VM::M1, "InformationFromManufacturerSequence" }, { 0x0068, 0x6265, 0, VR::SQ, VM::M1, "NotificationFromManufacturerSequence" }, { 0x0068, 0x6270, 0, VR::DT, VM::M1, "InformationIssueDateTime" }, { 0x0068, 0x6280, 0, VR::ST, VM::M1, "InformationSummary" }, { 0x0068, 0x62A0, 0, VR::SQ, VM::M1, "ImplantRegulatoryDisapprovalCodeSequence" }, { 0x0068, 0x62A5, 0, VR::FD, VM::M1, "OverallTemplateSpatialTolerance" }, { 0x0068, 0x62C0, 0, VR::SQ, VM::M1, "HPGLDocumentSequence" }, { 0x0068, 0x62D0, 0, VR::US, VM::M1, "HPGLDocumentID" }, { 0x0068, 0x62D5, 0, VR::LO, VM::M1, "HPGLDocumentLabel" }, { 0x0068, 0x62E0, 0, VR::SQ, VM::M1, "ViewOrientationCodeSequence" }, { 0x0068, 0x62F0, 0, VR::SQ, VM::M1, "ViewOrientationModifierCodeSequence" }, { 0x0068, 0x62F2, 0, VR::FD, VM::M1, "HPGLDocumentScaling" }, { 0x0068, 0x6300, 0, VR::OB, VM::M1, "HPGLDocument" }, { 0x0068, 0x6310, 0, VR::US, VM::M1, "HPGLContourPenNumber" }, { 0x0068, 0x6320, 0, VR::SQ, VM::M1, "HPGLPenSequence" }, { 0x0068, 0x6330, 0, VR::US, VM::M1, "HPGLPenNumber" }, { 0x0068, 0x6340, 0, VR::LO, VM::M1, "HPGLPenLabel" }, { 0x0068, 0x6345, 0, VR::ST, VM::M1, "HPGLPenDescription" }, { 0x0068, 0x6346, 0, VR::FD, VM::M2, "RecommendedRotationPoint" }, { 0x0068, 0x6347, 0, VR::FD, VM::M4, "BoundingRectangle" }, { 0x0068, 0x6350, 0, VR::US, VM::M1TN, "ImplantTemplate3DModelSurfaceNumber" }, { 0x0068, 0x6360, 0, VR::SQ, VM::M1, "SurfaceModelDescriptionSequence" }, { 0x0068, 0x6380, 0, VR::LO, VM::M1, "SurfaceModelLabel" }, { 0x0068, 0x6390, 0, VR::FD, VM::M1, "SurfaceModelScalingFactor" }, { 0x0068, 0x63A0, 0, VR::SQ, VM::M1, "MaterialsCodeSequence" }, { 0x0068, 0x63A4, 0, VR::SQ, VM::M1, "CoatingMaterialsCodeSequence" }, { 0x0068, 0x63A8, 0, VR::SQ, VM::M1, "ImplantTypeCodeSequence" }, { 0x0068, 0x63AC, 0, VR::SQ, VM::M1, "FixationMethodCodeSequence" }, { 0x0068, 0x63B0, 0, VR::SQ, VM::M1, "MatingFeatureSetsSequence" }, { 0x0068, 0x63C0, 0, VR::US, VM::M1, "MatingFeatureSetID" }, { 0x0068, 0x63D0, 0, VR::LO, VM::M1, "MatingFeatureSetLabel" }, { 0x0068, 0x63E0, 0, VR::SQ, VM::M1, "MatingFeatureSequence" }, { 0x0068, 0x63F0, 0, VR::US, VM::M1, "MatingFeatureID" }, { 0x0068, 0x6400, 0, VR::SQ, VM::M1, "MatingFeatureDegreeOfFreedomSequence" }, { 0x0068, 0x6410, 0, VR::US, VM::M1, "DegreeOfFreedomID" }, { 0x0068, 0x6420, 0, VR::CS, VM::M1, "DegreeOfFreedomType" }, { 0x0068, 0x6430, 0, VR::SQ, VM::M1, "TwoDMatingFeatureCoordinatesSequence" }, { 0x0068, 0x6440, 0, VR::US, VM::M1, "ReferencedHPGLDocumentID" }, { 0x0068, 0x6450, 0, VR::FD, VM::M2, "TwoDMatingPoint" }, { 0x0068, 0x6460, 0, VR::FD, VM::M4, "TwoDMatingAxes" }, { 0x0068, 0x6470, 0, VR::SQ, VM::M1, "TwoDDegreeOfFreedomSequence" }, { 0x0068, 0x6490, 0, VR::FD, VM::M3, "ThreeDDegreeOfFreedomAxis" }, { 0x0068, 0x64A0, 0, VR::FD, VM::M2, "RangeOfFreedom" }, { 0x0068, 0x64C0, 0, VR::FD, VM::M3, "ThreeDMatingPoint" }, { 0x0068, 0x64D0, 0, VR::FD, VM::M9, "ThreeDMatingAxes" }, { 0x0068, 0x64F0, 0, VR::FD, VM::M3, "TwoDDegreeOfFreedomAxis" }, { 0x0068, 0x6500, 0, VR::SQ, VM::M1, "PlanningLandmarkPointSequence" }, { 0x0068, 0x6510, 0, VR::SQ, VM::M1, "PlanningLandmarkLineSequence" }, { 0x0068, 0x6520, 0, VR::SQ, VM::M1, "PlanningLandmarkPlaneSequence" }, { 0x0068, 0x6530, 0, VR::US, VM::M1, "PlanningLandmarkID" }, { 0x0068, 0x6540, 0, VR::LO, VM::M1, "PlanningLandmarkDescription" }, { 0x0068, 0x6545, 0, VR::SQ, VM::M1, "PlanningLandmarkIdentificationCodeSequence" }, { 0x0068, 0x6550, 0, VR::SQ, VM::M1, "TwoDPointCoordinatesSequence" }, { 0x0068, 0x6560, 0, VR::FD, VM::M2, "TwoDPointCoordinates" }, { 0x0068, 0x6590, 0, VR::FD, VM::M3, "ThreeDPointCoordinates" }, { 0x0068, 0x65A0, 0, VR::SQ, VM::M1, "TwoDLineCoordinatesSequence" }, { 0x0068, 0x65B0, 0, VR::FD, VM::M4, "TwoDLineCoordinates" }, { 0x0068, 0x65D0, 0, VR::FD, VM::M6, "ThreeDLineCoordinates" }, { 0x0068, 0x65E0, 0, VR::SQ, VM::M1, "TwoDPlaneCoordinatesSequence" }, { 0x0068, 0x65F0, 0, VR::FD, VM::M4, "TwoDPlaneIntersection" }, { 0x0068, 0x6610, 0, VR::FD, VM::M3, "ThreeDPlaneOrigin" }, { 0x0068, 0x6620, 0, VR::FD, VM::M3, "ThreeDPlaneNormal" }, { 0x0068, 0x7001, 0, VR::CS, VM::M1, "ModelModification" }, { 0x0068, 0x7002, 0, VR::CS, VM::M1, "ModelMirroring" }, { 0x0068, 0x7003, 0, VR::SQ, VM::M1, "ModelUsageCodeSequence" }, { 0x0070, 0x0001, 0, VR::SQ, VM::M1, "GraphicAnnotationSequence" }, { 0x0070, 0x0002, 0, VR::CS, VM::M1, "GraphicLayer" }, { 0x0070, 0x0003, 0, VR::CS, VM::M1, "BoundingBoxAnnotationUnits" }, { 0x0070, 0x0004, 0, VR::CS, VM::M1, "AnchorPointAnnotationUnits" }, { 0x0070, 0x0005, 0, VR::CS, VM::M1, "GraphicAnnotationUnits" }, { 0x0070, 0x0006, 0, VR::ST, VM::M1, "UnformattedTextValue" }, { 0x0070, 0x0008, 0, VR::SQ, VM::M1, "TextObjectSequence" }, { 0x0070, 0x0009, 0, VR::SQ, VM::M1, "GraphicObjectSequence" }, { 0x0070, 0x0010, 0, VR::FL, VM::M2, "BoundingBoxTopLeftHandCorner" }, { 0x0070, 0x0011, 0, VR::FL, VM::M2, "BoundingBoxBottomRightHandCorner" }, { 0x0070, 0x0012, 0, VR::CS, VM::M1, "BoundingBoxTextHorizontalJustification" }, { 0x0070, 0x0014, 0, VR::FL, VM::M2, "AnchorPoint" }, { 0x0070, 0x0015, 0, VR::CS, VM::M1, "AnchorPointVisibility" }, { 0x0070, 0x0020, 0, VR::US, VM::M1, "GraphicDimensions" }, { 0x0070, 0x0021, 0, VR::US, VM::M1, "NumberOfGraphicPoints" }, { 0x0070, 0x0022, 0, VR::FL, VM::M2TN, "GraphicData" }, { 0x0070, 0x0023, 0, VR::CS, VM::M1, "GraphicType" }, { 0x0070, 0x0024, 0, VR::CS, VM::M1, "GraphicFilled" }, { 0x0070, 0x0040, 1, VR::IS, VM::M1, "ImageRotationRetired" }, { 0x0070, 0x0041, 0, VR::CS, VM::M1, "ImageHorizontalFlip" }, { 0x0070, 0x0042, 0, VR::US, VM::M1, "ImageRotation" }, { 0x0070, 0x0050, 1, VR::US, VM::M2, "DisplayedAreaTopLeftHandCornerTrial" }, { 0x0070, 0x0051, 1, VR::US, VM::M2, "DisplayedAreaBottomRightHandCornerTrial" }, { 0x0070, 0x0052, 0, VR::SL, VM::M2, "DisplayedAreaTopLeftHandCorner" }, { 0x0070, 0x0053, 0, VR::SL, VM::M2, "DisplayedAreaBottomRightHandCorner" }, { 0x0070, 0x005A, 0, VR::SQ, VM::M1, "DisplayedAreaSelectionSequence" }, { 0x0070, 0x0060, 0, VR::SQ, VM::M1, "GraphicLayerSequence" }, { 0x0070, 0x0062, 0, VR::IS, VM::M1, "GraphicLayerOrder" }, { 0x0070, 0x0066, 0, VR::US, VM::M1, "GraphicLayerRecommendedDisplayGrayscaleValue" }, { 0x0070, 0x0067, 1, VR::US, VM::M3, "GraphicLayerRecommendedDisplayRGBValue" }, { 0x0070, 0x0068, 0, VR::LO, VM::M1, "GraphicLayerDescription" }, { 0x0070, 0x0080, 0, VR::CS, VM::M1, "ContentLabel" }, { 0x0070, 0x0081, 0, VR::LO, VM::M1, "ContentDescription" }, { 0x0070, 0x0082, 0, VR::DA, VM::M1, "PresentationCreationDate" }, { 0x0070, 0x0083, 0, VR::TM, VM::M1, "PresentationCreationTime" }, { 0x0070, 0x0084, 0, VR::PN, VM::M1, "ContentCreatorName" }, { 0x0070, 0x0086, 0, VR::SQ, VM::M1, "ContentCreatorIdentificationCodeSequence" }, { 0x0070, 0x0087, 0, VR::SQ, VM::M1, "AlternateContentDescriptionSequence" }, { 0x0070, 0x0100, 0, VR::CS, VM::M1, "PresentationSizeMode" }, { 0x0070, 0x0101, 0, VR::DS, VM::M2, "PresentationPixelSpacing" }, { 0x0070, 0x0102, 0, VR::IS, VM::M2, "PresentationPixelAspectRatio" }, { 0x0070, 0x0103, 0, VR::FL, VM::M1, "PresentationPixelMagnificationRatio" }, { 0x0070, 0x0207, 0, VR::LO, VM::M1, "GraphicGroupLabel" }, { 0x0070, 0x0208, 0, VR::ST, VM::M1, "GraphicGroupDescription" }, { 0x0070, 0x0209, 0, VR::SQ, VM::M1, "CompoundGraphicSequence" }, { 0x0070, 0x0226, 0, VR::UL, VM::M1, "CompoundGraphicInstanceID" }, { 0x0070, 0x0227, 0, VR::LO, VM::M1, "FontName" }, { 0x0070, 0x0228, 0, VR::CS, VM::M1, "FontNameType" }, { 0x0070, 0x0229, 0, VR::LO, VM::M1, "CSSFontName" }, { 0x0070, 0x0230, 0, VR::FD, VM::M1, "RotationAngle" }, { 0x0070, 0x0231, 0, VR::SQ, VM::M1, "TextStyleSequence" }, { 0x0070, 0x0232, 0, VR::SQ, VM::M1, "LineStyleSequence" }, { 0x0070, 0x0233, 0, VR::SQ, VM::M1, "FillStyleSequence" }, { 0x0070, 0x0234, 0, VR::SQ, VM::M1, "GraphicGroupSequence" }, { 0x0070, 0x0241, 0, VR::US, VM::M3, "TextColorCIELabValue" }, { 0x0070, 0x0242, 0, VR::CS, VM::M1, "HorizontalAlignment" }, { 0x0070, 0x0243, 0, VR::CS, VM::M1, "VerticalAlignment" }, { 0x0070, 0x0244, 0, VR::CS, VM::M1, "ShadowStyle" }, { 0x0070, 0x0245, 0, VR::FL, VM::M1, "ShadowOffsetX" }, { 0x0070, 0x0246, 0, VR::FL, VM::M1, "ShadowOffsetY" }, { 0x0070, 0x0247, 0, VR::US, VM::M3, "ShadowColorCIELabValue" }, { 0x0070, 0x0248, 0, VR::CS, VM::M1, "Underlined" }, { 0x0070, 0x0249, 0, VR::CS, VM::M1, "Bold" }, { 0x0070, 0x0250, 0, VR::CS, VM::M1, "Italic" }, { 0x0070, 0x0251, 0, VR::US, VM::M3, "PatternOnColorCIELabValue" }, { 0x0070, 0x0252, 0, VR::US, VM::M3, "PatternOffColorCIELabValue" }, { 0x0070, 0x0253, 0, VR::FL, VM::M1, "LineThickness" }, { 0x0070, 0x0254, 0, VR::CS, VM::M1, "LineDashingStyle" }, { 0x0070, 0x0255, 0, VR::UL, VM::M1, "LinePattern" }, { 0x0070, 0x0256, 0, VR::OB, VM::M1, "FillPattern" }, { 0x0070, 0x0257, 0, VR::CS, VM::M1, "FillMode" }, { 0x0070, 0x0258, 0, VR::FL, VM::M1, "ShadowOpacity" }, { 0x0070, 0x0261, 0, VR::FL, VM::M1, "GapLength" }, { 0x0070, 0x0262, 0, VR::FL, VM::M1, "DiameterOfVisibility" }, { 0x0070, 0x0273, 0, VR::FL, VM::M2, "RotationPoint" }, { 0x0070, 0x0274, 0, VR::CS, VM::M1, "TickAlignment" }, { 0x0070, 0x0278, 0, VR::CS, VM::M1, "ShowTickLabel" }, { 0x0070, 0x0279, 0, VR::CS, VM::M1, "TickLabelAlignment" }, { 0x0070, 0x0282, 0, VR::CS, VM::M1, "CompoundGraphicUnits" }, { 0x0070, 0x0284, 0, VR::FL, VM::M1, "PatternOnOpacity" }, { 0x0070, 0x0285, 0, VR::FL, VM::M1, "PatternOffOpacity" }, { 0x0070, 0x0287, 0, VR::SQ, VM::M1, "MajorTicksSequence" }, { 0x0070, 0x0288, 0, VR::FL, VM::M1, "TickPosition" }, { 0x0070, 0x0289, 0, VR::SH, VM::M1, "TickLabel" }, { 0x0070, 0x0294, 0, VR::CS, VM::M1, "CompoundGraphicType" }, { 0x0070, 0x0295, 0, VR::UL, VM::M1, "GraphicGroupID" }, { 0x0070, 0x0306, 0, VR::CS, VM::M1, "ShapeType" }, { 0x0070, 0x0308, 0, VR::SQ, VM::M1, "RegistrationSequence" }, { 0x0070, 0x0309, 0, VR::SQ, VM::M1, "MatrixRegistrationSequence" }, { 0x0070, 0x030A, 0, VR::SQ, VM::M1, "MatrixSequence" }, { 0x0070, 0x030B, 0, VR::FD, VM::M16, "FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix" }, { 0x0070, 0x030C, 0, VR::CS, VM::M1, "FrameOfReferenceTransformationMatrixType" }, { 0x0070, 0x030D, 0, VR::SQ, VM::M1, "RegistrationTypeCodeSequence" }, { 0x0070, 0x030F, 0, VR::ST, VM::M1, "FiducialDescription" }, { 0x0070, 0x0310, 0, VR::SH, VM::M1, "FiducialIdentifier" }, { 0x0070, 0x0311, 0, VR::SQ, VM::M1, "FiducialIdentifierCodeSequence" }, { 0x0070, 0x0312, 0, VR::FD, VM::M1, "ContourUncertaintyRadius" }, { 0x0070, 0x0314, 0, VR::SQ, VM::M1, "UsedFiducialsSequence" }, { 0x0070, 0x0318, 0, VR::SQ, VM::M1, "GraphicCoordinatesDataSequence" }, { 0x0070, 0x031A, 0, VR::UI, VM::M1, "FiducialUID" }, { 0x0070, 0x031B, 0, VR::UI, VM::M1, "ReferencedFiducialUID" }, { 0x0070, 0x031C, 0, VR::SQ, VM::M1, "FiducialSetSequence" }, { 0x0070, 0x031E, 0, VR::SQ, VM::M1, "FiducialSequence" }, { 0x0070, 0x031F, 0, VR::SQ, VM::M1, "FiducialsPropertyCategoryCodeSequence" }, { 0x0070, 0x0401, 0, VR::US, VM::M3, "GraphicLayerRecommendedDisplayCIELabValue" }, { 0x0070, 0x0402, 0, VR::SQ, VM::M1, "BlendingSequence" }, { 0x0070, 0x0403, 0, VR::FL, VM::M1, "RelativeOpacity" }, { 0x0070, 0x0404, 0, VR::SQ, VM::M1, "ReferencedSpatialRegistrationSequence" }, { 0x0070, 0x0405, 0, VR::CS, VM::M1, "BlendingPosition" }, { 0x0070, 0x1101, 0, VR::UI, VM::M1, "PresentationDisplayCollectionUID" }, { 0x0070, 0x1102, 0, VR::UI, VM::M1, "PresentationSequenceCollectionUID" }, { 0x0070, 0x1103, 0, VR::US, VM::M1, "PresentationSequencePositionIndex" }, { 0x0070, 0x1104, 0, VR::SQ, VM::M1, "RenderedImageReferenceSequence" }, { 0x0070, 0x1201, 0, VR::SQ, VM::M1, "VolumetricPresentationStateInputSequence" }, { 0x0070, 0x1202, 0, VR::CS, VM::M1, "PresentationInputType" }, { 0x0070, 0x1203, 0, VR::US, VM::M1, "InputSequencePositionIndex" }, { 0x0070, 0x1204, 0, VR::CS, VM::M1, "Crop" }, { 0x0070, 0x1205, 0, VR::US, VM::M1TN, "CroppingSpecificationIndex" }, { 0x0070, 0x1206, 1, VR::CS, VM::M1, "CompositingMethod" }, { 0x0070, 0x1207, 0, VR::US, VM::M1, "VolumetricPresentationInputNumber" }, { 0x0070, 0x1208, 0, VR::CS, VM::M1, "ImageVolumeGeometry" }, { 0x0070, 0x1209, 0, VR::UI, VM::M1, "VolumetricPresentationInputSetUID" }, { 0x0070, 0x120A, 0, VR::SQ, VM::M1, "VolumetricPresentationInputSetSequence" }, { 0x0070, 0x120B, 0, VR::CS, VM::M1, "GlobalCrop" }, { 0x0070, 0x120C, 0, VR::US, VM::M1TN, "GlobalCroppingSpecificationIndex" }, { 0x0070, 0x120D, 0, VR::CS, VM::M1, "RenderingMethod" }, { 0x0070, 0x1301, 0, VR::SQ, VM::M1, "VolumeCroppingSequence" }, { 0x0070, 0x1302, 0, VR::CS, VM::M1, "VolumeCroppingMethod" }, { 0x0070, 0x1303, 0, VR::FD, VM::M6, "BoundingBoxCrop" }, { 0x0070, 0x1304, 0, VR::SQ, VM::M1, "ObliqueCroppingPlaneSequence" }, { 0x0070, 0x1305, 0, VR::FD, VM::M4, "Plane" }, { 0x0070, 0x1306, 0, VR::FD, VM::M3, "PlaneNormal" }, { 0x0070, 0x1309, 0, VR::US, VM::M1, "CroppingSpecificationNumber" }, { 0x0070, 0x1501, 0, VR::CS, VM::M1, "MultiPlanarReconstructionStyle" }, { 0x0070, 0x1502, 0, VR::CS, VM::M1, "MPRThicknessType" }, { 0x0070, 0x1503, 0, VR::FD, VM::M1, "MPRSlabThickness" }, { 0x0070, 0x1505, 0, VR::FD, VM::M3, "MPRTopLeftHandCorner" }, { 0x0070, 0x1507, 0, VR::FD, VM::M3, "MPRViewWidthDirection" }, { 0x0070, 0x1508, 0, VR::FD, VM::M1, "MPRViewWidth" }, { 0x0070, 0x150C, 0, VR::UL, VM::M1, "NumberOfVolumetricCurvePoints" }, { 0x0070, 0x150D, 0, VR::OD, VM::M1, "VolumetricCurvePoints" }, { 0x0070, 0x1511, 0, VR::FD, VM::M3, "MPRViewHeightDirection" }, { 0x0070, 0x1512, 0, VR::FD, VM::M1, "MPRViewHeight" }, { 0x0070, 0x1602, 0, VR::CS, VM::M1, "RenderProjection" }, { 0x0070, 0x1603, 0, VR::FD, VM::M3, "ViewpointPosition" }, { 0x0070, 0x1604, 0, VR::FD, VM::M3, "ViewpointLookAtPoint" }, { 0x0070, 0x1605, 0, VR::FD, VM::M3, "ViewpointUpDirection" }, { 0x0070, 0x1606, 0, VR::FD, VM::M6, "RenderFieldOfView" }, { 0x0070, 0x1607, 0, VR::FD, VM::M1, "SamplingStepSize" }, { 0x0070, 0x1701, 0, VR::CS, VM::M1, "ShadingStyle" }, { 0x0070, 0x1702, 0, VR::FD, VM::M1, "AmbientReflectionIntensity" }, { 0x0070, 0x1703, 0, VR::FD, VM::M3, "LightDirection" }, { 0x0070, 0x1704, 0, VR::FD, VM::M1, "DiffuseReflectionIntensity" }, { 0x0070, 0x1705, 0, VR::FD, VM::M1, "SpecularReflectionIntensity" }, { 0x0070, 0x1706, 0, VR::FD, VM::M1, "Shininess" }, { 0x0070, 0x1801, 0, VR::SQ, VM::M1, "PresentationStateClassificationComponentSequence" }, { 0x0070, 0x1802, 0, VR::CS, VM::M1, "ComponentType" }, { 0x0070, 0x1803, 0, VR::SQ, VM::M1, "ComponentInputSequence" }, { 0x0070, 0x1804, 0, VR::US, VM::M1, "VolumetricPresentationInputIndex" }, { 0x0070, 0x1805, 0, VR::SQ, VM::M1, "PresentationStateCompositorComponentSequence" }, { 0x0070, 0x1806, 0, VR::SQ, VM::M1, "WeightingTransferFunctionSequence" }, { 0x0070, 0x1807, 0, VR::US, VM::M3, "WeightingLookupTableDescriptor" }, { 0x0070, 0x1808, 0, VR::OB, VM::M1, "WeightingLookupTableData" }, { 0x0070, 0x1901, 0, VR::SQ, VM::M1, "VolumetricAnnotationSequence" }, { 0x0070, 0x1903, 0, VR::SQ, VM::M1, "ReferencedStructuredContextSequence" }, { 0x0070, 0x1904, 0, VR::UI, VM::M1, "ReferencedContentItem" }, { 0x0070, 0x1905, 0, VR::SQ, VM::M1, "VolumetricPresentationInputAnnotationSequence" }, { 0x0070, 0x1907, 0, VR::CS, VM::M1, "AnnotationClipping" }, { 0x0070, 0x1A01, 0, VR::CS, VM::M1, "PresentationAnimationStyle" }, { 0x0070, 0x1A03, 0, VR::FD, VM::M1, "RecommendedAnimationRate" }, { 0x0070, 0x1A04, 0, VR::SQ, VM::M1, "AnimationCurveSequence" }, { 0x0070, 0x1A05, 0, VR::FD, VM::M1, "AnimationStepSize" }, { 0x0070, 0x1A06, 0, VR::FD, VM::M1, "SwivelRange" }, { 0x0070, 0x1A07, 0, VR::OD, VM::M1, "VolumetricCurveUpDirections" }, { 0x0070, 0x1A08, 0, VR::SQ, VM::M1, "VolumeStreamSequence" }, { 0x0070, 0x1A09, 0, VR::LO, VM::M1, "RGBATransferFunctionDescription" }, { 0x0070, 0x1B01, 0, VR::SQ, VM::M1, "AdvancedBlendingSequence" }, { 0x0070, 0x1B02, 0, VR::US, VM::M1, "BlendingInputNumber" }, { 0x0070, 0x1B03, 0, VR::SQ, VM::M1, "BlendingDisplayInputSequence" }, { 0x0070, 0x1B04, 0, VR::SQ, VM::M1, "BlendingDisplaySequence" }, { 0x0070, 0x1B06, 0, VR::CS, VM::M1, "BlendingMode" }, { 0x0070, 0x1B07, 0, VR::CS, VM::M1, "TimeSeriesBlending" }, { 0x0070, 0x1B08, 0, VR::CS, VM::M1, "GeometryForDisplay" }, { 0x0070, 0x1B11, 0, VR::SQ, VM::M1, "ThresholdSequence" }, { 0x0070, 0x1B12, 0, VR::SQ, VM::M1, "ThresholdValueSequence" }, { 0x0070, 0x1B13, 0, VR::CS, VM::M1, "ThresholdType" }, { 0x0070, 0x1B14, 0, VR::FD, VM::M1, "ThresholdValue" }, { 0x0072, 0x0002, 0, VR::SH, VM::M1, "HangingProtocolName" }, { 0x0072, 0x0004, 0, VR::LO, VM::M1, "HangingProtocolDescription" }, { 0x0072, 0x0006, 0, VR::CS, VM::M1, "HangingProtocolLevel" }, { 0x0072, 0x0008, 0, VR::LO, VM::M1, "HangingProtocolCreator" }, { 0x0072, 0x000A, 0, VR::DT, VM::M1, "HangingProtocolCreationDateTime" }, { 0x0072, 0x000C, 0, VR::SQ, VM::M1, "HangingProtocolDefinitionSequence" }, { 0x0072, 0x000E, 0, VR::SQ, VM::M1, "HangingProtocolUserIdentificationCodeSequence" }, { 0x0072, 0x0010, 0, VR::LO, VM::M1, "HangingProtocolUserGroupName" }, { 0x0072, 0x0012, 0, VR::SQ, VM::M1, "SourceHangingProtocolSequence" }, { 0x0072, 0x0014, 0, VR::US, VM::M1, "NumberOfPriorsReferenced" }, { 0x0072, 0x0020, 0, VR::SQ, VM::M1, "ImageSetsSequence" }, { 0x0072, 0x0022, 0, VR::SQ, VM::M1, "ImageSetSelectorSequence" }, { 0x0072, 0x0024, 0, VR::CS, VM::M1, "ImageSetSelectorUsageFlag" }, { 0x0072, 0x0026, 0, VR::AT, VM::M1, "SelectorAttribute" }, { 0x0072, 0x0028, 0, VR::US, VM::M1, "SelectorValueNumber" }, { 0x0072, 0x0030, 0, VR::SQ, VM::M1, "TimeBasedImageSetsSequence" }, { 0x0072, 0x0032, 0, VR::US, VM::M1, "ImageSetNumber" }, { 0x0072, 0x0034, 0, VR::CS, VM::M1, "ImageSetSelectorCategory" }, { 0x0072, 0x0038, 0, VR::US, VM::M2, "RelativeTime" }, { 0x0072, 0x003A, 0, VR::CS, VM::M1, "RelativeTimeUnits" }, { 0x0072, 0x003C, 0, VR::SS, VM::M2, "AbstractPriorValue" }, { 0x0072, 0x003E, 0, VR::SQ, VM::M1, "AbstractPriorCodeSequence" }, { 0x0072, 0x0040, 0, VR::LO, VM::M1, "ImageSetLabel" }, { 0x0072, 0x0050, 0, VR::CS, VM::M1, "SelectorAttributeVR" }, { 0x0072, 0x0052, 0, VR::AT, VM::M1TN, "SelectorSequencePointer" }, { 0x0072, 0x0054, 0, VR::LO, VM::M1TN, "SelectorSequencePointerPrivateCreator" }, { 0x0072, 0x0056, 0, VR::LO, VM::M1, "SelectorAttributePrivateCreator" }, { 0x0072, 0x005E, 0, VR::AE, VM::M1TN, "SelectorAEValue" }, { 0x0072, 0x005F, 0, VR::AS, VM::M1TN, "SelectorASValue" }, { 0x0072, 0x0060, 0, VR::AT, VM::M1TN, "SelectorATValue" }, { 0x0072, 0x0061, 0, VR::DA, VM::M1TN, "SelectorDAValue" }, { 0x0072, 0x0062, 0, VR::CS, VM::M1TN, "SelectorCSValue" }, { 0x0072, 0x0063, 0, VR::DT, VM::M1TN, "SelectorDTValue" }, { 0x0072, 0x0064, 0, VR::IS, VM::M1TN, "SelectorISValue" }, { 0x0072, 0x0065, 0, VR::OB, VM::M1, "SelectorOBValue" }, { 0x0072, 0x0066, 0, VR::LO, VM::M1TN, "SelectorLOValue" }, { 0x0072, 0x0067, 0, VR::OF, VM::M1, "SelectorOFValue" }, { 0x0072, 0x0068, 0, VR::LT, VM::M1, "SelectorLTValue" }, { 0x0072, 0x0069, 0, VR::OW, VM::M1, "SelectorOWValue" }, { 0x0072, 0x006A, 0, VR::PN, VM::M1TN, "SelectorPNValue" }, { 0x0072, 0x006B, 0, VR::TM, VM::M1TN, "SelectorTMValue" }, { 0x0072, 0x006C, 0, VR::SH, VM::M1TN, "SelectorSHValue" }, { 0x0072, 0x006D, 0, VR::UN, VM::M1, "SelectorUNValue" }, { 0x0072, 0x006E, 0, VR::ST, VM::M1, "SelectorSTValue" }, { 0x0072, 0x006F, 0, VR::UC, VM::M1TN, "SelectorUCValue" }, { 0x0072, 0x0070, 0, VR::UT, VM::M1, "SelectorUTValue" }, { 0x0072, 0x0071, 0, VR::UR, VM::M1, "SelectorURValue" }, { 0x0072, 0x0072, 0, VR::DS, VM::M1TN, "SelectorDSValue" }, { 0x0072, 0x0073, 0, VR::OD, VM::M1, "SelectorODValue" }, { 0x0072, 0x0074, 0, VR::FD, VM::M1TN, "SelectorFDValue" }, { 0x0072, 0x0075, 0, VR::OL, VM::M1, "SelectorOLValue" }, { 0x0072, 0x0076, 0, VR::FL, VM::M1TN, "SelectorFLValue" }, { 0x0072, 0x0078, 0, VR::UL, VM::M1TN, "SelectorULValue" }, { 0x0072, 0x007A, 0, VR::US, VM::M1TN, "SelectorUSValue" }, { 0x0072, 0x007C, 0, VR::SL, VM::M1TN, "SelectorSLValue" }, { 0x0072, 0x007E, 0, VR::SS, VM::M1TN, "SelectorSSValue" }, { 0x0072, 0x007F, 0, VR::UI, VM::M1TN, "SelectorUIValue" }, { 0x0072, 0x0080, 0, VR::SQ, VM::M1, "SelectorCodeSequenceValue" }, { 0x0072, 0x0100, 0, VR::US, VM::M1, "NumberOfScreens" }, { 0x0072, 0x0102, 0, VR::SQ, VM::M1, "NominalScreenDefinitionSequence" }, { 0x0072, 0x0104, 0, VR::US, VM::M1, "NumberOfVerticalPixels" }, { 0x0072, 0x0106, 0, VR::US, VM::M1, "NumberOfHorizontalPixels" }, { 0x0072, 0x0108, 0, VR::FD, VM::M4, "DisplayEnvironmentSpatialPosition" }, { 0x0072, 0x010A, 0, VR::US, VM::M1, "ScreenMinimumGrayscaleBitDepth" }, { 0x0072, 0x010C, 0, VR::US, VM::M1, "ScreenMinimumColorBitDepth" }, { 0x0072, 0x010E, 0, VR::US, VM::M1, "ApplicationMaximumRepaintTime" }, { 0x0072, 0x0200, 0, VR::SQ, VM::M1, "DisplaySetsSequence" }, { 0x0072, 0x0202, 0, VR::US, VM::M1, "DisplaySetNumber" }, { 0x0072, 0x0203, 0, VR::LO, VM::M1, "DisplaySetLabel" }, { 0x0072, 0x0204, 0, VR::US, VM::M1, "DisplaySetPresentationGroup" }, { 0x0072, 0x0206, 0, VR::LO, VM::M1, "DisplaySetPresentationGroupDescription" }, { 0x0072, 0x0208, 0, VR::CS, VM::M1, "PartialDataDisplayHandling" }, { 0x0072, 0x0210, 0, VR::SQ, VM::M1, "SynchronizedScrollingSequence" }, { 0x0072, 0x0212, 0, VR::US, VM::M2TN, "DisplaySetScrollingGroup" }, { 0x0072, 0x0214, 0, VR::SQ, VM::M1, "NavigationIndicatorSequence" }, { 0x0072, 0x0216, 0, VR::US, VM::M1, "NavigationDisplaySet" }, { 0x0072, 0x0218, 0, VR::US, VM::M1TN, "ReferenceDisplaySets" }, { 0x0072, 0x0300, 0, VR::SQ, VM::M1, "ImageBoxesSequence" }, { 0x0072, 0x0302, 0, VR::US, VM::M1, "ImageBoxNumber" }, { 0x0072, 0x0304, 0, VR::CS, VM::M1, "ImageBoxLayoutType" }, { 0x0072, 0x0306, 0, VR::US, VM::M1, "ImageBoxTileHorizontalDimension" }, { 0x0072, 0x0308, 0, VR::US, VM::M1, "ImageBoxTileVerticalDimension" }, { 0x0072, 0x0310, 0, VR::CS, VM::M1, "ImageBoxScrollDirection" }, { 0x0072, 0x0312, 0, VR::CS, VM::M1, "ImageBoxSmallScrollType" }, { 0x0072, 0x0314, 0, VR::US, VM::M1, "ImageBoxSmallScrollAmount" }, { 0x0072, 0x0316, 0, VR::CS, VM::M1, "ImageBoxLargeScrollType" }, { 0x0072, 0x0318, 0, VR::US, VM::M1, "ImageBoxLargeScrollAmount" }, { 0x0072, 0x0320, 0, VR::US, VM::M1, "ImageBoxOverlapPriority" }, { 0x0072, 0x0330, 0, VR::FD, VM::M1, "CineRelativeToRealTime" }, { 0x0072, 0x0400, 0, VR::SQ, VM::M1, "FilterOperationsSequence" }, { 0x0072, 0x0402, 0, VR::CS, VM::M1, "FilterByCategory" }, { 0x0072, 0x0404, 0, VR::CS, VM::M1, "FilterByAttributePresence" }, { 0x0072, 0x0406, 0, VR::CS, VM::M1, "FilterByOperator" }, { 0x0072, 0x0420, 0, VR::US, VM::M3, "StructuredDisplayBackgroundCIELabValue" }, { 0x0072, 0x0421, 0, VR::US, VM::M3, "EmptyImageBoxCIELabValue" }, { 0x0072, 0x0422, 0, VR::SQ, VM::M1, "StructuredDisplayImageBoxSequence" }, { 0x0072, 0x0424, 0, VR::SQ, VM::M1, "StructuredDisplayTextBoxSequence" }, { 0x0072, 0x0427, 0, VR::SQ, VM::M1, "ReferencedFirstFrameSequence" }, { 0x0072, 0x0430, 0, VR::SQ, VM::M1, "ImageBoxSynchronizationSequence" }, { 0x0072, 0x0432, 0, VR::US, VM::M2TN, "SynchronizedImageBoxList" }, { 0x0072, 0x0434, 0, VR::CS, VM::M1, "TypeOfSynchronization" }, { 0x0072, 0x0500, 0, VR::CS, VM::M1, "BlendingOperationType" }, { 0x0072, 0x0510, 0, VR::CS, VM::M1, "ReformattingOperationType" }, { 0x0072, 0x0512, 0, VR::FD, VM::M1, "ReformattingThickness" }, { 0x0072, 0x0514, 0, VR::FD, VM::M1, "ReformattingInterval" }, { 0x0072, 0x0516, 0, VR::CS, VM::M1, "ReformattingOperationInitialViewDirection" }, { 0x0072, 0x0520, 0, VR::CS, VM::M1TN, "ThreeDRenderingType" }, { 0x0072, 0x0600, 0, VR::SQ, VM::M1, "SortingOperationsSequence" }, { 0x0072, 0x0602, 0, VR::CS, VM::M1, "SortByCategory" }, { 0x0072, 0x0604, 0, VR::CS, VM::M1, "SortingDirection" }, { 0x0072, 0x0700, 0, VR::CS, VM::M2, "DisplaySetPatientOrientation" }, { 0x0072, 0x0702, 0, VR::CS, VM::M1, "VOIType" }, { 0x0072, 0x0704, 0, VR::CS, VM::M1, "PseudoColorType" }, { 0x0072, 0x0705, 0, VR::SQ, VM::M1, "PseudoColorPaletteInstanceReferenceSequence" }, { 0x0072, 0x0706, 0, VR::CS, VM::M1, "ShowGrayscaleInverted" }, { 0x0072, 0x0710, 0, VR::CS, VM::M1, "ShowImageTrueSizeFlag" }, { 0x0072, 0x0712, 0, VR::CS, VM::M1, "ShowGraphicAnnotationFlag" }, { 0x0072, 0x0714, 0, VR::CS, VM::M1, "ShowPatientDemographicsFlag" }, { 0x0072, 0x0716, 0, VR::CS, VM::M1, "ShowAcquisitionTechniquesFlag" }, { 0x0072, 0x0717, 0, VR::CS, VM::M1, "DisplaySetHorizontalJustification" }, { 0x0072, 0x0718, 0, VR::CS, VM::M1, "DisplaySetVerticalJustification" }, { 0x0074, 0x0120, 0, VR::FD, VM::M1, "ContinuationStartMeterset" }, { 0x0074, 0x0121, 0, VR::FD, VM::M1, "ContinuationEndMeterset" }, { 0x0074, 0x1000, 0, VR::CS, VM::M1, "ProcedureStepState" }, { 0x0074, 0x1002, 0, VR::SQ, VM::M1, "ProcedureStepProgressInformationSequence" }, { 0x0074, 0x1004, 0, VR::DS, VM::M1, "ProcedureStepProgress" }, { 0x0074, 0x1006, 0, VR::ST, VM::M1, "ProcedureStepProgressDescription" }, { 0x0074, 0x1007, 0, VR::SQ, VM::M1, "ProcedureStepProgressParametersSequence" }, { 0x0074, 0x1008, 0, VR::SQ, VM::M1, "ProcedureStepCommunicationsURISequence" }, { 0x0074, 0x100A, 0, VR::UR, VM::M1, "ContactURI" }, { 0x0074, 0x100C, 0, VR::LO, VM::M1, "ContactDisplayName" }, { 0x0074, 0x100E, 0, VR::SQ, VM::M1, "ProcedureStepDiscontinuationReasonCodeSequence" }, { 0x0074, 0x1020, 0, VR::SQ, VM::M1, "BeamTaskSequence" }, { 0x0074, 0x1022, 0, VR::CS, VM::M1, "BeamTaskType" }, { 0x0074, 0x1024, 1, VR::IS, VM::M1, "BeamOrderIndexTrial" }, { 0x0074, 0x1025, 0, VR::CS, VM::M1, "AutosequenceFlag" }, { 0x0074, 0x1026, 0, VR::FD, VM::M1, "TableTopVerticalAdjustedPosition" }, { 0x0074, 0x1027, 0, VR::FD, VM::M1, "TableTopLongitudinalAdjustedPosition" }, { 0x0074, 0x1028, 0, VR::FD, VM::M1, "TableTopLateralAdjustedPosition" }, { 0x0074, 0x102A, 0, VR::FD, VM::M1, "PatientSupportAdjustedAngle" }, { 0x0074, 0x102B, 0, VR::FD, VM::M1, "TableTopEccentricAdjustedAngle" }, { 0x0074, 0x102C, 0, VR::FD, VM::M1, "TableTopPitchAdjustedAngle" }, { 0x0074, 0x102D, 0, VR::FD, VM::M1, "TableTopRollAdjustedAngle" }, { 0x0074, 0x1030, 0, VR::SQ, VM::M1, "DeliveryVerificationImageSequence" }, { 0x0074, 0x1032, 0, VR::CS, VM::M1, "VerificationImageTiming" }, { 0x0074, 0x1034, 0, VR::CS, VM::M1, "DoubleExposureFlag" }, { 0x0074, 0x1036, 0, VR::CS, VM::M1, "DoubleExposureOrdering" }, { 0x0074, 0x1038, 1, VR::DS, VM::M1, "DoubleExposureMetersetTrial" }, { 0x0074, 0x103A, 1, VR::DS, VM::M4, "DoubleExposureFieldDeltaTrial" }, { 0x0074, 0x1040, 0, VR::SQ, VM::M1, "RelatedReferenceRTImageSequence" }, { 0x0074, 0x1042, 0, VR::SQ, VM::M1, "GeneralMachineVerificationSequence" }, { 0x0074, 0x1044, 0, VR::SQ, VM::M1, "ConventionalMachineVerificationSequence" }, { 0x0074, 0x1046, 0, VR::SQ, VM::M1, "IonMachineVerificationSequence" }, { 0x0074, 0x1048, 0, VR::SQ, VM::M1, "FailedAttributesSequence" }, { 0x0074, 0x104A, 0, VR::SQ, VM::M1, "OverriddenAttributesSequence" }, { 0x0074, 0x104C, 0, VR::SQ, VM::M1, "ConventionalControlPointVerificationSequence" }, { 0x0074, 0x104E, 0, VR::SQ, VM::M1, "IonControlPointVerificationSequence" }, { 0x0074, 0x1050, 0, VR::SQ, VM::M1, "AttributeOccurrenceSequence" }, { 0x0074, 0x1052, 0, VR::AT, VM::M1, "AttributeOccurrencePointer" }, { 0x0074, 0x1054, 0, VR::UL, VM::M1, "AttributeItemSelector" }, { 0x0074, 0x1056, 0, VR::LO, VM::M1, "AttributeOccurrencePrivateCreator" }, { 0x0074, 0x1057, 0, VR::IS, VM::M1TN, "SelectorSequencePointerItems" }, { 0x0074, 0x1200, 0, VR::CS, VM::M1, "ScheduledProcedureStepPriority" }, { 0x0074, 0x1202, 0, VR::LO, VM::M1, "WorklistLabel" }, { 0x0074, 0x1204, 0, VR::LO, VM::M1, "ProcedureStepLabel" }, { 0x0074, 0x1210, 0, VR::SQ, VM::M1, "ScheduledProcessingParametersSequence" }, { 0x0074, 0x1212, 0, VR::SQ, VM::M1, "PerformedProcessingParametersSequence" }, { 0x0074, 0x1216, 0, VR::SQ, VM::M1, "UnifiedProcedureStepPerformedProcedureSequence" }, { 0x0074, 0x1220, 1, VR::SQ, VM::M1, "RelatedProcedureStepSequence" }, { 0x0074, 0x1222, 1, VR::LO, VM::M1, "ProcedureStepRelationshipType" }, { 0x0074, 0x1224, 0, VR::SQ, VM::M1, "ReplacedProcedureStepSequence" }, { 0x0074, 0x1230, 0, VR::LO, VM::M1, "DeletionLock" }, { 0x0074, 0x1234, 0, VR::AE, VM::M1, "ReceivingAE" }, { 0x0074, 0x1236, 0, VR::AE, VM::M1, "RequestingAE" }, { 0x0074, 0x1238, 0, VR::LT, VM::M1, "ReasonForCancellation" }, { 0x0074, 0x1242, 0, VR::CS, VM::M1, "SCPStatus" }, { 0x0074, 0x1244, 0, VR::CS, VM::M1, "SubscriptionListStatus" }, { 0x0074, 0x1246, 0, VR::CS, VM::M1, "UnifiedProcedureStepListStatus" }, { 0x0074, 0x1324, 0, VR::UL, VM::M1, "BeamOrderIndex" }, { 0x0074, 0x1338, 0, VR::FD, VM::M1, "DoubleExposureMeterset" }, { 0x0074, 0x133A, 0, VR::FD, VM::M4, "DoubleExposureFieldDelta" }, { 0x0074, 0x1401, 0, VR::SQ, VM::M1, "BrachyTaskSequence" }, { 0x0074, 0x1402, 0, VR::DS, VM::M1, "ContinuationStartTotalReferenceAirKerma" }, { 0x0074, 0x1403, 0, VR::DS, VM::M1, "ContinuationEndTotalReferenceAirKerma" }, { 0x0074, 0x1404, 0, VR::IS, VM::M1, "ContinuationPulseNumber" }, { 0x0074, 0x1405, 0, VR::SQ, VM::M1, "ChannelDeliveryOrderSequence" }, { 0x0074, 0x1406, 0, VR::IS, VM::M1, "ReferencedChannelNumber" }, { 0x0074, 0x1407, 0, VR::DS, VM::M1, "StartCumulativeTimeWeight" }, { 0x0074, 0x1408, 0, VR::DS, VM::M1, "EndCumulativeTimeWeight" }, { 0x0074, 0x1409, 0, VR::SQ, VM::M1, "OmittedChannelSequence" }, { 0x0074, 0x140A, 0, VR::CS, VM::M1, "ReasonForChannelOmission" }, { 0x0074, 0x140B, 0, VR::LO, VM::M1, "ReasonForChannelOmissionDescription" }, { 0x0074, 0x140C, 0, VR::IS, VM::M1, "ChannelDeliveryOrderIndex" }, { 0x0074, 0x140D, 0, VR::SQ, VM::M1, "ChannelDeliveryContinuationSequence" }, { 0x0074, 0x140E, 0, VR::SQ, VM::M1, "OmittedApplicationSetupSequence" }, { 0x0076, 0x0001, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateName" }, { 0x0076, 0x0003, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateIssuer" }, { 0x0076, 0x0006, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateVersion" }, { 0x0076, 0x0008, 0, VR::SQ, VM::M1, "ReplacedImplantAssemblyTemplateSequence" }, { 0x0076, 0x000A, 0, VR::CS, VM::M1, "ImplantAssemblyTemplateType" }, { 0x0076, 0x000C, 0, VR::SQ, VM::M1, "OriginalImplantAssemblyTemplateSequence" }, { 0x0076, 0x000E, 0, VR::SQ, VM::M1, "DerivationImplantAssemblyTemplateSequence" }, { 0x0076, 0x0010, 0, VR::SQ, VM::M1, "ImplantAssemblyTemplateTargetAnatomySequence" }, { 0x0076, 0x0020, 0, VR::SQ, VM::M1, "ProcedureTypeCodeSequence" }, { 0x0076, 0x0030, 0, VR::LO, VM::M1, "SurgicalTechnique" }, { 0x0076, 0x0032, 0, VR::SQ, VM::M1, "ComponentTypesSequence" }, { 0x0076, 0x0034, 0, VR::SQ, VM::M1, "ComponentTypeCodeSequence" }, { 0x0076, 0x0036, 0, VR::CS, VM::M1, "ExclusiveComponentType" }, { 0x0076, 0x0038, 0, VR::CS, VM::M1, "MandatoryComponentType" }, { 0x0076, 0x0040, 0, VR::SQ, VM::M1, "ComponentSequence" }, { 0x0076, 0x0055, 0, VR::US, VM::M1, "ComponentID" }, { 0x0076, 0x0060, 0, VR::SQ, VM::M1, "ComponentAssemblySequence" }, { 0x0076, 0x0070, 0, VR::US, VM::M1, "Component1ReferencedID" }, { 0x0076, 0x0080, 0, VR::US, VM::M1, "Component1ReferencedMatingFeatureSetID" }, { 0x0076, 0x0090, 0, VR::US, VM::M1, "Component1ReferencedMatingFeatureID" }, { 0x0076, 0x00A0, 0, VR::US, VM::M1, "Component2ReferencedID" }, { 0x0076, 0x00B0, 0, VR::US, VM::M1, "Component2ReferencedMatingFeatureSetID" }, { 0x0076, 0x00C0, 0, VR::US, VM::M1, "Component2ReferencedMatingFeatureID" }, { 0x0078, 0x0001, 0, VR::LO, VM::M1, "ImplantTemplateGroupName" }, { 0x0078, 0x0010, 0, VR::ST, VM::M1, "ImplantTemplateGroupDescription" }, { 0x0078, 0x0020, 0, VR::LO, VM::M1, "ImplantTemplateGroupIssuer" }, { 0x0078, 0x0024, 0, VR::LO, VM::M1, "ImplantTemplateGroupVersion" }, { 0x0078, 0x0026, 0, VR::SQ, VM::M1, "ReplacedImplantTemplateGroupSequence" }, { 0x0078, 0x0028, 0, VR::SQ, VM::M1, "ImplantTemplateGroupTargetAnatomySequence" }, { 0x0078, 0x002A, 0, VR::SQ, VM::M1, "ImplantTemplateGroupMembersSequence" }, { 0x0078, 0x002E, 0, VR::US, VM::M1, "ImplantTemplateGroupMemberID" }, { 0x0078, 0x0050, 0, VR::FD, VM::M3, "ThreeDImplantTemplateGroupMemberMatchingPoint" }, { 0x0078, 0x0060, 0, VR::FD, VM::M9, "ThreeDImplantTemplateGroupMemberMatchingAxes" }, { 0x0078, 0x0070, 0, VR::SQ, VM::M1, "ImplantTemplateGroupMemberMatching2DCoordinatesSequence" }, { 0x0078, 0x0090, 0, VR::FD, VM::M2, "TwoDImplantTemplateGroupMemberMatchingPoint" }, { 0x0078, 0x00A0, 0, VR::FD, VM::M4, "TwoDImplantTemplateGroupMemberMatchingAxes" }, { 0x0078, 0x00B0, 0, VR::SQ, VM::M1, "ImplantTemplateGroupVariationDimensionSequence" }, { 0x0078, 0x00B2, 0, VR::LO, VM::M1, "ImplantTemplateGroupVariationDimensionName" }, { 0x0078, 0x00B4, 0, VR::SQ, VM::M1, "ImplantTemplateGroupVariationDimensionRankSequence" }, { 0x0078, 0x00B6, 0, VR::US, VM::M1, "ReferencedImplantTemplateGroupMemberID" }, { 0x0078, 0x00B8, 0, VR::US, VM::M1, "ImplantTemplateGroupVariationDimensionRank" }, { 0x0080, 0x0001, 0, VR::SQ, VM::M1, "SurfaceScanAcquisitionTypeCodeSequence" }, { 0x0080, 0x0002, 0, VR::SQ, VM::M1, "SurfaceScanModeCodeSequence" }, { 0x0080, 0x0003, 0, VR::SQ, VM::M1, "RegistrationMethodCodeSequence" }, { 0x0080, 0x0004, 0, VR::FD, VM::M1, "ShotDurationTime" }, { 0x0080, 0x0005, 0, VR::FD, VM::M1, "ShotOffsetTime" }, { 0x0080, 0x0006, 0, VR::US, VM::M1TN, "SurfacePointPresentationValueData" }, { 0x0080, 0x0007, 0, VR::US, VM::M3T3N, "SurfacePointColorCIELabValueData" }, { 0x0080, 0x0008, 0, VR::SQ, VM::M1, "UVMappingSequence" }, { 0x0080, 0x0009, 0, VR::SH, VM::M1, "TextureLabel" }, { 0x0080, 0x0010, 0, VR::OF, VM::M1, "UValueData" }, { 0x0080, 0x0011, 0, VR::OF, VM::M1, "VValueData" }, { 0x0080, 0x0012, 0, VR::SQ, VM::M1, "ReferencedTextureSequence" }, { 0x0080, 0x0013, 0, VR::SQ, VM::M1, "ReferencedSurfaceDataSequence" }, { 0x0082, 0x0001, 0, VR::CS, VM::M1, "AssessmentSummary" }, { 0x0082, 0x0003, 0, VR::UT, VM::M1, "AssessmentSummaryDescription" }, { 0x0082, 0x0004, 0, VR::SQ, VM::M1, "AssessedSOPInstanceSequence" }, { 0x0082, 0x0005, 0, VR::SQ, VM::M1, "ReferencedComparisonSOPInstanceSequence" }, { 0x0082, 0x0006, 0, VR::UL, VM::M1, "NumberOfAssessmentObservations" }, { 0x0082, 0x0007, 0, VR::SQ, VM::M1, "AssessmentObservationsSequence" }, { 0x0082, 0x0008, 0, VR::CS, VM::M1, "ObservationSignificance" }, { 0x0082, 0x000A, 0, VR::UT, VM::M1, "ObservationDescription" }, { 0x0082, 0x000C, 0, VR::SQ, VM::M1, "StructuredConstraintObservationSequence" }, { 0x0082, 0x0010, 0, VR::SQ, VM::M1, "AssessedAttributeValueSequence" }, { 0x0082, 0x0016, 0, VR::LO, VM::M1, "AssessmentSetID" }, { 0x0082, 0x0017, 0, VR::SQ, VM::M1, "AssessmentRequesterSequence" }, { 0x0082, 0x0018, 0, VR::LO, VM::M1, "SelectorAttributeName" }, { 0x0082, 0x0019, 0, VR::LO, VM::M1, "SelectorAttributeKeyword" }, { 0x0082, 0x0021, 0, VR::SQ, VM::M1, "AssessmentTypeCodeSequence" }, { 0x0082, 0x0022, 0, VR::SQ, VM::M1, "ObservationBasisCodeSequence" }, { 0x0082, 0x0023, 0, VR::LO, VM::M1, "AssessmentLabel" }, { 0x0082, 0x0032, 0, VR::CS, VM::M1, "ConstraintType" }, { 0x0082, 0x0033, 0, VR::UT, VM::M1, "SpecificationSelectionGuidance" }, { 0x0082, 0x0034, 0, VR::SQ, VM::M1, "ConstraintValueSequence" }, { 0x0082, 0x0035, 0, VR::SQ, VM::M1, "RecommendedDefaultValueSequence" }, { 0x0082, 0x0036, 0, VR::CS, VM::M1, "ConstraintViolationSignificance" }, { 0x0082, 0x0037, 0, VR::UT, VM::M1, "ConstraintViolationCondition" }, { 0x0082, 0x0038, 0, VR::CS, VM::M1, "ModifiableConstraintFlag" }, { 0x0088, 0x0130, 0, VR::SH, VM::M1, "StorageMediaFileSetID" }, { 0x0088, 0x0140, 0, VR::UI, VM::M1, "StorageMediaFileSetUID" }, { 0x0088, 0x0200, 0, VR::SQ, VM::M1, "IconImageSequence" }, { 0x0088, 0x0904, 1, VR::LO, VM::M1, "TopicTitle" }, { 0x0088, 0x0906, 1, VR::ST, VM::M1, "TopicSubject" }, { 0x0088, 0x0910, 1, VR::LO, VM::M1, "TopicAuthor" }, { 0x0088, 0x0912, 1, VR::LO, VM::M1T32, "TopicKeywords" }, { 0x0100, 0x0410, 0, VR::CS, VM::M1, "SOPInstanceStatus" }, { 0x0100, 0x0420, 0, VR::DT, VM::M1, "SOPAuthorizationDateTime" }, { 0x0100, 0x0424, 0, VR::LT, VM::M1, "SOPAuthorizationComment" }, { 0x0100, 0x0426, 0, VR::LO, VM::M1, "AuthorizationEquipmentCertificationNumber" }, { 0x0400, 0x0005, 0, VR::US, VM::M1, "MACIDNumber" }, { 0x0400, 0x0010, 0, VR::UI, VM::M1, "MACCalculationTransferSyntaxUID" }, { 0x0400, 0x0015, 0, VR::CS, VM::M1, "MACAlgorithm" }, { 0x0400, 0x0020, 0, VR::AT, VM::M1TN, "DataElementsSigned" }, { 0x0400, 0x0100, 0, VR::UI, VM::M1, "DigitalSignatureUID" }, { 0x0400, 0x0105, 0, VR::DT, VM::M1, "DigitalSignatureDateTime" }, { 0x0400, 0x0110, 0, VR::CS, VM::M1, "CertificateType" }, { 0x0400, 0x0115, 0, VR::OB, VM::M1, "CertificateOfSigner" }, { 0x0400, 0x0120, 0, VR::OB, VM::M1, "Signature" }, { 0x0400, 0x0305, 0, VR::CS, VM::M1, "CertifiedTimestampType" }, { 0x0400, 0x0310, 0, VR::OB, VM::M1, "CertifiedTimestamp" }, { 0x0400, 0x0401, 0, VR::SQ, VM::M1, "DigitalSignaturePurposeCodeSequence" }, { 0x0400, 0x0402, 0, VR::SQ, VM::M1, "ReferencedDigitalSignatureSequence" }, { 0x0400, 0x0403, 0, VR::SQ, VM::M1, "ReferencedSOPInstanceMACSequence" }, { 0x0400, 0x0404, 0, VR::OB, VM::M1, "MAC" }, { 0x0400, 0x0500, 0, VR::SQ, VM::M1, "EncryptedAttributesSequence" }, { 0x0400, 0x0510, 0, VR::UI, VM::M1, "EncryptedContentTransferSyntaxUID" }, { 0x0400, 0x0520, 0, VR::OB, VM::M1, "EncryptedContent" }, { 0x0400, 0x0550, 0, VR::SQ, VM::M1, "ModifiedAttributesSequence" }, { 0x0400, 0x0551, 0, VR::SQ, VM::M1, "NonconformingModifiedAttributesSequence" }, { 0x0400, 0x0552, 0, VR::OB, VM::M1, "NonconformingDataElementValue" }, { 0x0400, 0x0561, 0, VR::SQ, VM::M1, "OriginalAttributesSequence" }, { 0x0400, 0x0562, 0, VR::DT, VM::M1, "AttributeModificationDateTime" }, { 0x0400, 0x0563, 0, VR::LO, VM::M1, "ModifyingSystem" }, { 0x0400, 0x0564, 0, VR::LO, VM::M1, "SourceOfPreviousValues" }, { 0x0400, 0x0565, 0, VR::CS, VM::M1, "ReasonForTheAttributeModification" }, { 0x0400, 0x0600, 0, VR::CS, VM::M1, "InstanceOriginStatus" }, { 0x1000, 0x0000, 1, VR::US, VM::M3, "EscapeTriplet" }, { 0x1000, 0x0001, 1, VR::US, VM::M3, "RunLengthTriplet" }, { 0x1000, 0x0002, 1, VR::US, VM::M1, "HuffmanTableSize" }, { 0x1000, 0x0003, 1, VR::US, VM::M3, "HuffmanTableTriplet" }, { 0x1000, 0x0004, 1, VR::US, VM::M1, "ShiftTableSize" }, { 0x1000, 0x0005, 1, VR::US, VM::M3, "ShiftTableTriplet" }, { 0x1010, 0x0000, 1, VR::US, VM::M1TN, "ZonalMap" }, { 0x2000, 0x0010, 0, VR::IS, VM::M1, "NumberOfCopies" }, { 0x2000, 0x001E, 0, VR::SQ, VM::M1, "PrinterConfigurationSequence" }, { 0x2000, 0x0020, 0, VR::CS, VM::M1, "PrintPriority" }, { 0x2000, 0x0030, 0, VR::CS, VM::M1, "MediumType" }, { 0x2000, 0x0040, 0, VR::CS, VM::M1, "FilmDestination" }, { 0x2000, 0x0050, 0, VR::LO, VM::M1, "FilmSessionLabel" }, { 0x2000, 0x0060, 0, VR::IS, VM::M1, "MemoryAllocation" }, { 0x2000, 0x0061, 0, VR::IS, VM::M1, "MaximumMemoryAllocation" }, { 0x2000, 0x0062, 1, VR::CS, VM::M1, "ColorImagePrintingFlag" }, { 0x2000, 0x0063, 1, VR::CS, VM::M1, "CollationFlag" }, { 0x2000, 0x0065, 1, VR::CS, VM::M1, "AnnotationFlag" }, { 0x2000, 0x0067, 1, VR::CS, VM::M1, "ImageOverlayFlag" }, { 0x2000, 0x0069, 1, VR::CS, VM::M1, "PresentationLUTFlag" }, { 0x2000, 0x006A, 1, VR::CS, VM::M1, "ImageBoxPresentationLUTFlag" }, { 0x2000, 0x00A0, 0, VR::US, VM::M1, "MemoryBitDepth" }, { 0x2000, 0x00A1, 0, VR::US, VM::M1, "PrintingBitDepth" }, { 0x2000, 0x00A2, 0, VR::SQ, VM::M1, "MediaInstalledSequence" }, { 0x2000, 0x00A4, 0, VR::SQ, VM::M1, "OtherMediaAvailableSequence" }, { 0x2000, 0x00A8, 0, VR::SQ, VM::M1, "SupportedImageDisplayFormatsSequence" }, { 0x2000, 0x0500, 0, VR::SQ, VM::M1, "ReferencedFilmBoxSequence" }, { 0x2000, 0x0510, 1, VR::SQ, VM::M1, "ReferencedStoredPrintSequence" }, { 0x2010, 0x0010, 0, VR::ST, VM::M1, "ImageDisplayFormat" }, { 0x2010, 0x0030, 0, VR::CS, VM::M1, "AnnotationDisplayFormatID" }, { 0x2010, 0x0040, 0, VR::CS, VM::M1, "FilmOrientation" }, { 0x2010, 0x0050, 0, VR::CS, VM::M1, "FilmSizeID" }, { 0x2010, 0x0052, 0, VR::CS, VM::M1, "PrinterResolutionID" }, { 0x2010, 0x0054, 0, VR::CS, VM::M1, "DefaultPrinterResolutionID" }, { 0x2010, 0x0060, 0, VR::CS, VM::M1, "MagnificationType" }, { 0x2010, 0x0080, 0, VR::CS, VM::M1, "SmoothingType" }, { 0x2010, 0x00A6, 0, VR::CS, VM::M1, "DefaultMagnificationType" }, { 0x2010, 0x00A7, 0, VR::CS, VM::M1TN, "OtherMagnificationTypesAvailable" }, { 0x2010, 0x00A8, 0, VR::CS, VM::M1, "DefaultSmoothingType" }, { 0x2010, 0x00A9, 0, VR::CS, VM::M1TN, "OtherSmoothingTypesAvailable" }, { 0x2010, 0x0100, 0, VR::CS, VM::M1, "BorderDensity" }, { 0x2010, 0x0110, 0, VR::CS, VM::M1, "EmptyImageDensity" }, { 0x2010, 0x0120, 0, VR::US, VM::M1, "MinDensity" }, { 0x2010, 0x0130, 0, VR::US, VM::M1, "MaxDensity" }, { 0x2010, 0x0140, 0, VR::CS, VM::M1, "Trim" }, { 0x2010, 0x0150, 0, VR::ST, VM::M1, "ConfigurationInformation" }, { 0x2010, 0x0152, 0, VR::LT, VM::M1, "ConfigurationInformationDescription" }, { 0x2010, 0x0154, 0, VR::IS, VM::M1, "MaximumCollatedFilms" }, { 0x2010, 0x015E, 0, VR::US, VM::M1, "Illumination" }, { 0x2010, 0x0160, 0, VR::US, VM::M1, "ReflectedAmbientLight" }, { 0x2010, 0x0376, 0, VR::DS, VM::M2, "PrinterPixelSpacing" }, { 0x2010, 0x0500, 0, VR::SQ, VM::M1, "ReferencedFilmSessionSequence" }, { 0x2010, 0x0510, 0, VR::SQ, VM::M1, "ReferencedImageBoxSequence" }, { 0x2010, 0x0520, 0, VR::SQ, VM::M1, "ReferencedBasicAnnotationBoxSequence" }, { 0x2020, 0x0010, 0, VR::US, VM::M1, "ImageBoxPosition" }, { 0x2020, 0x0020, 0, VR::CS, VM::M1, "Polarity" }, { 0x2020, 0x0030, 0, VR::DS, VM::M1, "RequestedImageSize" }, { 0x2020, 0x0040, 0, VR::CS, VM::M1, "RequestedDecimateCropBehavior" }, { 0x2020, 0x0050, 0, VR::CS, VM::M1, "RequestedResolutionID" }, { 0x2020, 0x00A0, 0, VR::CS, VM::M1, "RequestedImageSizeFlag" }, { 0x2020, 0x00A2, 0, VR::CS, VM::M1, "DecimateCropResult" }, { 0x2020, 0x0110, 0, VR::SQ, VM::M1, "BasicGrayscaleImageSequence" }, { 0x2020, 0x0111, 0, VR::SQ, VM::M1, "BasicColorImageSequence" }, { 0x2020, 0x0130, 1, VR::SQ, VM::M1, "ReferencedImageOverlayBoxSequence" }, { 0x2020, 0x0140, 1, VR::SQ, VM::M1, "ReferencedVOILUTBoxSequence" }, { 0x2030, 0x0010, 0, VR::US, VM::M1, "AnnotationPosition" }, { 0x2030, 0x0020, 0, VR::LO, VM::M1, "TextString" }, { 0x2040, 0x0010, 1, VR::SQ, VM::M1, "ReferencedOverlayPlaneSequence" }, { 0x2040, 0x0011, 1, VR::US, VM::M1T99, "ReferencedOverlayPlaneGroups" }, { 0x2040, 0x0020, 1, VR::SQ, VM::M1, "OverlayPixelDataSequence" }, { 0x2040, 0x0060, 1, VR::CS, VM::M1, "OverlayMagnificationType" }, { 0x2040, 0x0070, 1, VR::CS, VM::M1, "OverlaySmoothingType" }, { 0x2040, 0x0072, 1, VR::CS, VM::M1, "OverlayOrImageMagnification" }, { 0x2040, 0x0074, 1, VR::US, VM::M1, "MagnifyToNumberOfColumns" }, { 0x2040, 0x0080, 1, VR::CS, VM::M1, "OverlayForegroundDensity" }, { 0x2040, 0x0082, 1, VR::CS, VM::M1, "OverlayBackgroundDensity" }, { 0x2040, 0x0090, 1, VR::CS, VM::M1, "OverlayMode" }, { 0x2040, 0x0100, 1, VR::CS, VM::M1, "ThresholdDensity" }, { 0x2040, 0x0500, 1, VR::SQ, VM::M1, "ReferencedImageBoxSequenceRetired" }, { 0x2050, 0x0010, 0, VR::SQ, VM::M1, "PresentationLUTSequence" }, { 0x2050, 0x0020, 0, VR::CS, VM::M1, "PresentationLUTShape" }, { 0x2050, 0x0500, 0, VR::SQ, VM::M1, "ReferencedPresentationLUTSequence" }, { 0x2100, 0x0010, 1, VR::SH, VM::M1, "PrintJobID" }, { 0x2100, 0x0020, 0, VR::CS, VM::M1, "ExecutionStatus" }, { 0x2100, 0x0030, 0, VR::CS, VM::M1, "ExecutionStatusInfo" }, { 0x2100, 0x0040, 0, VR::DA, VM::M1, "CreationDate" }, { 0x2100, 0x0050, 0, VR::TM, VM::M1, "CreationTime" }, { 0x2100, 0x0070, 0, VR::AE, VM::M1, "Originator" }, { 0x2100, 0x0140, 0, VR::AE, VM::M1, "DestinationAE" }, { 0x2100, 0x0160, 0, VR::SH, VM::M1, "OwnerID" }, { 0x2100, 0x0170, 0, VR::IS, VM::M1, "NumberOfFilms" }, { 0x2100, 0x0500, 1, VR::SQ, VM::M1, "ReferencedPrintJobSequencePullStoredPrint" }, { 0x2110, 0x0010, 0, VR::CS, VM::M1, "PrinterStatus" }, { 0x2110, 0x0020, 0, VR::CS, VM::M1, "PrinterStatusInfo" }, { 0x2110, 0x0030, 0, VR::LO, VM::M1, "PrinterName" }, { 0x2110, 0x0099, 1, VR::SH, VM::M1, "PrintQueueID" }, { 0x2120, 0x0010, 1, VR::CS, VM::M1, "QueueStatus" }, { 0x2120, 0x0050, 1, VR::SQ, VM::M1, "PrintJobDescriptionSequence" }, { 0x2120, 0x0070, 1, VR::SQ, VM::M1, "ReferencedPrintJobSequence" }, { 0x2130, 0x0010, 1, VR::SQ, VM::M1, "PrintManagementCapabilitiesSequence" }, { 0x2130, 0x0015, 1, VR::SQ, VM::M1, "PrinterCharacteristicsSequence" }, { 0x2130, 0x0030, 1, VR::SQ, VM::M1, "FilmBoxContentSequence" }, { 0x2130, 0x0040, 1, VR::SQ, VM::M1, "ImageBoxContentSequence" }, { 0x2130, 0x0050, 1, VR::SQ, VM::M1, "AnnotationContentSequence" }, { 0x2130, 0x0060, 1, VR::SQ, VM::M1, "ImageOverlayBoxContentSequence" }, { 0x2130, 0x0080, 1, VR::SQ, VM::M1, "PresentationLUTContentSequence" }, { 0x2130, 0x00A0, 1, VR::SQ, VM::M1, "ProposedStudySequence" }, { 0x2130, 0x00C0, 1, VR::SQ, VM::M1, "OriginalImageSequence" }, { 0x2200, 0x0001, 0, VR::CS, VM::M1, "LabelUsingInformationExtractedFromInstances" }, { 0x2200, 0x0002, 0, VR::UT, VM::M1, "LabelText" }, { 0x2200, 0x0003, 0, VR::CS, VM::M1, "LabelStyleSelection" }, { 0x2200, 0x0004, 0, VR::LT, VM::M1, "MediaDisposition" }, { 0x2200, 0x0005, 0, VR::LT, VM::M1, "BarcodeValue" }, { 0x2200, 0x0006, 0, VR::CS, VM::M1, "BarcodeSymbology" }, { 0x2200, 0x0007, 0, VR::CS, VM::M1, "AllowMediaSplitting" }, { 0x2200, 0x0008, 0, VR::CS, VM::M1, "IncludeNonDICOMObjects" }, { 0x2200, 0x0009, 0, VR::CS, VM::M1, "IncludeDisplayApplication" }, { 0x2200, 0x000A, 0, VR::CS, VM::M1, "PreserveCompositeInstancesAfterMediaCreation" }, { 0x2200, 0x000B, 0, VR::US, VM::M1, "TotalNumberOfPiecesOfMediaCreated" }, { 0x2200, 0x000C, 0, VR::LO, VM::M1, "RequestedMediaApplicationProfile" }, { 0x2200, 0x000D, 0, VR::SQ, VM::M1, "ReferencedStorageMediaSequence" }, { 0x2200, 0x000E, 0, VR::AT, VM::M1TN, "FailureAttributes" }, { 0x2200, 0x000F, 0, VR::CS, VM::M1, "AllowLossyCompression" }, { 0x2200, 0x0020, 0, VR::CS, VM::M1, "RequestPriority" }, { 0x3002, 0x0002, 0, VR::SH, VM::M1, "RTImageLabel" }, { 0x3002, 0x0003, 0, VR::LO, VM::M1, "RTImageName" }, { 0x3002, 0x0004, 0, VR::ST, VM::M1, "RTImageDescription" }, { 0x3002, 0x000A, 0, VR::CS, VM::M1, "ReportedValuesOrigin" }, { 0x3002, 0x000C, 0, VR::CS, VM::M1, "RTImagePlane" }, { 0x3002, 0x000D, 0, VR::DS, VM::M3, "XRayImageReceptorTranslation" }, { 0x3002, 0x000E, 0, VR::DS, VM::M1, "XRayImageReceptorAngle" }, { 0x3002, 0x0010, 0, VR::DS, VM::M6, "RTImageOrientation" }, { 0x3002, 0x0011, 0, VR::DS, VM::M2, "ImagePlanePixelSpacing" }, { 0x3002, 0x0012, 0, VR::DS, VM::M2, "RTImagePosition" }, { 0x3002, 0x0020, 0, VR::SH, VM::M1, "RadiationMachineName" }, { 0x3002, 0x0022, 0, VR::DS, VM::M1, "RadiationMachineSAD" }, { 0x3002, 0x0024, 0, VR::DS, VM::M1, "RadiationMachineSSD" }, { 0x3002, 0x0026, 0, VR::DS, VM::M1, "RTImageSID" }, { 0x3002, 0x0028, 0, VR::DS, VM::M1, "SourceToReferenceObjectDistance" }, { 0x3002, 0x0029, 0, VR::IS, VM::M1, "FractionNumber" }, { 0x3002, 0x0030, 0, VR::SQ, VM::M1, "ExposureSequence" }, { 0x3002, 0x0032, 0, VR::DS, VM::M1, "MetersetExposure" }, { 0x3002, 0x0034, 0, VR::DS, VM::M4, "DiaphragmPosition" }, { 0x3002, 0x0040, 0, VR::SQ, VM::M1, "FluenceMapSequence" }, { 0x3002, 0x0041, 0, VR::CS, VM::M1, "FluenceDataSource" }, { 0x3002, 0x0042, 0, VR::DS, VM::M1, "FluenceDataScale" }, { 0x3002, 0x0050, 0, VR::SQ, VM::M1, "PrimaryFluenceModeSequence" }, { 0x3002, 0x0051, 0, VR::CS, VM::M1, "FluenceMode" }, { 0x3002, 0x0052, 0, VR::SH, VM::M1, "FluenceModeID" }, { 0x3004, 0x0001, 0, VR::CS, VM::M1, "DVHType" }, { 0x3004, 0x0002, 0, VR::CS, VM::M1, "DoseUnits" }, { 0x3004, 0x0004, 0, VR::CS, VM::M1, "DoseType" }, { 0x3004, 0x0005, 0, VR::CS, VM::M1, "SpatialTransformOfDose" }, { 0x3004, 0x0006, 0, VR::LO, VM::M1, "DoseComment" }, { 0x3004, 0x0008, 0, VR::DS, VM::M3, "NormalizationPoint" }, { 0x3004, 0x000A, 0, VR::CS, VM::M1, "DoseSummationType" }, { 0x3004, 0x000C, 0, VR::DS, VM::M2TN, "GridFrameOffsetVector" }, { 0x3004, 0x000E, 0, VR::DS, VM::M1, "DoseGridScaling" }, { 0x3004, 0x0010, 0, VR::SQ, VM::M1, "RTDoseROISequence" }, { 0x3004, 0x0012, 0, VR::DS, VM::M1, "DoseValue" }, { 0x3004, 0x0014, 0, VR::CS, VM::M1T3, "TissueHeterogeneityCorrection" }, { 0x3004, 0x0040, 0, VR::DS, VM::M3, "DVHNormalizationPoint" }, { 0x3004, 0x0042, 0, VR::DS, VM::M1, "DVHNormalizationDoseValue" }, { 0x3004, 0x0050, 0, VR::SQ, VM::M1, "DVHSequence" }, { 0x3004, 0x0052, 0, VR::DS, VM::M1, "DVHDoseScaling" }, { 0x3004, 0x0054, 0, VR::CS, VM::M1, "DVHVolumeUnits" }, { 0x3004, 0x0056, 0, VR::IS, VM::M1, "DVHNumberOfBins" }, { 0x3004, 0x0058, 0, VR::DS, VM::M2T2N, "DVHData" }, { 0x3004, 0x0060, 0, VR::SQ, VM::M1, "DVHReferencedROISequence" }, { 0x3004, 0x0062, 0, VR::CS, VM::M1, "DVHROIContributionType" }, { 0x3004, 0x0070, 0, VR::DS, VM::M1, "DVHMinimumDose" }, { 0x3004, 0x0072, 0, VR::DS, VM::M1, "DVHMaximumDose" }, { 0x3004, 0x0074, 0, VR::DS, VM::M1, "DVHMeanDose" }, { 0x3006, 0x0002, 0, VR::SH, VM::M1, "StructureSetLabel" }, { 0x3006, 0x0004, 0, VR::LO, VM::M1, "StructureSetName" }, { 0x3006, 0x0006, 0, VR::ST, VM::M1, "StructureSetDescription" }, { 0x3006, 0x0008, 0, VR::DA, VM::M1, "StructureSetDate" }, { 0x3006, 0x0009, 0, VR::TM, VM::M1, "StructureSetTime" }, { 0x3006, 0x0010, 0, VR::SQ, VM::M1, "ReferencedFrameOfReferenceSequence" }, { 0x3006, 0x0012, 0, VR::SQ, VM::M1, "RTReferencedStudySequence" }, { 0x3006, 0x0014, 0, VR::SQ, VM::M1, "RTReferencedSeriesSequence" }, { 0x3006, 0x0016, 0, VR::SQ, VM::M1, "ContourImageSequence" }, { 0x3006, 0x0018, 0, VR::SQ, VM::M1, "PredecessorStructureSetSequence" }, { 0x3006, 0x0020, 0, VR::SQ, VM::M1, "StructureSetROISequence" }, { 0x3006, 0x0022, 0, VR::IS, VM::M1, "ROINumber" }, { 0x3006, 0x0024, 0, VR::UI, VM::M1, "ReferencedFrameOfReferenceUID" }, { 0x3006, 0x0026, 0, VR::LO, VM::M1, "ROIName" }, { 0x3006, 0x0028, 0, VR::ST, VM::M1, "ROIDescription" }, { 0x3006, 0x002A, 0, VR::IS, VM::M3, "ROIDisplayColor" }, { 0x3006, 0x002C, 0, VR::DS, VM::M1, "ROIVolume" }, { 0x3006, 0x0030, 0, VR::SQ, VM::M1, "RTRelatedROISequence" }, { 0x3006, 0x0033, 0, VR::CS, VM::M1, "RTROIRelationship" }, { 0x3006, 0x0036, 0, VR::CS, VM::M1, "ROIGenerationAlgorithm" }, { 0x3006, 0x0037, 0, VR::SQ, VM::M1, "ROIDerivationAlgorithmIdentificationSequence" }, { 0x3006, 0x0038, 0, VR::LO, VM::M1, "ROIGenerationDescription" }, { 0x3006, 0x0039, 0, VR::SQ, VM::M1, "ROIContourSequence" }, { 0x3006, 0x0040, 0, VR::SQ, VM::M1, "ContourSequence" }, { 0x3006, 0x0042, 0, VR::CS, VM::M1, "ContourGeometricType" }, { 0x3006, 0x0044, 0, VR::DS, VM::M1, "ContourSlabThickness" }, { 0x3006, 0x0045, 0, VR::DS, VM::M3, "ContourOffsetVector" }, { 0x3006, 0x0046, 0, VR::IS, VM::M1, "NumberOfContourPoints" }, { 0x3006, 0x0048, 0, VR::IS, VM::M1, "ContourNumber" }, { 0x3006, 0x0049, 0, VR::IS, VM::M1TN, "AttachedContours" }, { 0x3006, 0x0050, 0, VR::DS, VM::M3T3N, "ContourData" }, { 0x3006, 0x0080, 0, VR::SQ, VM::M1, "RTROIObservationsSequence" }, { 0x3006, 0x0082, 0, VR::IS, VM::M1, "ObservationNumber" }, { 0x3006, 0x0084, 0, VR::IS, VM::M1, "ReferencedROINumber" }, { 0x3006, 0x0085, 0, VR::SH, VM::M1, "ROIObservationLabel" }, { 0x3006, 0x0086, 0, VR::SQ, VM::M1, "RTROIIdentificationCodeSequence" }, { 0x3006, 0x0088, 0, VR::ST, VM::M1, "ROIObservationDescription" }, { 0x3006, 0x00A0, 0, VR::SQ, VM::M1, "RelatedRTROIObservationsSequence" }, { 0x3006, 0x00A4, 0, VR::CS, VM::M1, "RTROIInterpretedType" }, { 0x3006, 0x00A6, 0, VR::PN, VM::M1, "ROIInterpreter" }, { 0x3006, 0x00B0, 0, VR::SQ, VM::M1, "ROIPhysicalPropertiesSequence" }, { 0x3006, 0x00B2, 0, VR::CS, VM::M1, "ROIPhysicalProperty" }, { 0x3006, 0x00B4, 0, VR::DS, VM::M1, "ROIPhysicalPropertyValue" }, { 0x3006, 0x00B6, 0, VR::SQ, VM::M1, "ROIElementalCompositionSequence" }, { 0x3006, 0x00B7, 0, VR::US, VM::M1, "ROIElementalCompositionAtomicNumber" }, { 0x3006, 0x00B8, 0, VR::FL, VM::M1, "ROIElementalCompositionAtomicMassFraction" }, { 0x3006, 0x00B9, 1, VR::SQ, VM::M1, "AdditionalRTROIIdentificationCodeSequence" }, { 0x3006, 0x00C0, 1, VR::SQ, VM::M1, "FrameOfReferenceRelationshipSequence" }, { 0x3006, 0x00C2, 1, VR::UI, VM::M1, "RelatedFrameOfReferenceUID" }, { 0x3006, 0x00C4, 1, VR::CS, VM::M1, "FrameOfReferenceTransformationType" }, { 0x3006, 0x00C6, 0, VR::DS, VM::M16, "FrameOfReferenceTransformationMatrix" }, { 0x3006, 0x00C8, 0, VR::LO, VM::M1, "FrameOfReferenceTransformationComment" }, { 0x3006, 0x00C9, 0, VR::SQ, VM::M1, "PatientLocationCoordinatesSequence" }, { 0x3006, 0x00CA, 0, VR::SQ, VM::M1, "PatientLocationCoordinatesCodeSequence" }, { 0x3006, 0x00CB, 0, VR::SQ, VM::M1, "PatientSupportPositionSequence" }, { 0x3008, 0x0010, 0, VR::SQ, VM::M1, "MeasuredDoseReferenceSequence" }, { 0x3008, 0x0012, 0, VR::ST, VM::M1, "MeasuredDoseDescription" }, { 0x3008, 0x0014, 0, VR::CS, VM::M1, "MeasuredDoseType" }, { 0x3008, 0x0016, 0, VR::DS, VM::M1, "MeasuredDoseValue" }, { 0x3008, 0x0020, 0, VR::SQ, VM::M1, "TreatmentSessionBeamSequence" }, { 0x3008, 0x0021, 0, VR::SQ, VM::M1, "TreatmentSessionIonBeamSequence" }, { 0x3008, 0x0022, 0, VR::IS, VM::M1, "CurrentFractionNumber" }, { 0x3008, 0x0024, 0, VR::DA, VM::M1, "TreatmentControlPointDate" }, { 0x3008, 0x0025, 0, VR::TM, VM::M1, "TreatmentControlPointTime" }, { 0x3008, 0x002A, 0, VR::CS, VM::M1, "TreatmentTerminationStatus" }, { 0x3008, 0x002B, 0, VR::SH, VM::M1, "TreatmentTerminationCode" }, { 0x3008, 0x002C, 0, VR::CS, VM::M1, "TreatmentVerificationStatus" }, { 0x3008, 0x0030, 0, VR::SQ, VM::M1, "ReferencedTreatmentRecordSequence" }, { 0x3008, 0x0032, 0, VR::DS, VM::M1, "SpecifiedPrimaryMeterset" }, { 0x3008, 0x0033, 0, VR::DS, VM::M1, "SpecifiedSecondaryMeterset" }, { 0x3008, 0x0036, 0, VR::DS, VM::M1, "DeliveredPrimaryMeterset" }, { 0x3008, 0x0037, 0, VR::DS, VM::M1, "DeliveredSecondaryMeterset" }, { 0x3008, 0x003A, 0, VR::DS, VM::M1, "SpecifiedTreatmentTime" }, { 0x3008, 0x003B, 0, VR::DS, VM::M1, "DeliveredTreatmentTime" }, { 0x3008, 0x0040, 0, VR::SQ, VM::M1, "ControlPointDeliverySequence" }, { 0x3008, 0x0041, 0, VR::SQ, VM::M1, "IonControlPointDeliverySequence" }, { 0x3008, 0x0042, 0, VR::DS, VM::M1, "SpecifiedMeterset" }, { 0x3008, 0x0044, 0, VR::DS, VM::M1, "DeliveredMeterset" }, { 0x3008, 0x0045, 0, VR::FL, VM::M1, "MetersetRateSet" }, { 0x3008, 0x0046, 0, VR::FL, VM::M1, "MetersetRateDelivered" }, { 0x3008, 0x0047, 0, VR::FL, VM::M1TN, "ScanSpotMetersetsDelivered" }, { 0x3008, 0x0048, 0, VR::DS, VM::M1, "DoseRateDelivered" }, { 0x3008, 0x0050, 0, VR::SQ, VM::M1, "TreatmentSummaryCalculatedDoseReferenceSequence" }, { 0x3008, 0x0052, 0, VR::DS, VM::M1, "CumulativeDoseToDoseReference" }, { 0x3008, 0x0054, 0, VR::DA, VM::M1, "FirstTreatmentDate" }, { 0x3008, 0x0056, 0, VR::DA, VM::M1, "MostRecentTreatmentDate" }, { 0x3008, 0x005A, 0, VR::IS, VM::M1, "NumberOfFractionsDelivered" }, { 0x3008, 0x0060, 0, VR::SQ, VM::M1, "OverrideSequence" }, { 0x3008, 0x0061, 0, VR::AT, VM::M1, "ParameterSequencePointer" }, { 0x3008, 0x0062, 0, VR::AT, VM::M1, "OverrideParameterPointer" }, { 0x3008, 0x0063, 0, VR::IS, VM::M1, "ParameterItemIndex" }, { 0x3008, 0x0064, 0, VR::IS, VM::M1, "MeasuredDoseReferenceNumber" }, { 0x3008, 0x0065, 0, VR::AT, VM::M1, "ParameterPointer" }, { 0x3008, 0x0066, 0, VR::ST, VM::M1, "OverrideReason" }, { 0x3008, 0x0067, 0, VR::US, VM::M1, "ParameterValueNumber" }, { 0x3008, 0x0068, 0, VR::SQ, VM::M1, "CorrectedParameterSequence" }, { 0x3008, 0x006A, 0, VR::FL, VM::M1, "CorrectionValue" }, { 0x3008, 0x0070, 0, VR::SQ, VM::M1, "CalculatedDoseReferenceSequence" }, { 0x3008, 0x0072, 0, VR::IS, VM::M1, "CalculatedDoseReferenceNumber" }, { 0x3008, 0x0074, 0, VR::ST, VM::M1, "CalculatedDoseReferenceDescription" }, { 0x3008, 0x0076, 0, VR::DS, VM::M1, "CalculatedDoseReferenceDoseValue" }, { 0x3008, 0x0078, 0, VR::DS, VM::M1, "StartMeterset" }, { 0x3008, 0x007A, 0, VR::DS, VM::M1, "EndMeterset" }, { 0x3008, 0x0080, 0, VR::SQ, VM::M1, "ReferencedMeasuredDoseReferenceSequence" }, { 0x3008, 0x0082, 0, VR::IS, VM::M1, "ReferencedMeasuredDoseReferenceNumber" }, { 0x3008, 0x0090, 0, VR::SQ, VM::M1, "ReferencedCalculatedDoseReferenceSequence" }, { 0x3008, 0x0092, 0, VR::IS, VM::M1, "ReferencedCalculatedDoseReferenceNumber" }, { 0x3008, 0x00A0, 0, VR::SQ, VM::M1, "BeamLimitingDeviceLeafPairsSequence" }, { 0x3008, 0x00B0, 0, VR::SQ, VM::M1, "RecordedWedgeSequence" }, { 0x3008, 0x00C0, 0, VR::SQ, VM::M1, "RecordedCompensatorSequence" }, { 0x3008, 0x00D0, 0, VR::SQ, VM::M1, "RecordedBlockSequence" }, { 0x3008, 0x00E0, 0, VR::SQ, VM::M1, "TreatmentSummaryMeasuredDoseReferenceSequence" }, { 0x3008, 0x00F0, 0, VR::SQ, VM::M1, "RecordedSnoutSequence" }, { 0x3008, 0x00F2, 0, VR::SQ, VM::M1, "RecordedRangeShifterSequence" }, { 0x3008, 0x00F4, 0, VR::SQ, VM::M1, "RecordedLateralSpreadingDeviceSequence" }, { 0x3008, 0x00F6, 0, VR::SQ, VM::M1, "RecordedRangeModulatorSequence" }, { 0x3008, 0x0100, 0, VR::SQ, VM::M1, "RecordedSourceSequence" }, { 0x3008, 0x0105, 0, VR::LO, VM::M1, "SourceSerialNumber" }, { 0x3008, 0x0110, 0, VR::SQ, VM::M1, "TreatmentSessionApplicationSetupSequence" }, { 0x3008, 0x0116, 0, VR::CS, VM::M1, "ApplicationSetupCheck" }, { 0x3008, 0x0120, 0, VR::SQ, VM::M1, "RecordedBrachyAccessoryDeviceSequence" }, { 0x3008, 0x0122, 0, VR::IS, VM::M1, "ReferencedBrachyAccessoryDeviceNumber" }, { 0x3008, 0x0130, 0, VR::SQ, VM::M1, "RecordedChannelSequence" }, { 0x3008, 0x0132, 0, VR::DS, VM::M1, "SpecifiedChannelTotalTime" }, { 0x3008, 0x0134, 0, VR::DS, VM::M1, "DeliveredChannelTotalTime" }, { 0x3008, 0x0136, 0, VR::IS, VM::M1, "SpecifiedNumberOfPulses" }, { 0x3008, 0x0138, 0, VR::IS, VM::M1, "DeliveredNumberOfPulses" }, { 0x3008, 0x013A, 0, VR::DS, VM::M1, "SpecifiedPulseRepetitionInterval" }, { 0x3008, 0x013C, 0, VR::DS, VM::M1, "DeliveredPulseRepetitionInterval" }, { 0x3008, 0x0140, 0, VR::SQ, VM::M1, "RecordedSourceApplicatorSequence" }, { 0x3008, 0x0142, 0, VR::IS, VM::M1, "ReferencedSourceApplicatorNumber" }, { 0x3008, 0x0150, 0, VR::SQ, VM::M1, "RecordedChannelShieldSequence" }, { 0x3008, 0x0152, 0, VR::IS, VM::M1, "ReferencedChannelShieldNumber" }, { 0x3008, 0x0160, 0, VR::SQ, VM::M1, "BrachyControlPointDeliveredSequence" }, { 0x3008, 0x0162, 0, VR::DA, VM::M1, "SafePositionExitDate" }, { 0x3008, 0x0164, 0, VR::TM, VM::M1, "SafePositionExitTime" }, { 0x3008, 0x0166, 0, VR::DA, VM::M1, "SafePositionReturnDate" }, { 0x3008, 0x0168, 0, VR::TM, VM::M1, "SafePositionReturnTime" }, { 0x3008, 0x0171, 0, VR::SQ, VM::M1, "PulseSpecificBrachyControlPointDeliveredSequence" }, { 0x3008, 0x0172, 0, VR::US, VM::M1, "PulseNumber" }, { 0x3008, 0x0173, 0, VR::SQ, VM::M1, "BrachyPulseControlPointDeliveredSequence" }, { 0x3008, 0x0200, 0, VR::CS, VM::M1, "CurrentTreatmentStatus" }, { 0x3008, 0x0202, 0, VR::ST, VM::M1, "TreatmentStatusComment" }, { 0x3008, 0x0220, 0, VR::SQ, VM::M1, "FractionGroupSummarySequence" }, { 0x3008, 0x0223, 0, VR::IS, VM::M1, "ReferencedFractionNumber" }, { 0x3008, 0x0224, 0, VR::CS, VM::M1, "FractionGroupType" }, { 0x3008, 0x0230, 0, VR::CS, VM::M1, "BeamStopperPosition" }, { 0x3008, 0x0240, 0, VR::SQ, VM::M1, "FractionStatusSummarySequence" }, { 0x3008, 0x0250, 0, VR::DA, VM::M1, "TreatmentDate" }, { 0x3008, 0x0251, 0, VR::TM, VM::M1, "TreatmentTime" }, { 0x300A, 0x0002, 0, VR::SH, VM::M1, "RTPlanLabel" }, { 0x300A, 0x0003, 0, VR::LO, VM::M1, "RTPlanName" }, { 0x300A, 0x0004, 0, VR::ST, VM::M1, "RTPlanDescription" }, { 0x300A, 0x0006, 0, VR::DA, VM::M1, "RTPlanDate" }, { 0x300A, 0x0007, 0, VR::TM, VM::M1, "RTPlanTime" }, { 0x300A, 0x0009, 0, VR::LO, VM::M1TN, "TreatmentProtocols" }, { 0x300A, 0x000A, 0, VR::CS, VM::M1, "PlanIntent" }, { 0x300A, 0x000B, 0, VR::LO, VM::M1TN, "TreatmentSites" }, { 0x300A, 0x000C, 0, VR::CS, VM::M1, "RTPlanGeometry" }, { 0x300A, 0x000E, 0, VR::ST, VM::M1, "PrescriptionDescription" }, { 0x300A, 0x0010, 0, VR::SQ, VM::M1, "DoseReferenceSequence" }, { 0x300A, 0x0012, 0, VR::IS, VM::M1, "DoseReferenceNumber" }, { 0x300A, 0x0013, 0, VR::UI, VM::M1, "DoseReferenceUID" }, { 0x300A, 0x0014, 0, VR::CS, VM::M1, "DoseReferenceStructureType" }, { 0x300A, 0x0015, 0, VR::CS, VM::M1, "NominalBeamEnergyUnit" }, { 0x300A, 0x0016, 0, VR::LO, VM::M1, "DoseReferenceDescription" }, { 0x300A, 0x0018, 0, VR::DS, VM::M3, "DoseReferencePointCoordinates" }, { 0x300A, 0x001A, 0, VR::DS, VM::M1, "NominalPriorDose" }, { 0x300A, 0x0020, 0, VR::CS, VM::M1, "DoseReferenceType" }, { 0x300A, 0x0021, 0, VR::DS, VM::M1, "ConstraintWeight" }, { 0x300A, 0x0022, 0, VR::DS, VM::M1, "DeliveryWarningDose" }, { 0x300A, 0x0023, 0, VR::DS, VM::M1, "DeliveryMaximumDose" }, { 0x300A, 0x0025, 0, VR::DS, VM::M1, "TargetMinimumDose" }, { 0x300A, 0x0026, 0, VR::DS, VM::M1, "TargetPrescriptionDose" }, { 0x300A, 0x0027, 0, VR::DS, VM::M1, "TargetMaximumDose" }, { 0x300A, 0x0028, 0, VR::DS, VM::M1, "TargetUnderdoseVolumeFraction" }, { 0x300A, 0x002A, 0, VR::DS, VM::M1, "OrganAtRiskFullVolumeDose" }, { 0x300A, 0x002B, 0, VR::DS, VM::M1, "OrganAtRiskLimitDose" }, { 0x300A, 0x002C, 0, VR::DS, VM::M1, "OrganAtRiskMaximumDose" }, { 0x300A, 0x002D, 0, VR::DS, VM::M1, "OrganAtRiskOverdoseVolumeFraction" }, { 0x300A, 0x0040, 0, VR::SQ, VM::M1, "ToleranceTableSequence" }, { 0x300A, 0x0042, 0, VR::IS, VM::M1, "ToleranceTableNumber" }, { 0x300A, 0x0043, 0, VR::SH, VM::M1, "ToleranceTableLabel" }, { 0x300A, 0x0044, 0, VR::DS, VM::M1, "GantryAngleTolerance" }, { 0x300A, 0x0046, 0, VR::DS, VM::M1, "BeamLimitingDeviceAngleTolerance" }, { 0x300A, 0x0048, 0, VR::SQ, VM::M1, "BeamLimitingDeviceToleranceSequence" }, { 0x300A, 0x004A, 0, VR::DS, VM::M1, "BeamLimitingDevicePositionTolerance" }, { 0x300A, 0x004B, 0, VR::FL, VM::M1, "SnoutPositionTolerance" }, { 0x300A, 0x004C, 0, VR::DS, VM::M1, "PatientSupportAngleTolerance" }, { 0x300A, 0x004E, 0, VR::DS, VM::M1, "TableTopEccentricAngleTolerance" }, { 0x300A, 0x004F, 0, VR::FL, VM::M1, "TableTopPitchAngleTolerance" }, { 0x300A, 0x0050, 0, VR::FL, VM::M1, "TableTopRollAngleTolerance" }, { 0x300A, 0x0051, 0, VR::DS, VM::M1, "TableTopVerticalPositionTolerance" }, { 0x300A, 0x0052, 0, VR::DS, VM::M1, "TableTopLongitudinalPositionTolerance" }, { 0x300A, 0x0053, 0, VR::DS, VM::M1, "TableTopLateralPositionTolerance" }, { 0x300A, 0x0055, 0, VR::CS, VM::M1, "RTPlanRelationship" }, { 0x300A, 0x0070, 0, VR::SQ, VM::M1, "FractionGroupSequence" }, { 0x300A, 0x0071, 0, VR::IS, VM::M1, "FractionGroupNumber" }, { 0x300A, 0x0072, 0, VR::LO, VM::M1, "FractionGroupDescription" }, { 0x300A, 0x0078, 0, VR::IS, VM::M1, "NumberOfFractionsPlanned" }, { 0x300A, 0x0079, 0, VR::IS, VM::M1, "NumberOfFractionPatternDigitsPerDay" }, { 0x300A, 0x007A, 0, VR::IS, VM::M1, "RepeatFractionCycleLength" }, { 0x300A, 0x007B, 0, VR::LT, VM::M1, "FractionPattern" }, { 0x300A, 0x0080, 0, VR::IS, VM::M1, "NumberOfBeams" }, { 0x300A, 0x0082, 1, VR::DS, VM::M3, "BeamDoseSpecificationPoint" }, { 0x300A, 0x0083, 0, VR::UI, VM::M1, "ReferencedDoseReferenceUID" }, { 0x300A, 0x0084, 0, VR::DS, VM::M1, "BeamDose" }, { 0x300A, 0x0086, 0, VR::DS, VM::M1, "BeamMeterset" }, { 0x300A, 0x0088, 0, VR::FL, VM::M1, "BeamDosePointDepth" }, { 0x300A, 0x0089, 0, VR::FL, VM::M1, "BeamDosePointEquivalentDepth" }, { 0x300A, 0x008A, 0, VR::FL, VM::M1, "BeamDosePointSSD" }, { 0x300A, 0x008B, 0, VR::CS, VM::M1, "BeamDoseMeaning" }, { 0x300A, 0x008C, 0, VR::SQ, VM::M1, "BeamDoseVerificationControlPointSequence" }, { 0x300A, 0x008D, 1, VR::FL, VM::M1, "AverageBeamDosePointDepth" }, { 0x300A, 0x008E, 1, VR::FL, VM::M1, "AverageBeamDosePointEquivalentDepth" }, { 0x300A, 0x008F, 1, VR::FL, VM::M1, "AverageBeamDosePointSSD" }, { 0x300A, 0x0090, 0, VR::CS, VM::M1, "BeamDoseType" }, { 0x300A, 0x0091, 0, VR::DS, VM::M1, "AlternateBeamDose" }, { 0x300A, 0x0092, 0, VR::CS, VM::M1, "AlternateBeamDoseType" }, { 0x300A, 0x0093, 0, VR::CS, VM::M1, "DepthValueAveragingFlag" }, { 0x300A, 0x0094, 0, VR::DS, VM::M1, "BeamDosePointSourceToExternalContourDistance" }, { 0x300A, 0x00A0, 0, VR::IS, VM::M1, "NumberOfBrachyApplicationSetups" }, { 0x300A, 0x00A2, 0, VR::DS, VM::M3, "BrachyApplicationSetupDoseSpecificationPoint" }, { 0x300A, 0x00A4, 0, VR::DS, VM::M1, "BrachyApplicationSetupDose" }, { 0x300A, 0x00B0, 0, VR::SQ, VM::M1, "BeamSequence" }, { 0x300A, 0x00B2, 0, VR::SH, VM::M1, "TreatmentMachineName" }, { 0x300A, 0x00B3, 0, VR::CS, VM::M1, "PrimaryDosimeterUnit" }, { 0x300A, 0x00B4, 0, VR::DS, VM::M1, "SourceAxisDistance" }, { 0x300A, 0x00B6, 0, VR::SQ, VM::M1, "BeamLimitingDeviceSequence" }, { 0x300A, 0x00B8, 0, VR::CS, VM::M1, "RTBeamLimitingDeviceType" }, { 0x300A, 0x00BA, 0, VR::DS, VM::M1, "SourceToBeamLimitingDeviceDistance" }, { 0x300A, 0x00BB, 0, VR::FL, VM::M1, "IsocenterToBeamLimitingDeviceDistance" }, { 0x300A, 0x00BC, 0, VR::IS, VM::M1, "NumberOfLeafJawPairs" }, { 0x300A, 0x00BE, 0, VR::DS, VM::M3TN, "LeafPositionBoundaries" }, { 0x300A, 0x00C0, 0, VR::IS, VM::M1, "BeamNumber" }, { 0x300A, 0x00C2, 0, VR::LO, VM::M1, "BeamName" }, { 0x300A, 0x00C3, 0, VR::ST, VM::M1, "BeamDescription" }, { 0x300A, 0x00C4, 0, VR::CS, VM::M1, "BeamType" }, { 0x300A, 0x00C5, 0, VR::FD, VM::M1, "BeamDeliveryDurationLimit" }, { 0x300A, 0x00C6, 0, VR::CS, VM::M1, "RadiationType" }, { 0x300A, 0x00C7, 0, VR::CS, VM::M1, "HighDoseTechniqueType" }, { 0x300A, 0x00C8, 0, VR::IS, VM::M1, "ReferenceImageNumber" }, { 0x300A, 0x00CA, 0, VR::SQ, VM::M1, "PlannedVerificationImageSequence" }, { 0x300A, 0x00CC, 0, VR::LO, VM::M1TN, "ImagingDeviceSpecificAcquisitionParameters" }, { 0x300A, 0x00CE, 0, VR::CS, VM::M1, "TreatmentDeliveryType" }, { 0x300A, 0x00D0, 0, VR::IS, VM::M1, "NumberOfWedges" }, { 0x300A, 0x00D1, 0, VR::SQ, VM::M1, "WedgeSequence" }, { 0x300A, 0x00D2, 0, VR::IS, VM::M1, "WedgeNumber" }, { 0x300A, 0x00D3, 0, VR::CS, VM::M1, "WedgeType" }, { 0x300A, 0x00D4, 0, VR::SH, VM::M1, "WedgeID" }, { 0x300A, 0x00D5, 0, VR::IS, VM::M1, "WedgeAngle" }, { 0x300A, 0x00D6, 0, VR::DS, VM::M1, "WedgeFactor" }, { 0x300A, 0x00D7, 0, VR::FL, VM::M1, "TotalWedgeTrayWaterEquivalentThickness" }, { 0x300A, 0x00D8, 0, VR::DS, VM::M1, "WedgeOrientation" }, { 0x300A, 0x00D9, 0, VR::FL, VM::M1, "IsocenterToWedgeTrayDistance" }, { 0x300A, 0x00DA, 0, VR::DS, VM::M1, "SourceToWedgeTrayDistance" }, { 0x300A, 0x00DB, 0, VR::FL, VM::M1, "WedgeThinEdgePosition" }, { 0x300A, 0x00DC, 0, VR::SH, VM::M1, "BolusID" }, { 0x300A, 0x00DD, 0, VR::ST, VM::M1, "BolusDescription" }, { 0x300A, 0x00DE, 0, VR::DS, VM::M1, "EffectiveWedgeAngle" }, { 0x300A, 0x00E0, 0, VR::IS, VM::M1, "NumberOfCompensators" }, { 0x300A, 0x00E1, 0, VR::SH, VM::M1, "MaterialID" }, { 0x300A, 0x00E2, 0, VR::DS, VM::M1, "TotalCompensatorTrayFactor" }, { 0x300A, 0x00E3, 0, VR::SQ, VM::M1, "CompensatorSequence" }, { 0x300A, 0x00E4, 0, VR::IS, VM::M1, "CompensatorNumber" }, { 0x300A, 0x00E5, 0, VR::SH, VM::M1, "CompensatorID" }, { 0x300A, 0x00E6, 0, VR::DS, VM::M1, "SourceToCompensatorTrayDistance" }, { 0x300A, 0x00E7, 0, VR::IS, VM::M1, "CompensatorRows" }, { 0x300A, 0x00E8, 0, VR::IS, VM::M1, "CompensatorColumns" }, { 0x300A, 0x00E9, 0, VR::DS, VM::M2, "CompensatorPixelSpacing" }, { 0x300A, 0x00EA, 0, VR::DS, VM::M2, "CompensatorPosition" }, { 0x300A, 0x00EB, 0, VR::DS, VM::M1TN, "CompensatorTransmissionData" }, { 0x300A, 0x00EC, 0, VR::DS, VM::M1TN, "CompensatorThicknessData" }, { 0x300A, 0x00ED, 0, VR::IS, VM::M1, "NumberOfBoli" }, { 0x300A, 0x00EE, 0, VR::CS, VM::M1, "CompensatorType" }, { 0x300A, 0x00EF, 0, VR::SH, VM::M1, "CompensatorTrayID" }, { 0x300A, 0x00F0, 0, VR::IS, VM::M1, "NumberOfBlocks" }, { 0x300A, 0x00F2, 0, VR::DS, VM::M1, "TotalBlockTrayFactor" }, { 0x300A, 0x00F3, 0, VR::FL, VM::M1, "TotalBlockTrayWaterEquivalentThickness" }, { 0x300A, 0x00F4, 0, VR::SQ, VM::M1, "BlockSequence" }, { 0x300A, 0x00F5, 0, VR::SH, VM::M1, "BlockTrayID" }, { 0x300A, 0x00F6, 0, VR::DS, VM::M1, "SourceToBlockTrayDistance" }, { 0x300A, 0x00F7, 0, VR::FL, VM::M1, "IsocenterToBlockTrayDistance" }, { 0x300A, 0x00F8, 0, VR::CS, VM::M1, "BlockType" }, { 0x300A, 0x00F9, 0, VR::LO, VM::M1, "AccessoryCode" }, { 0x300A, 0x00FA, 0, VR::CS, VM::M1, "BlockDivergence" }, { 0x300A, 0x00FB, 0, VR::CS, VM::M1, "BlockMountingPosition" }, { 0x300A, 0x00FC, 0, VR::IS, VM::M1, "BlockNumber" }, { 0x300A, 0x00FE, 0, VR::LO, VM::M1, "BlockName" }, { 0x300A, 0x0100, 0, VR::DS, VM::M1, "BlockThickness" }, { 0x300A, 0x0102, 0, VR::DS, VM::M1, "BlockTransmission" }, { 0x300A, 0x0104, 0, VR::IS, VM::M1, "BlockNumberOfPoints" }, { 0x300A, 0x0106, 0, VR::DS, VM::M2T2N, "BlockData" }, { 0x300A, 0x0107, 0, VR::SQ, VM::M1, "ApplicatorSequence" }, { 0x300A, 0x0108, 0, VR::SH, VM::M1, "ApplicatorID" }, { 0x300A, 0x0109, 0, VR::CS, VM::M1, "ApplicatorType" }, { 0x300A, 0x010A, 0, VR::LO, VM::M1, "ApplicatorDescription" }, { 0x300A, 0x010C, 0, VR::DS, VM::M1, "CumulativeDoseReferenceCoefficient" }, { 0x300A, 0x010E, 0, VR::DS, VM::M1, "FinalCumulativeMetersetWeight" }, { 0x300A, 0x0110, 0, VR::IS, VM::M1, "NumberOfControlPoints" }, { 0x300A, 0x0111, 0, VR::SQ, VM::M1, "ControlPointSequence" }, { 0x300A, 0x0112, 0, VR::IS, VM::M1, "ControlPointIndex" }, { 0x300A, 0x0114, 0, VR::DS, VM::M1, "NominalBeamEnergy" }, { 0x300A, 0x0115, 0, VR::DS, VM::M1, "DoseRateSet" }, { 0x300A, 0x0116, 0, VR::SQ, VM::M1, "WedgePositionSequence" }, { 0x300A, 0x0118, 0, VR::CS, VM::M1, "WedgePosition" }, { 0x300A, 0x011A, 0, VR::SQ, VM::M1, "BeamLimitingDevicePositionSequence" }, { 0x300A, 0x011C, 0, VR::DS, VM::M2T2N, "LeafJawPositions" }, { 0x300A, 0x011E, 0, VR::DS, VM::M1, "GantryAngle" }, { 0x300A, 0x011F, 0, VR::CS, VM::M1, "GantryRotationDirection" }, { 0x300A, 0x0120, 0, VR::DS, VM::M1, "BeamLimitingDeviceAngle" }, { 0x300A, 0x0121, 0, VR::CS, VM::M1, "BeamLimitingDeviceRotationDirection" }, { 0x300A, 0x0122, 0, VR::DS, VM::M1, "PatientSupportAngle" }, { 0x300A, 0x0123, 0, VR::CS, VM::M1, "PatientSupportRotationDirection" }, { 0x300A, 0x0124, 0, VR::DS, VM::M1, "TableTopEccentricAxisDistance" }, { 0x300A, 0x0125, 0, VR::DS, VM::M1, "TableTopEccentricAngle" }, { 0x300A, 0x0126, 0, VR::CS, VM::M1, "TableTopEccentricRotationDirection" }, { 0x300A, 0x0128, 0, VR::DS, VM::M1, "TableTopVerticalPosition" }, { 0x300A, 0x0129, 0, VR::DS, VM::M1, "TableTopLongitudinalPosition" }, { 0x300A, 0x012A, 0, VR::DS, VM::M1, "TableTopLateralPosition" }, { 0x300A, 0x012C, 0, VR::DS, VM::M3, "IsocenterPosition" }, { 0x300A, 0x012E, 0, VR::DS, VM::M3, "SurfaceEntryPoint" }, { 0x300A, 0x0130, 0, VR::DS, VM::M1, "SourceToSurfaceDistance" }, { 0x300A, 0x0131, 0, VR::FL, VM::M1, "AverageBeamDosePointSourceToExternalContourDistance" }, { 0x300A, 0x0132, 0, VR::FL, VM::M1, "SourceToExternalContourDistance" }, { 0x300A, 0x0133, 0, VR::FL, VM::M3, "ExternalContourEntryPoint" }, { 0x300A, 0x0134, 0, VR::DS, VM::M1, "CumulativeMetersetWeight" }, { 0x300A, 0x0140, 0, VR::FL, VM::M1, "TableTopPitchAngle" }, { 0x300A, 0x0142, 0, VR::CS, VM::M1, "TableTopPitchRotationDirection" }, { 0x300A, 0x0144, 0, VR::FL, VM::M1, "TableTopRollAngle" }, { 0x300A, 0x0146, 0, VR::CS, VM::M1, "TableTopRollRotationDirection" }, { 0x300A, 0x0148, 0, VR::FL, VM::M1, "HeadFixationAngle" }, { 0x300A, 0x014A, 0, VR::FL, VM::M1, "GantryPitchAngle" }, { 0x300A, 0x014C, 0, VR::CS, VM::M1, "GantryPitchRotationDirection" }, { 0x300A, 0x014E, 0, VR::FL, VM::M1, "GantryPitchAngleTolerance" }, { 0x300A, 0x0150, 0, VR::CS, VM::M1, "FixationEye" }, { 0x300A, 0x0151, 0, VR::DS, VM::M1, "ChairHeadFramePosition" }, { 0x300A, 0x0152, 0, VR::DS, VM::M1, "HeadFixationAngleTolerance" }, { 0x300A, 0x0153, 0, VR::DS, VM::M1, "ChairHeadFramePositionTolerance" }, { 0x300A, 0x0154, 0, VR::DS, VM::M1, "FixationLightAzimuthalAngleTolerance" }, { 0x300A, 0x0155, 0, VR::DS, VM::M1, "FixationLightPolarAngleTolerance" }, { 0x300A, 0x0180, 0, VR::SQ, VM::M1, "PatientSetupSequence" }, { 0x300A, 0x0182, 0, VR::IS, VM::M1, "PatientSetupNumber" }, { 0x300A, 0x0183, 0, VR::LO, VM::M1, "PatientSetupLabel" }, { 0x300A, 0x0184, 0, VR::LO, VM::M1, "PatientAdditionalPosition" }, { 0x300A, 0x0190, 0, VR::SQ, VM::M1, "FixationDeviceSequence" }, { 0x300A, 0x0192, 0, VR::CS, VM::M1, "FixationDeviceType" }, { 0x300A, 0x0194, 0, VR::SH, VM::M1, "FixationDeviceLabel" }, { 0x300A, 0x0196, 0, VR::ST, VM::M1, "FixationDeviceDescription" }, { 0x300A, 0x0198, 0, VR::SH, VM::M1, "FixationDevicePosition" }, { 0x300A, 0x0199, 0, VR::FL, VM::M1, "FixationDevicePitchAngle" }, { 0x300A, 0x019A, 0, VR::FL, VM::M1, "FixationDeviceRollAngle" }, { 0x300A, 0x01A0, 0, VR::SQ, VM::M1, "ShieldingDeviceSequence" }, { 0x300A, 0x01A2, 0, VR::CS, VM::M1, "ShieldingDeviceType" }, { 0x300A, 0x01A4, 0, VR::SH, VM::M1, "ShieldingDeviceLabel" }, { 0x300A, 0x01A6, 0, VR::ST, VM::M1, "ShieldingDeviceDescription" }, { 0x300A, 0x01A8, 0, VR::SH, VM::M1, "ShieldingDevicePosition" }, { 0x300A, 0x01B0, 0, VR::CS, VM::M1, "SetupTechnique" }, { 0x300A, 0x01B2, 0, VR::ST, VM::M1, "SetupTechniqueDescription" }, { 0x300A, 0x01B4, 0, VR::SQ, VM::M1, "SetupDeviceSequence" }, { 0x300A, 0x01B6, 0, VR::CS, VM::M1, "SetupDeviceType" }, { 0x300A, 0x01B8, 0, VR::SH, VM::M1, "SetupDeviceLabel" }, { 0x300A, 0x01BA, 0, VR::ST, VM::M1, "SetupDeviceDescription" }, { 0x300A, 0x01BC, 0, VR::DS, VM::M1, "SetupDeviceParameter" }, { 0x300A, 0x01D0, 0, VR::ST, VM::M1, "SetupReferenceDescription" }, { 0x300A, 0x01D2, 0, VR::DS, VM::M1, "TableTopVerticalSetupDisplacement" }, { 0x300A, 0x01D4, 0, VR::DS, VM::M1, "TableTopLongitudinalSetupDisplacement" }, { 0x300A, 0x01D6, 0, VR::DS, VM::M1, "TableTopLateralSetupDisplacement" }, { 0x300A, 0x0200, 0, VR::CS, VM::M1, "BrachyTreatmentTechnique" }, { 0x300A, 0x0202, 0, VR::CS, VM::M1, "BrachyTreatmentType" }, { 0x300A, 0x0206, 0, VR::SQ, VM::M1, "TreatmentMachineSequence" }, { 0x300A, 0x0210, 0, VR::SQ, VM::M1, "SourceSequence" }, { 0x300A, 0x0212, 0, VR::IS, VM::M1, "SourceNumber" }, { 0x300A, 0x0214, 0, VR::CS, VM::M1, "SourceType" }, { 0x300A, 0x0216, 0, VR::LO, VM::M1, "SourceManufacturer" }, { 0x300A, 0x0218, 0, VR::DS, VM::M1, "ActiveSourceDiameter" }, { 0x300A, 0x021A, 0, VR::DS, VM::M1, "ActiveSourceLength" }, { 0x300A, 0x021B, 0, VR::SH, VM::M1, "SourceModelID" }, { 0x300A, 0x021C, 0, VR::LO, VM::M1, "SourceDescription" }, { 0x300A, 0x0222, 0, VR::DS, VM::M1, "SourceEncapsulationNominalThickness" }, { 0x300A, 0x0224, 0, VR::DS, VM::M1, "SourceEncapsulationNominalTransmission" }, { 0x300A, 0x0226, 0, VR::LO, VM::M1, "SourceIsotopeName" }, { 0x300A, 0x0228, 0, VR::DS, VM::M1, "SourceIsotopeHalfLife" }, { 0x300A, 0x0229, 0, VR::CS, VM::M1, "SourceStrengthUnits" }, { 0x300A, 0x022A, 0, VR::DS, VM::M1, "ReferenceAirKermaRate" }, { 0x300A, 0x022B, 0, VR::DS, VM::M1, "SourceStrength" }, { 0x300A, 0x022C, 0, VR::DA, VM::M1, "SourceStrengthReferenceDate" }, { 0x300A, 0x022E, 0, VR::TM, VM::M1, "SourceStrengthReferenceTime" }, { 0x300A, 0x0230, 0, VR::SQ, VM::M1, "ApplicationSetupSequence" }, { 0x300A, 0x0232, 0, VR::CS, VM::M1, "ApplicationSetupType" }, { 0x300A, 0x0234, 0, VR::IS, VM::M1, "ApplicationSetupNumber" }, { 0x300A, 0x0236, 0, VR::LO, VM::M1, "ApplicationSetupName" }, { 0x300A, 0x0238, 0, VR::LO, VM::M1, "ApplicationSetupManufacturer" }, { 0x300A, 0x0240, 0, VR::IS, VM::M1, "TemplateNumber" }, { 0x300A, 0x0242, 0, VR::SH, VM::M1, "TemplateType" }, { 0x300A, 0x0244, 0, VR::LO, VM::M1, "TemplateName" }, { 0x300A, 0x0250, 0, VR::DS, VM::M1, "TotalReferenceAirKerma" }, { 0x300A, 0x0260, 0, VR::SQ, VM::M1, "BrachyAccessoryDeviceSequence" }, { 0x300A, 0x0262, 0, VR::IS, VM::M1, "BrachyAccessoryDeviceNumber" }, { 0x300A, 0x0263, 0, VR::SH, VM::M1, "BrachyAccessoryDeviceID" }, { 0x300A, 0x0264, 0, VR::CS, VM::M1, "BrachyAccessoryDeviceType" }, { 0x300A, 0x0266, 0, VR::LO, VM::M1, "BrachyAccessoryDeviceName" }, { 0x300A, 0x026A, 0, VR::DS, VM::M1, "BrachyAccessoryDeviceNominalThickness" }, { 0x300A, 0x026C, 0, VR::DS, VM::M1, "BrachyAccessoryDeviceNominalTransmission" }, { 0x300A, 0x0271, 0, VR::DS, VM::M1, "ChannelEffectiveLength" }, { 0x300A, 0x0272, 0, VR::DS, VM::M1, "ChannelInnerLength" }, { 0x300A, 0x0273, 0, VR::SH, VM::M1, "AfterloaderChannelID" }, { 0x300A, 0x0274, 0, VR::DS, VM::M1, "SourceApplicatorTipLength" }, { 0x300A, 0x0280, 0, VR::SQ, VM::M1, "ChannelSequence" }, { 0x300A, 0x0282, 0, VR::IS, VM::M1, "ChannelNumber" }, { 0x300A, 0x0284, 0, VR::DS, VM::M1, "ChannelLength" }, { 0x300A, 0x0286, 0, VR::DS, VM::M1, "ChannelTotalTime" }, { 0x300A, 0x0288, 0, VR::CS, VM::M1, "SourceMovementType" }, { 0x300A, 0x028A, 0, VR::IS, VM::M1, "NumberOfPulses" }, { 0x300A, 0x028C, 0, VR::DS, VM::M1, "PulseRepetitionInterval" }, { 0x300A, 0x0290, 0, VR::IS, VM::M1, "SourceApplicatorNumber" }, { 0x300A, 0x0291, 0, VR::SH, VM::M1, "SourceApplicatorID" }, { 0x300A, 0x0292, 0, VR::CS, VM::M1, "SourceApplicatorType" }, { 0x300A, 0x0294, 0, VR::LO, VM::M1, "SourceApplicatorName" }, { 0x300A, 0x0296, 0, VR::DS, VM::M1, "SourceApplicatorLength" }, { 0x300A, 0x0298, 0, VR::LO, VM::M1, "SourceApplicatorManufacturer" }, { 0x300A, 0x029C, 0, VR::DS, VM::M1, "SourceApplicatorWallNominalThickness" }, { 0x300A, 0x029E, 0, VR::DS, VM::M1, "SourceApplicatorWallNominalTransmission" }, { 0x300A, 0x02A0, 0, VR::DS, VM::M1, "SourceApplicatorStepSize" }, { 0x300A, 0x02A2, 0, VR::IS, VM::M1, "TransferTubeNumber" }, { 0x300A, 0x02A4, 0, VR::DS, VM::M1, "TransferTubeLength" }, { 0x300A, 0x02B0, 0, VR::SQ, VM::M1, "ChannelShieldSequence" }, { 0x300A, 0x02B2, 0, VR::IS, VM::M1, "ChannelShieldNumber" }, { 0x300A, 0x02B3, 0, VR::SH, VM::M1, "ChannelShieldID" }, { 0x300A, 0x02B4, 0, VR::LO, VM::M1, "ChannelShieldName" }, { 0x300A, 0x02B8, 0, VR::DS, VM::M1, "ChannelShieldNominalThickness" }, { 0x300A, 0x02BA, 0, VR::DS, VM::M1, "ChannelShieldNominalTransmission" }, { 0x300A, 0x02C8, 0, VR::DS, VM::M1, "FinalCumulativeTimeWeight" }, { 0x300A, 0x02D0, 0, VR::SQ, VM::M1, "BrachyControlPointSequence" }, { 0x300A, 0x02D2, 0, VR::DS, VM::M1, "ControlPointRelativePosition" }, { 0x300A, 0x02D4, 0, VR::DS, VM::M3, "ControlPoint3DPosition" }, { 0x300A, 0x02D6, 0, VR::DS, VM::M1, "CumulativeTimeWeight" }, { 0x300A, 0x02E0, 0, VR::CS, VM::M1, "CompensatorDivergence" }, { 0x300A, 0x02E1, 0, VR::CS, VM::M1, "CompensatorMountingPosition" }, { 0x300A, 0x02E2, 0, VR::DS, VM::M1TN, "SourceToCompensatorDistance" }, { 0x300A, 0x02E3, 0, VR::FL, VM::M1, "TotalCompensatorTrayWaterEquivalentThickness" }, { 0x300A, 0x02E4, 0, VR::FL, VM::M1, "IsocenterToCompensatorTrayDistance" }, { 0x300A, 0x02E5, 0, VR::FL, VM::M1, "CompensatorColumnOffset" }, { 0x300A, 0x02E6, 0, VR::FL, VM::M1TN, "IsocenterToCompensatorDistances" }, { 0x300A, 0x02E7, 0, VR::FL, VM::M1, "CompensatorRelativeStoppingPowerRatio" }, { 0x300A, 0x02E8, 0, VR::FL, VM::M1, "CompensatorMillingToolDiameter" }, { 0x300A, 0x02EA, 0, VR::SQ, VM::M1, "IonRangeCompensatorSequence" }, { 0x300A, 0x02EB, 0, VR::LT, VM::M1, "CompensatorDescription" }, { 0x300A, 0x0302, 0, VR::IS, VM::M1, "RadiationMassNumber" }, { 0x300A, 0x0304, 0, VR::IS, VM::M1, "RadiationAtomicNumber" }, { 0x300A, 0x0306, 0, VR::SS, VM::M1, "RadiationChargeState" }, { 0x300A, 0x0308, 0, VR::CS, VM::M1, "ScanMode" }, { 0x300A, 0x0309, 0, VR::CS, VM::M1, "ModulatedScanModeType" }, { 0x300A, 0x030A, 0, VR::FL, VM::M2, "VirtualSourceAxisDistances" }, { 0x300A, 0x030C, 0, VR::SQ, VM::M1, "SnoutSequence" }, { 0x300A, 0x030D, 0, VR::FL, VM::M1, "SnoutPosition" }, { 0x300A, 0x030F, 0, VR::SH, VM::M1, "SnoutID" }, { 0x300A, 0x0312, 0, VR::IS, VM::M1, "NumberOfRangeShifters" }, { 0x300A, 0x0314, 0, VR::SQ, VM::M1, "RangeShifterSequence" }, { 0x300A, 0x0316, 0, VR::IS, VM::M1, "RangeShifterNumber" }, { 0x300A, 0x0318, 0, VR::SH, VM::M1, "RangeShifterID" }, { 0x300A, 0x0320, 0, VR::CS, VM::M1, "RangeShifterType" }, { 0x300A, 0x0322, 0, VR::LO, VM::M1, "RangeShifterDescription" }, { 0x300A, 0x0330, 0, VR::IS, VM::M1, "NumberOfLateralSpreadingDevices" }, { 0x300A, 0x0332, 0, VR::SQ, VM::M1, "LateralSpreadingDeviceSequence" }, { 0x300A, 0x0334, 0, VR::IS, VM::M1, "LateralSpreadingDeviceNumber" }, { 0x300A, 0x0336, 0, VR::SH, VM::M1, "LateralSpreadingDeviceID" }, { 0x300A, 0x0338, 0, VR::CS, VM::M1, "LateralSpreadingDeviceType" }, { 0x300A, 0x033A, 0, VR::LO, VM::M1, "LateralSpreadingDeviceDescription" }, { 0x300A, 0x033C, 0, VR::FL, VM::M1, "LateralSpreadingDeviceWaterEquivalentThickness" }, { 0x300A, 0x0340, 0, VR::IS, VM::M1, "NumberOfRangeModulators" }, { 0x300A, 0x0342, 0, VR::SQ, VM::M1, "RangeModulatorSequence" }, { 0x300A, 0x0344, 0, VR::IS, VM::M1, "RangeModulatorNumber" }, { 0x300A, 0x0346, 0, VR::SH, VM::M1, "RangeModulatorID" }, { 0x300A, 0x0348, 0, VR::CS, VM::M1, "RangeModulatorType" }, { 0x300A, 0x034A, 0, VR::LO, VM::M1, "RangeModulatorDescription" }, { 0x300A, 0x034C, 0, VR::SH, VM::M1, "BeamCurrentModulationID" }, { 0x300A, 0x0350, 0, VR::CS, VM::M1, "PatientSupportType" }, { 0x300A, 0x0352, 0, VR::SH, VM::M1, "PatientSupportID" }, { 0x300A, 0x0354, 0, VR::LO, VM::M1, "PatientSupportAccessoryCode" }, { 0x300A, 0x0355, 0, VR::LO, VM::M1, "TrayAccessoryCode" }, { 0x300A, 0x0356, 0, VR::FL, VM::M1, "FixationLightAzimuthalAngle" }, { 0x300A, 0x0358, 0, VR::FL, VM::M1, "FixationLightPolarAngle" }, { 0x300A, 0x035A, 0, VR::FL, VM::M1, "MetersetRate" }, { 0x300A, 0x0360, 0, VR::SQ, VM::M1, "RangeShifterSettingsSequence" }, { 0x300A, 0x0362, 0, VR::LO, VM::M1, "RangeShifterSetting" }, { 0x300A, 0x0364, 0, VR::FL, VM::M1, "IsocenterToRangeShifterDistance" }, { 0x300A, 0x0366, 0, VR::FL, VM::M1, "RangeShifterWaterEquivalentThickness" }, { 0x300A, 0x0370, 0, VR::SQ, VM::M1, "LateralSpreadingDeviceSettingsSequence" }, { 0x300A, 0x0372, 0, VR::LO, VM::M1, "LateralSpreadingDeviceSetting" }, { 0x300A, 0x0374, 0, VR::FL, VM::M1, "IsocenterToLateralSpreadingDeviceDistance" }, { 0x300A, 0x0380, 0, VR::SQ, VM::M1, "RangeModulatorSettingsSequence" }, { 0x300A, 0x0382, 0, VR::FL, VM::M1, "RangeModulatorGatingStartValue" }, { 0x300A, 0x0384, 0, VR::FL, VM::M1, "RangeModulatorGatingStopValue" }, { 0x300A, 0x0386, 0, VR::FL, VM::M1, "RangeModulatorGatingStartWaterEquivalentThickness" }, { 0x300A, 0x0388, 0, VR::FL, VM::M1, "RangeModulatorGatingStopWaterEquivalentThickness" }, { 0x300A, 0x038A, 0, VR::FL, VM::M1, "IsocenterToRangeModulatorDistance" }, { 0x300A, 0x038F, 0, VR::FL, VM::M1TN, "ScanSpotTimeOffset" }, { 0x300A, 0x0390, 0, VR::SH, VM::M1, "ScanSpotTuneID" }, { 0x300A, 0x0391, 0, VR::IS, VM::M1TN, "ScanSpotPrescribedIndices" }, { 0x300A, 0x0392, 0, VR::IS, VM::M1, "NumberOfScanSpotPositions" }, { 0x300A, 0x0393, 0, VR::CS, VM::M1, "ScanSpotReordered" }, { 0x300A, 0x0394, 0, VR::FL, VM::M1TN, "ScanSpotPositionMap" }, { 0x300A, 0x0395, 0, VR::CS, VM::M1, "ScanSpotReorderingAllowed" }, { 0x300A, 0x0396, 0, VR::FL, VM::M1TN, "ScanSpotMetersetWeights" }, { 0x300A, 0x0398, 0, VR::FL, VM::M2, "ScanningSpotSize" }, { 0x300A, 0x039A, 0, VR::IS, VM::M1, "NumberOfPaintings" }, { 0x300A, 0x03A0, 0, VR::SQ, VM::M1, "IonToleranceTableSequence" }, { 0x300A, 0x03A2, 0, VR::SQ, VM::M1, "IonBeamSequence" }, { 0x300A, 0x03A4, 0, VR::SQ, VM::M1, "IonBeamLimitingDeviceSequence" }, { 0x300A, 0x03A6, 0, VR::SQ, VM::M1, "IonBlockSequence" }, { 0x300A, 0x03A8, 0, VR::SQ, VM::M1, "IonControlPointSequence" }, { 0x300A, 0x03AA, 0, VR::SQ, VM::M1, "IonWedgeSequence" }, { 0x300A, 0x03AC, 0, VR::SQ, VM::M1, "IonWedgePositionSequence" }, { 0x300A, 0x0401, 0, VR::SQ, VM::M1, "ReferencedSetupImageSequence" }, { 0x300A, 0x0402, 0, VR::ST, VM::M1, "SetupImageComment" }, { 0x300A, 0x0410, 0, VR::SQ, VM::M1, "MotionSynchronizationSequence" }, { 0x300A, 0x0412, 0, VR::FL, VM::M3, "ControlPointOrientation" }, { 0x300A, 0x0420, 0, VR::SQ, VM::M1, "GeneralAccessorySequence" }, { 0x300A, 0x0421, 0, VR::SH, VM::M1, "GeneralAccessoryID" }, { 0x300A, 0x0422, 0, VR::ST, VM::M1, "GeneralAccessoryDescription" }, { 0x300A, 0x0423, 0, VR::CS, VM::M1, "GeneralAccessoryType" }, { 0x300A, 0x0424, 0, VR::IS, VM::M1, "GeneralAccessoryNumber" }, { 0x300A, 0x0425, 0, VR::FL, VM::M1, "SourceToGeneralAccessoryDistance" }, { 0x300A, 0x0431, 0, VR::SQ, VM::M1, "ApplicatorGeometrySequence" }, { 0x300A, 0x0432, 0, VR::CS, VM::M1, "ApplicatorApertureShape" }, { 0x300A, 0x0433, 0, VR::FL, VM::M1, "ApplicatorOpening" }, { 0x300A, 0x0434, 0, VR::FL, VM::M1, "ApplicatorOpeningX" }, { 0x300A, 0x0435, 0, VR::FL, VM::M1, "ApplicatorOpeningY" }, { 0x300A, 0x0436, 0, VR::FL, VM::M1, "SourceToApplicatorMountingPositionDistance" }, { 0x300A, 0x0440, 0, VR::IS, VM::M1, "NumberOfBlockSlabItems" }, { 0x300A, 0x0441, 0, VR::SQ, VM::M1, "BlockSlabSequence" }, { 0x300A, 0x0442, 0, VR::DS, VM::M1, "BlockSlabThickness" }, { 0x300A, 0x0443, 0, VR::US, VM::M1, "BlockSlabNumber" }, { 0x300A, 0x0450, 0, VR::SQ, VM::M1, "DeviceMotionControlSequence" }, { 0x300A, 0x0451, 0, VR::CS, VM::M1, "DeviceMotionExecutionMode" }, { 0x300A, 0x0452, 0, VR::CS, VM::M1, "DeviceMotionObservationMode" }, { 0x300A, 0x0453, 0, VR::SQ, VM::M1, "DeviceMotionParameterCodeSequence" }, { 0x300A, 0x0501, 0, VR::FL, VM::M1, "DistalDepthFraction" }, { 0x300A, 0x0502, 0, VR::FL, VM::M1, "DistalDepth" }, { 0x300A, 0x0503, 0, VR::FL, VM::M2, "NominalRangeModulationFractions" }, { 0x300A, 0x0504, 0, VR::FL, VM::M2, "NominalRangeModulatedRegionDepths" }, { 0x300A, 0x0505, 0, VR::SQ, VM::M1, "DepthDoseParametersSequence" }, { 0x300A, 0x0506, 0, VR::SQ, VM::M1, "DeliveredDepthDoseParametersSequence" }, { 0x300A, 0x0507, 0, VR::FL, VM::M1, "DeliveredDistalDepthFraction" }, { 0x300A, 0x0508, 0, VR::FL, VM::M1, "DeliveredDistalDepth" }, { 0x300A, 0x0509, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulationFractions" }, { 0x300A, 0x0510, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulatedRegionDepths" }, { 0x300A, 0x0511, 0, VR::CS, VM::M1, "DeliveredReferenceDoseDefinition" }, { 0x300A, 0x0512, 0, VR::CS, VM::M1, "ReferenceDoseDefinition" }, { 0x300A, 0x0600, 0, VR::US, VM::M1, "RTControlPointIndex" }, { 0x300A, 0x0601, 0, VR::US, VM::M1, "RadiationGenerationModeIndex" }, { 0x300A, 0x0602, 0, VR::US, VM::M1, "ReferencedDefinedDeviceIndex" }, { 0x300A, 0x0603, 0, VR::US, VM::M1, "RadiationDoseIdentificationIndex" }, { 0x300A, 0x0604, 0, VR::US, VM::M1, "NumberOfRTControlPoints" }, { 0x300A, 0x0605, 0, VR::US, VM::M1, "ReferencedRadiationGenerationModeIndex" }, { 0x300A, 0x0606, 0, VR::US, VM::M1, "TreatmentPositionIndex" }, { 0x300A, 0x0607, 0, VR::US, VM::M1, "ReferencedDeviceIndex" }, { 0x300A, 0x0608, 0, VR::LO, VM::M1, "TreatmentPositionGroupLabel" }, { 0x300A, 0x0609, 0, VR::UI, VM::M1, "TreatmentPositionGroupUID" }, { 0x300A, 0x060A, 0, VR::SQ, VM::M1, "TreatmentPositionGroupSequence" }, { 0x300A, 0x060B, 0, VR::US, VM::M1, "ReferencedTreatmentPositionIndex" }, { 0x300A, 0x060C, 0, VR::US, VM::M1, "ReferencedRadiationDoseIdentificationIndex" }, { 0x300A, 0x060D, 0, VR::FD, VM::M1, "RTAccessoryHolderWaterEquivalentThickness" }, { 0x300A, 0x060E, 0, VR::US, VM::M1, "ReferencedRTAccessoryHolderDeviceIndex" }, { 0x300A, 0x060F, 0, VR::CS, VM::M1, "RTAccessoryHolderSlotExistenceFlag" }, { 0x300A, 0x0610, 0, VR::SQ, VM::M1, "RTAccessoryHolderSlotSequence" }, { 0x300A, 0x0611, 0, VR::LO, VM::M1, "RTAccessoryHolderSlotID" }, { 0x300A, 0x0612, 0, VR::FD, VM::M1, "RTAccessoryHolderSlotDistance" }, { 0x300A, 0x0613, 0, VR::FD, VM::M1, "RTAccessorySlotDistance" }, { 0x300A, 0x0614, 0, VR::SQ, VM::M1, "RTAccessoryHolderDefinitionSequence" }, { 0x300A, 0x0615, 0, VR::LO, VM::M1, "RTAccessoryDeviceSlotID" }, { 0x300A, 0x0616, 0, VR::SQ, VM::M1, "RTRadiationSequence" }, { 0x300A, 0x0617, 0, VR::SQ, VM::M1, "RadiationDoseSequence" }, { 0x300A, 0x0618, 0, VR::SQ, VM::M1, "RadiationDoseIdentificationSequence" }, { 0x300A, 0x0619, 0, VR::LO, VM::M1, "RadiationDoseIdentificationLabel" }, { 0x300A, 0x061A, 0, VR::CS, VM::M1, "ReferenceDoseType" }, { 0x300A, 0x061B, 0, VR::CS, VM::M1, "PrimaryDoseValueIndicator" }, { 0x300A, 0x061C, 0, VR::SQ, VM::M1, "DoseValuesSequence" }, { 0x300A, 0x061D, 0, VR::CS, VM::M1TN, "DoseValuePurpose" }, { 0x300A, 0x061E, 0, VR::FD, VM::M3, "ReferenceDosePointCoordinates" }, { 0x300A, 0x061F, 0, VR::SQ, VM::M1, "RadiationDoseValuesParametersSequence" }, { 0x300A, 0x0620, 0, VR::SQ, VM::M1, "MetersetToDoseMappingSequence" }, { 0x300A, 0x0621, 0, VR::SQ, VM::M1, "ExpectedInVivoMeasurementValuesSequence" }, { 0x300A, 0x0622, 0, VR::US, VM::M1, "ExpectedInVivoMeasurementValueIndex" }, { 0x300A, 0x0623, 0, VR::LO, VM::M1, "RadiationDoseInVivoMeasurementLabel" }, { 0x300A, 0x0624, 0, VR::FD, VM::M2, "RadiationDoseCentralAxisDisplacement" }, { 0x300A, 0x0625, 0, VR::FD, VM::M1, "RadiationDoseValue" }, { 0x300A, 0x0626, 0, VR::FD, VM::M1, "RadiationDoseSourceToSkinDistance" }, { 0x300A, 0x0627, 0, VR::FD, VM::M3, "RadiationDoseMeasurementPointCoordinates" }, { 0x300A, 0x0628, 0, VR::FD, VM::M1, "RadiationDoseSourceToExternalContourDistance" }, { 0x300A, 0x0629, 0, VR::SQ, VM::M1, "RTToleranceSetSequence" }, { 0x300A, 0x062A, 0, VR::LO, VM::M1, "RTToleranceSetLabel" }, { 0x300A, 0x062B, 0, VR::SQ, VM::M1, "AttributeToleranceValuesSequence" }, { 0x300A, 0x062C, 0, VR::FD, VM::M1, "ToleranceValue" }, { 0x300A, 0x062D, 0, VR::SQ, VM::M1, "PatientSupportPositionToleranceSequence" }, { 0x300A, 0x062E, 0, VR::FD, VM::M1, "TreatmentTimeLimit" }, { 0x300A, 0x062F, 0, VR::SQ, VM::M1, "CArmPhotonElectronControlPointSequence" }, { 0x300A, 0x0630, 0, VR::SQ, VM::M1, "ReferencedRTRadiationSequence" }, { 0x300A, 0x0631, 0, VR::SQ, VM::M1, "ReferencedRTInstanceSequence" }, { 0x300A, 0x0632, 0, VR::SQ, VM::M1, "ReferencedRTPatientSetupSequence" }, { 0x300A, 0x0634, 0, VR::FD, VM::M1, "SourceToPatientSurfaceDistance" }, { 0x300A, 0x0635, 0, VR::SQ, VM::M1, "TreatmentMachineSpecialModeCodeSequence" }, { 0x300A, 0x0636, 0, VR::US, VM::M1, "IntendedNumberOfFractions" }, { 0x300A, 0x0637, 0, VR::CS, VM::M1, "RTRadiationSetIntent" }, { 0x300A, 0x0638, 0, VR::CS, VM::M1, "RTRadiationPhysicalAndGeometricContentDetailFlag" }, { 0x300A, 0x0639, 0, VR::CS, VM::M1, "RTRecordFlag" }, { 0x300A, 0x063A, 0, VR::SQ, VM::M1, "TreatmentDeviceIdentificationSequence" }, { 0x300A, 0x063B, 0, VR::SQ, VM::M1, "ReferencedRTPhysicianIntentSequence" }, { 0x300A, 0x063C, 0, VR::FD, VM::M1, "CumulativeMeterset" }, { 0x300A, 0x063D, 0, VR::FD, VM::M1, "DeliveryRate" }, { 0x300A, 0x063E, 0, VR::SQ, VM::M1, "DeliveryRateUnitSequence" }, { 0x300A, 0x063F, 0, VR::SQ, VM::M1, "TreatmentPositionSequence" }, { 0x300A, 0x0640, 0, VR::FD, VM::M1, "RadiationSourceAxisDistance" }, { 0x300A, 0x0641, 0, VR::US, VM::M1, "NumberOfRTBeamLimitingDevices" }, { 0x300A, 0x0642, 0, VR::FD, VM::M1, "RTBeamLimitingDeviceProximalDistance" }, { 0x300A, 0x0643, 0, VR::FD, VM::M1, "RTBeamLimitingDeviceDistalDistance" }, { 0x300A, 0x0644, 0, VR::SQ, VM::M1, "ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence" }, { 0x300A, 0x0645, 0, VR::FD, VM::M1, "BeamModifierOrientationAngle" }, { 0x300A, 0x0646, 0, VR::SQ, VM::M1, "FixedRTBeamDelimiterDeviceSequence" }, { 0x300A, 0x0647, 0, VR::SQ, VM::M1, "ParallelRTBeamDelimiterDeviceSequence" }, { 0x300A, 0x0648, 0, VR::US, VM::M1, "NumberOfParallelRTBeamDelimiters" }, { 0x300A, 0x0649, 0, VR::FD, VM::M2TN, "ParallelRTBeamDelimiterBoundaries" }, { 0x300A, 0x064A, 0, VR::FD, VM::M2TN, "ParallelRTBeamDelimiterPositions" }, { 0x300A, 0x064B, 0, VR::FD, VM::M2, "RTBeamLimitingDeviceOffset" }, { 0x300A, 0x064C, 0, VR::SQ, VM::M1, "RTBeamDelimiterGeometrySequence" }, { 0x300A, 0x064D, 0, VR::SQ, VM::M1, "RTBeamLimitingDeviceDefinitionSequence" }, { 0x300A, 0x064E, 0, VR::CS, VM::M1, "ParallelRTBeamDelimiterOpeningMode" }, { 0x300A, 0x064F, 0, VR::CS, VM::M1TN, "ParallelRTBeamDelimiterLeafMountingSide" }, { 0x300A, 0x0650, 0, VR::UI, VM::M1, "PatientSetupUID" }, { 0x300A, 0x0651, 0, VR::SQ, VM::M1, "WedgeDefinitionSequence" }, { 0x300A, 0x0652, 0, VR::FD, VM::M1, "RadiationBeamWedgeAngle" }, { 0x300A, 0x0653, 0, VR::FD, VM::M1, "RadiationBeamWedgeThinEdgeDistance" }, { 0x300A, 0x0654, 0, VR::FD, VM::M1, "RadiationBeamEffectiveWedgeAngle" }, { 0x300A, 0x0655, 0, VR::US, VM::M1, "NumberOfWedgePositions" }, { 0x300A, 0x0656, 0, VR::SQ, VM::M1, "RTBeamLimitingDeviceOpeningSequence" }, { 0x300A, 0x0657, 0, VR::US, VM::M1, "NumberOfRTBeamLimitingDeviceOpenings" }, { 0x300A, 0x0658, 0, VR::SQ, VM::M1, "RadiationDosimeterUnitSequence" }, { 0x300A, 0x0659, 0, VR::SQ, VM::M1, "RTDeviceDistanceReferenceLocationCodeSequence" }, { 0x300A, 0x065A, 0, VR::SQ, VM::M1, "RadiationDeviceConfigurationAndCommissioningKeySequence" }, { 0x300A, 0x065B, 0, VR::SQ, VM::M1, "PatientSupportPositionParameterSequence" }, { 0x300A, 0x065C, 0, VR::CS, VM::M1, "PatientSupportPositionSpecificationMethod" }, { 0x300A, 0x065D, 0, VR::SQ, VM::M1, "PatientSupportPositionDeviceParameterSequence" }, { 0x300A, 0x065E, 0, VR::US, VM::M1, "DeviceOrderIndex" }, { 0x300A, 0x065F, 0, VR::US, VM::M1, "PatientSupportPositionParameterOrderIndex" }, { 0x300A, 0x0660, 0, VR::SQ, VM::M1, "PatientSupportPositionDeviceToleranceSequence" }, { 0x300A, 0x0661, 0, VR::US, VM::M1, "PatientSupportPositionToleranceOrderIndex" }, { 0x300A, 0x0662, 0, VR::SQ, VM::M1, "CompensatorDefinitionSequence" }, { 0x300A, 0x0663, 0, VR::CS, VM::M1, "CompensatorMapOrientation" }, { 0x300A, 0x0664, 0, VR::OF, VM::M1, "CompensatorProximalThicknessMap" }, { 0x300A, 0x0665, 0, VR::OF, VM::M1, "CompensatorDistalThicknessMap" }, { 0x300A, 0x0666, 0, VR::FD, VM::M1, "CompensatorBasePlaneOffset" }, { 0x300A, 0x0667, 0, VR::SQ, VM::M1, "CompensatorShapeFabricationCodeSequence" }, { 0x300A, 0x0668, 0, VR::SQ, VM::M1, "CompensatorShapeSequence" }, { 0x300A, 0x0669, 0, VR::FD, VM::M1, "RadiationBeamCompensatorMillingToolDiameter" }, { 0x300A, 0x066A, 0, VR::SQ, VM::M1, "BlockDefinitionSequence" }, { 0x300A, 0x066B, 0, VR::OF, VM::M1, "BlockEdgeData" }, { 0x300A, 0x066C, 0, VR::CS, VM::M1, "BlockOrientation" }, { 0x300A, 0x066D, 0, VR::FD, VM::M1, "RadiationBeamBlockThickness" }, { 0x300A, 0x066E, 0, VR::FD, VM::M1, "RadiationBeamBlockSlabThickness" }, { 0x300A, 0x066F, 0, VR::SQ, VM::M1, "BlockEdgeDataSequence" }, { 0x300A, 0x0670, 0, VR::US, VM::M1, "NumberOfRTAccessoryHolders" }, { 0x300A, 0x0671, 0, VR::SQ, VM::M1, "GeneralAccessoryDefinitionSequence" }, { 0x300A, 0x0672, 0, VR::US, VM::M1, "NumberOfGeneralAccessories" }, { 0x300A, 0x0673, 0, VR::SQ, VM::M1, "BolusDefinitionSequence" }, { 0x300A, 0x0674, 0, VR::US, VM::M1, "NumberOfBoluses" }, { 0x300A, 0x0675, 0, VR::UI, VM::M1, "EquipmentFrameOfReferenceUID" }, { 0x300A, 0x0676, 0, VR::ST, VM::M1, "EquipmentFrameOfReferenceDescription" }, { 0x300A, 0x0677, 0, VR::SQ, VM::M1, "EquipmentReferencePointCoordinatesSequence" }, { 0x300A, 0x0678, 0, VR::SQ, VM::M1, "EquipmentReferencePointCodeSequence" }, { 0x300A, 0x0679, 0, VR::FD, VM::M1, "RTBeamLimitingDeviceAngle" }, { 0x300A, 0x067A, 0, VR::FD, VM::M1, "SourceRollAngle" }, { 0x300A, 0x067B, 0, VR::SQ, VM::M1, "RadiationGenerationModeSequence" }, { 0x300A, 0x067C, 0, VR::SH, VM::M1, "RadiationGenerationModeLabel" }, { 0x300A, 0x067D, 0, VR::ST, VM::M1, "RadiationGenerationModeDescription" }, { 0x300A, 0x067E, 0, VR::SQ, VM::M1, "RadiationGenerationModeMachineCodeSequence" }, { 0x300A, 0x067F, 0, VR::SQ, VM::M1, "RadiationTypeCodeSequence" }, { 0x300A, 0x0680, 0, VR::DS, VM::M1, "NominalEnergy" }, { 0x300A, 0x0681, 0, VR::DS, VM::M1, "MinimumNominalEnergy" }, { 0x300A, 0x0682, 0, VR::DS, VM::M1, "MaximumNominalEnergy" }, { 0x300A, 0x0683, 0, VR::SQ, VM::M1, "RadiationFluenceModifierCodeSequence" }, { 0x300A, 0x0684, 0, VR::SQ, VM::M1, "EnergyUnitCodeSequence" }, { 0x300A, 0x0685, 0, VR::US, VM::M1, "NumberOfRadiationGenerationModes" }, { 0x300A, 0x0686, 0, VR::SQ, VM::M1, "PatientSupportDevicesSequence" }, { 0x300A, 0x0687, 0, VR::US, VM::M1, "NumberOfPatientSupportDevices" }, { 0x300A, 0x0688, 0, VR::FD, VM::M1, "RTBeamModifierDefinitionDistance" }, { 0x300A, 0x0689, 0, VR::SQ, VM::M1, "BeamAreaLimitSequence" }, { 0x300A, 0x068A, 0, VR::SQ, VM::M1, "ReferencedRTPrescriptionSequence" }, { 0x300C, 0x0002, 0, VR::SQ, VM::M1, "ReferencedRTPlanSequence" }, { 0x300C, 0x0004, 0, VR::SQ, VM::M1, "ReferencedBeamSequence" }, { 0x300C, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamNumber" }, { 0x300C, 0x0007, 0, VR::IS, VM::M1, "ReferencedReferenceImageNumber" }, { 0x300C, 0x0008, 0, VR::DS, VM::M1, "StartCumulativeMetersetWeight" }, { 0x300C, 0x0009, 0, VR::DS, VM::M1, "EndCumulativeMetersetWeight" }, { 0x300C, 0x000A, 0, VR::SQ, VM::M1, "ReferencedBrachyApplicationSetupSequence" }, { 0x300C, 0x000C, 0, VR::IS, VM::M1, "ReferencedBrachyApplicationSetupNumber" }, { 0x300C, 0x000E, 0, VR::IS, VM::M1, "ReferencedSourceNumber" }, { 0x300C, 0x0020, 0, VR::SQ, VM::M1, "ReferencedFractionGroupSequence" }, { 0x300C, 0x0022, 0, VR::IS, VM::M1, "ReferencedFractionGroupNumber" }, { 0x300C, 0x0040, 0, VR::SQ, VM::M1, "ReferencedVerificationImageSequence" }, { 0x300C, 0x0042, 0, VR::SQ, VM::M1, "ReferencedReferenceImageSequence" }, { 0x300C, 0x0050, 0, VR::SQ, VM::M1, "ReferencedDoseReferenceSequence" }, { 0x300C, 0x0051, 0, VR::IS, VM::M1, "ReferencedDoseReferenceNumber" }, { 0x300C, 0x0055, 0, VR::SQ, VM::M1, "BrachyReferencedDoseReferenceSequence" }, { 0x300C, 0x0060, 0, VR::SQ, VM::M1, "ReferencedStructureSetSequence" }, { 0x300C, 0x006A, 0, VR::IS, VM::M1, "ReferencedPatientSetupNumber" }, { 0x300C, 0x0080, 0, VR::SQ, VM::M1, "ReferencedDoseSequence" }, { 0x300C, 0x00A0, 0, VR::IS, VM::M1, "ReferencedToleranceTableNumber" }, { 0x300C, 0x00B0, 0, VR::SQ, VM::M1, "ReferencedBolusSequence" }, { 0x300C, 0x00C0, 0, VR::IS, VM::M1, "ReferencedWedgeNumber" }, { 0x300C, 0x00D0, 0, VR::IS, VM::M1, "ReferencedCompensatorNumber" }, { 0x300C, 0x00E0, 0, VR::IS, VM::M1, "ReferencedBlockNumber" }, { 0x300C, 0x00F0, 0, VR::IS, VM::M1, "ReferencedControlPointIndex" }, { 0x300C, 0x00F2, 0, VR::SQ, VM::M1, "ReferencedControlPointSequence" }, { 0x300C, 0x00F4, 0, VR::IS, VM::M1, "ReferencedStartControlPointIndex" }, { 0x300C, 0x00F6, 0, VR::IS, VM::M1, "ReferencedStopControlPointIndex" }, { 0x300C, 0x0100, 0, VR::IS, VM::M1, "ReferencedRangeShifterNumber" }, { 0x300C, 0x0102, 0, VR::IS, VM::M1, "ReferencedLateralSpreadingDeviceNumber" }, { 0x300C, 0x0104, 0, VR::IS, VM::M1, "ReferencedRangeModulatorNumber" }, { 0x300C, 0x0111, 0, VR::SQ, VM::M1, "OmittedBeamTaskSequence" }, { 0x300C, 0x0112, 0, VR::CS, VM::M1, "ReasonForOmission" }, { 0x300C, 0x0113, 0, VR::LO, VM::M1, "ReasonForOmissionDescription" }, { 0x300E, 0x0002, 0, VR::CS, VM::M1, "ApprovalStatus" }, { 0x300E, 0x0004, 0, VR::DA, VM::M1, "ReviewDate" }, { 0x300E, 0x0005, 0, VR::TM, VM::M1, "ReviewTime" }, { 0x300E, 0x0008, 0, VR::PN, VM::M1, "ReviewerName" }, { 0x3010, 0x0001, 0, VR::SQ, VM::M1, "RadiobiologicalDoseEffectSequence" }, { 0x3010, 0x0002, 0, VR::CS, VM::M1, "RadiobiologicalDoseEffectFlag" }, { 0x3010, 0x0003, 0, VR::SQ, VM::M1, "EffectiveDoseCalculationMethodCategoryCodeSequence" }, { 0x3010, 0x0004, 0, VR::SQ, VM::M1, "EffectiveDoseCalculationMethodCodeSequence" }, { 0x3010, 0x0005, 0, VR::LO, VM::M1, "EffectiveDoseCalculationMethodDescription" }, { 0x3010, 0x0006, 0, VR::UI, VM::M1, "ConceptualVolumeUID" }, { 0x3010, 0x0007, 0, VR::SQ, VM::M1, "OriginatingSOPInstanceReferenceSequence" }, { 0x3010, 0x0008, 0, VR::SQ, VM::M1, "ConceptualVolumeConstituentSequence" }, { 0x3010, 0x0009, 0, VR::SQ, VM::M1, "EquivalentConceptualVolumeInstanceReferenceSequence" }, { 0x3010, 0x000A, 0, VR::SQ, VM::M1, "EquivalentConceptualVolumesSequence" }, { 0x3010, 0x000B, 0, VR::UI, VM::M1, "ReferencedConceptualVolumeUID" }, { 0x3010, 0x000C, 0, VR::UT, VM::M1, "ConceptualVolumeCombinationExpression" }, { 0x3010, 0x000D, 0, VR::US, VM::M1, "ConceptualVolumeConstituentIndex" }, { 0x3010, 0x000E, 0, VR::CS, VM::M1, "ConceptualVolumeCombinationFlag" }, { 0x3010, 0x000F, 0, VR::ST, VM::M1, "ConceptualVolumeCombinationDescription" }, { 0x3010, 0x0010, 0, VR::CS, VM::M1, "ConceptualVolumeSegmentationDefinedFlag" }, { 0x3010, 0x0011, 0, VR::SQ, VM::M1, "ConceptualVolumeSegmentationReferenceSequence" }, { 0x3010, 0x0012, 0, VR::SQ, VM::M1, "ConceptualVolumeConstituentSegmentationReferenceSequence" }, { 0x3010, 0x0013, 0, VR::UI, VM::M1, "ConstituentConceptualVolumeUID" }, { 0x3010, 0x0014, 0, VR::SQ, VM::M1, "DerivationConceptualVolumeSequence" }, { 0x3010, 0x0015, 0, VR::UI, VM::M1, "SourceConceptualVolumeUID" }, { 0x3010, 0x0016, 0, VR::SQ, VM::M1, "ConceptualVolumeDerivationAlgorithmSequence" }, { 0x3010, 0x0017, 0, VR::ST, VM::M1, "ConceptualVolumeDescription" }, { 0x3010, 0x0018, 0, VR::SQ, VM::M1, "SourceConceptualVolumeSequence" }, { 0x3010, 0x0019, 0, VR::SQ, VM::M1, "AuthorIdentificationSequence" }, { 0x3010, 0x001A, 0, VR::LO, VM::M1, "ManufacturerModelVersion" }, { 0x3010, 0x001B, 0, VR::UC, VM::M1, "DeviceAlternateIdentifier" }, { 0x3010, 0x001C, 0, VR::CS, VM::M1, "DeviceAlternateIdentifierType" }, { 0x3010, 0x001D, 0, VR::LT, VM::M1, "DeviceAlternateIdentifierFormat" }, { 0x3010, 0x001E, 0, VR::LO, VM::M1, "SegmentationCreationTemplateLabel" }, { 0x3010, 0x001F, 0, VR::UI, VM::M1, "SegmentationTemplateUID" }, { 0x3010, 0x0020, 0, VR::US, VM::M1, "ReferencedSegmentReferenceIndex" }, { 0x3010, 0x0021, 0, VR::SQ, VM::M1, "SegmentReferenceSequence" }, { 0x3010, 0x0022, 0, VR::US, VM::M1, "SegmentReferenceIndex" }, { 0x3010, 0x0023, 0, VR::SQ, VM::M1, "DirectSegmentReferenceSequence" }, { 0x3010, 0x0024, 0, VR::SQ, VM::M1, "CombinationSegmentReferenceSequence" }, { 0x3010, 0x0025, 0, VR::SQ, VM::M1, "ConceptualVolumeSequence" }, { 0x3010, 0x0026, 0, VR::SQ, VM::M1, "SegmentedRTAccessoryDeviceSequence" }, { 0x3010, 0x0027, 0, VR::SQ, VM::M1, "SegmentCharacteristicsSequence" }, { 0x3010, 0x0028, 0, VR::SQ, VM::M1, "RelatedSegmentCharacteristicsSequence" }, { 0x3010, 0x0029, 0, VR::US, VM::M1, "SegmentCharacteristicsPrecedence" }, { 0x3010, 0x002A, 0, VR::SQ, VM::M1, "RTSegmentAnnotationSequence" }, { 0x3010, 0x002B, 0, VR::SQ, VM::M1, "SegmentAnnotationCategoryCodeSequence" }, { 0x3010, 0x002C, 0, VR::SQ, VM::M1, "SegmentAnnotationTypeCodeSequence" }, { 0x3010, 0x002D, 0, VR::LO, VM::M1, "DeviceLabel" }, { 0x3010, 0x002E, 0, VR::SQ, VM::M1, "DeviceTypeCodeSequence" }, { 0x3010, 0x0030, 0, VR::SQ, VM::M1, "PatientEquipmentRelationshipCodeSequence" }, { 0x3010, 0x0031, 0, VR::UI, VM::M1, "ReferencedFiducialsUID" }, { 0x3010, 0x0032, 0, VR::SQ, VM::M1, "PatientTreatmentOrientationSequence" }, { 0x3010, 0x0033, 0, VR::SH, VM::M1, "UserContentLabel" }, { 0x3010, 0x0034, 0, VR::LO, VM::M1, "UserContentLongLabel" }, { 0x3010, 0x0035, 0, VR::SH, VM::M1, "EntityLabel" }, { 0x3010, 0x0036, 0, VR::LO, VM::M1, "EntityName" }, { 0x3010, 0x0037, 0, VR::ST, VM::M1, "EntityDescription" }, { 0x3010, 0x0038, 0, VR::LO, VM::M1, "EntityLongLabel" }, { 0x3010, 0x0039, 0, VR::US, VM::M1, "DeviceIndex" }, { 0x3010, 0x003A, 0, VR::US, VM::M1, "RTTreatmentPhaseIndex" }, { 0x3010, 0x003B, 0, VR::UI, VM::M1, "RTTreatmentPhaseUID" }, { 0x3010, 0x003C, 0, VR::US, VM::M1, "RTPrescriptionIndex" }, { 0x3010, 0x003D, 0, VR::US, VM::M1, "RTSegmentAnnotationIndex" }, { 0x3010, 0x003E, 0, VR::US, VM::M1, "BasisRTTreatmentPhaseIndex" }, { 0x3010, 0x003F, 0, VR::US, VM::M1, "RelatedRTTreatmentPhaseIndex" }, { 0x3010, 0x0040, 0, VR::US, VM::M1, "ReferencedRTTreatmentPhaseIndex" }, { 0x3010, 0x0041, 0, VR::US, VM::M1, "ReferencedRTPrescriptionIndex" }, { 0x3010, 0x0042, 0, VR::US, VM::M1, "ReferencedParentRTPrescriptionIndex" }, { 0x3010, 0x0043, 0, VR::ST, VM::M1, "ManufacturerDeviceIdentifier" }, { 0x3010, 0x0044, 0, VR::SQ, VM::M1, "InstanceLevelReferencedPerformedProcedureStepSequence" }, { 0x3010, 0x0045, 0, VR::CS, VM::M1, "RTTreatmentPhaseIntentPresenceFlag" }, { 0x3010, 0x0046, 0, VR::CS, VM::M1, "RadiotherapyTreatmentType" }, { 0x3010, 0x0047, 0, VR::CS, VM::M1TN, "TeletherapyRadiationType" }, { 0x3010, 0x0048, 0, VR::CS, VM::M1TN, "BrachytherapySourceType" }, { 0x3010, 0x0049, 0, VR::SQ, VM::M1, "ReferencedRTTreatmentPhaseSequence" }, { 0x3010, 0x004A, 0, VR::SQ, VM::M1, "ReferencedDirectSegmentInstanceSequence" }, { 0x3010, 0x004B, 0, VR::SQ, VM::M1, "IntendedRTTreatmentPhaseSequence" }, { 0x3010, 0x004C, 0, VR::DA, VM::M1, "IntendedPhaseStartDate" }, { 0x3010, 0x004D, 0, VR::DA, VM::M1, "IntendedPhaseEndDate" }, { 0x3010, 0x004E, 0, VR::SQ, VM::M1, "RTTreatmentPhaseIntervalSequence" }, { 0x3010, 0x004F, 0, VR::CS, VM::M1, "TemporalRelationshipIntervalAnchor" }, { 0x3010, 0x0050, 0, VR::FD, VM::M1, "MinimumNumberOfIntervalDays" }, { 0x3010, 0x0051, 0, VR::FD, VM::M1, "MaximumNumberOfIntervalDays" }, { 0x3010, 0x0052, 0, VR::UI, VM::M1TN, "PertinentSOPClassesInStudy" }, { 0x3010, 0x0053, 0, VR::UI, VM::M1TN, "PertinentSOPClassesInSeries" }, { 0x3010, 0x0054, 0, VR::LO, VM::M1, "RTPrescriptionLabel" }, { 0x3010, 0x0055, 0, VR::SQ, VM::M1, "RTPhysicianIntentPredecessorSequence" }, { 0x3010, 0x0056, 0, VR::LO, VM::M1, "RTTreatmentApproachLabel" }, { 0x3010, 0x0057, 0, VR::SQ, VM::M1, "RTPhysicianIntentSequence" }, { 0x3010, 0x0058, 0, VR::US, VM::M1, "RTPhysicianIntentIndex" }, { 0x3010, 0x0059, 0, VR::CS, VM::M1, "RTTreatmentIntentType" }, { 0x3010, 0x005A, 0, VR::UT, VM::M1, "RTPhysicianIntentNarrative" }, { 0x3010, 0x005B, 0, VR::SQ, VM::M1, "RTProtocolCodeSequence" }, { 0x3010, 0x005C, 0, VR::ST, VM::M1, "ReasonForSuperseding" }, { 0x3010, 0x005D, 0, VR::SQ, VM::M1, "RTDiagnosisCodeSequence" }, { 0x3010, 0x005E, 0, VR::US, VM::M1, "ReferencedRTPhysicianIntentIndex" }, { 0x3010, 0x005F, 0, VR::SQ, VM::M1, "RTPhysicianIntentInputInstanceSequence" }, { 0x3010, 0x0060, 0, VR::SQ, VM::M1, "RTAnatomicPrescriptionSequence" }, { 0x3010, 0x0061, 0, VR::UT, VM::M1, "PriorTreatmentDoseDescription" }, { 0x3010, 0x0062, 0, VR::SQ, VM::M1, "PriorTreatmentReferenceSequence" }, { 0x3010, 0x0063, 0, VR::CS, VM::M1, "DosimetricObjectiveEvaluationScope" }, { 0x3010, 0x0064, 0, VR::SQ, VM::M1, "TherapeuticRoleCategoryCodeSequence" }, { 0x3010, 0x0065, 0, VR::SQ, VM::M1, "TherapeuticRoleTypeCodeSequence" }, { 0x3010, 0x0066, 0, VR::US, VM::M1, "ConceptualVolumeOptimizationPrecedence" }, { 0x3010, 0x0067, 0, VR::SQ, VM::M1, "ConceptualVolumeCategoryCodeSequence" }, { 0x3010, 0x0068, 0, VR::CS, VM::M1, "ConceptualVolumeBlockingConstraint" }, { 0x3010, 0x0069, 0, VR::SQ, VM::M1, "ConceptualVolumeTypeCodeSequence" }, { 0x3010, 0x006A, 0, VR::SQ, VM::M1, "ConceptualVolumeTypeModifierCodeSequence" }, { 0x3010, 0x006B, 0, VR::SQ, VM::M1, "RTPrescriptionSequence" }, { 0x3010, 0x006C, 0, VR::SQ, VM::M1, "DosimetricObjectiveSequence" }, { 0x3010, 0x006D, 0, VR::SQ, VM::M1, "DosimetricObjectiveTypeCodeSequence" }, { 0x3010, 0x006E, 0, VR::UI, VM::M1, "DosimetricObjectiveUID" }, { 0x3010, 0x006F, 0, VR::UI, VM::M1, "ReferencedDosimetricObjectiveUID" }, { 0x3010, 0x0070, 0, VR::SQ, VM::M1, "DosimetricObjectiveParameterSequence" }, { 0x3010, 0x0071, 0, VR::SQ, VM::M1, "ReferencedDosimetricObjectivesSequence" }, { 0x3010, 0x0073, 0, VR::CS, VM::M1, "AbsoluteDosimetricObjectiveFlag" }, { 0x3010, 0x0074, 0, VR::FD, VM::M1, "DosimetricObjectiveWeight" }, { 0x3010, 0x0075, 0, VR::CS, VM::M1, "DosimetricObjectivePurpose" }, { 0x3010, 0x0076, 0, VR::SQ, VM::M1, "PlanningInputInformationSequence" }, { 0x3010, 0x0077, 0, VR::LO, VM::M1, "TreatmentSite" }, { 0x3010, 0x0078, 0, VR::SQ, VM::M1, "TreatmentSiteCodeSequence" }, { 0x3010, 0x0079, 0, VR::SQ, VM::M1, "FractionPatternSequence" }, { 0x3010, 0x007A, 0, VR::UT, VM::M1, "TreatmentTechniqueNotes" }, { 0x3010, 0x007B, 0, VR::UT, VM::M1, "PrescriptionNotes" }, { 0x3010, 0x007C, 0, VR::IS, VM::M1, "NumberOfIntervalFractions" }, { 0x3010, 0x007D, 0, VR::US, VM::M1, "NumberOfFractions" }, { 0x3010, 0x007E, 0, VR::US, VM::M1, "IntendedDeliveryDuration" }, { 0x3010, 0x007F, 0, VR::UT, VM::M1, "FractionationNotes" }, { 0x3010, 0x0080, 0, VR::SQ, VM::M1, "RTTreatmentTechniqueCodeSequence" }, { 0x3010, 0x0081, 0, VR::SQ, VM::M1, "PrescriptionNotesSequence" }, { 0x3010, 0x0082, 0, VR::SQ, VM::M1, "FractionBasedRelationshipSequence" }, { 0x3010, 0x0083, 0, VR::CS, VM::M1, "FractionBasedRelationshipIntervalAnchor" }, { 0x3010, 0x0084, 0, VR::FD, VM::M1, "MinimumHoursBetweenFractions" }, { 0x3010, 0x0085, 0, VR::TM, VM::M1TN, "IntendedFractionStartTime" }, { 0x3010, 0x0086, 0, VR::LT, VM::M1, "IntendedStartDayOfWeek" }, { 0x3010, 0x0087, 0, VR::SQ, VM::M1, "WeekdayFractionPatternSequence" }, { 0x3010, 0x0088, 0, VR::SQ, VM::M1, "DeliveryTimeStructureCodeSequence" }, { 0x4000, 0x0010, 1, VR::LT, VM::M1, "Arbitrary" }, { 0x4000, 0x4000, 1, VR::LT, VM::M1, "TextComments" }, { 0x4008, 0x0040, 1, VR::SH, VM::M1, "ResultsID" }, { 0x4008, 0x0042, 1, VR::LO, VM::M1, "ResultsIDIssuer" }, { 0x4008, 0x0050, 1, VR::SQ, VM::M1, "ReferencedInterpretationSequence" }, { 0x4008, 0x00FF, 1, VR::CS, VM::M1, "ReportProductionStatusTrial" }, { 0x4008, 0x0100, 1, VR::DA, VM::M1, "InterpretationRecordedDate" }, { 0x4008, 0x0101, 1, VR::TM, VM::M1, "InterpretationRecordedTime" }, { 0x4008, 0x0102, 1, VR::PN, VM::M1, "InterpretationRecorder" }, { 0x4008, 0x0103, 1, VR::LO, VM::M1, "ReferenceToRecordedSound" }, { 0x4008, 0x0108, 1, VR::DA, VM::M1, "InterpretationTranscriptionDate" }, { 0x4008, 0x0109, 1, VR::TM, VM::M1, "InterpretationTranscriptionTime" }, { 0x4008, 0x010A, 1, VR::PN, VM::M1, "InterpretationTranscriber" }, { 0x4008, 0x010B, 1, VR::ST, VM::M1, "InterpretationText" }, { 0x4008, 0x010C, 1, VR::PN, VM::M1, "InterpretationAuthor" }, { 0x4008, 0x0111, 1, VR::SQ, VM::M1, "InterpretationApproverSequence" }, { 0x4008, 0x0112, 1, VR::DA, VM::M1, "InterpretationApprovalDate" }, { 0x4008, 0x0113, 1, VR::TM, VM::M1, "InterpretationApprovalTime" }, { 0x4008, 0x0114, 1, VR::PN, VM::M1, "PhysicianApprovingInterpretation" }, { 0x4008, 0x0115, 1, VR::LT, VM::M1, "InterpretationDiagnosisDescription" }, { 0x4008, 0x0117, 1, VR::SQ, VM::M1, "InterpretationDiagnosisCodeSequence" }, { 0x4008, 0x0118, 1, VR::SQ, VM::M1, "ResultsDistributionListSequence" }, { 0x4008, 0x0119, 1, VR::PN, VM::M1, "DistributionName" }, { 0x4008, 0x011A, 1, VR::LO, VM::M1, "DistributionAddress" }, { 0x4008, 0x0200, 1, VR::SH, VM::M1, "InterpretationID" }, { 0x4008, 0x0202, 1, VR::LO, VM::M1, "InterpretationIDIssuer" }, { 0x4008, 0x0210, 1, VR::CS, VM::M1, "InterpretationTypeID" }, { 0x4008, 0x0212, 1, VR::CS, VM::M1, "InterpretationStatusID" }, { 0x4008, 0x0300, 1, VR::ST, VM::M1, "Impressions" }, { 0x4008, 0x4000, 1, VR::ST, VM::M1, "ResultsComments" }, { 0x4010, 0x0001, 3, VR::CS, VM::M1, "LowEnergyDetectors" }, { 0x4010, 0x0002, 3, VR::CS, VM::M1, "HighEnergyDetectors" }, { 0x4010, 0x0004, 3, VR::SQ, VM::M1, "DetectorGeometrySequence" }, { 0x4010, 0x1001, 3, VR::SQ, VM::M1, "ThreatROIVoxelSequence" }, { 0x4010, 0x1004, 3, VR::FL, VM::M3, "ThreatROIBase" }, { 0x4010, 0x1005, 3, VR::FL, VM::M3, "ThreatROIExtents" }, { 0x4010, 0x1006, 3, VR::OB, VM::M1, "ThreatROIBitmap" }, { 0x4010, 0x1007, 3, VR::SH, VM::M1, "RouteSegmentID" }, { 0x4010, 0x1008, 3, VR::CS, VM::M1, "GantryType" }, { 0x4010, 0x1009, 3, VR::CS, VM::M1, "OOIOwnerType" }, { 0x4010, 0x100A, 3, VR::SQ, VM::M1, "RouteSegmentSequence" }, { 0x4010, 0x1010, 3, VR::US, VM::M1, "PotentialThreatObjectID" }, { 0x4010, 0x1011, 3, VR::SQ, VM::M1, "ThreatSequence" }, { 0x4010, 0x1012, 3, VR::CS, VM::M1, "ThreatCategory" }, { 0x4010, 0x1013, 3, VR::LT, VM::M1, "ThreatCategoryDescription" }, { 0x4010, 0x1014, 3, VR::CS, VM::M1, "ATDAbilityAssessment" }, { 0x4010, 0x1015, 3, VR::CS, VM::M1, "ATDAssessmentFlag" }, { 0x4010, 0x1016, 3, VR::FL, VM::M1, "ATDAssessmentProbability" }, { 0x4010, 0x1017, 3, VR::FL, VM::M1, "Mass" }, { 0x4010, 0x1018, 3, VR::FL, VM::M1, "Density" }, { 0x4010, 0x1019, 3, VR::FL, VM::M1, "ZEffective" }, { 0x4010, 0x101A, 3, VR::SH, VM::M1, "BoardingPassID" }, { 0x4010, 0x101B, 3, VR::FL, VM::M3, "CenterOfMass" }, { 0x4010, 0x101C, 3, VR::FL, VM::M3, "CenterOfPTO" }, { 0x4010, 0x101D, 3, VR::FL, VM::M6TN, "BoundingPolygon" }, { 0x4010, 0x101E, 3, VR::SH, VM::M1, "RouteSegmentStartLocationID" }, { 0x4010, 0x101F, 3, VR::SH, VM::M1, "RouteSegmentEndLocationID" }, { 0x4010, 0x1020, 3, VR::CS, VM::M1, "RouteSegmentLocationIDType" }, { 0x4010, 0x1021, 3, VR::CS, VM::M1TN, "AbortReason" }, { 0x4010, 0x1023, 3, VR::FL, VM::M1, "VolumeOfPTO" }, { 0x4010, 0x1024, 3, VR::CS, VM::M1, "AbortFlag" }, { 0x4010, 0x1025, 3, VR::DT, VM::M1, "RouteSegmentStartTime" }, { 0x4010, 0x1026, 3, VR::DT, VM::M1, "RouteSegmentEndTime" }, { 0x4010, 0x1027, 3, VR::CS, VM::M1, "TDRType" }, { 0x4010, 0x1028, 3, VR::CS, VM::M1, "InternationalRouteSegment" }, { 0x4010, 0x1029, 3, VR::LO, VM::M1TN, "ThreatDetectionAlgorithmandVersion" }, { 0x4010, 0x102A, 3, VR::SH, VM::M1, "AssignedLocation" }, { 0x4010, 0x102B, 3, VR::DT, VM::M1, "AlarmDecisionTime" }, { 0x4010, 0x1031, 3, VR::CS, VM::M1, "AlarmDecision" }, { 0x4010, 0x1033, 3, VR::US, VM::M1, "NumberOfTotalObjects" }, { 0x4010, 0x1034, 3, VR::US, VM::M1, "NumberOfAlarmObjects" }, { 0x4010, 0x1037, 3, VR::SQ, VM::M1, "PTORepresentationSequence" }, { 0x4010, 0x1038, 3, VR::SQ, VM::M1, "ATDAssessmentSequence" }, { 0x4010, 0x1039, 3, VR::CS, VM::M1, "TIPType" }, { 0x4010, 0x103A, 3, VR::CS, VM::M1, "DICOSVersion" }, { 0x4010, 0x1041, 3, VR::DT, VM::M1, "OOIOwnerCreationTime" }, { 0x4010, 0x1042, 3, VR::CS, VM::M1, "OOIType" }, { 0x4010, 0x1043, 3, VR::FL, VM::M3, "OOISize" }, { 0x4010, 0x1044, 3, VR::CS, VM::M1, "AcquisitionStatus" }, { 0x4010, 0x1045, 3, VR::SQ, VM::M1, "BasisMaterialsCodeSequence" }, { 0x4010, 0x1046, 3, VR::CS, VM::M1, "PhantomType" }, { 0x4010, 0x1047, 3, VR::SQ, VM::M1, "OOIOwnerSequence" }, { 0x4010, 0x1048, 3, VR::CS, VM::M1, "ScanType" }, { 0x4010, 0x1051, 3, VR::LO, VM::M1, "ItineraryID" }, { 0x4010, 0x1052, 3, VR::SH, VM::M1, "ItineraryIDType" }, { 0x4010, 0x1053, 3, VR::LO, VM::M1, "ItineraryIDAssigningAuthority" }, { 0x4010, 0x1054, 3, VR::SH, VM::M1, "RouteID" }, { 0x4010, 0x1055, 3, VR::SH, VM::M1, "RouteIDAssigningAuthority" }, { 0x4010, 0x1056, 3, VR::CS, VM::M1, "InboundArrivalType" }, { 0x4010, 0x1058, 3, VR::SH, VM::M1, "CarrierID" }, { 0x4010, 0x1059, 3, VR::CS, VM::M1, "CarrierIDAssigningAuthority" }, { 0x4010, 0x1060, 3, VR::FL, VM::M3, "SourceOrientation" }, { 0x4010, 0x1061, 3, VR::FL, VM::M3, "SourcePosition" }, { 0x4010, 0x1062, 3, VR::FL, VM::M1, "BeltHeight" }, { 0x4010, 0x1064, 3, VR::SQ, VM::M1, "AlgorithmRoutingCodeSequence" }, { 0x4010, 0x1067, 3, VR::CS, VM::M1, "TransportClassification" }, { 0x4010, 0x1068, 3, VR::LT, VM::M1, "OOITypeDescriptor" }, { 0x4010, 0x1069, 3, VR::FL, VM::M1, "TotalProcessingTime" }, { 0x4010, 0x106C, 3, VR::OB, VM::M1, "DetectorCalibrationData" }, { 0x4010, 0x106D, 3, VR::CS, VM::M1, "AdditionalScreeningPerformed" }, { 0x4010, 0x106E, 3, VR::CS, VM::M1, "AdditionalInspectionSelectionCriteria" }, { 0x4010, 0x106F, 3, VR::SQ, VM::M1, "AdditionalInspectionMethodSequence" }, { 0x4010, 0x1070, 3, VR::CS, VM::M1, "AITDeviceType" }, { 0x4010, 0x1071, 3, VR::SQ, VM::M1, "QRMeasurementsSequence" }, { 0x4010, 0x1072, 3, VR::SQ, VM::M1, "TargetMaterialSequence" }, { 0x4010, 0x1073, 3, VR::FD, VM::M1, "SNRThreshold" }, { 0x4010, 0x1075, 3, VR::DS, VM::M1, "ImageScaleRepresentation" }, { 0x4010, 0x1076, 3, VR::SQ, VM::M1, "ReferencedPTOSequence" }, { 0x4010, 0x1077, 3, VR::SQ, VM::M1, "ReferencedTDRInstanceSequence" }, { 0x4010, 0x1078, 3, VR::ST, VM::M1, "PTOLocationDescription" }, { 0x4010, 0x1079, 3, VR::SQ, VM::M1, "AnomalyLocatorIndicatorSequence" }, { 0x4010, 0x107A, 3, VR::FL, VM::M3, "AnomalyLocatorIndicator" }, { 0x4010, 0x107B, 3, VR::SQ, VM::M1, "PTORegionSequence" }, { 0x4010, 0x107C, 3, VR::CS, VM::M1, "InspectionSelectionCriteria" }, { 0x4010, 0x107D, 3, VR::SQ, VM::M1, "SecondaryInspectionMethodSequence" }, { 0x4010, 0x107E, 3, VR::DS, VM::M6, "PRCSToRCSOrientation" }, { 0x4FFE, 0x0001, 0, VR::SQ, VM::M1, "MACParametersSequence" }, { 0x5000, 0x0005, 1, VR::US, VM::M1, "CurveDimensions" }, { 0x5000, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints" }, { 0x5000, 0x0020, 1, VR::CS, VM::M1, "TypeOfData" }, { 0x5000, 0x0022, 1, VR::LO, VM::M1, "CurveDescription" }, { 0x5000, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits" }, { 0x5000, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels" }, { 0x5000, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation" }, { 0x5000, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue" }, { 0x5000, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue" }, { 0x5000, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange" }, { 0x5000, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor" }, { 0x5000, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue" }, { 0x5000, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue" }, { 0x5000, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer" }, { 0x5000, 0x2000, 1, VR::US, VM::M1, "AudioType" }, { 0x5000, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat" }, { 0x5000, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels" }, { 0x5000, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples" }, { 0x5000, 0x2008, 1, VR::UL, VM::M1, "SampleRate" }, { 0x5000, 0x200A, 1, VR::UL, VM::M1, "TotalTime" }, { 0x5000, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData" }, { 0x5000, 0x200E, 1, VR::LT, VM::M1, "AudioComments" }, { 0x5000, 0x2500, 1, VR::LO, VM::M1, "CurveLabel" }, { 0x5000, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence" }, { 0x5000, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup" }, { 0x5000, 0x3000, 1, VR::OX, VM::M1, "CurveData" }, { 0x5002, 0x0005, 1, VR::US, VM::M1, "CurveDimensions2" }, { 0x5002, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints2" }, { 0x5002, 0x0020, 1, VR::CS, VM::M1, "TypeOfData2" }, { 0x5002, 0x0022, 1, VR::LO, VM::M1, "CurveDescription2" }, { 0x5002, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits2" }, { 0x5002, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels2" }, { 0x5002, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation2" }, { 0x5002, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue2" }, { 0x5002, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue2" }, { 0x5002, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange2" }, { 0x5002, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor2" }, { 0x5002, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue2" }, { 0x5002, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue2" }, { 0x5002, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer2" }, { 0x5002, 0x2000, 1, VR::US, VM::M1, "AudioType2" }, { 0x5002, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat2" }, { 0x5002, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels2" }, { 0x5002, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples2" }, { 0x5002, 0x2008, 1, VR::UL, VM::M1, "SampleRate2" }, { 0x5002, 0x200A, 1, VR::UL, VM::M1, "TotalTime2" }, { 0x5002, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData2" }, { 0x5002, 0x200E, 1, VR::LT, VM::M1, "AudioComments2" }, { 0x5002, 0x2500, 1, VR::LO, VM::M1, "CurveLabel2" }, { 0x5002, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence2" }, { 0x5002, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup2" }, { 0x5002, 0x3000, 1, VR::OX, VM::M1, "CurveData2" }, { 0x5004, 0x0005, 1, VR::US, VM::M1, "CurveDimensions3" }, { 0x5004, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints3" }, { 0x5004, 0x0020, 1, VR::CS, VM::M1, "TypeOfData3" }, { 0x5004, 0x0022, 1, VR::LO, VM::M1, "CurveDescription3" }, { 0x5004, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits3" }, { 0x5004, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels3" }, { 0x5004, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation3" }, { 0x5004, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue3" }, { 0x5004, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue3" }, { 0x5004, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange3" }, { 0x5004, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor3" }, { 0x5004, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue3" }, { 0x5004, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue3" }, { 0x5004, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer3" }, { 0x5004, 0x2000, 1, VR::US, VM::M1, "AudioType3" }, { 0x5004, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat3" }, { 0x5004, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels3" }, { 0x5004, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples3" }, { 0x5004, 0x2008, 1, VR::UL, VM::M1, "SampleRate3" }, { 0x5004, 0x200A, 1, VR::UL, VM::M1, "TotalTime3" }, { 0x5004, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData3" }, { 0x5004, 0x200E, 1, VR::LT, VM::M1, "AudioComments3" }, { 0x5004, 0x2500, 1, VR::LO, VM::M1, "CurveLabel3" }, { 0x5004, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence3" }, { 0x5004, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup3" }, { 0x5004, 0x3000, 1, VR::OX, VM::M1, "CurveData3" }, { 0x5006, 0x0005, 1, VR::US, VM::M1, "CurveDimensions4" }, { 0x5006, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints4" }, { 0x5006, 0x0020, 1, VR::CS, VM::M1, "TypeOfData4" }, { 0x5006, 0x0022, 1, VR::LO, VM::M1, "CurveDescription4" }, { 0x5006, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits4" }, { 0x5006, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels4" }, { 0x5006, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation4" }, { 0x5006, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue4" }, { 0x5006, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue4" }, { 0x5006, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange4" }, { 0x5006, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor4" }, { 0x5006, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue4" }, { 0x5006, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue4" }, { 0x5006, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer4" }, { 0x5006, 0x2000, 1, VR::US, VM::M1, "AudioType4" }, { 0x5006, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat4" }, { 0x5006, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels4" }, { 0x5006, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples4" }, { 0x5006, 0x2008, 1, VR::UL, VM::M1, "SampleRate4" }, { 0x5006, 0x200A, 1, VR::UL, VM::M1, "TotalTime4" }, { 0x5006, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData4" }, { 0x5006, 0x200E, 1, VR::LT, VM::M1, "AudioComments4" }, { 0x5006, 0x2500, 1, VR::LO, VM::M1, "CurveLabel4" }, { 0x5006, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence4" }, { 0x5006, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup4" }, { 0x5006, 0x3000, 1, VR::OX, VM::M1, "CurveData4" }, { 0x5008, 0x0005, 1, VR::US, VM::M1, "CurveDimensions5" }, { 0x5008, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints5" }, { 0x5008, 0x0020, 1, VR::CS, VM::M1, "TypeOfData5" }, { 0x5008, 0x0022, 1, VR::LO, VM::M1, "CurveDescription5" }, { 0x5008, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits5" }, { 0x5008, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels5" }, { 0x5008, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation5" }, { 0x5008, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue5" }, { 0x5008, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue5" }, { 0x5008, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange5" }, { 0x5008, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor5" }, { 0x5008, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue5" }, { 0x5008, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue5" }, { 0x5008, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer5" }, { 0x5008, 0x2000, 1, VR::US, VM::M1, "AudioType5" }, { 0x5008, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat5" }, { 0x5008, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels5" }, { 0x5008, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples5" }, { 0x5008, 0x2008, 1, VR::UL, VM::M1, "SampleRate5" }, { 0x5008, 0x200A, 1, VR::UL, VM::M1, "TotalTime5" }, { 0x5008, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData5" }, { 0x5008, 0x200E, 1, VR::LT, VM::M1, "AudioComments5" }, { 0x5008, 0x2500, 1, VR::LO, VM::M1, "CurveLabel5" }, { 0x5008, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence5" }, { 0x5008, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup5" }, { 0x5008, 0x3000, 1, VR::OX, VM::M1, "CurveData5" }, { 0x500A, 0x0005, 1, VR::US, VM::M1, "CurveDimensions6" }, { 0x500A, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints6" }, { 0x500A, 0x0020, 1, VR::CS, VM::M1, "TypeOfData6" }, { 0x500A, 0x0022, 1, VR::LO, VM::M1, "CurveDescription6" }, { 0x500A, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits6" }, { 0x500A, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels6" }, { 0x500A, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation6" }, { 0x500A, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue6" }, { 0x500A, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue6" }, { 0x500A, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange6" }, { 0x500A, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor6" }, { 0x500A, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue6" }, { 0x500A, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue6" }, { 0x500A, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer6" }, { 0x500A, 0x2000, 1, VR::US, VM::M1, "AudioType6" }, { 0x500A, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat6" }, { 0x500A, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels6" }, { 0x500A, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples6" }, { 0x500A, 0x2008, 1, VR::UL, VM::M1, "SampleRate6" }, { 0x500A, 0x200A, 1, VR::UL, VM::M1, "TotalTime6" }, { 0x500A, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData6" }, { 0x500A, 0x200E, 1, VR::LT, VM::M1, "AudioComments6" }, { 0x500A, 0x2500, 1, VR::LO, VM::M1, "CurveLabel6" }, { 0x500A, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence6" }, { 0x500A, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup6" }, { 0x500A, 0x3000, 1, VR::OX, VM::M1, "CurveData6" }, { 0x500C, 0x0005, 1, VR::US, VM::M1, "CurveDimensions7" }, { 0x500C, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints7" }, { 0x500C, 0x0020, 1, VR::CS, VM::M1, "TypeOfData7" }, { 0x500C, 0x0022, 1, VR::LO, VM::M1, "CurveDescription7" }, { 0x500C, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits7" }, { 0x500C, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels7" }, { 0x500C, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation7" }, { 0x500C, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue7" }, { 0x500C, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue7" }, { 0x500C, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange7" }, { 0x500C, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor7" }, { 0x500C, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue7" }, { 0x500C, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue7" }, { 0x500C, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer7" }, { 0x500C, 0x2000, 1, VR::US, VM::M1, "AudioType7" }, { 0x500C, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat7" }, { 0x500C, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels7" }, { 0x500C, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples7" }, { 0x500C, 0x2008, 1, VR::UL, VM::M1, "SampleRate7" }, { 0x500C, 0x200A, 1, VR::UL, VM::M1, "TotalTime7" }, { 0x500C, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData7" }, { 0x500C, 0x200E, 1, VR::LT, VM::M1, "AudioComments7" }, { 0x500C, 0x2500, 1, VR::LO, VM::M1, "CurveLabel7" }, { 0x500C, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence7" }, { 0x500C, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup7" }, { 0x500C, 0x3000, 1, VR::OX, VM::M1, "CurveData7" }, { 0x500E, 0x0005, 1, VR::US, VM::M1, "CurveDimensions8" }, { 0x500E, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints8" }, { 0x500E, 0x0020, 1, VR::CS, VM::M1, "TypeOfData8" }, { 0x500E, 0x0022, 1, VR::LO, VM::M1, "CurveDescription8" }, { 0x500E, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits8" }, { 0x500E, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels8" }, { 0x500E, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation8" }, { 0x500E, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue8" }, { 0x500E, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue8" }, { 0x500E, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange8" }, { 0x500E, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor8" }, { 0x500E, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue8" }, { 0x500E, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue8" }, { 0x500E, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer8" }, { 0x500E, 0x2000, 1, VR::US, VM::M1, "AudioType8" }, { 0x500E, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat8" }, { 0x500E, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels8" }, { 0x500E, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples8" }, { 0x500E, 0x2008, 1, VR::UL, VM::M1, "SampleRate8" }, { 0x500E, 0x200A, 1, VR::UL, VM::M1, "TotalTime8" }, { 0x500E, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData8" }, { 0x500E, 0x200E, 1, VR::LT, VM::M1, "AudioComments8" }, { 0x500E, 0x2500, 1, VR::LO, VM::M1, "CurveLabel8" }, { 0x500E, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence8" }, { 0x500E, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup8" }, { 0x500E, 0x3000, 1, VR::OX, VM::M1, "CurveData8" }, { 0x5010, 0x0005, 1, VR::US, VM::M1, "CurveDimensions9" }, { 0x5010, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints9" }, { 0x5010, 0x0020, 1, VR::CS, VM::M1, "TypeOfData9" }, { 0x5010, 0x0022, 1, VR::LO, VM::M1, "CurveDescription9" }, { 0x5010, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits9" }, { 0x5010, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels9" }, { 0x5010, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation9" }, { 0x5010, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue9" }, { 0x5010, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue9" }, { 0x5010, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange9" }, { 0x5010, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor9" }, { 0x5010, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue9" }, { 0x5010, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue9" }, { 0x5010, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer9" }, { 0x5010, 0x2000, 1, VR::US, VM::M1, "AudioType9" }, { 0x5010, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat9" }, { 0x5010, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels9" }, { 0x5010, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples9" }, { 0x5010, 0x2008, 1, VR::UL, VM::M1, "SampleRate9" }, { 0x5010, 0x200A, 1, VR::UL, VM::M1, "TotalTime9" }, { 0x5010, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData9" }, { 0x5010, 0x200E, 1, VR::LT, VM::M1, "AudioComments9" }, { 0x5010, 0x2500, 1, VR::LO, VM::M1, "CurveLabel9" }, { 0x5010, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence9" }, { 0x5010, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup9" }, { 0x5010, 0x3000, 1, VR::OX, VM::M1, "CurveData9" }, { 0x5012, 0x0005, 1, VR::US, VM::M1, "CurveDimensions10" }, { 0x5012, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints10" }, { 0x5012, 0x0020, 1, VR::CS, VM::M1, "TypeOfData10" }, { 0x5012, 0x0022, 1, VR::LO, VM::M1, "CurveDescription10" }, { 0x5012, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits10" }, { 0x5012, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels10" }, { 0x5012, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation10" }, { 0x5012, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue10" }, { 0x5012, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue10" }, { 0x5012, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange10" }, { 0x5012, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor10" }, { 0x5012, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue10" }, { 0x5012, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue10" }, { 0x5012, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer10" }, { 0x5012, 0x2000, 1, VR::US, VM::M1, "AudioType10" }, { 0x5012, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat10" }, { 0x5012, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels10" }, { 0x5012, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples10" }, { 0x5012, 0x2008, 1, VR::UL, VM::M1, "SampleRate10" }, { 0x5012, 0x200A, 1, VR::UL, VM::M1, "TotalTime10" }, { 0x5012, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData10" }, { 0x5012, 0x200E, 1, VR::LT, VM::M1, "AudioComments10" }, { 0x5012, 0x2500, 1, VR::LO, VM::M1, "CurveLabel10" }, { 0x5012, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence10" }, { 0x5012, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup10" }, { 0x5012, 0x3000, 1, VR::OX, VM::M1, "CurveData10" }, { 0x5014, 0x0005, 1, VR::US, VM::M1, "CurveDimensions11" }, { 0x5014, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints11" }, { 0x5014, 0x0020, 1, VR::CS, VM::M1, "TypeOfData11" }, { 0x5014, 0x0022, 1, VR::LO, VM::M1, "CurveDescription11" }, { 0x5014, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits11" }, { 0x5014, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels11" }, { 0x5014, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation11" }, { 0x5014, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue11" }, { 0x5014, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue11" }, { 0x5014, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange11" }, { 0x5014, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor11" }, { 0x5014, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue11" }, { 0x5014, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue11" }, { 0x5014, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer11" }, { 0x5014, 0x2000, 1, VR::US, VM::M1, "AudioType11" }, { 0x5014, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat11" }, { 0x5014, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels11" }, { 0x5014, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples11" }, { 0x5014, 0x2008, 1, VR::UL, VM::M1, "SampleRate11" }, { 0x5014, 0x200A, 1, VR::UL, VM::M1, "TotalTime11" }, { 0x5014, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData11" }, { 0x5014, 0x200E, 1, VR::LT, VM::M1, "AudioComments11" }, { 0x5014, 0x2500, 1, VR::LO, VM::M1, "CurveLabel11" }, { 0x5014, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence11" }, { 0x5014, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup11" }, { 0x5014, 0x3000, 1, VR::OX, VM::M1, "CurveData11" }, { 0x5016, 0x0005, 1, VR::US, VM::M1, "CurveDimensions12" }, { 0x5016, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints12" }, { 0x5016, 0x0020, 1, VR::CS, VM::M1, "TypeOfData12" }, { 0x5016, 0x0022, 1, VR::LO, VM::M1, "CurveDescription12" }, { 0x5016, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits12" }, { 0x5016, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels12" }, { 0x5016, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation12" }, { 0x5016, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue12" }, { 0x5016, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue12" }, { 0x5016, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange12" }, { 0x5016, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor12" }, { 0x5016, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue12" }, { 0x5016, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue12" }, { 0x5016, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer12" }, { 0x5016, 0x2000, 1, VR::US, VM::M1, "AudioType12" }, { 0x5016, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat12" }, { 0x5016, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels12" }, { 0x5016, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples12" }, { 0x5016, 0x2008, 1, VR::UL, VM::M1, "SampleRate12" }, { 0x5016, 0x200A, 1, VR::UL, VM::M1, "TotalTime12" }, { 0x5016, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData12" }, { 0x5016, 0x200E, 1, VR::LT, VM::M1, "AudioComments12" }, { 0x5016, 0x2500, 1, VR::LO, VM::M1, "CurveLabel12" }, { 0x5016, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence12" }, { 0x5016, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup12" }, { 0x5016, 0x3000, 1, VR::OX, VM::M1, "CurveData12" }, { 0x5018, 0x0005, 1, VR::US, VM::M1, "CurveDimensions13" }, { 0x5018, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints13" }, { 0x5018, 0x0020, 1, VR::CS, VM::M1, "TypeOfData13" }, { 0x5018, 0x0022, 1, VR::LO, VM::M1, "CurveDescription13" }, { 0x5018, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits13" }, { 0x5018, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels13" }, { 0x5018, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation13" }, { 0x5018, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue13" }, { 0x5018, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue13" }, { 0x5018, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange13" }, { 0x5018, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor13" }, { 0x5018, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue13" }, { 0x5018, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue13" }, { 0x5018, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer13" }, { 0x5018, 0x2000, 1, VR::US, VM::M1, "AudioType13" }, { 0x5018, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat13" }, { 0x5018, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels13" }, { 0x5018, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples13" }, { 0x5018, 0x2008, 1, VR::UL, VM::M1, "SampleRate13" }, { 0x5018, 0x200A, 1, VR::UL, VM::M1, "TotalTime13" }, { 0x5018, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData13" }, { 0x5018, 0x200E, 1, VR::LT, VM::M1, "AudioComments13" }, { 0x5018, 0x2500, 1, VR::LO, VM::M1, "CurveLabel13" }, { 0x5018, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence13" }, { 0x5018, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup13" }, { 0x5018, 0x3000, 1, VR::OX, VM::M1, "CurveData13" }, { 0x501A, 0x0005, 1, VR::US, VM::M1, "CurveDimensions14" }, { 0x501A, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints14" }, { 0x501A, 0x0020, 1, VR::CS, VM::M1, "TypeOfData14" }, { 0x501A, 0x0022, 1, VR::LO, VM::M1, "CurveDescription14" }, { 0x501A, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits14" }, { 0x501A, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels14" }, { 0x501A, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation14" }, { 0x501A, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue14" }, { 0x501A, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue14" }, { 0x501A, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange14" }, { 0x501A, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor14" }, { 0x501A, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue14" }, { 0x501A, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue14" }, { 0x501A, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer14" }, { 0x501A, 0x2000, 1, VR::US, VM::M1, "AudioType14" }, { 0x501A, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat14" }, { 0x501A, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels14" }, { 0x501A, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples14" }, { 0x501A, 0x2008, 1, VR::UL, VM::M1, "SampleRate14" }, { 0x501A, 0x200A, 1, VR::UL, VM::M1, "TotalTime14" }, { 0x501A, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData14" }, { 0x501A, 0x200E, 1, VR::LT, VM::M1, "AudioComments14" }, { 0x501A, 0x2500, 1, VR::LO, VM::M1, "CurveLabel14" }, { 0x501A, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence14" }, { 0x501A, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup14" }, { 0x501A, 0x3000, 1, VR::OX, VM::M1, "CurveData14" }, { 0x501C, 0x0005, 1, VR::US, VM::M1, "CurveDimensions15" }, { 0x501C, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints15" }, { 0x501C, 0x0020, 1, VR::CS, VM::M1, "TypeOfData15" }, { 0x501C, 0x0022, 1, VR::LO, VM::M1, "CurveDescription15" }, { 0x501C, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits15" }, { 0x501C, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels15" }, { 0x501C, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation15" }, { 0x501C, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue15" }, { 0x501C, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue15" }, { 0x501C, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange15" }, { 0x501C, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor15" }, { 0x501C, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue15" }, { 0x501C, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue15" }, { 0x501C, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer15" }, { 0x501C, 0x2000, 1, VR::US, VM::M1, "AudioType15" }, { 0x501C, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat15" }, { 0x501C, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels15" }, { 0x501C, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples15" }, { 0x501C, 0x2008, 1, VR::UL, VM::M1, "SampleRate15" }, { 0x501C, 0x200A, 1, VR::UL, VM::M1, "TotalTime15" }, { 0x501C, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData15" }, { 0x501C, 0x200E, 1, VR::LT, VM::M1, "AudioComments15" }, { 0x501C, 0x2500, 1, VR::LO, VM::M1, "CurveLabel15" }, { 0x501C, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence15" }, { 0x501C, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup15" }, { 0x501C, 0x3000, 1, VR::OX, VM::M1, "CurveData15" }, { 0x501E, 0x0005, 1, VR::US, VM::M1, "CurveDimensions16" }, { 0x501E, 0x0010, 1, VR::US, VM::M1, "NumberOfPoints16" }, { 0x501E, 0x0020, 1, VR::CS, VM::M1, "TypeOfData16" }, { 0x501E, 0x0022, 1, VR::LO, VM::M1, "CurveDescription16" }, { 0x501E, 0x0030, 1, VR::SH, VM::M1TN, "AxisUnits16" }, { 0x501E, 0x0040, 1, VR::SH, VM::M1TN, "AxisLabels16" }, { 0x501E, 0x0103, 1, VR::US, VM::M1, "DataValueRepresentation16" }, { 0x501E, 0x0104, 1, VR::US, VM::M1TN, "MinimumCoordinateValue16" }, { 0x501E, 0x0105, 1, VR::US, VM::M1TN, "MaximumCoordinateValue16" }, { 0x501E, 0x0106, 1, VR::SH, VM::M1TN, "CurveRange16" }, { 0x501E, 0x0110, 1, VR::US, VM::M1TN, "CurveDataDescriptor16" }, { 0x501E, 0x0112, 1, VR::US, VM::M1TN, "CoordinateStartValue16" }, { 0x501E, 0x0114, 1, VR::US, VM::M1TN, "CoordinateStepValue16" }, { 0x501E, 0x1001, 1, VR::CS, VM::M1, "CurveActivationLayer16" }, { 0x501E, 0x2000, 1, VR::US, VM::M1, "AudioType16" }, { 0x501E, 0x2002, 1, VR::US, VM::M1, "AudioSampleFormat16" }, { 0x501E, 0x2004, 1, VR::US, VM::M1, "NumberOfChannels16" }, { 0x501E, 0x2006, 1, VR::UL, VM::M1, "NumberOfSamples16" }, { 0x501E, 0x2008, 1, VR::UL, VM::M1, "SampleRate16" }, { 0x501E, 0x200A, 1, VR::UL, VM::M1, "TotalTime16" }, { 0x501E, 0x200C, 1, VR::OX, VM::M1, "AudioSampleData16" }, { 0x501E, 0x200E, 1, VR::LT, VM::M1, "AudioComments16" }, { 0x501E, 0x2500, 1, VR::LO, VM::M1, "CurveLabel16" }, { 0x501E, 0x2600, 1, VR::SQ, VM::M1, "CurveReferencedOverlaySequence16" }, { 0x501E, 0x2610, 1, VR::US, VM::M1, "CurveReferencedOverlayGroup16" }, { 0x501E, 0x3000, 1, VR::OX, VM::M1, "CurveData16" }, { 0x5200, 0x9229, 0, VR::SQ, VM::M1, "SharedFunctionalGroupsSequence" }, { 0x5200, 0x9230, 0, VR::SQ, VM::M1, "PerFrameFunctionalGroupsSequence" }, { 0x5400, 0x0100, 0, VR::SQ, VM::M1, "WaveformSequence" }, { 0x5400, 0x0110, 0, VR::OX, VM::M1, "ChannelMinimumValue" }, { 0x5400, 0x0112, 0, VR::OX, VM::M1, "ChannelMaximumValue" }, { 0x5400, 0x1004, 0, VR::US, VM::M1, "WaveformBitsAllocated" }, { 0x5400, 0x1006, 0, VR::CS, VM::M1, "WaveformSampleInterpretation" }, { 0x5400, 0x100A, 0, VR::OX, VM::M1, "WaveformPaddingValue" }, { 0x5400, 0x1010, 0, VR::OX, VM::M1, "WaveformData" }, { 0x5600, 0x0010, 0, VR::OF, VM::M1, "FirstOrderPhaseCorrectionAngle" }, { 0x5600, 0x0020, 0, VR::OF, VM::M1, "SpectroscopyData" }, { 0x6000, 0x0010, 0, VR::US, VM::M1, "OverlayRows" }, { 0x6000, 0x0011, 0, VR::US, VM::M1, "OverlayColumns" }, { 0x6000, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes" }, { 0x6000, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay" }, { 0x6000, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription" }, { 0x6000, 0x0040, 0, VR::CS, VM::M1, "OverlayType" }, { 0x6000, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype" }, { 0x6000, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin" }, { 0x6000, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin" }, { 0x6000, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin" }, { 0x6000, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode" }, { 0x6000, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator" }, { 0x6000, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel" }, { 0x6000, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription" }, { 0x6000, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers" }, { 0x6000, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval" }, { 0x6000, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped" }, { 0x6000, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated" }, { 0x6000, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition" }, { 0x6000, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat" }, { 0x6000, 0x0200, 1, VR::US, VM::M1, "OverlayLocation" }, { 0x6000, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel" }, { 0x6000, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables" }, { 0x6000, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation" }, { 0x6000, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord" }, { 0x6000, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer" }, { 0x6000, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray" }, { 0x6000, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed" }, { 0x6000, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen" }, { 0x6000, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue" }, { 0x6000, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray" }, { 0x6000, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed" }, { 0x6000, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen" }, { 0x6000, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue" }, { 0x6000, 0x1301, 0, VR::IS, VM::M1, "ROIArea" }, { 0x6000, 0x1302, 0, VR::DS, VM::M1, "ROIMean" }, { 0x6000, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation" }, { 0x6000, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel" }, { 0x6000, 0x3000, 0, VR::OX, VM::M1, "OverlayData" }, { 0x6000, 0x4000, 1, VR::LT, VM::M1, "OverlayComments" }, { 0x6002, 0x0010, 0, VR::US, VM::M1, "OverlayRows2" }, { 0x6002, 0x0011, 0, VR::US, VM::M1, "OverlayColumns2" }, { 0x6002, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes2" }, { 0x6002, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay2" }, { 0x6002, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription2" }, { 0x6002, 0x0040, 0, VR::CS, VM::M1, "OverlayType2" }, { 0x6002, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype2" }, { 0x6002, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin2" }, { 0x6002, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin2" }, { 0x6002, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin2" }, { 0x6002, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode2" }, { 0x6002, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator2" }, { 0x6002, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel2" }, { 0x6002, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription2" }, { 0x6002, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers2" }, { 0x6002, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval2" }, { 0x6002, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped2" }, { 0x6002, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated2" }, { 0x6002, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition2" }, { 0x6002, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat2" }, { 0x6002, 0x0200, 1, VR::US, VM::M1, "OverlayLocation2" }, { 0x6002, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel2" }, { 0x6002, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables2" }, { 0x6002, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation2" }, { 0x6002, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord2" }, { 0x6002, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer2" }, { 0x6002, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray2" }, { 0x6002, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed2" }, { 0x6002, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen2" }, { 0x6002, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue2" }, { 0x6002, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray2" }, { 0x6002, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed2" }, { 0x6002, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen2" }, { 0x6002, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue2" }, { 0x6002, 0x1301, 0, VR::IS, VM::M1, "ROIArea2" }, { 0x6002, 0x1302, 0, VR::DS, VM::M1, "ROIMean2" }, { 0x6002, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation2" }, { 0x6002, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel2" }, { 0x6002, 0x3000, 0, VR::OX, VM::M1, "OverlayData2" }, { 0x6002, 0x4000, 1, VR::LT, VM::M1, "OverlayComments2" }, { 0x6004, 0x0010, 0, VR::US, VM::M1, "OverlayRows3" }, { 0x6004, 0x0011, 0, VR::US, VM::M1, "OverlayColumns3" }, { 0x6004, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes3" }, { 0x6004, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay3" }, { 0x6004, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription3" }, { 0x6004, 0x0040, 0, VR::CS, VM::M1, "OverlayType3" }, { 0x6004, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype3" }, { 0x6004, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin3" }, { 0x6004, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin3" }, { 0x6004, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin3" }, { 0x6004, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode3" }, { 0x6004, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator3" }, { 0x6004, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel3" }, { 0x6004, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription3" }, { 0x6004, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers3" }, { 0x6004, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval3" }, { 0x6004, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped3" }, { 0x6004, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated3" }, { 0x6004, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition3" }, { 0x6004, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat3" }, { 0x6004, 0x0200, 1, VR::US, VM::M1, "OverlayLocation3" }, { 0x6004, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel3" }, { 0x6004, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables3" }, { 0x6004, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation3" }, { 0x6004, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord3" }, { 0x6004, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer3" }, { 0x6004, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray3" }, { 0x6004, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed3" }, { 0x6004, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen3" }, { 0x6004, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue3" }, { 0x6004, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray3" }, { 0x6004, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed3" }, { 0x6004, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen3" }, { 0x6004, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue3" }, { 0x6004, 0x1301, 0, VR::IS, VM::M1, "ROIArea3" }, { 0x6004, 0x1302, 0, VR::DS, VM::M1, "ROIMean3" }, { 0x6004, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation3" }, { 0x6004, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel3" }, { 0x6004, 0x3000, 0, VR::OX, VM::M1, "OverlayData3" }, { 0x6004, 0x4000, 1, VR::LT, VM::M1, "OverlayComments3" }, { 0x6006, 0x0010, 0, VR::US, VM::M1, "OverlayRows4" }, { 0x6006, 0x0011, 0, VR::US, VM::M1, "OverlayColumns4" }, { 0x6006, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes4" }, { 0x6006, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay4" }, { 0x6006, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription4" }, { 0x6006, 0x0040, 0, VR::CS, VM::M1, "OverlayType4" }, { 0x6006, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype4" }, { 0x6006, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin4" }, { 0x6006, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin4" }, { 0x6006, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin4" }, { 0x6006, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode4" }, { 0x6006, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator4" }, { 0x6006, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel4" }, { 0x6006, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription4" }, { 0x6006, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers4" }, { 0x6006, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval4" }, { 0x6006, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped4" }, { 0x6006, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated4" }, { 0x6006, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition4" }, { 0x6006, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat4" }, { 0x6006, 0x0200, 1, VR::US, VM::M1, "OverlayLocation4" }, { 0x6006, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel4" }, { 0x6006, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables4" }, { 0x6006, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation4" }, { 0x6006, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord4" }, { 0x6006, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer4" }, { 0x6006, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray4" }, { 0x6006, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed4" }, { 0x6006, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen4" }, { 0x6006, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue4" }, { 0x6006, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray4" }, { 0x6006, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed4" }, { 0x6006, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen4" }, { 0x6006, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue4" }, { 0x6006, 0x1301, 0, VR::IS, VM::M1, "ROIArea4" }, { 0x6006, 0x1302, 0, VR::DS, VM::M1, "ROIMean4" }, { 0x6006, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation4" }, { 0x6006, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel4" }, { 0x6006, 0x3000, 0, VR::OX, VM::M1, "OverlayData4" }, { 0x6006, 0x4000, 1, VR::LT, VM::M1, "OverlayComments4" }, { 0x6008, 0x0010, 0, VR::US, VM::M1, "OverlayRows5" }, { 0x6008, 0x0011, 0, VR::US, VM::M1, "OverlayColumns5" }, { 0x6008, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes5" }, { 0x6008, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay5" }, { 0x6008, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription5" }, { 0x6008, 0x0040, 0, VR::CS, VM::M1, "OverlayType5" }, { 0x6008, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype5" }, { 0x6008, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin5" }, { 0x6008, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin5" }, { 0x6008, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin5" }, { 0x6008, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode5" }, { 0x6008, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator5" }, { 0x6008, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel5" }, { 0x6008, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription5" }, { 0x6008, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers5" }, { 0x6008, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval5" }, { 0x6008, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped5" }, { 0x6008, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated5" }, { 0x6008, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition5" }, { 0x6008, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat5" }, { 0x6008, 0x0200, 1, VR::US, VM::M1, "OverlayLocation5" }, { 0x6008, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel5" }, { 0x6008, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables5" }, { 0x6008, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation5" }, { 0x6008, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord5" }, { 0x6008, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer5" }, { 0x6008, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray5" }, { 0x6008, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed5" }, { 0x6008, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen5" }, { 0x6008, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue5" }, { 0x6008, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray5" }, { 0x6008, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed5" }, { 0x6008, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen5" }, { 0x6008, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue5" }, { 0x6008, 0x1301, 0, VR::IS, VM::M1, "ROIArea5" }, { 0x6008, 0x1302, 0, VR::DS, VM::M1, "ROIMean5" }, { 0x6008, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation5" }, { 0x6008, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel5" }, { 0x6008, 0x3000, 0, VR::OX, VM::M1, "OverlayData5" }, { 0x6008, 0x4000, 1, VR::LT, VM::M1, "OverlayComments5" }, { 0x600A, 0x0010, 0, VR::US, VM::M1, "OverlayRows6" }, { 0x600A, 0x0011, 0, VR::US, VM::M1, "OverlayColumns6" }, { 0x600A, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes6" }, { 0x600A, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay6" }, { 0x600A, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription6" }, { 0x600A, 0x0040, 0, VR::CS, VM::M1, "OverlayType6" }, { 0x600A, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype6" }, { 0x600A, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin6" }, { 0x600A, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin6" }, { 0x600A, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin6" }, { 0x600A, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode6" }, { 0x600A, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator6" }, { 0x600A, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel6" }, { 0x600A, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription6" }, { 0x600A, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers6" }, { 0x600A, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval6" }, { 0x600A, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped6" }, { 0x600A, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated6" }, { 0x600A, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition6" }, { 0x600A, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat6" }, { 0x600A, 0x0200, 1, VR::US, VM::M1, "OverlayLocation6" }, { 0x600A, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel6" }, { 0x600A, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables6" }, { 0x600A, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation6" }, { 0x600A, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord6" }, { 0x600A, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer6" }, { 0x600A, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray6" }, { 0x600A, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed6" }, { 0x600A, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen6" }, { 0x600A, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue6" }, { 0x600A, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray6" }, { 0x600A, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed6" }, { 0x600A, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen6" }, { 0x600A, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue6" }, { 0x600A, 0x1301, 0, VR::IS, VM::M1, "ROIArea6" }, { 0x600A, 0x1302, 0, VR::DS, VM::M1, "ROIMean6" }, { 0x600A, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation6" }, { 0x600A, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel6" }, { 0x600A, 0x3000, 0, VR::OX, VM::M1, "OverlayData6" }, { 0x600A, 0x4000, 1, VR::LT, VM::M1, "OverlayComments6" }, { 0x600C, 0x0010, 0, VR::US, VM::M1, "OverlayRows7" }, { 0x600C, 0x0011, 0, VR::US, VM::M1, "OverlayColumns7" }, { 0x600C, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes7" }, { 0x600C, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay7" }, { 0x600C, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription7" }, { 0x600C, 0x0040, 0, VR::CS, VM::M1, "OverlayType7" }, { 0x600C, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype7" }, { 0x600C, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin7" }, { 0x600C, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin7" }, { 0x600C, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin7" }, { 0x600C, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode7" }, { 0x600C, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator7" }, { 0x600C, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel7" }, { 0x600C, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription7" }, { 0x600C, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers7" }, { 0x600C, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval7" }, { 0x600C, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped7" }, { 0x600C, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated7" }, { 0x600C, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition7" }, { 0x600C, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat7" }, { 0x600C, 0x0200, 1, VR::US, VM::M1, "OverlayLocation7" }, { 0x600C, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel7" }, { 0x600C, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables7" }, { 0x600C, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation7" }, { 0x600C, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord7" }, { 0x600C, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer7" }, { 0x600C, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray7" }, { 0x600C, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed7" }, { 0x600C, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen7" }, { 0x600C, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue7" }, { 0x600C, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray7" }, { 0x600C, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed7" }, { 0x600C, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen7" }, { 0x600C, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue7" }, { 0x600C, 0x1301, 0, VR::IS, VM::M1, "ROIArea7" }, { 0x600C, 0x1302, 0, VR::DS, VM::M1, "ROIMean7" }, { 0x600C, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation7" }, { 0x600C, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel7" }, { 0x600C, 0x3000, 0, VR::OX, VM::M1, "OverlayData7" }, { 0x600C, 0x4000, 1, VR::LT, VM::M1, "OverlayComments7" }, { 0x600E, 0x0010, 0, VR::US, VM::M1, "OverlayRows8" }, { 0x600E, 0x0011, 0, VR::US, VM::M1, "OverlayColumns8" }, { 0x600E, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes8" }, { 0x600E, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay8" }, { 0x600E, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription8" }, { 0x600E, 0x0040, 0, VR::CS, VM::M1, "OverlayType8" }, { 0x600E, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype8" }, { 0x600E, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin8" }, { 0x600E, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin8" }, { 0x600E, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin8" }, { 0x600E, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode8" }, { 0x600E, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator8" }, { 0x600E, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel8" }, { 0x600E, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription8" }, { 0x600E, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers8" }, { 0x600E, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval8" }, { 0x600E, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped8" }, { 0x600E, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated8" }, { 0x600E, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition8" }, { 0x600E, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat8" }, { 0x600E, 0x0200, 1, VR::US, VM::M1, "OverlayLocation8" }, { 0x600E, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel8" }, { 0x600E, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables8" }, { 0x600E, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation8" }, { 0x600E, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord8" }, { 0x600E, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer8" }, { 0x600E, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray8" }, { 0x600E, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed8" }, { 0x600E, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen8" }, { 0x600E, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue8" }, { 0x600E, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray8" }, { 0x600E, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed8" }, { 0x600E, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen8" }, { 0x600E, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue8" }, { 0x600E, 0x1301, 0, VR::IS, VM::M1, "ROIArea8" }, { 0x600E, 0x1302, 0, VR::DS, VM::M1, "ROIMean8" }, { 0x600E, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation8" }, { 0x600E, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel8" }, { 0x600E, 0x3000, 0, VR::OX, VM::M1, "OverlayData8" }, { 0x600E, 0x4000, 1, VR::LT, VM::M1, "OverlayComments8" }, { 0x6010, 0x0010, 0, VR::US, VM::M1, "OverlayRows9" }, { 0x6010, 0x0011, 0, VR::US, VM::M1, "OverlayColumns9" }, { 0x6010, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes9" }, { 0x6010, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay9" }, { 0x6010, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription9" }, { 0x6010, 0x0040, 0, VR::CS, VM::M1, "OverlayType9" }, { 0x6010, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype9" }, { 0x6010, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin9" }, { 0x6010, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin9" }, { 0x6010, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin9" }, { 0x6010, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode9" }, { 0x6010, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator9" }, { 0x6010, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel9" }, { 0x6010, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription9" }, { 0x6010, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers9" }, { 0x6010, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval9" }, { 0x6010, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped9" }, { 0x6010, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated9" }, { 0x6010, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition9" }, { 0x6010, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat9" }, { 0x6010, 0x0200, 1, VR::US, VM::M1, "OverlayLocation9" }, { 0x6010, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel9" }, { 0x6010, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables9" }, { 0x6010, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation9" }, { 0x6010, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord9" }, { 0x6010, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer9" }, { 0x6010, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray9" }, { 0x6010, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed9" }, { 0x6010, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen9" }, { 0x6010, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue9" }, { 0x6010, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray9" }, { 0x6010, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed9" }, { 0x6010, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen9" }, { 0x6010, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue9" }, { 0x6010, 0x1301, 0, VR::IS, VM::M1, "ROIArea9" }, { 0x6010, 0x1302, 0, VR::DS, VM::M1, "ROIMean9" }, { 0x6010, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation9" }, { 0x6010, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel9" }, { 0x6010, 0x3000, 0, VR::OX, VM::M1, "OverlayData9" }, { 0x6010, 0x4000, 1, VR::LT, VM::M1, "OverlayComments9" }, { 0x6012, 0x0010, 0, VR::US, VM::M1, "OverlayRows10" }, { 0x6012, 0x0011, 0, VR::US, VM::M1, "OverlayColumns10" }, { 0x6012, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes10" }, { 0x6012, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay10" }, { 0x6012, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription10" }, { 0x6012, 0x0040, 0, VR::CS, VM::M1, "OverlayType10" }, { 0x6012, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype10" }, { 0x6012, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin10" }, { 0x6012, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin10" }, { 0x6012, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin10" }, { 0x6012, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode10" }, { 0x6012, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator10" }, { 0x6012, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel10" }, { 0x6012, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription10" }, { 0x6012, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers10" }, { 0x6012, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval10" }, { 0x6012, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped10" }, { 0x6012, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated10" }, { 0x6012, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition10" }, { 0x6012, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat10" }, { 0x6012, 0x0200, 1, VR::US, VM::M1, "OverlayLocation10" }, { 0x6012, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel10" }, { 0x6012, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables10" }, { 0x6012, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation10" }, { 0x6012, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord10" }, { 0x6012, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer10" }, { 0x6012, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray10" }, { 0x6012, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed10" }, { 0x6012, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen10" }, { 0x6012, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue10" }, { 0x6012, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray10" }, { 0x6012, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed10" }, { 0x6012, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen10" }, { 0x6012, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue10" }, { 0x6012, 0x1301, 0, VR::IS, VM::M1, "ROIArea10" }, { 0x6012, 0x1302, 0, VR::DS, VM::M1, "ROIMean10" }, { 0x6012, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation10" }, { 0x6012, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel10" }, { 0x6012, 0x3000, 0, VR::OX, VM::M1, "OverlayData10" }, { 0x6012, 0x4000, 1, VR::LT, VM::M1, "OverlayComments10" }, { 0x6014, 0x0010, 0, VR::US, VM::M1, "OverlayRows11" }, { 0x6014, 0x0011, 0, VR::US, VM::M1, "OverlayColumns11" }, { 0x6014, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes11" }, { 0x6014, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay11" }, { 0x6014, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription11" }, { 0x6014, 0x0040, 0, VR::CS, VM::M1, "OverlayType11" }, { 0x6014, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype11" }, { 0x6014, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin11" }, { 0x6014, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin11" }, { 0x6014, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin11" }, { 0x6014, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode11" }, { 0x6014, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator11" }, { 0x6014, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel11" }, { 0x6014, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription11" }, { 0x6014, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers11" }, { 0x6014, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval11" }, { 0x6014, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped11" }, { 0x6014, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated11" }, { 0x6014, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition11" }, { 0x6014, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat11" }, { 0x6014, 0x0200, 1, VR::US, VM::M1, "OverlayLocation11" }, { 0x6014, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel11" }, { 0x6014, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables11" }, { 0x6014, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation11" }, { 0x6014, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord11" }, { 0x6014, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer11" }, { 0x6014, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray11" }, { 0x6014, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed11" }, { 0x6014, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen11" }, { 0x6014, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue11" }, { 0x6014, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray11" }, { 0x6014, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed11" }, { 0x6014, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen11" }, { 0x6014, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue11" }, { 0x6014, 0x1301, 0, VR::IS, VM::M1, "ROIArea11" }, { 0x6014, 0x1302, 0, VR::DS, VM::M1, "ROIMean11" }, { 0x6014, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation11" }, { 0x6014, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel11" }, { 0x6014, 0x3000, 0, VR::OX, VM::M1, "OverlayData11" }, { 0x6014, 0x4000, 1, VR::LT, VM::M1, "OverlayComments11" }, { 0x6016, 0x0010, 0, VR::US, VM::M1, "OverlayRows12" }, { 0x6016, 0x0011, 0, VR::US, VM::M1, "OverlayColumns12" }, { 0x6016, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes12" }, { 0x6016, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay12" }, { 0x6016, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription12" }, { 0x6016, 0x0040, 0, VR::CS, VM::M1, "OverlayType12" }, { 0x6016, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype12" }, { 0x6016, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin12" }, { 0x6016, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin12" }, { 0x6016, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin12" }, { 0x6016, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode12" }, { 0x6016, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator12" }, { 0x6016, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel12" }, { 0x6016, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription12" }, { 0x6016, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers12" }, { 0x6016, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval12" }, { 0x6016, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped12" }, { 0x6016, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated12" }, { 0x6016, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition12" }, { 0x6016, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat12" }, { 0x6016, 0x0200, 1, VR::US, VM::M1, "OverlayLocation12" }, { 0x6016, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel12" }, { 0x6016, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables12" }, { 0x6016, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation12" }, { 0x6016, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord12" }, { 0x6016, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer12" }, { 0x6016, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray12" }, { 0x6016, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed12" }, { 0x6016, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen12" }, { 0x6016, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue12" }, { 0x6016, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray12" }, { 0x6016, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed12" }, { 0x6016, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen12" }, { 0x6016, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue12" }, { 0x6016, 0x1301, 0, VR::IS, VM::M1, "ROIArea12" }, { 0x6016, 0x1302, 0, VR::DS, VM::M1, "ROIMean12" }, { 0x6016, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation12" }, { 0x6016, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel12" }, { 0x6016, 0x3000, 0, VR::OX, VM::M1, "OverlayData12" }, { 0x6016, 0x4000, 1, VR::LT, VM::M1, "OverlayComments12" }, { 0x6018, 0x0010, 0, VR::US, VM::M1, "OverlayRows13" }, { 0x6018, 0x0011, 0, VR::US, VM::M1, "OverlayColumns13" }, { 0x6018, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes13" }, { 0x6018, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay13" }, { 0x6018, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription13" }, { 0x6018, 0x0040, 0, VR::CS, VM::M1, "OverlayType13" }, { 0x6018, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype13" }, { 0x6018, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin13" }, { 0x6018, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin13" }, { 0x6018, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin13" }, { 0x6018, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode13" }, { 0x6018, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator13" }, { 0x6018, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel13" }, { 0x6018, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription13" }, { 0x6018, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers13" }, { 0x6018, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval13" }, { 0x6018, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped13" }, { 0x6018, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated13" }, { 0x6018, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition13" }, { 0x6018, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat13" }, { 0x6018, 0x0200, 1, VR::US, VM::M1, "OverlayLocation13" }, { 0x6018, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel13" }, { 0x6018, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables13" }, { 0x6018, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation13" }, { 0x6018, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord13" }, { 0x6018, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer13" }, { 0x6018, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray13" }, { 0x6018, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed13" }, { 0x6018, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen13" }, { 0x6018, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue13" }, { 0x6018, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray13" }, { 0x6018, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed13" }, { 0x6018, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen13" }, { 0x6018, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue13" }, { 0x6018, 0x1301, 0, VR::IS, VM::M1, "ROIArea13" }, { 0x6018, 0x1302, 0, VR::DS, VM::M1, "ROIMean13" }, { 0x6018, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation13" }, { 0x6018, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel13" }, { 0x6018, 0x3000, 0, VR::OX, VM::M1, "OverlayData13" }, { 0x6018, 0x4000, 1, VR::LT, VM::M1, "OverlayComments13" }, { 0x601A, 0x0010, 0, VR::US, VM::M1, "OverlayRows14" }, { 0x601A, 0x0011, 0, VR::US, VM::M1, "OverlayColumns14" }, { 0x601A, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes14" }, { 0x601A, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay14" }, { 0x601A, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription14" }, { 0x601A, 0x0040, 0, VR::CS, VM::M1, "OverlayType14" }, { 0x601A, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype14" }, { 0x601A, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin14" }, { 0x601A, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin14" }, { 0x601A, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin14" }, { 0x601A, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode14" }, { 0x601A, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator14" }, { 0x601A, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel14" }, { 0x601A, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription14" }, { 0x601A, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers14" }, { 0x601A, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval14" }, { 0x601A, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped14" }, { 0x601A, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated14" }, { 0x601A, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition14" }, { 0x601A, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat14" }, { 0x601A, 0x0200, 1, VR::US, VM::M1, "OverlayLocation14" }, { 0x601A, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel14" }, { 0x601A, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables14" }, { 0x601A, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation14" }, { 0x601A, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord14" }, { 0x601A, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer14" }, { 0x601A, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray14" }, { 0x601A, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed14" }, { 0x601A, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen14" }, { 0x601A, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue14" }, { 0x601A, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray14" }, { 0x601A, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed14" }, { 0x601A, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen14" }, { 0x601A, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue14" }, { 0x601A, 0x1301, 0, VR::IS, VM::M1, "ROIArea14" }, { 0x601A, 0x1302, 0, VR::DS, VM::M1, "ROIMean14" }, { 0x601A, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation14" }, { 0x601A, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel14" }, { 0x601A, 0x3000, 0, VR::OX, VM::M1, "OverlayData14" }, { 0x601A, 0x4000, 1, VR::LT, VM::M1, "OverlayComments14" }, { 0x601C, 0x0010, 0, VR::US, VM::M1, "OverlayRows15" }, { 0x601C, 0x0011, 0, VR::US, VM::M1, "OverlayColumns15" }, { 0x601C, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes15" }, { 0x601C, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay15" }, { 0x601C, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription15" }, { 0x601C, 0x0040, 0, VR::CS, VM::M1, "OverlayType15" }, { 0x601C, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype15" }, { 0x601C, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin15" }, { 0x601C, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin15" }, { 0x601C, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin15" }, { 0x601C, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode15" }, { 0x601C, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator15" }, { 0x601C, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel15" }, { 0x601C, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription15" }, { 0x601C, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers15" }, { 0x601C, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval15" }, { 0x601C, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped15" }, { 0x601C, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated15" }, { 0x601C, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition15" }, { 0x601C, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat15" }, { 0x601C, 0x0200, 1, VR::US, VM::M1, "OverlayLocation15" }, { 0x601C, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel15" }, { 0x601C, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables15" }, { 0x601C, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation15" }, { 0x601C, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord15" }, { 0x601C, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer15" }, { 0x601C, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray15" }, { 0x601C, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed15" }, { 0x601C, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen15" }, { 0x601C, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue15" }, { 0x601C, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray15" }, { 0x601C, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed15" }, { 0x601C, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen15" }, { 0x601C, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue15" }, { 0x601C, 0x1301, 0, VR::IS, VM::M1, "ROIArea15" }, { 0x601C, 0x1302, 0, VR::DS, VM::M1, "ROIMean15" }, { 0x601C, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation15" }, { 0x601C, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel15" }, { 0x601C, 0x3000, 0, VR::OX, VM::M1, "OverlayData15" }, { 0x601C, 0x4000, 1, VR::LT, VM::M1, "OverlayComments15" }, { 0x601E, 0x0010, 0, VR::US, VM::M1, "OverlayRows16" }, { 0x601E, 0x0011, 0, VR::US, VM::M1, "OverlayColumns16" }, { 0x601E, 0x0012, 1, VR::US, VM::M1, "OverlayPlanes16" }, { 0x601E, 0x0015, 0, VR::IS, VM::M1, "NumberOfFramesInOverlay16" }, { 0x601E, 0x0022, 0, VR::LO, VM::M1, "OverlayDescription16" }, { 0x601E, 0x0040, 0, VR::CS, VM::M1, "OverlayType16" }, { 0x601E, 0x0045, 0, VR::LO, VM::M1, "OverlaySubtype16" }, { 0x601E, 0x0050, 0, VR::SS, VM::M2, "OverlayOrigin16" }, { 0x601E, 0x0051, 0, VR::US, VM::M1, "ImageFrameOrigin16" }, { 0x601E, 0x0052, 1, VR::US, VM::M1, "OverlayPlaneOrigin16" }, { 0x601E, 0x0060, 1, VR::CS, VM::M1, "OverlayCompressionCode16" }, { 0x601E, 0x0061, 1, VR::SH, VM::M1, "OverlayCompressionOriginator16" }, { 0x601E, 0x0062, 1, VR::SH, VM::M1, "OverlayCompressionLabel16" }, { 0x601E, 0x0063, 1, VR::CS, VM::M1, "OverlayCompressionDescription16" }, { 0x601E, 0x0066, 1, VR::AT, VM::M1TN, "OverlayCompressionStepPointers16" }, { 0x601E, 0x0068, 1, VR::US, VM::M1, "OverlayRepeatInterval16" }, { 0x601E, 0x0069, 1, VR::US, VM::M1, "OverlayBitsGrouped16" }, { 0x601E, 0x0100, 0, VR::US, VM::M1, "OverlayBitsAllocated16" }, { 0x601E, 0x0102, 0, VR::US, VM::M1, "OverlayBitPosition16" }, { 0x601E, 0x0110, 1, VR::CS, VM::M1, "OverlayFormat16" }, { 0x601E, 0x0200, 1, VR::US, VM::M1, "OverlayLocation16" }, { 0x601E, 0x0800, 1, VR::CS, VM::M1TN, "OverlayCodeLabel16" }, { 0x601E, 0x0802, 1, VR::US, VM::M1, "OverlayNumberOfTables16" }, { 0x601E, 0x0803, 1, VR::AT, VM::M1TN, "OverlayCodeTableLocation16" }, { 0x601E, 0x0804, 1, VR::US, VM::M1, "OverlayBitsForCodeWord16" }, { 0x601E, 0x1001, 0, VR::CS, VM::M1, "OverlayActivationLayer16" }, { 0x601E, 0x1100, 1, VR::US, VM::M1, "OverlayDescriptorGray16" }, { 0x601E, 0x1101, 1, VR::US, VM::M1, "OverlayDescriptorRed16" }, { 0x601E, 0x1102, 1, VR::US, VM::M1, "OverlayDescriptorGreen16" }, { 0x601E, 0x1103, 1, VR::US, VM::M1, "OverlayDescriptorBlue16" }, { 0x601E, 0x1200, 1, VR::US, VM::M1TN, "OverlaysGray16" }, { 0x601E, 0x1201, 1, VR::US, VM::M1TN, "OverlaysRed16" }, { 0x601E, 0x1202, 1, VR::US, VM::M1TN, "OverlaysGreen16" }, { 0x601E, 0x1203, 1, VR::US, VM::M1TN, "OverlaysBlue16" }, { 0x601E, 0x1301, 0, VR::IS, VM::M1, "ROIArea16" }, { 0x601E, 0x1302, 0, VR::DS, VM::M1, "ROIMean16" }, { 0x601E, 0x1303, 0, VR::DS, VM::M1, "ROIStandardDeviation16" }, { 0x601E, 0x1500, 0, VR::LO, VM::M1, "OverlayLabel16" }, { 0x601E, 0x3000, 0, VR::OX, VM::M1, "OverlayData16" }, { 0x601E, 0x4000, 1, VR::LT, VM::M1, "OverlayComments16" }, { 0x7FE0, 0x0001, 0, VR::OV, VM::M1, "ExtendedOffsetTable" }, { 0x7FE0, 0x0002, 0, VR::OV, VM::M1, "ExtendedOffsetTableLengths" }, { 0x7FE0, 0x0008, 0, VR::OF, VM::M1, "FloatPixelData" }, { 0x7FE0, 0x0009, 0, VR::OD, VM::M1, "DoubleFloatPixelData" }, { 0x7FE0, 0x0010, 0, VR::OX, VM::M1, "PixelData" }, { 0x7FE0, 0x0020, 1, VR::OW, VM::M1, "CoefficientsSDVN" }, { 0x7FE0, 0x0030, 1, VR::OW, VM::M1, "CoefficientsSDHN" }, { 0x7FE0, 0x0040, 1, VR::OW, VM::M1, "CoefficientsSDDN" }, { 0x7F00, 0x0010, 1, VR::OX, VM::M1, "VariablePixelData" }, { 0x7F00, 0x0011, 1, VR::US, VM::M1, "VariableNextDataGroup" }, { 0x7F00, 0x0020, 1, VR::OW, VM::M1, "VariableCoefficientsSDVN" }, { 0x7F00, 0x0030, 1, VR::OW, VM::M1, "VariableCoefficientsSDHN" }, { 0x7F00, 0x0040, 1, VR::OW, VM::M1, "VariableCoefficientsSDDN" }, { 0xFFFA, 0xFFFA, 0, VR::SQ, VM::M1, "DigitalSignaturesSequence" }, { 0xFFFC, 0xFFFC, 0, VR::OB, VM::M1, "DataSetTrailingPadding" }, { 0xFFFE, 0xE000, 0, VR::XX, VM::M0, "Item" }, { 0xFFFE, 0xE00D, 0, VR::XX, VM::M0, "ItemDelimitationItem" }, { 0xFFFE, 0xE0DD, 0, VR::XX, VM::M0, "SequenceDelimitationItem" }, }; const unsigned short DictTagHashTable[] = { 4097, 4134, 4161, 4184, 4207, 4228, 4249, 4272, 4295, 4314, 4329, 4344, 4357, 4374, 4393, 4408, 4423, 4450, 4475, 4498, 4519, 4538, 4561, 4574, 4595, 4620, 4641, 4662, 4683, 4698, 4717, 4732, 4749, 4780, 4799, 4826, 4849, 4874, 4895, 4920, 4933, 4954, 4975, 4998, 5017, 5040, 5059, 5078, 5093, 5122, 5153, 5180, 5205, 5222, 5245, 5264, 5291, 5314, 5343, 5366, 5391, 5418, 5441, 5462, 5487, 5530, 5577, 5618, 5657, 5692, 5719, 5756, 5793, 5830, 5859, 5892, 5917, 5946, 5965, 5990, 6015, 6056, 6103, 6138, 6175, 6200, 6235, 6262, 6291, 6324, 6347, 6376, 6405, 6436, 6461, 6478, 6499, 6522, 6545, 6568, 6589, 6608, 6627, 6644, 6663, 6676, 6697, 6720, 6737, 6752, 6771, 6780, 6787, 6814, 6835, 6858, 6881, 6908, 6929, 6954, 6977, 6996, 7013, 7026, 7047, 7058, 7071, 7080, 7089, 7112, 7129, 7146, 7159, 7176, 7191, 7208, 7221, 7246, 7255, 7276, 7289, 7308, 7317, 7336, 7349, 7376, 7389, 7412, 7429, 7444, 7455, 7476, 7491, 7514, 7529, 7550, 7561, 7584, 7599, 7622, 7631, 7646, 7659, 7668, 7679, 7686, 7697, 7706, 7719, 7730, 7737, 7746, 7753, 7760, 7769, 7778, 7785, 7798, 7811, 7822, 7833, 7844, 7855, 7862, 7871, 7882, 7891, 7898, 7907, 7912, 7917, 7926, 7931, 7950, 7971, 7986, 7999, 8016, 8039, 8060, 8073, 8090, 8105, 8126, 8139, 8154, 8165, 8186, 8199, 8218, 8235, 8254, 8265, 8276, 8285, 8300, 8313, 8330, 8343, 8362, 8375, 8390, 8401, 8416, 8429, 8440, 8453, 8466, 8473, 8484, 8489, 8500, 8505, 8516, 8523, 8538, 8551, 8564, 8573, 8582, 8587, 8600, 8617, 8630, 8639, 8648, 8659, 8670, 8677, 8684, 8687, 8694, 8699, 8704, 8707, 8714, 8719, 8732, 8745, 8754, 8769, 8788, 8801, 8816, 8837, 8852, 8869, 8872, 8881, 8890, 8905, 8914, 8929, 8946, 8961, 8974, 8987, 9004, 9021, 9036, 9049, 9062, 9077, 9084, 9099, 9106, 9117, 9124, 9133, 9144, 9153, 9162, 9169, 9184, 9193, 9204, 9215, 9230, 9239, 9248, 9255, 9268, 9281, 9292, 9303, 9314, 9323, 9336, 9345, 9360, 9367, 9380, 9389, 9398, 9405, 9408, 9413, 9426, 9437, 9446, 9453, 9466, 9481, 9500, 9517, 9534, 9553, 9568, 9589, 9608, 9621, 9638, 9649, 9668, 9683, 9696, 9711, 9730, 9747, 9758, 9769, 9788, 9805, 9822, 9841, 9854, 9865, 9874, 9879, 9894, 9903, 9912, 9919, 9940, 9957, 9974, 9985, 10008, 10017, 10040, 10061, 10082, 10093, 10106, 10115, 10132, 10143, 10156, 10161, 10180, 10193, 10204, 10213, 10232, 10245, 10266, 10281, 10296, 10303, 10318, 10323, 10342, 10353, 10368, 10377, 10386, 10395, 10404, 10411, 10430, 10437, 10446, 10455, 10464, 10477, 10490, 10503, 10516, 10529, 10538, 10549, 10558, 10567, 10576, 10583, 10600, 10609, 10618, 10625, 10642, 10649, 10660, 10671, 10682, 10697, 10712, 10727, 10732, 10737, 10742, 10745, 10760, 10767, 10774, 10777, 10786, 10791, 10798, 10805, 10814, 10817, 10824, 10827, 4096, 10832, 4096, 10837, 10854, 10857, 10864, 10867, 10878, 10885, 10890, 10893, 10908, 10911, 10926, 10931, 10958, 10975, 11002, 11015, 11040, 11059, 11084, 11101, 11130, 11151, 11182, 11197, 11230, 11245, 11276, 11295, 11320, 11333, 11360, 11371, 11400, 11421, 11450, 11465, 11496, 11515, 11546, 11563, 11594, 11611, 11644, 11661, 11674, 11685, 11696, 11707, 11720, 11735, 11746, 11759, 11772, 11785, 11798, 11811, 11826, 11839, 11854, 11867, 11880, 11891, 11902, 11915, 11928, 11949, 11960, 11975, 11988, 12001, 12018, 12031, 12050, 12065, 12082, 12095, 12104, 12115, 12120, 12125, 12128, 12131, 12136, 12139, 12146, 12161, 12170, 12183, 12194, 12207, 12214, 12219, 12226, 12237, 12242, 4096, 12251, 12256, 12259, 12262, 12271, 12280, 12287, 12292, 12301, 12312, 12319, 12328, 12343, 12352, 12359, 12366, 12369, 12372, 12379, 12384, 12393, 12402, 12411, 12418, 12423, 12430, 12437, 12444, 12455, 12466, 12471, 12474, 12477, 12480, 12485, 12490, 12499, 12508, 12519, 12532, 12541, 12554, 12565, 12574, 12585, 12594, 12599, 12608, 4096, 12613, 12620, 12627, 12636, 12641, 12654, 12663, 12674, 12683, 12690, 12699, 12710, 12721, 12728, 12731, 4096, 12734, 12737, 12742, 4096, 12745, 12750, 12753, 12760, 12767, 12780, 12789, 12796, 12801, 12806, 12811, 4096, 4096, 12816, 12819, 12826, 12833, 12840, 12851, 12858, 12863, 12868, 12875, 12882, 12891, 12898, 12909, 12916, 12919, 12922, 12929, 12940, 12947, 12956, 12965, 12968, 12977, 12984, 12993, 13000, 13007, 13012, 13019, 13026, 13029, 13032, 13039, 13044, 13047, 13050, 13053, 13058, 13061, 13064, 13067, 13074, 13079, 13082, 13085, 13088, 13091, 13094, 13099, 13104, 13109, 13116, 4096, 4096, 13123, 4096, 13126, 13133, 13140, 13143, 13148, 13151, 13154, 13157, 13162, 13169, 4096, 4096, 4096, 4096, 4096, 13174, 13177, 13186, 13189, 13192, 13195, 13202, 13205, 13210, 13213, 4096, 13218, 4096, 13223, 4096, 13228, 4096, 13231, 13238, 13245, 13254, 13261, 13266, 13275, 13280, 13287, 13292, 13299, 13306, 13315, 13320, 13325, 13330, 13337, 13344, 13351, 13358, 13365, 13372, 13379, 13386, 13393, 13406, 13417, 13424, 13433, 13436, 13447, 13456, 13465, 13472, 13475, 13478, 13483, 13488, 13493, 13498, 13501, 13504, 13509, 13512, 13515, 4096, 13518, 13523, 13526, 13531, 13534, 13539, 13546, 13549, 13552, 4096, 4096, 13555, 13558, 4096, 13561, 4096, 13564, 13567, 13570, 13577, 13584, 13593, 13598, 13605, 13608, 13613, 13618, 13627, 13632, 13635, 13638, 13645, 13650, 13653, 13658, 4096, 13665, 4096, 13670, 13675, 4096, 13678, 4096, 13681, 13686, 4096, 4096, 13689, 4096, 4096, 13692, 13697, 13700, 4096, 13703, 13708, 13713, 13716, 13719, 13724, 13731, 13734, 13737, 13740, 13743, 13748, 13753, 13758, 13761, 13766, 13769, 13780, 13785, 13790, 13797, 13802, 13807, 13810, 13817, 13820, 13825, 13828, 13835, 13842, 13845, 13852, 13857, 13866, 13869, 13878, 13883, 13886, 13889, 13892, 13899, 13910, 13915, 13922, 13927, 13930, 13935, 13940, 13943, 13950, 13959, 13964, 13967, 13970, 13977, 13980, 13987, 13992, 13999, 14006, 14015, 14018, 14021, 14026, 14031, 14038, 14041, 14046, 14051, 14058, 4096, 14065, 14068, 14075, 14086, 14091, 14098, 14101, 14104, 4096, 14109, 14114, 14119, 14122, 4096, 14129, 14134, 14137, 14144, 14147, 14152, 14155, 14158, 14163, 14166, 14169, 14172, 14175, 14180, 14183, 14186, 4096, 14189, 14192, 14195, 14198, 14201, 14204, 14207, 14212, 14215, 14220, 14223, 14226, 14229, 14232, 14235, 4096, 14238, 4096, 14241, 14244, 14247, 14250, 4096, 14253, 4096, 14256, 14261, 14264, 14269, 14272, 4096, 4096, 4096, 4096, 14277, 4096, 14280, 4096, 14283, 4096, 4096, 14286, 14289, 14292, 14297, 14300, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14305, 14316, 14321, 14330, 14337, 14346, 14355, 14362, 14373, 14380, 14391, 14398, 14407, 14414, 14419, 14426, 14433, 14442, 14451, 14458, 14463, 14470, 14477, 14482, 14489, 14496, 14501, 14508, 14515, 14522, 14529, 14538, 14545, 14550, 14555, 14558, 14561, 14568, 14573, 14578, 4096, 4096, 4096, 14581, 4096, 4096, 4096, 4096, 14584, 14589, 14594, 14597, 14600, 14603, 14606, 14609, 4096, 4096, 14612, 4096, 14615, 14618, 14621, 14624, 14627, 14630, 4096, 14633, 14636, 14639, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14644, 4096, 14647, 14652, 4096, 14657, 14660, 14663, 14668, 4096, 4096, 14671, 4096, 14674, 4096, 4096, 14677, 4096, 14680, 14683, 14688, 14691, 14696, 4096, 14699, 14702, 14707, 14714, 14721, 14724, 14731, 14734, 14737, 14742, 14745, 4096, 4096, 4096, 4096, 4096, 14750, 4096, 14753, 14756, 14761, 14764, 14767, 4096, 4096, 4096, 4096, 14770, 14775, 14780, 14785, 14796, 14801, 14806, 14811, 14814, 14817, 14820, 14823, 14826, 4096, 14829, 4096, 14832, 14841, 14844, 14847, 14852, 4096, 14855, 4096, 14860, 14863, 14866, 4096, 4096, 4096, 14869, 14872, 14875, 14880, 14885, 14892, 14899, 14904, 14907, 14912, 4096, 4096, 4096, 4096, 4096, 4096, 14915, 14918, 4096, 4096, 14921, 14924, 14929, 14932, 14935, 4096, 14938, 14941, 14944, 14947, 14950, 14953, 14956, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14959, 14962, 14965, 14968, 4096, 4096, 4096, 4096, 14971, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14974, 14977, 14980, 14983, 14986, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14989, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14992, 4096, 4096, 14995, 4096, 4096, 4096, 14998, 4096, 15003, 4096, 15008, 4096, 15013, 4096, 15018, 4096, 15025, 4096, 15034, 15039, 15042, 4096, 15047, 15052, 15055, 4096, 15060, 4096, 15065, 4096, 15070, 15079, 15082, 15091, 15096, 15101, 15104, 15109, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15112, 15115, 4096, 15118, 15121, 15124, 15127, 15130, 4096, 15133, 15136, 15139, 15142, 15145, 15148, 4096, 15151, 15154, 15157, 15160, 4096, 15163, 15166, 15169, 15172, 15177, 15182, 4096, 15185, 15192, 15197, 15200, 4096, 4096, 15203, 4096, 15206, 4096, 4096, 4096, 15209, 15212, 4096, 15215, 15218, 4096, 15225, 4096, 4096, 4096, 15228, 4096, 15231, 15234, 4096, 4096, 15237, 15242, 15245, 15250, 15253, 15258, 15261, 15266, 15271, 15274, 15277, 4096, 15280, 15285, 15290, 4096, 15293, 4096, 15296, 4096, 15299, 15310, 15313, 15316, 4096, 4096, 15321, 4096, 4096, 4096, 4096, 4096, 15324, 15331, 15336, 4096, 15339, 15342, 15345, 15350, 4096, 4096, 15357, 4096, 15360, 15363, 4096, 15366, 15369, 15374, 15379, 15382, 15387, 15390, 4096, 4096, 4096, 4096, 4096, 15393, 15396, 15401, 15406, 15409, 15414, 15417, 15422, 15425, 15430, 15435, 15440, 15443, 4096, 4096, 4096, 15448, 15451, 15454, 15459, 4096, 15462, 15465, 15470, 15473, 4096, 15478, 15483, 15486, 4096, 4096, 4096, 4096, 15491, 15496, 4096, 4096, 4096, 4096, 4096, 4096, 15501, 4096, 4096, 4096, 15506, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15509, 4096, 4096, 4096, 15514, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15519, 4096, 4096, 4096, 15522, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15525, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15528, 4096, 4096, 4096, 15531, 4096, 4096, 15534, 15537, 15540, 15543, 4096, 4096, 4096, 4096, 4096, 15546, 15549, 15552, 15555, 15558, 15563, 15566, 15569, 15572, 4096, 15575, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15578, 4096, 4096, 15581, 15584, 4096, 15587, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15590, 4096, 4096, 4096, 4096, 4096, 4096, 15593, 15598, 4096, 4096, 4096, 4096, 4096, 4096, 15603, 15606, 4096, 15609, 4096, 15612, 15615, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15618, 4096, 4096, 15621, 15624, 4096, 15627, 15630, 15633, 15636, 15641, 15644, 4096, 4096, 4096, 4096, 15647, 4096, 15650, 15655, 15662, 15667, 15674, 15679, 4096, 4096, 15684, 4096, 4096, 4096, 4096, 4096, 15687, 15692, 15699, 15704, 15709, 15712, 15719, 15724, 15731, 15736, 15739, 4096, 15744, 15747, 15750, 15753, 15756, 15761, 15766, 15771, 15776, 15779, 15782, 15785, 15788, 15793, 15798, 15805, 15808, 15811, 15814, 15817, 15820, 15827, 15832, 15841, 15844, 4096, 15849, 15852, 15855, 15860, 15863, 15868, 15871, 4096, 4096, 4096, 15874, 15879, 4096, 15884, 15889, 15894, 15899, 15904, 15911, 15916, 15923, 15926, 15929, 15932, 15935, 15938, 15941, 15946, 15949, 15952, 15955, 15958, 15961, 15964, 15967, 15970, 15973, 15976, 15979, 15982, 15985, 15988, 15991, 15994, 15997, 16000, 16003, 16006, 16009, 16012, 16015, 16018, 16021, 16024, 16027, 16030, 16033, 16036, 16039, 16042, 16045, 16048, 16051, 16054, 16057, 16060, 16063, 16068, 16071, 16074, 16077, 16080, 16083, 16086, 16089, 16092, 16095, 16098, 16101, 16104, 16107, 16110, 16113, 16116, 16119, 16122, 16125, 16128, 16131, 16134, 16137, 16140, 16143, 16146, 16149, 16152, 16155, 16158, 16161, 16164, 16167, 16170, 16173, 16176, 16179, 16182, 16185, 16188, 16191, 16194, 16197, 16200, 16203, 16206, 16209, 16212, 16215, 16220, 16225, 16228, 16233, 16236, 16239, 16242, 16245, 16248, 16251, 16254, 16257, 16260, 16263, 4096, 16266, 16269, 16272, 16275, 16278, 16281, 16284, 16287, 16290, 16293, 16296, 16299, 16302, 16305, 16308, 16311, 16314, 16317, 16320, 16323, 16326, 16329, 16332, 16335, 16338, 16341, 16344, 16347, 16350, 16353, 4096, 4096, 4096, 4096, 16356, 16361, 4096, 4096, 16364, 16367, 16370, 16373, 16376, 4096, 16381, 16384, 4096, 4096, 4096, 4096, 16387, 16392, 16397, 4096, 16402, 16405, 16410, 16413, 16416, 16419, 16422, 16425, 4096, 4096, 4096, 4096, 16428, 4096, 4096, 4096, 16431, 16434, 4096, 16437, 16440, 4096, 16443, 16446, 4096, 4096, 4096, 4096, 16449, 16452, 16455, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16458, 4096, 16461, 4096, 16466, 16471, 16474, 16477, 16480, 4096, 16485, 16488, 16493, 16496, 4096, 4096, 4096, 4096, 4096, 4096, 16499, 16504, 16507, 4096, 16510, 16513, 16516, 16519, 16522, 16527, 4096, 4096, 4096, 4096, 4096, 4096, 16532, 4096, 4096, 16537, 16540, 16543, 16548, 16553, 16558, 16561, 4096, 16564, 4096, 4096, 4096, 4096, 16567, 16570, 4096, 16573, 16578, 16583, 16588, 16591, 16596, 16599, 16606, 16609, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16614, 4096, 16619, 4096, 16624, 4096, 16629, 4096, 16634, 4096, 16639, 4096, 16644, 4096, 16649, 4096, 16654, 16659, 16664, 4096, 16669, 4096, 16674, 4096, 16679, 4096, 16684, 4096, 16689, 4096, 16694, 4096, 4096, 16699, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16702, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16705, 4096, 16710, 16713, 16716, 16719, 16722, 16725, 16728, 16731, 16734, 16737, 16740, 4096, 4096, 4096, 16743, 16746, 4096, 4096, 4096, 4096, 16749, 4096, 4096, 4096, 16752, 16755, 4096, 16758, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16761, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16764, 16767, 16770, 16773, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16776, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16779, 4096, 16782, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16785, 16788, 16791, 4096, 16794, 4096, 16797, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16800, 4096, 16803, 16810, 16813, 16820, 16823, 16830, 16833, 16840, 16843, 16852, 16855, 16864, 16867, 16874, 16877, 16884, 16887, 16894, 16897, 16904, 16907, 16914, 16917, 16924, 16927, 16934, 16937, 16944, 16947, 16956, 16959, 16968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16971, 4096, 16974, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 16977, 16980, 4096, 4096, 4096, 4096, 4096, 4096, 16983, 4096, 16986, 4096, 16989, 16992, 16995, 16998, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17001, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17004, 17007, 4096, 17010, 17013, 17016, 17019, 17022, 4096, 17025, 4096, 17028, 17031, 17034, 17037, 17040, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17043, 4096, 4096, 17046, 4096, 17049, 17052, 4096, 4096, 4096, 4096, 4096, 17055, 4096, 4096, 4096, 17058, 17061, 17064, 17067, 4096, 17070, 17073, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17076, 17079, 17082, 17085, 17088, 4096, 17091, 17094, 17097, 17100, 17103, 4096, 17106, 17109, 17112, 17115, 17118, 17121, 17124, 17127, 17130, 17133, 17136, 17139, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17142, 4096, 4096, 4096, 17145, 17148, 17151, 17154, 17157, 17160, 17163, 17166, 17169, 17172, 17175, 17178, 17181, 17184, 17187, 17190, 17193, 17196, 17199, 17202, 17205, 17208, 17211, 17214, 17217, 17220, 17225, 17228, 17231, 17234, 17237, 17240, 17243, 17246, 17249, 17252, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17255, 4096, 4096, 4096, 4096, 4096, 4096, 17258, 17261, 4096, 4096, 4096, 4096, 4096, 17264, 17267, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17270, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17273, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17276, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17279, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17282, 4096, 4096, 17285, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17288, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17291, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17294, 17297, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17300, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17303, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 17306, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 0, 18, 2, 2, 45, 8, 154, 4169, 258, 16, 571, 22, 1180, 37457, 1518, 32, 1659, 34, 1809, 36, 2152, 50, 2358, 4097, 2622, 70, 3264, 114, 3588, 162, 4562, 16384, 4575, 268, 5758, 65530, 5759, 65532, 13, 3, 3, 153, 4168, 301, 4176, 572, 23, 1179, 37456, 1810, 37, 2153, 51, 2623, 71, 3265, 115, 3362, 4148, 3512, 1025, 3750, 196, 3942, 200, 11, 0, 0, 334, 16, 569, 20, 1182, 37459, 1519, 34, 1657, 32, 2360, 4099, 2621, 68, 3262, 112, 3513, 1026, 3587, 160, 11, 1, 1, 570, 21, 1181, 37458, 1658, 33, 2176, 4208, 2359, 4098, 3263, 113, 3363, 4150, 3514, 1027, 3751, 198, 3943, 202, 10, 567, 18, 1184, 37461, 1520, 36, 1807, 32, 2362, 4101, 2620, 66, 2792, 80, 3268, 118, 3515, 1028, 4571, 264, 10, 568, 19, 1183, 37460, 1707, 4198, 1808, 33, 2361, 4100, 2793, 81, 3360, 4144, 3748, 192, 3944, 204, 4572, 265, 11, 565, 16, 1186, 37463, 1521, 38, 1706, 4197, 2154, 52, 2364, 4103, 2619, 64, 2794, 82, 3266, 116, 3429, 112, 4573, 266, 11, 41, 1, 566, 17, 1185, 37462, 2155, 53, 2363, 4102, 2795, 83, 3267, 117, 3361, 4146, 3749, 194, 3945, 206, 4574, 267, 9, 152, 4161, 579, 30, 655, 16, 1188, 37465, 2203, 48, 2366, 4105, 3270, 122, 3445, 112, 4590, 16384, 7, 42, 1, 151, 4160, 580, 31, 742, 4176, 1187, 37464, 2365, 4104, 3935, 192, 7, 577, 28, 656, 18, 1190, 37467, 1660, 40, 2204, 50, 3269, 120, 3937, 195, 6, 578, 29, 657, 19, 1189, 37466, 2367, 4106, 3810, 192, 3936, 194, 8, 575, 26, 658, 20, 1192, 37469, 1811, 40, 3272, 126, 3753, 201, 3939, 197, 4567, 256, 9, 43, 5, 576, 27, 659, 21, 1191, 37468, 3273, 127, 3364, 4152, 3752, 200, 3938, 196, 4568, 257, 7, 44, 6, 573, 24, 1194, 37471, 3271, 124, 3755, 203, 3941, 199, 4569, 258, 7, 574, 25, 1193, 37470, 3365, 4154, 3754, 202, 3940, 198, 4410, 192, 4570, 259, 13, 5, 18, 52, 24, 555, 6, 741, 4169, 1178, 37441, 1522, 48, 1663, 50, 1814, 52, 2369, 4113, 3056, 96, 3248, 98, 3352, 4133, 3955, 217, 12, 6, 19, 300, 4160, 556, 7, 740, 4168, 1177, 37440, 1548, 4208, 1815, 53, 2368, 4112, 2829, 4100, 3249, 99, 3351, 4132, 3954, 216, 11, 4, 16, 53, 26, 553, 4, 1523, 50, 1661, 48, 1816, 54, 3057, 98, 3246, 96, 3354, 4135, 3563, 128, 3957, 219, 10, 54, 27, 554, 5, 1662, 49, 1817, 55, 2172, 4192, 2370, 4114, 2830, 4102, 3247, 97, 3353, 4134, 3956, 218, 9, 7, 22, 551, 2, 1665, 54, 2175, 4199, 2625, 82, 2827, 4097, 3252, 102, 3959, 221, 4582, 280, 11, 8, 23, 384, 4160, 552, 3, 1524, 53, 1666, 55, 2174, 4198, 2826, 4096, 3253, 103, 3349, 4128, 3958, 220, 4583, 281, 6, 1812, 50, 2624, 80, 3058, 102, 3250, 100, 3428, 96, 4584, 282, 10, 550, 1, 1525, 55, 1664, 53, 1813, 51, 2173, 4196, 2828, 4098, 3059, 103, 3251, 101, 3350, 4130, 3960, 222, 12, 46, 16, 563, 14, 733, 4161, 1915, 48, 2201, 32, 2439, 37393, 3060, 104, 3256, 106, 3359, 4141, 3444, 96, 3947, 209, 4579, 276, 10, 155, 4176, 564, 15, 732, 4160, 1916, 49, 2202, 33, 2438, 37392, 3257, 107, 3358, 4140, 3946, 208, 4580, 277, 10, 9, 24, 47, 18, 561, 12, 735, 4163, 1667, 56, 1917, 50, 2224, 32, 2441, 37395, 3254, 104, 3949, 211, 10, 48, 19, 156, 4178, 562, 13, 734, 4162, 1668, 57, 2440, 37394, 3255, 105, 3811, 208, 3948, 210, 4581, 279, 7, 49, 20, 559, 10, 737, 4165, 1818, 56, 1918, 52, 3260, 110, 3951, 213, 9, 50, 21, 560, 11, 736, 4164, 1819, 57, 2442, 37396, 3261, 111, 3355, 4136, 3950, 212, 4576, 273, 7, 51, 22, 557, 8, 739, 4167, 3258, 108, 3357, 4139, 3953, 215, 4577, 274, 8, 558, 9, 738, 4166, 2443, 37398, 3259, 109, 3356, 4138, 3952, 214, 4411, 208, 4578, 275, 15, 266, 48, 364, 52, 599, 54, 679, 56, 765, 4217, 1547, 4161, 1598, 37449, 1629, 2, 1908, 8, 2151, 18, 2223, 26, 3051, 80, 3241, 82, 3551, 162, 3970, 233, 9, 600, 55, 680, 57, 764, 4216, 1546, 4160, 1597, 37448, 1630, 3, 1909, 9, 3052, 81, 3969, 232, 13, 61, 42, 267, 50, 337, 48, 597, 52, 681, 58, 1910, 10, 2170, 4177, 2196, 26, 2629, 100, 3053, 82, 3240, 80, 3549, 160, 3972, 235, 11, 268, 51, 338, 49, 598, 53, 1628, 1, 1693, 4160, 2169, 4176, 2197, 27, 3054, 83, 3427, 85, 3550, 161, 3971, 234, 12, 10, 38, 269, 52, 362, 48, 595, 50, 1633, 6, 1697, 4167, 2198, 28, 2627, 98, 2800, 112, 2939, 66, 3243, 86, 3974, 237, 10, 11, 39, 270, 53, 596, 51, 1634, 7, 1696, 4166, 2199, 29, 2628, 99, 2801, 113, 2940, 67, 3973, 236, 12, 363, 50, 593, 48, 1631, 4, 1695, 4165, 2171, 4181, 2200, 30, 2626, 96, 2802, 114, 2937, 64, 3242, 84, 3552, 164, 3976, 239, 6, 594, 49, 1632, 5, 1694, 4164, 2803, 115, 2938, 65, 3975, 238, 10, 55, 32, 671, 48, 757, 4209, 1593, 37441, 1637, 10, 1701, 4171, 1991, 4161, 2192, 16, 3443, 80, 3962, 225, 10, 56, 33, 157, 4192, 672, 49, 756, 4208, 1638, 11, 1700, 4170, 1990, 4160, 2193, 17, 2444, 37408, 3961, 224, 11, 12, 40, 57, 34, 673, 50, 759, 4211, 1635, 8, 1699, 4169, 1903, 2, 2222, 16, 3055, 90, 3553, 168, 3964, 227, 9, 58, 35, 158, 4194, 674, 51, 758, 4210, 1636, 9, 1698, 4168, 1904, 3, 3812, 224, 3963, 226, 11, 59, 36, 603, 58, 675, 52, 761, 4213, 1594, 37445, 1641, 14, 1905, 4, 2194, 20, 2446, 37413, 3244, 94, 3966, 229, 9, 60, 37, 604, 59, 676, 53, 760, 4212, 1506, 13, 1906, 5, 2445, 37412, 3245, 95, 3965, 228, 9, 601, 56, 677, 54, 763, 4215, 1507, 14, 1596, 37447, 1639, 12, 1907, 6, 2195, 22, 3968, 231, 7, 602, 57, 678, 55, 762, 4214, 1595, 37446, 1640, 13, 3967, 230, 4412, 224, 14, 14, 50, 259, 32, 359, 36, 587, 38, 668, 40, 752, 4201, 1508, 16, 1644, 18, 1703, 4179, 2181, 4, 2191, 8, 2634, 118, 3048, 64, 3985, 249, 15, 15, 51, 260, 33, 302, 4192, 360, 37, 588, 39, 669, 41, 751, 4200, 1195, 37472, 1509, 17, 1645, 19, 2182, 5, 2635, 119, 3049, 65, 3342, 4100, 3984, 248, 13, 261, 34, 335, 32, 585, 36, 670, 42, 1510, 18, 1642, 16, 1805, 22, 2168, 4161, 2632, 116, 3050, 66, 3239, 64, 3344, 4103, 3987, 251, 12, 13, 49, 336, 33, 586, 37, 753, 4202, 1511, 19, 1643, 17, 1702, 4176, 2167, 4160, 2183, 7, 2633, 117, 3343, 4102, 3986, 250, 8, 17, 54, 262, 36, 583, 34, 1512, 20, 1648, 22, 1802, 16, 2796, 96, 3564, 166, 11, 18, 55, 584, 35, 754, 4204, 1513, 21, 1649, 23, 1803, 17, 2178, 1, 2797, 97, 3340, 4096, 3565, 167, 3988, 252, 9, 263, 38, 581, 32, 1514, 22, 1646, 20, 1804, 18, 2179, 2, 2630, 112, 2798, 98, 3426, 64, 13, 16, 53, 264, 39, 358, 35, 582, 33, 755, 4206, 1515, 23, 1647, 21, 1704, 4180, 2180, 3, 2631, 113, 2799, 99, 3341, 4098, 3989, 254, 11, 62, 48, 265, 40, 660, 32, 744, 4193, 1516, 24, 1600, 37457, 1652, 26, 1911, 16, 1993, 4177, 2149, 10, 2188, 12, 14, 63, 49, 159, 4208, 661, 33, 743, 4192, 1517, 25, 1599, 37456, 1653, 27, 1912, 17, 1992, 4176, 2189, 13, 3347, 4108, 3814, 242, 3977, 240, 4416, 246, 11, 19, 56, 64, 50, 662, 34, 746, 4195, 1602, 37459, 1650, 24, 1705, 4185, 1913, 18, 1995, 4179, 3566, 168, 3979, 243, 12, 65, 51, 160, 4210, 663, 35, 745, 4194, 1601, 37458, 1651, 25, 1994, 4178, 3348, 4110, 3567, 169, 3813, 240, 3978, 242, 4415, 244, 13, 66, 52, 361, 40, 591, 42, 664, 36, 748, 4197, 1604, 37461, 1656, 30, 1806, 24, 1914, 20, 1997, 4181, 2184, 8, 2190, 4, 3981, 245, 11, 67, 53, 592, 43, 665, 37, 747, 4196, 1603, 37460, 1996, 4180, 2185, 9, 3345, 4104, 3816, 246, 3980, 244, 4414, 242, 10, 589, 40, 666, 38, 750, 4199, 1606, 37463, 1654, 28, 2072, 24976, 2150, 12, 2186, 10, 2220, 4, 3983, 247, 12, 590, 41, 667, 39, 749, 4198, 1605, 37462, 1655, 29, 1998, 4182, 2187, 11, 2221, 5, 3346, 4106, 3815, 244, 3982, 246, 4413, 240, 21, 293, 4112, 344, 83, 534, 20752, 724, 4120, 1544, 4128, 1591, 37416, 1841, 101, 1930, 105, 2164, 4146, 2258, 1, 2757, 19, 2778, 21, 2920, 39, 3528, 0, 3734, 132, 3909, 136, 4685, 260, 4713, 262, 4898, 276, 4948, 272, 4975, 274, 23, 272, 80, 343, 82, 371, 84, 535, 20753, 725, 4121, 1528, 96, 1840, 100, 1929, 104, 2165, 4147, 2586, 4, 2702, 8, 2731, 16, 2756, 18, 2777, 20, 2919, 38, 3233, 50, 3424, 54, 3529, 1, 3603, 130, 3735, 133, 3910, 137, 4686, 261, 4762, 259, 20, 342, 81, 536, 20754, 726, 4122, 1843, 103, 2162, 4144, 2260, 3, 2587, 7, 2733, 19, 2755, 17, 2780, 23, 2881, 33, 2918, 37, 3530, 2, 3736, 134, 3911, 138, 4687, 262, 4711, 260, 4924, 276, 4949, 274, 4974, 272, 19, 341, 80, 372, 86, 537, 20755, 727, 4123, 1529, 98, 1842, 102, 2163, 4145, 2259, 2, 2732, 18, 2779, 22, 2880, 32, 2917, 36, 3232, 48, 3423, 52, 3531, 3, 3602, 128, 3912, 139, 4712, 261, 4736, 259, 17, 382, 4112, 538, 20756, 1165, 37396, 1837, 97, 2262, 5, 2583, 1, 2735, 21, 2774, 17, 2916, 35, 3532, 4, 3732, 128, 3913, 140, 4737, 260, 4765, 262, 4896, 272, 4923, 274, 4950, 276, 13, 247, 37381, 369, 80, 539, 20757, 1836, 96, 2261, 4, 2734, 20, 2759, 22, 2773, 16, 3422, 50, 3533, 5, 3914, 141, 4710, 259, 4738, 261, 18, 248, 37382, 540, 20758, 621, 81, 1684, 4132, 1839, 99, 2166, 4148, 2264, 7, 2585, 3, 2737, 23, 2776, 19, 2915, 33, 3733, 130, 3915, 142, 4739, 262, 4763, 260, 4897, 274, 4922, 272, 4976, 276, 18, 249, 37383, 370, 82, 541, 20759, 620, 80, 1166, 37399, 1685, 4133, 1838, 98, 2263, 6, 2584, 2, 2736, 22, 2758, 20, 2775, 18, 2914, 32, 3234, 52, 3421, 48, 3916, 143, 4684, 259, 4764, 261, 18, 69, 65, 145, 4096, 250, 37384, 542, 20760, 718, 4112, 1167, 37400, 1924, 97, 2266, 9, 2697, 1, 2739, 25, 2928, 47, 3805, 130, 3904, 128, 4789, 260, 4817, 262, 5002, 276, 5052, 272, 5079, 274, 14, 68, 64, 251, 37385, 543, 20761, 684, 80, 719, 4113, 1168, 37401, 1589, 37409, 1923, 96, 2265, 8, 2738, 24, 2927, 46, 3236, 58, 4790, 261, 4866, 259, 16, 544, 20762, 720, 4114, 1590, 37410, 1686, 4136, 1926, 99, 2268, 11, 2699, 3, 2741, 27, 2926, 45, 3804, 128, 3905, 130, 4791, 262, 4815, 260, 5028, 276, 5053, 274, 5078, 272, 12, 70, 66, 545, 20763, 1687, 4137, 1925, 98, 2267, 10, 2698, 2, 2740, 26, 2925, 44, 3235, 56, 3906, 131, 4816, 261, 4840, 259, 14, 546, 20764, 721, 4116, 1845, 105, 1927, 101, 2589, 9, 2743, 29, 2924, 43, 3737, 136, 3907, 132, 4841, 260, 4869, 262, 5000, 272, 5027, 274, 5054, 276, 9, 547, 20765, 1844, 104, 2588, 8, 2742, 28, 2781, 24, 2923, 42, 3238, 62, 4814, 259, 4842, 261, 12, 548, 20766, 722, 4118, 2591, 11, 2701, 7, 2922, 41, 3908, 134, 4407, 128, 4843, 262, 4867, 260, 5001, 274, 5026, 272, 5080, 276, 12, 432, 12441, 549, 20767, 723, 4119, 1928, 102, 2590, 10, 2700, 6, 2744, 30, 2921, 40, 3237, 60, 3425, 56, 4788, 259, 4868, 261, 20, 289, 4096, 367, 69, 518, 20736, 611, 71, 714, 4104, 1164, 37376, 1592, 37432, 1851, 117, 2270, 17, 2580, 19, 2749, 3, 2935, 55, 3044, 33, 3534, 0, 4554, 130, 4690, 276, 4740, 272, 4767, 274, 4893, 260, 4921, 262, 23, 78, 88, 271, 64, 290, 4097, 340, 66, 366, 68, 519, 20737, 610, 70, 715, 4105, 1530, 112, 1688, 4147, 1850, 116, 2269, 16, 2518, 41626, 2579, 18, 2611, 22, 2748, 2, 2934, 54, 3043, 32, 3228, 34, 3440, 40, 4555, 131, 4894, 261, 4970, 259, 17, 291, 4098, 520, 20738, 609, 69, 716, 4106, 1853, 119, 2160, 4128, 2578, 17, 2610, 21, 2747, 1, 2933, 53, 3046, 35, 4552, 128, 4716, 276, 4741, 274, 4766, 272, 4895, 262, 4919, 260, 18, 339, 64, 368, 70, 521, 20739, 608, 68, 717, 4107, 1852, 118, 2161, 4129, 2271, 18, 2577, 16, 2609, 20, 2932, 52, 3045, 34, 3227, 32, 3441, 42, 3604, 144, 4553, 129, 4920, 261, 4944, 259, 12, 522, 20740, 607, 67, 1690, 4150, 1847, 113, 2593, 17, 2752, 7, 4558, 134, 4688, 272, 4715, 274, 4742, 276, 4945, 260, 4973, 262, 17, 252, 37397, 292, 4101, 523, 20741, 606, 66, 1691, 4151, 1846, 112, 2129, 37429, 2592, 16, 2608, 18, 2730, 4, 2751, 6, 2931, 50, 3047, 36, 3230, 38, 4559, 135, 4918, 259, 4946, 261, 13, 431, 12416, 524, 20742, 605, 65, 1849, 115, 2582, 21, 2595, 19, 2930, 49, 4556, 132, 4689, 274, 4714, 272, 4768, 276, 4947, 262, 4971, 260, 14, 365, 66, 525, 20743, 1689, 4149, 1848, 114, 2581, 20, 2594, 18, 2750, 4, 2929, 48, 3229, 36, 3420, 32, 3442, 46, 4557, 133, 4892, 259, 4972, 261, 16, 72, 81, 146, 4112, 526, 20744, 619, 79, 707, 4096, 944, 20740, 1932, 113, 2209, 97, 2704, 17, 3807, 146, 3917, 144, 4794, 276, 4844, 272, 4871, 274, 4997, 260, 5025, 262, 11, 71, 80, 527, 20745, 618, 78, 682, 64, 1931, 112, 2208, 96, 2703, 16, 3437, 32, 3918, 145, 4998, 261, 5074, 259, 14, 74, 83, 528, 20746, 617, 77, 708, 4098, 2706, 19, 2754, 9, 3806, 144, 3919, 146, 4560, 136, 4820, 276, 4845, 274, 4870, 272, 4999, 262, 5023, 260, 14, 73, 82, 529, 20747, 616, 76, 683, 66, 709, 4099, 1692, 4153, 2210, 98, 2515, 41616, 2705, 18, 2753, 8, 3231, 40, 3920, 147, 5024, 261, 5048, 259, 15, 76, 85, 530, 20748, 615, 75, 710, 4100, 942, 20736, 1855, 121, 2517, 41623, 2596, 25, 2708, 21, 3921, 148, 4792, 272, 4819, 274, 4846, 276, 5049, 260, 5077, 262, 12, 75, 84, 531, 20749, 614, 74, 711, 4101, 943, 20737, 1854, 120, 2211, 100, 2516, 41622, 2707, 20, 3438, 36, 5022, 259, 5050, 261, 8, 532, 20750, 613, 73, 712, 4102, 4793, 274, 4818, 272, 4872, 276, 5051, 262, 5075, 260, 10, 77, 86, 533, 20751, 612, 72, 713, 4103, 1545, 4159, 2612, 24, 2936, 56, 3439, 38, 4996, 259, 5076, 261, 11, 299, 4144, 631, 119, 1538, 4096, 1823, 69, 2371, 4192, 2767, 51, 2863, 3, 2884, 5, 3039, 17, 3376, 4180, 3739, 164, 11, 84, 104, 350, 114, 630, 118, 1172, 37425, 1539, 4097, 1670, 66, 1822, 68, 2272, 32, 2862, 2, 3038, 16, 3225, 18, 11, 349, 113, 629, 117, 1173, 37426, 1540, 4098, 1669, 65, 2158, 4112, 2766, 49, 2861, 1, 2885, 7, 3377, 4182, 3740, 166, 10, 628, 116, 1541, 4099, 1824, 70, 2159, 4113, 2765, 48, 2789, 54, 2893, 4, 3040, 18, 3224, 16, 3378, 4183, 9, 627, 115, 1174, 37428, 1542, 4100, 2786, 49, 2867, 7, 2892, 3, 3042, 21, 3374, 4176, 3738, 160, 9, 626, 114, 1543, 4101, 1678, 4103, 1820, 64, 2769, 54, 2785, 48, 2866, 6, 2891, 2, 3041, 20, 8, 625, 113, 1175, 37430, 2274, 39, 2788, 51, 2865, 5, 2883, 3, 2890, 1, 3375, 4178, 9, 624, 112, 1821, 66, 2273, 38, 2768, 52, 2787, 50, 2864, 4, 2882, 2, 3226, 20, 3419, 16, 6, 80, 97, 639, 127, 687, 113, 731, 4144, 2871, 11, 3922, 160, 10, 79, 96, 638, 126, 686, 112, 1176, 37433, 1919, 64, 2207, 80, 2772, 58, 2870, 10, 2899, 14, 3436, 16, 11, 82, 99, 637, 125, 689, 115, 1672, 73, 1679, 4104, 2771, 57, 2869, 9, 2888, 15, 2898, 13, 3808, 160, 3923, 162, 8, 81, 98, 636, 124, 688, 114, 1671, 72, 1680, 4105, 2770, 56, 2868, 8, 2897, 12, 7, 635, 123, 691, 117, 2791, 57, 2875, 15, 2887, 9, 2896, 11, 3924, 164, 9, 83, 100, 634, 122, 690, 116, 1673, 78, 1825, 72, 2790, 56, 2874, 14, 2886, 8, 2895, 10, 4, 633, 121, 2873, 13, 2894, 9, 4408, 160, 3, 632, 120, 2613, 40, 2872, 12, 13, 294, 4128, 347, 99, 1169, 37408, 1682, 4114, 1831, 85, 2275, 49, 2746, 33, 2879, 19, 2906, 23, 3030, 1, 3368, 4164, 3743, 180, 3930, 184, 10, 295, 4129, 346, 98, 1526, 80, 1830, 84, 2617, 54, 2745, 32, 2878, 18, 2905, 22, 3217, 2, 3414, 6, 11, 296, 4130, 1681, 4112, 1833, 87, 2156, 4096, 2277, 51, 2877, 17, 2904, 21, 3032, 3, 3369, 4166, 3744, 182, 3931, 186, 11, 297, 4131, 345, 96, 1527, 82, 1832, 86, 2157, 4097, 2276, 50, 2616, 52, 2876, 16, 3031, 2, 3745, 183, 3932, 187, 13, 298, 4132, 383, 4128, 1676, 87, 1827, 81, 2278, 53, 2762, 39, 2783, 33, 2903, 19, 3034, 5, 3366, 4160, 3413, 3, 3741, 176, 3933, 188, 10, 623, 98, 1675, 86, 1826, 80, 2615, 50, 2761, 38, 2782, 32, 2889, 16, 2902, 18, 3033, 4, 3219, 6, 12, 149, 4158, 622, 97, 1170, 37414, 1674, 85, 1829, 83, 1922, 95, 2760, 37, 2901, 17, 3367, 4162, 3412, 1, 3742, 178, 3934, 190, 11, 150, 4159, 253, 37431, 348, 100, 1171, 37415, 1828, 82, 2279, 54, 2614, 48, 2784, 34, 2900, 16, 3035, 6, 3218, 4, 9, 147, 4144, 728, 4128, 1921, 81, 2280, 57, 2913, 31, 3037, 9, 3372, 4172, 3435, 1, 3925, 176, 8, 85, 112, 685, 96, 1920, 80, 2205, 64, 2912, 30, 3036, 8, 3221, 10, 3418, 14, 6, 148, 4146, 729, 4130, 2764, 41, 3373, 4174, 3809, 176, 3926, 178, 10, 730, 4131, 1588, 37395, 1677, 88, 1683, 4121, 2281, 58, 2763, 40, 2911, 28, 3220, 8, 3417, 12, 3927, 179, 5, 1835, 89, 2910, 27, 3370, 4168, 3746, 184, 3928, 180, 6, 1834, 88, 2206, 68, 2909, 26, 3223, 14, 3416, 10, 3747, 185, 4, 2908, 25, 3371, 4170, 3929, 182, 4409, 176, 4, 2618, 56, 2907, 24, 3222, 12, 3415, 8, 11, 390, 8212, 2389, 12289, 3454, 2, 3556, 16, 3583, 32, 3888, 75, 4506, 81, 5144, 16384, 5202, 256, 5243, 258, 5524, 272, 8, 2860, 12320, 3455, 3, 3466, 1, 3673, 66, 3728, 70, 3782, 72, 3887, 74, 4505, 80, 8, 391, 8214, 3672, 65, 3727, 69, 4508, 83, 5184, 16384, 5203, 258, 5242, 256, 5564, 272, 6, 3453, 1, 3467, 3, 3671, 64, 3726, 68, 3886, 72, 4507, 82, 8, 3458, 6, 3468, 4, 3891, 79, 4510, 85, 5122, 256, 5163, 258, 5224, 16384, 5444, 272, 7, 421, 12368, 3459, 7, 3469, 5, 3689, 64, 3725, 66, 3890, 78, 4509, 84, 8, 389, 8210, 3456, 4, 3470, 6, 4512, 87, 5123, 258, 5162, 256, 5264, 16384, 5484, 272, 6, 3457, 5, 3471, 7, 3690, 66, 3724, 64, 3889, 76, 4511, 86, 12, 88, 130, 394, 8220, 912, 8208, 1532, 170, 3472, 8, 3776, 65, 3883, 67, 4514, 89, 5304, 16384, 5362, 256, 5403, 258, 5684, 272, 4, 704, 147, 3775, 64, 3882, 66, 4513, 88, 10, 86, 128, 395, 8222, 702, 144, 3460, 8, 3473, 10, 4516, 91, 5344, 16384, 5363, 258, 5402, 256, 5724, 272, 6, 87, 129, 703, 145, 3461, 9, 3777, 66, 3881, 64, 4515, 90, 9, 392, 8216, 2071, 24864, 3474, 12, 3779, 69, 4518, 93, 5282, 256, 5323, 258, 5384, 16384, 5604, 272, 4, 3778, 68, 3885, 70, 4400, 64, 4517, 92, 9, 393, 8218, 705, 148, 3730, 73, 3781, 71, 4520, 95, 5283, 258, 5322, 256, 5424, 16384, 5644, 272, 6, 706, 149, 3729, 72, 3780, 70, 3884, 68, 4401, 66, 4519, 94, 13, 307, 8192, 386, 8196, 644, 132, 3464, 18, 3475, 16, 3535, 16, 3584, 48, 3594, 32, 4490, 65, 5204, 272, 5464, 16384, 5522, 256, 5563, 258, 6, 351, 129, 645, 133, 3465, 19, 3676, 82, 3693, 84, 4489, 64, 11, 352, 130, 387, 8198, 646, 134, 700, 136, 3462, 16, 3675, 81, 4492, 67, 5244, 272, 5504, 16384, 5523, 258, 5562, 256, 8, 353, 131, 647, 135, 701, 137, 3463, 17, 3674, 80, 3694, 86, 3787, 90, 4491, 66, 7, 354, 132, 640, 128, 4494, 69, 5124, 272, 5442, 256, 5483, 258, 5544, 16384, 5, 355, 133, 420, 12352, 641, 129, 3691, 80, 4493, 68, 10, 93, 156, 356, 134, 385, 8194, 642, 130, 3476, 22, 4496, 71, 5164, 272, 5443, 258, 5482, 256, 5584, 16384, 7, 94, 157, 357, 135, 643, 131, 3477, 23, 3692, 82, 3731, 80, 4495, 70, 11, 90, 146, 652, 140, 694, 130, 3478, 24, 3895, 83, 4404, 85, 4498, 73, 5364, 272, 5624, 16384, 5682, 256, 5723, 258, 7, 653, 141, 695, 131, 906, 8193, 3479, 25, 3783, 80, 3894, 82, 4497, 72, 10, 89, 144, 654, 142, 692, 128, 907, 8194, 3893, 81, 4500, 75, 5404, 272, 5664, 16384, 5683, 258, 5722, 256, 5, 693, 129, 908, 8195, 3784, 82, 3892, 80, 4499, 74, 11, 92, 150, 388, 8200, 648, 136, 698, 134, 909, 8196, 4403, 81, 4502, 77, 5284, 272, 5602, 256, 5643, 258, 5704, 16384, 7, 649, 137, 699, 135, 910, 8197, 3695, 88, 3785, 84, 4402, 80, 4501, 76, 11, 91, 148, 650, 138, 696, 132, 911, 8198, 3536, 30, 3896, 85, 4504, 79, 5324, 272, 5603, 258, 5642, 256, 5744, 16384, 4, 651, 139, 697, 133, 3786, 86, 4503, 78, 7, 428, 12405, 1860, 134, 3537, 32, 3557, 48, 3593, 16, 3598, 96, 4538, 113, 6, 427, 12404, 1861, 135, 2854, 12288, 3480, 33, 3796, 104, 4537, 112, 4, 430, 12407, 1531, 128, 3481, 34, 4539, 115, 5, 429, 12406, 1859, 133, 2855, 12290, 3482, 35, 3797, 106, 3, 396, 8240, 424, 12401, 4541, 117, 5, 423, 12400, 1858, 131, 2856, 12292, 3696, 96, 4540, 116, 4, 397, 8242, 426, 12403, 1856, 128, 4543, 119, 6, 425, 12402, 1857, 129, 2857, 12294, 3697, 98, 4406, 106, 4542, 118, 5, 914, 8240, 1935, 130, 2045, 8192, 3789, 97, 4545, 121, 3, 2858, 12296, 3788, 96, 4544, 120, 4, 1933, 128, 2046, 8194, 3791, 99, 4547, 123, 3, 1934, 129, 3790, 98, 4546, 122, 3, 2065, 24832, 3793, 101, 4549, 125, 4, 2066, 24833, 3792, 100, 4405, 96, 4548, 124, 4, 1862, 136, 2067, 24834, 3795, 103, 4551, 127, 3, 1863, 137, 3794, 102, 4550, 126, 6, 1870, 150, 3538, 48, 3582, 16, 3599, 112, 3903, 123, 4522, 97, 6, 1871, 151, 2859, 12304, 3700, 116, 3802, 120, 3902, 122, 4521, 96, 5, 1868, 148, 3483, 50, 3600, 114, 3901, 121, 4524, 99, 5, 1869, 149, 3484, 51, 3803, 122, 3900, 120, 4523, 98, 5, 1866, 146, 3434, 192, 3485, 52, 3601, 116, 4526, 101, 5, 422, 12384, 1867, 147, 3486, 53, 3698, 112, 4525, 100, 3, 1864, 144, 3487, 54, 4528, 103, 4, 1865, 145, 3488, 55, 3699, 114, 4527, 102, 5, 913, 8224, 1938, 146, 2070, 24852, 3489, 56, 4530, 105, 4, 1939, 147, 3798, 112, 3899, 114, 4529, 104, 3, 1936, 144, 3898, 113, 4532, 107, 4, 1937, 145, 3799, 114, 3897, 112, 4531, 106, 2, 2068, 24848, 4534, 109, 2, 3800, 116, 4533, 108, 4, 1872, 152, 1940, 148, 2069, 24850, 4536, 111, 2, 3801, 118, 4535, 110, 9, 2377, 8193, 3652, 2, 3679, 4, 3703, 6, 3857, 10, 4396, 12, 4442, 16, 5211, 4352, 5253, 4354, 10, 3539, 64, 3559, 80, 3607, 16, 3616, 320, 3653, 3, 3680, 5, 3858, 11, 4443, 17, 5212, 4353, 5254, 4355, 7, 305, 4240, 3681, 6, 3702, 4, 4397, 14, 4444, 18, 5213, 4354, 5251, 4352, 6, 3452, 184, 3560, 82, 3856, 9, 4445, 19, 5214, 4355, 5252, 4353, 8, 1197, 37526, 2379, 8197, 3701, 2, 3860, 14, 4393, 8, 4446, 20, 5131, 4352, 5173, 4354, 11, 413, 12305, 1198, 37527, 2378, 8196, 2636, 128, 3433, 176, 3561, 84, 3677, 1, 4394, 9, 4447, 21, 5132, 4353, 5174, 4355, 10, 414, 12306, 2381, 8199, 3654, 4, 3678, 2, 3859, 12, 4395, 10, 4426, 8, 4448, 22, 5133, 4354, 5171, 4352, 6, 1196, 37525, 2380, 8198, 2806, 144, 4449, 23, 5134, 4355, 5172, 4353, 8, 2383, 8201, 3655, 10, 3684, 12, 3851, 2, 4390, 4, 4450, 24, 5371, 4352, 5413, 4354, 7, 235, 12289, 2382, 8200, 3449, 178, 3852, 3, 4451, 25, 5372, 4353, 5414, 4355, 10, 161, 4224, 236, 12290, 774, 4240, 1199, 37528, 3685, 14, 4391, 6, 4424, 4, 4452, 26, 5373, 4354, 5411, 4352, 6, 3448, 176, 4392, 7, 4425, 5, 4453, 27, 5374, 4355, 5412, 4353, 7, 3658, 14, 3682, 8, 3854, 6, 4423, 2, 4454, 28, 5291, 4352, 5333, 4354, 5, 3451, 182, 3855, 7, 4455, 29, 5292, 4353, 5334, 4355, 10, 162, 4228, 775, 4244, 3656, 12, 3683, 10, 3704, 8, 3853, 4, 4389, 2, 4456, 30, 5293, 4354, 5331, 4352, 6, 3450, 180, 3657, 13, 3705, 9, 4457, 31, 5294, 4355, 5332, 4353, 9, 2385, 8209, 2639, 149, 3596, 17, 3661, 18, 3688, 20, 3709, 22, 3868, 26, 5531, 4352, 5573, 4354, 8, 2384, 8208, 2638, 148, 3540, 80, 3558, 64, 3595, 16, 4427, 1, 5532, 4353, 5574, 4355, 9, 303, 4224, 773, 4232, 2640, 151, 3659, 16, 3708, 20, 3867, 24, 4428, 2, 5533, 4354, 5571, 4352, 5, 304, 4225, 3660, 17, 4429, 3, 5534, 4355, 5572, 4353, 5, 3686, 16, 3707, 18, 4430, 4, 5451, 4352, 5493, 4354, 4, 3432, 160, 4431, 5, 5452, 4353, 5494, 4355, 7, 2387, 8215, 2805, 129, 3687, 18, 3706, 16, 4432, 6, 5453, 4354, 5491, 4352, 6, 2386, 8214, 2637, 146, 2804, 128, 4433, 7, 5454, 4355, 5492, 4353, 8, 237, 12304, 768, 4226, 915, 8257, 3756, 16, 3862, 18, 4434, 8, 5691, 4352, 5733, 4354, 6, 238, 12305, 769, 4227, 3863, 19, 4435, 9, 5692, 4353, 5734, 4355, 9, 163, 4240, 239, 12306, 766, 4224, 917, 8259, 3757, 18, 3861, 16, 4436, 10, 5693, 4354, 5731, 4352, 6, 767, 4225, 916, 8258, 3447, 160, 4437, 11, 5694, 4355, 5732, 4353, 7, 772, 4230, 919, 8261, 3758, 20, 3866, 22, 4438, 12, 5611, 4352, 5653, 4354, 5, 918, 8260, 2641, 152, 4439, 13, 5612, 4353, 5654, 4355, 7, 770, 4228, 3710, 24, 3759, 22, 3864, 20, 4440, 14, 5613, 4354, 5651, 4352, 6, 771, 4229, 920, 8262, 3865, 21, 4441, 15, 5614, 4355, 5652, 4353, 5, 3542, 97, 3663, 34, 3714, 38, 3877, 42, 4473, 48, 6, 3541, 96, 3585, 64, 3597, 32, 3617, 352, 3878, 43, 4474, 49, 6, 3544, 99, 3662, 32, 3713, 36, 3765, 42, 3876, 40, 4475, 50, 3, 3543, 98, 3766, 43, 4476, 51, 5, 3545, 101, 3665, 38, 3712, 34, 3767, 44, 4477, 52, 2, 3431, 144, 4478, 53, 5, 3546, 103, 3664, 36, 3711, 32, 3879, 44, 4479, 54, 2, 3880, 45, 4480, 55, 5, 2050, 12288, 3547, 105, 3760, 32, 3871, 34, 4481, 56, 3, 3761, 33, 3872, 35, 4482, 57, 7, 1999, 4224, 2051, 12290, 3666, 40, 3717, 44, 3762, 34, 3869, 32, 4483, 58, 6, 2052, 12291, 3446, 144, 3548, 106, 3667, 41, 3870, 33, 4484, 59, 6, 2053, 12292, 3716, 42, 3763, 36, 3874, 38, 4398, 32, 4485, 60, 4, 2514, 41508, 3764, 37, 3875, 39, 4486, 61, 4, 2054, 12294, 3715, 40, 4399, 34, 4487, 62, 2, 3873, 37, 4488, 63, 6, 417, 12324, 1708, 4240, 3064, 131, 3669, 50, 3720, 54, 4458, 32, 8, 3063, 130, 3274, 128, 3562, 96, 3586, 80, 3608, 32, 3618, 368, 3721, 55, 4459, 33, 6, 418, 12326, 1709, 4242, 3062, 129, 3668, 48, 3773, 58, 4460, 34, 4, 1710, 4243, 3061, 128, 3774, 59, 4461, 35, 4, 415, 12320, 1711, 4244, 3067, 135, 4462, 36, 5, 1712, 4245, 3066, 134, 3430, 128, 3719, 51, 4463, 37, 5, 416, 12322, 1713, 4246, 3670, 52, 3718, 48, 4464, 38, 3, 1714, 4247, 3065, 132, 4465, 39, 3, 2055, 12304, 3768, 48, 4466, 40, 1, 4467, 41, 3, 2000, 4240, 3769, 50, 4468, 42, 2, 3770, 51, 4469, 43, 2, 419, 12328, 4470, 44, 1, 4471, 45, 3, 3722, 56, 3771, 54, 4472, 46, 2, 3723, 57, 3772, 55, 6, 23, 4417, 107, 268, 445, 16404, 1888, 288, 2422, 16448, 4644, 4177, 6, 108, 269, 446, 16405, 2375, 4356, 2423, 16449, 4683, 64, 4691, 4097, 4, 109, 270, 447, 16406, 1889, 290, 4646, 4179, 7, 24, 4418, 110, 271, 448, 16407, 807, 4446, 4645, 4178, 4709, 64, 4717, 4097, 9, 21, 258, 103, 264, 441, 16400, 1243, 37713, 1890, 292, 2372, 4353, 2665, 326, 3516, 1280, 4648, 4181, 6, 104, 265, 442, 16401, 2666, 327, 4647, 4180, 4735, 64, 4743, 4097, 7, 20, 256, 105, 266, 176, 4427, 443, 16402, 1245, 37715, 1891, 294, 2374, 4355, 10, 106, 267, 175, 4426, 444, 16403, 806, 4442, 1244, 37714, 2373, 4354, 2664, 325, 4649, 4182, 4761, 64, 4769, 4097, 7, 99, 260, 174, 4421, 240, 16384, 453, 16412, 804, 4437, 1957, 292, 4651, 4185, 8, 100, 261, 454, 16413, 803, 4436, 941, 20560, 1958, 293, 4650, 4184, 4787, 64, 4795, 4097, 1, 101, 262, 4, 102, 263, 805, 4438, 4813, 64, 4821, 4097, 4, 95, 256, 449, 16408, 800, 4433, 1953, 288, 7, 96, 257, 173, 4416, 450, 16409, 799, 4432, 1954, 289, 4839, 64, 4847, 4097, 4, 97, 258, 451, 16410, 802, 4435, 1955, 290, 7, 98, 259, 452, 16411, 801, 4434, 1956, 291, 3623, 153, 4865, 64, 4873, 4097, 8, 332, 16384, 373, 256, 434, 16388, 1241, 37701, 2424, 16464, 2832, 4353, 4561, 16, 4636, 4161, 7, 374, 257, 1240, 37700, 2425, 16465, 2831, 4352, 4591, 1, 4891, 64, 4899, 4097, 6, 375, 258, 435, 16390, 2426, 16466, 2834, 4355, 4592, 2, 4638, 4163, 6, 376, 259, 1242, 37702, 2833, 4354, 4637, 4162, 4917, 64, 4925, 4097, 8, 117, 280, 377, 260, 798, 4425, 1237, 37697, 2836, 4357, 3517, 1296, 4593, 4, 4640, 4165, 8, 118, 281, 273, 257, 378, 261, 1236, 37696, 2835, 4356, 4639, 4164, 4943, 64, 4951, 4097, 7, 274, 258, 314, 8576, 379, 262, 433, 16386, 1239, 37699, 3634, 160, 4642, 4167, 6, 180, 4442, 380, 263, 1238, 37698, 4641, 4166, 4969, 64, 4977, 4097, 6, 113, 276, 178, 4437, 381, 264, 438, 16396, 795, 4421, 927, 16384, 7, 114, 277, 794, 4420, 940, 20544, 4067, 468, 4643, 4168, 4995, 64, 5003, 4097, 3, 115, 278, 439, 16398, 797, 4423, 7, 116, 279, 179, 4438, 440, 16399, 796, 4422, 4068, 470, 5021, 64, 5029, 4097, 3, 111, 272, 436, 16392, 791, 4417, 5, 177, 4432, 790, 4416, 4065, 464, 5047, 64, 5055, 4097, 3, 112, 274, 437, 16394, 793, 4419, 4, 792, 4418, 4066, 466, 5073, 64, 5081, 4097, 5, 464, 16436, 1267, 37749, 1562, 16384, 1873, 256, 4664, 4209, 4, 465, 16437, 1266, 37748, 1534, 261, 4663, 4208, 4, 466, 16438, 1269, 37751, 1874, 258, 4666, 4211, 3, 1268, 37750, 1875, 259, 4665, 4210, 7, 460, 16432, 1263, 37745, 1533, 256, 1876, 260, 1949, 264, 3518, 1312, 4667, 4213, 4, 461, 16433, 1262, 37744, 1877, 261, 1950, 265, 5, 316, 8624, 462, 16434, 1265, 37747, 1878, 262, 4669, 4215, 5, 463, 16435, 1264, 37746, 1732, 4416, 1879, 263, 4668, 4214, 7, 123, 292, 469, 16444, 1275, 37757, 1880, 264, 1945, 260, 2057, 16384, 4671, 4217, 4, 185, 4452, 1274, 37756, 1946, 261, 4670, 4216, 4, 186, 4455, 1277, 37759, 1947, 262, 4673, 4219, 3, 1276, 37758, 1948, 263, 4672, 4218, 6, 119, 288, 182, 4449, 467, 16440, 1271, 37753, 1941, 256, 4675, 4221, 6, 120, 289, 181, 4448, 813, 4464, 1270, 37752, 1942, 257, 4674, 4220, 5, 121, 290, 184, 4451, 468, 16442, 1273, 37755, 1943, 258, 5, 122, 291, 183, 4450, 1272, 37754, 1944, 259, 4676, 4222, 5, 457, 16420, 1251, 37733, 1881, 272, 2427, 16496, 4653, 4193, 4, 1250, 37732, 2428, 16497, 3142, 4356, 4652, 4192, 6, 458, 16422, 1253, 37735, 1735, 4437, 1882, 274, 2177, 16384, 2429, 16498, 4, 1252, 37734, 1883, 275, 2430, 16499, 4654, 4194, 7, 455, 16416, 1247, 37729, 1535, 272, 1734, 4435, 1884, 276, 2431, 16500, 3139, 4353, 3, 1246, 37728, 1885, 277, 4655, 4196, 6, 315, 8608, 456, 16418, 1249, 37731, 3141, 4355, 3633, 128, 4656, 4199, 4, 1248, 37730, 1733, 4432, 1886, 279, 3140, 4354, 4, 1259, 37741, 1887, 280, 2219, 16384, 4658, 4201, 3, 811, 4452, 1258, 37740, 4657, 4200, 1, 1261, 37743, 2, 812, 4454, 1260, 37742, 6, 459, 16424, 809, 4449, 1255, 37737, 1951, 272, 2212, 256, 4660, 4205, 5, 808, 4448, 1254, 37736, 1952, 273, 2213, 257, 4659, 4204, 4, 1257, 37739, 1736, 4441, 2214, 258, 4662, 4207, 3, 810, 4450, 1256, 37738, 4661, 4206, 6, 1213, 37652, 2390, 16385, 2598, 257, 4602, 4112, 4887, 16, 5143, 12288, 7, 474, 16468, 1214, 37653, 1721, 4391, 2597, 256, 2644, 258, 4603, 4113, 4730, 5, 9, 476, 16471, 1215, 37654, 2392, 16387, 2600, 259, 2643, 257, 2949, 289, 4604, 4114, 4913, 16, 5183, 12288, 8, 475, 16470, 1216, 37655, 1720, 4389, 2391, 16386, 2599, 258, 2642, 256, 4605, 4115, 4756, 5, 8, 472, 16465, 1209, 37648, 1719, 4386, 2394, 16389, 2602, 261, 4606, 4116, 4939, 16, 5223, 12288, 9, 471, 16464, 1210, 37649, 2282, 256, 2393, 16388, 2601, 260, 2646, 262, 2714, 264, 4607, 4117, 4678, 5, 7, 1211, 37650, 2396, 16391, 2604, 263, 2951, 293, 4608, 4118, 4965, 16, 5263, 12288, 10, 318, 8656, 473, 16466, 1212, 37651, 1718, 4385, 2395, 16390, 2603, 262, 2645, 260, 2950, 292, 4609, 4119, 4704, 5, 9, 779, 4372, 929, 20496, 2398, 16393, 2606, 265, 2711, 261, 4045, 388, 4610, 4120, 4991, 16, 5303, 12288, 6, 480, 16476, 2397, 16392, 2605, 264, 4563, 64, 4611, 4121, 4834, 5, 8, 930, 20498, 1725, 4396, 2535, 41861, 2713, 263, 2952, 297, 4612, 4122, 5017, 16, 5343, 12288, 5, 2607, 266, 2712, 262, 4564, 66, 4613, 4123, 4860, 5, 9, 164, 4352, 478, 16473, 777, 4368, 1217, 37656, 1723, 4394, 4042, 384, 4614, 4124, 5043, 16, 5383, 12288, 7, 477, 16472, 778, 4369, 1218, 37657, 1724, 4395, 2709, 256, 4615, 4125, 4782, 5, 6, 1722, 4392, 2433, 33539, 4043, 386, 4616, 4126, 5069, 16, 5423, 12288, 7, 479, 16474, 2432, 33538, 2534, 41856, 2710, 258, 4044, 387, 4617, 4127, 4808, 5, 9, 517, 20484, 1203, 37636, 2400, 16401, 2650, 275, 2808, 257, 2955, 307, 3339, 289, 4679, 16, 5463, 12288, 8, 1204, 37637, 2399, 16400, 2649, 274, 2807, 256, 2954, 306, 3338, 288, 4594, 4097, 4938, 5, 5, 1205, 37638, 1730, 4404, 2648, 273, 4705, 16, 5503, 12288, 5, 1206, 37639, 1731, 4405, 2647, 272, 2953, 304, 4964, 5, 9, 306, 4352, 1728, 4402, 2401, 16405, 2654, 279, 3520, 1361, 4050, 408, 4595, 4100, 4731, 16, 5543, 12288, 8, 470, 16448, 1200, 37633, 1729, 4403, 2653, 278, 3519, 1360, 4051, 409, 4596, 4101, 4886, 5, 8, 516, 20482, 1201, 37634, 1726, 4400, 2652, 277, 4052, 410, 4597, 4102, 4757, 16, 5583, 12288, 9, 317, 8640, 1202, 37635, 1727, 4401, 2402, 16406, 2651, 276, 2956, 308, 3521, 1362, 4598, 4103, 4912, 5, 6, 928, 20480, 2404, 16409, 4048, 404, 4599, 4104, 4783, 16, 5623, 12288, 5, 167, 4373, 2403, 16408, 4565, 80, 4600, 4105, 5042, 5, 4, 4049, 406, 4601, 4106, 4809, 16, 5663, 12288, 2, 2655, 280, 5068, 5, 7, 165, 4368, 776, 4352, 1207, 37640, 2716, 273, 4046, 400, 4835, 16, 5703, 12288, 4, 166, 4369, 1208, 37641, 2715, 272, 4990, 5, 4, 2718, 275, 4047, 402, 4861, 16, 5743, 12288, 3, 2536, 41872, 2717, 274, 5016, 5, 10, 1232, 37684, 1563, 20480, 1614, 37644, 2406, 16417, 2658, 291, 2943, 259, 3526, 1381, 4680, 32, 4707, 34, 4890, 48, 8, 486, 16500, 1233, 37685, 1615, 37645, 2405, 16416, 2657, 290, 2942, 258, 3525, 1380, 4629, 4145, 8, 1564, 20482, 1616, 37646, 2408, 16419, 2656, 289, 2941, 257, 4681, 34, 4706, 32, 4916, 48, 5, 487, 16502, 1234, 37687, 1617, 37647, 2407, 16418, 4630, 4147, 11, 788, 4408, 1229, 37680, 1610, 37640, 2409, 16421, 2947, 263, 3522, 1377, 4057, 424, 4631, 4148, 4732, 32, 4759, 34, 4942, 48, 4, 484, 16496, 1611, 37641, 1717, 4355, 2946, 262, 11, 789, 4410, 1230, 37682, 1612, 37642, 1715, 4352, 2411, 16423, 2660, 293, 2945, 261, 3524, 1379, 4733, 34, 4758, 32, 4968, 48, 10, 319, 8688, 485, 16498, 1231, 37683, 1613, 37643, 1716, 4353, 2410, 16422, 2659, 292, 2944, 260, 3523, 1378, 4632, 4151, 10, 784, 4404, 939, 20528, 2005, 4356, 2058, 20480, 2413, 16425, 4055, 420, 4633, 4152, 4784, 32, 4811, 34, 4994, 48, 5, 169, 4389, 490, 16508, 785, 4405, 2412, 16424, 4634, 4153, 6, 786, 4406, 4056, 422, 4635, 4154, 4785, 34, 4810, 32, 5020, 48, 4, 491, 16510, 787, 4407, 1609, 37639, 2948, 264, 8, 168, 4384, 782, 4400, 1235, 37688, 2001, 4352, 4053, 416, 4836, 32, 4863, 34, 5046, 48, 5, 488, 16504, 783, 4401, 1607, 37633, 2002, 4353, 2719, 288, 6, 1608, 37634, 2003, 4354, 4054, 418, 4837, 34, 4862, 32, 5072, 48, 2, 489, 16506, 2004, 4355, 9, 22, 4400, 937, 20520, 1223, 37668, 2415, 16433, 4064, 444, 4618, 4128, 4682, 48, 4888, 32, 4915, 34, 6, 483, 16484, 938, 20521, 1224, 37669, 2414, 16432, 3278, 262, 4619, 4129, 5, 1225, 37670, 2417, 16435, 4708, 48, 4889, 34, 4914, 32, 4, 1226, 37671, 2416, 16434, 3277, 260, 4620, 4131, 9, 1219, 37664, 2419, 16437, 2662, 311, 3069, 257, 4062, 440, 4621, 4132, 4734, 48, 4940, 32, 4967, 34, 6, 481, 16480, 1220, 37665, 2418, 16436, 3068, 256, 3276, 258, 4622, 4133, 10, 172, 4410, 1221, 37666, 2421, 16439, 2661, 309, 3071, 259, 4063, 442, 4623, 4134, 4760, 48, 4941, 34, 4966, 32, 7, 482, 16482, 1222, 37667, 2420, 16438, 3070, 258, 3275, 256, 3635, 192, 4624, 4135, 7, 171, 4404, 931, 20512, 4060, 436, 4625, 4136, 4786, 48, 4992, 32, 5019, 34, 3, 932, 20513, 3282, 270, 4626, 4137, 7, 933, 20514, 2663, 313, 4061, 438, 4627, 4138, 4812, 48, 4993, 34, 5018, 32, 2, 3281, 268, 4628, 4139, 9, 170, 4400, 780, 4384, 934, 20516, 1227, 37672, 1618, 37648, 4058, 432, 4838, 48, 5044, 32, 5071, 34, 5, 781, 4385, 1228, 37673, 1619, 37649, 2006, 4369, 3280, 266, 7, 935, 20518, 1620, 37650, 2007, 4370, 4059, 434, 4864, 48, 5045, 34, 5070, 32, 4, 936, 20519, 1621, 37651, 2008, 4371, 3279, 264, 4, 952, 24600, 4703, 12288, 5425, 16, 5467, 18, 4, 1032, 28760, 4035, 334, 5426, 17, 5508, 21, 4, 953, 24602, 4729, 12288, 5427, 18, 5465, 16, 3, 4034, 332, 5466, 17, 5548, 21, 9, 308, 8464, 507, 16530, 954, 24604, 3569, 272, 3620, 16, 3629, 48, 4755, 12288, 5505, 16, 5547, 18, 3, 4033, 330, 5428, 21, 5506, 17, 4, 955, 24606, 4781, 12288, 5507, 18, 5545, 16, 4, 506, 16529, 4032, 328, 5468, 21, 5546, 17, 4, 2060, 24608, 4807, 12288, 5585, 16, 5627, 18, 6, 512, 16543, 948, 24593, 1028, 28752, 4031, 326, 5586, 17, 5668, 21, 6, 510, 16540, 949, 24594, 2061, 24610, 4833, 12288, 5587, 18, 5625, 16, 6, 511, 16541, 1029, 28754, 2062, 24611, 4030, 324, 5626, 17, 5708, 21, 6, 508, 16538, 950, 24596, 2525, 41792, 4859, 12288, 5665, 16, 5707, 18, 6, 509, 16539, 1030, 28756, 3830, 320, 4029, 322, 5588, 21, 5666, 17, 4, 951, 24598, 4885, 12288, 5667, 18, 5705, 16, 5, 1031, 28758, 3831, 322, 4028, 320, 5628, 21, 5706, 17, 4, 498, 16518, 4911, 12288, 5105, 16, 5147, 18, 4, 499, 16519, 1026, 28744, 5106, 17, 5188, 21, 4, 496, 16516, 4937, 12288, 5107, 18, 5145, 16, 3, 497, 16517, 5146, 17, 5228, 21, 8, 494, 16514, 2529, 41816, 3568, 256, 3591, 304, 3610, 16, 4963, 12288, 5185, 16, 5227, 18, 4, 495, 16515, 1027, 28748, 5108, 21, 5186, 17, 4, 492, 16512, 4989, 12288, 5187, 18, 5225, 16, 3, 493, 16513, 5148, 21, 5226, 17, 8, 505, 16526, 947, 24576, 1022, 28737, 2063, 24624, 2528, 41812, 5015, 12288, 5265, 16, 5307, 18, 3, 1021, 28736, 5266, 17, 5348, 21, 5, 503, 16524, 4041, 341, 5041, 12288, 5267, 18, 5305, 16, 5, 504, 16525, 1023, 28738, 4040, 340, 5306, 17, 5388, 21, 5, 196, 8464, 4039, 339, 5067, 12288, 5345, 16, 5387, 18, 7, 197, 8465, 502, 16523, 1024, 28740, 3832, 336, 4038, 338, 5268, 21, 5346, 17, 7, 198, 8466, 500, 16520, 2526, 41810, 4037, 337, 5093, 12288, 5347, 18, 5385, 16, 7, 501, 16521, 1025, 28742, 2527, 41811, 3833, 338, 4036, 336, 5308, 21, 5386, 17, 2, 969, 24632, 5149, 34, 2, 970, 24633, 3628, 21, 2, 971, 24634, 5109, 34, 1, 972, 24635, 7, 203, 8488, 973, 24636, 3571, 304, 3611, 32, 3622, 48, 3627, 16, 5229, 34, 3, 204, 8489, 974, 24637, 3838, 360, 3, 205, 8490, 975, 24638, 5189, 34, 1, 976, 24639, 4, 201, 8484, 964, 24624, 3027, 28673, 5309, 34, 2, 965, 24625, 3836, 356, 3, 966, 24626, 3029, 28675, 5269, 34, 3, 202, 8487, 3028, 28674, 3837, 358, 4, 199, 8480, 967, 24628, 2530, 41824, 5389, 34, 1, 3834, 352, 3, 200, 8482, 968, 24630, 5349, 34, 1, 3835, 354, 2, 960, 24616, 5469, 34, 2, 961, 24618, 5429, 34, 8, 515, 16546, 962, 24620, 3570, 288, 3589, 272, 3612, 48, 3621, 32, 3624, 16, 5549, 34, 1, 3590, 273, 3, 513, 16544, 963, 24622, 5509, 34, 1, 514, 16545, 5, 209, 8500, 956, 24608, 2049, 8468, 2059, 24592, 5629, 34, 3, 210, 8501, 1033, 28768, 2533, 41845, 2, 957, 24610, 5589, 34, 1, 1034, 28770, 7, 206, 8496, 958, 24612, 1036, 28773, 2047, 8464, 2531, 41840, 3839, 369, 5709, 34, 1, 1035, 28772, 7, 207, 8498, 959, 24614, 2048, 8466, 2532, 41842, 3490, 304, 3841, 371, 5669, 34, 2, 208, 8499, 3840, 370, 13, 312, 8533, 2113, 28712, 3999, 270, 4692, 8192, 4719, 8194, 4746, 8196, 4773, 8198, 4800, 8200, 4827, 8202, 4854, 8204, 4881, 8206, 5191, 69, 5433, 81, 8, 311, 8532, 991, 24664, 2114, 28713, 3575, 340, 5110, 64, 5130, 4097, 5432, 80, 5474, 82, 13, 1008, 28698, 2115, 28714, 3998, 268, 4693, 8194, 4718, 8192, 4747, 8198, 4772, 8196, 4801, 8202, 4826, 8200, 4855, 8206, 4880, 8204, 5231, 69, 5473, 81, 6, 992, 24666, 2116, 28715, 5150, 64, 5170, 4097, 5434, 82, 5472, 80, 12, 2117, 28716, 3997, 266, 4694, 8196, 4721, 8198, 4744, 8192, 4771, 8194, 4802, 8204, 4829, 8206, 4852, 8200, 4879, 8202, 5111, 69, 5513, 81, 9, 309, 8528, 2118, 28717, 3573, 336, 3605, 256, 3613, 64, 5190, 64, 5210, 4097, 5512, 80, 5554, 82, 12, 2119, 28718, 3995, 264, 4695, 8198, 4720, 8196, 4745, 8194, 4770, 8192, 4803, 8206, 4828, 8204, 4853, 8202, 4878, 8200, 5151, 69, 5553, 81, 8, 310, 8530, 2522, 41738, 3574, 338, 3996, 265, 5230, 64, 5250, 4097, 5514, 82, 5552, 80, 14, 1003, 28688, 2105, 28704, 3993, 262, 4417, 256, 4696, 8200, 4723, 8202, 4750, 8204, 4777, 8206, 4796, 8192, 4823, 8194, 4850, 8196, 4877, 8198, 5351, 69, 5593, 81, 10, 213, 8516, 987, 24656, 1004, 28689, 2106, 28705, 3818, 261, 3994, 263, 5270, 64, 5290, 4097, 5592, 80, 5634, 82, 15, 1005, 28690, 2107, 28706, 2521, 41735, 3992, 260, 4418, 258, 4697, 8202, 4722, 8200, 4751, 8206, 4776, 8204, 4797, 8194, 4822, 8192, 4851, 8198, 4876, 8196, 5391, 69, 5633, 81, 7, 988, 24658, 2108, 28707, 3576, 350, 5310, 64, 5330, 4097, 5594, 82, 5632, 80, 16, 1006, 28692, 2109, 28708, 2520, 41729, 3817, 256, 3991, 258, 4419, 260, 4698, 8204, 4725, 8206, 4748, 8200, 4775, 8202, 4798, 8196, 4825, 8198, 4848, 8192, 4875, 8194, 5271, 69, 5673, 81, 7, 989, 24660, 2110, 28709, 2519, 41728, 5350, 64, 5370, 4097, 5672, 80, 5714, 82, 15, 212, 8515, 819, 4496, 1007, 28694, 2111, 28710, 3990, 256, 4699, 8206, 4724, 8204, 4749, 8202, 4774, 8200, 4799, 8198, 4824, 8196, 4849, 8194, 4874, 8192, 5311, 69, 5713, 81, 9, 211, 8514, 820, 4497, 990, 24662, 2112, 28711, 3491, 320, 5390, 64, 5410, 4097, 5674, 82, 5712, 80, 12, 999, 28680, 4009, 286, 4900, 8192, 4927, 8194, 4954, 8196, 4981, 8198, 5008, 8200, 5035, 8202, 5062, 8204, 5089, 8206, 5113, 81, 5511, 69, 6, 983, 24648, 4010, 287, 5112, 80, 5154, 82, 5430, 64, 5450, 4097, 13, 1000, 28682, 1282, 37764, 4008, 284, 4901, 8194, 4926, 8192, 4955, 8198, 4980, 8196, 5009, 8202, 5034, 8200, 5063, 8206, 5088, 8204, 5153, 81, 5551, 69, 5, 984, 24650, 5114, 82, 5152, 80, 5470, 64, 5490, 4097, 14, 193, 4506, 1001, 28684, 1280, 37762, 4007, 282, 4902, 8196, 4929, 8198, 4952, 8192, 4979, 8194, 5010, 8204, 5037, 8206, 5060, 8200, 5087, 8202, 5193, 81, 5431, 69, 10, 985, 24652, 1281, 37763, 3572, 320, 3614, 80, 3626, 112, 3632, 96, 5192, 80, 5234, 82, 5510, 64, 5530, 4097, 14, 191, 4504, 1002, 28686, 1278, 37760, 4006, 280, 4903, 8198, 4928, 8196, 4953, 8194, 4978, 8192, 5011, 8206, 5036, 8204, 5061, 8202, 5086, 8200, 5233, 81, 5471, 69, 7, 192, 4505, 986, 24654, 1279, 37761, 5194, 82, 5232, 80, 5550, 64, 5570, 4097, 15, 189, 4502, 925, 12548, 978, 24641, 994, 28672, 4005, 278, 4904, 8200, 4931, 8202, 4958, 8204, 4985, 8206, 5004, 8192, 5031, 8194, 5058, 8196, 5085, 8198, 5273, 81, 5671, 69, 9, 190, 4503, 926, 12549, 977, 24640, 995, 28673, 4420, 273, 5272, 80, 5314, 82, 5590, 64, 5610, 4097, 15, 818, 4484, 980, 24643, 3820, 278, 4003, 276, 4421, 274, 4905, 8202, 4930, 8200, 4959, 8206, 4984, 8204, 5005, 8194, 5030, 8192, 5059, 8198, 5084, 8196, 5313, 81, 5711, 69, 8, 188, 4501, 979, 24642, 4004, 277, 4422, 275, 5274, 82, 5312, 80, 5630, 64, 5650, 4097, 15, 816, 4482, 921, 12544, 996, 28676, 3819, 272, 4002, 274, 4906, 8204, 4933, 8206, 4956, 8200, 4983, 8202, 5006, 8196, 5033, 8198, 5056, 8192, 5083, 8194, 5353, 81, 5591, 69, 8, 817, 4483, 922, 12545, 981, 24644, 997, 28677, 5352, 80, 5394, 82, 5670, 64, 5690, 4097, 16, 187, 4496, 814, 4480, 923, 12546, 998, 28678, 2523, 41747, 4000, 272, 4907, 8206, 4932, 8204, 4957, 8202, 4982, 8200, 5007, 8198, 5032, 8196, 5057, 8194, 5082, 8192, 5393, 81, 5631, 69, 8, 815, 4481, 924, 12547, 982, 24646, 4001, 273, 5354, 82, 5392, 80, 5710, 64, 5730, 4097, 6, 1020, 28728, 2081, 28680, 4022, 302, 5116, 97, 5158, 99, 5281, 105, 5, 2082, 28681, 5115, 96, 5157, 98, 5239, 102, 5280, 104, 5, 2083, 28682, 4021, 300, 5118, 99, 5156, 97, 5321, 105, 5, 2084, 28683, 5117, 98, 5155, 96, 5199, 102, 5320, 104, 6, 1555, 12544, 2085, 28684, 4020, 298, 5196, 97, 5238, 99, 5361, 105, 7, 2086, 28685, 3592, 320, 3631, 80, 5159, 102, 5195, 96, 5237, 98, 5360, 104, 5, 2087, 28686, 4018, 296, 5198, 99, 5236, 97, 5401, 105, 6, 2088, 28687, 4019, 297, 5119, 102, 5197, 98, 5235, 96, 5400, 104, 6, 1016, 28720, 2073, 28672, 4017, 294, 5121, 105, 5276, 97, 5318, 99, 6, 2064, 24640, 2074, 28673, 5120, 104, 5275, 96, 5317, 98, 5399, 102, 6, 1017, 28722, 2075, 28674, 4015, 292, 5161, 105, 5278, 99, 5316, 97, 6, 2076, 28675, 4016, 293, 5160, 104, 5277, 98, 5315, 96, 5359, 102, 7, 1018, 28724, 2077, 28676, 3821, 288, 4013, 290, 5201, 105, 5356, 97, 5398, 99, 6, 2078, 28677, 4014, 291, 5200, 104, 5319, 102, 5355, 96, 5397, 98, 7, 1019, 28726, 2079, 28678, 3822, 290, 4011, 288, 5241, 105, 5358, 99, 5396, 97, 6, 2080, 28679, 4012, 289, 5240, 104, 5279, 102, 5357, 98, 5395, 96, 6, 1013, 28712, 2097, 28696, 3829, 316, 5436, 97, 5478, 99, 5601, 105, 5, 2098, 28697, 5435, 96, 5477, 98, 5559, 102, 5600, 104, 5, 1014, 28714, 2099, 28698, 5438, 99, 5476, 97, 5641, 105, 6, 1015, 28715, 2100, 28699, 5437, 98, 5475, 96, 5519, 102, 5640, 104, 6, 2101, 28700, 3827, 312, 4566, 255, 5516, 97, 5558, 99, 5681, 105, 10, 313, 8544, 2102, 28701, 3577, 352, 3615, 112, 3625, 80, 3630, 64, 5479, 102, 5515, 96, 5557, 98, 5680, 104, 5, 2103, 28702, 3828, 314, 5518, 99, 5556, 97, 5721, 105, 7, 2009, 4505, 2104, 28703, 2524, 41786, 5439, 102, 5517, 98, 5555, 96, 5720, 104, 6, 1009, 28704, 2089, 28688, 3825, 308, 5441, 105, 5596, 97, 5638, 99, 6, 993, 24672, 2090, 28689, 5440, 104, 5595, 96, 5637, 98, 5719, 102, 8, 824, 4516, 1010, 28706, 2091, 28690, 3826, 310, 4027, 308, 5481, 105, 5598, 99, 5636, 97, 6, 825, 4517, 2092, 28691, 5480, 104, 5597, 98, 5635, 96, 5679, 102, 9, 822, 4514, 1011, 28708, 2056, 12560, 2093, 28692, 3823, 304, 4025, 306, 5521, 105, 5676, 97, 5718, 99, 7, 823, 4515, 2094, 28693, 4026, 307, 5520, 104, 5639, 102, 5675, 96, 5717, 98, 8, 821, 4512, 1012, 28710, 2095, 28694, 3824, 306, 4023, 304, 5561, 105, 5678, 99, 5716, 97, 6, 2096, 28695, 4024, 305, 5560, 104, 5599, 102, 5677, 98, 5715, 96, 4, 283, 536, 835, 4689, 1084, 36953, 3106, 632, 5, 124, 513, 284, 537, 834, 4688, 1083, 36952, 3107, 633, 2, 330, 8856, 2245, 560, 2, 331, 8857, 2246, 561, 1, 4589, 768, 1, 3391, 4664, 2, 2691, 584, 2996, 25568, 1, 2692, 585, 3, 324, 8850, 1079, 36945, 3527, 1536, 7, 325, 8851, 1078, 36944, 1747, 4706, 2284, 577, 2690, 583, 3389, 4660, 4133, 712, 4, 277, 530, 1081, 36947, 2285, 578, 2689, 580, 6, 278, 531, 1080, 36946, 1746, 4704, 2286, 579, 3104, 627, 3390, 4662, 5, 279, 532, 328, 8854, 2287, 580, 2688, 578, 3105, 628, 6, 280, 533, 329, 8855, 1082, 36948, 2288, 581, 2841, 4624, 3388, 4656, 3, 281, 534, 326, 8852, 1748, 4709, 2, 282, 535, 327, 8853, 3, 1077, 36937, 1567, 36977, 2243, 546, 5, 195, 4688, 830, 4672, 1076, 36936, 2244, 547, 4134, 720, 2, 832, 4675, 2241, 544, 4, 831, 4674, 1568, 36978, 2242, 545, 4135, 722, 2, 833, 4676, 4136, 724, 1, 2997, 25584, 1, 4137, 726, 4, 275, 512, 1069, 36929, 1749, 4723, 2289, 592, 4, 276, 513, 2290, 593, 3102, 609, 3387, 4644, 3, 1071, 36931, 2291, 594, 3103, 610, 2, 1070, 36930, 2292, 595, 4, 1073, 36933, 2293, 596, 2695, 594, 2838, 4609, 5, 1072, 36932, 2294, 597, 2696, 595, 2837, 4608, 3385, 4640, 3, 1075, 36935, 2693, 592, 2840, 4611, 4, 1074, 36934, 2694, 593, 2839, 4610, 3386, 4642, 7, 125, 544, 838, 4721, 1101, 36985, 1959, 512, 2235, 530, 3101, 600, 4139, 737, 4, 126, 545, 1100, 36984, 2236, 531, 4138, 736, 3, 127, 546, 2233, 528, 4141, 739, 3, 839, 4722, 2234, 529, 4140, 738, 1, 4143, 741, 1, 4142, 740, 3, 2237, 532, 2994, 25536, 4145, 743, 2, 2238, 533, 4144, 742, 4, 1536, 512, 2240, 538, 2295, 608, 3093, 592, 4, 1094, 36976, 2296, 609, 3094, 593, 4146, 744, 4, 1095, 36979, 2239, 536, 3095, 594, 4148, 747, 3, 3096, 595, 3384, 4630, 4147, 746, 2, 1097, 36981, 3097, 596, 3, 1096, 36980, 3098, 597, 3382, 4624, 3, 1099, 36983, 1892, 514, 3099, 598, 3, 1098, 36982, 3100, 599, 3383, 4626, 5, 837, 4705, 1093, 36969, 2226, 514, 3091, 584, 3151, 4617, 5, 288, 553, 836, 4704, 2227, 515, 3092, 585, 3150, 4616, 2, 2225, 512, 3153, 4619, 1, 3152, 4618, 1, 3155, 4621, 1, 3154, 4620, 2, 1566, 36951, 2995, 25552, 2, 1565, 36950, 2228, 517, 4, 1086, 36961, 2231, 522, 2297, 624, 3143, 4609, 4, 285, 545, 1085, 36960, 3084, 577, 3381, 4612, 5, 286, 546, 1088, 36963, 2229, 520, 3085, 578, 3145, 4611, 6, 287, 547, 1087, 36962, 1743, 4688, 2230, 521, 3086, 579, 3144, 4610, 4, 1090, 36965, 1745, 4695, 3087, 580, 3147, 4613, 6, 1089, 36964, 2298, 629, 2842, 4640, 3088, 581, 3146, 4612, 3379, 4608, 5, 1092, 36967, 1744, 4693, 2232, 524, 3089, 582, 3149, 4615, 4, 1091, 36966, 3090, 583, 3148, 4614, 3380, 4610, 5, 194, 4608, 829, 4624, 1051, 36888, 2721, 513, 4109, 640, 4, 1052, 36889, 2019, 4641, 2477, 41090, 2720, 512, 2, 2020, 4642, 4110, 642, 4, 2021, 4643, 2476, 41088, 2722, 514, 2990, 25508, 2, 2022, 4644, 4111, 644, 3, 2479, 41093, 2723, 519, 4112, 646, 3, 2478, 41092, 2673, 520, 2989, 25504, 4, 1044, 36880, 2672, 519, 3080, 561, 4113, 648, 2, 1045, 36881, 3079, 560, 6, 1046, 36882, 1740, 4640, 2481, 41097, 2671, 517, 3082, 563, 4114, 650, 4, 2480, 41096, 2670, 516, 2992, 25516, 3081, 562, 5, 25, 4608, 1047, 36884, 2669, 515, 2812, 529, 4115, 652, 4, 1048, 36885, 2668, 514, 2811, 528, 3083, 564, 3, 26, 4610, 1049, 36886, 2667, 513, 4, 241, 36871, 1050, 36887, 1741, 4645, 2991, 25512, 5, 826, 4608, 1042, 36872, 2023, 4656, 3078, 553, 4116, 656, 5, 827, 4609, 1043, 36873, 2024, 4657, 3077, 552, 4117, 657, 3, 828, 4610, 2025, 4658, 4118, 658, 1, 2482, 41104, 1, 4119, 660, 1, 4120, 662, 2, 2679, 536, 2993, 25520, 1, 4121, 664, 2, 1742, 4656, 2678, 533, 1, 2724, 538, 3, 1039, 36868, 2677, 531, 4122, 668, 3, 1040, 36869, 2676, 530, 2809, 512, 6, 27, 4626, 1041, 36870, 2675, 529, 2726, 543, 3076, 551, 4123, 670, 4, 2674, 528, 2725, 542, 2810, 514, 3075, 550, 3, 1553, 4616, 2010, 4608, 4124, 672, 2, 1554, 4617, 2011, 4609, 2, 2012, 4610, 4125, 674, 2, 2013, 4611, 3293, 536, 2, 2014, 4612, 4126, 676, 1, 2987, 25472, 3, 1062, 36912, 1549, 4608, 2682, 551, 3, 2121, 36865, 2283, 544, 3290, 530, 3, 1063, 36914, 1550, 4610, 2122, 36866, 5, 1064, 36915, 1537, 578, 2123, 36867, 2681, 548, 3289, 528, 3, 28, 4640, 1065, 36916, 1551, 4612, 2, 1066, 36917, 3292, 534, 2, 1067, 36918, 1552, 4614, 3, 1068, 36919, 2680, 544, 3291, 532, 3, 1060, 36904, 3074, 521, 4127, 688, 4, 1061, 36905, 2015, 4625, 2249, 578, 3073, 520, 3, 2016, 4626, 2248, 577, 4128, 690, 5, 2017, 4627, 2247, 576, 2483, 41136, 3288, 520, 4129, 691, 3, 2018, 4628, 2253, 583, 4130, 692, 1, 2252, 582, 1, 2251, 581, 3, 2250, 580, 2687, 568, 2988, 25488, 5, 1053, 36896, 1739, 4626, 3285, 515, 3393, 4676, 4131, 696, 3, 1054, 36897, 2686, 566, 3284, 514, 4, 1055, 36898, 1737, 4624, 3394, 4678, 4132, 698, 4, 1738, 4625, 2254, 584, 2685, 564, 3283, 512, 1, 1056, 36900, 4, 1057, 36901, 2684, 562, 2813, 544, 3287, 518, 3, 1058, 36902, 3072, 519, 3392, 4674, 4, 1059, 36903, 2683, 560, 2814, 546, 3286, 516, 3, 214, 8704, 2459, 41024, 3643, 8, 3, 3644, 9, 3848, 576, 4095, 578, 2, 3492, 512, 3645, 10, 3, 2460, 41027, 3646, 11, 4094, 576, 3, 215, 8708, 2986, 25440, 3647, 12, 1, 3648, 13, 1, 3649, 14, 3, 2461, 41031, 3650, 15, 4096, 580, 2, 216, 8712, 323, 8720, 1, 3636, 1, 1, 3637, 2, 1, 3638, 3, 2, 405, 8720, 3639, 4, 1, 3640, 5, 1, 3641, 6, 1, 3642, 7, 3, 403, 8716, 2462, 41040, 3850, 593, 2, 2434, 37010, 3849, 592, 1, 404, 8718, 1, 4097, 592, 1, 401, 8712, 1, 2436, 37014, 1, 402, 8714, 2, 2435, 37012, 2463, 41047, 2, 217, 8728, 399, 8708, 2, 320, 8705, 1503, 40961, 3, 321, 8706, 400, 8710, 1504, 40962, 3, 322, 8707, 1505, 40963, 2437, 37016, 1, 398, 8706, 3, 218, 8736, 2464, 41056, 4100, 611, 3, 2555, 45088, 2982, 25413, 4099, 610, 1, 2983, 25414, 2, 2984, 25415, 4098, 608, 1, 2981, 25408, 1, 4102, 614, 1, 2465, 41062, 2, 2466, 41063, 4101, 612, 3, 219, 8744, 2467, 41064, 3651, 32, 2, 220, 8745, 4103, 618, 1, 4104, 620, 4, 221, 8752, 412, 8748, 2468, 41072, 4107, 627, 1, 4106, 626, 1, 4105, 625, 1, 2469, 41075, 3, 410, 8744, 2470, 41076, 2985, 25424, 1, 2471, 41077, 2, 411, 8746, 2472, 41078, 1, 4108, 628, 2, 408, 8740, 2473, 41080, 2, 409, 8742, 2474, 41082, 2, 406, 8736, 2475, 41084, 1, 407, 8738, 3, 3842, 512, 4070, 514, 5420, 4866, 3, 222, 8768, 5379, 4865, 5421, 4867, 4, 1117, 37016, 3843, 514, 4069, 512, 5380, 4866, 3, 223, 8770, 5381, 4867, 5419, 4865, 2, 4071, 518, 5340, 4866, 4, 224, 8772, 2979, 25376, 5299, 4865, 5341, 4867, 2, 2447, 40967, 5300, 4866, 3, 225, 8774, 5301, 4867, 5339, 4865, 2, 1112, 37010, 5260, 4866, 3, 1113, 37011, 5219, 4865, 5261, 4867, 3, 1110, 37008, 2300, 641, 5220, 4866, 4, 1111, 37009, 2299, 640, 5221, 4867, 5259, 4865, 2, 1116, 37014, 5180, 4866, 2, 5139, 4865, 5181, 4867, 2, 1114, 37012, 5140, 4866, 3, 1115, 37013, 5141, 4867, 5179, 4865, 3, 226, 8785, 4073, 530, 5740, 4866, 3, 2448, 40976, 5699, 4865, 5741, 4867, 3, 227, 8787, 4072, 528, 5700, 4866, 3, 1109, 37001, 5701, 4867, 5739, 4865, 3, 228, 8789, 4075, 534, 5660, 4866, 3, 2980, 25392, 5619, 4865, 5661, 4867, 3, 230, 8791, 4074, 532, 5620, 4866, 3, 229, 8790, 5621, 4867, 5659, 4865, 6, 232, 8793, 242, 37010, 1104, 36994, 2301, 659, 4077, 538, 5580, 4866, 5, 231, 8792, 1105, 36995, 4078, 539, 5539, 4865, 5581, 4867, 3, 1102, 36992, 4076, 536, 5540, 4866, 4, 233, 8794, 1103, 36993, 5541, 4867, 5579, 4865, 1, 5500, 4866, 5, 234, 8796, 1108, 36999, 2304, 662, 5459, 4865, 5501, 4867, 4, 1106, 36996, 2303, 661, 4079, 540, 5460, 4866, 4, 1107, 36997, 2302, 660, 5461, 4867, 5499, 4865, 3, 2450, 40993, 3844, 544, 4080, 546, 1, 2449, 40992, 1, 2452, 40995, 2, 2451, 40994, 3845, 547, 2, 3846, 548, 4082, 550, 2, 2453, 40996, 2977, 25344, 2, 2455, 40999, 4081, 548, 1, 2454, 40998, 1, 4085, 554, 2, 2456, 41000, 4086, 555, 1, 4083, 552, 1, 4084, 553, 1, 4088, 558, 2, 3115, 661, 4087, 556, 1, 3114, 660, 2, 3847, 560, 4090, 562, 1, 2457, 41008, 2, 3113, 649, 4089, 560, 3, 2124, 37017, 2458, 41010, 3112, 648, 1, 4092, 566, 1, 2978, 25360, 1, 4091, 564, 1, 3108, 642, 1, 4093, 568, 1, 3111, 647, 1, 3110, 645, 1, 3109, 644, 3, 132, 772, 1583, 37221, 4585, 512, 3, 133, 773, 1582, 37220, 3396, 4920, 4, 134, 774, 1584, 37223, 2974, 25312, 4586, 514, 2, 135, 775, 3397, 4922, 3, 128, 768, 1138, 37209, 1579, 37217, 1, 129, 769, 2, 130, 770, 1581, 37219, 2, 131, 771, 1580, 37218, 4, 140, 780, 1137, 37205, 1898, 800, 2845, 4881, 2, 141, 781, 2844, 4880, 1, 142, 782, 1, 143, 783, 3, 136, 776, 1135, 37201, 2321, 832, 2, 137, 777, 1899, 805, 1, 138, 778, 2, 139, 779, 1136, 37202, 3, 1900, 824, 2976, 25330, 4587, 528, 2, 2975, 25328, 4588, 530, 2, 144, 784, 1586, 37233, 1, 1585, 37232, 1, 1587, 37234, 2, 246, 37204, 2843, 4864, 1, 1134, 37191, 1, 3395, 4900, 2, 1895, 776, 1964, 772, 1, 1896, 777, 1, 2971, 25280, 2, 1151, 37241, 1960, 768, 2, 1150, 37240, 1961, 769, 1, 1962, 770, 1, 1963, 771, 2, 1147, 37237, 2128, 37189, 3, 1146, 37236, 2851, 4912, 5094, 37417, 1, 1149, 37239, 1, 1148, 37238, 1, 1143, 37233, 1, 1142, 37232, 2, 1145, 37235, 1893, 774, 2, 1144, 37234, 1894, 775, 2, 1575, 37205, 5095, 37424, 1, 1574, 37204, 2, 1577, 37207, 2972, 25296, 1, 1576, 37206, 5, 1141, 37225, 2028, 4945, 2215, 768, 2257, 770, 3162, 4873, 2, 1140, 37224, 2027, 4944, 2, 1573, 37203, 2255, 768, 3, 2029, 4946, 2256, 769, 2973, 25301, 2, 2847, 4897, 3160, 4869, 2, 2846, 4896, 3159, 4868, 1, 2849, 4899, 3, 1139, 37222, 2848, 4898, 3161, 4870, 1, 3156, 4865, 2, 1578, 37208, 2850, 4900, 1, 3158, 4867, 3, 1897, 791, 2030, 4954, 3157, 4866, 3, 845, 4884, 945, 21008, 4194, 900, 1, 846, 4885, 3, 847, 4886, 946, 21010, 4195, 902, 2, 2311, 782, 2969, 25248, 4, 843, 4880, 1129, 37144, 2727, 769, 4192, 896, 1, 1130, 37145, 4, 844, 4882, 2729, 771, 2970, 25253, 4193, 898, 2, 2509, 41344, 2728, 770, 1, 1126, 37140, 1, 1127, 37141, 1, 2310, 775, 3, 1128, 37143, 2309, 774, 4198, 911, 5, 848, 4888, 1038, 33105, 1572, 37160, 2306, 769, 4196, 904, 2, 1037, 33104, 2305, 768, 3, 1125, 37138, 2308, 771, 4197, 906, 2, 2307, 770, 3305, 816, 1, 4203, 916, 2, 2819, 776, 4204, 917, 2, 2513, 41365, 4205, 918, 1, 2512, 41364, 3, 840, 4864, 2511, 41363, 4199, 912, 4, 841, 4865, 2316, 792, 2510, 41362, 4200, 913, 2, 842, 4866, 4201, 914, 1, 4202, 915, 1, 1121, 37124, 3, 1122, 37125, 2314, 788, 2815, 768, 1, 1123, 37126, 3, 1124, 37127, 2315, 790, 2816, 770, 2, 1118, 37120, 4206, 920, 3, 1119, 37121, 2312, 784, 2817, 772, 3, 1752, 4912, 2127, 37170, 4207, 922, 4, 1120, 37123, 2313, 786, 2818, 774, 3304, 800, 1, 4210, 932, 1, 3131, 796, 2, 3133, 799, 4211, 934, 2, 2968, 25216, 3132, 798, 3, 2026, 4864, 2125, 37128, 4208, 928, 1, 3128, 792, 2, 3130, 795, 4209, 930, 2, 3129, 794, 3303, 792, 3, 245, 37156, 1901, 833, 4214, 940, 3, 2319, 804, 3127, 788, 3302, 790, 1, 3301, 788, 3, 2318, 801, 3125, 785, 4212, 936, 5, 243, 37153, 1902, 836, 2317, 800, 3124, 784, 3300, 786, 2, 1750, 4864, 4213, 938, 3, 244, 37155, 3126, 786, 3299, 784, 1, 3122, 781, 1, 3121, 780, 2, 1571, 37142, 3123, 783, 2, 849, 4896, 3118, 777, 2, 1569, 37137, 3117, 776, 1, 3120, 779, 3, 1570, 37139, 3119, 778, 3298, 776, 2, 1131, 37157, 3297, 774, 1, 1132, 37158, 3, 1133, 37159, 3116, 774, 3296, 772, 1, 2126, 37136, 2, 2320, 816, 3295, 770, 1, 1751, 4880, 1, 3294, 768, 2, 2965, 25184, 5285, 512, 1, 4174, 838, 1, 5325, 512, 1, 4173, 836, 1, 5365, 512, 2, 2966, 25189, 4172, 834, 1, 5405, 512, 1, 4171, 832, 1, 5125, 512, 1, 5165, 512, 1, 4177, 844, 1, 5205, 512, 1, 4176, 842, 1, 5245, 512, 1, 4175, 840, 2, 2967, 25200, 5605, 512, 1, 4182, 854, 2, 4181, 853, 5645, 512, 1, 4180, 852, 1, 5685, 512, 1, 4179, 850, 1, 5725, 512, 1, 4178, 848, 1, 5445, 512, 1, 5485, 512, 1, 5525, 512, 1, 4184, 858, 1, 5565, 512, 1, 4183, 856, 1, 4188, 870, 2, 2501, 41319, 4187, 868, 1, 2497, 41312, 2, 2498, 41313, 4186, 866, 1, 2499, 41314, 2, 2500, 41315, 4185, 864, 1, 2502, 41320, 1, 2503, 41322, 1, 2508, 41332, 1, 4191, 884, 1, 2504, 41328, 2, 2505, 41329, 4190, 882, 1, 2506, 41330, 2, 2507, 41331, 4189, 880, 5, 2563, 57345, 2958, 25121, 4151, 774, 5295, 4608, 5337, 4610, 2, 5296, 4609, 5338, 4611, 4, 2960, 25123, 4150, 772, 5297, 4610, 5335, 4608, 3, 2959, 25122, 5298, 4611, 5336, 4609, 4, 2962, 25125, 4149, 770, 5375, 4608, 5417, 4610, 4, 2564, 57348, 2961, 25124, 5376, 4609, 5418, 4611, 3, 1162, 37272, 5377, 4610, 5415, 4608, 5, 1163, 37273, 2565, 57350, 2963, 25126, 5378, 4611, 5416, 4609, 3, 1160, 37270, 5135, 4608, 5177, 4610, 5, 1161, 37271, 2566, 57352, 4157, 783, 5136, 4609, 5178, 4611, 3, 4155, 780, 5137, 4610, 5175, 4608, 4, 1159, 37269, 4156, 781, 5138, 4611, 5176, 4609, 3, 4154, 778, 5215, 4608, 5257, 4610, 2, 5216, 4609, 5258, 4611, 3, 4152, 776, 5217, 4610, 5255, 4608, 3, 4153, 777, 5218, 4611, 5256, 4609, 4, 2568, 57361, 4160, 790, 5615, 4608, 5657, 4610, 4, 2567, 57360, 2964, 25136, 5616, 4609, 5658, 4611, 3, 4159, 788, 5617, 4610, 5655, 4608, 2, 5618, 4611, 5656, 4609, 3, 4158, 786, 5695, 4608, 5737, 4610, 3, 2484, 41232, 5696, 4609, 5738, 4611, 2, 5697, 4610, 5735, 4608, 3, 2485, 41234, 5698, 4611, 5736, 4609, 3, 1158, 37254, 5455, 4608, 5497, 4610, 2, 5456, 4609, 5498, 4611, 3, 1156, 37252, 5457, 4610, 5495, 4608, 3, 1157, 37253, 5458, 4611, 5496, 4609, 3, 1154, 37250, 5535, 4608, 5577, 4610, 3, 1155, 37251, 5536, 4609, 5578, 4611, 4, 1152, 37248, 4161, 792, 5537, 4610, 5575, 4608, 3, 1153, 37249, 5538, 4611, 5576, 4609, 2, 2491, 41253, 2570, 57377, 2, 2490, 41252, 2569, 57376, 1, 2572, 57379, 1, 2571, 57378, 3, 2487, 41249, 2574, 57381, 4163, 802, 2, 2486, 41248, 2573, 57380, 2, 2489, 41251, 4162, 800, 1, 2488, 41250, 1, 3578, 886, 2, 2576, 57393, 4167, 822, 2, 2575, 57392, 2957, 25104, 1, 4166, 820, 1, 2494, 41270, 1, 4165, 818, 1, 2492, 41264, 1, 4164, 816, 1, 2493, 41266, 1, 4170, 828, 1, 4169, 826, 1, 2495, 41272, 1, 4168, 824, 1, 2496, 41274, 1, 3502, 16, 1, 1770, 5234, 1, 1769, 5232, 1, 2853, 5121, 2, 2852, 5120, 3503, 21, 1, 3024, 26096, 2, 1764, 5219, 2323, 1088, 2, 2324, 1089, 2376, 5120, 1, 1763, 5216, 1, 1767, 5223, 2, 1766, 5222, 3501, 5, 1, 1765, 5221, 1, 859, 5200, 1, 1768, 5224, 1, 3023, 26080, 1, 3402, 5125, 2, 1760, 5202, 3401, 5124, 1, 3404, 5127, 2, 1759, 5200, 3403, 5126, 1, 3398, 5121, 1, 3400, 5123, 2, 1761, 5204, 3399, 5122, 3, 1970, 1040, 2216, 1024, 3410, 5133, 3, 860, 5216, 1971, 1041, 3409, 5132, 1, 1972, 1042, 3, 1762, 5208, 1973, 1043, 3411, 5134, 1, 3406, 5129, 1, 3405, 5128, 2, 3022, 26064, 3408, 5131, 1, 3407, 5130, 2, 1757, 5187, 3504, 32, 1, 1758, 5189, 1, 1965, 1024, 2, 861, 5232, 1966, 1025, 1, 1967, 1026, 1, 1968, 1027, 1, 1969, 1028, 2, 1376, 38401, 3312, 1058, 2, 1377, 38402, 3311, 1057, 2, 1378, 38403, 3310, 1056, 5, 30, 5136, 1379, 38404, 1756, 5174, 3314, 1063, 5097, 272, 2, 1380, 38405, 2820, 1024, 2, 1381, 38406, 5098, 274, 2, 1382, 38407, 3313, 1060, 1, 850, 5120, 1, 851, 5121, 1, 852, 5122, 1, 853, 5123, 1, 854, 5124, 1, 855, 5125, 1, 3021, 26032, 4, 1755, 5155, 2322, 1024, 2823, 1044, 3316, 1074, 1, 1754, 5152, 1, 3315, 1072, 2, 29, 5120, 5096, 256, 1, 2821, 1040, 2, 2822, 1042, 3317, 1076, 1, 856, 5137, 1, 857, 5138, 1, 858, 5139, 1, 3020, 26016, 1, 3134, 1025, 2, 1383, 38433, 3307, 1026, 2, 1384, 38434, 3136, 1027, 3, 1385, 38435, 3135, 1026, 3306, 1024, 3, 32, 5168, 1386, 38436, 3138, 1029, 2, 3137, 1028, 3309, 1030, 1, 33, 5170, 2, 1753, 5141, 3308, 1028, 1, 2044, 5136, 1, 3019, 26000, 1, 2038, 5128, 1, 2039, 5131, 2, 31, 5152, 2040, 5132, 1, 2041, 5133, 1, 2042, 5134, 1, 2043, 5135, 1, 2031, 5121, 1, 2032, 5122, 1, 2033, 5123, 1, 2034, 5124, 1, 2035, 5125, 1, 2036, 5126, 1, 2037, 5127, 1, 4238, 1107, 1, 4237, 1106, 1, 4236, 1105, 1, 4235, 1104, 1, 3619, 1280, 1, 4234, 1091, 1, 4233, 1090, 1, 4232, 1089, 1, 4231, 1088, 1, 3018, 25952, 1, 3017, 25936, 1, 3016, 25925, 1, 3015, 25920, 2, 4960, 9472, 5542, 5376, 2, 4986, 9472, 5582, 5376, 2, 4908, 9472, 5462, 5376, 2, 4934, 9472, 5502, 5376, 3, 4218, 1042, 5064, 9472, 5702, 5376, 4, 862, 5248, 4217, 1040, 5090, 9472, 5742, 5376, 2, 5012, 9472, 5622, 5376, 1, 3014, 25904, 2, 5038, 9472, 5662, 5376, 2, 4752, 9472, 5222, 5376, 1, 2388, 9216, 2, 4778, 9472, 5262, 5376, 2, 4700, 9472, 5142, 5376, 2, 4726, 9472, 5182, 5376, 4, 2548, 42497, 4216, 1026, 4856, 9472, 5382, 5376, 1, 2547, 42496, 4, 863, 5264, 2549, 42499, 4882, 9472, 5422, 5376, 2, 864, 5265, 4215, 1025, 2, 4804, 9472, 5302, 5376, 1, 3013, 25888, 2, 4830, 9472, 5342, 5376, 1, 865, 5269, 1, 4226, 1074, 1, 4227, 1075, 1, 4225, 1073, 1, 4230, 1078, 1, 3012, 25872, 1, 4228, 1076, 1, 4229, 1077, 1, 1556, 13313, 1, 1557, 13314, 1, 1558, 13315, 1, 1559, 13316, 1, 1560, 13317, 1, 1561, 13318, 1, 4221, 1058, 1, 4222, 1059, 1, 4219, 1056, 1, 4220, 1057, 1, 3011, 25856, 1, 4223, 1060, 1, 4224, 1061, 2, 2337, 1364, 5102, 4112, 2, 2338, 1365, 3508, 277, 1, 2339, 1366, 3, 2333, 1360, 3497, 1040, 3507, 272, 2, 1410, 38720, 2334, 1361, 1, 2335, 1362, 1, 2336, 1363, 1, 3010, 25840, 1, 1411, 38729, 1, 1413, 38741, 1, 3506, 261, 1, 1414, 38742, 3, 1412, 38737, 3505, 256, 5099, 4100, 1, 5100, 4102, 1, 5101, 4106, 1, 1416, 38745, 1, 1415, 38744, 2, 1422, 38757, 3166, 5381, 1, 1421, 38756, 2, 1424, 38759, 3167, 5383, 1, 1423, 38758, 2, 1418, 38753, 3163, 5377, 1, 1417, 38752, 2, 1420, 38755, 3165, 5379, 2, 1419, 38754, 3164, 5378, 1, 3170, 5389, 1, 3169, 5388, 1, 3009, 25808, 2, 1426, 38761, 2217, 1280, 2, 1425, 38760, 3168, 5384, 1, 2218, 1282, 1, 3499, 1060, 1, 3500, 1062, 5, 1428, 38769, 2341, 1376, 3171, 5393, 3498, 1056, 3509, 288, 1, 1427, 38768, 1, 2342, 1378, 2, 1429, 38770, 3172, 5394, 1, 3008, 25792, 3, 36, 5392, 2329, 1301, 2825, 1281, 2, 37, 5393, 2824, 1280, 1, 38, 5394, 1, 867, 5384, 1, 1387, 38657, 2, 1781, 5424, 2328, 1299, 3, 1782, 5425, 2327, 1298, 3323, 1312, 1, 39, 5402, 1, 866, 5376, 1, 2330, 1304, 1, 2331, 1306, 2, 34, 5376, 1777, 5414, 2, 1388, 38677, 1778, 5415, 1, 1389, 38678, 2, 1390, 38679, 1776, 5413, 1, 35, 5380, 1, 2325, 1280, 1, 3007, 25760, 2, 868, 5392, 1391, 38680, 2, 869, 5393, 1392, 38681, 1, 1779, 5416, 2, 1780, 5417, 2326, 1290, 1, 1397, 38692, 2, 1398, 38693, 1774, 5399, 1, 1399, 38694, 2, 1400, 38695, 1773, 5397, 2, 1393, 38688, 1771, 5394, 2, 1394, 38689, 1772, 5395, 1, 1395, 38690, 2, 1396, 38691, 3318, 1280, 1, 3006, 25744, 1, 870, 5408, 2, 871, 5409, 1401, 38697, 1, 1775, 5400, 1, 1404, 38708, 2, 1405, 38709, 3322, 1302, 1, 1406, 38710, 2, 1407, 38711, 3321, 1300, 2, 2332, 1312, 3320, 1298, 1, 1402, 38706, 2, 1403, 38707, 3319, 1296, 2, 872, 5424, 1408, 38712, 2, 873, 5425, 1409, 38713, 2, 3555, 1296, 3579, 1280, 1, 3005, 25712, 2, 3554, 1280, 3580, 1296, 2, 2553, 42820, 3004, 25696, 1, 3581, 1312, 1, 3003, 25680, 1, 3002, 25664, 1, 3609, 1280, 1, 3001, 25648, 1, 4250, 1298, 1, 2340, 1434, 1, 4248, 1296, 1, 4249, 1297, 1, 3606, 1280, 1, 4246, 1288, 1, 4247, 1289, 1, 4244, 1286, 2, 3000, 25632, 4245, 1287, 1, 4242, 1284, 1, 4243, 1285, 1, 4240, 1282, 1, 4241, 1283, 1, 4239, 1281, 1, 2999, 25616, 1, 2551, 42801, 1, 2550, 42800, 1, 2552, 42802, 1, 2998, 25600, 2, 256, 37977, 1314, 37961, 2, 255, 37976, 2140, 38008, 1, 1311, 37953, 1, 1310, 37952, 1, 1312, 37954, 1, 2139, 38004, 1, 1313, 37959, 1, 1315, 37969, 1, 1316, 37970, 1, 1317, 37973, 1, 1319, 37975, 1, 1318, 37974, 1, 1328, 37993, 2, 1327, 37992, 1623, 37968, 1, 1624, 37971, 1, 1801, 5720, 1, 1320, 37985, 2, 1322, 37987, 3174, 5635, 3, 1321, 37986, 1800, 5712, 3173, 5634, 2, 1324, 37989, 3176, 5637, 3, 1323, 37988, 2138, 37972, 3175, 5636, 2, 1326, 37991, 3178, 5639, 2, 1325, 37990, 3177, 5638, 1, 1799, 5705, 2, 1330, 38001, 1795, 5699, 3, 257, 37984, 1329, 38000, 1794, 5698, 2, 1332, 38003, 2134, 37955, 2, 1331, 38002, 1793, 5696, 1, 2136, 37957, 3, 1333, 38004, 1798, 5702, 2135, 37956, 2, 1335, 38007, 1797, 5701, 3, 1334, 38006, 1796, 5700, 2137, 37958, 2, 874, 5632, 2542, 42131, 1, 2541, 42130, 2, 875, 5634, 2540, 42129, 1, 876, 5636, 1, 2544, 42134, 1, 877, 5638, 1, 2543, 42132, 2, 254, 37904, 878, 5640, 2, 1283, 37889, 2345, 1552, 2, 1284, 37890, 1792, 5680, 2, 1285, 37891, 2346, 1554, 1, 1286, 37892, 1, 1287, 37893, 1, 1288, 37894, 1, 1289, 37895, 2, 879, 5648, 4378, 1664, 2, 1622, 37921, 4379, 1665, 3, 880, 5650, 1791, 5672, 4380, 1666, 1, 4381, 1667, 1, 4382, 1668, 1, 4383, 1669, 1, 4384, 1670, 1, 4385, 1671, 3, 1290, 37904, 1788, 5666, 4386, 1672, 2, 2343, 1536, 4387, 1673, 4, 1291, 37906, 1787, 5664, 2133, 37922, 4388, 1674, 1, 2344, 1538, 2, 40, 5632, 1790, 5670, 1, 1789, 5668, 1, 1292, 37911, 2, 881, 5664, 1299, 37928, 1, 1300, 37929, 2, 882, 5666, 1786, 5656, 1, 883, 5667, 1, 884, 5668, 2, 1293, 37920, 1783, 5650, 2, 2130, 37905, 3325, 1538, 2, 1294, 37923, 3324, 1536, 2, 1295, 37924, 1785, 5654, 2, 1296, 37925, 2131, 37909, 2, 1297, 37926, 2132, 37910, 3, 1298, 37927, 1784, 5653, 3326, 1540, 2, 885, 5680, 1308, 37944, 3, 333, 37937, 886, 5681, 1309, 37945, 1, 887, 5682, 1, 888, 5683, 1, 889, 5684, 1, 890, 5685, 1, 891, 5686, 1, 892, 5687, 2, 893, 5688, 1301, 37936, 1, 2347, 1568, 1, 1302, 37938, 1, 1303, 37939, 1, 1304, 37940, 1, 1305, 37941, 1, 1306, 37942, 1, 1307, 37943, 1, 4333, 1619, 1, 4332, 1618, 1, 4331, 1617, 1, 4330, 1616, 1, 4337, 1623, 1, 4336, 1622, 1, 4335, 1621, 1, 4334, 1620, 1, 4341, 1627, 1, 4340, 1626, 1, 4339, 1625, 1, 4338, 1624, 1, 4345, 1631, 1, 4344, 1630, 1, 4343, 1629, 1, 4342, 1628, 1, 4317, 1603, 1, 4316, 1602, 1, 4315, 1601, 1, 4314, 1600, 1, 4321, 1607, 1, 4320, 1606, 1, 4319, 1605, 1, 4318, 1604, 1, 4325, 1611, 1, 4324, 1610, 1, 4323, 1609, 1, 4322, 1608, 1, 4329, 1615, 1, 4328, 1614, 1, 4327, 1613, 1, 4326, 1612, 2, 2348, 1786, 4365, 1651, 1, 4364, 1650, 1, 4363, 1649, 1, 4362, 1648, 1, 4369, 1655, 1, 4368, 1654, 1, 4367, 1653, 1, 4366, 1652, 1, 4373, 1659, 1, 4372, 1658, 1, 4371, 1657, 1, 4370, 1656, 1, 4377, 1663, 1, 4376, 1662, 1, 4375, 1661, 1, 4374, 1660, 1, 4349, 1635, 1, 4348, 1634, 1, 4347, 1633, 1, 4346, 1632, 1, 4353, 1639, 1, 4352, 1638, 1, 4351, 1637, 1, 4350, 1636, 1, 4357, 1643, 1, 4356, 1642, 1, 4355, 1641, 1, 4354, 1640, 1, 4361, 1647, 1, 4360, 1646, 1, 4359, 1645, 1, 4358, 1644, 1, 4269, 1554, 1, 4270, 1555, 1, 4267, 1552, 1, 4268, 1553, 1, 4273, 1558, 1, 4274, 1559, 1, 4271, 1556, 1, 4272, 1557, 1, 4277, 1562, 1, 4278, 1563, 1, 4275, 1560, 1, 4276, 1561, 1, 4281, 1566, 1, 4282, 1567, 1, 4279, 1564, 1, 4280, 1565, 1, 4253, 1538, 1, 4254, 1539, 2, 2538, 41987, 4251, 1536, 2, 2537, 41986, 4252, 1537, 1, 4257, 1542, 2, 2539, 41988, 4258, 1543, 1, 4255, 1540, 1, 4256, 1541, 1, 4261, 1546, 1, 4262, 1547, 1, 4259, 1544, 1, 4260, 1545, 1, 4265, 1550, 1, 4266, 1551, 1, 4263, 1548, 1, 4264, 1549, 1, 4301, 1586, 1, 4299, 1584, 1, 4300, 1585, 1, 4304, 1590, 1, 4305, 1591, 1, 4302, 1588, 1, 4303, 1589, 1, 4308, 1594, 1, 4309, 1595, 1, 4306, 1592, 1, 4307, 1593, 1, 4312, 1598, 1, 4313, 1599, 1, 4310, 1596, 1, 4311, 1597, 1, 4285, 1570, 1, 4286, 1571, 1, 4283, 1568, 1, 4284, 1569, 1, 4289, 1574, 1, 4290, 1575, 1, 4287, 1572, 1, 4288, 1573, 1, 4293, 1578, 1, 4294, 1579, 1, 4291, 1576, 1, 4292, 1577, 1, 4297, 1582, 1, 4298, 1583, 1, 4295, 1580, 1, 4296, 1581, 2, 1365, 38217, 1981, 1840, 1, 1364, 38216, 1, 1361, 38213, 1, 1360, 38212, 1, 1363, 38215, 1, 1362, 38214, 2, 1357, 38209, 3511, 784, 1, 1359, 38211, 1, 1358, 38210, 2, 1375, 38233, 1978, 1824, 2, 1374, 38232, 1979, 1825, 2, 1980, 1826, 2353, 1866, 1, 1371, 38229, 2, 1370, 38228, 3510, 773, 1, 1373, 38231, 1, 1372, 38230, 1, 1367, 38225, 1, 1366, 38224, 1, 1369, 38227, 1, 1368, 38226, 1, 1977, 1808, 1, 3183, 5893, 1, 3182, 5892, 1, 3184, 5894, 1, 3179, 5889, 1, 3181, 5891, 1, 3180, 5890, 1, 1974, 1792, 1, 1975, 1793, 1, 1976, 1794, 1, 896, 5892, 2, 897, 5894, 1627, 38198, 2, 894, 5888, 1339, 38152, 1, 1340, 38153, 1, 895, 5890, 1, 2350, 1818, 2, 1336, 38148, 5103, 16, 1, 1337, 38150, 2, 1338, 38151, 2148, 38199, 1, 898, 5896, 1, 2349, 1808, 2, 899, 5904, 1347, 38168, 1, 1348, 38169, 1, 900, 5906, 1, 1343, 38164, 1, 1344, 38165, 1, 1345, 38166, 1, 1346, 38167, 2, 1341, 38160, 2147, 38176, 2, 1342, 38161, 1626, 38185, 2, 901, 5920, 1353, 38184, 1, 2352, 1850, 1, 1349, 38180, 2, 1350, 38181, 3331, 1798, 2, 1351, 38182, 3330, 1797, 2, 1352, 38183, 3329, 1796, 1, 1625, 38168, 1, 3328, 1794, 1, 3327, 1792, 1, 1356, 38200, 1, 1982, 1856, 2, 2351, 1834, 3337, 1816, 2, 3336, 1815, 5104, 32, 2, 2144, 38149, 3335, 1814, 1, 2145, 38150, 2, 2146, 38151, 3334, 1812, 1, 1354, 38192, 3, 1355, 38193, 2141, 38145, 3333, 1810, 1, 2142, 38146, 2, 2143, 38147, 3332, 1808, 2, 4806, 9744, 5013, 9728, 2, 4832, 9744, 5039, 9728, 2, 4858, 9744, 5065, 9728, 2, 4884, 9744, 5091, 9728, 2, 4702, 9744, 4909, 9728, 2, 4728, 9744, 4935, 9728, 2, 4754, 9744, 4961, 9728, 2, 4780, 9744, 4987, 9728, 2, 4805, 9728, 5014, 9744, 2, 2545, 42244, 3026, 26144, 2, 4831, 9728, 5040, 9744, 2, 4857, 9728, 5066, 9744, 2, 4883, 9728, 5092, 9744, 2, 4701, 9728, 4910, 9744, 2, 4727, 9728, 4936, 9744, 2, 4753, 9728, 4962, 9744, 2, 4779, 9728, 4988, 9744, 1, 3025, 26128, 1, 2546, 42277, 2, 1987, 2072, 3185, 6145, 1, 3187, 6147, 1, 3186, 6146, 1, 3189, 6149, 1, 3188, 6148, 1, 3191, 6151, 1, 3190, 6150, 1, 1983, 2064, 1, 3192, 6152, 1, 1984, 2066, 1, 1985, 2067, 1, 1986, 2068, 1, 2561, 56077, 1, 2560, 56076, 1, 2559, 56075, 1, 2558, 56071, 1, 2557, 56070, 1, 2556, 56064, 1, 2562, 56179, 1, 902, 6144, 1, 903, 6145, 1, 904, 6146, 1, 905, 6147, 1, 2356, 2282, 1, 2355, 2266, 1, 2354, 2264, 1, 3196, 6405, 1, 3195, 6404, 1, 3197, 6407, 1, 3193, 6401, 1, 3194, 6403, 1, 2357, 2552, 3, 5126, 2048, 5167, 2050, 5209, 2052, 1, 5168, 2051, 3, 5127, 2050, 5166, 2048, 5249, 2052, 1, 5128, 2051, 3, 5129, 2052, 5206, 2048, 5247, 2050, 1, 5248, 2051, 3, 5169, 2052, 5207, 2050, 5246, 2048, 1, 5208, 2051, 4, 3494, 2310, 5286, 2048, 5327, 2050, 5369, 2052, 1, 5328, 2051, 4, 3493, 2308, 5287, 2050, 5326, 2048, 5409, 2052, 1, 5288, 2051, 3, 5289, 2052, 5366, 2048, 5407, 2050, 1, 5408, 2051, 3, 5329, 2052, 5367, 2050, 5406, 2048, 1, 5368, 2051, 3, 5446, 2048, 5487, 2050, 5529, 2052, 1, 5488, 2051, 3, 5447, 2050, 5486, 2048, 5569, 2052, 1, 5448, 2051, 3, 5449, 2052, 5526, 2048, 5567, 2050, 1, 5568, 2051, 3, 5489, 2052, 5527, 2050, 5566, 2048, 1, 5528, 2051, 3, 5606, 2048, 5647, 2050, 5689, 2052, 1, 5648, 2051, 3, 5607, 2050, 5646, 2048, 5729, 2052, 1, 5608, 2051, 4, 3496, 2322, 5609, 2052, 5686, 2048, 5727, 2050, 1, 5728, 2051, 4, 3495, 2320, 5649, 2052, 5687, 2050, 5726, 2048, 1, 5688, 2051, 1, 1988, 2562, 1, 1989, 2564, 1, 3205, 6665, 1, 3204, 6664, 1, 3198, 6657, 1, 3199, 6659, 1, 3201, 6661, 1, 3200, 6660, 1, 3203, 6663, 1, 3202, 6662, 1, 1443, 38928, 1, 1436, 38920, 1, 1437, 38921, 1, 1438, 38923, 1, 1439, 38924, 1, 1440, 38925, 1, 1441, 38926, 1, 1442, 38927, 1, 1430, 38913, 1, 1431, 38915, 1, 1432, 38916, 1, 1433, 38917, 1, 1434, 38918, 1, 1435, 38919, 1, 3216, 6932, 1, 3213, 6929, 1, 3215, 6931, 1, 3214, 6930, 1, 3212, 6920, 1, 3209, 6916, 1, 3211, 6919, 1, 3210, 6918, 1, 3206, 6913, 1, 3208, 6915, 1, 3207, 6914, 1, 1500, 39237, 1, 1499, 39236, 1, 1502, 39239, 1, 1501, 39238, 1, 1496, 39233, 1, 1498, 39235, 1, 1497, 39234, 1, 1493, 39228, 1, 1494, 39229, 1, 1495, 39230, 1, 1489, 39224, 1, 1490, 39225, 1, 1491, 39226, 1, 1492, 39227, 1, 1485, 39220, 1, 1486, 39221, 1, 1487, 39222, 1, 1488, 39223, 1, 1481, 39216, 1, 1482, 39217, 1, 1483, 39218, 1, 1484, 39219, 1, 1480, 39204, 1, 1476, 39200, 1, 1477, 39201, 1, 1478, 39202, 1, 1479, 39203, 1, 1472, 39196, 1, 1473, 39197, 1, 1474, 39198, 1, 1475, 39199, 1, 1468, 39192, 1, 1469, 39193, 1, 1470, 39194, 1, 1471, 39195, 1, 1464, 39188, 1, 1465, 39189, 1, 1466, 39190, 1, 1467, 39191, 1, 1460, 39184, 1, 1461, 39185, 1, 1462, 39186, 1, 1463, 39187, 1, 1456, 39180, 1, 1457, 39181, 1, 1458, 39182, 1, 1459, 39183, 1, 1452, 39176, 2, 1453, 39177, 2554, 43410, 1, 1454, 39178, 1, 1455, 39179, 1, 1448, 39172, 1, 1449, 39173, 1, 1450, 39174, 1, 1451, 39175, 1, 1444, 39168, 1, 1445, 39169, 1, 1446, 39170, 1, 1447, 39171, 1, 5749, 16, 1, 5748, 9, 1, 5747, 8, 1, 5746, 2, 1, 5745, 1, 1, 5751, 48, 1, 2120, 32736, 1, 5750, 32, 1, 5752, 64, 1, 5757, 64, 1, 4677, 1, 1, 5756, 48, 1, 5755, 32, 1, 5753, 16, 1, 5754, 17, 1, 5762, 57565, 1, 5760, 57344, 1, 5761, 57357, }; const unsigned short DictKeyHashTable[] = { 4096, 4097, 4100, 4096, 4103, 4096, 4106, 4109, 4112, 4115, 4118, 4121, 4124, 4096, 4096, 4096, 4127, 4132, 4135, 4138, 4141, 4146, 4151, 4096, 4154, 4096, 4096, 4159, 4162, 4165, 4170, 4173, 4178, 4183, 4096, 4186, 4096, 4189, 4096, 4192, 4197, 4202, 4205, 4096, 4210, 4096, 4213, 4216, 4096, 4225, 4232, 4096, 4239, 4242, 4247, 4254, 4096, 4257, 4096, 4260, 4263, 4266, 4096, 4269, 4096, 4272, 4275, 4278, 4281, 4286, 4096, 4289, 4294, 4299, 4304, 4096, 4307, 4314, 4317, 4096, 4096, 4324, 4096, 4096, 4096, 4327, 4096, 4330, 4341, 4346, 4349, 4352, 4359, 4366, 4369, 4372, 4096, 4375, 4096, 4380, 4096, 4383, 4386, 4389, 4096, 4392, 4395, 4404, 4409, 4412, 4419, 4424, 4431, 4436, 4443, 4446, 4453, 4456, 4463, 4466, 4469, 4476, 4479, 4486, 4491, 4500, 4507, 4512, 4517, 4524, 4527, 4530, 4541, 4544, 4547, 4554, 4559, 4562, 4096, 4096, 4567, 4096, 4570, 4577, 4580, 4096, 4583, 4594, 4597, 4602, 4096, 4605, 4608, 4613, 4620, 4625, 4628, 4096, 4635, 4096, 4638, 4643, 4652, 4655, 4658, 4096, 4096, 4096, 4663, 4666, 4669, 4096, 4672, 4681, 4096, 4684, 4687, 4096, 4692, 4697, 4096, 4096, 4096, 4700, 4705, 4096, 4096, 4708, 4711, 4096, 4096, 4720, 4096, 4723, 4726, 4729, 4734, 4737, 4096, 4096, 4740, 4743, 4746, 4749, 4754, 4759, 4768, 4096, 4773, 4096, 4776, 4779, 4096, 4096, 4782, 4785, 4788, 4791, 4096, 4096, 4796, 4799, 4096, 4096, 4804, 4809, 4814, 4817, 4828, 4835, 4842, 4849, 4854, 4863, 4868, 4873, 4096, 4880, 4885, 4892, 4096, 4895, 4900, 4096, 4905, 4096, 4908, 4913, 4922, 4929, 4936, 4941, 4950, 4957, 4966, 4971, 4096, 4096, 4974, 4981, 4986, 4989, 4994, 4997, 5000, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 5003, 4096, 4096, 5006, 5009, 5016, 5023, 5026, 5029, 5034, 5037, 4096, 4096, 5040, 5045, 5048, 5051, 5054, 4096, 4096, 5057, 5062, 5071, 5074, 5079, 5084, 5089, 5096, 5105, 5110, 5113, 5118, 5123, 4096, 5126, 5129, 4096, 5132, 5135, 5142, 5145, 4096, 5150, 5153, 5156, 5161, 5166, 5173, 5180, 5185, 5192, 5199, 5210, 5215, 5222, 4096, 4096, 4096, 5227, 5230, 5233, 5238, 5241, 4096, 5244, 5249, 4096, 5252, 4096, 5255, 5258, 5261, 4096, 5268, 4096, 4096, 4096, 4096, 5271, 4096, 5278, 5281, 5288, 5291, 5296, 5299, 4096, 5304, 5307, 4096, 5310, 5315, 5318, 5325, 5328, 5333, 5340, 5343, 5348, 5355, 5362, 5365, 5368, 4096, 5371, 5374, 4096, 5377, 5382, 5389, 4096, 5392, 4096, 5397, 4096, 4096, 5400, 5405, 4096, 5410, 5415, 4096, 5424, 4096, 5427, 5432, 5435, 5438, 5441, 5448, 5453, 5456, 5461, 5464, 5467, 5470, 5475, 4096, 5478, 5487, 4096, 5492, 4096, 4096, 5501, 5506, 5513, 5518, 5525, 5528, 5533, 5542, 5547, 5550, 5553, 5556, 5559, 5568, 5571, 5576, 5581, 4096, 5586, 4096, 5589, 5592, 4096, 5595, 4096, 5600, 5605, 4096, 5608, 4096, 5613, 5618, 5623, 5626, 5631, 5638, 5643, 4096, 4096, 5650, 5655, 5660, 5665, 5672, 5675, 5682, 5689, 5694, 4096, 5699, 5702, 5705, 5712, 5717, 4096, 4096, 4096, 4096, 5720, 4096, 5723, 4096, 5726, 5729, 5736, 5745, 5752, 5757, 5760, 4096, 5767, 4096, 5770, 5773, 5776, 4096, 5779, 5782, 5785, 5792, 5795, 4096, 4096, 5798, 4096, 5801, 4096, 5806, 5811, 5814, 4096, 5817, 5822, 5827, 4096, 5834, 5839, 5842, 5845, 5850, 4096, 5855, 5860, 4096, 5863, 5866, 5871, 5876, 5881, 5890, 5897, 5902, 5909, 5916, 5921, 5928, 5933, 5944, 5949, 5954, 5957, 5960, 5963, 4096, 5966, 5977, 5982, 5985, 5990, 5993, 4096, 6000, 6003, 6008, 6011, 4096, 6016, 6019, 6022, 6029, 6038, 6045, 6054, 6057, 6062, 6065, 4096, 6072, 6077, 6084, 6087, 6090, 6095, 6102, 6107, 6110, 6119, 6126, 6135, 6140, 4096, 6143, 4096, 4096, 6148, 6151, 4096, 6154, 4096, 6165, 6168, 6171, 4096, 6174, 6177, 6180, 6185, 4096, 6188, 6191, 6194, 6199, 4096, 6206, 4096, 4096, 6209, 6216, 6221, 6224, 6229, 6232, 6237, 6242, 6247, 6250, 6253, 4096, 6256, 6261, 4096, 4096, 4096, 4096, 6272, 4096, 6279, 6284, 6287, 6292, 6299, 4096, 6302, 6309, 6314, 6317, 6322, 6327, 6334, 6337, 6344, 4096, 4096, 6353, 6356, 6359, 4096, 6362, 6365, 6370, 6373, 4096, 4096, 6376, 4096, 4096, 6381, 6386, 4096, 6389, 6394, 4096, 6399, 4096, 6404, 6407, 6412, 4096, 6421, 6424, 4096, 6427, 6432, 6437, 6440, 4096, 6443, 4096, 6446, 6449, 6456, 6459, 6464, 4096, 6467, 4096, 4096, 6472, 6475, 4096, 6482, 6489, 6492, 6495, 6500, 4096, 6503, 6508, 6511, 6514, 6521, 6524, 4096, 4096, 6527, 6532, 6535, 6538, 6543, 6546, 4096, 4096, 6551, 4096, 6556, 6559, 4096, 6562, 4096, 6567, 4096, 4096, 6574, 4096, 6579, 6584, 6587, 6590, 4096, 4096, 4096, 6595, 6598, 6601, 6606, 4096, 4096, 6609, 6612, 6619, 6622, 6637, 6640, 6645, 6650, 6661, 6666, 6671, 6674, 6679, 6686, 4096, 6691, 6696, 6699, 4096, 6702, 4096, 4096, 4096, 6705, 6708, 6711, 4096, 6714, 6719, 6722, 6727, 6732, 6739, 4096, 4096, 6744, 4096, 6749, 6752, 6755, 4096, 4096, 4096, 6760, 4096, 6767, 6774, 6777, 4096, 4096, 6780, 4096, 6785, 6790, 6799, 6802, 6807, 6810, 6813, 4096, 6818, 6821, 6828, 6833, 6840, 4096, 6843, 6846, 6853, 6858, 4096, 4096, 4096, 4096, 6861, 4096, 4096, 6864, 6867, 6870, 4096, 4096, 4096, 6875, 4096, 4096, 6878, 6881, 6886, 6895, 6900, 6903, 6906, 4096, 6911, 6916, 6923, 6928, 6933, 6938, 6945, 6952, 6957, 6962, 6965, 6968, 6971, 6976, 6981, 6986, 6989, 4096, 6996, 6999, 7006, 7009, 7014, 7017, 7020, 7025, 4096, 4096, 7028, 4096, 4096, 4096, 4096, 7037, 7042, 4096, 4096, 7047, 4096, 4096, 7050, 4096, 7053, 7056, 7061, 7066, 7069, 7072, 7077, 7080, 7085, 7096, 7099, 7104, 7107, 4096, 7110, 4096, 7113, 7116, 4096, 4096, 7121, 7124, 7127, 4096, 4096, 7134, 7139, 7142, 7147, 7150, 7155, 7158, 4096, 4096, 7165, 4096, 7168, 7171, 7176, 4096, 7179, 4096, 7184, 7189, 4096, 7194, 7201, 7204, 4096, 4096, 7209, 4096, 4096, 4096, 7216, 7219, 7222, 7227, 4096, 7232, 7235, 4096, 7240, 7243, 7252, 4096, 7255, 7258, 4096, 7261, 7268, 7271, 4096, 7274, 7279, 7284, 7287, 7294, 7299, 7304, 7313, 7318, 7325, 7332, 7341, 7350, 7355, 7364, 4096, 7367, 7370, 7373, 7380, 7385, 4096, 4096, 7394, 7397, 7402, 7409, 7416, 7421, 7424, 7433, 4096, 4096, 7438, 4096, 7441, 4096, 7444, 7447, 7450, 7453, 4096, 7456, 7459, 7468, 7471, 7474, 4096, 7477, 7482, 7485, 7488, 7491, 4096, 7498, 7505, 7514, 7517, 7520, 7523, 7526, 7529, 7536, 7545, 7550, 7557, 7564, 7567, 4096, 7570, 7583, 7586, 4096, 7589, 7592, 7597, 7600, 7605, 7610, 7617, 7620, 7623, 7626, 7629, 7632, 7637, 7640, 7643, 7648, 7655, 7660, 4096, 7663, 7668, 7673, 7678, 7681, 7684, 7691, 7696, 7707, 7710, 7715, 7718, 4096, 4096, 7725, 7728, 4096, 4096, 4096, 4096, 7733, 7736, 4096, 7741, 7752, 7757, 4096, 7760, 4096, 4096, 4096, 4096, 7765, 7774, 7783, 7788, 7795, 7800, 7805, 7808, 4096, 4096, 7813, 7816, 7819, 7822, 7827, 7830, 4096, 7833, 4096, 7836, 7839, 7842, 7847, 7850, 7855, 4096, 7858, 4096, 7863, 7868, 7871, 7874, 7877, 4096, 7882, 7885, 4096, 7894, 7899, 7902, 7905, 4096, 7910, 7913, 4096, 4096, 4096, 4096, 7916, 7919, 7924, 7927, 7934, 4096, 7937, 7950, 7955, 7962, 7967, 7970, 7975, 7980, 7983, 7986, 7991, 7994, 7997, 4096, 8000, 8009, 8012, 8015, 8018, 8021, 8026, 8029, 8034, 4096, 8037, 4096, 4096, 4096, 8040, 8043, 8046, 8055, 8058, 8063, 4096, 8070, 8077, 8084, 8089, 8098, 8101, 8104, 4096, 8109, 8116, 8119, 4096, 8126, 8129, 4096, 8132, 4096, 8141, 8148, 8151, 8158, 8163, 8166, 4096, 8171, 4096, 8174, 8177, 8180, 4096, 8185, 8188, 8191, 8194, 8197, 8202, 8207, 4096, 4096, 8210, 8213, 8216, 4096, 8219, 4096, 8222, 4096, 8227, 8232, 8235, 8240, 4096, 8245, 4096, 8248, 4096, 4096, 4096, 8255, 8260, 8263, 8266, 4096, 8269, 8272, 8277, 8282, 8287, 8294, 8299, 8304, 8313, 8318, 8325, 8330, 8339, 4096, 8346, 4096, 8349, 8354, 8361, 8368, 8373, 8388, 8393, 8398, 4096, 8401, 8404, 8409, 8412, 8415, 8418, 8421, 8424, 4096, 4096, 4096, 8429, 8432, 8435, 8440, 4096, 8443, 8446, 8449, 8456, 8459, 4096, 8464, 8467, 8470, 8473, 4096, 8480, 8487, 8490, 8493, 8500, 8507, 4096, 4096, 8510, 8513, 8516, 8523, 8526, 8529, 8532, 8539, 8544, 8551, 8554, 4096, 4096, 8557, 8560, 8563, 4096, 8566, 8569, 4096, 4096, 8574, 8579, 8582, 8591, 8598, 8603, 8608, 8613, 8616, 8627, 4096, 4096, 8632, 8637, 8640, 8643, 8648, 8651, 8654, 4096, 8659, 8664, 8667, 4096, 8676, 4096, 8681, 8684, 8689, 8692, 8699, 8706, 8713, 8716, 8721, 8728, 8733, 8738, 8743, 4096, 4096, 8748, 4096, 8757, 8760, 8763, 8766, 8771, 8778, 8783, 4096, 4096, 4096, 4096, 8786, 8789, 4096, 8792, 4096, 4096, 8795, 8804, 8811, 8814, 4096, 8817, 8822, 8825, 8832, 8837, 8844, 4096, 8847, 8850, 8857, 8860, 4096, 8865, 4096, 8868, 8873, 8876, 8879, 8882, 8885, 8890, 8893, 8896, 8903, 4096, 8908, 8911, 4096, 8914, 8919, 8924, 8929, 8932, 8939, 8942, 8945, 8948, 4096, 8951, 8954, 8959, 8964, 8969, 8974, 4096, 8977, 8980, 8985, 8990, 9001, 4096, 9004, 4096, 9013, 9016, 4096, 9019, 9028, 9033, 9036, 9043, 9048, 9051, 4096, 9056, 9059, 9064, 9067, 9072, 4096, 9075, 9080, 9083, 4096, 9086, 9091, 4096, 4096, 9094, 9099, 9102, 9111, 9116, 9121, 9124, 9127, 4096, 9130, 9135, 9138, 4096, 9143, 9148, 4096, 9151, 9154, 9157, 9160, 9163, 9168, 9171, 9176, 9183, 9186, 9191, 4096, 9194, 4096, 9197, 9202, 9205, 4096, 4096, 9208, 9213, 9216, 9221, 9224, 4096, 9227, 9232, 9235, 9242, 9247, 4096, 9254, 9259, 4096, 4096, 9262, 4096, 9265, 9274, 9277, 9284, 9291, 9294, 9299, 9304, 9309, 9318, 9321, 9330, 9335, 9344, 9347, 9358, 9365, 9370, 9373, 9378, 9381, 9384, 9387, 9392, 9395, 4096, 4096, 9404, 9407, 9410, 9417, 9422, 9427, 9430, 9435, 9438, 9441, 9444, 9447, 4096, 9456, 9459, 4096, 4096, 9464, 9467, 9470, 4096, 9473, 9478, 9483, 4096, 9486, 9489, 9496, 9503, 9506, 4096, 4096, 4096, 9511, 9514, 9517, 9522, 9529, 9536, 9545, 9554, 4096, 9557, 9564, 9567, 9570, 9573, 9576, 9579, 9586, 9593, 9600, 9603, 9606, 9613, 4096, 9616, 4096, 9619, 4096, 9622, 4096, 9627, 9632, 9637, 9642, 4096, 9645, 9652, 9657, 9660, 9665, 9674, 9677, 9684, 9691, 9704, 9709, 9720, 9727, 9730, 9733, 4096, 9736, 9745, 9752, 9757, 9760, 9765, 9768, 9771, 9778, 9781, 9786, 9791, 9794, 9797, 9800, 4096, 9803, 9808, 9815, 9818, 4096, 9821, 9826, 9829, 9832, 9835, 9838, 9841, 9844, 9847, 9852, 4096, 9855, 9858, 4096, 9861, 9864, 4096, 4096, 9867, 9870, 9877, 9880, 9885, 9888, 9891, 9894, 9897, 9902, 4096, 4096, 9907, 4096, 9910, 9913, 9916, 9919, 4096, 4096, 9924, 9935, 9938, 9941, 9944, 9953, 9956, 9961, 9966, 4096, 9969, 4096, 9972, 9975, 9978, 9981, 9988, 9997, 10002, 4096, 4096, 4096, 10007, 10010, 10015, 10018, 10021, 10026, 10029, 10032, 10035, 10042, 10047, 10050, 10053, 10058, 4096, 10061, 4096, 4096, 10064, 10067, 4096, 10070, 10073, 10078, 10083, 10086, 10091, 10094, 10097, 10106, 10109, 4096, 4096, 10114, 10119, 10122, 10125, 10130, 10135, 10138, 10151, 10156, 4096, 10161, 10164, 10169, 10176, 10179, 10186, 10195, 10198, 4096, 10201, 4096, 10204, 10207, 10210, 10217, 10222, 10225, 4096, 10230, 10235, 10238, 10241, 10246, 10249, 10252, 10257, 10260, 10265, 4096, 10272, 4096, 10275, 4096, 10280, 4096, 10285, 10288, 10293, 10296, 10301, 10308, 10315, 10322, 10325, 10332, 10337, 10342, 10345, 10350, 4096, 10357, 10360, 10363, 4096, 4096, 10370, 10373, 10376, 10385, 10388, 10393, 10396, 10399, 10402, 10405, 10412, 10419, 10424, 10427, 10436, 10441, 10450, 10459, 10468, 10475, 10482, 10487, 10490, 10493, 10498, 10501, 10504, 10511, 10516, 10523, 10532, 10541, 10546, 10553, 10556, 10563, 4096, 10566, 10573, 4096, 10576, 4096, 10581, 4096, 10584, 4096, 10591, 10594, 4096, 10597, 10606, 10611, 4096, 10618, 4096, 10623, 4096, 10628, 10635, 4096, 4096, 10642, 10645, 10648, 10653, 10656, 10659, 10662, 10669, 10672, 4096, 10677, 10680, 10683, 10688, 4096, 10691, 4096, 10694, 10699, 10706, 10711, 10714, 10721, 10728, 10733, 10738, 10743, 10746, 10753, 10756, 10763, 4096, 10766, 4096, 4096, 10773, 10778, 10781, 10786, 4096, 10789, 4096, 4096, 4096, 10794, 4096, 4096, 10797, 4096, 4096, 4096, 10802, 10807, 10810, 10813, 10816, 4096, 10819, 10822, 4096, 4096, 4096, 10827, 4096, 10830, 10833, 4096, 10836, 10843, 10848, 10855, 10860, 10869, 10876, 10879, 10884, 10887, 10894, 4096, 10897, 10900, 10905, 4096, 4096, 10908, 10917, 10920, 10923, 10926, 10931, 10936, 10945, 10948, 10961, 10964, 10969, 10972, 10975, 10980, 4096, 4096, 10983, 4096, 4096, 4096, 4096, 10988, 10991, 10996, 10999, 11002, 11005, 4096, 11008, 11015, 4096, 11018, 11021, 4096, 4096, 4096, 4096, 4096, 11028, 4096, 4096, 11031, 11034, 11037, 11042, 11045, 11050, 11057, 11060, 4096, 11063, 4096, 4096, 11066, 11069, 11072, 4096, 11075, 11080, 11091, 11094, 11099, 11104, 11111, 11116, 11125, 11130, 11137, 11140, 11143, 11148, 11159, 11162, 11167, 4096, 11170, 4096, 4096, 11173, 4096, 11178, 11181, 11186, 11193, 11202, 11205, 11210, 11213, 11222, 11225, 4096, 11230, 11233, 4096, 4096, 11238, 11243, 11246, 11251, 11254, 11257, 11266, 4096, 4096, 4096, 11271, 11276, 11279, 11282, 4096, 4096, 4096, 4096, 11289, 11294, 4096, 11301, 11306, 11311, 11316, 11327, 11330, 11335, 11344, 11347, 11352, 11357, 4096, 11366, 11375, 11378, 11381, 11388, 11391, 11394, 11401, 11408, 4096, 4096, 11411, 11416, 11425, 4096, 11430, 11435, 11440, 11443, 11450, 11455, 11458, 11465, 11468, 11471, 11476, 4096, 11479, 11482, 11487, 11490, 11493, 4096, 11500, 11505, 11508, 11511, 11516, 11525, 11528, 11533, 11538, 11541, 11546, 11555, 11560, 11567, 11570, 11575, 11578, 11583, 11586, 11593, 4096, 4096, 11596, 11599, 11602, 11609, 4096, 4096, 11612, 11617, 11624, 4096, 11627, 11632, 11635, 11640, 4096, 11647, 11650, 4096, 11653, 11656, 11661, 11668, 11677, 11682, 11687, 11690, 11697, 4096, 11702, 11713, 11718, 11723, 11726, 11731, 11738, 11741, 11748, 11753, 11758, 4096, 11761, 11764, 11767, 4096, 11772, 11775, 11778, 11781, 11786, 11791, 11796, 11803, 11808, 11815, 4096, 11820, 4096, 11823, 11830, 11833, 11838, 11843, 11846, 11849, 11852, 11861, 4096, 11864, 11867, 11872, 11875, 4096, 11878, 11885, 4096, 11888, 4096, 4096, 4096, 4096, 11891, 11894, 11897, 11904, 11907, 11910, 11913, 4096, 11916, 11919, 11924, 11931, 11934, 4096, 11939, 11942, 11951, 11956, 11959, 11964, 11967, 11972, 11975, 4096, 11984, 4096, 11989, 11992, 4096, 11995, 12000, 12003, 12006, 12013, 12016, 12021, 4096, 12030, 12033, 4096, 12036, 4096, 12039, 12052, 12057, 12064, 4096, 12069, 4096, 4096, 12072, 4096, 12075, 12080, 12083, 4096, 12086, 4096, 12091, 4096, 12096, 12101, 12106, 12111, 4096, 12116, 12119, 12122, 12125, 12134, 12137, 12140, 12145, 12148, 12155, 12164, 12167, 12174, 12179, 12182, 12187, 12190, 12193, 4096, 4096, 12196, 4096, 12199, 12202, 4096, 12207, 4096, 12212, 12217, 4096, 4096, 4096, 12224, 4096, 12227, 12232, 4096, 12237, 4096, 12242, 4096, 12245, 12250, 12253, 12258, 12263, 12268, 12281, 12286, 12293, 12300, 12305, 12308, 12317, 12322, 12325, 12332, 12337, 12340, 4096, 12343, 12352, 12355, 12360, 12363, 12366, 12371, 12374, 12377, 12382, 12387, 12392, 12397, 12404, 12407, 12412, 12415, 4096, 12420, 4096, 4096, 12425, 12430, 12433, 4096, 12440, 12443, 4096, 12448, 12453, 12458, 12463, 12468, 12477, 12486, 12493, 12500, 12509, 12518, 12525, 12530, 12541, 12546, 12549, 12554, 4096, 12557, 4096, 12560, 12563, 12566, 12571, 12580, 12587, 12592, 12597, 12600, 12603, 4096, 12608, 12613, 12616, 4096, 12619, 12622, 12627, 12630, 12635, 12638, 12645, 12648, 12653, 12658, 12663, 12668, 12671, 12678, 12685, 12688, 12695, 12698, 12703, 4096, 12708, 12715, 12718, 12731, 12734, 12741, 12752, 12761, 12768, 12771, 12776, 12779, 12790, 12795, 12800, 12803, 12808, 12813, 12818, 4096, 4096, 12823, 12826, 12829, 12832, 12841, 12844, 12849, 12860, 12865, 12868, 4096, 12875, 12878, 4096, 12883, 4096, 12890, 4096, 12895, 12898, 4096, 12903, 12906, 12909, 4096, 4096, 12914, 12919, 12922, 4096, 12927, 12930, 4096, 12935, 12938, 12945, 12948, 4096, 12953, 12958, 12967, 12970, 12973, 12980, 12983, 12986, 12991, 12994, 13001, 13010, 13013, 13016, 13023, 13026, 13037, 13040, 13045, 13050, 13053, 13056, 13059, 4096, 4096, 13064, 13067, 13070, 13079, 13084, 4096, 4096, 13087, 13092, 4096, 4096, 13095, 13098, 13101, 13104, 4096, 4096, 13107, 13112, 13115, 4096, 13122, 13129, 4096, 13136, 13141, 4096, 4096, 4096, 13144, 13155, 4096, 13162, 4096, 13165, 13172, 13175, 4096, 13178, 13181, 13184, 4096, 13187, 4096, 13190, 13193, 13196, 13199, 4096, 13204, 4096, 13209, 13214, 13217, 13220, 4096, 13223, 4096, 13226, 13231, 4096, 4096, 13234, 13237, 13242, 13245, 4096, 4096, 13248, 13251, 4096, 13260, 4096, 4096, 13263, 4096, 13268, 4096, 13275, 13278, 13283, 13288, 13295, 13298, 13301, 13308, 13311, 4096, 13316, 13319, 4096, 4096, 4096, 13322, 4096, 13331, 4096, 4096, 13344, 4096, 4096, 13347, 13356, 13359, 4096, 13364, 13369, 13372, 4096, 4096, 4096, 13375, 13380, 13385, 13388, 13391, 13396, 13401, 4096, 4096, 4096, 13406, 13409, 13412, 13419, 13422, 13425, 13428, 13431, 4096, 4096, 13438, 13441, 13444, 13447, 13450, 4096, 4096, 13461, 13468, 13473, 4096, 13478, 4096, 4096, 13483, 13488, 4096, 4096, 4096, 13491, 13494, 13497, 13502, 13507, 13510, 13513, 13518, 13521, 13524, 4096, 13529, 13532, 4096, 4096, 13535, 13542, 13545, 4096, 4096, 4096, 4096, 13550, 13555, 13558, 13561, 13564, 13569, 13572, 13581, 13588, 13591, 13598, 4096, 13601, 4096, 13606, 4096, 13609, 13612, 4096, 13617, 4096, 13622, 4096, 13625, 4096, 4096, 4096, 13630, 13633, 4096, 13638, 13641, 13648, 13653, 13656, 13663, 13670, 4096, 13673, 13680, 13683, 13690, 13695, 13700, 13703, 13706, 13711, 13716, 13719, 4096, 13722, 13727, 13730, 4096, 13735, 13740, 4096, 13743, 13750, 13753, 13756, 4096, 13759, 13770, 13781, 13784, 13791, 13794, 13801, 13804, 13807, 4096, 13812, 13819, 13822, 13825, 13834, 13837, 13840, 13843, 13846, 13849, 4096, 13856, 13859, 13862, 13867, 13874, 13877, 13882, 13889, 13898, 13905, 13912, 13917, 13922, 13927, 4096, 13930, 4096, 13933, 13938, 4096, 4096, 13943, 13946, 13949, 13952, 13955, 13964, 13969, 13976, 13981, 13990, 13993, 14000, 14005, 14014, 14019, 14032, 14037, 4096, 14042, 14045, 14048, 14051, 14056, 14063, 14066, 14069, 14072, 14077, 14080, 4096, 4096, 14083, 14090, 4096, 14093, 14096, 14099, 14108, 14111, 14118, 14123, 14130, 14135, 14144, 14153, 4096, 14156, 4096, 14159, 4096, 14162, 14165, 14172, 14175, 4096, 14178, 14181, 14184, 14189, 14194, 14201, 14206, 14209, 14212, 14219, 4096, 14224, 14229, 14236, 14243, 14248, 14257, 14266, 14273, 14280, 14291, 4096, 14294, 14297, 4096, 4096, 14302, 4096, 4096, 14305, 14310, 14313, 14318, 4096, 14325, 14328, 14331, 14336, 14339, 14346, 14349, 14356, 14363, 14368, 14375, 14380, 14387, 14394, 14399, 14404, 14415, 14424, 14433, 14438, 14445, 14450, 14457, 14462, 14469, 14472, 14477, 4096, 14480, 4096, 14487, 4096, 14492, 14501, 14512, 4096, 14517, 4096, 14528, 14533, 14536, 14539, 14544, 14547, 14552, 4096, 4096, 4096, 14559, 4096, 4096, 4096, 14562, 14565, 14570, 14577, 14582, 14591, 4096, 4096, 14596, 14599, 14604, 14609, 4096, 4096, 4096, 14612, 14619, 14622, 14627, 14630, 14633, 14640, 14643, 14652, 14657, 14662, 14665, 14668, 14671, 14676, 14681, 14686, 14689, 4096, 4096, 4096, 14692, 14697, 4096, 14700, 14703, 14708, 4096, 14717, 14722, 14727, 4096, 14732, 4096, 14735, 14740, 14743, 14746, 14755, 14758, 4096, 4096, 4096, 14761, 4096, 14764, 14767, 14774, 4096, 14779, 14782, 14785, 14788, 14793, 14798, 14803, 14806, 4096, 14811, 14816, 14823, 14826, 14831, 14834, 14837, 14842, 14847, 14852, 14857, 4096, 14864, 4096, 14867, 14874, 14881, 14888, 14897, 14906, 4096, 14911, 14914, 14919, 4096, 4096, 14924, 14927, 14930, 4096, 14935, 14940, 14943, 14952, 14955, 14960, 14967, 14974, 14979, 14982, 14987, 4096, 14990, 14993, 4096, 14998, 4096, 4096, 15003, 15008, 4096, 15015, 15020, 15025, 15030, 15037, 15042, 15047, 15050, 4096, 15053, 15056, 15059, 15062, 15067, 15074, 15081, 15086, 15093, 15098, 15103, 15106, 4096, 15115, 15120, 4096, 4096, 4096, 15125, 15130, 15135, 15138, 15143, 15146, 15149, 15152, 4096, 15155, 15160, 15165, 15170, 15173, 15176, 15179, 15182, 15187, 15190, 4096, 15195, 15198, 15205, 15210, 15213, 15220, 15223, 4096, 15226, 4096, 15229, 15234, 4096, 15237, 15246, 15249, 4096, 15254, 4096, 4096, 15261, 15266, 15271, 15274, 4096, 15279, 15286, 15291, 15296, 15301, 15306, 15311, 4096, 15316, 4096, 4096, 15319, 4096, 15326, 15333, 15336, 4096, 15339, 15342, 4096, 4096, 15345, 15350, 15353, 15356, 4096, 15359, 4096, 4096, 4096, 15364, 4096, 4096, 15371, 4096, 15378, 15381, 4096, 15384, 4096, 15387, 15390, 15397, 15404, 15409, 15416, 15419, 15428, 4096, 4096, 4096, 15433, 15438, 15447, 15452, 15459, 15462, 15467, 15472, 15479, 15484, 15487, 15492, 15497, 15502, 15509, 4096, 4096, 15512, 15515, 15518, 4096, 4096, 15521, 4096, 15524, 4096, 15533, 4096, 15536, 15539, 15542, 4096, 4096, 15545, 15550, 15557, 4096, 15560, 15565, 15572, 15577, 15586, 15591, 15598, 15601, 15606, 4096, 15611, 4096, 15618, 4096, 15623, 15628, 4096, 15631, 15634, 15641, 4096, 15644, 4096, 4096, 15647, 15650, 4096, 4096, 15653, 4096, 15662, 15665, 4096, 4096, 15668, 15671, 15676, 15679, 15682, 4096, 15685, 4096, 15690, 15693, 15702, 15705, 4096, 15708, 15711, 15716, 15719, 15726, 15729, 15736, 15739, 4096, 15744, 15747, 4096, 15752, 15755, 15758, 15763, 4096, 15768, 4096, 15771, 15774, 15779, 15784, 4096, 4096, 4096, 4096, 15791, 4096, 4096, 15794, 15797, 15802, 15809, 15814, 15819, 15824, 4096, 4096, 4096, 15827, 4096, 15830, 15837, 15844, 15847, 15852, 15859, 15866, 15871, 15876, 15879, 15884, 15887, 15890, 15893, 4096, 4096, 4096, 4096, 15900, 4096, 15903, 4096, 15908, 15911, 15916, 15919, 15926, 15931, 4096, 15936, 15941, 15944, 15951, 15958, 15963, 15966, 15969, 4096, 15972, 4096, 15975, 15978, 15981, 4096, 15984, 15987, 15990, 15993, 15998, 16001, 16004, 16007, 4096, 16012, 16015, 16020, 4096, 16025, 16028, 16033, 4096, 4096, 16038, 16041, 16044, 4096, 16047, 16054, 4096, 4096, 4096, 16057, 16060, 4096, 4096, 4096, 4096, 4096, 16065, 16074, 16077, 4096, 16084, 16089, 4096, 4096, 16094, 16099, 16102, 16105, 4096, 16110, 16113, 16118, 16121, 16126, 16129, 4096, 16132, 16135, 16138, 4096, 16143, 16152, 16157, 16162, 16165, 16172, 16175, 16182, 4096, 16187, 16196, 16199, 16204, 16207, 16210, 16215, 4096, 16218, 4096, 16225, 16228, 16231, 4096, 16234, 4096, 4096, 16239, 16242, 16247, 16250, 4096, 16253, 16256, 4096, 4096, 16259, 16266, 16271, 16274, 16281, 16284, 16287, 4096, 4096, 16290, 16297, 4096, 16304, 16307, 4096, 16312, 4096, 16315, 16320, 16325, 16330, 16333, 16338, 16345, 16348, 16355, 16360, 16365, 16370, 16373, 4096, 16380, 16383, 16390, 16395, 4096, 16398, 16401, 16408, 4096, 16413, 4096, 16420, 16423, 16426, 16429, 16436, 16441, 16444, 4096, 16447, 4096, 16450, 4096, 16455, 16460, 16465, 4096, 4096, 16468, 16471, 16478, 16481, 4096, 4096, 4096, 4096, 16486, 16489, 16494, 16499, 16502, 16511, 16516, 16521, 16530, 16537, 16544, 16549, 16552, 16555, 4096, 16560, 16563, 16566, 16571, 16576, 16583, 16592, 16601, 16606, 16611, 16618, 4096, 16629, 16634, 16639, 16644, 4096, 16647, 16650, 16655, 16658, 16669, 16676, 16685, 16688, 16691, 16696, 4096, 16701, 16704, 16707, 16710, 16715, 16718, 16721, 16726, 16731, 16742, 16749, 16756, 16767, 16770, 16773, 4096, 16776, 16779, 16782, 4096, 16791, 16798, 4096, 16803, 16808, 4096, 16815, 4096, 16820, 16823, 16828, 16831, 16836, 16841, 4096, 4096, 4096, 4096, 16846, 16849, 4096, 4096, 16854, 16859, 16862, 16865, 16872, 16875, 16880, 16885, 4096, 16890, 4096, 16895, 16902, 16909, 16912, 16919, 4096, 16922, 16927, 16930, 16935, 16944, 16949, 16956, 16959, 16964, 16971, 16974, 4096, 16979, 16984, 4096, 4096, 4096, 16991, 16996, 17003, 17008, 17015, 17022, 17027, 17032, 17039, 4096, 4096, 17042, 17047, 17050, 4096, 17055, 4096, 17058, 17061, 17064, 17073, 17078, 17083, 17086, 17091, 4096, 17094, 4096, 17097, 17106, 17109, 17114, 4096, 4096, 4096, 4096, 17117, 17120, 17123, 17128, 17131, 17134, 4096, 17139, 4096, 17142, 17149, 17152, 17157, 17160, 17163, 17166, 17169, 17172, 17177, 4096, 4096, 17182, 17187, 17192, 17195, 17198, 17201, 17204, 17211, 17216, 4096, 17223, 17228, 17233, 17238, 17245, 17248, 17255, 17260, 17265, 4096, 4096, 17274, 17279, 17282, 4096, 17285, 17288, 17293, 4096, 4096, 17296, 17299, 17302, 17307, 17310, 17315, 4096, 17318, 17321, 17324, 17335, 17340, 4096, 17343, 4096, 17348, 17353, 4096, 17358, 4096, 17363, 17370, 17373, 4096, 17376, 4096, 4096, 17381, 17386, 17391, 17394, 17397, 4096, 17404, 4096, 4096, 4096, 4096, 17407, 17410, 17417, 17422, 17433, 17442, 17457, 17464, 17475, 17480, 17487, 17490, 17501, 4096, 17506, 17515, 17520, 17523, 17528, 17537, 17540, 17545, 17550, 4096, 17553, 17558, 17563, 17568, 17573, 17576, 17581, 17584, 17591, 17596, 17601, 17604, 17609, 17618, 17627, 4096, 17634, 17639, 4096, 4096, 17644, 4096, 17649, 17654, 17657, 17660, 17663, 17666, 4096, 17671, 17674, 17677, 17680, 4096, 17685, 17690, 17693, 17696, 4096, 4096, 17699, 17702, 17705, 17708, 4096, 4096, 17713, 17716, 17719, 17724, 17727, 17730, 17733, 17740, 17743, 4096, 4096, 4096, 4096, 17746, 17751, 17754, 17761, 4096, 17766, 17771, 17778, 17783, 17790, 17797, 17800, 17805, 17810, 17813, 4096, 17816, 4096, 17819, 17826, 17829, 17832, 17835, 4096, 17838, 17843, 17848, 17851, 4096, 4096, 17854, 17859, 17866, 17871, 17876, 17883, 17886, 17891, 17894, 4096, 17899, 4096, 4096, 4096, 17902, 17905, 4096, 17908, 17911, 17914, 17919, 17922, 17925, 4096, 17930, 4096, 17937, 17940, 4096, 17943, 17946, 17951, 17958, 17961, 17974, 17977, 17984, 17989, 18000, 18003, 18008, 18013, 18024, 18033, 4096, 4096, 4096, 18036, 4096, 18043, 18046, 18049, 18052, 4096, 4096, 18055, 18060, 4096, 18063, 4096, 4096, 4096, 18066, 18069, 4096, 18076, 18081, 18084, 18087, 18090, 18095, 18102, 18107, 18114, 18119, 18124, 4096, 4096, 4096, 18131, 4096, 4096, 18134, 4096, 4096, 18139, 4096, 4096, 4096, 18142, 4096, 18145, 18150, 18157, 18160, 18163, 4096, 18166, 18169, 18172, 18181, 18184, 18187, 18190, 18193, 18200, 18203, 18208, 18213, 18216, 18219, 18222, 18227, 4096, 18230, 18235, 4096, 18238, 18241, 4096, 18244, 18247, 4096, 18250, 4096, 18253, 18256, 18259, 18266, 18275, 18278, 4096, 18281, 18284, 18289, 18298, 18305, 18308, 18311, 18316, 18321, 4096, 4096, 4096, 4096, 18324, 4096, 18329, 18332, 4096, 18341, 4096, 18346, 18351, 18354, 4096, 18357, 18362, 18365, 18372, 18375, 18382, 18385, 18390, 18393, 18398, 18401, 18404, 18407, 4096, 18412, 4096, 18419, 18428, 18433, 18438, 18445, 18450, 18455, 18458, 18461, 18464, 18467, 18470, 18475, 18480, 18485, 18490, 18495, 18498, 18507, 18516, 18519, 18530, 18535, 4096, 18538, 18541, 18550, 18555, 18562, 18567, 18572, 4096, 18577, 4096, 18580, 4096, 18583, 18590, 18597, 4096, 18600, 18605, 18612, 4096, 18615, 18618, 18623, 4096, 4096, 18628, 18631, 18634, 4096, 4096, 4096, 4096, 18641, 18648, 4096, 18651, 18654, 18661, 18664, 18667, 4096, 18670, 4096, 18673, 18676, 18679, 4096, 18682, 18687, 18690, 18693, 18696, 18699, 18706, 18709, 18714, 18717, 4096, 18722, 4096, 18725, 4096, 4096, 18728, 0, 1, 684, 8621, 1, 820, 60856, 1, 1128, 12549, 1, 4021, 2910, 1, 356, 40903, 1, 3247, 20684, 1, 3293, 39925, 1, 797, 62074, 1, 2701, 28221, 1, 1019, 46293, 2, 3176, 61355, 3725, 56632, 1, 2684, 49074, 1, 2356, 59737, 1, 1215, 10411, 2, 2173, 43325, 3631, 36851, 2, 619, 28109, 4027, 26552, 1, 1939, 6093, 2, 349, 62685, 2065, 11249, 1, 2452, 8987, 1, 2334, 11294, 2, 517, 44554, 3592, 20788, 1, 3181, 33396, 2, 63, 24850, 2599, 35377, 2, 437, 34819, 2412, 37979, 1, 3962, 57855, 1, 1726, 3049, 1, 2565, 55510, 2, 2687, 15723, 3632, 44945, 2, 1041, 58597, 1890, 36070, 1, 157, 13698, 2, 333, 53997, 2740, 55031, 1, 759, 37910, 1, 572, 9828, 4, 3196, 65354, 3539, 2453, 4246, 13852, 4449, 40043, 3, 3352, 9862, 3413, 5240, 4486, 32024, 3, 764, 22080, 3042, 20467, 4606, 12015, 1, 5115, 28030, 2, 535, 57619, 4670, 46154, 3, 445, 34969, 2368, 5353, 4372, 11130, 1, 446, 34969, 1, 128, 21934, 1, 1958, 5258, 1, 2972, 22156, 1, 4301, 35922, 1, 2322, 11349, 1, 4530, 3063, 1, 2431, 11629, 1, 4677, 33411, 2, 2038, 52977, 2087, 29829, 1, 1190, 4783, 2, 282, 39503, 4071, 49539, 2, 629, 7367, 1667, 36198, 2, 295, 35245, 2212, 18852, 1, 4031, 35726, 3, 181, 46517, 3231, 13198, 4555, 16402, 1, 1869, 20494, 3, 1103, 53203, 2619, 42382, 4591, 31469, 1, 1255, 7001, 1, 2323, 24768, 5, 124, 15505, 260, 44635, 539, 24345, 845, 19012, 2923, 47072, 2, 2154, 11004, 5476, 32380, 1, 5516, 32380, 1, 5556, 32380, 3, 382, 42146, 5113, 63423, 5596, 32380, 3, 1933, 40187, 4340, 43064, 5636, 32380, 1, 5676, 32380, 1, 5716, 32380, 1, 4060, 22412, 2, 996, 44063, 3746, 42722, 1, 3471, 18054, 1, 874, 12262, 1, 1429, 60025, 1, 1210, 44543, 1, 5173, 63644, 4, 763, 28932, 946, 62878, 2082, 11073, 5213, 63644, 2, 1130, 11950, 5253, 63644, 1, 5293, 63644, 3, 348, 10466, 808, 35285, 5333, 63644, 2, 3665, 36801, 5373, 63644, 3, 2241, 41086, 5413, 63644, 5494, 14274, 2, 5453, 63644, 5534, 14274, 3, 1159, 49574, 2732, 40152, 5574, 14274, 1, 5614, 14274, 3, 2691, 24341, 4418, 21252, 5654, 14274, 1, 5694, 14274, 3, 418, 61257, 893, 7708, 5734, 14274, 1, 3690, 40573, 1, 2111, 40209, 3, 1240, 52961, 1989, 15014, 3861, 40265, 1, 5182, 40309, 3, 2611, 60233, 2809, 54457, 5222, 40309, 2, 1288, 30366, 5262, 40309, 4, 787, 6544, 2593, 31976, 3638, 29647, 5302, 40309, 3, 3115, 51298, 3225, 11901, 5342, 40309, 2, 5382, 40309, 5478, 9066, 2, 5422, 40309, 5518, 9066, 3, 3901, 6339, 5462, 40309, 5558, 9066, 1, 5598, 9066, 1, 5638, 9066, 5, 1476, 2729, 1639, 52410, 2833, 63753, 2874, 5182, 5678, 9066, 1, 5718, 9066, 1, 3803, 61675, 3, 1277, 17979, 1546, 55360, 2119, 59431, 2, 3603, 37852, 3717, 58724, 1, 3538, 29157, 2, 632, 50692, 4452, 2306, 1, 1699, 14009, 3, 456, 32842, 1936, 30594, 2361, 14646, 1, 4628, 30918, 1, 586, 23084, 5, 89, 40351, 576, 41332, 1742, 11656, 1982, 31564, 2831, 21395, 1, 1900, 10672, 2, 3465, 17865, 3922, 63522, 1, 1455, 2341, 1, 2734, 63959, 2, 37, 51816, 3158, 8159, 3, 2109, 44711, 2499, 43425, 3146, 51260, 2, 3137, 17997, 3185, 50244, 1, 2074, 47453, 3, 129, 43648, 1369, 8060, 4101, 8464, 1, 3792, 61344, 2, 1388, 49812, 5127, 37379, 4, 184, 41372, 2107, 47768, 3207, 9673, 4041, 55874, 1, 256, 56676, 1, 2367, 49744, 2, 1154, 48620, 2905, 19985, 1, 5139, 38867, 1, 4534, 35914, 1, 2601, 64491, 4, 1135, 64135, 3606, 18801, 3893, 63330, 3986, 28960, 1, 4410, 24133, 1, 2771, 48575, 2, 1914, 62632, 3952, 58465, 2, 2134, 37210, 3640, 51283, 1, 1951, 4237, 2, 2386, 1975, 4687, 14692, 1, 571, 47770, 1, 2780, 9769, 4, 388, 46683, 723, 57055, 2547, 11799, 4592, 18875, 1, 2533, 15357, 1, 3695, 16660, 1, 1120, 32652, 2, 1735, 40759, 3881, 64437, 1, 1206, 58285, 1, 5745, 17558, 1, 4004, 21862, 1, 2822, 30424, 1, 3947, 49193, 2, 697, 42162, 2288, 607, 2, 1940, 5955, 4549, 33255, 4, 83, 1636, 2596, 50620, 3732, 57409, 5135, 53994, 2, 679, 118, 3232, 50901, 1, 4056, 46929, 1, 4521, 63989, 1, 3279, 65309, 1, 662, 61057, 1, 1750, 1171, 1, 573, 32031, 2, 36, 5383, 2699, 7959, 1, 1057, 21498, 2, 1964, 57277, 3579, 8451, 2, 802, 13269, 5101, 37872, 2, 3299, 35422, 4000, 54517, 1, 5164, 35615, 5, 1080, 48155, 1511, 32759, 3759, 49421, 4386, 17281, 5204, 35615, 3, 2697, 13492, 4170, 5811, 5244, 35615, 3, 224, 6787, 2032, 5438, 5284, 35615, 3, 1415, 61510, 5100, 51487, 5324, 35615, 2, 732, 745, 5364, 35615, 4, 142, 49641, 1730, 64738, 3814, 3744, 5404, 35615, 2, 1525, 20482, 5444, 35615, 2, 1848, 19151, 3319, 46008, 3, 2483, 17998, 3571, 20331, 3955, 21491, 2, 4310, 33495, 4432, 38581, 3, 96, 57075, 1118, 20964, 1705, 49831, 1, 3091, 20026, 2, 695, 42731, 2841, 18144, 2, 635, 13626, 3672, 16632, 1, 758, 10750, 2, 851, 13850, 3565, 17930, 4, 1483, 19471, 1737, 47159, 2175, 7518, 4914, 19574, 3, 3033, 19029, 4921, 8853, 4940, 19574, 3, 3025, 48192, 4947, 8853, 4966, 19574, 2, 4973, 8853, 4992, 19574, 4, 3039, 40280, 3300, 62710, 4999, 8853, 5018, 19574, 3, 4124, 57922, 5025, 8853, 5044, 19574, 4, 2698, 38658, 2838, 5225, 5051, 8853, 5070, 19574, 2, 1385, 42935, 5077, 8853, 1, 4295, 27578, 3, 814, 1484, 970, 25404, 3408, 33435, 2, 3375, 34695, 4382, 43831, 1, 3474, 16431, 2, 240, 30501, 2502, 53707, 1, 2825, 39411, 1, 3919, 18058, 1, 1261, 25738, 1, 4154, 45485, 1, 3358, 43792, 3, 328, 60715, 2893, 704, 4598, 62351, 3, 816, 10801, 1506, 956, 2451, 26202, 1, 1710, 35738, 1, 3402, 28587, 2, 2863, 12644, 3815, 30214, 1, 4262, 20799, 1, 4079, 55788, 2, 342, 42062, 602, 26254, 1, 4315, 44729, 1, 3999, 7245, 1, 309, 27183, 1, 3430, 4306, 2, 43, 11748, 5501, 6213, 4, 262, 60963, 316, 22514, 5096, 16499, 5541, 6213, 1, 5581, 6213, 2, 2614, 50439, 5621, 6213, 2, 2804, 496, 5661, 6213, 2, 5499, 55488, 5701, 6213, 3, 3393, 62290, 5539, 55488, 5741, 6213, 4, 436, 26288, 3860, 27124, 4175, 30177, 5579, 55488, 2, 1416, 12160, 5619, 55488, 1, 5659, 55488, 2, 1018, 62131, 5699, 55488, 2, 2728, 54933, 5739, 55488, 1, 3905, 2540, 1, 2333, 59198, 1, 2703, 33068, 1, 2878, 58064, 3, 1123, 60450, 1811, 24965, 4051, 46256, 1, 1925, 48656, 2, 1394, 41014, 3116, 35236, 1, 4631, 7127, 1, 1616, 34878, 2, 1844, 62471, 2403, 3340, 2, 1397, 9979, 2118, 40147, 3, 2391, 6420, 2399, 36952, 4641, 1318, 3, 4273, 10147, 4708, 1598, 5160, 44049, 2, 4734, 1598, 5200, 44049, 3, 2932, 35812, 4760, 1598, 5240, 44049, 3, 1430, 33016, 4786, 1598, 5280, 44049, 5, 279, 32605, 3678, 40839, 4113, 60753, 4812, 1598, 5320, 44049, 2, 4838, 1598, 5360, 44049, 3, 3855, 9286, 4864, 1598, 5400, 44049, 2, 4890, 1598, 5440, 44049, 1, 2925, 7571, 1, 812, 51295, 2, 1011, 21991, 3985, 23956, 1, 744, 29873, 1, 1291, 20705, 2, 947, 35182, 1835, 3029, 1, 249, 33622, 1, 336, 8435, 1, 2999, 15256, 1, 1578, 61370, 3, 484, 451, 3110, 17439, 3585, 1336, 1, 498, 60073, 3, 1056, 48859, 1621, 18073, 4233, 13914, 1, 494, 52993, 3, 2479, 30972, 4057, 8767, 4659, 53668, 1, 1582, 32838, 2, 677, 8529, 3486, 29778, 1, 3396, 54845, 2, 1711, 25133, 4143, 18165, 1, 391, 16285, 1, 743, 51570, 2, 872, 10546, 1477, 34397, 1, 3482, 15927, 3, 1816, 40966, 3484, 24897, 4627, 27968, 1, 4482, 58738, 2, 2491, 62063, 3394, 49902, 3, 11, 57727, 660, 17117, 5121, 14122, 1, 495, 54009, 2, 623, 63004, 1359, 57083, 3, 2605, 52821, 2782, 25490, 3373, 33524, 3, 3119, 57773, 3645, 16073, 3978, 1675, 1, 1245, 24405, 1, 4471, 59492, 1, 94, 4512, 1, 2571, 61099, 1, 2344, 48648, 2, 2353, 28022, 4428, 26633, 3, 878, 57038, 2866, 11168, 5759, 18451, 1, 1069, 26484, 2, 2130, 49566, 3102, 47967, 1, 1016, 47107, 2, 3307, 23041, 4703, 44013, 2, 2191, 39122, 4492, 30267, 2, 1725, 31354, 3765, 24815, 4, 60, 44013, 3442, 865, 4303, 64571, 5094, 8579, 1, 2679, 51212, 2, 1947, 23331, 4702, 47097, 1, 1357, 21696, 1, 1268, 58263, 1, 3607, 55538, 3, 890, 63210, 1182, 39560, 4127, 23903, 2, 4025, 11038, 4222, 57499, 1, 4356, 5248, 2, 75, 61386, 2981, 30329, 1, 3359, 14002, 1, 3447, 10990, 1, 374, 9319, 2, 3658, 44381, 3685, 57369, 1, 1950, 32276, 4, 121, 54694, 3528, 40523, 4184, 28681, 4427, 41410, 2, 4540, 43398, 5123, 63295, 4, 1091, 32175, 1303, 11499, 3886, 43920, 4149, 41356, 2, 265, 14887, 4527, 53849, 3, 1151, 35237, 1495, 30246, 1765, 35329, 2, 2844, 11102, 5503, 29565, 3, 254, 33531, 998, 28695, 5543, 29565, 1, 5583, 29565, 2, 2716, 20620, 5623, 29565, 4, 829, 16712, 1096, 59149, 1732, 19799, 5663, 29565, 2, 1492, 50726, 5703, 29565, 1, 5743, 29565, 1, 450, 38661, 1, 2882, 25574, 1, 2842, 39468, 4, 504, 38215, 607, 9541, 1608, 6328, 4539, 10116, 1, 505, 38215, 2, 875, 48994, 4405, 31034, 2, 3419, 54704, 3683, 33153, 2, 4213, 39102, 4531, 44599, 1, 1178, 7490, 1, 280, 53674, 1, 1889, 12537, 2, 4109, 21172, 4353, 20102, 2, 3621, 43431, 4033, 19782, 1, 404, 660, 2, 55, 18941, 1611, 48528, 2, 2400, 24192, 3086, 62543, 2, 2264, 22771, 3104, 62826, 1, 4298, 40320, 2, 578, 57333, 5758, 63261, 3, 3240, 4493, 3770, 56801, 4264, 31976, 2, 458, 58663, 2482, 53526, 3, 2840, 31092, 3566, 50456, 3909, 46868, 2, 608, 53065, 5176, 54087, 2, 3820, 4813, 5216, 54087, 2, 2549, 19430, 5256, 54087, 3, 779, 54625, 2152, 62962, 5296, 54087, 1, 5336, 54087, 3, 1323, 44520, 3027, 51700, 5376, 54087, 3, 2447, 20703, 2602, 1207, 5416, 54087, 2, 4360, 33818, 5456, 54087, 2, 752, 37052, 1794, 63085, 1, 2519, 63035, 1, 653, 6701, 3, 918, 56350, 2505, 16029, 3516, 64340, 2, 225, 64246, 554, 59924, 1, 243, 947, 1, 628, 38837, 1, 123, 30471, 1, 3769, 16378, 3, 1669, 5820, 3298, 15219, 3818, 57051, 4, 869, 52360, 1452, 32736, 1812, 54256, 3730, 12659, 3, 1009, 61303, 3290, 58357, 3831, 30767, 2, 3708, 42053, 4580, 42173, 1, 3387, 18330, 3, 1203, 62437, 1390, 52854, 3417, 26311, 1, 3779, 28045, 1, 564, 9589, 1, 3425, 60301, 1, 45, 16521, 1, 4300, 56106, 1, 2409, 34104, 3, 2312, 40343, 4026, 6774, 4278, 64503, 1, 114, 41809, 1, 2561, 14867, 1, 3283, 43015, 2, 734, 392, 1083, 65353, 2, 1759, 26142, 3837, 21101, 1, 2908, 43695, 1, 1138, 33119, 2, 480, 17258, 4137, 7259, 2, 688, 56684, 4237, 52237, 3, 1164, 62521, 2165, 8355, 3182, 54192, 2, 1179, 30243, 2717, 58552, 1, 656, 43092, 1, 288, 12637, 2, 1399, 31419, 2286, 31168, 2, 972, 43779, 3876, 45949, 2, 1269, 35791, 4419, 49823, 1, 680, 32106, 1, 3324, 54908, 2, 3731, 33551, 4920, 44372, 2, 3560, 47233, 4946, 44372, 2, 3357, 48061, 4972, 44372, 4, 993, 44420, 1278, 59425, 4286, 63313, 4998, 44372, 3, 1930, 45208, 2508, 22229, 5024, 44372, 2, 5050, 44372, 5504, 44243, 3, 2149, 11645, 5076, 44372, 5544, 44243, 3, 2261, 63733, 4918, 16876, 5584, 44243, 2, 4944, 16876, 5624, 44243, 3, 3453, 41504, 4970, 16876, 5664, 44243, 2, 4996, 16876, 5704, 44243, 5, 1422, 17096, 3179, 60323, 5022, 16876, 5744, 44243, 5760, 51313, 2, 913, 22294, 5048, 16876, 2, 1366, 39748, 5074, 16876, 1, 242, 41678, 1, 3689, 23067, 1, 1691, 3379, 1, 1783, 59410, 5, 853, 9740, 1202, 54312, 3201, 11583, 4220, 18588, 4256, 7355, 2, 38, 41136, 3824, 49541, 1, 2330, 23463, 2, 835, 49969, 3823, 479, 1, 1195, 57871, 3, 1094, 59277, 3977, 12078, 4283, 50412, 1, 828, 49699, 2, 1475, 26695, 4593, 5384, 1, 2880, 14481, 2, 2103, 18116, 3527, 24533, 1, 4219, 47543, 1, 3980, 22952, 3, 1006, 46352, 1954, 40460, 4721, 37180, 4, 491, 3078, 1420, 17926, 3242, 53502, 4747, 37180, 3, 359, 43279, 4411, 40077, 4773, 37180, 4, 616, 82, 2752, 48188, 3210, 18538, 4799, 37180, 1, 4825, 37180, 2, 3448, 47968, 4851, 37180, 1, 4877, 37180, 3, 364, 16849, 4624, 42853, 4903, 37180, 2, 482, 6949, 1183, 41456, 3, 925, 42119, 1453, 46920, 4665, 32781, 1, 839, 46591, 1, 4729, 10640, 2, 377, 27607, 4755, 10640, 3, 20, 51927, 4453, 32395, 4781, 10640, 2, 4446, 25676, 4807, 10640, 1, 4833, 10640, 4, 920, 6196, 1368, 23817, 3318, 37142, 4859, 10640, 3, 1548, 52357, 2516, 62694, 4885, 10640, 4, 368, 7681, 599, 43240, 1418, 11060, 4911, 10640, 2, 1781, 53815, 2198, 33705, 1, 3813, 49832, 2, 386, 60940, 3572, 51409, 1, 2556, 20758, 1, 4214, 33192, 5, 206, 29426, 649, 60253, 2008, 19665, 2727, 15507, 3753, 9494, 1, 4204, 5552, 1, 4094, 3155, 1, 4571, 21515, 1, 2642, 48303, 1, 3624, 59436, 2, 3002, 13322, 3040, 51090, 1, 2991, 50060, 1, 1523, 62045, 1, 2538, 25451, 2, 1790, 64862, 2871, 62992, 3, 560, 21208, 2758, 20821, 3143, 48602, 1, 2339, 43530, 3, 832, 26886, 3576, 19847, 5146, 52270, 2, 584, 3734, 5186, 52270, 1, 5226, 52270, 2, 1892, 21078, 5266, 52270, 1, 5306, 52270, 2, 2744, 51422, 5346, 52270, 2, 300, 17898, 5386, 52270, 2, 2700, 60067, 5426, 52270, 1, 2450, 39379, 1, 3573, 14149, 1, 3101, 41081, 2, 1033, 58431, 1227, 33602, 5, 112, 35667, 1249, 61105, 4100, 64701, 4313, 23099, 5099, 13541, 3, 215, 61426, 2415, 53567, 3557, 55066, 2, 2731, 42968, 4497, 64228, 1, 613, 22476, 2, 669, 5180, 5762, 29595, 3, 3462, 23416, 4516, 29565, 4548, 30032, 1, 1292, 17931, 3, 3063, 34781, 4043, 31105, 4398, 53367, 2, 2417, 21521, 5181, 4160, 1, 5221, 4160, 2, 1554, 23981, 5261, 4160, 2, 3456, 62178, 5301, 4160, 3, 4225, 43162, 4552, 11549, 5341, 4160, 1, 5381, 4160, 3, 32, 30305, 326, 4714, 5421, 4160, 4, 17, 45398, 2374, 21557, 4498, 3767, 5461, 4160, 1, 687, 57802, 1, 3789, 38423, 1, 487, 62774, 1, 3220, 38592, 2, 1550, 24514, 3380, 31076, 1, 140, 1475, 1, 4217, 34297, 2, 2193, 32844, 3614, 9366, 2, 1296, 24098, 4145, 6955, 1, 3750, 5017, 2, 1598, 9759, 2060, 23906, 2, 380, 22154, 1678, 37159, 2, 1192, 30297, 1384, 39391, 1, 4083, 15725, 2, 1156, 60439, 2234, 59055, 4, 1185, 17639, 1572, 5170, 4377, 56387, 4409, 6314, 1, 2492, 50338, 1, 347, 15516, 2, 263, 25686, 1841, 1108, 2, 3440, 8280, 4147, 30530, 1, 375, 8277, 1, 2656, 57538, 1, 3929, 56945, 1, 5126, 23011, 3, 1570, 17261, 1860, 7350, 3908, 42800, 1, 703, 11593, 2, 871, 49169, 4381, 24809, 1, 634, 4881, 2, 620, 10214, 931, 55151, 1, 4645, 51077, 3, 1450, 54357, 1470, 4246, 2815, 56461, 3, 2816, 59961, 3423, 45482, 3924, 59598, 1, 3533, 27091, 1, 2359, 46461, 2, 2022, 16628, 3058, 47047, 1, 2299, 23929, 2, 173, 36340, 4188, 26517, 1, 190, 50018, 1, 4115, 50158, 3, 565, 18898, 846, 26601, 2073, 962, 1, 2827, 58356, 1, 2362, 17603, 2, 2535, 37723, 3439, 4378, 1, 1628, 8838, 1, 1635, 64024, 2, 3880, 43043, 5114, 49101, 1, 3061, 57856, 2, 740, 30775, 2675, 32501, 2, 1232, 5824, 2765, 13945, 1, 3943, 27184, 1, 2275, 5625, 2, 1039, 2405, 3007, 21960, 3, 1479, 12144, 4044, 31960, 4242, 7404, 2, 1503, 27858, 3957, 54611, 2, 107, 15170, 1353, 5121, 1, 1021, 4397, 1, 4481, 7125, 2, 1577, 3195, 3827, 17244, 1, 4206, 57985, 1, 2023, 24956, 2, 3117, 49754, 3801, 31960, 1, 1408, 61958, 1, 5177, 13759, 3, 2458, 58474, 4195, 42484, 5217, 13759, 1, 5257, 13759, 7, 332, 49585, 1079, 50028, 1440, 31055, 2371, 32528, 3147, 41529, 3787, 65008, 5297, 13759, 1, 5337, 13759, 2, 933, 65127, 5377, 13759, 2, 5417, 13759, 5498, 29925, 5, 2678, 4426, 3385, 39349, 3544, 9913, 5457, 13759, 5538, 29925, 2, 3825, 21817, 5578, 29925, 2, 4006, 52684, 5618, 29925, 1, 5658, 29925, 2, 1865, 55409, 5698, 29925, 3, 2785, 390, 4162, 39266, 5738, 29925, 2, 25, 65322, 3114, 47992, 2, 762, 49021, 2197, 40744, 1, 1579, 25536, 1, 2078, 14257, 1, 1927, 44004, 1, 1544, 30834, 1, 5136, 61217, 1, 273, 28572, 2, 2612, 41222, 4695, 17014, 1, 778, 63102, 2, 277, 25966, 1367, 37611, 2, 2735, 34094, 4049, 61119, 3, 2031, 59664, 3055, 18123, 4249, 5715, 2, 2541, 27442, 3189, 9012, 2, 699, 5251, 2595, 36394, 1, 3173, 7152, 1, 4667, 37965, 2, 4281, 34796, 4463, 57944, 3, 150, 3800, 2160, 9998, 3172, 2131, 3, 455, 19569, 2405, 19418, 3000, 33378, 1, 3904, 57893, 1, 2183, 30161, 2, 1684, 32794, 4211, 12861, 2, 385, 9922, 3059, 25878, 4, 1456, 28726, 2213, 12806, 3309, 38052, 3390, 42347, 1, 3037, 53577, 2, 1095, 34466, 1879, 64468, 1, 3221, 52650, 1, 3515, 47232, 2, 1855, 26817, 3749, 43442, 1, 2665, 59609, 3, 2438, 32194, 4349, 6383, 4664, 59602, 2, 1851, 45935, 4351, 18489, 3, 796, 29460, 2100, 54797, 3414, 8980, 1, 1535, 62491, 1, 1788, 50915, 3, 726, 12151, 2754, 37452, 4660, 57494, 2, 1533, 12046, 2712, 18752, 1, 379, 58831, 1, 3288, 18908, 1, 195, 4772, 1, 3458, 40440, 2, 1793, 3294, 3202, 30440, 1, 2594, 49495, 1, 5465, 36341, 2, 2332, 20454, 5505, 36341, 4, 2062, 24572, 4007, 5370, 4355, 53811, 5545, 36341, 2, 4174, 25303, 5585, 36341, 1, 5625, 36341, 1, 5665, 36341, 2, 1073, 31306, 5705, 36341, 2, 705, 49273, 948, 27881, 3, 1888, 2987, 2875, 59811, 5147, 9309, 2, 2081, 31647, 5187, 9309, 2, 4728, 46876, 5227, 9309, 2, 4754, 46876, 5267, 9309, 3, 1498, 23078, 4780, 46876, 5307, 9309, 3, 2677, 7662, 4806, 46876, 5347, 9309, 2, 4832, 46876, 5387, 9309, 2, 4858, 46876, 5427, 9309, 1, 4884, 46876, 1, 4910, 46876, 1, 3349, 58873, 2, 3670, 42687, 4064, 20277, 2, 960, 46069, 4164, 23342, 2, 961, 46069, 2800, 26515, 1, 3260, 16517, 3, 626, 18021, 2655, 36014, 3734, 27973, 1, 1815, 13664, 3, 1037, 33602, 1214, 4170, 2719, 48923, 1, 2768, 49392, 2, 1339, 39442, 1486, 58762, 1, 1445, 15007, 1, 3605, 29597, 2, 696, 4069, 1763, 15255, 1, 2316, 58319, 4, 1023, 36113, 1728, 7485, 2604, 52587, 3505, 29090, 2, 2244, 17612, 3990, 3241, 2, 2472, 60525, 4038, 52742, 1, 3031, 31799, 1, 1529, 37783, 1, 1468, 48921, 2, 911, 56284, 1918, 28849, 2, 2200, 31376, 5142, 42926, 1, 4655, 39577, 1, 2187, 49739, 2, 849, 52322, 2456, 25355, 1, 4934, 14108, 2, 1658, 31932, 4960, 14108, 5, 3266, 24587, 3794, 4682, 4682, 39767, 4986, 14108, 5120, 21194, 1, 5012, 14108, 2, 4140, 43416, 5038, 14108, 1, 5064, 14108, 1, 5090, 14108, 1, 2116, 14863, 1, 2433, 58262, 2, 2308, 2318, 3531, 28190, 1, 4266, 15534, 1, 122, 65526, 3, 1172, 33526, 2095, 26397, 2766, 19548, 2, 261, 20005, 2650, 4905, 1, 3526, 20633, 2, 1701, 33286, 4030, 41812, 1, 42, 5027, 2, 301, 23803, 1619, 35085, 1, 1329, 53733, 3, 4129, 34093, 4434, 65381, 4456, 63133, 1, 3436, 14618, 1, 2424, 18626, 2, 1441, 23388, 3024, 11862, 1, 1609, 51926, 2, 47, 25674, 2381, 34040, 2, 76, 19431, 1293, 58455, 2, 1201, 26460, 2007, 9859, 3, 1187, 179, 3463, 39969, 3865, 52683, 1, 4384, 44472, 2, 153, 9955, 1524, 47114, 3, 2461, 14279, 2949, 27085, 4048, 50115, 1, 4259, 24217, 1, 1871, 47881, 2, 1603, 3533, 4378, 45889, 2, 2135, 18793, 4447, 8369, 1, 4629, 30395, 2, 1231, 11205, 1985, 41251, 1, 4688, 15813, 4, 1053, 29737, 1163, 31721, 3257, 2791, 3546, 17977, 1, 807, 65267, 1, 3790, 36459, 1, 1372, 11917, 3, 185, 24762, 3492, 3413, 4063, 24043, 1, 3008, 6414, 1, 3304, 53266, 2, 3738, 37320, 4917, 1877, 2, 3350, 42463, 4943, 1877, 1, 4969, 1877, 3, 667, 25426, 3100, 49440, 4995, 1877, 2, 3277, 37379, 5021, 1877, 2, 270, 53007, 5047, 1877, 4, 2794, 41178, 3199, 54304, 3916, 61149, 5073, 1877, 2, 4704, 12838, 5475, 50444, 3, 1796, 4080, 4730, 12838, 5515, 50444, 3, 3970, 46308, 4756, 12838, 5555, 50444, 4, 1223, 19397, 3729, 3829, 4782, 12838, 5595, 50444, 4, 2042, 24609, 4209, 39562, 4808, 12838, 5635, 50444, 2, 4834, 12838, 5675, 50444, 4, 1004, 3205, 2608, 22686, 4860, 12838, 5715, 50444, 1, 4886, 12838, 1, 2799, 48658, 1, 4625, 42660, 3, 855, 38769, 1983, 8837, 4238, 31967, 2, 2913, 62005, 3897, 1008, 4, 216, 54398, 965, 15977, 3655, 42346, 4442, 28067, 1, 4724, 35064, 2, 3931, 51635, 4750, 35064, 3, 1494, 28823, 2237, 44383, 4776, 35064, 3, 2184, 12881, 4566, 5708, 4802, 35064, 2, 3964, 4875, 4828, 35064, 1, 4854, 35064, 4, 441, 44464, 1204, 30817, 1878, 26715, 4880, 35064, 2, 3899, 32125, 4906, 35064, 1, 4072, 50276, 1, 1898, 32517, 1, 2251, 24663, 1, 2121, 30693, 1, 2522, 36578, 1, 951, 27140, 1, 2590, 53755, 4, 50, 13658, 1280, 5848, 2550, 38732, 4247, 39828, 1, 2036, 6881, 1, 1099, 16279, 1, 2579, 64670, 2, 1818, 35223, 4180, 4825, 1, 1513, 59741, 1, 3767, 20097, 1, 3480, 54956, 3, 396, 47051, 3946, 13993, 4389, 52384, 3, 2317, 2730, 2705, 29641, 3867, 29959, 4, 1286, 6400, 3508, 32118, 4235, 44824, 4620, 64213, 1, 1134, 5142, 1, 2891, 50821, 1, 4706, 30382, 1, 4732, 30382, 1, 4758, 30382, 3, 592, 3715, 2709, 51994, 4784, 30382, 4, 1127, 15790, 2331, 2381, 3795, 16020, 4810, 30382, 2, 968, 48558, 4836, 30382, 3, 497, 1529, 1165, 29729, 4862, 30382, 3, 1663, 54466, 4433, 38159, 4888, 30382, 1, 1087, 26208, 1, 4191, 8168, 6, 1150, 48030, 1686, 23865, 2942, 20151, 3700, 62713, 3879, 51729, 4475, 28270, 1, 1098, 63499, 1, 378, 15808, 1, 2926, 4179, 2, 172, 30206, 2952, 14516, 1, 304, 18700, 2, 717, 15282, 1349, 50097, 2, 1020, 52419, 3249, 5612, 3, 145, 20773, 3087, 23925, 4318, 65249, 1, 3503, 1662, 1, 3788, 59621, 1, 4028, 12017, 1, 4671, 26247, 1, 109, 15170, 2, 2373, 4474, 2542, 24421, 1, 4075, 32402, 1, 1834, 29647, 2, 1285, 20609, 2696, 62876, 3, 1152, 36969, 1351, 50983, 5761, 39848, 2, 645, 35098, 4008, 18623, 1, 3347, 15195, 2, 701, 40520, 1186, 19247, 2, 3826, 23829, 3992, 34823, 2, 474, 37776, 5469, 50402, 1, 5509, 50402, 1, 5549, 50402, 3, 1708, 33231, 2030, 55360, 5589, 50402, 2, 3035, 58942, 5629, 50402, 5, 127, 59648, 771, 36433, 3065, 41475, 3835, 57855, 5669, 50402, 1, 5709, 50402, 2, 1161, 24798, 3444, 64212, 1, 1062, 27480, 3, 191, 5157, 2664, 9479, 2671, 63466, 1, 10, 61023, 2, 1770, 48703, 2269, 29966, 1, 1425, 50814, 2, 1574, 56536, 3342, 31521, 5, 1136, 27979, 1908, 51913, 2918, 10878, 3348, 4391, 4589, 42803, 2, 2643, 27978, 3487, 17664, 1, 2174, 20942, 2, 1746, 59258, 2072, 13700, 4, 1856, 25960, 1976, 2745, 3798, 19484, 4727, 51942, 4, 2894, 17510, 3213, 55057, 3270, 47738, 4753, 51942, 2, 4202, 24199, 4779, 51942, 3, 1861, 16272, 2150, 51384, 4805, 51942, 2, 1562, 392, 4831, 51942, 2, 1401, 36135, 4857, 51942, 1, 4883, 51942, 2, 1991, 41022, 4909, 51942, 1, 2054, 42610, 1, 545, 31758, 1, 3305, 29425, 2, 448, 29798, 4271, 8170, 1, 449, 29798, 1, 711, 24099, 1, 4461, 7568, 1, 836, 22542, 1, 906, 60765, 2, 1515, 20330, 2941, 23007, 1, 637, 32281, 2, 1551, 62318, 4017, 9391, 1, 4478, 43238, 2, 639, 32587, 3768, 35288, 2, 1591, 60893, 2966, 25793, 1, 3534, 12412, 1, 1680, 5536, 1, 4422, 57729, 2, 650, 8133, 1049, 53689, 1, 82, 20454, 4, 1720, 52188, 3994, 50995, 4623, 5886, 5144, 59438, 2, 470, 15402, 2404, 24950, 1, 2161, 36530, 1, 2414, 43858, 2, 4117, 27406, 4200, 16429, 1, 3367, 5419, 1, 725, 31503, 1, 3797, 60703, 2, 1262, 64678, 4451, 41981, 1, 3647, 2048, 3, 308, 61166, 2145, 12252, 2296, 34645, 1, 2204, 21699, 6, 793, 28300, 1849, 56155, 1990, 53142, 3529, 4952, 4258, 7632, 5174, 42137, 2, 315, 8450, 5214, 42137, 3, 425, 8874, 3554, 55420, 5254, 42137, 2, 1265, 65432, 5294, 42137, 1, 5334, 42137, 2, 859, 43855, 5374, 42137, 2, 2568, 35584, 5414, 42137, 1, 5454, 42137, 1, 1322, 37347, 2, 115, 6073, 4208, 25552, 1, 2518, 7210, 1, 2817, 3068, 1, 3454, 57393, 4, 106, 65064, 2226, 136, 2843, 9650, 3459, 6668, 1, 477, 47761, 1, 290, 49357, 1, 478, 47761, 1, 3009, 27868, 2, 1423, 59069, 3764, 30062, 1, 4077, 49992, 2, 3222, 49346, 4646, 10948, 1, 3851, 41907, 1, 2056, 42985, 1, 4407, 60345, 1, 2554, 29888, 4, 197, 10120, 956, 10258, 1984, 49691, 2168, 53209, 1, 559, 35392, 2, 810, 14413, 1335, 10714, 3, 1229, 8618, 1813, 19161, 3858, 40520, 3, 196, 20527, 4927, 20195, 5128, 9757, 3, 2961, 38715, 3022, 20133, 4953, 20195, 2, 502, 6221, 4979, 20195, 4, 1996, 43858, 4425, 13668, 4651, 26949, 5005, 20195, 1, 5031, 20195, 1, 5057, 20195, 2, 670, 9457, 5083, 20195, 3, 750, 20884, 2390, 3779, 4157, 6456, 1, 3483, 58961, 3, 609, 16576, 2430, 62425, 2455, 61894, 1, 3308, 43137, 1, 390, 38115, 4, 1687, 23873, 2826, 24854, 4121, 3963, 4538, 23315, 3, 2724, 33033, 2813, 39857, 2853, 11642, 1, 186, 7834, 3, 182, 31091, 485, 59886, 2216, 33259, 2, 1775, 54252, 4304, 1949, 1, 4490, 31281, 2, 1589, 32066, 4609, 51343, 1, 1764, 24348, 1, 4558, 42255, 1, 1733, 59923, 2, 957, 10258, 2987, 46497, 1, 2495, 62516, 1, 3953, 3384, 1, 420, 10684, 1, 4305, 11044, 2, 2965, 13392, 4608, 54007, 2, 1237, 17711, 4532, 13982, 1, 1273, 64614, 1, 2832, 1724, 1, 1398, 51802, 1, 3784, 22099, 1, 1654, 47398, 2, 1566, 27884, 4267, 24280, 2, 1504, 39103, 1824, 57292, 1, 2964, 20135, 2, 149, 2050, 296, 43546, 2, 213, 60554, 2615, 53036, 1, 90, 36166, 3, 1689, 38680, 2543, 11736, 4047, 35356, 2, 3233, 16483, 3954, 57055, 1, 3437, 14218, 1, 3020, 5984, 1, 3942, 58445, 1, 1638, 49698, 2, 1236, 24723, 1819, 41600, 2, 2901, 48096, 4617, 1715, 2, 1433, 58624, 1828, 59085, 3, 2898, 36867, 3325, 26024, 4690, 13884, 2, 1650, 36993, 4924, 46721, 2, 1304, 56720, 4950, 46721, 4, 1345, 50235, 1832, 12322, 4644, 11151, 4976, 46721, 2, 2113, 6474, 5002, 46721, 3, 524, 63297, 1356, 13153, 5028, 46721, 2, 1082, 53527, 5054, 46721, 4, 852, 52348, 1809, 38807, 2418, 49999, 5080, 46721, 3, 1620, 59133, 3322, 16451, 4637, 10640, 1, 4265, 44154, 2, 3627, 52617, 5167, 53860, 3, 3014, 34649, 3188, 32011, 5207, 53860, 3, 9, 28902, 546, 19875, 5247, 53860, 2, 2560, 57095, 5287, 53860, 7, 540, 25423, 1264, 45064, 1988, 52305, 2224, 55045, 3082, 26425, 3329, 31483, 5327, 53860, 2, 2572, 36037, 5367, 53860, 2, 2774, 23314, 5407, 53860, 1, 5447, 53860, 1, 577, 40097, 2, 1822, 11857, 2500, 7784, 1, 1734, 20669, 1, 2480, 58793, 1, 4564, 53208, 1, 1716, 39563, 1, 202, 2601, 2, 1567, 26968, 4383, 9116, 1, 322, 31308, 1, 238, 3502, 2, 102, 15725, 4288, 37744, 1, 3674, 2127, 1, 1327, 36073, 1, 590, 27217, 3, 3646, 22486, 3775, 47886, 4648, 42143, 1, 52, 20221, 2, 528, 28331, 3844, 20531, 1, 1254, 28918, 1, 563, 63596, 1, 862, 33156, 3, 1131, 43496, 2629, 50119, 3251, 25128, 3, 346, 39597, 1527, 36400, 4680, 12836, 1, 3852, 9231, 1, 4701, 57180, 3, 1897, 32355, 1978, 10686, 3965, 46492, 3, 1571, 61757, 2238, 36078, 3777, 63075, 1, 2839, 11960, 1, 2652, 64453, 1, 1627, 3618, 3, 355, 48827, 4128, 17262, 5474, 59336, 1, 5514, 59336, 1, 5554, 59336, 1, 5594, 59336, 3, 962, 15241, 2092, 6388, 5634, 59336, 2, 963, 15241, 5674, 59336, 3, 175, 5275, 3019, 56998, 5714, 59336, 1, 866, 60130, 1, 3018, 26508, 1, 463, 3140, 1, 3747, 32477, 1, 735, 31638, 1, 4613, 32360, 2, 1624, 51849, 3684, 13877, 2, 1643, 55141, 4462, 23132, 1, 2047, 63757, 4, 895, 30736, 1360, 41014, 2861, 6788, 5168, 59846, 3, 3122, 49033, 3197, 57580, 5208, 59846, 2, 3245, 33198, 5248, 59846, 2, 3156, 64351, 5288, 59846, 2, 676, 57537, 5328, 59846, 1, 5368, 59846, 5, 193, 22512, 3010, 18709, 3108, 11069, 3821, 50761, 5408, 59846, 2, 1126, 57375, 5448, 59846, 2, 2890, 30964, 4357, 18419, 1, 389, 57334, 1, 4416, 9021, 2, 582, 27452, 737, 26692, 1, 2289, 19807, 1, 935, 28596, 2, 3046, 26857, 3918, 34439, 2, 2772, 10784, 3917, 47158, 1, 2795, 21224, 4, 686, 53587, 1877, 31890, 2575, 1271, 3151, 35336, 2, 1580, 10930, 4092, 8184, 1, 5163, 57122, 2, 3446, 39258, 5203, 57122, 1, 5243, 57122, 3, 1387, 53342, 2144, 10185, 5283, 57122, 3, 1421, 41828, 4494, 7035, 5323, 57122, 3, 1088, 12281, 4087, 33611, 5363, 57122, 1, 5403, 57122, 2, 160, 56913, 5443, 57122, 3, 2802, 62235, 3498, 12882, 4321, 33926, 2, 2050, 31502, 2215, 5594, 2, 2465, 31234, 2807, 41423, 2, 1143, 3589, 4084, 16048, 2, 387, 52106, 3184, 49538, 4, 394, 9807, 1629, 13503, 3847, 36393, 4106, 16671, 1, 718, 5041, 1, 275, 4278, 1, 4032, 4983, 2, 1086, 38965, 2929, 13356, 3, 267, 11602, 1748, 50802, 4574, 37975, 2, 2487, 51264, 4675, 857, 1, 2432, 30205, 1, 3083, 56181, 1, 320, 21533, 1, 1078, 31853, 4, 1067, 9771, 2240, 4572, 3561, 50618, 4253, 26075, 3, 2464, 11622, 3524, 23665, 3812, 57577, 1, 2427, 8407, 1, 4545, 57419, 2, 1461, 6883, 2176, 10841, 1, 1048, 23387, 3, 245, 40461, 603, 48425, 4272, 47954, 2, 3449, 26170, 5133, 43633, 3, 1972, 24854, 2627, 39677, 2865, 49243, 1, 4529, 15386, 1, 3735, 39960, 3, 1772, 31297, 3496, 31235, 4559, 16399, 1, 95, 11735, 2, 22, 58971, 3618, 59089, 1, 698, 55999, 2, 462, 61013, 1576, 57216, 1, 3320, 1881, 1, 683, 4316, 1, 4469, 55696, 1, 71, 52612, 2, 2034, 23585, 2315, 52044, 1, 2781, 50726, 1, 2392, 1513, 3, 2950, 50022, 3123, 57757, 3507, 980, 2, 1191, 45832, 1766, 62842, 1, 118, 22765, 1, 4588, 59991, 2, 1632, 58633, 3888, 9578, 2, 111, 22961, 1063, 32809, 2, 1106, 44751, 3405, 11611, 1, 1160, 49024, 3, 788, 30732, 1447, 41738, 2205, 16694, 1, 4436, 57384, 1, 986, 65131, 1, 3218, 53992, 1, 1560, 42453, 1, 2791, 37491, 2, 3478, 43267, 4039, 3129, 2, 1853, 51925, 2958, 54304, 2, 1779, 26319, 4347, 26509, 2, 2141, 10573, 3175, 40281, 1, 2988, 23628, 1, 2310, 19350, 2, 3204, 26081, 4693, 620, 2, 2914, 6259, 3939, 36681, 5, 19, 45656, 917, 37900, 1451, 21152, 1489, 5952, 3155, 39173, 1, 4654, 8122, 4, 742, 27047, 2350, 14524, 2557, 50411, 4525, 47531, 1, 1038, 8618, 1, 271, 928, 4, 49, 17788, 1973, 51034, 2937, 36875, 4181, 60130, 2, 1125, 40317, 1305, 7911, 1, 1704, 31032, 3, 2973, 24984, 3392, 16021, 4395, 35964, 2, 228, 64022, 2190, 53812, 1, 3170, 21123, 2, 523, 24026, 1830, 61935, 1, 4067, 53203, 2, 81, 11652, 3312, 7687, 1, 2507, 33613, 2, 1437, 34431, 2892, 21740, 1, 2653, 39658, 2, 930, 64043, 1299, 60546, 1, 2573, 14619, 1, 1721, 14230, 2, 3656, 33269, 3856, 51360, 1, 4114, 17353, 2, 337, 8393, 4652, 55224, 1, 226, 46716, 4, 383, 36554, 1104, 41352, 1899, 33615, 2426, 50574, 2, 1838, 1474, 3427, 6226, 2, 285, 21899, 4080, 43604, 1, 4638, 10627, 1, 1610, 42985, 1, 3727, 33401, 2, 769, 55163, 1108, 23624, 1, 4055, 7373, 2, 2321, 55571, 3687, 41015, 2, 4018, 51428, 4605, 51563, 1, 4015, 42312, 1, 264, 18914, 1, 2402, 39305, 1, 5162, 42399, 1, 5202, 42399, 2, 566, 267, 5242, 42399, 1, 5282, 42399, 2, 3941, 32507, 5322, 42399, 3, 1605, 23932, 3911, 37659, 5362, 42399, 1, 5402, 42399, 2, 1354, 56194, 5442, 42399, 1, 1110, 15950, 1, 3934, 28137, 2, 1238, 28256, 4263, 35600, 1, 876, 32344, 1, 4269, 26896, 2, 4524, 26622, 4556, 31181, 1, 2342, 15310, 2, 2259, 59925, 2733, 51881, 1, 3850, 9180, 1, 2552, 4121, 2, 3289, 45394, 3760, 18597, 1, 2979, 64212, 3, 1472, 2270, 2343, 50078, 4123, 6837, 2, 3518, 10667, 4193, 65531, 3, 1657, 56372, 3169, 2382, 3555, 38498, 2, 2166, 28876, 2598, 63825, 1, 2828, 56453, 1, 3567, 29119, 4, 162, 44684, 627, 34794, 2076, 58199, 4052, 22990, 1, 643, 56959, 3, 3056, 34179, 3096, 49025, 3686, 2398, 3, 2352, 54240, 2531, 25526, 5179, 37428, 1, 5219, 37428, 2, 3321, 55182, 5259, 37428, 2, 1474, 62275, 5299, 37428, 2, 3551, 21145, 5339, 37428, 4, 335, 34671, 2428, 3991, 4019, 19948, 5379, 37428, 1, 5419, 37428, 4, 2967, 46305, 3863, 61106, 4710, 34272, 5459, 37428, 2, 709, 27881, 4736, 34272, 4, 5, 24899, 843, 36623, 4762, 34272, 5141, 55732, 1, 4788, 34272, 5, 1409, 37500, 3971, 8366, 4186, 6842, 4421, 17221, 4814, 34272, 3, 1060, 64033, 1946, 64522, 4840, 34272, 2, 3285, 56536, 4866, 34272, 1, 4892, 34272, 2, 1604, 65066, 4565, 29407, 1, 3757, 14515, 1, 4653, 53767, 1, 4090, 8243, 2, 987, 48068, 1449, 39621, 1, 600, 53027, 4, 1005, 6670, 1458, 21524, 2647, 18872, 3216, 12304, 1, 1531, 44690, 1, 1463, 38179, 3, 720, 24673, 1602, 57657, 4719, 20471, 2, 476, 60390, 4745, 20471, 2, 3928, 28711, 4771, 20471, 1, 4797, 20471, 2, 4473, 62994, 4823, 20471, 1, 4849, 20471, 1, 4875, 20471, 1, 4901, 20471, 1, 2020, 28257, 4, 244, 64296, 1874, 17244, 2855, 2099, 2995, 3496, 1, 2886, 26913, 2, 949, 22224, 1696, 46242, 1, 4197, 55000, 1, 4183, 33537, 1, 4554, 34284, 2, 3574, 64168, 4406, 16012, 2, 896, 19661, 3069, 21454, 1, 156, 60087, 1, 4010, 49194, 3, 323, 59165, 3326, 52867, 4216, 38568, 3, 1434, 42832, 2075, 29140, 2267, 23040, 1, 221, 19872, 2, 1257, 35520, 1932, 43949, 1, 3963, 43460, 1, 5471, 13051, 2, 424, 40472, 5511, 13051, 3, 66, 60951, 1417, 1772, 5551, 13051, 3, 708, 2584, 738, 20723, 5591, 13051, 4, 381, 42986, 941, 13656, 1601, 31204, 5631, 13051, 4, 783, 13471, 2968, 43395, 3583, 15598, 5671, 13051, 1, 5711, 13051, 3, 2138, 59009, 2686, 42204, 4126, 23431, 1, 989, 64927, 1, 2953, 11745, 1, 534, 14479, 1, 4366, 33317, 1, 5485, 47091, 3, 1478, 17117, 2171, 36094, 5525, 47091, 3, 2108, 52412, 2382, 24497, 5565, 47091, 3, 1217, 53982, 2622, 64607, 5605, 47091, 1, 5645, 47091, 1, 5685, 47091, 3, 2490, 47234, 2497, 45452, 5725, 47091, 1, 4570, 56320, 1, 3351, 28235, 1, 2338, 27398, 2, 681, 38521, 3212, 23519, 2, 3223, 18812, 3650, 51992, 2, 2824, 2219, 3162, 44084, 2, 2558, 354, 4346, 22737, 1, 1029, 43854, 3, 1030, 35849, 1924, 61825, 2823, 38211, 2, 2591, 17863, 3265, 44237, 1, 4093, 65176, 2, 510, 8791, 3525, 15298, 4, 511, 8791, 840, 2864, 2750, 50537, 3411, 5494, 1, 4926, 23087, 3, 2907, 62926, 4952, 23087, 5159, 38674, 3, 4218, 15305, 4978, 23087, 5199, 38674, 6, 218, 50447, 1670, 16592, 1758, 35413, 3998, 56124, 5004, 23087, 5239, 38674, 2, 5030, 23087, 5279, 38674, 5, 237, 4871, 255, 34671, 2537, 24415, 5056, 23087, 5319, 38674, 3, 1396, 34981, 5082, 23087, 5359, 38674, 1, 5399, 38674, 1, 5439, 38674, 1, 278, 30758, 4, 407, 39877, 1806, 56993, 2529, 14258, 4619, 13480, 3, 2704, 36765, 3368, 13730, 4150, 53648, 2, 3208, 18222, 4255, 43180, 1, 2525, 8331, 2, 427, 41233, 2638, 33524, 1, 4585, 3585, 1, 1778, 30239, 3, 125, 61274, 830, 63901, 1956, 48256, 1, 4523, 56089, 2, 1967, 47250, 4466, 27011, 2, 350, 54392, 3013, 14110, 1, 673, 23819, 1, 2214, 40475, 1, 2293, 19570, 1, 3715, 22053, 2, 246, 53242, 1986, 3958, 3, 2439, 4655, 3822, 32352, 3834, 49972, 1, 2378, 13421, 1, 618, 21816, 2, 1256, 17556, 2821, 22471, 1, 2873, 50124, 1, 924, 22068, 1, 2301, 22476, 1, 503, 8886, 1, 4294, 19436, 1, 1773, 10110, 1, 2850, 40983, 2, 624, 47766, 2410, 61262, 1, 4401, 3921, 1, 4666, 16949, 1, 3078, 40615, 1, 2040, 41960, 1, 3514, 47038, 1, 842, 9667, 3, 984, 52415, 3377, 49767, 4537, 28205, 1, 5134, 17164, 2, 2835, 43056, 3718, 36085, 1, 2730, 37590, 1, 954, 49235, 1, 4581, 29943, 1, 2252, 4261, 2, 1373, 59313, 2423, 5725, 2, 35, 18807, 1886, 24059, 1, 2570, 20291, 1, 2935, 46502, 1, 4240, 56842, 1, 251, 25805, 2, 636, 39129, 4590, 20481, 5, 587, 14946, 1875, 49315, 1974, 50003, 2555, 59103, 3842, 25738, 1, 2702, 39134, 1, 1338, 62960, 1, 2098, 29133, 4, 139, 30977, 2437, 36075, 3149, 57674, 4270, 31451, 1, 2003, 14532, 2, 3422, 24570, 4194, 31336, 2, 1928, 36844, 3023, 37532, 1, 3758, 3472, 1, 1326, 51830, 1, 2208, 60427, 1, 2641, 45766, 1, 1935, 24763, 3, 536, 46733, 1194, 47568, 3982, 30027, 4, 733, 62726, 1519, 65304, 3497, 23608, 4562, 62771, 2, 719, 53647, 1787, 12652, 2, 955, 49235, 3198, 34314, 1, 3134, 32903, 2, 2943, 64671, 3958, 28997, 1, 4361, 41428, 1, 1555, 13141, 2, 3991, 42598, 4171, 53867, 1, 1540, 45574, 1, 4136, 62391, 1, 1717, 18132, 3, 1901, 54126, 2632, 20521, 3341, 12816, 2, 746, 7601, 4476, 10969, 1, 2903, 40420, 1, 2864, 11625, 2, 200, 49484, 4302, 17331, 1, 1651, 5774, 1, 2347, 55961, 1, 506, 45567, 1, 2912, 15232, 1, 5171, 43632, 2, 2618, 56853, 5211, 43632, 2, 3203, 44208, 5251, 43632, 1, 5291, 43632, 2, 3930, 8172, 5331, 43632, 1, 5371, 43632, 1, 5411, 43632, 4, 1749, 3086, 2125, 46396, 3864, 2208, 5451, 43632, 1, 4091, 5622, 2, 3773, 15334, 4107, 59332, 2, 1448, 32952, 5129, 56406, 1, 4711, 43911, 1, 4737, 43911, 2, 3026, 37849, 4763, 43911, 2, 1937, 21082, 4789, 43911, 1, 4815, 43911, 6, 675, 45970, 1867, 42678, 2546, 63519, 4260, 27105, 4841, 43911, 5118, 11743, 2, 2757, 32593, 4867, 43911, 2, 3053, 48952, 4893, 43911, 1, 1100, 59441, 2, 4467, 30957, 5492, 46703, 3, 1862, 12478, 3740, 8213, 5532, 46703, 1, 5572, 46703, 3, 2710, 15183, 3839, 63297, 5612, 46703, 4, 144, 41740, 2024, 40175, 2444, 43585, 5652, 46703, 1, 5692, 46703, 1, 5732, 46703, 1, 4369, 20466, 1, 4365, 31654, 1, 4640, 57715, 3, 411, 20679, 2683, 33576, 3698, 3467, 2, 133, 54960, 2977, 62908, 1, 317, 6342, 2, 2028, 53020, 3705, 48673, 2, 1858, 60837, 4569, 16512, 1, 4148, 64254, 1, 1149, 54540, 2, 439, 54753, 3987, 15348, 1, 3495, 3189, 1, 3951, 54059, 2, 1509, 6973, 1859, 36791, 1, 321, 4190, 2, 258, 30590, 1953, 53383, 3, 585, 15519, 2587, 28218, 3894, 50461, 1, 1808, 1052, 2, 2851, 17624, 4437, 64807, 2, 3195, 39993, 3506, 21416, 1, 2398, 3982, 2, 1228, 23685, 2420, 37318, 1, 5155, 7486, 2, 2170, 51662, 5195, 7486, 3, 2512, 18365, 4045, 45267, 5235, 7486, 3, 1307, 5993, 3612, 27723, 5275, 7486, 3, 985, 64545, 1644, 59884, 5315, 7486, 1, 5355, 7486, 3, 2463, 4429, 2666, 28932, 5395, 7486, 2, 4285, 63484, 5435, 7486, 2, 2393, 51623, 3066, 41613, 1, 715, 50504, 2, 408, 46067, 4160, 38424, 3, 3742, 46717, 3761, 47873, 3898, 571, 1, 3644, 45099, 1, 4676, 48116, 3, 214, 54947, 553, 45878, 1606, 8609, 1, 5489, 19359, 1, 5529, 19359, 4, 351, 58227, 464, 41629, 2005, 44342, 5569, 19359, 1, 5609, 19359, 2, 1316, 13084, 5649, 19359, 1, 5689, 19359, 1, 5729, 19359, 1, 1022, 7104, 1, 4518, 46089, 3, 178, 11387, 1365, 38977, 4277, 7020, 3, 2088, 64539, 3452, 26205, 4287, 9484, 2, 3661, 29903, 4567, 10989, 1, 2137, 14115, 4, 451, 55682, 1656, 8221, 1747, 1228, 4722, 5895, 2, 3092, 51250, 4748, 5895, 4, 1389, 19448, 2726, 2549, 4120, 48663, 4774, 5895, 4, 1536, 44293, 2729, 10806, 3511, 30856, 4800, 5895, 4, 1058, 22696, 2477, 59669, 4415, 62955, 4826, 5895, 3, 2084, 32873, 3868, 38573, 4852, 5895, 3, 753, 33697, 3709, 31260, 4878, 5895, 2, 4394, 58342, 4904, 5895, 1, 3302, 50664, 1, 905, 4606, 2, 2658, 31310, 4725, 41419, 1, 4751, 41419, 1, 4777, 41419, 3, 297, 33996, 3870, 6371, 4803, 41419, 2, 2048, 36994, 4829, 41419, 3, 2010, 42748, 4855, 41419, 5166, 38472, 4, 2583, 36207, 3473, 10539, 4881, 41419, 5206, 38472, 4, 2341, 16531, 2484, 61512, 4907, 41419, 5246, 38472, 2, 1902, 56096, 5286, 38472, 3, 1, 48137, 1301, 17590, 5326, 38472, 1, 5366, 38472, 3, 864, 40683, 2090, 36736, 5406, 38472, 1, 5446, 38472, 3, 2242, 5907, 4076, 62772, 4513, 4173, 1, 58, 25514, 2, 1952, 14334, 2990, 24053, 1, 3754, 65118, 3, 1810, 15230, 3314, 1967, 4227, 17587, 1, 4362, 49276, 1, 3012, 24361, 4, 7, 1918, 467, 26948, 2037, 47858, 2938, 22177, 2, 2661, 46868, 3666, 18200, 3, 1347, 23196, 1386, 8989, 2761, 5117, 2, 2607, 41532, 3406, 26919, 2, 78, 38570, 3967, 36425, 3, 2364, 17416, 2421, 31153, 2956, 44582, 3, 1586, 60614, 3809, 41952, 4299, 36373, 1, 3593, 45766, 1, 2320, 25273, 2, 154, 13428, 3817, 7944, 1, 841, 55786, 1, 4178, 65124, 1, 2915, 33764, 3, 373, 6580, 1712, 5512, 2217, 28055, 1, 3523, 12440, 2, 3067, 2740, 3611, 54903, 1, 1700, 64935, 1, 3157, 25562, 2, 3163, 26745, 4647, 30115, 1, 1075, 48012, 1, 3476, 17993, 2, 152, 32504, 3519, 43448, 3, 668, 45886, 760, 27797, 2441, 23107, 2, 146, 48129, 4332, 8404, 1, 4029, 27910, 3, 137, 12222, 1225, 56754, 5470, 58280, 3, 1662, 16267, 1929, 33506, 5510, 58280, 2, 2127, 11591, 5550, 58280, 2, 4226, 30091, 5590, 58280, 2, 873, 21547, 5630, 58280, 1, 5670, 58280, 3, 325, 53389, 3052, 2142, 5710, 58280, 1, 235, 19254, 3, 119, 53695, 1969, 30262, 2223, 6857, 1, 612, 42897, 3, 283, 20355, 1142, 49113, 2014, 3456, 2, 552, 40694, 4385, 11365, 1, 1827, 55988, 2, 1241, 8822, 1743, 62300, 1, 3499, 3580, 2, 1403, 4965, 3915, 37110, 1, 1965, 24550, 2, 1481, 40674, 3420, 40700, 2, 2792, 30490, 3214, 43182, 1, 3669, 18573, 1, 2994, 36062, 1, 861, 40123, 1, 3443, 26117, 1, 591, 41786, 2, 3926, 18216, 4122, 42809, 1, 4661, 52927, 1, 2808, 50744, 1, 3688, 4806, 3, 1866, 3685, 3050, 30577, 3253, 63346, 2, 3626, 45806, 4929, 47296, 3, 1432, 39999, 3295, 25567, 4955, 47296, 2, 3889, 50890, 4981, 47296, 4, 2899, 61588, 3517, 17393, 4420, 51927, 5007, 47296, 3, 815, 20552, 3076, 62125, 5033, 47296, 1, 5059, 47296, 2, 1350, 11676, 5085, 47296, 1, 4577, 47344, 3, 272, 23991, 1959, 25670, 2969, 44340, 1, 3237, 57719, 1, 2569, 5006, 2, 1283, 5237, 4086, 644, 1, 2532, 35922, 4, 2155, 11146, 2515, 59776, 2644, 58501, 3011, 18372, 1, 4723, 23945, 1, 4749, 23945, 1, 4775, 23945, 2, 1545, 24676, 4801, 23945, 2, 1010, 28024, 4827, 23945, 4, 51, 33038, 1348, 12972, 1884, 45099, 4853, 23945, 1, 4879, 23945, 6, 286, 15831, 2186, 36648, 2680, 57088, 4105, 25213, 4314, 20837, 4905, 23945, 1, 2812, 63799, 2, 693, 36226, 3925, 57741, 1, 1977, 16177, 1, 3800, 59842, 2, 4201, 54821, 5130, 27077, 1, 2248, 61191, 2, 2326, 60810, 2372, 22592, 1, 886, 48853, 2, 3382, 4503, 5125, 19180, 1, 3159, 27337, 1, 4134, 39426, 1, 4203, 48871, 1, 4167, 30697, 3, 1336, 30525, 4177, 64561, 4435, 48510, 1, 2883, 6188, 1, 403, 23845, 3, 3381, 8809, 3475, 41922, 3728, 29734, 1, 4207, 24933, 1, 2466, 64323, 1, 4930, 63477, 2, 1207, 41615, 4956, 63477, 1, 4982, 63477, 2, 786, 39900, 5008, 63477, 3, 1469, 52226, 4074, 28028, 5034, 63477, 1, 5060, 63477, 1, 5086, 63477, 1, 248, 12834, 1, 3737, 36872, 1, 2470, 2916, 1, 2236, 18171, 2, 907, 63995, 1266, 49424, 5, 1583, 50415, 1943, 26886, 2720, 24087, 3269, 46392, 5488, 8848, 1, 5528, 8848, 2, 3648, 45290, 5568, 8848, 2, 1007, 49083, 5608, 8848, 3, 1275, 57315, 3360, 3131, 5648, 8848, 2, 4713, 26085, 5688, 8848, 4, 1045, 37670, 3153, 47100, 4739, 26085, 5728, 8848, 2, 4151, 17068, 4765, 26085, 3, 1840, 61144, 3604, 60891, 4791, 26085, 1, 4817, 26085, 1, 4843, 26085, 2, 942, 37657, 4869, 26085, 5, 513, 38326, 537, 31546, 1090, 6913, 3699, 54793, 4895, 26085, 1, 538, 31546, 2, 530, 31546, 5748, 19242, 1, 3692, 8484, 1, 4182, 14725, 2, 227, 2394, 2649, 46603, 1, 3230, 47606, 2, 1107, 8868, 3145, 21976, 3, 1196, 63089, 1649, 12311, 4726, 34188, 4, 423, 34958, 2742, 35894, 2867, 22849, 4752, 34188, 1, 4778, 34188, 2, 1251, 25968, 4804, 34188, 1, 4830, 34188, 4, 268, 3567, 1211, 40442, 3869, 50434, 4856, 34188, 1, 4882, 34188, 2, 1539, 31150, 4908, 34188, 1, 611, 48759, 2, 108, 19959, 4480, 38027, 2, 2233, 39849, 4488, 58721, 1, 3883, 57178, 2, 400, 62397, 4232, 25261, 1, 57, 26313, 1, 1066, 23839, 4, 657, 51223, 1036, 55652, 1482, 60909, 4312, 19367, 2, 1074, 9102, 4068, 34061, 2, 1500, 40713, 2280, 60734, 1, 2105, 13080, 1, 276, 65087, 3, 413, 40242, 1077, 60379, 4035, 27734, 2, 1757, 6071, 2586, 37872, 3, 2091, 4399, 2634, 22842, 2960, 5571, 2, 707, 52498, 1297, 12995, 2, 1144, 39587, 1659, 16230, 2, 2043, 8662, 2736, 2684, 5, 638, 25838, 3074, 16708, 4135, 26502, 4455, 25689, 5152, 15736, 1, 5192, 15736, 2, 3001, 36121, 5232, 15736, 4, 460, 20497, 1051, 42321, 1101, 37568, 5272, 15736, 1, 5312, 15736, 2, 194, 46167, 5352, 15736, 2, 305, 11984, 5392, 15736, 4, 1040, 40346, 1559, 47910, 2255, 31350, 5432, 15736, 4, 640, 42585, 3596, 23164, 3622, 23084, 4715, 52618, 1, 4741, 52618, 1, 4767, 52618, 3, 2249, 51547, 3301, 14338, 4793, 52618, 1, 4819, 52618, 1, 4845, 52618, 3, 1727, 40727, 2849, 21870, 4871, 52618, 3, 2446, 12730, 3428, 55334, 4897, 52618, 1, 28, 52003, 2, 1826, 61754, 2370, 42341, 4, 358, 20825, 561, 31650, 2630, 55375, 3166, 23737, 2, 1693, 63752, 5116, 25365, 2, 1260, 28544, 4600, 60334, 2, 929, 15830, 1595, 32042, 1, 1377, 36810, 3, 205, 9374, 1378, 36810, 2485, 44321, 2, 1379, 36810, 3617, 10465, 1, 595, 47871, 3, 307, 29685, 1320, 7310, 2797, 43320, 1, 3751, 15943, 1, 4141, 49654, 2, 1968, 51604, 4352, 35252, 1, 1276, 35191, 1, 4241, 33304, 2, 782, 29883, 922, 57990, 1, 1404, 55332, 1, 79, 50637, 3, 1325, 2051, 1414, 22054, 3570, 58494, 2, 1031, 26965, 4526, 55548, 1, 3501, 46073, 1, 1032, 18960, 2, 1221, 4878, 4054, 20159, 4, 1661, 9608, 1674, 59915, 1820, 57852, 3028, 16000, 1, 5472, 60552, 2, 3810, 54613, 5512, 60552, 2, 5105, 60935, 5552, 60552, 1, 5592, 60552, 2, 4597, 4469, 5632, 60552, 4, 2688, 6396, 2820, 50987, 4714, 63084, 5672, 60552, 2, 4740, 63084, 5712, 60552, 3, 3274, 41874, 4400, 43791, 4766, 63084, 1, 4792, 63084, 2, 1837, 60631, 4818, 63084, 1, 4844, 63084, 2, 2156, 44483, 4870, 63084, 1, 4896, 63084, 3, 1375, 11417, 1380, 36810, 3739, 61765, 1, 1381, 36810, 1, 1294, 6114, 1, 3294, 14973, 3, 247, 55853, 2401, 51876, 3595, 56305, 1, 1035, 10711, 2, 1631, 25011, 3762, 62949, 3, 2548, 12767, 2676, 45570, 2971, 10376, 1, 3124, 28562, 2, 2375, 21224, 4584, 8540, 1, 2449, 65162, 2, 1061, 52922, 5104, 25934, 3, 440, 7574, 1331, 58553, 4423, 38993, 1, 754, 15290, 1, 3989, 21043, 1, 3736, 64707, 2, 3073, 61521, 5178, 10836, 3, 1880, 20895, 4535, 46747, 5218, 10836, 4, 1242, 40973, 1272, 4867, 2872, 61158, 5258, 10836, 2, 1259, 64290, 5298, 10836, 2, 568, 26649, 5338, 10836, 1, 5378, 10836, 3, 2924, 21447, 3522, 44195, 5418, 10836, 2, 3968, 45632, 5458, 10836, 5, 223, 1478, 892, 8064, 1666, 57051, 4633, 20584, 5149, 61105, 2, 2620, 3225, 5189, 61105, 2, 1382, 36810, 5229, 61105, 1, 5269, 61105, 2, 2796, 50155, 5309, 61105, 3, 2058, 45886, 2928, 43202, 5349, 61105, 1, 5389, 61105, 3, 2201, 19916, 4236, 39939, 5429, 61105, 2, 2218, 17947, 2617, 32491, 2, 658, 1159, 756, 56196, 1, 1784, 19658, 1, 1505, 2410, 1, 583, 19113, 2, 1355, 45125, 2911, 28572, 1, 3310, 59084, 1, 4011, 36937, 1, 597, 40941, 2, 1493, 25419, 4669, 38712, 2, 2136, 39734, 3426, 1017, 2, 558, 48489, 2778, 5691, 3, 1738, 59363, 2158, 24892, 4696, 4150, 2, 945, 26484, 2739, 2826, 3, 294, 30636, 3268, 35487, 4663, 45352, 2, 2454, 61425, 4139, 19409, 1, 2876, 36887, 3, 2829, 43976, 3641, 10290, 3796, 24159, 1, 5468, 31740, 2, 1405, 13086, 5508, 31740, 2, 4635, 45877, 5548, 31740, 1, 5588, 31740, 1, 5628, 31740, 1, 5668, 31740, 4, 384, 41925, 1876, 52511, 2692, 42347, 5708, 31740, 1, 3070, 49513, 1, 4307, 35212, 2, 1553, 55200, 2562, 61086, 1, 4119, 26600, 1, 655, 61284, 3, 393, 54190, 3673, 59971, 4496, 59554, 1, 4036, 35949, 1, 1823, 14272, 1, 3811, 15711, 1, 748, 43886, 3, 593, 47307, 1248, 39222, 1342, 3560, 1, 3944, 16534, 1, 3431, 27830, 1, 4196, 25046, 1, 3512, 55598, 1, 1948, 26677, 2, 3733, 54146, 4376, 24928, 3, 496, 11988, 1926, 35271, 4234, 23943, 1, 4464, 60611, 2, 2440, 25198, 4528, 65223, 1, 1287, 22251, 4, 169, 35996, 621, 13266, 1364, 54734, 1454, 10848, 2, 2715, 32479, 4913, 2197, 1, 4939, 2197, 2, 2325, 32421, 4965, 2197, 1, 4991, 2197, 2, 3243, 16099, 5017, 2197, 1, 5043, 2197, 4, 161, 18788, 353, 55340, 1675, 64616, 5069, 2197, 2, 515, 38313, 4065, 55222, 1, 2706, 46896, 1, 1466, 31406, 2, 1328, 49389, 2566, 11139, 1, 4152, 16509, 1, 4547, 140, 3, 969, 20534, 3969, 40116, 4112, 9636, 1, 469, 5300, 2, 521, 24827, 543, 58935, 4, 520, 7102, 1340, 12586, 3384, 35391, 3906, 9277, 1, 3409, 13914, 1, 615, 48657, 1, 67, 44155, 6, 1216, 9463, 1792, 14225, 2292, 22848, 3936, 55478, 4413, 42010, 4616, 62817, 2, 988, 61033, 1920, 49545, 3, 1517, 229, 1993, 40583, 3976, 37315, 2, 1344, 8852, 2476, 51674, 1, 2902, 32883, 1, 1921, 31074, 2, 844, 7682, 950, 50767, 1, 2743, 45706, 1, 714, 23831, 2, 141, 7595, 2788, 2298, 2, 143, 18600, 2110, 15160, 2, 419, 8612, 2071, 48746, 2, 914, 50380, 4474, 56171, 2, 72, 55617, 799, 22342, 2, 2985, 27136, 3286, 12345, 1, 1617, 10832, 1, 1121, 35176, 1, 927, 14113, 4, 943, 18173, 2787, 24212, 2957, 5558, 3927, 50755, 1, 2279, 23988, 1, 3338, 58761, 2, 1782, 54623, 3997, 8876, 1, 4931, 3768, 3, 973, 52072, 3710, 15197, 4957, 3768, 4, 176, 3386, 1402, 17467, 3451, 30697, 4983, 3768, 1, 5009, 3768, 3, 3467, 1904, 3726, 15927, 5035, 3768, 2, 2411, 54521, 5061, 3768, 1, 5087, 3768, 2, 1882, 63565, 3485, 39015, 1, 994, 21408, 1, 3910, 12567, 1, 2597, 7658, 1, 4390, 9649, 1, 940, 28412, 2, 2101, 14606, 5119, 46848, 2, 2660, 5510, 3291, 1466, 2, 62, 19083, 641, 9427, 3, 56, 24707, 1155, 20866, 1756, 12378, 1, 198, 30858, 2, 292, 11547, 3890, 34063, 2, 87, 4780, 1836, 861, 2, 3081, 62914, 3569, 44525, 1, 3558, 42123, 2, 2153, 63104, 2749, 33073, 1, 3891, 24256, 2, 596, 16101, 4322, 63619, 2, 1801, 747, 4933, 56121, 2, 3841, 43364, 4959, 56121, 6, 774, 39642, 2498, 9640, 2592, 13082, 3364, 36394, 3691, 60381, 4985, 56121, 2, 2388, 12410, 5011, 56121, 3, 3609, 58080, 4296, 38513, 5037, 56121, 3, 2195, 40648, 2814, 47547, 5063, 56121, 2, 4632, 19328, 5089, 56121, 1, 4937, 23444, 4, 2151, 5298, 2921, 56114, 3259, 65501, 4963, 23444, 2, 1308, 7510, 4989, 23444, 1, 5015, 23444, 3, 2764, 1335, 4470, 15693, 5041, 23444, 2, 395, 61004, 5067, 23444, 1, 5093, 23444, 1, 372, 46660, 4, 727, 30709, 916, 61350, 1001, 13314, 2395, 44601, 1, 3190, 59178, 2, 2369, 46078, 3284, 55687, 1, 1141, 3283, 1, 3984, 21102, 2, 661, 19054, 4392, 6411, 1, 3281, 4870, 1, 2948, 40733, 2, 2779, 28536, 3400, 10824, 2, 2140, 18914, 3209, 11222, 2, 1115, 55552, 3712, 49564, 2, 1168, 17868, 4168, 6304, 3, 1714, 55466, 3799, 36756, 4487, 62795, 1, 117, 17546, 2, 1330, 29691, 3345, 58594, 1, 1522, 54000, 2, 777, 52957, 3161, 4308, 2, 8, 36679, 4166, 56955, 2, 3634, 26806, 3866, 10083, 1, 2635, 10492, 3, 1718, 34217, 3564, 19098, 4430, 2930, 1, 293, 923, 2, 579, 4744, 3838, 21243, 2, 165, 8519, 3432, 17426, 2, 772, 11283, 5157, 1292, 2, 2854, 4300, 5197, 1292, 2, 4445, 39749, 5237, 1292, 4, 1324, 2521, 4916, 52736, 5277, 1292, 5480, 11827, 4, 3587, 47122, 4942, 52736, 5317, 1292, 5520, 11827, 3, 4968, 52736, 5357, 1292, 5560, 11827, 3, 4994, 52736, 5397, 1292, 5600, 11827, 4, 3549, 19575, 5020, 52736, 5437, 1292, 5640, 11827, 4, 1637, 9723, 3469, 22343, 5046, 52736, 5680, 11827, 3, 2250, 62865, 5072, 52736, 5720, 11827, 2, 983, 25768, 3362, 45132, 5, 702, 15741, 2682, 57132, 3183, 5011, 3996, 19778, 4502, 32204, 2, 1785, 37889, 3895, 31319, 1, 2917, 11405, 2, 3238, 19175, 5103, 55082, 1, 2773, 6109, 1, 3057, 2693, 1, 2085, 16572, 1, 850, 19760, 2, 331, 55939, 1464, 11212, 4, 2029, 60224, 2262, 63875, 3256, 61866, 3391, 19958, 3, 1740, 27237, 2707, 21316, 3165, 25725, 2, 622, 54382, 2633, 26371, 2, 163, 24943, 234, 44118, 1, 3907, 55394, 1, 4210, 64610, 2, 792, 6465, 4118, 26659, 2, 3171, 15270, 3438, 43119, 1, 2467, 45515, 1, 5137, 12332, 1, 363, 3436, 2, 958, 45467, 1334, 18562, 1, 2959, 37445, 2, 1980, 31035, 4046, 52621, 1, 1512, 1367, 3, 1960, 32965, 2097, 23340, 3601, 52320, 1, 2021, 1382, 2, 1012, 7733, 1117, 1335, 2, 2328, 13892, 4658, 20205, 2, 158, 51386, 1652, 64281, 2, 1315, 50377, 2324, 5865, 1, 2468, 28874, 3, 73, 41330, 2763, 63359, 4923, 32474, 3, 1931, 43367, 2181, 7755, 4949, 32474, 1, 4975, 32474, 3, 490, 3220, 2909, 11021, 5001, 32474, 1, 5027, 32474, 2, 3589, 47440, 5053, 32474, 2, 1002, 6387, 5079, 32474, 3, 3552, 61022, 3932, 35968, 5749, 35567, 1, 2983, 24122, 6, 883, 63843, 936, 40328, 2631, 61255, 4429, 622, 4520, 36325, 4557, 35456, 1, 3229, 19043, 3, 274, 13498, 2639, 65473, 5151, 30184, 5, 863, 33160, 982, 59593, 2349, 64858, 3535, 22511, 5191, 30184, 4, 259, 47690, 1995, 5127, 3441, 51830, 5231, 30184, 3, 1290, 34673, 4014, 17310, 5271, 30184, 1, 5311, 30184, 2, 1532, 65152, 5351, 30184, 1, 5391, 30184, 5, 1064, 17211, 1148, 29496, 1829, 41146, 2858, 47012, 5431, 30184, 2, 2358, 8967, 2934, 24344, 2, 652, 63340, 3902, 57726, 1, 2199, 33847, 2, 1234, 28533, 1462, 14583, 2, 694, 28941, 2845, 45750, 2, 1076, 48078, 3401, 64423, 2, 2436, 45499, 2951, 55994, 1, 2231, 38808, 1, 2013, 28786, 1, 767, 45466, 4, 367, 65044, 1085, 10619, 2348, 42492, 4935, 10158, 1, 4961, 10158, 2, 644, 56603, 4987, 10158, 5, 2922, 28423, 3369, 61831, 3938, 55537, 4572, 21657, 5013, 10158, 2, 3045, 26710, 5039, 10158, 1, 5065, 10158, 3, 1465, 50264, 3005, 8985, 5091, 10158, 1, 3068, 61080, 2, 3121, 15674, 3278, 8281, 3, 24, 31121, 562, 41095, 2459, 43730, 2, 944, 29529, 1584, 52402, 1, 4686, 31755, 2, 1846, 54603, 2904, 47645, 1, 1428, 44176, 1, 3344, 13473, 2, 3616, 49454, 4023, 38543, 2, 1383, 60132, 1739, 8268, 1, 3805, 44374, 2, 4231, 23744, 4243, 60955, 1, 1111, 3250, 2, 1124, 7495, 2481, 41426, 1, 672, 25327, 3, 39, 55180, 2294, 61185, 4158, 25830, 1, 508, 9083, 2, 2287, 464, 4550, 55765, 2, 1664, 46786, 5473, 58263, 4, 1105, 56983, 1491, 22235, 3892, 24227, 5513, 58263, 1, 5553, 58263, 1, 5593, 58263, 3, 362, 54417, 4111, 268, 5633, 58263, 1, 5673, 58263, 1, 5713, 58263, 2, 12, 27877, 5486, 24406, 1, 5526, 24406, 3, 361, 48639, 3064, 34923, 5566, 24406, 4, 1046, 62321, 3771, 61214, 5606, 24406, 5757, 9940, 1, 5646, 24406, 1, 5686, 24406, 3, 2534, 55263, 3404, 20225, 5726, 24406, 1, 3398, 4313, 5, 1575, 27166, 1917, 57802, 1949, 29797, 4472, 17107, 4717, 36921, 1, 4743, 36921, 2, 472, 30233, 4769, 36921, 2, 934, 60768, 4795, 36921, 1, 4821, 36921, 1, 4847, 36921, 1, 4873, 36921, 2, 318, 26823, 4899, 36921, 1, 4673, 24644, 1, 18, 24583, 4, 120, 45106, 1193, 58122, 3366, 49562, 3581, 47552, 2, 712, 23671, 2584, 35765, 1, 4388, 37890, 2, 207, 12248, 2026, 24050, 1, 2725, 57371, 1, 1089, 25730, 1, 3346, 22924, 1, 147, 10592, 1, 2963, 62130, 2, 2805, 43380, 3084, 59620, 1, 2588, 59123, 3, 710, 20421, 1843, 18211, 3140, 6940, 3, 2057, 63992, 3983, 8683, 5107, 16169, 3, 230, 45668, 1905, 57266, 2180, 12307, 2, 2888, 11635, 3399, 25744, 1, 376, 8419, 5, 412, 29110, 887, 27703, 1298, 27055, 2033, 38532, 2305, 50561, 3, 250, 58908, 1677, 25167, 2756, 33025, 1, 4505, 40285, 3, 344, 12224, 2163, 65518, 2662, 53273, 1, 1690, 25645, 1, 3903, 32392, 1, 975, 4911, 1, 706, 20557, 1, 2626, 19945, 1, 1169, 53702, 1, 551, 6939, 1, 2493, 65080, 1, 784, 15112, 2, 1431, 64079, 3623, 61848, 2, 904, 7083, 1042, 34444, 2, 1471, 61904, 3862, 11018, 1, 4344, 27892, 1, 2589, 51657, 1, 630, 50476, 1, 4330, 62919, 2, 2722, 36974, 5112, 8420, 1, 2884, 44381, 1, 4514, 32459, 2, 3217, 65003, 4108, 50681, 1, 1607, 39362, 1, 3275, 37472, 1, 2001, 47899, 4, 569, 30485, 617, 46282, 2313, 4905, 4082, 32655, 1, 74, 17228, 2, 1132, 17372, 3748, 26577, 3, 208, 20583, 3135, 23174, 4284, 4730, 1, 3254, 37642, 2, 2636, 9946, 3435, 232, 2, 773, 33602, 903, 2693, 3, 428, 8813, 1439, 45420, 2000, 10589, 1, 1646, 40950, 1, 2276, 40404, 3, 518, 44361, 605, 54224, 1854, 55540, 1, 3625, 7039, 2, 794, 2981, 2504, 53021, 1, 3620, 26372, 1, 1588, 25787, 4, 1496, 9607, 1994, 41500, 3679, 5203, 4639, 33749, 6, 1412, 28144, 1564, 725, 1636, 26564, 2954, 30696, 3215, 36108, 3854, 9143, 1, 4335, 55147, 4, 70, 643, 1645, 61242, 2219, 48, 2314, 53681, 1, 3261, 25937, 2, 1376, 31271, 3094, 21677, 2, 3752, 60733, 4512, 55993, 1, 3132, 57107, 1, 4679, 15588, 2, 678, 21921, 2114, 32255, 2, 2239, 29154, 2830, 22210, 1, 168, 4792, 1, 2669, 56410, 2, 1282, 48332, 2741, 49149, 2, 2920, 54117, 3255, 29165, 2, 3816, 19283, 5756, 9940, 1, 1352, 24403, 1, 1487, 65526, 3, 888, 56938, 2819, 65460, 3072, 36328, 1, 2940, 28465, 1, 3723, 30248, 1, 1514, 14069, 1, 1459, 1373, 3, 1497, 3745, 2654, 32658, 4431, 5607, 1, 4012, 63504, 1, 2351, 14922, 1, 1795, 237, 1, 4280, 60791, 5, 654, 50523, 1695, 63291, 1895, 40438, 2980, 42815, 3802, 36028, 3, 1363, 4955, 1427, 9419, 2494, 27733, 2, 1538, 21168, 3224, 42014, 2, 1314, 57668, 2416, 43773, 2, 3343, 65123, 4439, 54489, 2, 415, 51902, 3830, 45576, 1, 2089, 44263, 1, 3885, 28847, 1, 4138, 4017, 2, 1868, 65335, 3316, 33060, 2, 2298, 60567, 4543, 9171, 1, 789, 44791, 1, 3714, 38976, 2, 1702, 14240, 4309, 6690, 1, 776, 54399, 1, 3697, 30080, 2, 138, 50937, 647, 18198, 1, 432, 39060, 1, 1300, 12613, 3, 1343, 25613, 1847, 34195, 1981, 10225, 1, 2337, 32457, 2, 2574, 53494, 3315, 31017, 2, 1212, 25292, 1906, 61106, 1, 3464, 24164, 1, 3521, 56470, 1, 4912, 30445, 2, 2789, 22605, 4938, 30445, 1, 4964, 30445, 4, 31, 64258, 736, 22994, 4990, 30445, 5753, 7130, 3, 1081, 3624, 1371, 49466, 5016, 30445, 1, 5042, 30445, 3, 3829, 8194, 4700, 12951, 5068, 30445, 1, 4542, 46314, 2, 2714, 34663, 3003, 1035, 1, 959, 62020, 1, 739, 43459, 2, 233, 58580, 2291, 34804, 2, 3537, 32927, 3649, 29376, 1, 1909, 62975, 2, 1392, 23589, 2068, 50362, 1, 4058, 29346, 2, 101, 13885, 1741, 20182, 1, 3914, 2764, 3, 2640, 2984, 3227, 52082, 3706, 41087, 2, 1140, 62489, 1318, 32866, 1, 177, 47468, 3, 3, 28480, 3702, 48618, 4417, 23331, 3, 2311, 38287, 2580, 13877, 3716, 6652, 1, 606, 22282, 3, 2801, 27356, 4297, 3125, 4672, 48247, 1, 5170, 41588, 3, 1722, 64894, 5110, 60955, 5210, 41588, 2, 284, 19402, 5250, 41588, 2, 1568, 54663, 5290, 41588, 1, 5330, 41588, 1, 5370, 41588, 2, 1736, 41095, 5410, 41588, 2, 2112, 62630, 5450, 41588, 1, 1220, 11068, 1, 1673, 41529, 2, 281, 20495, 2737, 61520, 1, 1615, 51469, 2, 604, 43259, 3455, 39036, 2, 1585, 42309, 5747, 37121, 1, 531, 61013, 3, 311, 62101, 1361, 7142, 4650, 51716, 1, 1473, 65240, 1, 2004, 55553, 1, 833, 57624, 5, 1626, 22501, 1769, 5061, 2673, 38056, 3303, 3857, 5175, 12331, 5, 126, 3157, 2012, 15085, 2225, 38912, 2974, 19831, 5215, 12331, 1, 5255, 12331, 3, 3164, 14067, 3828, 2025, 5295, 12331, 1, 5335, 12331, 3, 401, 30933, 2177, 38107, 5375, 12331, 1, 5415, 12331, 1, 5455, 12331, 2, 1310, 18589, 3192, 26183, 3, 1916, 19675, 3272, 6962, 4001, 53464, 1, 4142, 63757, 1, 1543, 64806, 4, 1312, 7079, 2536, 19307, 2690, 6646, 4308, 13256, 1, 2162, 20170, 1, 4503, 50886, 1, 1803, 7261, 1, 5124, 52713, 1, 3034, 31849, 3, 575, 3954, 3975, 45652, 4468, 56041, 1, 131, 40063, 1, 2207, 32245, 2, 2509, 60657, 5496, 15402, 3, 3509, 56708, 3808, 28717, 5536, 15402, 1, 5576, 15402, 2, 2553, 55810, 5616, 15402, 3, 2881, 19128, 4712, 64894, 5656, 15402, 4, 1188, 31353, 4504, 9857, 4738, 64894, 5696, 15402, 3, 2511, 25054, 4764, 64894, 5736, 15402, 3, 923, 64470, 1484, 38227, 4790, 64894, 2, 48, 25816, 4816, 64894, 2, 1683, 62764, 4842, 64894, 2, 2258, 27109, 4868, 64894, 1, 4894, 64894, 1, 4615, 28440, 2, 2318, 49668, 4146, 19248, 2, 2380, 18363, 2775, 54539, 1, 4252, 43058, 1, 397, 43059, 1, 5467, 45059, 1, 5507, 45059, 4, 995, 51008, 2124, 18340, 3807, 38187, 5547, 45059, 2, 2304, 29242, 5587, 45059, 3, 2896, 2318, 4132, 36163, 5627, 45059, 2, 3578, 13383, 5667, 45059, 4, 3106, 14566, 4374, 43812, 5154, 47474, 5707, 45059, 1, 5194, 47474, 3, 865, 38210, 2581, 431, 5234, 47474, 2, 4261, 32966, 5274, 47474, 4, 77, 20767, 2933, 2619, 4364, 19006, 5314, 47474, 2, 1166, 58610, 5354, 47474, 6, 365, 5675, 997, 13797, 2616, 27821, 3206, 48501, 4291, 9997, 5394, 47474, 2, 2263, 13500, 5434, 47474, 2, 2336, 14082, 3923, 18906, 1, 61, 39912, 1, 5483, 50028, 1, 5523, 50028, 2, 2104, 62207, 5563, 50028, 3, 818, 14201, 4551, 62161, 5603, 50028, 1, 5643, 50028, 1, 5683, 50028, 1, 5723, 50028, 2, 192, 42174, 345, 42499, 1, 3600, 4881, 1, 4245, 28400, 3, 370, 11600, 492, 46734, 1942, 15319, 1, 3713, 62626, 1, 3131, 37601, 1, 5148, 38694, 4, 651, 21064, 1962, 12981, 2860, 12143, 5188, 38694, 1, 5228, 38694, 3, 3415, 18026, 4426, 41776, 5268, 38694, 2, 831, 2991, 5308, 38694, 3, 1175, 7333, 3296, 43601, 5348, 38694, 2, 594, 10174, 5388, 38694, 4, 3234, 32942, 3490, 62730, 3833, 43488, 5428, 38694, 4, 3004, 47564, 3494, 8282, 3972, 62222, 4205, 58464, 1, 2413, 58061, 1, 2009, 6586, 1, 3874, 41955, 1, 3500, 11825, 3, 1393, 51292, 1590, 50382, 1805, 33442, 1, 3337, 57877, 1, 3671, 28451, 1, 1723, 30713, 1, 4720, 38155, 2, 434, 40480, 4746, 38155, 2, 1013, 35090, 4772, 38155, 3, 4326, 20966, 4622, 20877, 4798, 38155, 2, 159, 15446, 4824, 38155, 1, 4850, 38155, 1, 4876, 38155, 3, 447, 46707, 2025, 11726, 4902, 38155, 2, 454, 46707, 2646, 34942, 2, 2064, 4996, 4604, 50883, 3, 1573, 31447, 2767, 49182, 4582, 9641, 3, 665, 63930, 1072, 13348, 4936, 39586, 2, 1998, 64612, 4962, 39586, 4, 1480, 63340, 2514, 55313, 2975, 55606, 4988, 39586, 4, 430, 17383, 1648, 45661, 2783, 40399, 5014, 39586, 3, 1938, 28748, 3128, 39002, 5040, 39586, 3, 241, 7605, 410, 34193, 5066, 39586, 5, 761, 26687, 3144, 11374, 3361, 24721, 3744, 59418, 5092, 39586, 1, 3619, 33521, 1, 3682, 44087, 2, 405, 27600, 1799, 25710, 1, 3403, 9830, 2, 902, 61174, 4510, 13911, 1, 4594, 43870, 2, 219, 29555, 3250, 65228, 3, 1957, 28090, 3562, 44250, 4601, 28159, 1, 1672, 62228, 1, 438, 1030, 2, 1295, 62259, 3418, 55878, 1, 1407, 38395, 3, 341, 3501, 1250, 11020, 2365, 19533, 1, 1457, 38562, 3, 2695, 55902, 3129, 26982, 3306, 54622, 3, 1180, 19895, 4553, 57437, 5156, 50629, 2, 1279, 37137, 5196, 50629, 3, 2520, 25010, 4163, 56871, 5236, 50629, 2, 938, 39262, 5276, 50629, 3, 3103, 57501, 4176, 10936, 5316, 50629, 3, 3228, 41761, 4507, 659, 5356, 50629, 2, 1181, 9655, 5396, 50629, 2, 4928, 13953, 5436, 50629, 5, 151, 61178, 519, 42206, 2434, 1556, 2856, 26497, 4954, 13953, 4, 1302, 33940, 3654, 61772, 4348, 36875, 4980, 13953, 4, 3047, 11210, 3502, 51863, 5006, 13953, 5183, 40614, 2, 5032, 13953, 5223, 40614, 3, 1153, 24134, 5058, 13953, 5263, 40614, 2, 5084, 13953, 5303, 40614, 3, 134, 20732, 1961, 39467, 5343, 40614, 2, 2689, 11750, 5383, 40614, 3, 2035, 30080, 3676, 34874, 5423, 40614, 1, 5463, 40614, 2, 1987, 8983, 2989, 52742, 1, 2265, 1408, 3, 1593, 60558, 3267, 55137, 3766, 51575, 2, 15, 26666, 2668, 11941, 4, 2408, 792, 2657, 50225, 2713, 61696, 3836, 57997, 5, 409, 4155, 1246, 60806, 1597, 53321, 3615, 3921, 4479, 7285, 2, 2962, 4111, 4563, 21159, 5, 3493, 31309, 3575, 32025, 4198, 44360, 4244, 60027, 4603, 59702, 2, 2939, 15092, 4250, 47678, 1, 1113, 14866, 1, 2011, 8177, 2, 1395, 54477, 2377, 63793, 1, 1410, 8336, 2, 1613, 8507, 3791, 12124, 3, 1026, 60530, 1707, 51308, 2609, 49710, 1, 3872, 25358, 1, 516, 12386, 2, 581, 10210, 1660, 36437, 3, 926, 35935, 3613, 9223, 4320, 19156, 2, 3988, 50119, 5131, 17209, 4, 1872, 43763, 3186, 30401, 3264, 61593, 3639, 58729, 2, 3921, 24068, 4169, 33016, 1, 2387, 8457, 2, 2582, 18849, 4005, 26426, 2, 1688, 53679, 5752, 30283, 1, 2055, 31605, 3, 2045, 60143, 2523, 23331, 3711, 2279, 1, 21, 19010, 2, 352, 22575, 1665, 46126, 1, 1167, 54388, 1, 3397, 42094, 3, 765, 10789, 2067, 2833, 3041, 47857, 1, 2016, 36041, 4, 319, 29735, 4050, 56112, 4533, 19788, 4643, 16573, 2, 1444, 26338, 4657, 37354, 2, 1804, 17975, 3780, 64094, 1, 1119, 43590, 1, 755, 56074, 1, 3540, 24547, 2, 1346, 2311, 2625, 62165, 2, 3873, 46271, 3882, 11341, 2, 2309, 61021, 3080, 60996, 1, 3559, 13222, 1, 570, 28564, 2, 4354, 48364, 5108, 28975, 1, 3450, 63185, 1, 44, 21793, 2, 1817, 52594, 2997, 15802, 4, 2120, 29640, 3945, 18007, 4073, 55801, 4248, 33859, 2, 3594, 35023, 3979, 30958, 2, 2066, 3302, 3701, 30969, 2, 848, 51536, 2762, 40065, 1, 2496, 14645, 2, 1563, 12486, 3608, 47948, 1, 4002, 48425, 1, 3974, 13672, 4, 2947, 50525, 3088, 12658, 3263, 38183, 3772, 59414, 1, 3089, 12658, 1, 1055, 3339, 1, 3133, 16552, 1, 2425, 46874, 3, 4, 23290, 170, 14645, 2284, 49038, 2, 330, 9293, 2357, 63553, 1, 1703, 11781, 1, 5490, 61705, 1, 5530, 61705, 2, 4334, 1518, 5570, 61705, 2, 1537, 56551, 5610, 61705, 2, 2870, 6296, 5650, 61705, 1, 5690, 61705, 2, 3379, 44859, 5730, 61705, 2, 2910, 19859, 3657, 25188, 3, 443, 38263, 2179, 45156, 2818, 45551, 1, 4189, 48734, 2, 4596, 56996, 5180, 40787, 1, 5220, 40787, 1, 5260, 40787, 2, 2278, 3347, 5300, 40787, 2, 2460, 27536, 5340, 40787, 2, 3389, 44760, 5380, 40787, 2, 1442, 22662, 5420, 40787, 3, 1017, 14008, 1239, 34923, 5460, 40787, 1, 674, 35888, 3, 1102, 3273, 1139, 21621, 3530, 53055, 3, 269, 62560, 3317, 17896, 3959, 53292, 3, 457, 54648, 1341, 13271, 4477, 2950, 4, 402, 22494, 453, 27125, 3167, 20795, 3489, 12008, 4, 704, 13595, 1176, 4043, 3636, 24970, 4131, 51532, 2, 2486, 57004, 3356, 58500, 1, 1904, 24150, 2, 809, 40124, 2545, 21151, 2, 2859, 60465, 3434, 24289, 1, 204, 47738, 1, 314, 37918, 2, 2196, 40601, 4636, 26818, 2, 479, 16290, 2489, 10967, 1, 3258, 32934, 4, 99, 15583, 429, 33506, 4289, 33191, 4709, 37789, 1, 4735, 37789, 2, 398, 41110, 4761, 37789, 3, 1885, 46511, 3720, 5560, 4787, 37789, 3, 3127, 37070, 4813, 37789, 5095, 57356, 2, 557, 876, 4839, 37789, 1, 4865, 37789, 2, 1109, 63264, 4891, 37789, 1, 2527, 61490, 1, 2955, 58081, 2, 201, 45627, 3633, 29995, 2, 785, 28622, 4359, 34173, 2, 1768, 3085, 4684, 60616, 3, 310, 57895, 1692, 54326, 3782, 43001, 2, 3032, 44094, 5165, 43131, 2, 1443, 35859, 5205, 43131, 2, 4103, 54409, 5245, 43131, 3, 16, 61049, 3584, 60368, 5285, 43131, 2, 912, 51396, 5325, 43131, 2, 4155, 57072, 5365, 43131, 1, 5405, 43131, 1, 5445, 43131, 1, 5150, 45456, 1, 5190, 45456, 1, 5230, 45456, 2, 1222, 15253, 5270, 45456, 3, 1224, 2901, 2253, 24065, 5310, 45456, 3, 444, 51918, 801, 49561, 5350, 45456, 2, 1997, 3822, 5390, 45456, 3, 2188, 55293, 5138, 53948, 5430, 45456, 2, 770, 25894, 4125, 47162, 2, 2329, 39505, 5751, 30283, 1, 3920, 8096, 4, 768, 50623, 897, 15230, 1596, 57682, 2919, 44803, 2, 2759, 16006, 3470, 43030, 2, 203, 20563, 1825, 50261, 2, 1561, 46107, 5153, 61343, 2, 4342, 17340, 5193, 61343, 1, 5233, 61343, 2, 2984, 28715, 5273, 61343, 1, 5313, 61343, 1, 5353, 61343, 1, 5393, 61343, 1, 5433, 61343, 2, 1358, 61306, 1557, 58172, 2, 692, 27424, 1499, 58534, 2, 1189, 29841, 5755, 9940, 1, 4379, 44580, 1, 1028, 44226, 1, 2070, 9481, 1, 4228, 56097, 2, 2385, 52307, 4229, 56097, 1, 1015, 52445, 2, 1634, 48335, 3591, 26899, 1, 5132, 52158, 3, 148, 40869, 1226, 18137, 3598, 12756, 2, 4034, 37345, 4089, 62042, 1, 4042, 25476, 3, 2624, 19873, 2803, 30037, 3421, 47808, 1, 4257, 62426, 1, 1507, 57949, 1, 2613, 49006, 2, 507, 51061, 3340, 11002, 1, 1753, 59769, 4, 257, 43302, 908, 52902, 4614, 18854, 4681, 10076, 1, 3653, 34748, 2, 1460, 802, 4575, 21583, 3, 2930, 37746, 3741, 9728, 4104, 11411, 2, 921, 7203, 3111, 44119, 2, 2659, 31149, 3635, 29226, 1, 69, 10068, 2, 1145, 13539, 1800, 44085, 3, 166, 15193, 1247, 12232, 5491, 63613, 2, 3374, 55896, 5531, 63613, 2, 171, 42791, 5571, 63613, 2, 3138, 26665, 5611, 63613, 2, 3044, 51496, 5651, 63613, 2, 664, 9810, 5691, 63613, 2, 1528, 39081, 5731, 63613, 1, 2228, 5846, 3, 1093, 30332, 2300, 37055, 2407, 1998, 3, 406, 39179, 1253, 56738, 3793, 62520, 1, 1565, 59569, 1, 2798, 58006, 1, 1233, 29561, 1, 2889, 25054, 2, 1581, 12972, 2383, 13558, 1, 4519, 28081, 1, 775, 24146, 1, 85, 64772, 2, 4078, 24459, 4333, 19326, 3, 179, 3460, 1682, 14279, 4130, 34192, 3, 2254, 54628, 3071, 47287, 4489, 44645, 1, 3049, 52385, 1, 3407, 18019, 1, 2869, 41251, 1, 3642, 26759, 3, 88, 11204, 3353, 48574, 5482, 22922, 3, 2147, 7262, 2206, 41111, 5522, 22922, 2, 459, 1788, 5562, 22922, 3, 465, 14107, 3021, 5307, 5602, 22922, 1, 5642, 22922, 4, 1556, 60170, 2563, 53580, 4061, 31271, 5682, 22922, 2, 3244, 30506, 5722, 22922, 2, 1014, 9748, 1744, 53410, 4, 217, 54086, 1174, 20974, 2079, 150, 3395, 59719, 2, 488, 62838, 1084, 18911, 3, 357, 36333, 1054, 61943, 4611, 31620, 1, 4363, 48515, 2, 3148, 4809, 4595, 54103, 2, 509, 26931, 5172, 17302, 3, 2290, 19949, 4634, 24510, 5212, 17302, 2, 4450, 31993, 5252, 17302, 1, 5292, 17302, 2, 567, 64762, 5332, 17302, 2, 4697, 28528, 5372, 17302, 2, 3006, 41437, 5412, 17302, 3, 2718, 58488, 4329, 13246, 5452, 17302, 1, 1332, 38133, 1, 1413, 46791, 1, 3660, 45896, 1, 3339, 42257, 1, 4088, 33753, 4, 3139, 24873, 3630, 13149, 3755, 23829, 4586, 53644, 1, 2685, 2545, 1, 3677, 16806, 1, 3510, 29518, 1, 2397, 1620, 2, 4251, 54800, 4367, 15520, 3, 1970, 2467, 2340, 61057, 3680, 26256, 1, 1697, 39509, 2, 2069, 31346, 4003, 7540, 3, 867, 60479, 992, 41505, 3354, 16409, 2, 2488, 51406, 4932, 43007, 4, 29, 50140, 2049, 60089, 3875, 32061, 4958, 43007, 2, 4290, 227, 4984, 43007, 3, 939, 38505, 2345, 12807, 5010, 43007, 1, 5036, 43007, 2, 100, 44325, 5062, 43007, 2, 860, 55254, 5088, 43007, 3, 1485, 54134, 3372, 47335, 3774, 50881, 2, 722, 14159, 1362, 50768, 2, 1092, 63562, 4059, 27863, 1, 3995, 59776, 1, 3520, 47958, 3, 881, 30948, 2637, 62207, 4274, 62829, 1, 806, 19144, 1, 155, 31011, 1, 2895, 58203, 1, 1797, 53817, 4, 252, 20775, 932, 15070, 3743, 49985, 4337, 23184, 1, 1502, 1680, 1, 4515, 5617, 1, 1647, 26940, 2, 1235, 4756, 3160, 56888, 1, 3461, 25034, 1, 3371, 38467, 1, 731, 4047, 2, 1313, 24467, 3136, 40545, 1, 800, 7740, 4, 1270, 8433, 1679, 20984, 2474, 45507, 2623, 12339, 1, 3332, 43751, 1, 749, 49570, 1, 46, 36192, 2, 30, 30554, 3433, 29328, 1, 1521, 38827, 3, 1309, 109, 3016, 35683, 4081, 64582, 1, 1289, 61225, 3, 2577, 60079, 3582, 27739, 4583, 52349, 1, 475, 14914, 2, 3327, 57031, 4546, 64939, 1, 3643, 21682, 2, 847, 47233, 1600, 39271, 1, 1655, 3055, 1, 3756, 56550, 2, 466, 11321, 3297, 43284, 2, 4368, 46677, 4642, 31050, 1, 4458, 28121, 1, 4324, 38815, 2, 360, 37995, 3226, 62810, 2, 3973, 48544, 4343, 63208, 3, 1129, 36715, 1271, 29801, 3412, 22430, 1, 471, 29352, 1, 2222, 61844, 2, 1821, 41564, 3152, 60171, 3, 493, 23340, 527, 25646, 2770, 7027, 2, 2506, 51142, 3388, 48111, 2, 2256, 64772, 3200, 1792, 2, 1008, 16013, 4097, 56467, 1, 588, 38061, 1, 3376, 62355, 3, 180, 46216, 392, 12234, 4718, 60277, 3, 220, 42759, 3262, 57292, 4744, 60277, 1, 4770, 60277, 2, 4116, 6858, 4796, 60277, 3, 2132, 51603, 4212, 49697, 4822, 60277, 3, 550, 7012, 834, 63854, 4848, 60277, 2, 3154, 31651, 4874, 60277, 2, 4397, 7709, 4900, 60277, 1, 4221, 9183, 2, 2148, 25460, 4662, 58070, 1, 3276, 16352, 1, 3504, 21591, 1, 3481, 58840, 3, 231, 24868, 1003, 5649, 4689, 57200, 1, 514, 7123, 2, 857, 43285, 2246, 48230, 1, 239, 47477, 2, 2017, 23463, 4441, 66, 1, 1754, 21574, 3, 2708, 52874, 3062, 42027, 4399, 26797, 2, 40, 17980, 1158, 42152, 2, 2946, 36905, 4350, 53674, 2, 2281, 61204, 2834, 24085, 1, 1411, 43168, 3, 2621, 54528, 4022, 8171, 4370, 37258, 3, 1467, 6161, 1831, 45132, 2510, 29181, 2, 1000, 38976, 2810, 49013, 1, 4254, 51696, 1, 452, 61050, 1, 4694, 15057, 1, 433, 61189, 1, 1122, 12792, 1, 4499, 36385, 1, 4276, 52450, 1, 4016, 63814, 1, 2260, 60067, 1, 3333, 4244, 2, 2006, 30976, 2755, 15569, 1, 1907, 47449, 1, 3079, 58473, 1, 1112, 4403, 2, 1321, 1089, 1526, 56483, 1, 1243, 9036, 2, 2868, 41310, 4345, 59679, 2, 329, 61748, 4491, 62441, 1, 2143, 22523, 2, 34, 13785, 2747, 14804, 2, 1518, 59424, 4062, 46397, 1, 2993, 55736, 1, 2996, 52277, 1, 2044, 40287, 3, 1044, 45805, 3663, 23340, 4511, 1917, 1, 2422, 18345, 1, 1934, 35687, 2, 1789, 42898, 3776, 6915, 4, 813, 64979, 2540, 55180, 2916, 6033, 3282, 53089, 1, 1199, 15122, 3, 1633, 50818, 2610, 40256, 4579, 54052, 2, 690, 16288, 1668, 25559, 2, 183, 4276, 1197, 44949, 2, 33, 63719, 2366, 62873, 1, 2142, 31227, 1, 928, 15953, 2, 1059, 61057, 1569, 33621, 1, 3848, 55600, 2, 522, 49225, 3090, 40417, 1, 5106, 5555, 2, 2271, 46289, 3960, 45, 1, 1653, 59128, 1, 3334, 11942, 1, 2203, 21556, 1, 253, 12718, 2, 663, 37296, 4618, 43919, 4, 431, 4767, 2384, 27877, 4239, 7767, 5484, 61184, 2, 909, 56203, 5524, 61184, 2, 4698, 24893, 5564, 61184, 1, 5604, 61184, 3, 1426, 32757, 3460, 53608, 5644, 61184, 1, 5684, 61184, 3, 1910, 59233, 5097, 36838, 5724, 61184, 2, 856, 13264, 1171, 22156, 4, 473, 1515, 1258, 42127, 1681, 26505, 2041, 41758, 1, 2442, 37278, 2, 614, 57752, 1406, 55205, 1, 4306, 55390, 1, 113, 16928, 2, 2501, 63181, 4396, 17754, 1, 3330, 55088, 3, 3331, 63661, 3763, 29919, 5122, 1284, 1, 2, 46303, 1, 4610, 40322, 1, 1625, 17934, 2, 1552, 36416, 3491, 38499, 1, 974, 27178, 2, 978, 27178, 3783, 23273, 1, 2167, 53066, 1, 713, 6688, 1, 501, 49439, 1, 838, 41966, 3, 98, 22351, 2406, 62572, 4070, 42915, 2, 2015, 59650, 4424, 13525, 1, 685, 47231, 3, 340, 49598, 1510, 51902, 2848, 51379, 1, 4323, 15019, 1, 2473, 48268, 1, 199, 27361, 3, 27, 9911, 3311, 39141, 3580, 37955, 3, 1685, 3737, 1780, 48315, 2227, 65505, 1, 1941, 37404, 2, 2080, 57907, 2970, 20917, 1, 4099, 49321, 2, 2093, 41462, 2354, 63697, 2, 421, 29281, 1317, 29875, 2, 354, 52408, 3719, 36122, 1, 4536, 5119, 2, 2094, 55858, 2435, 60188, 3, 3015, 53820, 3637, 29538, 3993, 20955, 1, 3098, 31271, 3, 976, 27178, 2811, 13341, 4085, 2275, 2, 980, 27178, 2027, 42444, 2, 1975, 17995, 2247, 53052, 2, 1676, 43602, 2906, 12496, 1, 5140, 38968, 3, 1043, 45205, 1771, 53751, 4185, 45427, 1, 4331, 44664, 3, 2273, 20093, 3472, 10969, 4161, 45471, 2, 3363, 38045, 4561, 803, 1, 4336, 30449, 1, 3416, 22489, 3, 3142, 8615, 4199, 9335, 4692, 59418, 2, 3095, 51871, 3545, 6443, 3, 2936, 10321, 3097, 36643, 3548, 62501, 1, 817, 10307, 1, 1319, 44072, 1, 2307, 12131, 3, 489, 52765, 2086, 13251, 3513, 64099, 2, 2681, 20388, 3859, 27154, 1, 302, 19544, 1, 2245, 47068, 1, 3532, 21278, 2, 2266, 20085, 4483, 57822, 2, 2059, 35504, 2122, 38016, 2, 580, 4744, 1419, 52146, 1, 1893, 26528, 1, 3168, 56075, 3, 86, 16808, 1592, 28321, 2760, 43356, 1, 1071, 63913, 2, 1252, 65164, 4040, 39007, 1, 3840, 18304, 2, 745, 47726, 5493, 3100, 2, 2243, 65509, 5533, 3100, 1, 5573, 3100, 4, 1760, 65125, 2355, 41987, 2837, 58793, 5613, 3100, 2, 1587, 25283, 5653, 3100, 2, 426, 13237, 5693, 3100, 4, 1992, 32983, 3628, 29606, 4037, 41797, 5733, 3100, 3, 879, 20914, 2053, 38716, 2667, 18374, 3, 416, 57571, 1999, 4476, 2139, 14290, 2, 1807, 36728, 2723, 27170, 1, 1715, 46443, 1, 819, 52596, 2, 999, 43998, 3667, 23343, 1, 3488, 14812, 1, 1864, 33445, 2, 625, 1343, 1752, 64325, 2, 369, 19773, 5466, 20978, 3, 2847, 56990, 5479, 31070, 5506, 20978, 4, 2462, 58398, 2503, 62719, 5519, 31070, 5546, 20978, 4, 116, 1686, 4626, 24994, 5559, 31070, 5586, 20978, 2, 5599, 31070, 5626, 20978, 2, 5639, 31070, 5666, 20978, 3, 3107, 17403, 5679, 31070, 5706, 20978, 5, 3205, 27993, 3843, 28535, 3956, 42834, 4165, 61636, 5719, 31070, 2, 4173, 36320, 5750, 30283, 2, 824, 62446, 3383, 55543, 2, 486, 54197, 3054, 53805, 1, 4375, 41104, 1, 3292, 32340, 2, 3246, 42752, 4716, 64965, 1, 4742, 64965, 5, 287, 23992, 1614, 51003, 1641, 15771, 3948, 9702, 4768, 64965, 3, 977, 36741, 2748, 18920, 4794, 64965, 4, 2445, 56963, 3597, 17244, 4358, 34821, 4820, 64965, 1, 4846, 64965, 1, 4872, 64965, 2, 2272, 32163, 4898, 64965, 2, 529, 18233, 4459, 50689, 1, 3778, 65298, 1, 164, 41224, 1, 4179, 63308, 2, 2063, 52245, 2429, 20325, 1, 4685, 27147, 1, 4919, 7284, 2, 642, 19128, 4945, 7284, 2, 4971, 7284, 5169, 26403, 5, 549, 23382, 1887, 10044, 2672, 26611, 4997, 7284, 5209, 26403, 3, 2790, 30441, 5023, 7284, 5249, 26403, 3, 2285, 49054, 5049, 7284, 5289, 26403, 5, 889, 49537, 2628, 3266, 2738, 31313, 5075, 7284, 5329, 26403, 1, 5369, 26403, 1, 5409, 26403, 1, 5449, 26403, 1, 3693, 51354, 1, 2539, 18075, 4, 236, 27339, 1400, 52299, 3588, 38609, 4371, 1945, 3, 338, 30908, 790, 35753, 1306, 6490, 2, 3030, 17394, 3178, 31747, 2, 2693, 11548, 5117, 9968, 3, 1791, 24673, 2189, 7347, 4020, 13315, 2, 3043, 42294, 4573, 1457, 1, 1208, 35960, 2, 877, 64438, 3722, 52082, 1, 2576, 4335, 2, 3187, 31147, 3273, 17728, 2, 104, 30397, 1205, 6091, 2, 105, 38533, 689, 18957, 1, 2753, 35625, 2, 435, 23318, 610, 24557, 2, 2453, 4859, 2517, 6090, 1, 4683, 42849, 1, 4275, 34939, 3, 211, 5789, 757, 57616, 4327, 28366, 1, 1966, 39174, 2, 1845, 31339, 4457, 5064, 2, 541, 998, 2335, 28246, 2, 1520, 59183, 4156, 60563, 2, 2211, 4666, 2306, 59916, 3, 2061, 11316, 2117, 23744, 2982, 52173, 3, 2887, 42717, 3586, 40602, 4440, 7399, 1, 2182, 60277, 3, 1446, 11190, 3036, 5447, 3536, 18212, 1, 1244, 55599, 2, 2694, 28869, 4560, 18987, 1, 2784, 729, 2, 3785, 45682, 4460, 41298, 4, 2389, 64259, 3468, 37473, 3745, 19355, 4707, 4852, 2, 2471, 23045, 4733, 4852, 3, 2194, 34409, 3542, 4772, 4759, 4852, 1, 4785, 4852, 2, 1751, 31809, 4811, 4852, 3, 1052, 36885, 4133, 35008, 4837, 4852, 1, 4863, 4852, 2, 4493, 40902, 4889, 4852, 2, 728, 48463, 1612, 11720, 3, 646, 1335, 1025, 19139, 3099, 17570, 2, 2528, 25363, 3085, 17551, 3, 1896, 26701, 2900, 59626, 4915, 29072, 2, 3445, 61654, 4941, 29072, 3, 266, 11459, 1955, 45990, 4967, 29072, 3, 2146, 32049, 3424, 50692, 4993, 29072, 2, 1761, 28532, 5019, 29072, 2, 4500, 57110, 5045, 29072, 3, 3328, 55050, 4190, 28545, 5071, 29072, 1, 1530, 16611, 2, 1774, 62248, 2178, 49396, 1, 3610, 28607, 2, 2475, 56504, 3130, 41412, 1, 3125, 17720, 1, 5184, 60918, 1, 5224, 60918, 4, 499, 60835, 1436, 55850, 3599, 37699, 5264, 60918, 2, 299, 42267, 5304, 60918, 2, 937, 18788, 5344, 60918, 1, 5384, 60918, 2, 3365, 55036, 5424, 60918, 1, 5464, 60918, 1, 414, 28619, 4, 1034, 34051, 2443, 18184, 3075, 50966, 3629, 54996, 1, 1508, 65372, 2, 894, 22428, 919, 27195, 1, 1170, 42939, 1, 2297, 24156, 1, 2606, 12993, 2, 2164, 34929, 4568, 11131, 1, 574, 9581, 1, 2394, 30795, 2, 1213, 49258, 1671, 52017, 1, 4279, 36500, 3, 915, 26652, 2567, 64626, 3819, 43235, 1, 3933, 51457, 2, 730, 5400, 2857, 7437, 1, 187, 64626, 1, 3563, 8283, 1, 1979, 4704, 1, 3961, 10434, 1, 3271, 5616, 2, 1731, 20272, 3935, 63270, 2, 2879, 1812, 3477, 28313, 2, 1558, 42310, 4495, 4528, 2, 2513, 43816, 3724, 9806, 1, 803, 15049, 1, 4373, 50357, 1, 2769, 40571, 1, 4412, 64549, 3, 68, 26587, 110, 45178, 188, 63908, 2, 2663, 60879, 4224, 15367, 3, 65, 25656, 2295, 23018, 3105, 39060, 2, 1919, 29068, 2600, 54893, 2, 6, 59391, 4705, 55672, 2, 1184, 35517, 4731, 55672, 3, 2836, 33961, 3287, 45068, 4757, 55672, 1, 4783, 55672, 3, 135, 31354, 2419, 2194, 4809, 55672, 2, 2232, 35328, 4835, 55672, 2, 671, 25021, 4861, 55672, 4, 3668, 10477, 3887, 20501, 4691, 64668, 4887, 55672, 2, 598, 58992, 2992, 43725, 1, 3696, 40192, 1, 3937, 29566, 1, 1200, 23421, 2, 3323, 24522, 3804, 57981, 1, 3211, 61499, 1, 4215, 62596, 1, 5102, 40740, 2, 1762, 59275, 3048, 3105, 1, 2379, 62521, 2, 1724, 58546, 2852, 62607, 1, 2319, 17489, 1, 2551, 27516, 1, 4501, 658, 5, 222, 43003, 542, 51618, 2133, 45477, 2526, 7602, 3721, 10778, 2, 781, 62223, 3120, 35943, 1, 3651, 58496, 2, 533, 31537, 964, 64063, 2, 1116, 19922, 2128, 10811, 2, 291, 22594, 334, 23948, 2, 2115, 43025, 3180, 14165, 3, 1873, 31176, 3177, 59890, 5098, 26662, 1, 891, 36543, 1, 3786, 15004, 2, 1541, 37099, 4517, 41012, 2, 2235, 1100, 2927, 50931, 2, 1623, 39439, 4328, 38321, 1, 4339, 46940, 1, 1891, 11029, 3, 1068, 36491, 1729, 22888, 4404, 55486, 1, 3038, 13849, 1, 2327, 44757, 3, 3675, 48476, 3913, 3880, 5497, 60836, 2, 313, 32233, 5537, 60836, 5, 589, 62199, 1218, 1302, 3652, 32014, 5495, 13728, 5577, 60836, 4, 2530, 31071, 5158, 59852, 5535, 13728, 5617, 60836, 7, 823, 10552, 1911, 51390, 3113, 24152, 3707, 39063, 5198, 59852, 5575, 13728, 5657, 60836, 3, 5238, 59852, 5615, 13728, 5697, 60836, 5, 483, 53447, 971, 5000, 5278, 59852, 5655, 13728, 5737, 60836, 2, 5318, 59852, 5695, 13728, 3, 2282, 41262, 5358, 59852, 5735, 13728, 1, 5398, 59852, 5, 26, 52539, 548, 54702, 821, 59975, 3662, 49315, 5438, 59852, 2, 1776, 65093, 3849, 9037, 4, 468, 46021, 3248, 8437, 3553, 57941, 4230, 55304, 2, 2268, 34669, 5477, 42654, 1, 5517, 42654, 2, 1274, 6791, 5557, 42654, 4, 1490, 60636, 2806, 7880, 3806, 5094, 5597, 42654, 1, 5637, 42654, 2, 3174, 34080, 5677, 42654, 2, 80, 175, 5717, 42654, 1, 4443, 1756, 2, 2185, 101, 2603, 38691, 2, 4268, 30760, 5145, 44791, 2, 4485, 5054, 5185, 44791, 2, 298, 59010, 5225, 44791, 1, 5265, 44791, 2, 232, 27005, 5305, 44791, 1, 5345, 44791, 3, 3370, 15447, 3846, 58789, 5385, 44791, 2, 2544, 55426, 5425, 44791, 2, 2521, 26297, 4587, 7633, 1, 4509, 5808, 2, 1547, 39980, 1852, 21480, 4, 981, 57289, 1622, 1474, 2002, 45965, 2564, 9345, 4, 343, 53099, 2046, 11105, 3235, 27933, 3280, 2093, 3, 54, 27621, 4578, 47486, 4630, 33390, 2, 4098, 6036, 4192, 52041, 2, 93, 24260, 1438, 44765, 2, 700, 22684, 4621, 39687, 2, 2448, 31628, 3457, 48448, 1, 967, 62825, 1, 210, 35084, 1, 979, 55116, 1, 1698, 1291, 2, 4607, 13184, 4656, 16959, 1, 601, 55201, 1, 1642, 45275, 1, 4172, 3744, 2, 3568, 20169, 4393, 11488, 2, 417, 61388, 2099, 61025, 1, 1912, 16615, 1, 1881, 51326, 1, 4282, 44401, 1, 5109, 59443, 1, 3543, 6834, 1, 4465, 14588, 2, 1311, 52437, 4438, 11340, 1, 91, 36106, 1, 798, 40150, 2, 1922, 42586, 5111, 58506, 1, 92, 24488, 1, 2457, 25566, 1, 4391, 6115, 3, 1133, 32283, 2648, 59549, 4506, 39735, 1, 1230, 13266, 1, 1945, 61175, 2, 766, 65534, 3252, 55405, 1, 1706, 28357, 3, 547, 60018, 3241, 24195, 4448, 56615, 2, 1391, 65310, 5143, 60808, 2, 1024, 31658, 2257, 21856, 3, 2885, 37355, 3060, 3214, 4922, 50172, 2, 59, 60808, 4948, 50172, 3, 854, 15085, 2978, 36351, 4974, 50172, 3, 2786, 13492, 3141, 32181, 5000, 50172, 1, 5026, 50172, 2, 2131, 54846, 5052, 50172, 2, 2230, 61478, 5078, 50172, 1, 3194, 30805, 1, 1915, 61432, 1, 952, 49302, 3, 1097, 59459, 1501, 28189, 3547, 3325, 1, 780, 62231, 1, 2585, 9064, 1, 1839, 44223, 1, 4325, 64581, 2, 174, 49255, 729, 6251, 2, 1618, 26821, 2711, 20087, 1, 2559, 16575, 1, 3466, 19705, 2, 4414, 1430, 4599, 411, 3, 23, 57660, 1370, 57838, 3966, 8105, 2, 1786, 22884, 3884, 25582, 2, 41, 29645, 1802, 63800, 3, 324, 64728, 716, 23105, 2931, 60876, 1, 4187, 10542, 2, 3335, 13568, 4096, 6135, 1, 556, 3063, 2, 1047, 42151, 3912, 55601, 1, 1146, 58539, 1, 2363, 8092, 1, 461, 18430, 1, 1850, 11343, 1, 526, 11988, 2, 953, 49302, 2478, 47401, 1, 724, 37451, 1, 1173, 26558, 2, 795, 38885, 1162, 58177, 3, 2270, 16423, 4293, 39298, 4522, 32854, 1, 2651, 34074, 1, 2220, 36825, 1, 2051, 1062, 2, 3853, 57949, 4925, 38764, 3, 1027, 17890, 1424, 6398, 4951, 38764, 1, 4977, 38764, 6, 64, 26455, 1435, 38217, 2052, 39122, 3981, 40942, 4144, 57750, 5003, 38764, 1, 5029, 38764, 3, 1833, 4048, 3029, 881, 5055, 38764, 2, 1863, 9729, 5081, 38764, 5, 14, 65296, 1333, 41572, 1745, 34190, 4444, 28766, 5487, 7917, 1, 5527, 7917, 2, 4678, 36135, 5567, 7917, 2, 3541, 17234, 5607, 7917, 5, 366, 36444, 827, 16610, 2126, 6420, 4338, 58581, 5647, 7917, 4, 899, 48056, 2129, 3362, 3703, 19045, 5687, 7917, 1, 5727, 7917, 3, 327, 29701, 4387, 62889, 4402, 27087, 1, 2998, 49557, 1, 525, 17896, 1, 4612, 26703, 1, 682, 47018, 2, 633, 17832, 3949, 31596, 1, 3878, 52352, 1, 3410, 64998, 1, 4674, 64092, 3, 3051, 11534, 3093, 43291, 4380, 3782, 2, 209, 12513, 4699, 7212, 1, 3950, 64240, 1, 371, 59172, 1, 858, 45227, 2, 1267, 50580, 2396, 55543, 3, 2360, 46038, 3590, 50731, 3940, 19208, 2, 2210, 622, 3236, 46988, 3, 422, 16232, 2172, 64423, 4316, 20130, 2, 990, 44392, 4053, 5275, 2, 822, 47045, 2793, 45414, 3, 1065, 55222, 1070, 21013, 1281, 34158, 1, 2077, 5848, 2, 1219, 27280, 3118, 39677, 1, 1542, 12991, 1, 84, 4988, 2, 2674, 65362, 3313, 44622, 3, 741, 10615, 885, 30105, 1713, 14601, 1, 2745, 27846, 1, 1767, 58506, 1, 2083, 23081, 1, 2897, 61438, 1, 97, 36249, 4, 130, 59717, 1777, 58589, 3077, 64582, 3664, 23340, 1, 4508, 17401, 1, 811, 43560, 1, 3602, 54198, 1, 1903, 19933, 3, 1870, 53755, 3550, 30822, 4066, 535, 1, 721, 16900, 2, 880, 4512, 2376, 57860, 2, 212, 5986, 4110, 23999, 1, 2670, 12837, 1, 2746, 51789, 1, 2277, 49970, 2, 805, 1140, 3577, 28019, 1, 2157, 44625, 2, 3355, 7885, 3900, 54010, 1, 2777, 58703, 1, 2862, 45704, 1, 4484, 51208, 1, 2524, 11209, 1, 1814, 30780, 1, 648, 39153, 1, 2283, 52507, 1, 837, 18283, 3, 666, 18862, 1137, 16776, 2645, 38215, 4, 868, 59921, 2209, 14696, 2986, 42866, 4319, 50595, 1, 339, 64742, 1, 1798, 17394, 1, 4159, 780, 2, 3017, 55178, 5161, 7276, 4, 132, 40205, 2018, 16758, 2944, 61555, 5201, 7276, 3, 898, 7829, 3681, 11696, 5241, 7276, 1, 5281, 7276, 1, 5321, 7276, 2, 4341, 13448, 5361, 7276, 2, 4649, 33796, 5401, 7276, 1, 5441, 7276, 2, 900, 44158, 3126, 5490, 1, 1755, 6904, 4, 103, 41933, 306, 44713, 1263, 64656, 4153, 19735, 2, 747, 12175, 1050, 42920, 2, 991, 63355, 1694, 9183, 1, 2202, 20058, 1, 2221, 52675, 2, 1209, 49337, 4223, 36661, 1, 2192, 18019, 3, 1944, 50063, 2721, 39761, 4454, 20850, 1, 229, 37349, 3, 825, 45726, 2123, 57327, 2303, 5877, 1, 2346, 20522, 2, 804, 40693, 4013, 46354, 1, 2846, 63403, 2, 3704, 48530, 3877, 46473, 1, 0, 7644, 1, 4544, 4572, 1, 631, 2573, 2, 2039, 3207, 2159, 25034, 3, 1640, 60379, 1719, 1549, 2019, 17276, 4, 1630, 33519, 1913, 42321, 3896, 2900, 5502, 19477, 2, 3429, 20001, 5542, 19477, 2, 2106, 44422, 5582, 19477, 3, 2877, 26159, 3219, 47425, 5622, 19477, 2, 884, 15833, 5662, 19477, 2, 4292, 41911, 5702, 19477, 1, 5742, 19477, 1, 532, 25647, 1, 5481, 43531, 1, 5521, 43531, 1, 5561, 43531, 2, 1147, 38259, 5601, 43531, 2, 544, 14563, 5641, 43531, 2, 1516, 47174, 5681, 43531, 2, 2169, 51519, 5721, 43531, 2, 512, 566, 3845, 14509, 1, 4069, 26647, 4, 691, 35819, 1157, 46840, 3109, 2935, 4317, 19171, 4, 1549, 35606, 1963, 54555, 3659, 61208, 5746, 18595, 1, 1594, 62771, 5, 167, 17129, 303, 47768, 399, 19697, 442, 55050, 1177, 5079, 2, 1114, 60229, 2578, 26786, 1, 3386, 9911, 1, 1374, 33108, 4, 870, 9387, 4009, 7993, 4541, 35957, 4602, 26112, 2, 3378, 27341, 3857, 33841, 3, 189, 53073, 3193, 21033, 4095, 6194, 2, 791, 24074, 4668, 40674, 2, 3112, 18922, 4576, 16310, 2, 1488, 53989, 4408, 24843, 1, 2229, 10913, 1, 3871, 38989, 3, 751, 27824, 3150, 14947, 3191, 44312, 3, 882, 40146, 2776, 9678, 3336, 64474, 1, 53, 24074, 2, 481, 32566, 2976, 8269, 3, 1894, 21282, 3694, 53760, 5754, 26805, 1, 1923, 41117, 1, 826, 32733, 2, 659, 61418, 4311, 41296, 2, 2096, 29620, 4024, 19100, 1, 2469, 26927, 1, 1337, 13636, 3, 2274, 57413, 4102, 8404, 4403, 37244, 3, 500, 37813, 1198, 28955, 3781, 24389, 1, 910, 8994, 1, 966, 4843, 3, 136, 59174, 2102, 57942, 2302, 21275, 1, 1971, 57245, 1, 1883, 1041, 1, 3556, 38438, 1, 312, 2928, 1, 901, 58359, 1, 2751, 49169, 1, 555, 19992, 2, 1534, 46678, 2945, 63238, 1, 1284, 29764, 1, 5500, 35274, 1, 5540, 35274, 1, 5580, 35274, 3, 13, 21089, 3239, 1727, 5620, 35274, 1, 5660, 35274, 2, 1842, 49889, 5700, 35274, 1, 5740, 35274, 2, 1857, 3087, 3832, 56148, 1, 1709, 47683, 1, 289, 7144, 2, 1599, 63534, 3479, 4837, }; } // end anonymous namespace vtkDICOMDictionary::Dict vtkDICOMDictionary::DictData = { "DICOM", 4096, 5763, DictTagHashTable, DictKeyHashTable, DictContents }; vtk-dicom-0.8.12/Source/vtkDICOMDictHash.h000066400000000000000000014040751356440565500201300ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/ #ifndef vtkDICOMDictHash_h #define vtkDICOMDictHash_h //! Tag values defined in the DICOM standard namespace DC { enum EnumType { FileMetaInformationGroupLength = 0x00020000, // UL M1 0 FileMetaInformationVersion = 0x00020001, // OB M1 0 MediaStorageSOPClassUID = 0x00020002, // UI M1 0 MediaStorageSOPInstanceUID = 0x00020003, // UI M1 0 TransferSyntaxUID = 0x00020010, // UI M1 0 ImplementationClassUID = 0x00020012, // UI M1 0 ImplementationVersionName = 0x00020013, // SH M1 0 SourceApplicationEntityTitle = 0x00020016, // AE M1 0 SendingApplicationEntityTitle = 0x00020017, // AE M1 0 ReceivingApplicationEntityTitle = 0x00020018, // AE M1 0 SourcePresentationAddress = 0x00020026, // UR M1 0 SendingPresentationAddress = 0x00020027, // UR M1 0 ReceivingPresentationAddress = 0x00020028, // UR M1 0 RTVMetaInformationVersion = 0x00020031, // OB M1 0 RTVCommunicationSOPClassUID = 0x00020032, // UI M1 0 RTVCommunicationSOPInstanceUID = 0x00020033, // UI M1 0 RTVSourceIdentifier = 0x00020035, // OB M1 0 RTVFlowIdentifier = 0x00020036, // OB M1 0 RTVFlowRTPSamplingRate = 0x00020037, // UL M1 0 RTVFlowActualFrameDuration = 0x00020038, // FD M1 0 PrivateInformationCreatorUID = 0x00020100, // UI M1 0 PrivateInformation = 0x00020102, // OB M1 0 FileSetID = 0x00041130, // CS M1 0 FileSetDescriptorFileID = 0x00041141, // CS M1T8 0 SpecificCharacterSetOfFileSetDescriptorFile = 0x00041142, // CS M1 0 OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity = 0x00041200, // UL M1 0 OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity = 0x00041202, // UL M1 0 FileSetConsistencyFlag = 0x00041212, // US M1 0 DirectoryRecordSequence = 0x00041220, // SQ M1 0 OffsetOfTheNextDirectoryRecord = 0x00041400, // UL M1 0 RecordInUseFlag = 0x00041410, // US M1 0 OffsetOfReferencedLowerLevelDirectoryEntity = 0x00041420, // UL M1 0 DirectoryRecordType = 0x00041430, // CS M1 0 PrivateRecordUID = 0x00041432, // UI M1 0 ReferencedFileID = 0x00041500, // CS M1T8 0 MRDRDirectoryRecordOffset = 0x00041504, // UL M1 1 ReferencedSOPClassUIDInFile = 0x00041510, // UI M1 0 ReferencedSOPInstanceUIDInFile = 0x00041511, // UI M1 0 ReferencedTransferSyntaxUIDInFile = 0x00041512, // UI M1 0 ReferencedRelatedGeneralSOPClassUIDInFile = 0x0004151A, // UI M1TN 0 NumberOfReferences = 0x00041600, // UL M1 1 CurrentFrameFunctionalGroupsSequence = 0x00060001, // SQ M1 0 LengthToEnd = 0x00080001, // UL M1 1 SpecificCharacterSet = 0x00080005, // CS M1TN 0 LanguageCodeSequence = 0x00080006, // SQ M1 0 ImageType = 0x00080008, // CS M2TN 0 RecognitionCode = 0x00080010, // SH M1 1 InstanceCreationDate = 0x00080012, // DA M1 0 InstanceCreationTime = 0x00080013, // TM M1 0 InstanceCreatorUID = 0x00080014, // UI M1 0 InstanceCoercionDateTime = 0x00080015, // DT M1 0 SOPClassUID = 0x00080016, // UI M1 0 SOPInstanceUID = 0x00080018, // UI M1 0 RelatedGeneralSOPClassUID = 0x0008001A, // UI M1TN 0 OriginalSpecializedSOPClassUID = 0x0008001B, // UI M1 0 StudyDate = 0x00080020, // DA M1 0 SeriesDate = 0x00080021, // DA M1 0 AcquisitionDate = 0x00080022, // DA M1 0 ContentDate = 0x00080023, // DA M1 0 OverlayDate = 0x00080024, // DA M1 1 CurveDate = 0x00080025, // DA M1 1 AcquisitionDateTime = 0x0008002A, // DT M1 0 StudyTime = 0x00080030, // TM M1 0 SeriesTime = 0x00080031, // TM M1 0 AcquisitionTime = 0x00080032, // TM M1 0 ContentTime = 0x00080033, // TM M1 0 OverlayTime = 0x00080034, // TM M1 1 CurveTime = 0x00080035, // TM M1 1 DataSetType = 0x00080040, // US M1 1 DataSetSubtype = 0x00080041, // LO M1 1 NuclearMedicineSeriesType = 0x00080042, // CS M1 1 AccessionNumber = 0x00080050, // SH M1 0 IssuerOfAccessionNumberSequence = 0x00080051, // SQ M1 0 QueryRetrieveLevel = 0x00080052, // CS M1 0 QueryRetrieveView = 0x00080053, // CS M1 0 RetrieveAETitle = 0x00080054, // AE M1TN 0 StationAETitle = 0x00080055, // AE M1 0 InstanceAvailability = 0x00080056, // CS M1 0 FailedSOPInstanceUIDList = 0x00080058, // UI M1TN 0 Modality = 0x00080060, // CS M1 0 ModalitiesInStudy = 0x00080061, // CS M1TN 0 SOPClassesInStudy = 0x00080062, // UI M1TN 0 AnatomicRegionsInStudyCodeSequence = 0x00080063, // SQ M1 0 ConversionType = 0x00080064, // CS M1 0 PresentationIntentType = 0x00080068, // CS M1 0 Manufacturer = 0x00080070, // LO M1 0 InstitutionName = 0x00080080, // LO M1 0 InstitutionAddress = 0x00080081, // ST M1 0 InstitutionCodeSequence = 0x00080082, // SQ M1 0 ReferringPhysicianName = 0x00080090, // PN M1 0 ReferringPhysicianAddress = 0x00080092, // ST M1 0 ReferringPhysicianTelephoneNumbers = 0x00080094, // SH M1TN 0 ReferringPhysicianIdentificationSequence = 0x00080096, // SQ M1 0 ConsultingPhysicianName = 0x0008009C, // PN M1TN 0 ConsultingPhysicianIdentificationSequence = 0x0008009D, // SQ M1 0 CodeValue = 0x00080100, // SH M1 0 ExtendedCodeValue = 0x00080101, // LO M1 DICOS CodingSchemeDesignator = 0x00080102, // SH M1 0 CodingSchemeVersion = 0x00080103, // SH M1 0 CodeMeaning = 0x00080104, // LO M1 0 MappingResource = 0x00080105, // CS M1 0 ContextGroupVersion = 0x00080106, // DT M1 0 ContextGroupLocalVersion = 0x00080107, // DT M1 0 ExtendedCodeMeaning = 0x00080108, // LT M1 DICOS CodingSchemeResourcesSequence = 0x00080109, // SQ M1 0 CodingSchemeURLType = 0x0008010A, // CS M1 0 ContextGroupExtensionFlag = 0x0008010B, // CS M1 0 CodingSchemeUID = 0x0008010C, // UI M1 0 ContextGroupExtensionCreatorUID = 0x0008010D, // UI M1 0 CodingSchemeURL = 0x0008010E, // UR M1 0 ContextIdentifier = 0x0008010F, // CS M1 0 CodingSchemeIdentificationSequence = 0x00080110, // SQ M1 0 CodingSchemeRegistry = 0x00080112, // LO M1 0 CodingSchemeExternalID = 0x00080114, // ST M1 0 CodingSchemeName = 0x00080115, // ST M1 0 CodingSchemeResponsibleOrganization = 0x00080116, // ST M1 0 ContextUID = 0x00080117, // UI M1 0 MappingResourceUID = 0x00080118, // UI M1 0 LongCodeValue = 0x00080119, // UC M1 0 URNCodeValue = 0x00080120, // UR M1 0 EquivalentCodeSequence = 0x00080121, // SQ M1 0 MappingResourceName = 0x00080122, // LO M1 0 ContextGroupIdentificationSequence = 0x00080123, // SQ M1 0 MappingResourceIdentificationSequence = 0x00080124, // SQ M1 0 TimezoneOffsetFromUTC = 0x00080201, // SH M1 0 ResponsibleGroupCodeSequence = 0x00080220, // SQ M1 0 EquipmentModality = 0x00080221, // CS M1 0 ManufacturerRelatedModelGroup = 0x00080222, // LO M1 0 PrivateDataElementCharacteristicsSequence = 0x00080300, // SQ M1 0 PrivateGroupReference = 0x00080301, // US M1 0 PrivateCreatorReference = 0x00080302, // LO M1 0 BlockIdentifyingInformationStatus = 0x00080303, // CS M1 0 NonidentifyingPrivateElements = 0x00080304, // US M1TN 0 DeidentificationActionSequence = 0x00080305, // SQ M1 0 IdentifyingPrivateElements = 0x00080306, // US M1TN 0 DeidentificationAction = 0x00080307, // CS M1 0 PrivateDataElement = 0x00080308, // US M1 0 PrivateDataElementValueMultiplicity = 0x00080309, // UL M1T3 0 PrivateDataElementValueRepresentation = 0x0008030A, // CS M1 0 PrivateDataElementNumberOfItems = 0x0008030B, // UL M1T2 0 PrivateDataElementName = 0x0008030C, // UC M1 0 PrivateDataElementKeyword = 0x0008030D, // UC M1 0 PrivateDataElementDescription = 0x0008030E, // UT M1 0 PrivateDataElementEncoding = 0x0008030F, // UT M1 0 PrivateDataElementDefinitionSequence = 0x00080310, // SQ M1 0 NetworkID = 0x00081000, // AE M1 1 StationName = 0x00081010, // SH M1 0 StudyDescription = 0x00081030, // LO M1 0 ProcedureCodeSequence = 0x00081032, // SQ M1 0 SeriesDescription = 0x0008103E, // LO M1 0 SeriesDescriptionCodeSequence = 0x0008103F, // SQ M1 0 InstitutionalDepartmentName = 0x00081040, // LO M1 0 InstitutionalDepartmentTypeCodeSequence = 0x00081041, // SQ M1 0 PhysiciansOfRecord = 0x00081048, // PN M1TN 0 PhysiciansOfRecordIdentificationSequence = 0x00081049, // SQ M1 0 PerformingPhysicianName = 0x00081050, // PN M1TN 0 PerformingPhysicianIdentificationSequence = 0x00081052, // SQ M1 0 NameOfPhysiciansReadingStudy = 0x00081060, // PN M1TN 0 PhysiciansReadingStudyIdentificationSequence = 0x00081062, // SQ M1 0 OperatorsName = 0x00081070, // PN M1TN 0 OperatorIdentificationSequence = 0x00081072, // SQ M1 0 AdmittingDiagnosesDescription = 0x00081080, // LO M1TN 0 AdmittingDiagnosesCodeSequence = 0x00081084, // SQ M1 0 ManufacturerModelName = 0x00081090, // LO M1 0 ReferencedResultsSequence = 0x00081100, // SQ M1 1 ReferencedStudySequence = 0x00081110, // SQ M1 0 ReferencedPerformedProcedureStepSequence = 0x00081111, // SQ M1 0 ReferencedSeriesSequence = 0x00081115, // SQ M1 0 ReferencedPatientSequence = 0x00081120, // SQ M1 0 ReferencedVisitSequence = 0x00081125, // SQ M1 0 ReferencedOverlaySequence = 0x00081130, // SQ M1 1 ReferencedStereometricInstanceSequence = 0x00081134, // SQ M1 0 ReferencedWaveformSequence = 0x0008113A, // SQ M1 0 ReferencedImageSequence = 0x00081140, // SQ M1 0 ReferencedCurveSequence = 0x00081145, // SQ M1 1 ReferencedInstanceSequence = 0x0008114A, // SQ M1 0 ReferencedRealWorldValueMappingInstanceSequence = 0x0008114B, // SQ M1 0 ReferencedSOPClassUID = 0x00081150, // UI M1 0 ReferencedSOPInstanceUID = 0x00081155, // UI M1 0 DefinitionSourceSequence = 0x00081156, // SQ M1 0 SOPClassesSupported = 0x0008115A, // UI M1TN 0 ReferencedFrameNumber = 0x00081160, // IS M1TN 0 SimpleFrameList = 0x00081161, // UL M1TN 0 CalculatedFrameList = 0x00081162, // UL M3T3N 0 TimeRange = 0x00081163, // FD M2 0 FrameExtractionSequence = 0x00081164, // SQ M1 0 MultiFrameSourceSOPInstanceUID = 0x00081167, // UI M1 0 RetrieveURL = 0x00081190, // UR M1 0 TransactionUID = 0x00081195, // UI M1 0 WarningReason = 0x00081196, // US M1 0 FailureReason = 0x00081197, // US M1 0 FailedSOPSequence = 0x00081198, // SQ M1 0 ReferencedSOPSequence = 0x00081199, // SQ M1 0 OtherFailuresSequence = 0x0008119A, // SQ M1 0 StudiesContainingOtherReferencedInstancesSequence = 0x00081200, // SQ M1 0 RelatedSeriesSequence = 0x00081250, // SQ M1 0 LossyImageCompressionRetired = 0x00082110, // CS M1 1 DerivationDescription = 0x00082111, // ST M1 0 SourceImageSequence = 0x00082112, // SQ M1 0 StageName = 0x00082120, // SH M1 0 StageNumber = 0x00082122, // IS M1 0 NumberOfStages = 0x00082124, // IS M1 0 ViewName = 0x00082127, // SH M1 0 ViewNumber = 0x00082128, // IS M1 0 NumberOfEventTimers = 0x00082129, // IS M1 0 NumberOfViewsInStage = 0x0008212A, // IS M1 0 EventElapsedTimes = 0x00082130, // DS M1TN 0 EventTimerNames = 0x00082132, // LO M1TN 0 EventTimerSequence = 0x00082133, // SQ M1 0 EventTimeOffset = 0x00082134, // FD M1 0 EventCodeSequence = 0x00082135, // SQ M1 0 StartTrim = 0x00082142, // IS M1 0 StopTrim = 0x00082143, // IS M1 0 RecommendedDisplayFrameRate = 0x00082144, // IS M1 0 TransducerPosition = 0x00082200, // CS M1 1 TransducerOrientation = 0x00082204, // CS M1 1 AnatomicStructure = 0x00082208, // CS M1 1 AnatomicRegionSequence = 0x00082218, // SQ M1 0 AnatomicRegionModifierSequence = 0x00082220, // SQ M1 0 PrimaryAnatomicStructureSequence = 0x00082228, // SQ M1 0 AnatomicStructureSpaceOrRegionSequence = 0x00082229, // SQ M1 1 PrimaryAnatomicStructureModifierSequence = 0x00082230, // SQ M1 0 TransducerPositionSequence = 0x00082240, // SQ M1 1 TransducerPositionModifierSequence = 0x00082242, // SQ M1 1 TransducerOrientationSequence = 0x00082244, // SQ M1 1 TransducerOrientationModifierSequence = 0x00082246, // SQ M1 1 AnatomicStructureSpaceOrRegionCodeSequenceTrial = 0x00082251, // SQ M1 1 AnatomicPortalOfEntranceCodeSequenceTrial = 0x00082253, // SQ M1 1 AnatomicApproachDirectionCodeSequenceTrial = 0x00082255, // SQ M1 1 AnatomicPerspectiveDescriptionTrial = 0x00082256, // ST M1 1 AnatomicPerspectiveCodeSequenceTrial = 0x00082257, // SQ M1 1 AnatomicLocationOfExaminingInstrumentDescriptionTrial = 0x00082258, // ST M1 1 AnatomicLocationOfExaminingInstrumentCodeSequenceTrial = 0x00082259, // SQ M1 1 AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial = 0x0008225A, // SQ M1 1 OnAxisBackgroundAnatomicStructureCodeSequenceTrial = 0x0008225C, // SQ M1 1 AlternateRepresentationSequence = 0x00083001, // SQ M1 0 AvailableTransferSyntaxUID = 0x00083002, // UI M1TN 0 IrradiationEventUID = 0x00083010, // UI M1TN 0 SourceIrradiationEventSequence = 0x00083011, // SQ M1 0 RadiopharmaceuticalAdministrationEventUID = 0x00083012, // UI M1 0 IdentifyingComments = 0x00084000, // LT M1 1 FrameType = 0x00089007, // CS M4 0 ReferencedImageEvidenceSequence = 0x00089092, // SQ M1 0 ReferencedRawDataSequence = 0x00089121, // SQ M1 0 CreatorVersionUID = 0x00089123, // UI M1 0 DerivationImageSequence = 0x00089124, // SQ M1 0 SourceImageEvidenceSequence = 0x00089154, // SQ M1 0 PixelPresentation = 0x00089205, // CS M1 0 VolumetricProperties = 0x00089206, // CS M1 0 VolumeBasedCalculationTechnique = 0x00089207, // CS M1 0 ComplexImageComponent = 0x00089208, // CS M1 0 AcquisitionContrast = 0x00089209, // CS M1 0 DerivationCodeSequence = 0x00089215, // SQ M1 0 ReferencedPresentationStateSequence = 0x00089237, // SQ M1 0 ReferencedOtherPlaneSequence = 0x00089410, // SQ M1 0 FrameDisplaySequence = 0x00089458, // SQ M1 0 RecommendedDisplayFrameRateInFloat = 0x00089459, // FL M1 0 SkipFrameRangeFlag = 0x00089460, // CS M1 0 PatientName = 0x00100010, // PN M1 0 PatientID = 0x00100020, // LO M1 0 IssuerOfPatientID = 0x00100021, // LO M1 0 TypeOfPatientID = 0x00100022, // CS M1 0 IssuerOfPatientIDQualifiersSequence = 0x00100024, // SQ M1 0 SourcePatientGroupIdentificationSequence = 0x00100026, // SQ M1 0 GroupOfPatientsIdentificationSequence = 0x00100027, // SQ M1 0 SubjectRelativePositionInImage = 0x00100028, // US M3 0 PatientBirthDate = 0x00100030, // DA M1 0 PatientBirthTime = 0x00100032, // TM M1 0 PatientBirthDateInAlternativeCalendar = 0x00100033, // LO M1 0 PatientDeathDateInAlternativeCalendar = 0x00100034, // LO M1 0 PatientAlternativeCalendar = 0x00100035, // CS M1 0 PatientSex = 0x00100040, // CS M1 0 PatientInsurancePlanCodeSequence = 0x00100050, // SQ M1 0 PatientPrimaryLanguageCodeSequence = 0x00100101, // SQ M1 0 PatientPrimaryLanguageModifierCodeSequence = 0x00100102, // SQ M1 0 QualityControlSubject = 0x00100200, // CS M1 0 QualityControlSubjectTypeCodeSequence = 0x00100201, // SQ M1 0 StrainDescription = 0x00100212, // UC M1 0 StrainNomenclature = 0x00100213, // LO M1 0 StrainStockNumber = 0x00100214, // LO M1 0 StrainSourceRegistryCodeSequence = 0x00100215, // SQ M1 0 StrainStockSequence = 0x00100216, // SQ M1 0 StrainSource = 0x00100217, // LO M1 0 StrainAdditionalInformation = 0x00100218, // UT M1 0 StrainCodeSequence = 0x00100219, // SQ M1 0 GeneticModificationsSequence = 0x00100221, // SQ M1 0 GeneticModificationsDescription = 0x00100222, // UC M1 0 GeneticModificationsNomenclature = 0x00100223, // LO M1 0 GeneticModificationsCodeSequence = 0x00100229, // SQ M1 0 OtherPatientIDs = 0x00101000, // LO M1TN 1 OtherPatientNames = 0x00101001, // PN M1TN 0 OtherPatientIDsSequence = 0x00101002, // SQ M1 0 PatientBirthName = 0x00101005, // PN M1 0 PatientAge = 0x00101010, // AS M1 0 PatientSize = 0x00101020, // DS M1 0 PatientSizeCodeSequence = 0x00101021, // SQ M1 0 PatientBodyMassIndex = 0x00101022, // DS M1 0 MeasuredAPDimension = 0x00101023, // DS M1 0 MeasuredLateralDimension = 0x00101024, // DS M1 0 PatientWeight = 0x00101030, // DS M1 0 PatientAddress = 0x00101040, // LO M1 0 InsurancePlanIdentification = 0x00101050, // LO M1TN 1 PatientMotherBirthName = 0x00101060, // PN M1 0 MilitaryRank = 0x00101080, // LO M1 0 BranchOfService = 0x00101081, // LO M1 0 MedicalRecordLocator = 0x00101090, // LO M1 1 ReferencedPatientPhotoSequence = 0x00101100, // SQ M1 0 MedicalAlerts = 0x00102000, // LO M1TN 0 Allergies = 0x00102110, // LO M1TN 0 CountryOfResidence = 0x00102150, // LO M1 0 RegionOfResidence = 0x00102152, // LO M1 0 PatientTelephoneNumbers = 0x00102154, // SH M1TN 0 PatientTelecomInformation = 0x00102155, // LT M1 0 EthnicGroup = 0x00102160, // SH M1 0 Occupation = 0x00102180, // SH M1 0 SmokingStatus = 0x001021A0, // CS M1 0 AdditionalPatientHistory = 0x001021B0, // LT M1 0 PregnancyStatus = 0x001021C0, // US M1 0 LastMenstrualDate = 0x001021D0, // DA M1 0 PatientReligiousPreference = 0x001021F0, // LO M1 0 PatientSpeciesDescription = 0x00102201, // LO M1 0 PatientSpeciesCodeSequence = 0x00102202, // SQ M1 0 PatientSexNeutered = 0x00102203, // CS M1 0 AnatomicalOrientationType = 0x00102210, // CS M1 0 PatientBreedDescription = 0x00102292, // LO M1 0 PatientBreedCodeSequence = 0x00102293, // SQ M1 0 BreedRegistrationSequence = 0x00102294, // SQ M1 0 BreedRegistrationNumber = 0x00102295, // LO M1 0 BreedRegistryCodeSequence = 0x00102296, // SQ M1 0 ResponsiblePerson = 0x00102297, // PN M1 0 ResponsiblePersonRole = 0x00102298, // CS M1 0 ResponsibleOrganization = 0x00102299, // LO M1 0 PatientComments = 0x00104000, // LT M1 0 ExaminedBodyThickness = 0x00109431, // FL M1 0 ClinicalTrialSponsorName = 0x00120010, // LO M1 0 ClinicalTrialProtocolID = 0x00120020, // LO M1 0 ClinicalTrialProtocolName = 0x00120021, // LO M1 0 ClinicalTrialSiteID = 0x00120030, // LO M1 0 ClinicalTrialSiteName = 0x00120031, // LO M1 0 ClinicalTrialSubjectID = 0x00120040, // LO M1 0 ClinicalTrialSubjectReadingID = 0x00120042, // LO M1 0 ClinicalTrialTimePointID = 0x00120050, // LO M1 0 ClinicalTrialTimePointDescription = 0x00120051, // ST M1 0 LongitudinalTemporalOffsetFromEvent = 0x00120052, // FD M1 0 LongitudinalTemporalEventType = 0x00120053, // CS M1 0 ClinicalTrialCoordinatingCenterName = 0x00120060, // LO M1 0 PatientIdentityRemoved = 0x00120062, // CS M1 0 DeidentificationMethod = 0x00120063, // LO M1TN 0 DeidentificationMethodCodeSequence = 0x00120064, // SQ M1 0 ClinicalTrialSeriesID = 0x00120071, // LO M1 0 ClinicalTrialSeriesDescription = 0x00120072, // LO M1 0 ClinicalTrialProtocolEthicsCommitteeName = 0x00120081, // LO M1 0 ClinicalTrialProtocolEthicsCommitteeApprovalNumber = 0x00120082, // LO M1 0 ConsentForClinicalTrialUseSequence = 0x00120083, // SQ M1 0 DistributionType = 0x00120084, // CS M1 0 ConsentForDistributionFlag = 0x00120085, // CS M1 0 EthicsCommitteeApprovalEffectivenessStartDate = 0x00120086, // DA M1 0 EthicsCommitteeApprovalEffectivenessEndDate = 0x00120087, // DA M1 0 CADFileFormat = 0x00140023, // ST M1 1 ComponentReferenceSystem = 0x00140024, // ST M1 1 ComponentManufacturingProcedure = 0x00140025, // ST M1 DICONDE ComponentManufacturer = 0x00140028, // ST M1 DICONDE MaterialThickness = 0x00140030, // DS M1TN DICONDE MaterialPipeDiameter = 0x00140032, // DS M1TN DICONDE MaterialIsolationDiameter = 0x00140034, // DS M1TN DICONDE MaterialGrade = 0x00140042, // ST M1 DICONDE MaterialPropertiesDescription = 0x00140044, // ST M1 DICONDE MaterialPropertiesFileFormatRetired = 0x00140045, // ST M1 1 MaterialNotes = 0x00140046, // LT M1 DICONDE ComponentShape = 0x00140050, // CS M1 DICONDE CurvatureType = 0x00140052, // CS M1 DICONDE OuterDiameter = 0x00140054, // DS M1 DICONDE InnerDiameter = 0x00140056, // DS M1 DICONDE ComponentWelderIDs = 0x00140100, // LO M1TN DICONDE SecondaryApprovalStatus = 0x00140101, // CS M1 DICONDE SecondaryReviewDate = 0x00140102, // DA M1 DICONDE SecondaryReviewTime = 0x00140103, // TM M1 DICONDE SecondaryReviewerName = 0x00140104, // PN M1 DICONDE RepairID = 0x00140105, // ST M1 DICONDE MultipleComponentApprovalSequence = 0x00140106, // SQ M1 DICONDE OtherApprovalStatus = 0x00140107, // CS M1TN DICONDE OtherSecondaryApprovalStatus = 0x00140108, // CS M1TN DICONDE ActualEnvironmentalConditions = 0x00141010, // ST M1 DICONDE ExpiryDate = 0x00141020, // DA M1 DICONDE EnvironmentalConditions = 0x00141040, // ST M1 DICONDE EvaluatorSequence = 0x00142002, // SQ M1 DICONDE EvaluatorNumber = 0x00142004, // IS M1 DICONDE EvaluatorName = 0x00142006, // PN M1 DICONDE EvaluationAttempt = 0x00142008, // IS M1 DICONDE IndicationSequence = 0x00142012, // SQ M1 DICONDE IndicationNumber = 0x00142014, // IS M1 DICONDE IndicationLabel = 0x00142016, // SH M1 DICONDE IndicationDescription = 0x00142018, // ST M1 DICONDE IndicationType = 0x0014201A, // CS M1TN DICONDE IndicationDisposition = 0x0014201C, // CS M1 DICONDE IndicationROISequence = 0x0014201E, // SQ M1 DICONDE IndicationPhysicalPropertySequence = 0x00142030, // SQ M1 DICONDE PropertyLabel = 0x00142032, // SH M1 DICONDE CoordinateSystemNumberOfAxes = 0x00142202, // IS M1 DICONDE CoordinateSystemAxesSequence = 0x00142204, // SQ M1 DICONDE CoordinateSystemAxisDescription = 0x00142206, // ST M1 DICONDE CoordinateSystemDataSetMapping = 0x00142208, // CS M1 DICONDE CoordinateSystemAxisNumber = 0x0014220A, // IS M1 DICONDE CoordinateSystemAxisType = 0x0014220C, // CS M1 DICONDE CoordinateSystemAxisUnits = 0x0014220E, // CS M1 DICONDE CoordinateSystemAxisValues = 0x00142210, // OB M1 DICONDE CoordinateSystemTransformSequence = 0x00142220, // SQ M1 DICONDE TransformDescription = 0x00142222, // ST M1 DICONDE TransformNumberOfAxes = 0x00142224, // IS M1 DICONDE TransformOrderOfAxes = 0x00142226, // IS M1TN DICONDE TransformedAxisUnits = 0x00142228, // CS M1 DICONDE CoordinateSystemTransformRotationAndScaleMatrix = 0x0014222A, // DS M1TN DICONDE CoordinateSystemTransformTranslationMatrix = 0x0014222C, // DS M1TN DICONDE InternalDetectorFrameTime = 0x00143011, // DS M1 DICONDE NumberOfFramesIntegrated = 0x00143012, // DS M1 DICONDE DetectorTemperatureSequence = 0x00143020, // SQ M1 DICONDE SensorName = 0x00143022, // ST M1 DICONDE HorizontalOffsetOfSensor = 0x00143024, // DS M1 DICONDE VerticalOffsetOfSensor = 0x00143026, // DS M1 DICONDE SensorTemperature = 0x00143028, // DS M1 DICONDE DarkCurrentSequence = 0x00143040, // SQ M1 DICONDE DarkCurrentCounts = 0x00143050, // OX M1 DICONDE GainCorrectionReferenceSequence = 0x00143060, // SQ M1 DICONDE AirCounts = 0x00143070, // OX M1 DICONDE KVUsedInGainCalibration = 0x00143071, // DS M1 DICONDE MAUsedInGainCalibration = 0x00143072, // DS M1 DICONDE NumberOfFramesUsedForIntegration = 0x00143073, // DS M1 DICONDE FilterMaterialUsedInGainCalibration = 0x00143074, // LO M1 DICONDE FilterThicknessUsedInGainCalibration = 0x00143075, // DS M1 DICONDE DateOfGainCalibration = 0x00143076, // DA M1 DICONDE TimeOfGainCalibration = 0x00143077, // TM M1 DICONDE BadPixelImage = 0x00143080, // OB M1 DICONDE CalibrationNotes = 0x00143099, // LT M1 DICONDE PulserEquipmentSequence = 0x00144002, // SQ M1 DICONDE PulserType = 0x00144004, // CS M1 DICONDE PulserNotes = 0x00144006, // LT M1 DICONDE ReceiverEquipmentSequence = 0x00144008, // SQ M1 DICONDE AmplifierType = 0x0014400A, // CS M1 DICONDE ReceiverNotes = 0x0014400C, // LT M1 DICONDE PreAmplifierEquipmentSequence = 0x0014400E, // SQ M1 DICONDE PreAmplifierNotes = 0x0014400F, // LT M1 DICONDE TransmitTransducerSequence = 0x00144010, // SQ M1 DICONDE ReceiveTransducerSequence = 0x00144011, // SQ M1 DICONDE NumberOfElements = 0x00144012, // US M1 DICONDE ElementShape = 0x00144013, // CS M1 DICONDE ElementDimensionA = 0x00144014, // DS M1 DICONDE ElementDimensionB = 0x00144015, // DS M1 DICONDE ElementPitchA = 0x00144016, // DS M1 DICONDE MeasuredBeamDimensionA = 0x00144017, // DS M1 DICONDE MeasuredBeamDimensionB = 0x00144018, // DS M1 DICONDE LocationOfMeasuredBeamDiameter = 0x00144019, // DS M1 DICONDE NominalFrequency = 0x0014401A, // DS M1 DICONDE MeasuredCenterFrequency = 0x0014401B, // DS M1 DICONDE MeasuredBandwidth = 0x0014401C, // DS M1 DICONDE ElementPitchB = 0x0014401D, // DS M1 DICONDE PulserSettingsSequence = 0x00144020, // SQ M1 DICONDE PulseWidth = 0x00144022, // DS M1 DICONDE ExcitationFrequency = 0x00144024, // DS M1 DICONDE ModulationType = 0x00144026, // CS M1 DICONDE Damping = 0x00144028, // DS M1 DICONDE ReceiverSettingsSequence = 0x00144030, // SQ M1 DICONDE AcquiredSoundpathLength = 0x00144031, // DS M1 DICONDE AcquisitionCompressionType = 0x00144032, // CS M1 DICONDE AcquisitionSampleSize = 0x00144033, // IS M1 DICONDE RectifierSmoothing = 0x00144034, // DS M1 DICONDE DACSequence = 0x00144035, // SQ M1 DICONDE DACType = 0x00144036, // CS M1 DICONDE DACGainPoints = 0x00144038, // DS M1TN DICONDE DACTimePoints = 0x0014403A, // DS M1TN DICONDE DACAmplitude = 0x0014403C, // DS M1TN DICONDE PreAmplifierSettingsSequence = 0x00144040, // SQ M1 DICONDE TransmitTransducerSettingsSequence = 0x00144050, // SQ M1 DICONDE ReceiveTransducerSettingsSequence = 0x00144051, // SQ M1 DICONDE IncidentAngle = 0x00144052, // DS M1 DICONDE CouplingTechnique = 0x00144054, // ST M1 DICONDE CouplingMedium = 0x00144056, // ST M1 DICONDE CouplingVelocity = 0x00144057, // DS M1 DICONDE ProbeCenterLocationX = 0x00144058, // DS M1 DICONDE ProbeCenterLocationZ = 0x00144059, // DS M1 DICONDE SoundPathLength = 0x0014405A, // DS M1 DICONDE DelayLawIdentifier = 0x0014405C, // ST M1 DICONDE GateSettingsSequence = 0x00144060, // SQ M1 DICONDE GateThreshold = 0x00144062, // DS M1 DICONDE VelocityOfSound = 0x00144064, // DS M1 DICONDE CalibrationSettingsSequence = 0x00144070, // SQ M1 DICONDE CalibrationProcedure = 0x00144072, // ST M1 DICONDE ProcedureVersion = 0x00144074, // SH M1 DICONDE ProcedureCreationDate = 0x00144076, // DA M1 DICONDE ProcedureExpirationDate = 0x00144078, // DA M1 DICONDE ProcedureLastModifiedDate = 0x0014407A, // DA M1 DICONDE CalibrationTime = 0x0014407C, // TM M1TN DICONDE CalibrationDate = 0x0014407E, // DA M1TN DICONDE ProbeDriveEquipmentSequence = 0x00144080, // SQ M1 DICONDE DriveType = 0x00144081, // CS M1 DICONDE ProbeDriveNotes = 0x00144082, // LT M1 DICONDE DriveProbeSequence = 0x00144083, // SQ M1 DICONDE ProbeInductance = 0x00144084, // DS M1 DICONDE ProbeResistance = 0x00144085, // DS M1 DICONDE ReceiveProbeSequence = 0x00144086, // SQ M1 DICONDE ProbeDriveSettingsSequence = 0x00144087, // SQ M1 DICONDE BridgeResistors = 0x00144088, // DS M1 DICONDE ProbeOrientationAngle = 0x00144089, // DS M1 DICONDE UserSelectedGainY = 0x0014408B, // DS M1 DICONDE UserSelectedPhase = 0x0014408C, // DS M1 DICONDE UserSelectedOffsetX = 0x0014408D, // DS M1 DICONDE UserSelectedOffsetY = 0x0014408E, // DS M1 DICONDE ChannelSettingsSequence = 0x00144091, // SQ M1 DICONDE ChannelThreshold = 0x00144092, // DS M1 DICONDE ScannerSettingsSequence = 0x0014409A, // SQ M1 DICONDE ScanProcedure = 0x0014409B, // ST M1 DICONDE TranslationRateX = 0x0014409C, // DS M1 DICONDE TranslationRateY = 0x0014409D, // DS M1 DICONDE ChannelOverlap = 0x0014409F, // DS M1 DICONDE ImageQualityIndicatorType = 0x001440A0, // LO M1 DICONDE ImageQualityIndicatorMaterial = 0x001440A1, // LO M1 DICONDE ImageQualityIndicatorSize = 0x001440A2, // LO M1 DICONDE LINACEnergy = 0x00145002, // IS M1 DICONDE LINACOutput = 0x00145004, // IS M1 DICONDE ActiveAperture = 0x00145100, // US M1 DICONDE TotalAperture = 0x00145101, // DS M1 DICONDE ApertureElevation = 0x00145102, // DS M1 DICONDE MainLobeAngle = 0x00145103, // DS M1 DICONDE MainRoofAngle = 0x00145104, // DS M1 DICONDE ConnectorType = 0x00145105, // CS M1 DICONDE WedgeModelNumber = 0x00145106, // SH M1 DICONDE WedgeAngleFloat = 0x00145107, // DS M1 DICONDE WedgeRoofAngle = 0x00145108, // DS M1 DICONDE WedgeElement1Position = 0x00145109, // CS M1 DICONDE WedgeMaterialVelocity = 0x0014510A, // DS M1 DICONDE WedgeMaterial = 0x0014510B, // SH M1 DICONDE WedgeOffsetZ = 0x0014510C, // DS M1 DICONDE WedgeOriginOffsetX = 0x0014510D, // DS M1 DICONDE WedgeTimeDelay = 0x0014510E, // DS M1 DICONDE WedgeName = 0x0014510F, // SH M1 DICONDE WedgeManufacturerName = 0x00145110, // SH M1 DICONDE WedgeDescription = 0x00145111, // LO M1 DICONDE NominalBeamAngle = 0x00145112, // DS M1 DICONDE WedgeOffsetX = 0x00145113, // DS M1 DICONDE WedgeOffsetY = 0x00145114, // DS M1 DICONDE WedgeTotalLength = 0x00145115, // DS M1 DICONDE WedgeInContactLength = 0x00145116, // DS M1 DICONDE WedgeFrontGap = 0x00145117, // DS M1 DICONDE WedgeTotalHeight = 0x00145118, // DS M1 DICONDE WedgeFrontHeight = 0x00145119, // DS M1 DICONDE WedgeRearHeight = 0x0014511A, // DS M1 DICONDE WedgeTotalWidth = 0x0014511B, // DS M1 DICONDE WedgeInContactWidth = 0x0014511C, // DS M1 DICONDE WedgeChamferHeight = 0x0014511D, // DS M1 DICONDE WedgeCurve = 0x0014511E, // CS M1 DICONDE RadiusAlongWedge = 0x0014511F, // DS M1 DICONDE WhitePoint = 0x00160001, // DS M1 0 PrimaryChromaticities = 0x00160002, // DS M3 0 BatteryLevel = 0x00160003, // UT M1 0 ExposureTimeInSeconds = 0x00160004, // DS M1 0 FNumber = 0x00160005, // DS M1 0 OECFRows = 0x00160006, // IS M1 0 OECFColumns = 0x00160007, // IS M1 0 OECFColumnNames = 0x00160008, // UC M1TN 0 OECFValues = 0x00160009, // DS M1TN 0 SpatialFrequencyResponseRows = 0x0016000A, // IS M1 0 SpatialFrequencyResponseColumns = 0x0016000B, // IS M1 0 SpatialFrequencyResponseColumnNames = 0x0016000C, // UC M1TN 0 SpatialFrequencyResponseValues = 0x0016000D, // DS M1TN 0 ColorFilterArrayPatternRows = 0x0016000E, // IS M1 0 ColorFilterArrayPatternColumns = 0x0016000F, // IS M1 0 ColorFilterArrayPatternValues = 0x00160010, // DS M1TN 0 FlashFiringStatus = 0x00160011, // US M1 0 FlashReturnStatus = 0x00160012, // US M1 0 FlashMode = 0x00160013, // US M1 0 FlashFunctionPresent = 0x00160014, // US M1 0 FlashRedEyeMode = 0x00160015, // US M1 0 ExposureProgram = 0x00160016, // US M1 0 SpectralSensitivity = 0x00160017, // UT M1 0 PhotographicSensitivity = 0x00160018, // IS M1 0 SelfTimerMode = 0x00160019, // IS M1 0 SensitivityType = 0x0016001A, // US M1 0 StandardOutputSensitivity = 0x0016001B, // IS M1 0 RecommendedExposureIndex = 0x0016001C, // IS M1 0 ISOSpeed = 0x0016001D, // IS M1 0 ISOSpeedLatitudeyyy = 0x0016001E, // IS M1 0 ISOSpeedLatitudezzz = 0x0016001F, // IS M1 0 EXIFVersion = 0x00160020, // UT M1 0 ShutterSpeedValue = 0x00160021, // DS M1 0 ApertureValue = 0x00160022, // DS M1 0 BrightnessValue = 0x00160023, // DS M1 0 ExposureBiasValue = 0x00160024, // DS M1 0 MaxApertureValue = 0x00160025, // DS M1 0 SubjectDistance = 0x00160026, // DS M1 0 MeteringMode = 0x00160027, // US M1 0 LightSource = 0x00160028, // US M1 0 FocalLength = 0x00160029, // DS M1 0 SubjectArea = 0x0016002A, // IS M2T4 0 MakerNote = 0x0016002B, // OB M1 0 Temperature = 0x00160030, // DS M1 0 Humidity = 0x00160031, // DS M1 0 Pressure = 0x00160032, // DS M1 0 WaterDepth = 0x00160033, // DS M1 0 Acceleration = 0x00160034, // DS M1 0 CameraElevationAngle = 0x00160035, // DS M1 0 FlashEnergy = 0x00160036, // DS M1T2 0 SubjectLocation = 0x00160037, // IS M2 0 PhotographicExposureIndex = 0x00160038, // DS M1 0 SensingMethod = 0x00160039, // US M1 0 FileSource = 0x0016003A, // US M1 0 SceneType = 0x0016003B, // US M1 0 CustomRendered = 0x00160041, // US M1 0 ExposureMode = 0x00160042, // US M1 0 WhiteBalance = 0x00160043, // US M1 0 DigitalZoomRatio = 0x00160044, // DS M1 0 FocalLengthIn35mmFilm = 0x00160045, // IS M1 0 SceneCaptureType = 0x00160046, // US M1 0 GainControl = 0x00160047, // US M1 0 Contrast = 0x00160048, // US M1 0 Saturation = 0x00160049, // US M1 0 Sharpness = 0x0016004A, // US M1 0 DeviceSettingDescription = 0x0016004B, // OB M1 0 SubjectDistanceRange = 0x0016004C, // US M1 0 CameraOwnerName = 0x0016004D, // UT M1 0 LensSpecification = 0x0016004E, // DS M4 0 LensMake = 0x0016004F, // UT M1 0 LensModel = 0x00160050, // UT M1 0 LensSerialNumber = 0x00160051, // UT M1 0 InteroperabilityIndex = 0x00160061, // CS M1 0 InteroperabilityVersion = 0x00160062, // OB M1 0 GPSVersionID = 0x00160070, // OB M1 0 GPSLatitudeRef = 0x00160071, // CS M1 0 GPSLatitude = 0x00160072, // DS M3 0 GPSLongitudeRef = 0x00160073, // CS M1 0 GPSLongitude = 0x00160074, // DS M3 0 GPSAltitudeRef = 0x00160075, // US M1 0 GPSAltitude = 0x00160076, // DS M1 0 GPSTimeStamp = 0x00160077, // DT M1 0 GPSSatellites = 0x00160078, // UT M1 0 GPSStatus = 0x00160079, // CS M1 0 GPSMeasureMode = 0x0016007A, // CS M1 0 GPSDOP = 0x0016007B, // DS M1 0 GPSSpeedRef = 0x0016007C, // CS M1 0 GPSSpeed = 0x0016007D, // DS M1 0 GPSTrackRef = 0x0016007E, // CS M1 0 GPSTrack = 0x0016007F, // DS M1 0 GPSImgDirectionRef = 0x00160080, // CS M1 0 GPSImgDirection = 0x00160081, // DS M1 0 GPSMapDatum = 0x00160082, // UT M1 0 GPSDestLatitudeRef = 0x00160083, // CS M1 0 GPSDestLatitude = 0x00160084, // DS M3 0 GPSDestLongitudeRef = 0x00160085, // CS M1 0 GPSDestLongitude = 0x00160086, // DS M3 0 GPSDestBearingRef = 0x00160087, // CS M1 0 GPSDestBearing = 0x00160088, // DS M1 0 GPSDestDistanceRef = 0x00160089, // CS M1 0 GPSDestDistance = 0x0016008A, // DS M1 0 GPSProcessingMethod = 0x0016008B, // OB M1 0 GPSAreaInformation = 0x0016008C, // OB M1 0 GPSDateStamp = 0x0016008D, // DT M1 0 GPSDifferential = 0x0016008E, // IS M1 0 ContrastBolusAgent = 0x00180010, // LO M1 0 ContrastBolusAgentSequence = 0x00180012, // SQ M1 0 ContrastBolusT1Relaxivity = 0x00180013, // FL M1 0 ContrastBolusAdministrationRouteSequence = 0x00180014, // SQ M1 0 BodyPartExamined = 0x00180015, // CS M1 0 ScanningSequence = 0x00180020, // CS M1TN 0 SequenceVariant = 0x00180021, // CS M1TN 0 ScanOptions = 0x00180022, // CS M1TN 0 MRAcquisitionType = 0x00180023, // CS M1 0 SequenceName = 0x00180024, // SH M1 0 AngioFlag = 0x00180025, // CS M1 0 InterventionDrugInformationSequence = 0x00180026, // SQ M1 0 InterventionDrugStopTime = 0x00180027, // TM M1 0 InterventionDrugDose = 0x00180028, // DS M1 0 InterventionDrugCodeSequence = 0x00180029, // SQ M1 0 AdditionalDrugSequence = 0x0018002A, // SQ M1 0 Radionuclide = 0x00180030, // LO M1TN 1 Radiopharmaceutical = 0x00180031, // LO M1 0 EnergyWindowCenterline = 0x00180032, // DS M1 1 EnergyWindowTotalWidth = 0x00180033, // DS M1TN 1 InterventionDrugName = 0x00180034, // LO M1 0 InterventionDrugStartTime = 0x00180035, // TM M1 0 InterventionSequence = 0x00180036, // SQ M1 0 TherapyType = 0x00180037, // CS M1 1 InterventionStatus = 0x00180038, // CS M1 0 TherapyDescription = 0x00180039, // CS M1 1 InterventionDescription = 0x0018003A, // ST M1 0 CineRate = 0x00180040, // IS M1 0 InitialCineRunState = 0x00180042, // CS M1 0 SliceThickness = 0x00180050, // DS M1 0 KVP = 0x00180060, // DS M1 0 CountsAccumulated = 0x00180070, // IS M1 0 AcquisitionTerminationCondition = 0x00180071, // CS M1 0 EffectiveDuration = 0x00180072, // DS M1 0 AcquisitionStartCondition = 0x00180073, // CS M1 0 AcquisitionStartConditionData = 0x00180074, // IS M1 0 AcquisitionTerminationConditionData = 0x00180075, // IS M1 0 RepetitionTime = 0x00180080, // DS M1 0 EchoTime = 0x00180081, // DS M1 0 InversionTime = 0x00180082, // DS M1 0 NumberOfAverages = 0x00180083, // DS M1 0 ImagingFrequency = 0x00180084, // DS M1 0 ImagedNucleus = 0x00180085, // SH M1 0 EchoNumbers = 0x00180086, // IS M1TN 0 MagneticFieldStrength = 0x00180087, // DS M1 0 SpacingBetweenSlices = 0x00180088, // DS M1 0 NumberOfPhaseEncodingSteps = 0x00180089, // IS M1 0 DataCollectionDiameter = 0x00180090, // DS M1 0 EchoTrainLength = 0x00180091, // IS M1 0 PercentSampling = 0x00180093, // DS M1 0 PercentPhaseFieldOfView = 0x00180094, // DS M1 0 PixelBandwidth = 0x00180095, // DS M1 0 DeviceSerialNumber = 0x00181000, // LO M1 0 DeviceUID = 0x00181002, // UI M1 0 DeviceID = 0x00181003, // LO M1 0 PlateID = 0x00181004, // LO M1 0 GeneratorID = 0x00181005, // LO M1 0 GridID = 0x00181006, // LO M1 0 CassetteID = 0x00181007, // LO M1 0 GantryID = 0x00181008, // LO M1 0 UniqueDeviceIdentifier = 0x00181009, // UT M1 0 UDISequence = 0x0018100A, // SQ M1 0 ManufacturerDeviceClassUID = 0x0018100B, // UI M1TN 0 SecondaryCaptureDeviceID = 0x00181010, // LO M1 0 HardcopyCreationDeviceID = 0x00181011, // LO M1 1 DateOfSecondaryCapture = 0x00181012, // DA M1 0 TimeOfSecondaryCapture = 0x00181014, // TM M1 0 SecondaryCaptureDeviceManufacturer = 0x00181016, // LO M1 0 HardcopyDeviceManufacturer = 0x00181017, // LO M1 1 SecondaryCaptureDeviceManufacturerModelName = 0x00181018, // LO M1 0 SecondaryCaptureDeviceSoftwareVersions = 0x00181019, // LO M1TN 0 HardcopyDeviceSoftwareVersion = 0x0018101A, // LO M1TN 1 HardcopyDeviceManufacturerModelName = 0x0018101B, // LO M1 1 SoftwareVersions = 0x00181020, // LO M1TN 0 VideoImageFormatAcquired = 0x00181022, // SH M1 0 DigitalImageFormatAcquired = 0x00181023, // LO M1 0 ProtocolName = 0x00181030, // LO M1 0 ContrastBolusRoute = 0x00181040, // LO M1 0 ContrastBolusVolume = 0x00181041, // DS M1 0 ContrastBolusStartTime = 0x00181042, // TM M1 0 ContrastBolusStopTime = 0x00181043, // TM M1 0 ContrastBolusTotalDose = 0x00181044, // DS M1 0 SyringeCounts = 0x00181045, // IS M1 0 ContrastFlowRate = 0x00181046, // DS M1TN 0 ContrastFlowDuration = 0x00181047, // DS M1TN 0 ContrastBolusIngredient = 0x00181048, // CS M1 0 ContrastBolusIngredientConcentration = 0x00181049, // DS M1 0 SpatialResolution = 0x00181050, // DS M1 0 TriggerTime = 0x00181060, // DS M1 0 TriggerSourceOrType = 0x00181061, // LO M1 0 NominalInterval = 0x00181062, // IS M1 0 FrameTime = 0x00181063, // DS M1 0 CardiacFramingType = 0x00181064, // LO M1 0 FrameTimeVector = 0x00181065, // DS M1TN 0 FrameDelay = 0x00181066, // DS M1 0 ImageTriggerDelay = 0x00181067, // DS M1 0 MultiplexGroupTimeOffset = 0x00181068, // DS M1 0 TriggerTimeOffset = 0x00181069, // DS M1 0 SynchronizationTrigger = 0x0018106A, // CS M1 0 SynchronizationChannel = 0x0018106C, // US M2 0 TriggerSamplePosition = 0x0018106E, // UL M1 0 RadiopharmaceuticalRoute = 0x00181070, // LO M1 0 RadiopharmaceuticalVolume = 0x00181071, // DS M1 0 RadiopharmaceuticalStartTime = 0x00181072, // TM M1 0 RadiopharmaceuticalStopTime = 0x00181073, // TM M1 0 RadionuclideTotalDose = 0x00181074, // DS M1 0 RadionuclideHalfLife = 0x00181075, // DS M1 0 RadionuclidePositronFraction = 0x00181076, // DS M1 0 RadiopharmaceuticalSpecificActivity = 0x00181077, // DS M1 0 RadiopharmaceuticalStartDateTime = 0x00181078, // DT M1 0 RadiopharmaceuticalStopDateTime = 0x00181079, // DT M1 0 BeatRejectionFlag = 0x00181080, // CS M1 0 LowRRValue = 0x00181081, // IS M1 0 HighRRValue = 0x00181082, // IS M1 0 IntervalsAcquired = 0x00181083, // IS M1 0 IntervalsRejected = 0x00181084, // IS M1 0 PVCRejection = 0x00181085, // LO M1 0 SkipBeats = 0x00181086, // IS M1 0 HeartRate = 0x00181088, // IS M1 0 CardiacNumberOfImages = 0x00181090, // IS M1 0 TriggerWindow = 0x00181094, // IS M1 0 ReconstructionDiameter = 0x00181100, // DS M1 0 DistanceSourceToDetector = 0x00181110, // DS M1 0 DistanceSourceToPatient = 0x00181111, // DS M1 0 EstimatedRadiographicMagnificationFactor = 0x00181114, // DS M1 0 GantryDetectorTilt = 0x00181120, // DS M1 0 GantryDetectorSlew = 0x00181121, // DS M1 0 TableHeight = 0x00181130, // DS M1 0 TableTraverse = 0x00181131, // DS M1 0 TableMotion = 0x00181134, // CS M1 0 TableVerticalIncrement = 0x00181135, // DS M1TN 0 TableLateralIncrement = 0x00181136, // DS M1TN 0 TableLongitudinalIncrement = 0x00181137, // DS M1TN 0 TableAngle = 0x00181138, // DS M1 0 TableType = 0x0018113A, // CS M1 0 RotationDirection = 0x00181140, // CS M1 0 AngularPosition = 0x00181141, // DS M1 1 RadialPosition = 0x00181142, // DS M1TN 0 ScanArc = 0x00181143, // DS M1 0 AngularStep = 0x00181144, // DS M1 0 CenterOfRotationOffset = 0x00181145, // DS M1 0 RotationOffset = 0x00181146, // DS M1TN 1 FieldOfViewShape = 0x00181147, // CS M1 0 FieldOfViewDimensions = 0x00181149, // IS M1T2 0 ExposureTime = 0x00181150, // IS M1 0 XRayTubeCurrent = 0x00181151, // IS M1 0 Exposure = 0x00181152, // IS M1 0 ExposureInuAs = 0x00181153, // IS M1 0 AveragePulseWidth = 0x00181154, // DS M1 0 RadiationSetting = 0x00181155, // CS M1 0 RectificationType = 0x00181156, // CS M1 0 RadiationMode = 0x0018115A, // CS M1 0 ImageAndFluoroscopyAreaDoseProduct = 0x0018115E, // DS M1 0 FilterType = 0x00181160, // SH M1 0 TypeOfFilters = 0x00181161, // LO M1TN 0 IntensifierSize = 0x00181162, // DS M1 0 ImagerPixelSpacing = 0x00181164, // DS M2 0 Grid = 0x00181166, // CS M1TN 0 GeneratorPower = 0x00181170, // IS M1 0 CollimatorGridName = 0x00181180, // SH M1 0 CollimatorType = 0x00181181, // CS M1 0 FocalDistance = 0x00181182, // IS M1T2 0 XFocusCenter = 0x00181183, // DS M1T2 0 YFocusCenter = 0x00181184, // DS M1T2 0 FocalSpots = 0x00181190, // DS M1TN 0 AnodeTargetMaterial = 0x00181191, // CS M1 0 BodyPartThickness = 0x001811A0, // DS M1 0 CompressionForce = 0x001811A2, // DS M1 0 CompressionPressure = 0x001811A3, // DS M1 0 PaddleDescription = 0x001811A4, // LO M1 0 CompressionContactArea = 0x001811A5, // DS M1 0 DateOfLastCalibration = 0x00181200, // DA M1TN 0 TimeOfLastCalibration = 0x00181201, // TM M1TN 0 DateTimeOfLastCalibration = 0x00181202, // DT M1 0 ConvolutionKernel = 0x00181210, // SH M1TN 0 UpperLowerPixelValues = 0x00181240, // IS M1TN 1 ActualFrameDuration = 0x00181242, // IS M1 0 CountRate = 0x00181243, // IS M1 0 PreferredPlaybackSequencing = 0x00181244, // US M1 0 ReceiveCoilName = 0x00181250, // SH M1 0 TransmitCoilName = 0x00181251, // SH M1 0 PlateType = 0x00181260, // SH M1 0 PhosphorType = 0x00181261, // LO M1 0 WaterEquivalentDiameter = 0x00181271, // FD M1 0 WaterEquivalentDiameterCalculationMethodCodeSequence = 0x00181272, // SQ M1 0 ScanVelocity = 0x00181300, // DS M1 0 WholeBodyTechnique = 0x00181301, // CS M1TN 0 ScanLength = 0x00181302, // IS M1 0 AcquisitionMatrix = 0x00181310, // US M4 0 InPlanePhaseEncodingDirection = 0x00181312, // CS M1 0 FlipAngle = 0x00181314, // DS M1 0 VariableFlipAngleFlag = 0x00181315, // CS M1 0 SAR = 0x00181316, // DS M1 0 dBdt = 0x00181318, // DS M1 0 B1rms = 0x00181320, // FL M1 0 AcquisitionDeviceProcessingDescription = 0x00181400, // LO M1 0 AcquisitionDeviceProcessingCode = 0x00181401, // LO M1 0 CassetteOrientation = 0x00181402, // CS M1 0 CassetteSize = 0x00181403, // CS M1 0 ExposuresOnPlate = 0x00181404, // US M1 0 RelativeXRayExposure = 0x00181405, // IS M1 0 ExposureIndex = 0x00181411, // DS M1 0 TargetExposureIndex = 0x00181412, // DS M1 0 DeviationIndex = 0x00181413, // DS M1 0 ColumnAngulation = 0x00181450, // DS M1 0 TomoLayerHeight = 0x00181460, // DS M1 0 TomoAngle = 0x00181470, // DS M1 0 TomoTime = 0x00181480, // DS M1 0 TomoType = 0x00181490, // CS M1 0 TomoClass = 0x00181491, // CS M1 0 NumberOfTomosynthesisSourceImages = 0x00181495, // IS M1 0 PositionerMotion = 0x00181500, // CS M1 0 PositionerType = 0x00181508, // CS M1 0 PositionerPrimaryAngle = 0x00181510, // DS M1 0 PositionerSecondaryAngle = 0x00181511, // DS M1 0 PositionerPrimaryAngleIncrement = 0x00181520, // DS M1TN 0 PositionerSecondaryAngleIncrement = 0x00181521, // DS M1TN 0 DetectorPrimaryAngle = 0x00181530, // DS M1 0 DetectorSecondaryAngle = 0x00181531, // DS M1 0 ShutterShape = 0x00181600, // CS M1T3 0 ShutterLeftVerticalEdge = 0x00181602, // IS M1 0 ShutterRightVerticalEdge = 0x00181604, // IS M1 0 ShutterUpperHorizontalEdge = 0x00181606, // IS M1 0 ShutterLowerHorizontalEdge = 0x00181608, // IS M1 0 CenterOfCircularShutter = 0x00181610, // IS M2 0 RadiusOfCircularShutter = 0x00181612, // IS M1 0 VerticesOfThePolygonalShutter = 0x00181620, // IS M2T2N 0 ShutterPresentationValue = 0x00181622, // US M1 0 ShutterOverlayGroup = 0x00181623, // US M1 0 ShutterPresentationColorCIELabValue = 0x00181624, // US M3 0 OutlineShapeType = 0x00181630, // CS M1 0 OutlineLeftVerticalEdge = 0x00181631, // FD M1 0 OutlineRightVerticalEdge = 0x00181632, // FD M1 0 OutlineUpperHorizontalEdge = 0x00181633, // FD M1 0 OutlineLowerHorizontalEdge = 0x00181634, // FD M1 0 CenterOfCircularOutline = 0x00181635, // FD M2 0 DiameterOfCircularOutline = 0x00181636, // FD M1 0 NumberOfPolygonalVertices = 0x00181637, // UL M1 0 VerticesOfThePolygonalOutline = 0x00181638, // OF M1 0 CollimatorShape = 0x00181700, // CS M1T3 0 CollimatorLeftVerticalEdge = 0x00181702, // IS M1 0 CollimatorRightVerticalEdge = 0x00181704, // IS M1 0 CollimatorUpperHorizontalEdge = 0x00181706, // IS M1 0 CollimatorLowerHorizontalEdge = 0x00181708, // IS M1 0 CenterOfCircularCollimator = 0x00181710, // IS M2 0 RadiusOfCircularCollimator = 0x00181712, // IS M1 0 VerticesOfThePolygonalCollimator = 0x00181720, // IS M2T2N 0 AcquisitionTimeSynchronized = 0x00181800, // CS M1 0 TimeSource = 0x00181801, // SH M1 0 TimeDistributionProtocol = 0x00181802, // CS M1 0 NTPSourceAddress = 0x00181803, // LO M1 0 PageNumberVector = 0x00182001, // IS M1TN 0 FrameLabelVector = 0x00182002, // SH M1TN 0 FramePrimaryAngleVector = 0x00182003, // DS M1TN 0 FrameSecondaryAngleVector = 0x00182004, // DS M1TN 0 SliceLocationVector = 0x00182005, // DS M1TN 0 DisplayWindowLabelVector = 0x00182006, // SH M1TN 0 NominalScannedPixelSpacing = 0x00182010, // DS M2 0 DigitizingDeviceTransportDirection = 0x00182020, // CS M1 0 RotationOfScannedFilm = 0x00182030, // DS M1 0 BiopsyTargetSequence = 0x00182041, // SQ M1 0 TargetUID = 0x00182042, // UI M1 0 LocalizingCursorPosition = 0x00182043, // FL M2 0 CalculatedTargetPosition = 0x00182044, // FL M3 0 TargetLabel = 0x00182045, // SH M1 0 DisplayedZValue = 0x00182046, // FL M1 0 IVUSAcquisition = 0x00183100, // CS M1 0 IVUSPullbackRate = 0x00183101, // DS M1 0 IVUSGatedRate = 0x00183102, // DS M1 0 IVUSPullbackStartFrameNumber = 0x00183103, // IS M1 0 IVUSPullbackStopFrameNumber = 0x00183104, // IS M1 0 LesionNumber = 0x00183105, // IS M1TN 0 AcquisitionComments = 0x00184000, // LT M1 1 OutputPower = 0x00185000, // SH M1TN 0 TransducerData = 0x00185010, // LO M1TN 0 FocusDepth = 0x00185012, // DS M1 0 ProcessingFunction = 0x00185020, // LO M1 0 PostprocessingFunction = 0x00185021, // LO M1 1 MechanicalIndex = 0x00185022, // DS M1 0 BoneThermalIndex = 0x00185024, // DS M1 0 CranialThermalIndex = 0x00185026, // DS M1 0 SoftTissueThermalIndex = 0x00185027, // DS M1 0 SoftTissueFocusThermalIndex = 0x00185028, // DS M1 0 SoftTissueSurfaceThermalIndex = 0x00185029, // DS M1 0 DynamicRange = 0x00185030, // DS M1 1 TotalGain = 0x00185040, // DS M1 1 DepthOfScanField = 0x00185050, // IS M1 0 PatientPosition = 0x00185100, // CS M1 0 ViewPosition = 0x00185101, // CS M1 0 ProjectionEponymousNameCodeSequence = 0x00185104, // SQ M1 0 ImageTransformationMatrix = 0x00185210, // DS M6 1 ImageTranslationVector = 0x00185212, // DS M3 1 Sensitivity = 0x00186000, // DS M1 0 SequenceOfUltrasoundRegions = 0x00186011, // SQ M1 0 RegionSpatialFormat = 0x00186012, // US M1 0 RegionDataType = 0x00186014, // US M1 0 RegionFlags = 0x00186016, // UL M1 0 RegionLocationMinX0 = 0x00186018, // UL M1 0 RegionLocationMinY0 = 0x0018601A, // UL M1 0 RegionLocationMaxX1 = 0x0018601C, // UL M1 0 RegionLocationMaxY1 = 0x0018601E, // UL M1 0 ReferencePixelX0 = 0x00186020, // SL M1 0 ReferencePixelY0 = 0x00186022, // SL M1 0 PhysicalUnitsXDirection = 0x00186024, // US M1 0 PhysicalUnitsYDirection = 0x00186026, // US M1 0 ReferencePixelPhysicalValueX = 0x00186028, // FD M1 0 ReferencePixelPhysicalValueY = 0x0018602A, // FD M1 0 PhysicalDeltaX = 0x0018602C, // FD M1 0 PhysicalDeltaY = 0x0018602E, // FD M1 0 TransducerFrequency = 0x00186030, // UL M1 0 TransducerType = 0x00186031, // CS M1 0 PulseRepetitionFrequency = 0x00186032, // UL M1 0 DopplerCorrectionAngle = 0x00186034, // FD M1 0 SteeringAngle = 0x00186036, // FD M1 0 DopplerSampleVolumeXPositionRetired = 0x00186038, // UL M1 1 DopplerSampleVolumeXPosition = 0x00186039, // SL M1 0 DopplerSampleVolumeYPositionRetired = 0x0018603A, // UL M1 1 DopplerSampleVolumeYPosition = 0x0018603B, // SL M1 0 TMLinePositionX0Retired = 0x0018603C, // UL M1 1 TMLinePositionX0 = 0x0018603D, // SL M1 0 TMLinePositionY0Retired = 0x0018603E, // UL M1 1 TMLinePositionY0 = 0x0018603F, // SL M1 0 TMLinePositionX1Retired = 0x00186040, // UL M1 1 TMLinePositionX1 = 0x00186041, // SL M1 0 TMLinePositionY1Retired = 0x00186042, // UL M1 1 TMLinePositionY1 = 0x00186043, // SL M1 0 PixelComponentOrganization = 0x00186044, // US M1 0 PixelComponentMask = 0x00186046, // UL M1 0 PixelComponentRangeStart = 0x00186048, // UL M1 0 PixelComponentRangeStop = 0x0018604A, // UL M1 0 PixelComponentPhysicalUnits = 0x0018604C, // US M1 0 PixelComponentDataType = 0x0018604E, // US M1 0 NumberOfTableBreakPoints = 0x00186050, // UL M1 0 TableOfXBreakPoints = 0x00186052, // UL M1TN 0 TableOfYBreakPoints = 0x00186054, // FD M1TN 0 NumberOfTableEntries = 0x00186056, // UL M1 0 TableOfPixelValues = 0x00186058, // UL M1TN 0 TableOfParameterValues = 0x0018605A, // FL M1TN 0 RWaveTimeVector = 0x00186060, // FL M1TN 0 DetectorConditionsNominalFlag = 0x00187000, // CS M1 0 DetectorTemperature = 0x00187001, // DS M1 0 DetectorType = 0x00187004, // CS M1 0 DetectorConfiguration = 0x00187005, // CS M1 0 DetectorDescription = 0x00187006, // LT M1 0 DetectorMode = 0x00187008, // LT M1 0 DetectorID = 0x0018700A, // SH M1 0 DateOfLastDetectorCalibration = 0x0018700C, // DA M1 0 TimeOfLastDetectorCalibration = 0x0018700E, // TM M1 0 ExposuresOnDetectorSinceLastCalibration = 0x00187010, // IS M1 0 ExposuresOnDetectorSinceManufactured = 0x00187011, // IS M1 0 DetectorTimeSinceLastExposure = 0x00187012, // DS M1 0 DetectorActiveTime = 0x00187014, // DS M1 0 DetectorActivationOffsetFromExposure = 0x00187016, // DS M1 0 DetectorBinning = 0x0018701A, // DS M2 0 DetectorElementPhysicalSize = 0x00187020, // DS M2 0 DetectorElementSpacing = 0x00187022, // DS M2 0 DetectorActiveShape = 0x00187024, // CS M1 0 DetectorActiveDimensions = 0x00187026, // DS M1T2 0 DetectorActiveOrigin = 0x00187028, // DS M2 0 DetectorManufacturerName = 0x0018702A, // LO M1 0 DetectorManufacturerModelName = 0x0018702B, // LO M1 0 FieldOfViewOrigin = 0x00187030, // DS M2 0 FieldOfViewRotation = 0x00187032, // DS M1 0 FieldOfViewHorizontalFlip = 0x00187034, // CS M1 0 PixelDataAreaOriginRelativeToFOV = 0x00187036, // FL M2 0 PixelDataAreaRotationAngleRelativeToFOV = 0x00187038, // FL M1 0 GridAbsorbingMaterial = 0x00187040, // LT M1 0 GridSpacingMaterial = 0x00187041, // LT M1 0 GridThickness = 0x00187042, // DS M1 0 GridPitch = 0x00187044, // DS M1 0 GridAspectRatio = 0x00187046, // IS M2 0 GridPeriod = 0x00187048, // DS M1 0 GridFocalDistance = 0x0018704C, // DS M1 0 FilterMaterial = 0x00187050, // CS M1TN 0 FilterThicknessMinimum = 0x00187052, // DS M1TN 0 FilterThicknessMaximum = 0x00187054, // DS M1TN 0 FilterBeamPathLengthMinimum = 0x00187056, // FL M1TN 0 FilterBeamPathLengthMaximum = 0x00187058, // FL M1TN 0 ExposureControlMode = 0x00187060, // CS M1 0 ExposureControlModeDescription = 0x00187062, // LT M1 0 ExposureStatus = 0x00187064, // CS M1 0 PhototimerSetting = 0x00187065, // DS M1 0 ExposureTimeInuS = 0x00188150, // DS M1 0 XRayTubeCurrentInuA = 0x00188151, // DS M1 0 ContentQualification = 0x00189004, // CS M1 0 PulseSequenceName = 0x00189005, // SH M1 0 MRImagingModifierSequence = 0x00189006, // SQ M1 0 EchoPulseSequence = 0x00189008, // CS M1 0 InversionRecovery = 0x00189009, // CS M1 0 FlowCompensation = 0x00189010, // CS M1 0 MultipleSpinEcho = 0x00189011, // CS M1 0 MultiPlanarExcitation = 0x00189012, // CS M1 0 PhaseContrast = 0x00189014, // CS M1 0 TimeOfFlightContrast = 0x00189015, // CS M1 0 Spoiling = 0x00189016, // CS M1 0 SteadyStatePulseSequence = 0x00189017, // CS M1 0 EchoPlanarPulseSequence = 0x00189018, // CS M1 0 TagAngleFirstAxis = 0x00189019, // FD M1 0 MagnetizationTransfer = 0x00189020, // CS M1 0 T2Preparation = 0x00189021, // CS M1 0 BloodSignalNulling = 0x00189022, // CS M1 0 SaturationRecovery = 0x00189024, // CS M1 0 SpectrallySelectedSuppression = 0x00189025, // CS M1 0 SpectrallySelectedExcitation = 0x00189026, // CS M1 0 SpatialPresaturation = 0x00189027, // CS M1 0 Tagging = 0x00189028, // CS M1 0 OversamplingPhase = 0x00189029, // CS M1 0 TagSpacingFirstDimension = 0x00189030, // FD M1 0 GeometryOfKSpaceTraversal = 0x00189032, // CS M1 0 SegmentedKSpaceTraversal = 0x00189033, // CS M1 0 RectilinearPhaseEncodeReordering = 0x00189034, // CS M1 0 TagThickness = 0x00189035, // FD M1 0 PartialFourierDirection = 0x00189036, // CS M1 0 CardiacSynchronizationTechnique = 0x00189037, // CS M1 0 ReceiveCoilManufacturerName = 0x00189041, // LO M1 0 MRReceiveCoilSequence = 0x00189042, // SQ M1 0 ReceiveCoilType = 0x00189043, // CS M1 0 QuadratureReceiveCoil = 0x00189044, // CS M1 0 MultiCoilDefinitionSequence = 0x00189045, // SQ M1 0 MultiCoilConfiguration = 0x00189046, // LO M1 0 MultiCoilElementName = 0x00189047, // SH M1 0 MultiCoilElementUsed = 0x00189048, // CS M1 0 MRTransmitCoilSequence = 0x00189049, // SQ M1 0 TransmitCoilManufacturerName = 0x00189050, // LO M1 0 TransmitCoilType = 0x00189051, // CS M1 0 SpectralWidth = 0x00189052, // FD M1T2 0 ChemicalShiftReference = 0x00189053, // FD M1T2 0 VolumeLocalizationTechnique = 0x00189054, // CS M1 0 MRAcquisitionFrequencyEncodingSteps = 0x00189058, // US M1 0 Decoupling = 0x00189059, // CS M1 0 DecoupledNucleus = 0x00189060, // CS M1T2 0 DecouplingFrequency = 0x00189061, // FD M1T2 0 DecouplingMethod = 0x00189062, // CS M1 0 DecouplingChemicalShiftReference = 0x00189063, // FD M1T2 0 KSpaceFiltering = 0x00189064, // CS M1 0 TimeDomainFiltering = 0x00189065, // CS M1T2 0 NumberOfZeroFills = 0x00189066, // US M1T2 0 BaselineCorrection = 0x00189067, // CS M1 0 ParallelReductionFactorInPlane = 0x00189069, // FD M1 0 CardiacRRIntervalSpecified = 0x00189070, // FD M1 0 AcquisitionDuration = 0x00189073, // FD M1 0 FrameAcquisitionDateTime = 0x00189074, // DT M1 0 DiffusionDirectionality = 0x00189075, // CS M1 0 DiffusionGradientDirectionSequence = 0x00189076, // SQ M1 0 ParallelAcquisition = 0x00189077, // CS M1 0 ParallelAcquisitionTechnique = 0x00189078, // CS M1 0 InversionTimes = 0x00189079, // FD M1TN 0 MetaboliteMapDescription = 0x00189080, // ST M1 0 PartialFourier = 0x00189081, // CS M1 0 EffectiveEchoTime = 0x00189082, // FD M1 0 MetaboliteMapCodeSequence = 0x00189083, // SQ M1 0 ChemicalShiftSequence = 0x00189084, // SQ M1 0 CardiacSignalSource = 0x00189085, // CS M1 0 DiffusionBValue = 0x00189087, // FD M1 0 DiffusionGradientOrientation = 0x00189089, // FD M3 0 VelocityEncodingDirection = 0x00189090, // FD M3 0 VelocityEncodingMinimumValue = 0x00189091, // FD M1 0 VelocityEncodingAcquisitionSequence = 0x00189092, // SQ M1 0 NumberOfKSpaceTrajectories = 0x00189093, // US M1 0 CoverageOfKSpace = 0x00189094, // CS M1 0 SpectroscopyAcquisitionPhaseRows = 0x00189095, // UL M1 0 ParallelReductionFactorInPlaneRetired = 0x00189096, // FD M1 1 TransmitterFrequency = 0x00189098, // FD M1T2 0 ResonantNucleus = 0x00189100, // CS M1T2 0 FrequencyCorrection = 0x00189101, // CS M1 0 MRSpectroscopyFOVGeometrySequence = 0x00189103, // SQ M1 0 SlabThickness = 0x00189104, // FD M1 0 SlabOrientation = 0x00189105, // FD M3 0 MidSlabPosition = 0x00189106, // FD M3 0 MRSpatialSaturationSequence = 0x00189107, // SQ M1 0 MRTimingAndRelatedParametersSequence = 0x00189112, // SQ M1 0 MREchoSequence = 0x00189114, // SQ M1 0 MRModifierSequence = 0x00189115, // SQ M1 0 MRDiffusionSequence = 0x00189117, // SQ M1 0 CardiacSynchronizationSequence = 0x00189118, // SQ M1 0 MRAveragesSequence = 0x00189119, // SQ M1 0 MRFOVGeometrySequence = 0x00189125, // SQ M1 0 VolumeLocalizationSequence = 0x00189126, // SQ M1 0 SpectroscopyAcquisitionDataColumns = 0x00189127, // UL M1 0 DiffusionAnisotropyType = 0x00189147, // CS M1 0 FrameReferenceDateTime = 0x00189151, // DT M1 0 MRMetaboliteMapSequence = 0x00189152, // SQ M1 0 ParallelReductionFactorOutOfPlane = 0x00189155, // FD M1 0 SpectroscopyAcquisitionOutOfPlanePhaseSteps = 0x00189159, // UL M1 0 BulkMotionStatus = 0x00189166, // CS M1 1 ParallelReductionFactorSecondInPlane = 0x00189168, // FD M1 0 CardiacBeatRejectionTechnique = 0x00189169, // CS M1 0 RespiratoryMotionCompensationTechnique = 0x00189170, // CS M1 0 RespiratorySignalSource = 0x00189171, // CS M1 0 BulkMotionCompensationTechnique = 0x00189172, // CS M1 0 BulkMotionSignalSource = 0x00189173, // CS M1 0 ApplicableSafetyStandardAgency = 0x00189174, // CS M1 0 ApplicableSafetyStandardDescription = 0x00189175, // LO M1 0 OperatingModeSequence = 0x00189176, // SQ M1 0 OperatingModeType = 0x00189177, // CS M1 0 OperatingMode = 0x00189178, // CS M1 0 SpecificAbsorptionRateDefinition = 0x00189179, // CS M1 0 GradientOutputType = 0x00189180, // CS M1 0 SpecificAbsorptionRateValue = 0x00189181, // FD M1 0 GradientOutput = 0x00189182, // FD M1 0 FlowCompensationDirection = 0x00189183, // CS M1 0 TaggingDelay = 0x00189184, // FD M1 0 RespiratoryMotionCompensationTechniqueDescription = 0x00189185, // ST M1 0 RespiratorySignalSourceID = 0x00189186, // SH M1 0 ChemicalShiftMinimumIntegrationLimitInHz = 0x00189195, // FD M1 1 ChemicalShiftMaximumIntegrationLimitInHz = 0x00189196, // FD M1 1 MRVelocityEncodingSequence = 0x00189197, // SQ M1 0 FirstOrderPhaseCorrection = 0x00189198, // CS M1 0 WaterReferencedPhaseCorrection = 0x00189199, // CS M1 0 MRSpectroscopyAcquisitionType = 0x00189200, // CS M1 0 RespiratoryCyclePosition = 0x00189214, // CS M1 0 VelocityEncodingMaximumValue = 0x00189217, // FD M1 0 TagSpacingSecondDimension = 0x00189218, // FD M1 0 TagAngleSecondAxis = 0x00189219, // SS M1 0 FrameAcquisitionDuration = 0x00189220, // FD M1 0 MRImageFrameTypeSequence = 0x00189226, // SQ M1 0 MRSpectroscopyFrameTypeSequence = 0x00189227, // SQ M1 0 MRAcquisitionPhaseEncodingStepsInPlane = 0x00189231, // US M1 0 MRAcquisitionPhaseEncodingStepsOutOfPlane = 0x00189232, // US M1 0 SpectroscopyAcquisitionPhaseColumns = 0x00189234, // UL M1 0 CardiacCyclePosition = 0x00189236, // CS M1 0 SpecificAbsorptionRateSequence = 0x00189239, // SQ M1 0 RFEchoTrainLength = 0x00189240, // US M1 0 GradientEchoTrainLength = 0x00189241, // US M1 0 ArterialSpinLabelingContrast = 0x00189250, // CS M1 0 MRArterialSpinLabelingSequence = 0x00189251, // SQ M1 0 ASLTechniqueDescription = 0x00189252, // LO M1 0 ASLSlabNumber = 0x00189253, // US M1 0 ASLSlabThickness = 0x00189254, // FD M1 0 ASLSlabOrientation = 0x00189255, // FD M3 0 ASLMidSlabPosition = 0x00189256, // FD M3 0 ASLContext = 0x00189257, // CS M1 0 ASLPulseTrainDuration = 0x00189258, // UL M1 0 ASLCrusherFlag = 0x00189259, // CS M1 0 ASLCrusherFlowLimit = 0x0018925A, // FD M1 0 ASLCrusherDescription = 0x0018925B, // LO M1 0 ASLBolusCutoffFlag = 0x0018925C, // CS M1 0 ASLBolusCutoffTimingSequence = 0x0018925D, // SQ M1 0 ASLBolusCutoffTechnique = 0x0018925E, // LO M1 0 ASLBolusCutoffDelayTime = 0x0018925F, // UL M1 0 ASLSlabSequence = 0x00189260, // SQ M1 0 ChemicalShiftMinimumIntegrationLimitInppm = 0x00189295, // FD M1 0 ChemicalShiftMaximumIntegrationLimitInppm = 0x00189296, // FD M1 0 WaterReferenceAcquisition = 0x00189297, // CS M1 0 EchoPeakPosition = 0x00189298, // IS M1 0 CTAcquisitionTypeSequence = 0x00189301, // SQ M1 0 AcquisitionType = 0x00189302, // CS M1 0 TubeAngle = 0x00189303, // FD M1 0 CTAcquisitionDetailsSequence = 0x00189304, // SQ M1 0 RevolutionTime = 0x00189305, // FD M1 0 SingleCollimationWidth = 0x00189306, // FD M1 0 TotalCollimationWidth = 0x00189307, // FD M1 0 CTTableDynamicsSequence = 0x00189308, // SQ M1 0 TableSpeed = 0x00189309, // FD M1 0 TableFeedPerRotation = 0x00189310, // FD M1 0 SpiralPitchFactor = 0x00189311, // FD M1 0 CTGeometrySequence = 0x00189312, // SQ M1 0 DataCollectionCenterPatient = 0x00189313, // FD M3 0 CTReconstructionSequence = 0x00189314, // SQ M1 0 ReconstructionAlgorithm = 0x00189315, // CS M1 0 ConvolutionKernelGroup = 0x00189316, // CS M1 0 ReconstructionFieldOfView = 0x00189317, // FD M2 0 ReconstructionTargetCenterPatient = 0x00189318, // FD M3 0 ReconstructionAngle = 0x00189319, // FD M1 0 ImageFilter = 0x00189320, // SH M1 0 CTExposureSequence = 0x00189321, // SQ M1 0 ReconstructionPixelSpacing = 0x00189322, // FD M2 0 ExposureModulationType = 0x00189323, // CS M1TN 0 EstimatedDoseSaving = 0x00189324, // FD M1 0 CTXRayDetailsSequence = 0x00189325, // SQ M1 0 CTPositionSequence = 0x00189326, // SQ M1 0 TablePosition = 0x00189327, // FD M1 0 ExposureTimeInms = 0x00189328, // FD M1 0 CTImageFrameTypeSequence = 0x00189329, // SQ M1 0 XRayTubeCurrentInmA = 0x00189330, // FD M1 0 ExposureInmAs = 0x00189332, // FD M1 0 ConstantVolumeFlag = 0x00189333, // CS M1 0 FluoroscopyFlag = 0x00189334, // CS M1 0 DistanceSourceToDataCollectionCenter = 0x00189335, // FD M1 0 ContrastBolusAgentNumber = 0x00189337, // US M1 0 ContrastBolusIngredientCodeSequence = 0x00189338, // SQ M1 0 ContrastAdministrationProfileSequence = 0x00189340, // SQ M1 0 ContrastBolusUsageSequence = 0x00189341, // SQ M1 0 ContrastBolusAgentAdministered = 0x00189342, // CS M1 0 ContrastBolusAgentDetected = 0x00189343, // CS M1 0 ContrastBolusAgentPhase = 0x00189344, // CS M1 0 CTDIvol = 0x00189345, // FD M1 0 CTDIPhantomTypeCodeSequence = 0x00189346, // SQ M1 0 CalciumScoringMassFactorPatient = 0x00189351, // FL M1 0 CalciumScoringMassFactorDevice = 0x00189352, // FL M3 0 EnergyWeightingFactor = 0x00189353, // FL M1 0 CTAdditionalXRaySourceSequence = 0x00189360, // SQ M1 0 MultienergyCTAcquisition = 0x00189361, // CS M1 0 MultienergyCTAcquisitionSequence = 0x00189362, // SQ M1 0 MultienergyCTProcessingSequence = 0x00189363, // SQ M1 0 MultienergyCTCharacteristicsSequence = 0x00189364, // SQ M1 0 MultienergyCTXRaySourceSequence = 0x00189365, // SQ M1 0 XRaySourceIndex = 0x00189366, // US M1 0 XRaySourceID = 0x00189367, // UC M1 0 MultienergySourceTechnique = 0x00189368, // CS M1 0 SourceStartDateTime = 0x00189369, // DT M1 0 SourceEndDateTime = 0x0018936A, // DT M1 0 SwitchingPhaseNumber = 0x0018936B, // US M1 0 SwitchingPhaseNominalDuration = 0x0018936C, // DS M1 0 SwitchingPhaseTransitionDuration = 0x0018936D, // DS M1 0 EffectiveBinEnergy = 0x0018936E, // DS M1 0 MultienergyCTXRayDetectorSequence = 0x0018936F, // SQ M1 0 XRayDetectorIndex = 0x00189370, // US M1 0 XRayDetectorID = 0x00189371, // UC M1 0 MultienergyDetectorType = 0x00189372, // CS M1 0 XRayDetectorLabel = 0x00189373, // ST M1 0 NominalMaxEnergy = 0x00189374, // DS M1 0 NominalMinEnergy = 0x00189375, // DS M1 0 ReferencedXRayDetectorIndex = 0x00189376, // US M1TN 0 ReferencedXRaySourceIndex = 0x00189377, // US M1TN 0 ReferencedPathIndex = 0x00189378, // US M1TN 0 MultienergyCTPathSequence = 0x00189379, // SQ M1 0 MultienergyCTPathIndex = 0x0018937A, // US M1 0 MultienergyAcquisitionDescription = 0x0018937B, // UT M1 0 MonoenergeticEnergyEquivalent = 0x0018937C, // FD M1 0 MaterialCodeSequence = 0x0018937D, // SQ M1 0 DecompositionMethod = 0x0018937E, // CS M1 0 DecompositionDescription = 0x0018937F, // UT M1 0 DecompositionAlgorithmIdentificationSequence = 0x00189380, // SQ M1 0 DecompositionMaterialSequence = 0x00189381, // SQ M1 0 MaterialAttenuationSequence = 0x00189382, // SQ M1 0 PhotonEnergy = 0x00189383, // DS M1 0 XRayMassAttenuationCoefficient = 0x00189384, // DS M1 0 ProjectionPixelCalibrationSequence = 0x00189401, // SQ M1 0 DistanceSourceToIsocenter = 0x00189402, // FL M1 0 DistanceObjectToTableTop = 0x00189403, // FL M1 0 ObjectPixelSpacingInCenterOfBeam = 0x00189404, // FL M2 0 PositionerPositionSequence = 0x00189405, // SQ M1 0 TablePositionSequence = 0x00189406, // SQ M1 0 CollimatorShapeSequence = 0x00189407, // SQ M1 0 PlanesInAcquisition = 0x00189410, // CS M1 0 XAXRFFrameCharacteristicsSequence = 0x00189412, // SQ M1 0 FrameAcquisitionSequence = 0x00189417, // SQ M1 0 XRayReceptorType = 0x00189420, // CS M1 0 AcquisitionProtocolName = 0x00189423, // LO M1 0 AcquisitionProtocolDescription = 0x00189424, // LT M1 0 ContrastBolusIngredientOpaque = 0x00189425, // CS M1 0 DistanceReceptorPlaneToDetectorHousing = 0x00189426, // FL M1 0 IntensifierActiveShape = 0x00189427, // CS M1 0 IntensifierActiveDimensions = 0x00189428, // FL M1T2 0 PhysicalDetectorSize = 0x00189429, // FL M2 0 PositionOfIsocenterProjection = 0x00189430, // FL M2 0 FieldOfViewSequence = 0x00189432, // SQ M1 0 FieldOfViewDescription = 0x00189433, // LO M1 0 ExposureControlSensingRegionsSequence = 0x00189434, // SQ M1 0 ExposureControlSensingRegionShape = 0x00189435, // CS M1 0 ExposureControlSensingRegionLeftVerticalEdge = 0x00189436, // SS M1 0 ExposureControlSensingRegionRightVerticalEdge = 0x00189437, // SS M1 0 ExposureControlSensingRegionUpperHorizontalEdge = 0x00189438, // SS M1 0 ExposureControlSensingRegionLowerHorizontalEdge = 0x00189439, // SS M1 0 CenterOfCircularExposureControlSensingRegion = 0x00189440, // SS M2 0 RadiusOfCircularExposureControlSensingRegion = 0x00189441, // US M1 0 VerticesOfThePolygonalExposureControlSensingRegion = 0x00189442, // SS M2TN 0 ColumnAngulationPatient = 0x00189447, // FL M1 0 BeamAngle = 0x00189449, // FL M1 0 FrameDetectorParametersSequence = 0x00189451, // SQ M1 0 CalculatedAnatomyThickness = 0x00189452, // FL M1 0 CalibrationSequence = 0x00189455, // SQ M1 0 ObjectThicknessSequence = 0x00189456, // SQ M1 0 PlaneIdentification = 0x00189457, // CS M1 0 FieldOfViewDimensionsInFloat = 0x00189461, // FL M1T2 0 IsocenterReferenceSystemSequence = 0x00189462, // SQ M1 0 PositionerIsocenterPrimaryAngle = 0x00189463, // FL M1 0 PositionerIsocenterSecondaryAngle = 0x00189464, // FL M1 0 PositionerIsocenterDetectorRotationAngle = 0x00189465, // FL M1 0 TableXPositionToIsocenter = 0x00189466, // FL M1 0 TableYPositionToIsocenter = 0x00189467, // FL M1 0 TableZPositionToIsocenter = 0x00189468, // FL M1 0 TableHorizontalRotationAngle = 0x00189469, // FL M1 0 TableHeadTiltAngle = 0x00189470, // FL M1 0 TableCradleTiltAngle = 0x00189471, // FL M1 0 FrameDisplayShutterSequence = 0x00189472, // SQ M1 0 AcquiredImageAreaDoseProduct = 0x00189473, // FL M1 0 CArmPositionerTabletopRelationship = 0x00189474, // CS M1 0 XRayGeometrySequence = 0x00189476, // SQ M1 0 IrradiationEventIdentificationSequence = 0x00189477, // SQ M1 0 XRay3DFrameTypeSequence = 0x00189504, // SQ M1 0 ContributingSourcesSequence = 0x00189506, // SQ M1 0 XRay3DAcquisitionSequence = 0x00189507, // SQ M1 0 PrimaryPositionerScanArc = 0x00189508, // FL M1 0 SecondaryPositionerScanArc = 0x00189509, // FL M1 0 PrimaryPositionerScanStartAngle = 0x00189510, // FL M1 0 SecondaryPositionerScanStartAngle = 0x00189511, // FL M1 0 PrimaryPositionerIncrement = 0x00189514, // FL M1 0 SecondaryPositionerIncrement = 0x00189515, // FL M1 0 StartAcquisitionDateTime = 0x00189516, // DT M1 0 EndAcquisitionDateTime = 0x00189517, // DT M1 0 PrimaryPositionerIncrementSign = 0x00189518, // SS M1 0 SecondaryPositionerIncrementSign = 0x00189519, // SS M1 0 ApplicationName = 0x00189524, // LO M1 0 ApplicationVersion = 0x00189525, // LO M1 0 ApplicationManufacturer = 0x00189526, // LO M1 0 AlgorithmType = 0x00189527, // CS M1 0 AlgorithmDescription = 0x00189528, // LO M1 0 XRay3DReconstructionSequence = 0x00189530, // SQ M1 0 ReconstructionDescription = 0x00189531, // LO M1 0 PerProjectionAcquisitionSequence = 0x00189538, // SQ M1 0 DetectorPositionSequence = 0x00189541, // SQ M1 0 XRayAcquisitionDoseSequence = 0x00189542, // SQ M1 0 XRaySourceIsocenterPrimaryAngle = 0x00189543, // FD M1 0 XRaySourceIsocenterSecondaryAngle = 0x00189544, // FD M1 0 BreastSupportIsocenterPrimaryAngle = 0x00189545, // FD M1 0 BreastSupportIsocenterSecondaryAngle = 0x00189546, // FD M1 0 BreastSupportXPositionToIsocenter = 0x00189547, // FD M1 0 BreastSupportYPositionToIsocenter = 0x00189548, // FD M1 0 BreastSupportZPositionToIsocenter = 0x00189549, // FD M1 0 DetectorIsocenterPrimaryAngle = 0x00189550, // FD M1 0 DetectorIsocenterSecondaryAngle = 0x00189551, // FD M1 0 DetectorXPositionToIsocenter = 0x00189552, // FD M1 0 DetectorYPositionToIsocenter = 0x00189553, // FD M1 0 DetectorZPositionToIsocenter = 0x00189554, // FD M1 0 XRayGridSequence = 0x00189555, // SQ M1 0 XRayFilterSequence = 0x00189556, // SQ M1 0 DetectorActiveAreaTLHCPosition = 0x00189557, // FD M3 0 DetectorActiveAreaOrientation = 0x00189558, // FD M6 0 PositionerPrimaryAngleDirection = 0x00189559, // CS M1 0 DiffusionBMatrixSequence = 0x00189601, // SQ M1 0 DiffusionBValueXX = 0x00189602, // FD M1 0 DiffusionBValueXY = 0x00189603, // FD M1 0 DiffusionBValueXZ = 0x00189604, // FD M1 0 DiffusionBValueYY = 0x00189605, // FD M1 0 DiffusionBValueYZ = 0x00189606, // FD M1 0 DiffusionBValueZZ = 0x00189607, // FD M1 0 FunctionalMRSequence = 0x00189621, // SQ M1 0 FunctionalSettlingPhaseFramesPresent = 0x00189622, // CS M1 0 FunctionalSyncPulse = 0x00189623, // DT M1 0 SettlingPhaseFrame = 0x00189624, // CS M1 0 DecayCorrectionDateTime = 0x00189701, // DT M1 0 StartDensityThreshold = 0x00189715, // FD M1 0 StartRelativeDensityDifferenceThreshold = 0x00189716, // FD M1 0 StartCardiacTriggerCountThreshold = 0x00189717, // FD M1 0 StartRespiratoryTriggerCountThreshold = 0x00189718, // FD M1 0 TerminationCountsThreshold = 0x00189719, // FD M1 0 TerminationDensityThreshold = 0x00189720, // FD M1 0 TerminationRelativeDensityThreshold = 0x00189721, // FD M1 0 TerminationTimeThreshold = 0x00189722, // FD M1 0 TerminationCardiacTriggerCountThreshold = 0x00189723, // FD M1 0 TerminationRespiratoryTriggerCountThreshold = 0x00189724, // FD M1 0 DetectorGeometry = 0x00189725, // CS M1 0 TransverseDetectorSeparation = 0x00189726, // FD M1 0 AxialDetectorDimension = 0x00189727, // FD M1 0 RadiopharmaceuticalAgentNumber = 0x00189729, // US M1 0 PETFrameAcquisitionSequence = 0x00189732, // SQ M1 0 PETDetectorMotionDetailsSequence = 0x00189733, // SQ M1 0 PETTableDynamicsSequence = 0x00189734, // SQ M1 0 PETPositionSequence = 0x00189735, // SQ M1 0 PETFrameCorrectionFactorsSequence = 0x00189736, // SQ M1 0 RadiopharmaceuticalUsageSequence = 0x00189737, // SQ M1 0 AttenuationCorrectionSource = 0x00189738, // CS M1 0 NumberOfIterations = 0x00189739, // US M1 0 NumberOfSubsets = 0x00189740, // US M1 0 PETReconstructionSequence = 0x00189749, // SQ M1 0 PETFrameTypeSequence = 0x00189751, // SQ M1 0 TimeOfFlightInformationUsed = 0x00189755, // CS M1 0 ReconstructionType = 0x00189756, // CS M1 0 DecayCorrected = 0x00189758, // CS M1 0 AttenuationCorrected = 0x00189759, // CS M1 0 ScatterCorrected = 0x00189760, // CS M1 0 DeadTimeCorrected = 0x00189761, // CS M1 0 GantryMotionCorrected = 0x00189762, // CS M1 0 PatientMotionCorrected = 0x00189763, // CS M1 0 CountLossNormalizationCorrected = 0x00189764, // CS M1 0 RandomsCorrected = 0x00189765, // CS M1 0 NonUniformRadialSamplingCorrected = 0x00189766, // CS M1 0 SensitivityCalibrated = 0x00189767, // CS M1 0 DetectorNormalizationCorrection = 0x00189768, // CS M1 0 IterativeReconstructionMethod = 0x00189769, // CS M1 0 AttenuationCorrectionTemporalRelationship = 0x00189770, // CS M1 0 PatientPhysiologicalStateSequence = 0x00189771, // SQ M1 0 PatientPhysiologicalStateCodeSequence = 0x00189772, // SQ M1 0 DepthsOfFocus = 0x00189801, // FD M1TN 0 ExcludedIntervalsSequence = 0x00189803, // SQ M1 0 ExclusionStartDateTime = 0x00189804, // DT M1 0 ExclusionDuration = 0x00189805, // FD M1 0 USImageDescriptionSequence = 0x00189806, // SQ M1 0 ImageDataTypeSequence = 0x00189807, // SQ M1 0 DataType = 0x00189808, // CS M1 0 TransducerScanPatternCodeSequence = 0x00189809, // SQ M1 0 AliasedDataType = 0x0018980B, // CS M1 0 PositionMeasuringDeviceUsed = 0x0018980C, // CS M1 0 TransducerGeometryCodeSequence = 0x0018980D, // SQ M1 0 TransducerBeamSteeringCodeSequence = 0x0018980E, // SQ M1 0 TransducerApplicationCodeSequence = 0x0018980F, // SQ M1 0 ZeroVelocityPixelValue = 0x00189810, // XS M1 0 ReferenceLocationLabel = 0x00189900, // LO M1 0 ReferenceLocationDescription = 0x00189901, // UT M1 0 ReferenceBasisCodeSequence = 0x00189902, // SQ M1 0 ReferenceGeometryCodeSequence = 0x00189903, // SQ M1 0 OffsetDistance = 0x00189904, // DS M1 0 OffsetDirection = 0x00189905, // CS M1 0 PotentialScheduledProtocolCodeSequence = 0x00189906, // SQ M1 0 PotentialRequestedProcedureCodeSequence = 0x00189907, // SQ M1 0 PotentialReasonsForProcedure = 0x00189908, // UC M1TN 0 PotentialReasonsForProcedureCodeSequence = 0x00189909, // SQ M1 0 PotentialDiagnosticTasks = 0x0018990A, // UC M1TN 0 ContraindicationsCodeSequence = 0x0018990B, // SQ M1 0 ReferencedDefinedProtocolSequence = 0x0018990C, // SQ M1 0 ReferencedPerformedProtocolSequence = 0x0018990D, // SQ M1 0 PredecessorProtocolSequence = 0x0018990E, // SQ M1 0 ProtocolPlanningInformation = 0x0018990F, // UT M1 0 ProtocolDesignRationale = 0x00189910, // UT M1 0 PatientSpecificationSequence = 0x00189911, // SQ M1 0 ModelSpecificationSequence = 0x00189912, // SQ M1 0 ParametersSpecificationSequence = 0x00189913, // SQ M1 0 InstructionSequence = 0x00189914, // SQ M1 0 InstructionIndex = 0x00189915, // US M1 0 InstructionText = 0x00189916, // LO M1 0 InstructionDescription = 0x00189917, // UT M1 0 InstructionPerformedFlag = 0x00189918, // CS M1 0 InstructionPerformedDateTime = 0x00189919, // DT M1 0 InstructionPerformanceComment = 0x0018991A, // UT M1 0 PatientPositioningInstructionSequence = 0x0018991B, // SQ M1 0 PositioningMethodCodeSequence = 0x0018991C, // SQ M1 0 PositioningLandmarkSequence = 0x0018991D, // SQ M1 0 TargetFrameOfReferenceUID = 0x0018991E, // UI M1 0 AcquisitionProtocolElementSpecificationSequence = 0x0018991F, // SQ M1 0 AcquisitionProtocolElementSequence = 0x00189920, // SQ M1 0 ProtocolElementNumber = 0x00189921, // US M1 0 ProtocolElementName = 0x00189922, // LO M1 0 ProtocolElementCharacteristicsSummary = 0x00189923, // UT M1 0 ProtocolElementPurpose = 0x00189924, // UT M1 0 AcquisitionMotion = 0x00189930, // CS M1 0 AcquisitionStartLocationSequence = 0x00189931, // SQ M1 0 AcquisitionEndLocationSequence = 0x00189932, // SQ M1 0 ReconstructionProtocolElementSpecificationSequence = 0x00189933, // SQ M1 0 ReconstructionProtocolElementSequence = 0x00189934, // SQ M1 0 StorageProtocolElementSpecificationSequence = 0x00189935, // SQ M1 0 StorageProtocolElementSequence = 0x00189936, // SQ M1 0 RequestedSeriesDescription = 0x00189937, // LO M1 0 SourceAcquisitionProtocolElementNumber = 0x00189938, // US M1TN 0 SourceAcquisitionBeamNumber = 0x00189939, // US M1TN 0 SourceReconstructionProtocolElementNumber = 0x0018993A, // US M1TN 0 ReconstructionStartLocationSequence = 0x0018993B, // SQ M1 0 ReconstructionEndLocationSequence = 0x0018993C, // SQ M1 0 ReconstructionAlgorithmSequence = 0x0018993D, // SQ M1 0 ReconstructionTargetCenterLocationSequence = 0x0018993E, // SQ M1 0 ImageFilterDescription = 0x00189941, // UT M1 0 CTDIvolNotificationTrigger = 0x00189942, // FD M1 0 DLPNotificationTrigger = 0x00189943, // FD M1 0 AutoKVPSelectionType = 0x00189944, // CS M1 0 AutoKVPUpperBound = 0x00189945, // FD M1 0 AutoKVPLowerBound = 0x00189946, // FD M1 0 ProtocolDefinedPatientPosition = 0x00189947, // CS M1 0 ContributingEquipmentSequence = 0x0018A001, // SQ M1 0 ContributionDateTime = 0x0018A002, // DT M1 0 ContributionDescription = 0x0018A003, // ST M1 0 StudyInstanceUID = 0x0020000D, // UI M1 0 SeriesInstanceUID = 0x0020000E, // UI M1 0 StudyID = 0x00200010, // SH M1 0 SeriesNumber = 0x00200011, // IS M1 0 AcquisitionNumber = 0x00200012, // IS M1 0 InstanceNumber = 0x00200013, // IS M1 0 IsotopeNumber = 0x00200014, // IS M1 1 PhaseNumber = 0x00200015, // IS M1 1 IntervalNumber = 0x00200016, // IS M1 1 TimeSlotNumber = 0x00200017, // IS M1 1 AngleNumber = 0x00200018, // IS M1 1 ItemNumber = 0x00200019, // IS M1 0 PatientOrientation = 0x00200020, // CS M2 0 OverlayNumber = 0x00200022, // IS M1 1 CurveNumber = 0x00200024, // IS M1 1 LUTNumber = 0x00200026, // IS M1 1 ImagePosition = 0x00200030, // DS M3 1 ImagePositionPatient = 0x00200032, // DS M3 0 ImageOrientation = 0x00200035, // DS M6 1 ImageOrientationPatient = 0x00200037, // DS M6 0 Location = 0x00200050, // DS M1 1 FrameOfReferenceUID = 0x00200052, // UI M1 0 Laterality = 0x00200060, // CS M1 0 ImageLaterality = 0x00200062, // CS M1 0 ImageGeometryType = 0x00200070, // LO M1 1 MaskingImage = 0x00200080, // CS M1TN 1 ReportNumber = 0x002000AA, // IS M1 1 TemporalPositionIdentifier = 0x00200100, // IS M1 0 NumberOfTemporalPositions = 0x00200105, // IS M1 0 TemporalResolution = 0x00200110, // DS M1 0 SynchronizationFrameOfReferenceUID = 0x00200200, // UI M1 0 SOPInstanceUIDOfConcatenationSource = 0x00200242, // UI M1 0 SeriesInStudy = 0x00201000, // IS M1 1 AcquisitionsInSeries = 0x00201001, // IS M1 1 ImagesInAcquisition = 0x00201002, // IS M1 0 ImagesInSeries = 0x00201003, // IS M1 1 AcquisitionsInStudy = 0x00201004, // IS M1 1 ImagesInStudy = 0x00201005, // IS M1 1 Reference = 0x00201020, // LO M1TN 1 TargetPositionReferenceIndicator = 0x0020103F, // LO M1 0 PositionReferenceIndicator = 0x00201040, // LO M1 0 SliceLocation = 0x00201041, // DS M1 0 OtherStudyNumbers = 0x00201070, // IS M1TN 1 NumberOfPatientRelatedStudies = 0x00201200, // IS M1 0 NumberOfPatientRelatedSeries = 0x00201202, // IS M1 0 NumberOfPatientRelatedInstances = 0x00201204, // IS M1 0 NumberOfStudyRelatedSeries = 0x00201206, // IS M1 0 NumberOfStudyRelatedInstances = 0x00201208, // IS M1 0 NumberOfSeriesRelatedInstances = 0x00201209, // IS M1 0 SourceImageIDs = 0x00203100, // CS M1TN 1 ModifyingDeviceID = 0x00203401, // CS M1 1 ModifiedImageID = 0x00203402, // CS M1 1 ModifiedImageDate = 0x00203403, // DA M1 1 ModifyingDeviceManufacturer = 0x00203404, // LO M1 1 ModifiedImageTime = 0x00203405, // TM M1 1 ModifiedImageDescription = 0x00203406, // LO M1 1 ImageComments = 0x00204000, // LT M1 0 OriginalImageIdentification = 0x00205000, // AT M1TN 1 OriginalImageIdentificationNomenclature = 0x00205002, // LO M1TN 1 StackID = 0x00209056, // SH M1 0 InStackPositionNumber = 0x00209057, // UL M1 0 FrameAnatomySequence = 0x00209071, // SQ M1 0 FrameLaterality = 0x00209072, // CS M1 0 FrameContentSequence = 0x00209111, // SQ M1 0 PlanePositionSequence = 0x00209113, // SQ M1 0 PlaneOrientationSequence = 0x00209116, // SQ M1 0 TemporalPositionIndex = 0x00209128, // UL M1 0 NominalCardiacTriggerDelayTime = 0x00209153, // FD M1 0 NominalCardiacTriggerTimePriorToRPeak = 0x00209154, // FL M1 0 ActualCardiacTriggerTimePriorToRPeak = 0x00209155, // FL M1 0 FrameAcquisitionNumber = 0x00209156, // US M1 0 DimensionIndexValues = 0x00209157, // UL M1TN 0 FrameComments = 0x00209158, // LT M1 0 ConcatenationUID = 0x00209161, // UI M1 0 InConcatenationNumber = 0x00209162, // US M1 0 InConcatenationTotalNumber = 0x00209163, // US M1 0 DimensionOrganizationUID = 0x00209164, // UI M1 0 DimensionIndexPointer = 0x00209165, // AT M1 0 FunctionalGroupPointer = 0x00209167, // AT M1 0 UnassignedSharedConvertedAttributesSequence = 0x00209170, // SQ M1 0 UnassignedPerFrameConvertedAttributesSequence = 0x00209171, // SQ M1 0 ConversionSourceAttributesSequence = 0x00209172, // SQ M1 0 DimensionIndexPrivateCreator = 0x00209213, // LO M1 0 DimensionOrganizationSequence = 0x00209221, // SQ M1 0 DimensionIndexSequence = 0x00209222, // SQ M1 0 ConcatenationFrameOffsetNumber = 0x00209228, // UL M1 0 FunctionalGroupPrivateCreator = 0x00209238, // LO M1 0 NominalPercentageOfCardiacPhase = 0x00209241, // FL M1 0 NominalPercentageOfRespiratoryPhase = 0x00209245, // FL M1 0 StartingRespiratoryAmplitude = 0x00209246, // FL M1 0 StartingRespiratoryPhase = 0x00209247, // CS M1 0 EndingRespiratoryAmplitude = 0x00209248, // FL M1 0 EndingRespiratoryPhase = 0x00209249, // CS M1 0 RespiratoryTriggerType = 0x00209250, // CS M1 0 RRIntervalTimeNominal = 0x00209251, // FD M1 0 ActualCardiacTriggerDelayTime = 0x00209252, // FD M1 0 RespiratorySynchronizationSequence = 0x00209253, // SQ M1 0 RespiratoryIntervalTime = 0x00209254, // FD M1 0 NominalRespiratoryTriggerDelayTime = 0x00209255, // FD M1 0 RespiratoryTriggerDelayThreshold = 0x00209256, // FD M1 0 ActualRespiratoryTriggerDelayTime = 0x00209257, // FD M1 0 ImagePositionVolume = 0x00209301, // FD M3 0 ImageOrientationVolume = 0x00209302, // FD M6 0 UltrasoundAcquisitionGeometry = 0x00209307, // CS M1 0 ApexPosition = 0x00209308, // FD M3 0 VolumeToTransducerMappingMatrix = 0x00209309, // FD M16 0 VolumeToTableMappingMatrix = 0x0020930A, // FD M16 0 VolumeToTransducerRelationship = 0x0020930B, // CS M1 0 PatientFrameOfReferenceSource = 0x0020930C, // CS M1 0 TemporalPositionTimeOffset = 0x0020930D, // FD M1 0 PlanePositionVolumeSequence = 0x0020930E, // SQ M1 0 PlaneOrientationVolumeSequence = 0x0020930F, // SQ M1 0 TemporalPositionSequence = 0x00209310, // SQ M1 0 DimensionOrganizationType = 0x00209311, // CS M1 0 VolumeFrameOfReferenceUID = 0x00209312, // UI M1 0 TableFrameOfReferenceUID = 0x00209313, // UI M1 0 DimensionDescriptionLabel = 0x00209421, // LO M1 0 PatientOrientationInFrameSequence = 0x00209450, // SQ M1 0 FrameLabel = 0x00209453, // LO M1 0 AcquisitionIndex = 0x00209518, // US M1TN 0 ContributingSOPInstancesReferenceSequence = 0x00209529, // SQ M1 0 ReconstructionIndex = 0x00209536, // US M1 0 LightPathFilterPassThroughWavelength = 0x00220001, // US M1 0 LightPathFilterPassBand = 0x00220002, // US M2 0 ImagePathFilterPassThroughWavelength = 0x00220003, // US M1 0 ImagePathFilterPassBand = 0x00220004, // US M2 0 PatientEyeMovementCommanded = 0x00220005, // CS M1 0 PatientEyeMovementCommandCodeSequence = 0x00220006, // SQ M1 0 SphericalLensPower = 0x00220007, // FL M1 0 CylinderLensPower = 0x00220008, // FL M1 0 CylinderAxis = 0x00220009, // FL M1 0 EmmetropicMagnification = 0x0022000A, // FL M1 0 IntraOcularPressure = 0x0022000B, // FL M1 0 HorizontalFieldOfView = 0x0022000C, // FL M1 0 PupilDilated = 0x0022000D, // CS M1 0 DegreeOfDilation = 0x0022000E, // FL M1 0 StereoBaselineAngle = 0x00220010, // FL M1 0 StereoBaselineDisplacement = 0x00220011, // FL M1 0 StereoHorizontalPixelOffset = 0x00220012, // FL M1 0 StereoVerticalPixelOffset = 0x00220013, // FL M1 0 StereoRotation = 0x00220014, // FL M1 0 AcquisitionDeviceTypeCodeSequence = 0x00220015, // SQ M1 0 IlluminationTypeCodeSequence = 0x00220016, // SQ M1 0 LightPathFilterTypeStackCodeSequence = 0x00220017, // SQ M1 0 ImagePathFilterTypeStackCodeSequence = 0x00220018, // SQ M1 0 LensesCodeSequence = 0x00220019, // SQ M1 0 ChannelDescriptionCodeSequence = 0x0022001A, // SQ M1 0 RefractiveStateSequence = 0x0022001B, // SQ M1 0 MydriaticAgentCodeSequence = 0x0022001C, // SQ M1 0 RelativeImagePositionCodeSequence = 0x0022001D, // SQ M1 0 CameraAngleOfView = 0x0022001E, // FL M1 0 StereoPairsSequence = 0x00220020, // SQ M1 0 LeftImageSequence = 0x00220021, // SQ M1 0 RightImageSequence = 0x00220022, // SQ M1 0 StereoPairsPresent = 0x00220028, // CS M1 0 AxialLengthOfTheEye = 0x00220030, // FL M1 0 OphthalmicFrameLocationSequence = 0x00220031, // SQ M1 0 ReferenceCoordinates = 0x00220032, // FL M2T2N 0 DepthSpatialResolution = 0x00220035, // FL M1 0 MaximumDepthDistortion = 0x00220036, // FL M1 0 AlongScanSpatialResolution = 0x00220037, // FL M1 0 MaximumAlongScanDistortion = 0x00220038, // FL M1 0 OphthalmicImageOrientation = 0x00220039, // CS M1 0 DepthOfTransverseImage = 0x00220041, // FL M1 0 MydriaticAgentConcentrationUnitsSequence = 0x00220042, // SQ M1 0 AcrossScanSpatialResolution = 0x00220048, // FL M1 0 MaximumAcrossScanDistortion = 0x00220049, // FL M1 0 MydriaticAgentConcentration = 0x0022004E, // DS M1 0 IlluminationWaveLength = 0x00220055, // FL M1 0 IlluminationPower = 0x00220056, // FL M1 0 IlluminationBandwidth = 0x00220057, // FL M1 0 MydriaticAgentSequence = 0x00220058, // SQ M1 0 OphthalmicAxialMeasurementsRightEyeSequence = 0x00221007, // SQ M1 0 OphthalmicAxialMeasurementsLeftEyeSequence = 0x00221008, // SQ M1 0 OphthalmicAxialMeasurementsDeviceType = 0x00221009, // CS M1 0 OphthalmicAxialLengthMeasurementsType = 0x00221010, // CS M1 0 OphthalmicAxialLengthSequence = 0x00221012, // SQ M1 0 OphthalmicAxialLength = 0x00221019, // FL M1 0 LensStatusCodeSequence = 0x00221024, // SQ M1 0 VitreousStatusCodeSequence = 0x00221025, // SQ M1 0 IOLFormulaCodeSequence = 0x00221028, // SQ M1 0 IOLFormulaDetail = 0x00221029, // LO M1 0 KeratometerIndex = 0x00221033, // FL M1 0 SourceOfOphthalmicAxialLengthCodeSequence = 0x00221035, // SQ M1 0 SourceOfCornealSizeDataCodeSequence = 0x00221036, // SQ M1 0 TargetRefraction = 0x00221037, // FL M1 0 RefractiveProcedureOccurred = 0x00221039, // CS M1 0 RefractiveSurgeryTypeCodeSequence = 0x00221040, // SQ M1 0 OphthalmicUltrasoundMethodCodeSequence = 0x00221044, // SQ M1 0 SurgicallyInducedAstigmatismSequence = 0x00221045, // SQ M1 0 TypeOfOpticalCorrection = 0x00221046, // CS M1 0 ToricIOLPowerSequence = 0x00221047, // SQ M1 0 PredictedToricErrorSequence = 0x00221048, // SQ M1 0 PreSelectedForImplantation = 0x00221049, // CS M1 0 ToricIOLPowerForExactEmmetropiaSequence = 0x0022104A, // SQ M1 0 ToricIOLPowerForExactTargetRefractionSequence = 0x0022104B, // SQ M1 0 OphthalmicAxialLengthMeasurementsSequence = 0x00221050, // SQ M1 0 IOLPower = 0x00221053, // FL M1 0 PredictedRefractiveError = 0x00221054, // FL M1 0 OphthalmicAxialLengthVelocity = 0x00221059, // FL M1 0 LensStatusDescription = 0x00221065, // LO M1 0 VitreousStatusDescription = 0x00221066, // LO M1 0 IOLPowerSequence = 0x00221090, // SQ M1 0 LensConstantSequence = 0x00221092, // SQ M1 0 IOLManufacturer = 0x00221093, // LO M1 0 LensConstantDescription = 0x00221094, // LO M1 1 ImplantName = 0x00221095, // LO M1 0 KeratometryMeasurementTypeCodeSequence = 0x00221096, // SQ M1 0 ImplantPartNumber = 0x00221097, // LO M1 0 ReferencedOphthalmicAxialMeasurementsSequence = 0x00221100, // SQ M1 0 OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence = 0x00221101, // SQ M1 0 RefractiveErrorBeforeRefractiveSurgeryCodeSequence = 0x00221103, // SQ M1 0 IOLPowerForExactEmmetropia = 0x00221121, // FL M1 0 IOLPowerForExactTargetRefraction = 0x00221122, // FL M1 0 AnteriorChamberDepthDefinitionCodeSequence = 0x00221125, // SQ M1 0 LensThicknessSequence = 0x00221127, // SQ M1 0 AnteriorChamberDepthSequence = 0x00221128, // SQ M1 0 CalculationCommentSequence = 0x0022112A, // SQ M1 0 CalculationCommentType = 0x0022112B, // CS M1 0 CalculationComment = 0x0022112C, // LT M1 0 LensThickness = 0x00221130, // FL M1 0 AnteriorChamberDepth = 0x00221131, // FL M1 0 SourceOfLensThicknessDataCodeSequence = 0x00221132, // SQ M1 0 SourceOfAnteriorChamberDepthDataCodeSequence = 0x00221133, // SQ M1 0 SourceOfRefractiveMeasurementsSequence = 0x00221134, // SQ M1 0 SourceOfRefractiveMeasurementsCodeSequence = 0x00221135, // SQ M1 0 OphthalmicAxialLengthMeasurementModified = 0x00221140, // CS M1 0 OphthalmicAxialLengthDataSourceCodeSequence = 0x00221150, // SQ M1 0 OphthalmicAxialLengthAcquisitionMethodCodeSequence = 0x00221153, // SQ M1 1 SignalToNoiseRatio = 0x00221155, // FL M1 0 OphthalmicAxialLengthDataSourceDescription = 0x00221159, // LO M1 0 OphthalmicAxialLengthMeasurementsTotalLengthSequence = 0x00221210, // SQ M1 0 OphthalmicAxialLengthMeasurementsSegmentalLengthSequence = 0x00221211, // SQ M1 0 OphthalmicAxialLengthMeasurementsLengthSummationSequence = 0x00221212, // SQ M1 0 UltrasoundOphthalmicAxialLengthMeasurementsSequence = 0x00221220, // SQ M1 0 OpticalOphthalmicAxialLengthMeasurementsSequence = 0x00221225, // SQ M1 0 UltrasoundSelectedOphthalmicAxialLengthSequence = 0x00221230, // SQ M1 0 OphthalmicAxialLengthSelectionMethodCodeSequence = 0x00221250, // SQ M1 0 OpticalSelectedOphthalmicAxialLengthSequence = 0x00221255, // SQ M1 0 SelectedSegmentalOphthalmicAxialLengthSequence = 0x00221257, // SQ M1 0 SelectedTotalOphthalmicAxialLengthSequence = 0x00221260, // SQ M1 0 OphthalmicAxialLengthQualityMetricSequence = 0x00221262, // SQ M1 0 OphthalmicAxialLengthQualityMetricTypeCodeSequence = 0x00221265, // SQ M1 1 OphthalmicAxialLengthQualityMetricTypeDescription = 0x00221273, // LO M1 1 IntraocularLensCalculationsRightEyeSequence = 0x00221300, // SQ M1 0 IntraocularLensCalculationsLeftEyeSequence = 0x00221310, // SQ M1 0 ReferencedOphthalmicAxialLengthMeasurementQCImageSequence = 0x00221330, // SQ M1 0 OphthalmicMappingDeviceType = 0x00221415, // CS M1 0 AcquisitionMethodCodeSequence = 0x00221420, // SQ M1 0 AcquisitionMethodAlgorithmSequence = 0x00221423, // SQ M1 0 OphthalmicThicknessMapTypeCodeSequence = 0x00221436, // SQ M1 0 OphthalmicThicknessMappingNormalsSequence = 0x00221443, // SQ M1 0 RetinalThicknessDefinitionCodeSequence = 0x00221445, // SQ M1 0 PixelValueMappingToCodedConceptSequence = 0x00221450, // SQ M1 0 MappedPixelValue = 0x00221452, // XS M1 0 PixelValueMappingExplanation = 0x00221454, // LO M1 0 OphthalmicThicknessMapQualityThresholdSequence = 0x00221458, // SQ M1 0 OphthalmicThicknessMapThresholdQualityRating = 0x00221460, // FL M1 0 AnatomicStructureReferencePoint = 0x00221463, // FL M2 0 RegistrationToLocalizerSequence = 0x00221465, // SQ M1 0 RegisteredLocalizerUnits = 0x00221466, // CS M1 0 RegisteredLocalizerTopLeftHandCorner = 0x00221467, // FL M2 0 RegisteredLocalizerBottomRightHandCorner = 0x00221468, // FL M2 0 OphthalmicThicknessMapQualityRatingSequence = 0x00221470, // SQ M1 0 RelevantOPTAttributesSequence = 0x00221472, // SQ M1 0 TransformationMethodCodeSequence = 0x00221512, // SQ M1 0 TransformationAlgorithmSequence = 0x00221513, // SQ M1 0 OphthalmicAxialLengthMethod = 0x00221515, // CS M1 0 OphthalmicFOV = 0x00221517, // FL M1 0 TwoDimensionalToThreeDimensionalMapSequence = 0x00221518, // SQ M1 0 WideFieldOphthalmicPhotographyQualityRatingSequence = 0x00221525, // SQ M1 0 WideFieldOphthalmicPhotographyQualityThresholdSequence = 0x00221526, // SQ M1 0 WideFieldOphthalmicPhotographyThresholdQualityRating = 0x00221527, // FL M1 0 XCoordinatesCenterPixelViewAngle = 0x00221528, // FL M1 0 YCoordinatesCenterPixelViewAngle = 0x00221529, // FL M1 0 NumberOfMapPoints = 0x00221530, // UL M1 0 TwoDimensionalToThreeDimensionalMapData = 0x00221531, // OF M1 0 DerivationAlgorithmSequence = 0x00221612, // SQ M1 0 OphthalmicImageTypeCodeSequence = 0x00221615, // SQ M1 0 OphthalmicImageTypeDescription = 0x00221616, // LO M1 0 ScanPatternTypeCodeSequence = 0x00221618, // SQ M1 0 ReferencedSurfaceMeshIdentificationSequence = 0x00221620, // SQ M1 0 OphthalmicVolumetricPropertiesFlag = 0x00221622, // CS M1 0 OphthalmicAnatomicReferencePointXCoordinate = 0x00221624, // FL M1 0 OphthalmicAnatomicReferencePointYCoordinate = 0x00221626, // FL M1 0 OphthalmicEnFaceImageQualityRatingSequence = 0x00221628, // SQ M1 0 QualityThreshold = 0x00221630, // DS M1 0 OCTBscanAnalysisAcquisitionParametersSequence = 0x00221640, // SQ M1 0 NumberofBscansPerFrame = 0x00221642, // UL M1 0 BscanSlabThickness = 0x00221643, // FL M1 0 DistanceBetweenBscanSlabs = 0x00221644, // FL M1 0 BscanCycleTime = 0x00221645, // FL M1 0 BscanCycleTimeVector = 0x00221646, // FL M1TN 0 AscanRate = 0x00221649, // FL M1 0 BscanRate = 0x00221650, // FL M1 0 SurfaceMeshZPixelOffset = 0x00221658, // UL M1 0 VisualFieldHorizontalExtent = 0x00240010, // FL M1 0 VisualFieldVerticalExtent = 0x00240011, // FL M1 0 VisualFieldShape = 0x00240012, // CS M1 0 ScreeningTestModeCodeSequence = 0x00240016, // SQ M1 0 MaximumStimulusLuminance = 0x00240018, // FL M1 0 BackgroundLuminance = 0x00240020, // FL M1 0 StimulusColorCodeSequence = 0x00240021, // SQ M1 0 BackgroundIlluminationColorCodeSequence = 0x00240024, // SQ M1 0 StimulusArea = 0x00240025, // FL M1 0 StimulusPresentationTime = 0x00240028, // FL M1 0 FixationSequence = 0x00240032, // SQ M1 0 FixationMonitoringCodeSequence = 0x00240033, // SQ M1 0 VisualFieldCatchTrialSequence = 0x00240034, // SQ M1 0 FixationCheckedQuantity = 0x00240035, // US M1 0 PatientNotProperlyFixatedQuantity = 0x00240036, // US M1 0 PresentedVisualStimuliDataFlag = 0x00240037, // CS M1 0 NumberOfVisualStimuli = 0x00240038, // US M1 0 ExcessiveFixationLossesDataFlag = 0x00240039, // CS M1 0 ExcessiveFixationLosses = 0x00240040, // CS M1 0 StimuliRetestingQuantity = 0x00240042, // US M1 0 CommentsOnPatientPerformanceOfVisualField = 0x00240044, // LT M1 0 FalseNegativesEstimateFlag = 0x00240045, // CS M1 0 FalseNegativesEstimate = 0x00240046, // FL M1 0 NegativeCatchTrialsQuantity = 0x00240048, // US M1 0 FalseNegativesQuantity = 0x00240050, // US M1 0 ExcessiveFalseNegativesDataFlag = 0x00240051, // CS M1 0 ExcessiveFalseNegatives = 0x00240052, // CS M1 0 FalsePositivesEstimateFlag = 0x00240053, // CS M1 0 FalsePositivesEstimate = 0x00240054, // FL M1 0 CatchTrialsDataFlag = 0x00240055, // CS M1 0 PositiveCatchTrialsQuantity = 0x00240056, // US M1 0 TestPointNormalsDataFlag = 0x00240057, // CS M1 0 TestPointNormalsSequence = 0x00240058, // SQ M1 0 GlobalDeviationProbabilityNormalsFlag = 0x00240059, // CS M1 0 FalsePositivesQuantity = 0x00240060, // US M1 0 ExcessiveFalsePositivesDataFlag = 0x00240061, // CS M1 0 ExcessiveFalsePositives = 0x00240062, // CS M1 0 VisualFieldTestNormalsFlag = 0x00240063, // CS M1 0 ResultsNormalsSequence = 0x00240064, // SQ M1 0 AgeCorrectedSensitivityDeviationAlgorithmSequence = 0x00240065, // SQ M1 0 GlobalDeviationFromNormal = 0x00240066, // FL M1 0 GeneralizedDefectSensitivityDeviationAlgorithmSequence = 0x00240067, // SQ M1 0 LocalizedDeviationFromNormal = 0x00240068, // FL M1 0 PatientReliabilityIndicator = 0x00240069, // LO M1 0 VisualFieldMeanSensitivity = 0x00240070, // FL M1 0 GlobalDeviationProbability = 0x00240071, // FL M1 0 LocalDeviationProbabilityNormalsFlag = 0x00240072, // CS M1 0 LocalizedDeviationProbability = 0x00240073, // FL M1 0 ShortTermFluctuationCalculated = 0x00240074, // CS M1 0 ShortTermFluctuation = 0x00240075, // FL M1 0 ShortTermFluctuationProbabilityCalculated = 0x00240076, // CS M1 0 ShortTermFluctuationProbability = 0x00240077, // FL M1 0 CorrectedLocalizedDeviationFromNormalCalculated = 0x00240078, // CS M1 0 CorrectedLocalizedDeviationFromNormal = 0x00240079, // FL M1 0 CorrectedLocalizedDeviationFromNormalProbabilityCalculated = 0x00240080, // CS M1 0 CorrectedLocalizedDeviationFromNormalProbability = 0x00240081, // FL M1 0 GlobalDeviationProbabilitySequence = 0x00240083, // SQ M1 0 LocalizedDeviationProbabilitySequence = 0x00240085, // SQ M1 0 FovealSensitivityMeasured = 0x00240086, // CS M1 0 FovealSensitivity = 0x00240087, // FL M1 0 VisualFieldTestDuration = 0x00240088, // FL M1 0 VisualFieldTestPointSequence = 0x00240089, // SQ M1 0 VisualFieldTestPointXCoordinate = 0x00240090, // FL M1 0 VisualFieldTestPointYCoordinate = 0x00240091, // FL M1 0 AgeCorrectedSensitivityDeviationValue = 0x00240092, // FL M1 0 StimulusResults = 0x00240093, // CS M1 0 SensitivityValue = 0x00240094, // FL M1 0 RetestStimulusSeen = 0x00240095, // CS M1 0 RetestSensitivityValue = 0x00240096, // FL M1 0 VisualFieldTestPointNormalsSequence = 0x00240097, // SQ M1 0 QuantifiedDefect = 0x00240098, // FL M1 0 AgeCorrectedSensitivityDeviationProbabilityValue = 0x00240100, // FL M1 0 GeneralizedDefectCorrectedSensitivityDeviationFlag = 0x00240102, // CS M1 0 GeneralizedDefectCorrectedSensitivityDeviationValue = 0x00240103, // FL M1 0 GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue = 0x00240104, // FL M1 0 MinimumSensitivityValue = 0x00240105, // FL M1 0 BlindSpotLocalized = 0x00240106, // CS M1 0 BlindSpotXCoordinate = 0x00240107, // FL M1 0 BlindSpotYCoordinate = 0x00240108, // FL M1 0 VisualAcuityMeasurementSequence = 0x00240110, // SQ M1 0 RefractiveParametersUsedOnPatientSequence = 0x00240112, // SQ M1 0 MeasurementLaterality = 0x00240113, // CS M1 0 OphthalmicPatientClinicalInformationLeftEyeSequence = 0x00240114, // SQ M1 0 OphthalmicPatientClinicalInformationRightEyeSequence = 0x00240115, // SQ M1 0 FovealPointNormativeDataFlag = 0x00240117, // CS M1 0 FovealPointProbabilityValue = 0x00240118, // FL M1 0 ScreeningBaselineMeasured = 0x00240120, // CS M1 0 ScreeningBaselineMeasuredSequence = 0x00240122, // SQ M1 0 ScreeningBaselineType = 0x00240124, // CS M1 0 ScreeningBaselineValue = 0x00240126, // FL M1 0 AlgorithmSource = 0x00240202, // LO M1 0 DataSetName = 0x00240306, // LO M1 0 DataSetVersion = 0x00240307, // LO M1 0 DataSetSource = 0x00240308, // LO M1 0 DataSetDescription = 0x00240309, // LO M1 0 VisualFieldTestReliabilityGlobalIndexSequence = 0x00240317, // SQ M1 0 VisualFieldGlobalResultsIndexSequence = 0x00240320, // SQ M1 0 DataObservationSequence = 0x00240325, // SQ M1 0 IndexNormalsFlag = 0x00240338, // CS M1 0 IndexProbability = 0x00240341, // FL M1 0 IndexProbabilitySequence = 0x00240344, // SQ M1 0 SamplesPerPixel = 0x00280002, // US M1 0 SamplesPerPixelUsed = 0x00280003, // US M1 0 PhotometricInterpretation = 0x00280004, // CS M1 0 ImageDimensions = 0x00280005, // US M1 1 PlanarConfiguration = 0x00280006, // US M1 0 NumberOfFrames = 0x00280008, // IS M1 0 FrameIncrementPointer = 0x00280009, // AT M1TN 0 FrameDimensionPointer = 0x0028000A, // AT M1TN 0 Rows = 0x00280010, // US M1 0 Columns = 0x00280011, // US M1 0 Planes = 0x00280012, // US M1 1 UltrasoundColorDataPresent = 0x00280014, // US M1 0 PixelSpacing = 0x00280030, // DS M2 0 ZoomFactor = 0x00280031, // DS M2 0 ZoomCenter = 0x00280032, // DS M2 0 PixelAspectRatio = 0x00280034, // IS M2 0 ImageFormat = 0x00280040, // CS M1 1 ManipulatedImage = 0x00280050, // LO M1TN 1 CorrectedImage = 0x00280051, // CS M1TN 0 CompressionRecognitionCode = 0x0028005F, // LO M1 1 CompressionCode = 0x00280060, // CS M1 1 CompressionOriginator = 0x00280061, // SH M1 1 CompressionLabel = 0x00280062, // LO M1 1 CompressionDescription = 0x00280063, // SH M1 1 CompressionSequence = 0x00280065, // CS M1TN 1 CompressionStepPointers = 0x00280066, // AT M1TN 1 RepeatInterval = 0x00280068, // US M1 1 BitsGrouped = 0x00280069, // US M1 1 PerimeterTable = 0x00280070, // US M1TN 1 PerimeterValue = 0x00280071, // XS M1 1 PredictorRows = 0x00280080, // US M1 1 PredictorColumns = 0x00280081, // US M1 1 PredictorConstants = 0x00280082, // US M1TN 1 BlockedPixels = 0x00280090, // CS M1 1 BlockRows = 0x00280091, // US M1 1 BlockColumns = 0x00280092, // US M1 1 RowOverlap = 0x00280093, // US M1 1 ColumnOverlap = 0x00280094, // US M1 1 BitsAllocated = 0x00280100, // US M1 0 BitsStored = 0x00280101, // US M1 0 HighBit = 0x00280102, // US M1 0 PixelRepresentation = 0x00280103, // US M1 0 SmallestValidPixelValue = 0x00280104, // XS M1 1 LargestValidPixelValue = 0x00280105, // XS M1 1 SmallestImagePixelValue = 0x00280106, // XS M1 0 LargestImagePixelValue = 0x00280107, // XS M1 0 SmallestPixelValueInSeries = 0x00280108, // XS M1 0 LargestPixelValueInSeries = 0x00280109, // XS M1 0 SmallestImagePixelValueInPlane = 0x00280110, // XS M1 1 LargestImagePixelValueInPlane = 0x00280111, // XS M1 1 PixelPaddingValue = 0x00280120, // XS M1 0 PixelPaddingRangeLimit = 0x00280121, // XS M1 0 FloatPixelPaddingValue = 0x00280122, // FL M1 0 DoubleFloatPixelPaddingValue = 0x00280123, // FD M1 0 FloatPixelPaddingRangeLimit = 0x00280124, // FL M1 0 DoubleFloatPixelPaddingRangeLimit = 0x00280125, // FD M1 0 ImageLocation = 0x00280200, // US M1 1 QualityControlImage = 0x00280300, // CS M1 0 BurnedInAnnotation = 0x00280301, // CS M1 0 RecognizableVisualFeatures = 0x00280302, // CS M1 0 LongitudinalTemporalInformationModified = 0x00280303, // CS M1 0 ReferencedColorPaletteInstanceUID = 0x00280304, // UI M1 0 TransformLabel = 0x00280400, // LO M1 1 TransformVersionNumber = 0x00280401, // LO M1 1 NumberOfTransformSteps = 0x00280402, // US M1 1 SequenceOfCompressedData = 0x00280403, // LO M1TN 1 DetailsOfCoefficients = 0x00280404, // AT M1TN 1 RowsForNthOrderCoefficients = 0x00280410, // US M1 1 ColumnsForNthOrderCoefficients = 0x00280411, // US M1 1 CoefficientCoding = 0x00280412, // LO M1TN 1 CoefficientCodingPointers = 0x00280413, // AT M1TN 1 DCTLabel = 0x00280700, // LO M1 1 DataBlockDescription = 0x00280701, // CS M1TN 1 DataBlock = 0x00280702, // AT M1TN 1 NormalizationFactorFormat = 0x00280710, // US M1 1 ZonalMapNumberFormat = 0x00280720, // US M1 1 ZonalMapLocation = 0x00280721, // AT M1TN 1 ZonalMapFormat = 0x00280722, // US M1 1 AdaptiveMapFormat = 0x00280730, // US M1 1 CodeNumberFormat = 0x00280740, // US M1 1 CodeLabel = 0x00280810, // CS M1TN 1 NumberOfTables = 0x00280812, // US M1 1 CodeTableLocation = 0x00280813, // AT M1TN 1 BitsForCodeWord = 0x00280814, // US M1 1 ImageDataLocation = 0x00280818, // AT M1TN 1 PixelSpacingCalibrationType = 0x00280A02, // CS M1 0 PixelSpacingCalibrationDescription = 0x00280A04, // LO M1 0 PixelIntensityRelationship = 0x00281040, // CS M1 0 PixelIntensityRelationshipSign = 0x00281041, // SS M1 0 WindowCenter = 0x00281050, // DS M1TN 0 WindowWidth = 0x00281051, // DS M1TN 0 RescaleIntercept = 0x00281052, // DS M1 0 RescaleSlope = 0x00281053, // DS M1 0 RescaleType = 0x00281054, // LO M1 0 WindowCenterWidthExplanation = 0x00281055, // LO M1TN 0 VOILUTFunction = 0x00281056, // CS M1 0 GrayScale = 0x00281080, // CS M1 1 RecommendedViewingMode = 0x00281090, // CS M1 0 GrayLookupTableDescriptor = 0x00281100, // XS M3 1 RedPaletteColorLookupTableDescriptor = 0x00281101, // XS M3 0 GreenPaletteColorLookupTableDescriptor = 0x00281102, // XS M3 0 BluePaletteColorLookupTableDescriptor = 0x00281103, // XS M3 0 AlphaPaletteColorLookupTableDescriptor = 0x00281104, // US M3 0 LargeRedPaletteColorLookupTableDescriptor = 0x00281111, // XS M4 1 LargeGreenPaletteColorLookupTableDescriptor = 0x00281112, // XS M4 1 LargeBluePaletteColorLookupTableDescriptor = 0x00281113, // XS M4 1 PaletteColorLookupTableUID = 0x00281199, // UI M1 0 GrayLookupTableData = 0x00281200, // OW M1 1 RedPaletteColorLookupTableData = 0x00281201, // OW M1 0 GreenPaletteColorLookupTableData = 0x00281202, // OW M1 0 BluePaletteColorLookupTableData = 0x00281203, // OW M1 0 AlphaPaletteColorLookupTableData = 0x00281204, // OW M1 0 LargeRedPaletteColorLookupTableData = 0x00281211, // OW M1 1 LargeGreenPaletteColorLookupTableData = 0x00281212, // OW M1 1 LargeBluePaletteColorLookupTableData = 0x00281213, // OW M1 1 LargePaletteColorLookupTableUID = 0x00281214, // UI M1 1 SegmentedRedPaletteColorLookupTableData = 0x00281221, // OW M1 0 SegmentedGreenPaletteColorLookupTableData = 0x00281222, // OW M1 0 SegmentedBluePaletteColorLookupTableData = 0x00281223, // OW M1 0 SegmentedAlphaPaletteColorLookupTableData = 0x00281224, // OW M1 0 StoredValueColorRangeSequence = 0x00281230, // SQ M1 0 MinimumStoredValueMapped = 0x00281231, // FD M1 0 MaximumStoredValueMapped = 0x00281232, // FD M1 0 BreastImplantPresent = 0x00281300, // CS M1 0 PartialView = 0x00281350, // CS M1 0 PartialViewDescription = 0x00281351, // ST M1 0 PartialViewCodeSequence = 0x00281352, // SQ M1 0 SpatialLocationsPreserved = 0x0028135A, // CS M1 0 DataFrameAssignmentSequence = 0x00281401, // SQ M1 0 DataPathAssignment = 0x00281402, // CS M1 0 BitsMappedToColorLookupTable = 0x00281403, // US M1 0 BlendingLUT1Sequence = 0x00281404, // SQ M1 0 BlendingLUT1TransferFunction = 0x00281405, // CS M1 0 BlendingWeightConstant = 0x00281406, // FD M1 0 BlendingLookupTableDescriptor = 0x00281407, // US M3 0 BlendingLookupTableData = 0x00281408, // OW M1 0 EnhancedPaletteColorLookupTableSequence = 0x0028140B, // SQ M1 0 BlendingLUT2Sequence = 0x0028140C, // SQ M1 0 BlendingLUT2TransferFunction = 0x0028140D, // CS M1 0 DataPathID = 0x0028140E, // CS M1 0 RGBLUTTransferFunction = 0x0028140F, // CS M1 0 AlphaLUTTransferFunction = 0x00281410, // CS M1 0 ICCProfile = 0x00282000, // OB M1 0 ColorSpace = 0x00282002, // CS M1 0 LossyImageCompression = 0x00282110, // CS M1 0 LossyImageCompressionRatio = 0x00282112, // DS M1TN 0 LossyImageCompressionMethod = 0x00282114, // CS M1TN 0 ModalityLUTSequence = 0x00283000, // SQ M1 0 LUTDescriptor = 0x00283002, // XS M3 0 LUTExplanation = 0x00283003, // LO M1 0 ModalityLUTType = 0x00283004, // LO M1 0 LUTData = 0x00283006, // OW M1 0 VOILUTSequence = 0x00283010, // SQ M1 0 SoftcopyVOILUTSequence = 0x00283110, // SQ M1 0 ImagePresentationComments = 0x00284000, // LT M1 1 BiPlaneAcquisitionSequence = 0x00285000, // SQ M1 1 RepresentativeFrameNumber = 0x00286010, // US M1 0 FrameNumbersOfInterest = 0x00286020, // US M1TN 0 FrameOfInterestDescription = 0x00286022, // LO M1TN 0 FrameOfInterestType = 0x00286023, // CS M1TN 0 MaskPointers = 0x00286030, // US M1TN 1 RWavePointer = 0x00286040, // US M1TN 0 MaskSubtractionSequence = 0x00286100, // SQ M1 0 MaskOperation = 0x00286101, // CS M1 0 ApplicableFrameRange = 0x00286102, // US M2T2N 0 MaskFrameNumbers = 0x00286110, // US M1TN 0 ContrastFrameAveraging = 0x00286112, // US M1 0 MaskSubPixelShift = 0x00286114, // FL M2 0 TIDOffset = 0x00286120, // SS M1 0 MaskOperationExplanation = 0x00286190, // ST M1 0 EquipmentAdministratorSequence = 0x00287000, // SQ M1 0 NumberOfDisplaySubsystems = 0x00287001, // US M1 0 CurrentConfigurationID = 0x00287002, // US M1 0 DisplaySubsystemID = 0x00287003, // US M1 0 DisplaySubsystemName = 0x00287004, // SH M1 0 DisplaySubsystemDescription = 0x00287005, // LO M1 0 SystemStatus = 0x00287006, // CS M1 0 SystemStatusComment = 0x00287007, // LO M1 0 TargetLuminanceCharacteristicsSequence = 0x00287008, // SQ M1 0 LuminanceCharacteristicsID = 0x00287009, // US M1 0 DisplaySubsystemConfigurationSequence = 0x0028700A, // SQ M1 0 ConfigurationID = 0x0028700B, // US M1 0 ConfigurationName = 0x0028700C, // SH M1 0 ConfigurationDescription = 0x0028700D, // LO M1 0 ReferencedTargetLuminanceCharacteristicsID = 0x0028700E, // US M1 0 QAResultsSequence = 0x0028700F, // SQ M1 0 DisplaySubsystemQAResultsSequence = 0x00287010, // SQ M1 0 ConfigurationQAResultsSequence = 0x00287011, // SQ M1 0 MeasurementEquipmentSequence = 0x00287012, // SQ M1 0 MeasurementFunctions = 0x00287013, // CS M1TN 0 MeasurementEquipmentType = 0x00287014, // CS M1 0 VisualEvaluationResultSequence = 0x00287015, // SQ M1 0 DisplayCalibrationResultSequence = 0x00287016, // SQ M1 0 DDLValue = 0x00287017, // US M1 0 CIExyWhitePoint = 0x00287018, // FL M2 0 DisplayFunctionType = 0x00287019, // CS M1 0 GammaValue = 0x0028701A, // FL M1 0 NumberOfLuminancePoints = 0x0028701B, // US M1 0 LuminanceResponseSequence = 0x0028701C, // SQ M1 0 TargetMinimumLuminance = 0x0028701D, // FL M1 0 TargetMaximumLuminance = 0x0028701E, // FL M1 0 LuminanceValue = 0x0028701F, // FL M1 0 LuminanceResponseDescription = 0x00287020, // LO M1 0 WhitePointFlag = 0x00287021, // CS M1 0 DisplayDeviceTypeCodeSequence = 0x00287022, // SQ M1 0 DisplaySubsystemSequence = 0x00287023, // SQ M1 0 LuminanceResultSequence = 0x00287024, // SQ M1 0 AmbientLightValueSource = 0x00287025, // CS M1 0 MeasuredCharacteristics = 0x00287026, // CS M1TN 0 LuminanceUniformityResultSequence = 0x00287027, // SQ M1 0 VisualEvaluationTestSequence = 0x00287028, // SQ M1 0 TestResult = 0x00287029, // CS M1 0 TestResultComment = 0x0028702A, // LO M1 0 TestImageValidation = 0x0028702B, // CS M1 0 TestPatternCodeSequence = 0x0028702C, // SQ M1 0 MeasurementPatternCodeSequence = 0x0028702D, // SQ M1 0 VisualEvaluationMethodCodeSequence = 0x0028702E, // SQ M1 0 PixelDataProviderURL = 0x00287FE0, // UR M1 0 DataPointRows = 0x00289001, // UL M1 0 DataPointColumns = 0x00289002, // UL M1 0 SignalDomainColumns = 0x00289003, // CS M1 0 LargestMonochromePixelValue = 0x00289099, // US M1 1 DataRepresentation = 0x00289108, // CS M1 0 PixelMeasuresSequence = 0x00289110, // SQ M1 0 FrameVOILUTSequence = 0x00289132, // SQ M1 0 PixelValueTransformationSequence = 0x00289145, // SQ M1 0 SignalDomainRows = 0x00289235, // CS M1 0 DisplayFilterPercentage = 0x00289411, // FL M1 0 FramePixelShiftSequence = 0x00289415, // SQ M1 0 SubtractionItemID = 0x00289416, // US M1 0 PixelIntensityRelationshipLUTSequence = 0x00289422, // SQ M1 0 FramePixelDataPropertiesSequence = 0x00289443, // SQ M1 0 GeometricalProperties = 0x00289444, // CS M1 0 GeometricMaximumDistortion = 0x00289445, // FL M1 0 ImageProcessingApplied = 0x00289446, // CS M1TN 0 MaskSelectionMode = 0x00289454, // CS M1 0 LUTFunction = 0x00289474, // CS M1 0 MaskVisibilityPercentage = 0x00289478, // FL M1 0 PixelShiftSequence = 0x00289501, // SQ M1 0 RegionPixelShiftSequence = 0x00289502, // SQ M1 0 VerticesOfTheRegion = 0x00289503, // SS M2T2N 0 MultiFramePresentationSequence = 0x00289505, // SQ M1 0 PixelShiftFrameRange = 0x00289506, // US M2T2N 0 LUTFrameRange = 0x00289507, // US M2T2N 0 ImageToEquipmentMappingMatrix = 0x00289520, // DS M16 0 EquipmentCoordinateSystemIdentification = 0x00289537, // CS M1 0 StudyStatusID = 0x0032000A, // CS M1 1 StudyPriorityID = 0x0032000C, // CS M1 1 StudyIDIssuer = 0x00320012, // LO M1 1 StudyVerifiedDate = 0x00320032, // DA M1 1 StudyVerifiedTime = 0x00320033, // TM M1 1 StudyReadDate = 0x00320034, // DA M1 1 StudyReadTime = 0x00320035, // TM M1 1 ScheduledStudyStartDate = 0x00321000, // DA M1 1 ScheduledStudyStartTime = 0x00321001, // TM M1 1 ScheduledStudyStopDate = 0x00321010, // DA M1 1 ScheduledStudyStopTime = 0x00321011, // TM M1 1 ScheduledStudyLocation = 0x00321020, // LO M1 1 ScheduledStudyLocationAETitle = 0x00321021, // AE M1TN 1 ReasonForStudy = 0x00321030, // LO M1 1 RequestingPhysicianIdentificationSequence = 0x00321031, // SQ M1 0 RequestingPhysician = 0x00321032, // PN M1 0 RequestingService = 0x00321033, // LO M1 0 RequestingServiceCodeSequence = 0x00321034, // SQ M1 0 StudyArrivalDate = 0x00321040, // DA M1 1 StudyArrivalTime = 0x00321041, // TM M1 1 StudyCompletionDate = 0x00321050, // DA M1 1 StudyCompletionTime = 0x00321051, // TM M1 1 StudyComponentStatusID = 0x00321055, // CS M1 1 RequestedProcedureDescription = 0x00321060, // LO M1 0 RequestedProcedureCodeSequence = 0x00321064, // SQ M1 0 ReasonForVisit = 0x00321066, // UT M1 0 ReasonForVisitCodeSequence = 0x00321067, // SQ M1 0 RequestedContrastAgent = 0x00321070, // LO M1 0 StudyComments = 0x00324000, // LT M1 1 FlowIdentifierSequence = 0x00340001, // SQ M1 0 FlowIdentifier = 0x00340002, // OB M1 0 FlowTransferSyntaxUID = 0x00340003, // UI M1 0 FlowRTPSamplingRate = 0x00340004, // UL M1 0 SourceIdentifier = 0x00340005, // OB M1 0 FrameOriginTimestamp = 0x00340007, // OB M1 0 IncludesImagingSubject = 0x00340008, // CS M1 0 FrameUsefulnessGroupSequence = 0x00340009, // SQ M1 0 RealTimeBulkDataFlowSequence = 0x0034000A, // SQ M1 0 CameraPositionGroupSequence = 0x0034000B, // SQ M1 0 IncludesInformation = 0x0034000C, // CS M1 0 TimeOfFrameGroupSequence = 0x0034000D, // SQ M1 0 ReferencedPatientAliasSequence = 0x00380004, // SQ M1 0 VisitStatusID = 0x00380008, // CS M1 0 AdmissionID = 0x00380010, // LO M1 0 IssuerOfAdmissionID = 0x00380011, // LO M1 1 IssuerOfAdmissionIDSequence = 0x00380014, // SQ M1 0 RouteOfAdmissions = 0x00380016, // LO M1 0 ScheduledAdmissionDate = 0x0038001A, // DA M1 1 ScheduledAdmissionTime = 0x0038001B, // TM M1 1 ScheduledDischargeDate = 0x0038001C, // DA M1 1 ScheduledDischargeTime = 0x0038001D, // TM M1 1 ScheduledPatientInstitutionResidence = 0x0038001E, // LO M1 1 AdmittingDate = 0x00380020, // DA M1 0 AdmittingTime = 0x00380021, // TM M1 0 DischargeDate = 0x00380030, // DA M1 1 DischargeTime = 0x00380032, // TM M1 1 DischargeDiagnosisDescription = 0x00380040, // LO M1 1 DischargeDiagnosisCodeSequence = 0x00380044, // SQ M1 1 SpecialNeeds = 0x00380050, // LO M1 0 ServiceEpisodeID = 0x00380060, // LO M1 0 IssuerOfServiceEpisodeID = 0x00380061, // LO M1 1 ServiceEpisodeDescription = 0x00380062, // LO M1 0 IssuerOfServiceEpisodeIDSequence = 0x00380064, // SQ M1 0 PertinentDocumentsSequence = 0x00380100, // SQ M1 0 PertinentResourcesSequence = 0x00380101, // SQ M1 0 ResourceDescription = 0x00380102, // LO M1 0 CurrentPatientLocation = 0x00380300, // LO M1 0 PatientInstitutionResidence = 0x00380400, // LO M1 0 PatientState = 0x00380500, // LO M1 0 PatientClinicalTrialParticipationSequence = 0x00380502, // SQ M1 0 VisitComments = 0x00384000, // LT M1 0 WaveformOriginality = 0x003A0004, // CS M1 0 NumberOfWaveformChannels = 0x003A0005, // US M1 0 NumberOfWaveformSamples = 0x003A0010, // UL M1 0 SamplingFrequency = 0x003A001A, // DS M1 0 MultiplexGroupLabel = 0x003A0020, // SH M1 0 ChannelDefinitionSequence = 0x003A0200, // SQ M1 0 WaveformChannelNumber = 0x003A0202, // IS M1 0 ChannelLabel = 0x003A0203, // SH M1 0 ChannelStatus = 0x003A0205, // CS M1TN 0 ChannelSourceSequence = 0x003A0208, // SQ M1 0 ChannelSourceModifiersSequence = 0x003A0209, // SQ M1 0 SourceWaveformSequence = 0x003A020A, // SQ M1 0 ChannelDerivationDescription = 0x003A020C, // LO M1 0 ChannelSensitivity = 0x003A0210, // DS M1 0 ChannelSensitivityUnitsSequence = 0x003A0211, // SQ M1 0 ChannelSensitivityCorrectionFactor = 0x003A0212, // DS M1 0 ChannelBaseline = 0x003A0213, // DS M1 0 ChannelTimeSkew = 0x003A0214, // DS M1 0 ChannelSampleSkew = 0x003A0215, // DS M1 0 ChannelOffset = 0x003A0218, // DS M1 0 WaveformBitsStored = 0x003A021A, // US M1 0 FilterLowFrequency = 0x003A0220, // DS M1 0 FilterHighFrequency = 0x003A0221, // DS M1 0 NotchFilterFrequency = 0x003A0222, // DS M1 0 NotchFilterBandwidth = 0x003A0223, // DS M1 0 WaveformDataDisplayScale = 0x003A0230, // FL M1 0 WaveformDisplayBackgroundCIELabValue = 0x003A0231, // US M3 0 WaveformPresentationGroupSequence = 0x003A0240, // SQ M1 0 PresentationGroupNumber = 0x003A0241, // US M1 0 ChannelDisplaySequence = 0x003A0242, // SQ M1 0 ChannelRecommendedDisplayCIELabValue = 0x003A0244, // US M3 0 ChannelPosition = 0x003A0245, // FL M1 0 DisplayShadingFlag = 0x003A0246, // CS M1 0 FractionalChannelDisplayScale = 0x003A0247, // FL M1 0 AbsoluteChannelDisplayScale = 0x003A0248, // FL M1 0 MultiplexedAudioChannelsDescriptionCodeSequence = 0x003A0300, // SQ M1 0 ChannelIdentificationCode = 0x003A0301, // IS M1 0 ChannelMode = 0x003A0302, // CS M1 0 ScheduledStationAETitle = 0x00400001, // AE M1TN 0 ScheduledProcedureStepStartDate = 0x00400002, // DA M1 0 ScheduledProcedureStepStartTime = 0x00400003, // TM M1 0 ScheduledProcedureStepEndDate = 0x00400004, // DA M1 0 ScheduledProcedureStepEndTime = 0x00400005, // TM M1 0 ScheduledPerformingPhysicianName = 0x00400006, // PN M1 0 ScheduledProcedureStepDescription = 0x00400007, // LO M1 0 ScheduledProtocolCodeSequence = 0x00400008, // SQ M1 0 ScheduledProcedureStepID = 0x00400009, // SH M1 0 StageCodeSequence = 0x0040000A, // SQ M1 0 ScheduledPerformingPhysicianIdentificationSequence = 0x0040000B, // SQ M1 0 ScheduledStationName = 0x00400010, // SH M1TN 0 ScheduledProcedureStepLocation = 0x00400011, // SH M1 0 PreMedication = 0x00400012, // LO M1 0 ScheduledProcedureStepStatus = 0x00400020, // CS M1 0 OrderPlacerIdentifierSequence = 0x00400026, // SQ M1 0 OrderFillerIdentifierSequence = 0x00400027, // SQ M1 0 LocalNamespaceEntityID = 0x00400031, // UT M1 0 UniversalEntityID = 0x00400032, // UT M1 0 UniversalEntityIDType = 0x00400033, // CS M1 0 IdentifierTypeCode = 0x00400035, // CS M1 0 AssigningFacilitySequence = 0x00400036, // SQ M1 0 AssigningJurisdictionCodeSequence = 0x00400039, // SQ M1 0 AssigningAgencyOrDepartmentCodeSequence = 0x0040003A, // SQ M1 0 ScheduledProcedureStepSequence = 0x00400100, // SQ M1 0 ReferencedNonImageCompositeSOPInstanceSequence = 0x00400220, // SQ M1 0 PerformedStationAETitle = 0x00400241, // AE M1 0 PerformedStationName = 0x00400242, // SH M1 0 PerformedLocation = 0x00400243, // SH M1 0 PerformedProcedureStepStartDate = 0x00400244, // DA M1 0 PerformedProcedureStepStartTime = 0x00400245, // TM M1 0 PerformedProcedureStepEndDate = 0x00400250, // DA M1 0 PerformedProcedureStepEndTime = 0x00400251, // TM M1 0 PerformedProcedureStepStatus = 0x00400252, // CS M1 0 PerformedProcedureStepID = 0x00400253, // SH M1 0 PerformedProcedureStepDescription = 0x00400254, // LO M1 0 PerformedProcedureTypeDescription = 0x00400255, // LO M1 0 PerformedProtocolCodeSequence = 0x00400260, // SQ M1 0 PerformedProtocolType = 0x00400261, // CS M1 0 ScheduledStepAttributesSequence = 0x00400270, // SQ M1 0 RequestAttributesSequence = 0x00400275, // SQ M1 0 CommentsOnThePerformedProcedureStep = 0x00400280, // ST M1 0 PerformedProcedureStepDiscontinuationReasonCodeSequence = 0x00400281, // SQ M1 0 QuantitySequence = 0x00400293, // SQ M1 0 Quantity = 0x00400294, // DS M1 0 MeasuringUnitsSequence = 0x00400295, // SQ M1 0 BillingItemSequence = 0x00400296, // SQ M1 0 TotalTimeOfFluoroscopy = 0x00400300, // US M1 1 TotalNumberOfExposures = 0x00400301, // US M1 1 EntranceDose = 0x00400302, // US M1 0 ExposedArea = 0x00400303, // US M1T2 0 DistanceSourceToEntrance = 0x00400306, // DS M1 0 DistanceSourceToSupport = 0x00400307, // DS M1 1 ExposureDoseSequence = 0x0040030E, // SQ M1 1 CommentsOnRadiationDose = 0x00400310, // ST M1 0 XRayOutput = 0x00400312, // DS M1 0 HalfValueLayer = 0x00400314, // DS M1 0 OrganDose = 0x00400316, // DS M1 0 OrganExposed = 0x00400318, // CS M1 0 BillingProcedureStepSequence = 0x00400320, // SQ M1 0 FilmConsumptionSequence = 0x00400321, // SQ M1 0 BillingSuppliesAndDevicesSequence = 0x00400324, // SQ M1 0 ReferencedProcedureStepSequence = 0x00400330, // SQ M1 1 PerformedSeriesSequence = 0x00400340, // SQ M1 0 CommentsOnTheScheduledProcedureStep = 0x00400400, // LT M1 0 ProtocolContextSequence = 0x00400440, // SQ M1 0 ContentItemModifierSequence = 0x00400441, // SQ M1 0 ScheduledSpecimenSequence = 0x00400500, // SQ M1 0 SpecimenAccessionNumber = 0x0040050A, // LO M1 1 ContainerIdentifier = 0x00400512, // LO M1 0 IssuerOfTheContainerIdentifierSequence = 0x00400513, // SQ M1 0 AlternateContainerIdentifierSequence = 0x00400515, // SQ M1 0 ContainerTypeCodeSequence = 0x00400518, // SQ M1 0 ContainerDescription = 0x0040051A, // LO M1 0 ContainerComponentSequence = 0x00400520, // SQ M1 0 SpecimenSequence = 0x00400550, // SQ M1 1 SpecimenIdentifier = 0x00400551, // LO M1 0 SpecimenDescriptionSequenceTrial = 0x00400552, // SQ M1 1 SpecimenDescriptionTrial = 0x00400553, // ST M1 1 SpecimenUID = 0x00400554, // UI M1 0 AcquisitionContextSequence = 0x00400555, // SQ M1 0 AcquisitionContextDescription = 0x00400556, // ST M1 0 SpecimenTypeCodeSequence = 0x0040059A, // SQ M1 0 SpecimenDescriptionSequence = 0x00400560, // SQ M1 0 IssuerOfTheSpecimenIdentifierSequence = 0x00400562, // SQ M1 0 SpecimenShortDescription = 0x00400600, // LO M1 0 SpecimenDetailedDescription = 0x00400602, // UT M1 0 SpecimenPreparationSequence = 0x00400610, // SQ M1 0 SpecimenPreparationStepContentItemSequence = 0x00400612, // SQ M1 0 SpecimenLocalizationContentItemSequence = 0x00400620, // SQ M1 0 SlideIdentifier = 0x004006FA, // LO M1 1 WholeSlideMicroscopyImageFrameTypeSequence = 0x00400710, // SQ M1 0 ImageCenterPointCoordinatesSequence = 0x0040071A, // SQ M1 0 XOffsetInSlideCoordinateSystem = 0x0040072A, // DS M1 0 YOffsetInSlideCoordinateSystem = 0x0040073A, // DS M1 0 ZOffsetInSlideCoordinateSystem = 0x0040074A, // DS M1 0 PixelSpacingSequence = 0x004008D8, // SQ M1 1 CoordinateSystemAxisCodeSequence = 0x004008DA, // SQ M1 1 MeasurementUnitsCodeSequence = 0x004008EA, // SQ M1 0 VitalStainCodeSequenceTrial = 0x004009F8, // SQ M1 1 RequestedProcedureID = 0x00401001, // SH M1 0 ReasonForTheRequestedProcedure = 0x00401002, // LO M1 0 RequestedProcedurePriority = 0x00401003, // SH M1 0 PatientTransportArrangements = 0x00401004, // LO M1 0 RequestedProcedureLocation = 0x00401005, // LO M1 0 PlacerOrderNumberProcedure = 0x00401006, // SH M1 1 FillerOrderNumberProcedure = 0x00401007, // SH M1 1 ConfidentialityCode = 0x00401008, // LO M1 0 ReportingPriority = 0x00401009, // SH M1 0 ReasonForRequestedProcedureCodeSequence = 0x0040100A, // SQ M1 0 NamesOfIntendedRecipientsOfResults = 0x00401010, // PN M1TN 0 IntendedRecipientsOfResultsIdentificationSequence = 0x00401011, // SQ M1 0 ReasonForPerformedProcedureCodeSequence = 0x00401012, // SQ M1 0 RequestedProcedureDescriptionTrial = 0x00401060, // LO M1 1 PersonIdentificationCodeSequence = 0x00401101, // SQ M1 0 PersonAddress = 0x00401102, // ST M1 0 PersonTelephoneNumbers = 0x00401103, // LO M1TN 0 PersonTelecomInformation = 0x00401104, // LT M1 0 RequestedProcedureComments = 0x00401400, // LT M1 0 ReasonForTheImagingServiceRequest = 0x00402001, // LO M1 1 IssueDateOfImagingServiceRequest = 0x00402004, // DA M1 0 IssueTimeOfImagingServiceRequest = 0x00402005, // TM M1 0 PlacerOrderNumberImagingServiceRequestRetired = 0x00402006, // SH M1 1 FillerOrderNumberImagingServiceRequestRetired = 0x00402007, // SH M1 1 OrderEnteredBy = 0x00402008, // PN M1 0 OrderEntererLocation = 0x00402009, // SH M1 0 OrderCallbackPhoneNumber = 0x00402010, // SH M1 0 OrderCallbackTelecomInformation = 0x00402011, // LT M1 0 PlacerOrderNumberImagingServiceRequest = 0x00402016, // LO M1 0 FillerOrderNumberImagingServiceRequest = 0x00402017, // LO M1 0 ImagingServiceRequestComments = 0x00402400, // LT M1 0 ConfidentialityConstraintOnPatientDataDescription = 0x00403001, // LO M1 0 GeneralPurposeScheduledProcedureStepStatus = 0x00404001, // CS M1 1 GeneralPurposePerformedProcedureStepStatus = 0x00404002, // CS M1 1 GeneralPurposeScheduledProcedureStepPriority = 0x00404003, // CS M1 1 ScheduledProcessingApplicationsCodeSequence = 0x00404004, // SQ M1 1 ScheduledProcedureStepStartDateTime = 0x00404005, // DT M1 0 MultipleCopiesFlag = 0x00404006, // CS M1 1 PerformedProcessingApplicationsCodeSequence = 0x00404007, // SQ M1 1 ScheduledProcedureStepExpirationDateTime = 0x00404008, // DT M1 0 HumanPerformerCodeSequence = 0x00404009, // SQ M1 0 ScheduledProcedureStepModificationDateTime = 0x00404010, // DT M1 0 ExpectedCompletionDateTime = 0x00404011, // DT M1 0 ResultingGeneralPurposePerformedProcedureStepsSequence = 0x00404015, // SQ M1 1 ReferencedGeneralPurposeScheduledProcedureStepSequence = 0x00404016, // SQ M1 1 ScheduledWorkitemCodeSequence = 0x00404018, // SQ M1 0 PerformedWorkitemCodeSequence = 0x00404019, // SQ M1 0 InputAvailabilityFlag = 0x00404020, // CS M1 1 InputInformationSequence = 0x00404021, // SQ M1 0 RelevantInformationSequence = 0x00404022, // SQ M1 1 ReferencedGeneralPurposeScheduledProcedureStepTransactionUID = 0x00404023, // UI M1 1 ScheduledStationNameCodeSequence = 0x00404025, // SQ M1 0 ScheduledStationClassCodeSequence = 0x00404026, // SQ M1 0 ScheduledStationGeographicLocationCodeSequence = 0x00404027, // SQ M1 0 PerformedStationNameCodeSequence = 0x00404028, // SQ M1 0 PerformedStationClassCodeSequence = 0x00404029, // SQ M1 0 PerformedStationGeographicLocationCodeSequence = 0x00404030, // SQ M1 0 RequestedSubsequentWorkitemCodeSequence = 0x00404031, // SQ M1 1 NonDICOMOutputCodeSequence = 0x00404032, // SQ M1 1 OutputInformationSequence = 0x00404033, // SQ M1 0 ScheduledHumanPerformersSequence = 0x00404034, // SQ M1 0 ActualHumanPerformersSequence = 0x00404035, // SQ M1 0 HumanPerformerOrganization = 0x00404036, // LO M1 0 HumanPerformerName = 0x00404037, // PN M1 0 RawDataHandling = 0x00404040, // CS M1 0 InputReadinessState = 0x00404041, // CS M1 0 PerformedProcedureStepStartDateTime = 0x00404050, // DT M1 0 PerformedProcedureStepEndDateTime = 0x00404051, // DT M1 0 ProcedureStepCancellationDateTime = 0x00404052, // DT M1 0 OutputDestinationSequence = 0x00404070, // SQ M1 0 DICOMStorageSequence = 0x00404071, // SQ M1 0 STOWRSStorageSequence = 0x00404072, // SQ M1 0 StorageURL = 0x00404073, // UR M1 0 XDSStorageSequence = 0x00404074, // SQ M1 0 EntranceDoseInmGy = 0x00408302, // DS M1 0 EntranceDoseDerivation = 0x00408303, // CS M1 0 ParametricMapFrameTypeSequence = 0x00409092, // SQ M1 0 ReferencedImageRealWorldValueMappingSequence = 0x00409094, // SQ M1 0 RealWorldValueMappingSequence = 0x00409096, // SQ M1 0 PixelValueMappingCodeSequence = 0x00409098, // SQ M1 0 LUTLabel = 0x00409210, // SH M1 0 RealWorldValueLastValueMapped = 0x00409211, // XS M1 0 RealWorldValueLUTData = 0x00409212, // FD M1TN 0 DoubleFloatRealWorldValueLastValueMapped = 0x00409213, // FD M1 0 DoubleFloatRealWorldValueFirstValueMapped = 0x00409214, // FD M1 0 RealWorldValueFirstValueMapped = 0x00409216, // XS M1 0 QuantityDefinitionSequence = 0x00409220, // SQ M1 0 RealWorldValueIntercept = 0x00409224, // FD M1 0 RealWorldValueSlope = 0x00409225, // FD M1 0 FindingsFlagTrial = 0x0040A007, // CS M1 1 RelationshipType = 0x0040A010, // CS M1 0 FindingsSequenceTrial = 0x0040A020, // SQ M1 1 FindingsGroupUIDTrial = 0x0040A021, // UI M1 1 ReferencedFindingsGroupUIDTrial = 0x0040A022, // UI M1 1 FindingsGroupRecordingDateTrial = 0x0040A023, // DA M1 1 FindingsGroupRecordingTimeTrial = 0x0040A024, // TM M1 1 FindingsSourceCategoryCodeSequenceTrial = 0x0040A026, // SQ M1 1 VerifyingOrganization = 0x0040A027, // LO M1 0 DocumentingOrganizationIdentifierCodeSequenceTrial = 0x0040A028, // SQ M1 1 VerificationDateTime = 0x0040A030, // DT M1 0 ObservationDateTime = 0x0040A032, // DT M1 0 ValueType = 0x0040A040, // CS M1 0 ConceptNameCodeSequence = 0x0040A043, // SQ M1 0 MeasurementPrecisionDescriptionTrial = 0x0040A047, // LO M1 1 ContinuityOfContent = 0x0040A050, // CS M1 0 UrgencyOrPriorityAlertsTrial = 0x0040A057, // CS M1TN 1 SequencingIndicatorTrial = 0x0040A060, // LO M1 1 DocumentIdentifierCodeSequenceTrial = 0x0040A066, // SQ M1 1 DocumentAuthorTrial = 0x0040A067, // PN M1 1 DocumentAuthorIdentifierCodeSequenceTrial = 0x0040A068, // SQ M1 1 IdentifierCodeSequenceTrial = 0x0040A070, // SQ M1 1 VerifyingObserverSequence = 0x0040A073, // SQ M1 0 ObjectBinaryIdentifierTrial = 0x0040A074, // OB M1 1 VerifyingObserverName = 0x0040A075, // PN M1 0 DocumentingObserverIdentifierCodeSequenceTrial = 0x0040A076, // SQ M1 1 AuthorObserverSequence = 0x0040A078, // SQ M1 0 ParticipantSequence = 0x0040A07A, // SQ M1 0 CustodialOrganizationSequence = 0x0040A07C, // SQ M1 0 ParticipationType = 0x0040A080, // CS M1 0 ParticipationDateTime = 0x0040A082, // DT M1 0 ObserverType = 0x0040A084, // CS M1 0 ProcedureIdentifierCodeSequenceTrial = 0x0040A085, // SQ M1 1 VerifyingObserverIdentificationCodeSequence = 0x0040A088, // SQ M1 0 ObjectDirectoryBinaryIdentifierTrial = 0x0040A089, // OB M1 1 EquivalentCDADocumentSequence = 0x0040A090, // SQ M1 1 ReferencedWaveformChannels = 0x0040A0B0, // US M2T2N 0 DateOfDocumentOrVerbalTransactionTrial = 0x0040A110, // DA M1 1 TimeOfDocumentCreationOrVerbalTransactionTrial = 0x0040A112, // TM M1 1 DateTime = 0x0040A120, // DT M1 0 Date = 0x0040A121, // DA M1 0 Time = 0x0040A122, // TM M1 0 PersonName = 0x0040A123, // PN M1 0 UID = 0x0040A124, // UI M1 0 ReportStatusIDTrial = 0x0040A125, // CS M2 1 TemporalRangeType = 0x0040A130, // CS M1 0 ReferencedSamplePositions = 0x0040A132, // UL M1TN 0 ReferencedFrameNumbers = 0x0040A136, // US M1TN 1 ReferencedTimeOffsets = 0x0040A138, // DS M1TN 0 ReferencedDateTime = 0x0040A13A, // DT M1TN 0 TextValue = 0x0040A160, // UT M1 0 FloatingPointValue = 0x0040A161, // FD M1TN 0 RationalNumeratorValue = 0x0040A162, // SL M1TN 0 RationalDenominatorValue = 0x0040A163, // UL M1TN 0 ObservationCategoryCodeSequenceTrial = 0x0040A167, // SQ M1 1 ConceptCodeSequence = 0x0040A168, // SQ M1 0 BibliographicCitationTrial = 0x0040A16A, // ST M1 1 PurposeOfReferenceCodeSequence = 0x0040A170, // SQ M1 0 ObservationUID = 0x0040A171, // UI M1 0 ReferencedObservationUIDTrial = 0x0040A172, // UI M1 1 ReferencedObservationClassTrial = 0x0040A173, // CS M1 1 ReferencedObjectObservationClassTrial = 0x0040A174, // CS M1 1 AnnotationGroupNumber = 0x0040A180, // US M1 0 ObservationDateTrial = 0x0040A192, // DA M1 1 ObservationTimeTrial = 0x0040A193, // TM M1 1 MeasurementAutomationTrial = 0x0040A194, // CS M1 1 ModifierCodeSequence = 0x0040A195, // SQ M1 0 IdentificationDescriptionTrial = 0x0040A224, // ST M1 1 CoordinatesSetGeometricTypeTrial = 0x0040A290, // CS M1 1 AlgorithmCodeSequenceTrial = 0x0040A296, // SQ M1 1 AlgorithmDescriptionTrial = 0x0040A297, // ST M1 1 PixelCoordinatesSetTrial = 0x0040A29A, // SL M2T2N 1 MeasuredValueSequence = 0x0040A300, // SQ M1 0 NumericValueQualifierCodeSequence = 0x0040A301, // SQ M1 0 CurrentObserverTrial = 0x0040A307, // PN M1 1 NumericValue = 0x0040A30A, // DS M1TN 0 ReferencedAccessionSequenceTrial = 0x0040A313, // SQ M1 1 ReportStatusCommentTrial = 0x0040A33A, // ST M1 1 ProcedureContextSequenceTrial = 0x0040A340, // SQ M1 1 VerbalSourceTrial = 0x0040A352, // PN M1 1 AddressTrial = 0x0040A353, // ST M1 1 TelephoneNumberTrial = 0x0040A354, // LO M1 1 VerbalSourceIdentifierCodeSequenceTrial = 0x0040A358, // SQ M1 1 PredecessorDocumentsSequence = 0x0040A360, // SQ M1 0 ReferencedRequestSequence = 0x0040A370, // SQ M1 0 PerformedProcedureCodeSequence = 0x0040A372, // SQ M1 0 CurrentRequestedProcedureEvidenceSequence = 0x0040A375, // SQ M1 0 ReportDetailSequenceTrial = 0x0040A380, // SQ M1 1 PertinentOtherEvidenceSequence = 0x0040A385, // SQ M1 0 HL7StructuredDocumentReferenceSequence = 0x0040A390, // SQ M1 0 ObservationSubjectUIDTrial = 0x0040A402, // UI M1 1 ObservationSubjectClassTrial = 0x0040A403, // CS M1 1 ObservationSubjectTypeCodeSequenceTrial = 0x0040A404, // SQ M1 1 CompletionFlag = 0x0040A491, // CS M1 0 CompletionFlagDescription = 0x0040A492, // LO M1 0 VerificationFlag = 0x0040A493, // CS M1 0 ArchiveRequested = 0x0040A494, // CS M1 0 PreliminaryFlag = 0x0040A496, // CS M1 0 ContentTemplateSequence = 0x0040A504, // SQ M1 0 IdenticalDocumentsSequence = 0x0040A525, // SQ M1 0 ObservationSubjectContextFlagTrial = 0x0040A600, // CS M1 1 ObserverContextFlagTrial = 0x0040A601, // CS M1 1 ProcedureContextFlagTrial = 0x0040A603, // CS M1 1 ContentSequence = 0x0040A730, // SQ M1 0 RelationshipSequenceTrial = 0x0040A731, // SQ M1 1 RelationshipTypeCodeSequenceTrial = 0x0040A732, // SQ M1 1 LanguageCodeSequenceTrial = 0x0040A744, // SQ M1 1 UniformResourceLocatorTrial = 0x0040A992, // ST M1 1 WaveformAnnotationSequence = 0x0040B020, // SQ M1 0 TemplateIdentifier = 0x0040DB00, // CS M1 0 TemplateVersion = 0x0040DB06, // DT M1 1 TemplateLocalVersion = 0x0040DB07, // DT M1 1 TemplateExtensionFlag = 0x0040DB0B, // CS M1 1 TemplateExtensionOrganizationUID = 0x0040DB0C, // UI M1 1 TemplateExtensionCreatorUID = 0x0040DB0D, // UI M1 1 ReferencedContentItemIdentifier = 0x0040DB73, // UL M1TN 0 HL7InstanceIdentifier = 0x0040E001, // ST M1 0 HL7DocumentEffectiveTime = 0x0040E004, // DT M1 0 HL7DocumentTypeCodeSequence = 0x0040E006, // SQ M1 0 DocumentClassCodeSequence = 0x0040E008, // SQ M1 0 RetrieveURI = 0x0040E010, // UR M1 0 RetrieveLocationUID = 0x0040E011, // UI M1 0 TypeOfInstances = 0x0040E020, // CS M1 0 DICOMRetrievalSequence = 0x0040E021, // SQ M1 0 DICOMMediaRetrievalSequence = 0x0040E022, // SQ M1 0 WADORetrievalSequence = 0x0040E023, // SQ M1 0 XDSRetrievalSequence = 0x0040E024, // SQ M1 0 WADORSRetrievalSequence = 0x0040E025, // SQ M1 0 RepositoryUniqueID = 0x0040E030, // UI M1 0 HomeCommunityID = 0x0040E031, // UI M1 0 DocumentTitle = 0x00420010, // ST M1 0 EncapsulatedDocument = 0x00420011, // OB M1 0 MIMETypeOfEncapsulatedDocument = 0x00420012, // LO M1 0 SourceInstanceSequence = 0x00420013, // SQ M1 0 ListOfMIMETypes = 0x00420014, // LO M1TN 0 EncapsulatedDocumentLength = 0x00420015, // UL M1 0 ProductPackageIdentifier = 0x00440001, // ST M1 0 SubstanceAdministrationApproval = 0x00440002, // CS M1 0 ApprovalStatusFurtherDescription = 0x00440003, // LT M1 0 ApprovalStatusDateTime = 0x00440004, // DT M1 0 ProductTypeCodeSequence = 0x00440007, // SQ M1 0 ProductName = 0x00440008, // LO M1TN 0 ProductDescription = 0x00440009, // LT M1 0 ProductLotIdentifier = 0x0044000A, // LO M1 0 ProductExpirationDateTime = 0x0044000B, // DT M1 0 SubstanceAdministrationDateTime = 0x00440010, // DT M1 0 SubstanceAdministrationNotes = 0x00440011, // LO M1 0 SubstanceAdministrationDeviceID = 0x00440012, // LO M1 0 ProductParameterSequence = 0x00440013, // SQ M1 0 SubstanceAdministrationParameterSequence = 0x00440019, // SQ M1 0 ApprovalSequence = 0x00440100, // SQ M1 0 AssertionCodeSequence = 0x00440101, // SQ M1 0 AssertionUID = 0x00440102, // UI M1 0 AsserterIdentificationSequence = 0x00440103, // SQ M1 0 AssertionDateTime = 0x00440104, // DT M1 0 AssertionExpirationDateTime = 0x00440105, // DT M1 0 AssertionComments = 0x00440106, // UT M1 0 RelatedAssertionSequence = 0x00440107, // SQ M1 0 ReferencedAssertionUID = 0x00440108, // UI M1 0 ApprovalSubjectSequence = 0x00440109, // SQ M1 0 OrganizationalRoleCodeSequence = 0x0044010A, // SQ M1 0 LensDescription = 0x00460012, // LO M1 0 RightLensSequence = 0x00460014, // SQ M1 0 LeftLensSequence = 0x00460015, // SQ M1 0 UnspecifiedLateralityLensSequence = 0x00460016, // SQ M1 0 CylinderSequence = 0x00460018, // SQ M1 0 PrismSequence = 0x00460028, // SQ M1 0 HorizontalPrismPower = 0x00460030, // FD M1 0 HorizontalPrismBase = 0x00460032, // CS M1 0 VerticalPrismPower = 0x00460034, // FD M1 0 VerticalPrismBase = 0x00460036, // CS M1 0 LensSegmentType = 0x00460038, // CS M1 0 OpticalTransmittance = 0x00460040, // FD M1 0 ChannelWidth = 0x00460042, // FD M1 0 PupilSize = 0x00460044, // FD M1 0 CornealSize = 0x00460046, // FD M1 0 CornealSizeSequence = 0x00460047, // SQ M1 0 AutorefractionRightEyeSequence = 0x00460050, // SQ M1 0 AutorefractionLeftEyeSequence = 0x00460052, // SQ M1 0 DistancePupillaryDistance = 0x00460060, // FD M1 0 NearPupillaryDistance = 0x00460062, // FD M1 0 IntermediatePupillaryDistance = 0x00460063, // FD M1 0 OtherPupillaryDistance = 0x00460064, // FD M1 0 KeratometryRightEyeSequence = 0x00460070, // SQ M1 0 KeratometryLeftEyeSequence = 0x00460071, // SQ M1 0 SteepKeratometricAxisSequence = 0x00460074, // SQ M1 0 RadiusOfCurvature = 0x00460075, // FD M1 0 KeratometricPower = 0x00460076, // FD M1 0 KeratometricAxis = 0x00460077, // FD M1 0 FlatKeratometricAxisSequence = 0x00460080, // SQ M1 0 BackgroundColor = 0x00460092, // CS M1 0 Optotype = 0x00460094, // CS M1 0 OptotypePresentation = 0x00460095, // CS M1 0 SubjectiveRefractionRightEyeSequence = 0x00460097, // SQ M1 0 SubjectiveRefractionLeftEyeSequence = 0x00460098, // SQ M1 0 AddNearSequence = 0x00460100, // SQ M1 0 AddIntermediateSequence = 0x00460101, // SQ M1 0 AddOtherSequence = 0x00460102, // SQ M1 0 AddPower = 0x00460104, // FD M1 0 ViewingDistance = 0x00460106, // FD M1 0 CorneaMeasurementsSequence = 0x00460110, // SQ M1 0 SourceOfCorneaMeasurementDataCodeSequence = 0x00460111, // SQ M1 0 SteepCornealAxisSequence = 0x00460112, // SQ M1 0 FlatCornealAxisSequence = 0x00460113, // SQ M1 0 CornealPower = 0x00460114, // FD M1 0 CornealAxis = 0x00460115, // FD M1 0 CorneaMeasurementMethodCodeSequence = 0x00460116, // SQ M1 0 RefractiveIndexOfCornea = 0x00460117, // FL M1 0 RefractiveIndexOfAqueousHumor = 0x00460118, // FL M1 0 VisualAcuityTypeCodeSequence = 0x00460121, // SQ M1 0 VisualAcuityRightEyeSequence = 0x00460122, // SQ M1 0 VisualAcuityLeftEyeSequence = 0x00460123, // SQ M1 0 VisualAcuityBothEyesOpenSequence = 0x00460124, // SQ M1 0 ViewingDistanceType = 0x00460125, // CS M1 0 VisualAcuityModifiers = 0x00460135, // SS M2 0 DecimalVisualAcuity = 0x00460137, // FD M1 0 OptotypeDetailedDefinition = 0x00460139, // LO M1 0 ReferencedRefractiveMeasurementsSequence = 0x00460145, // SQ M1 0 SpherePower = 0x00460146, // FD M1 0 CylinderPower = 0x00460147, // FD M1 0 CornealTopographySurface = 0x00460201, // CS M1 0 CornealVertexLocation = 0x00460202, // FL M2 0 PupilCentroidXCoordinate = 0x00460203, // FL M1 0 PupilCentroidYCoordinate = 0x00460204, // FL M1 0 EquivalentPupilRadius = 0x00460205, // FL M1 0 CornealTopographyMapTypeCodeSequence = 0x00460207, // SQ M1 0 VerticesOfTheOutlineOfPupil = 0x00460208, // IS M2T2N 0 CornealTopographyMappingNormalsSequence = 0x00460210, // SQ M1 0 MaximumCornealCurvatureSequence = 0x00460211, // SQ M1 0 MaximumCornealCurvature = 0x00460212, // FL M1 0 MaximumCornealCurvatureLocation = 0x00460213, // FL M2 0 MinimumKeratometricSequence = 0x00460215, // SQ M1 0 SimulatedKeratometricCylinderSequence = 0x00460218, // SQ M1 0 AverageCornealPower = 0x00460220, // FL M1 0 CornealISValue = 0x00460224, // FL M1 0 AnalyzedArea = 0x00460227, // FL M1 0 SurfaceRegularityIndex = 0x00460230, // FL M1 0 SurfaceAsymmetryIndex = 0x00460232, // FL M1 0 CornealEccentricityIndex = 0x00460234, // FL M1 0 KeratoconusPredictionIndex = 0x00460236, // FL M1 0 DecimalPotentialVisualAcuity = 0x00460238, // FL M1 0 CornealTopographyMapQualityEvaluation = 0x00460242, // CS M1 0 SourceImageCornealProcessedDataSequence = 0x00460244, // SQ M1 0 CornealPointLocation = 0x00460247, // FL M3 0 CornealPointEstimated = 0x00460248, // CS M1 0 AxialPower = 0x00460249, // FL M1 0 TangentialPower = 0x00460250, // FL M1 0 RefractivePower = 0x00460251, // FL M1 0 RelativeElevation = 0x00460252, // FL M1 0 CornealWavefront = 0x00460253, // FL M1 0 ImagedVolumeWidth = 0x00480001, // FL M1 0 ImagedVolumeHeight = 0x00480002, // FL M1 0 ImagedVolumeDepth = 0x00480003, // FL M1 0 TotalPixelMatrixColumns = 0x00480006, // UL M1 0 TotalPixelMatrixRows = 0x00480007, // UL M1 0 TotalPixelMatrixOriginSequence = 0x00480008, // SQ M1 0 SpecimenLabelInImage = 0x00480010, // CS M1 0 FocusMethod = 0x00480011, // CS M1 0 ExtendedDepthOfField = 0x00480012, // CS M1 0 NumberOfFocalPlanes = 0x00480013, // US M1 0 DistanceBetweenFocalPlanes = 0x00480014, // FL M1 0 RecommendedAbsentPixelCIELabValue = 0x00480015, // US M3 0 IlluminatorTypeCodeSequence = 0x00480100, // SQ M1 0 ImageOrientationSlide = 0x00480102, // DS M6 0 OpticalPathSequence = 0x00480105, // SQ M1 0 OpticalPathIdentifier = 0x00480106, // SH M1 0 OpticalPathDescription = 0x00480107, // ST M1 0 IlluminationColorCodeSequence = 0x00480108, // SQ M1 0 SpecimenReferenceSequence = 0x00480110, // SQ M1 0 CondenserLensPower = 0x00480111, // DS M1 0 ObjectiveLensPower = 0x00480112, // DS M1 0 ObjectiveLensNumericalAperture = 0x00480113, // DS M1 0 PaletteColorLookupTableSequence = 0x00480120, // SQ M1 0 ReferencedImageNavigationSequence = 0x00480200, // SQ M1 0 TopLeftHandCornerOfLocalizerArea = 0x00480201, // US M2 0 BottomRightHandCornerOfLocalizerArea = 0x00480202, // US M2 0 OpticalPathIdentificationSequence = 0x00480207, // SQ M1 0 PlanePositionSlideSequence = 0x0048021A, // SQ M1 0 ColumnPositionInTotalImagePixelMatrix = 0x0048021E, // SL M1 0 RowPositionInTotalImagePixelMatrix = 0x0048021F, // SL M1 0 PixelOriginInterpretation = 0x00480301, // CS M1 0 NumberOfOpticalPaths = 0x00480302, // UL M1 0 TotalPixelMatrixFocalPlanes = 0x00480303, // UL M1 0 CalibrationImage = 0x00500004, // CS M1 0 DeviceSequence = 0x00500010, // SQ M1 0 ContainerComponentTypeCodeSequence = 0x00500012, // SQ M1 0 ContainerComponentThickness = 0x00500013, // FD M1 0 DeviceLength = 0x00500014, // DS M1 0 ContainerComponentWidth = 0x00500015, // FD M1 0 DeviceDiameter = 0x00500016, // DS M1 0 DeviceDiameterUnits = 0x00500017, // CS M1 0 DeviceVolume = 0x00500018, // DS M1 0 InterMarkerDistance = 0x00500019, // DS M1 0 ContainerComponentMaterial = 0x0050001A, // CS M1 0 ContainerComponentID = 0x0050001B, // LO M1 0 ContainerComponentLength = 0x0050001C, // FD M1 0 ContainerComponentDiameter = 0x0050001D, // FD M1 0 ContainerComponentDescription = 0x0050001E, // LO M1 0 DeviceDescription = 0x00500020, // LO M1 0 LongDeviceDescription = 0x00500021, // ST M1 0 ContrastBolusIngredientPercentByVolume = 0x00520001, // FL M1 0 OCTFocalDistance = 0x00520002, // FD M1 0 BeamSpotSize = 0x00520003, // FD M1 0 EffectiveRefractiveIndex = 0x00520004, // FD M1 0 OCTAcquisitionDomain = 0x00520006, // CS M1 0 OCTOpticalCenterWavelength = 0x00520007, // FD M1 0 AxialResolution = 0x00520008, // FD M1 0 RangingDepth = 0x00520009, // FD M1 0 ALineRate = 0x00520011, // FD M1 0 ALinesPerFrame = 0x00520012, // US M1 0 CatheterRotationalRate = 0x00520013, // FD M1 0 ALinePixelSpacing = 0x00520014, // FD M1 0 ModeOfPercutaneousAccessSequence = 0x00520016, // SQ M1 0 IntravascularOCTFrameTypeSequence = 0x00520025, // SQ M1 0 OCTZOffsetApplied = 0x00520026, // CS M1 0 IntravascularFrameContentSequence = 0x00520027, // SQ M1 0 IntravascularLongitudinalDistance = 0x00520028, // FD M1 0 IntravascularOCTFrameContentSequence = 0x00520029, // SQ M1 0 OCTZOffsetCorrection = 0x00520030, // SS M1 0 CatheterDirectionOfRotation = 0x00520031, // CS M1 0 SeamLineLocation = 0x00520033, // FD M1 0 FirstALineLocation = 0x00520034, // FD M1 0 SeamLineIndex = 0x00520036, // US M1 0 NumberOfPaddedALines = 0x00520038, // US M1 0 InterpolationType = 0x00520039, // CS M1 0 RefractiveIndexApplied = 0x0052003A, // CS M1 0 EnergyWindowVector = 0x00540010, // US M1TN 0 NumberOfEnergyWindows = 0x00540011, // US M1 0 EnergyWindowInformationSequence = 0x00540012, // SQ M1 0 EnergyWindowRangeSequence = 0x00540013, // SQ M1 0 EnergyWindowLowerLimit = 0x00540014, // DS M1 0 EnergyWindowUpperLimit = 0x00540015, // DS M1 0 RadiopharmaceuticalInformationSequence = 0x00540016, // SQ M1 0 ResidualSyringeCounts = 0x00540017, // IS M1 0 EnergyWindowName = 0x00540018, // SH M1 0 DetectorVector = 0x00540020, // US M1TN 0 NumberOfDetectors = 0x00540021, // US M1 0 DetectorInformationSequence = 0x00540022, // SQ M1 0 PhaseVector = 0x00540030, // US M1TN 0 NumberOfPhases = 0x00540031, // US M1 0 PhaseInformationSequence = 0x00540032, // SQ M1 0 NumberOfFramesInPhase = 0x00540033, // US M1 0 PhaseDelay = 0x00540036, // IS M1 0 PauseBetweenFrames = 0x00540038, // IS M1 0 PhaseDescription = 0x00540039, // CS M1 0 RotationVector = 0x00540050, // US M1TN 0 NumberOfRotations = 0x00540051, // US M1 0 RotationInformationSequence = 0x00540052, // SQ M1 0 NumberOfFramesInRotation = 0x00540053, // US M1 0 RRIntervalVector = 0x00540060, // US M1TN 0 NumberOfRRIntervals = 0x00540061, // US M1 0 GatedInformationSequence = 0x00540062, // SQ M1 0 DataInformationSequence = 0x00540063, // SQ M1 0 TimeSlotVector = 0x00540070, // US M1TN 0 NumberOfTimeSlots = 0x00540071, // US M1 0 TimeSlotInformationSequence = 0x00540072, // SQ M1 0 TimeSlotTime = 0x00540073, // DS M1 0 SliceVector = 0x00540080, // US M1TN 0 NumberOfSlices = 0x00540081, // US M1 0 AngularViewVector = 0x00540090, // US M1TN 0 TimeSliceVector = 0x00540100, // US M1TN 0 NumberOfTimeSlices = 0x00540101, // US M1 0 StartAngle = 0x00540200, // DS M1 0 TypeOfDetectorMotion = 0x00540202, // CS M1 0 TriggerVector = 0x00540210, // IS M1TN 0 NumberOfTriggersInPhase = 0x00540211, // US M1 0 ViewCodeSequence = 0x00540220, // SQ M1 0 ViewModifierCodeSequence = 0x00540222, // SQ M1 0 RadionuclideCodeSequence = 0x00540300, // SQ M1 0 AdministrationRouteCodeSequence = 0x00540302, // SQ M1 0 RadiopharmaceuticalCodeSequence = 0x00540304, // SQ M1 0 CalibrationDataSequence = 0x00540306, // SQ M1 0 EnergyWindowNumber = 0x00540308, // US M1 0 ImageID = 0x00540400, // SH M1 0 PatientOrientationCodeSequence = 0x00540410, // SQ M1 0 PatientOrientationModifierCodeSequence = 0x00540412, // SQ M1 0 PatientGantryRelationshipCodeSequence = 0x00540414, // SQ M1 0 SliceProgressionDirection = 0x00540500, // CS M1 0 ScanProgressionDirection = 0x00540501, // CS M1 0 SeriesType = 0x00541000, // CS M2 0 Units = 0x00541001, // CS M1 0 CountsSource = 0x00541002, // CS M1 0 ReprojectionMethod = 0x00541004, // CS M1 0 SUVType = 0x00541006, // CS M1 0 RandomsCorrectionMethod = 0x00541100, // CS M1 0 AttenuationCorrectionMethod = 0x00541101, // LO M1 0 DecayCorrection = 0x00541102, // CS M1 0 ReconstructionMethod = 0x00541103, // LO M1 0 DetectorLinesOfResponseUsed = 0x00541104, // LO M1 0 ScatterCorrectionMethod = 0x00541105, // LO M1 0 AxialAcceptance = 0x00541200, // DS M1 0 AxialMash = 0x00541201, // IS M2 0 TransverseMash = 0x00541202, // IS M1 0 DetectorElementSize = 0x00541203, // DS M2 0 CoincidenceWindowWidth = 0x00541210, // DS M1 0 SecondaryCountsType = 0x00541220, // CS M1TN 0 FrameReferenceTime = 0x00541300, // DS M1 0 PrimaryPromptsCountsAccumulated = 0x00541310, // IS M1 0 SecondaryCountsAccumulated = 0x00541311, // IS M1TN 0 SliceSensitivityFactor = 0x00541320, // DS M1 0 DecayFactor = 0x00541321, // DS M1 0 DoseCalibrationFactor = 0x00541322, // DS M1 0 ScatterFractionFactor = 0x00541323, // DS M1 0 DeadTimeFactor = 0x00541324, // DS M1 0 ImageIndex = 0x00541330, // US M1 0 CountsIncluded = 0x00541400, // CS M1TN 1 DeadTimeCorrectionFlag = 0x00541401, // CS M1 1 HistogramSequence = 0x00603000, // SQ M1 0 HistogramNumberOfBins = 0x00603002, // US M1 0 HistogramFirstBinValue = 0x00603004, // XS M1 0 HistogramLastBinValue = 0x00603006, // XS M1 0 HistogramBinWidth = 0x00603008, // US M1 0 HistogramExplanation = 0x00603010, // LO M1 0 HistogramData = 0x00603020, // UL M1TN 0 SegmentationType = 0x00620001, // CS M1 0 SegmentSequence = 0x00620002, // SQ M1 0 SegmentedPropertyCategoryCodeSequence = 0x00620003, // SQ M1 0 SegmentNumber = 0x00620004, // US M1 0 SegmentLabel = 0x00620005, // LO M1 0 SegmentDescription = 0x00620006, // ST M1 0 SegmentationAlgorithmIdentificationSequence = 0x00620007, // SQ M1 0 SegmentAlgorithmType = 0x00620008, // CS M1 0 SegmentAlgorithmName = 0x00620009, // LO M1 0 SegmentIdentificationSequence = 0x0062000A, // SQ M1 0 ReferencedSegmentNumber = 0x0062000B, // US M1TN 0 RecommendedDisplayGrayscaleValue = 0x0062000C, // US M1 0 RecommendedDisplayCIELabValue = 0x0062000D, // US M3 0 MaximumFractionalValue = 0x0062000E, // US M1 0 SegmentedPropertyTypeCodeSequence = 0x0062000F, // SQ M1 0 SegmentationFractionalType = 0x00620010, // CS M1 0 SegmentedPropertyTypeModifierCodeSequence = 0x00620011, // SQ M1 0 UsedSegmentsSequence = 0x00620012, // SQ M1 0 SegmentsOverlap = 0x00620013, // CS M1 0 TrackingID = 0x00620020, // UT M1 0 TrackingUID = 0x00620021, // UI M1 0 DeformableRegistrationSequence = 0x00640002, // SQ M1 0 SourceFrameOfReferenceUID = 0x00640003, // UI M1 0 DeformableRegistrationGridSequence = 0x00640005, // SQ M1 0 GridDimensions = 0x00640007, // UL M3 0 GridResolution = 0x00640008, // FD M3 0 VectorGridData = 0x00640009, // OF M1 0 PreDeformationMatrixRegistrationSequence = 0x0064000F, // SQ M1 0 PostDeformationMatrixRegistrationSequence = 0x00640010, // SQ M1 0 NumberOfSurfaces = 0x00660001, // UL M1 0 SurfaceSequence = 0x00660002, // SQ M1 0 SurfaceNumber = 0x00660003, // UL M1 0 SurfaceComments = 0x00660004, // LT M1 0 SurfaceProcessing = 0x00660009, // CS M1 0 SurfaceProcessingRatio = 0x0066000A, // FL M1 0 SurfaceProcessingDescription = 0x0066000B, // LO M1 0 RecommendedPresentationOpacity = 0x0066000C, // FL M1 0 RecommendedPresentationType = 0x0066000D, // CS M1 0 FiniteVolume = 0x0066000E, // CS M1 0 Manifold = 0x00660010, // CS M1 0 SurfacePointsSequence = 0x00660011, // SQ M1 0 SurfacePointsNormalsSequence = 0x00660012, // SQ M1 0 SurfaceMeshPrimitivesSequence = 0x00660013, // SQ M1 0 NumberOfSurfacePoints = 0x00660015, // UL M1 0 PointCoordinatesData = 0x00660016, // OF M1 0 PointPositionAccuracy = 0x00660017, // FL M3 0 MeanPointDistance = 0x00660018, // FL M1 0 MaximumPointDistance = 0x00660019, // FL M1 0 PointsBoundingBoxCoordinates = 0x0066001A, // FL M6 0 AxisOfRotation = 0x0066001B, // FL M3 0 CenterOfRotation = 0x0066001C, // FL M3 0 NumberOfVectors = 0x0066001E, // UL M1 0 VectorDimensionality = 0x0066001F, // US M1 0 VectorAccuracy = 0x00660020, // FL M1TN 0 VectorCoordinateData = 0x00660021, // OF M1 0 TrianglePointIndexList = 0x00660023, // OW M1 1 EdgePointIndexList = 0x00660024, // OW M1 1 VertexPointIndexList = 0x00660025, // OW M1 1 TriangleStripSequence = 0x00660026, // SQ M1 0 TriangleFanSequence = 0x00660027, // SQ M1 0 LineSequence = 0x00660028, // SQ M1 0 PrimitivePointIndexList = 0x00660029, // OW M1 1 SurfaceCount = 0x0066002A, // UL M1 0 ReferencedSurfaceSequence = 0x0066002B, // SQ M1 0 ReferencedSurfaceNumber = 0x0066002C, // UL M1 0 SegmentSurfaceGenerationAlgorithmIdentificationSequence = 0x0066002D, // SQ M1 0 SegmentSurfaceSourceInstanceSequence = 0x0066002E, // SQ M1 0 AlgorithmFamilyCodeSequence = 0x0066002F, // SQ M1 0 AlgorithmNameCodeSequence = 0x00660030, // SQ M1 0 AlgorithmVersion = 0x00660031, // LO M1 0 AlgorithmParameters = 0x00660032, // LT M1 0 FacetSequence = 0x00660034, // SQ M1 0 SurfaceProcessingAlgorithmIdentificationSequence = 0x00660035, // SQ M1 0 AlgorithmName = 0x00660036, // LO M1 0 RecommendedPointRadius = 0x00660037, // FL M1 0 RecommendedLineThickness = 0x00660038, // FL M1 0 LongPrimitivePointIndexList = 0x00660040, // OL M1 0 LongTrianglePointIndexList = 0x00660041, // OL M1 0 LongEdgePointIndexList = 0x00660042, // OL M1 0 LongVertexPointIndexList = 0x00660043, // OL M1 0 TrackSetSequence = 0x00660101, // SQ M1 0 TrackSequence = 0x00660102, // SQ M1 0 RecommendedDisplayCIELabValueList = 0x00660103, // OW M1 0 TrackingAlgorithmIdentificationSequence = 0x00660104, // SQ M1 0 TrackSetNumber = 0x00660105, // UL M1 0 TrackSetLabel = 0x00660106, // LO M1 0 TrackSetDescription = 0x00660107, // UT M1 0 TrackSetAnatomicalTypeCodeSequence = 0x00660108, // SQ M1 0 MeasurementsSequence = 0x00660121, // SQ M1 0 TrackSetStatisticsSequence = 0x00660124, // SQ M1 0 FloatingPointValues = 0x00660125, // OF M1 0 TrackPointIndexList = 0x00660129, // OL M1 0 TrackStatisticsSequence = 0x00660130, // SQ M1 0 MeasurementValuesSequence = 0x00660132, // SQ M1 0 DiffusionAcquisitionCodeSequence = 0x00660133, // SQ M1 0 DiffusionModelCodeSequence = 0x00660134, // SQ M1 0 ImplantSize = 0x00686210, // LO M1 0 ImplantTemplateVersion = 0x00686221, // LO M1 0 ReplacedImplantTemplateSequence = 0x00686222, // SQ M1 0 ImplantType = 0x00686223, // CS M1 0 DerivationImplantTemplateSequence = 0x00686224, // SQ M1 0 OriginalImplantTemplateSequence = 0x00686225, // SQ M1 0 EffectiveDateTime = 0x00686226, // DT M1 0 ImplantTargetAnatomySequence = 0x00686230, // SQ M1 0 InformationFromManufacturerSequence = 0x00686260, // SQ M1 0 NotificationFromManufacturerSequence = 0x00686265, // SQ M1 0 InformationIssueDateTime = 0x00686270, // DT M1 0 InformationSummary = 0x00686280, // ST M1 0 ImplantRegulatoryDisapprovalCodeSequence = 0x006862A0, // SQ M1 0 OverallTemplateSpatialTolerance = 0x006862A5, // FD M1 0 HPGLDocumentSequence = 0x006862C0, // SQ M1 0 HPGLDocumentID = 0x006862D0, // US M1 0 HPGLDocumentLabel = 0x006862D5, // LO M1 0 ViewOrientationCodeSequence = 0x006862E0, // SQ M1 0 ViewOrientationModifierCodeSequence = 0x006862F0, // SQ M1 0 HPGLDocumentScaling = 0x006862F2, // FD M1 0 HPGLDocument = 0x00686300, // OB M1 0 HPGLContourPenNumber = 0x00686310, // US M1 0 HPGLPenSequence = 0x00686320, // SQ M1 0 HPGLPenNumber = 0x00686330, // US M1 0 HPGLPenLabel = 0x00686340, // LO M1 0 HPGLPenDescription = 0x00686345, // ST M1 0 RecommendedRotationPoint = 0x00686346, // FD M2 0 BoundingRectangle = 0x00686347, // FD M4 0 ImplantTemplate3DModelSurfaceNumber = 0x00686350, // US M1TN 0 SurfaceModelDescriptionSequence = 0x00686360, // SQ M1 0 SurfaceModelLabel = 0x00686380, // LO M1 0 SurfaceModelScalingFactor = 0x00686390, // FD M1 0 MaterialsCodeSequence = 0x006863A0, // SQ M1 0 CoatingMaterialsCodeSequence = 0x006863A4, // SQ M1 0 ImplantTypeCodeSequence = 0x006863A8, // SQ M1 0 FixationMethodCodeSequence = 0x006863AC, // SQ M1 0 MatingFeatureSetsSequence = 0x006863B0, // SQ M1 0 MatingFeatureSetID = 0x006863C0, // US M1 0 MatingFeatureSetLabel = 0x006863D0, // LO M1 0 MatingFeatureSequence = 0x006863E0, // SQ M1 0 MatingFeatureID = 0x006863F0, // US M1 0 MatingFeatureDegreeOfFreedomSequence = 0x00686400, // SQ M1 0 DegreeOfFreedomID = 0x00686410, // US M1 0 DegreeOfFreedomType = 0x00686420, // CS M1 0 TwoDMatingFeatureCoordinatesSequence = 0x00686430, // SQ M1 0 ReferencedHPGLDocumentID = 0x00686440, // US M1 0 TwoDMatingPoint = 0x00686450, // FD M2 0 TwoDMatingAxes = 0x00686460, // FD M4 0 TwoDDegreeOfFreedomSequence = 0x00686470, // SQ M1 0 ThreeDDegreeOfFreedomAxis = 0x00686490, // FD M3 0 RangeOfFreedom = 0x006864A0, // FD M2 0 ThreeDMatingPoint = 0x006864C0, // FD M3 0 ThreeDMatingAxes = 0x006864D0, // FD M9 0 TwoDDegreeOfFreedomAxis = 0x006864F0, // FD M3 0 PlanningLandmarkPointSequence = 0x00686500, // SQ M1 0 PlanningLandmarkLineSequence = 0x00686510, // SQ M1 0 PlanningLandmarkPlaneSequence = 0x00686520, // SQ M1 0 PlanningLandmarkID = 0x00686530, // US M1 0 PlanningLandmarkDescription = 0x00686540, // LO M1 0 PlanningLandmarkIdentificationCodeSequence = 0x00686545, // SQ M1 0 TwoDPointCoordinatesSequence = 0x00686550, // SQ M1 0 TwoDPointCoordinates = 0x00686560, // FD M2 0 ThreeDPointCoordinates = 0x00686590, // FD M3 0 TwoDLineCoordinatesSequence = 0x006865A0, // SQ M1 0 TwoDLineCoordinates = 0x006865B0, // FD M4 0 ThreeDLineCoordinates = 0x006865D0, // FD M6 0 TwoDPlaneCoordinatesSequence = 0x006865E0, // SQ M1 0 TwoDPlaneIntersection = 0x006865F0, // FD M4 0 ThreeDPlaneOrigin = 0x00686610, // FD M3 0 ThreeDPlaneNormal = 0x00686620, // FD M3 0 ModelModification = 0x00687001, // CS M1 0 ModelMirroring = 0x00687002, // CS M1 0 ModelUsageCodeSequence = 0x00687003, // SQ M1 0 GraphicAnnotationSequence = 0x00700001, // SQ M1 0 GraphicLayer = 0x00700002, // CS M1 0 BoundingBoxAnnotationUnits = 0x00700003, // CS M1 0 AnchorPointAnnotationUnits = 0x00700004, // CS M1 0 GraphicAnnotationUnits = 0x00700005, // CS M1 0 UnformattedTextValue = 0x00700006, // ST M1 0 TextObjectSequence = 0x00700008, // SQ M1 0 GraphicObjectSequence = 0x00700009, // SQ M1 0 BoundingBoxTopLeftHandCorner = 0x00700010, // FL M2 0 BoundingBoxBottomRightHandCorner = 0x00700011, // FL M2 0 BoundingBoxTextHorizontalJustification = 0x00700012, // CS M1 0 AnchorPoint = 0x00700014, // FL M2 0 AnchorPointVisibility = 0x00700015, // CS M1 0 GraphicDimensions = 0x00700020, // US M1 0 NumberOfGraphicPoints = 0x00700021, // US M1 0 GraphicData = 0x00700022, // FL M2TN 0 GraphicType = 0x00700023, // CS M1 0 GraphicFilled = 0x00700024, // CS M1 0 ImageRotationRetired = 0x00700040, // IS M1 1 ImageHorizontalFlip = 0x00700041, // CS M1 0 ImageRotation = 0x00700042, // US M1 0 DisplayedAreaTopLeftHandCornerTrial = 0x00700050, // US M2 1 DisplayedAreaBottomRightHandCornerTrial = 0x00700051, // US M2 1 DisplayedAreaTopLeftHandCorner = 0x00700052, // SL M2 0 DisplayedAreaBottomRightHandCorner = 0x00700053, // SL M2 0 DisplayedAreaSelectionSequence = 0x0070005A, // SQ M1 0 GraphicLayerSequence = 0x00700060, // SQ M1 0 GraphicLayerOrder = 0x00700062, // IS M1 0 GraphicLayerRecommendedDisplayGrayscaleValue = 0x00700066, // US M1 0 GraphicLayerRecommendedDisplayRGBValue = 0x00700067, // US M3 1 GraphicLayerDescription = 0x00700068, // LO M1 0 ContentLabel = 0x00700080, // CS M1 0 ContentDescription = 0x00700081, // LO M1 0 PresentationCreationDate = 0x00700082, // DA M1 0 PresentationCreationTime = 0x00700083, // TM M1 0 ContentCreatorName = 0x00700084, // PN M1 0 ContentCreatorIdentificationCodeSequence = 0x00700086, // SQ M1 0 AlternateContentDescriptionSequence = 0x00700087, // SQ M1 0 PresentationSizeMode = 0x00700100, // CS M1 0 PresentationPixelSpacing = 0x00700101, // DS M2 0 PresentationPixelAspectRatio = 0x00700102, // IS M2 0 PresentationPixelMagnificationRatio = 0x00700103, // FL M1 0 GraphicGroupLabel = 0x00700207, // LO M1 0 GraphicGroupDescription = 0x00700208, // ST M1 0 CompoundGraphicSequence = 0x00700209, // SQ M1 0 CompoundGraphicInstanceID = 0x00700226, // UL M1 0 FontName = 0x00700227, // LO M1 0 FontNameType = 0x00700228, // CS M1 0 CSSFontName = 0x00700229, // LO M1 0 RotationAngle = 0x00700230, // FD M1 0 TextStyleSequence = 0x00700231, // SQ M1 0 LineStyleSequence = 0x00700232, // SQ M1 0 FillStyleSequence = 0x00700233, // SQ M1 0 GraphicGroupSequence = 0x00700234, // SQ M1 0 TextColorCIELabValue = 0x00700241, // US M3 0 HorizontalAlignment = 0x00700242, // CS M1 0 VerticalAlignment = 0x00700243, // CS M1 0 ShadowStyle = 0x00700244, // CS M1 0 ShadowOffsetX = 0x00700245, // FL M1 0 ShadowOffsetY = 0x00700246, // FL M1 0 ShadowColorCIELabValue = 0x00700247, // US M3 0 Underlined = 0x00700248, // CS M1 0 Bold = 0x00700249, // CS M1 0 Italic = 0x00700250, // CS M1 0 PatternOnColorCIELabValue = 0x00700251, // US M3 0 PatternOffColorCIELabValue = 0x00700252, // US M3 0 LineThickness = 0x00700253, // FL M1 0 LineDashingStyle = 0x00700254, // CS M1 0 LinePattern = 0x00700255, // UL M1 0 FillPattern = 0x00700256, // OB M1 0 FillMode = 0x00700257, // CS M1 0 ShadowOpacity = 0x00700258, // FL M1 0 GapLength = 0x00700261, // FL M1 0 DiameterOfVisibility = 0x00700262, // FL M1 0 RotationPoint = 0x00700273, // FL M2 0 TickAlignment = 0x00700274, // CS M1 0 ShowTickLabel = 0x00700278, // CS M1 0 TickLabelAlignment = 0x00700279, // CS M1 0 CompoundGraphicUnits = 0x00700282, // CS M1 0 PatternOnOpacity = 0x00700284, // FL M1 0 PatternOffOpacity = 0x00700285, // FL M1 0 MajorTicksSequence = 0x00700287, // SQ M1 0 TickPosition = 0x00700288, // FL M1 0 TickLabel = 0x00700289, // SH M1 0 CompoundGraphicType = 0x00700294, // CS M1 0 GraphicGroupID = 0x00700295, // UL M1 0 ShapeType = 0x00700306, // CS M1 0 RegistrationSequence = 0x00700308, // SQ M1 0 MatrixRegistrationSequence = 0x00700309, // SQ M1 0 MatrixSequence = 0x0070030A, // SQ M1 0 FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix = 0x0070030B, // FD M16 0 FrameOfReferenceTransformationMatrixType = 0x0070030C, // CS M1 0 RegistrationTypeCodeSequence = 0x0070030D, // SQ M1 0 FiducialDescription = 0x0070030F, // ST M1 0 FiducialIdentifier = 0x00700310, // SH M1 0 FiducialIdentifierCodeSequence = 0x00700311, // SQ M1 0 ContourUncertaintyRadius = 0x00700312, // FD M1 0 UsedFiducialsSequence = 0x00700314, // SQ M1 0 GraphicCoordinatesDataSequence = 0x00700318, // SQ M1 0 FiducialUID = 0x0070031A, // UI M1 0 ReferencedFiducialUID = 0x0070031B, // UI M1 0 FiducialSetSequence = 0x0070031C, // SQ M1 0 FiducialSequence = 0x0070031E, // SQ M1 0 FiducialsPropertyCategoryCodeSequence = 0x0070031F, // SQ M1 0 GraphicLayerRecommendedDisplayCIELabValue = 0x00700401, // US M3 0 BlendingSequence = 0x00700402, // SQ M1 0 RelativeOpacity = 0x00700403, // FL M1 0 ReferencedSpatialRegistrationSequence = 0x00700404, // SQ M1 0 BlendingPosition = 0x00700405, // CS M1 0 PresentationDisplayCollectionUID = 0x00701101, // UI M1 0 PresentationSequenceCollectionUID = 0x00701102, // UI M1 0 PresentationSequencePositionIndex = 0x00701103, // US M1 0 RenderedImageReferenceSequence = 0x00701104, // SQ M1 0 VolumetricPresentationStateInputSequence = 0x00701201, // SQ M1 0 PresentationInputType = 0x00701202, // CS M1 0 InputSequencePositionIndex = 0x00701203, // US M1 0 Crop = 0x00701204, // CS M1 0 CroppingSpecificationIndex = 0x00701205, // US M1TN 0 CompositingMethod = 0x00701206, // CS M1 1 VolumetricPresentationInputNumber = 0x00701207, // US M1 0 ImageVolumeGeometry = 0x00701208, // CS M1 0 VolumetricPresentationInputSetUID = 0x00701209, // UI M1 0 VolumetricPresentationInputSetSequence = 0x0070120A, // SQ M1 0 GlobalCrop = 0x0070120B, // CS M1 0 GlobalCroppingSpecificationIndex = 0x0070120C, // US M1TN 0 RenderingMethod = 0x0070120D, // CS M1 0 VolumeCroppingSequence = 0x00701301, // SQ M1 0 VolumeCroppingMethod = 0x00701302, // CS M1 0 BoundingBoxCrop = 0x00701303, // FD M6 0 ObliqueCroppingPlaneSequence = 0x00701304, // SQ M1 0 Plane = 0x00701305, // FD M4 0 PlaneNormal = 0x00701306, // FD M3 0 CroppingSpecificationNumber = 0x00701309, // US M1 0 MultiPlanarReconstructionStyle = 0x00701501, // CS M1 0 MPRThicknessType = 0x00701502, // CS M1 0 MPRSlabThickness = 0x00701503, // FD M1 0 MPRTopLeftHandCorner = 0x00701505, // FD M3 0 MPRViewWidthDirection = 0x00701507, // FD M3 0 MPRViewWidth = 0x00701508, // FD M1 0 NumberOfVolumetricCurvePoints = 0x0070150C, // UL M1 0 VolumetricCurvePoints = 0x0070150D, // OD M1 0 MPRViewHeightDirection = 0x00701511, // FD M3 0 MPRViewHeight = 0x00701512, // FD M1 0 RenderProjection = 0x00701602, // CS M1 0 ViewpointPosition = 0x00701603, // FD M3 0 ViewpointLookAtPoint = 0x00701604, // FD M3 0 ViewpointUpDirection = 0x00701605, // FD M3 0 RenderFieldOfView = 0x00701606, // FD M6 0 SamplingStepSize = 0x00701607, // FD M1 0 ShadingStyle = 0x00701701, // CS M1 0 AmbientReflectionIntensity = 0x00701702, // FD M1 0 LightDirection = 0x00701703, // FD M3 0 DiffuseReflectionIntensity = 0x00701704, // FD M1 0 SpecularReflectionIntensity = 0x00701705, // FD M1 0 Shininess = 0x00701706, // FD M1 0 PresentationStateClassificationComponentSequence = 0x00701801, // SQ M1 0 ComponentType = 0x00701802, // CS M1 0 ComponentInputSequence = 0x00701803, // SQ M1 0 VolumetricPresentationInputIndex = 0x00701804, // US M1 0 PresentationStateCompositorComponentSequence = 0x00701805, // SQ M1 0 WeightingTransferFunctionSequence = 0x00701806, // SQ M1 0 WeightingLookupTableDescriptor = 0x00701807, // US M3 0 WeightingLookupTableData = 0x00701808, // OB M1 0 VolumetricAnnotationSequence = 0x00701901, // SQ M1 0 ReferencedStructuredContextSequence = 0x00701903, // SQ M1 0 ReferencedContentItem = 0x00701904, // UI M1 0 VolumetricPresentationInputAnnotationSequence = 0x00701905, // SQ M1 0 AnnotationClipping = 0x00701907, // CS M1 0 PresentationAnimationStyle = 0x00701A01, // CS M1 0 RecommendedAnimationRate = 0x00701A03, // FD M1 0 AnimationCurveSequence = 0x00701A04, // SQ M1 0 AnimationStepSize = 0x00701A05, // FD M1 0 SwivelRange = 0x00701A06, // FD M1 0 VolumetricCurveUpDirections = 0x00701A07, // OD M1 0 VolumeStreamSequence = 0x00701A08, // SQ M1 0 RGBATransferFunctionDescription = 0x00701A09, // LO M1 0 AdvancedBlendingSequence = 0x00701B01, // SQ M1 0 BlendingInputNumber = 0x00701B02, // US M1 0 BlendingDisplayInputSequence = 0x00701B03, // SQ M1 0 BlendingDisplaySequence = 0x00701B04, // SQ M1 0 BlendingMode = 0x00701B06, // CS M1 0 TimeSeriesBlending = 0x00701B07, // CS M1 0 GeometryForDisplay = 0x00701B08, // CS M1 0 ThresholdSequence = 0x00701B11, // SQ M1 0 ThresholdValueSequence = 0x00701B12, // SQ M1 0 ThresholdType = 0x00701B13, // CS M1 0 ThresholdValue = 0x00701B14, // FD M1 0 HangingProtocolName = 0x00720002, // SH M1 0 HangingProtocolDescription = 0x00720004, // LO M1 0 HangingProtocolLevel = 0x00720006, // CS M1 0 HangingProtocolCreator = 0x00720008, // LO M1 0 HangingProtocolCreationDateTime = 0x0072000A, // DT M1 0 HangingProtocolDefinitionSequence = 0x0072000C, // SQ M1 0 HangingProtocolUserIdentificationCodeSequence = 0x0072000E, // SQ M1 0 HangingProtocolUserGroupName = 0x00720010, // LO M1 0 SourceHangingProtocolSequence = 0x00720012, // SQ M1 0 NumberOfPriorsReferenced = 0x00720014, // US M1 0 ImageSetsSequence = 0x00720020, // SQ M1 0 ImageSetSelectorSequence = 0x00720022, // SQ M1 0 ImageSetSelectorUsageFlag = 0x00720024, // CS M1 0 SelectorAttribute = 0x00720026, // AT M1 0 SelectorValueNumber = 0x00720028, // US M1 0 TimeBasedImageSetsSequence = 0x00720030, // SQ M1 0 ImageSetNumber = 0x00720032, // US M1 0 ImageSetSelectorCategory = 0x00720034, // CS M1 0 RelativeTime = 0x00720038, // US M2 0 RelativeTimeUnits = 0x0072003A, // CS M1 0 AbstractPriorValue = 0x0072003C, // SS M2 0 AbstractPriorCodeSequence = 0x0072003E, // SQ M1 0 ImageSetLabel = 0x00720040, // LO M1 0 SelectorAttributeVR = 0x00720050, // CS M1 0 SelectorSequencePointer = 0x00720052, // AT M1TN 0 SelectorSequencePointerPrivateCreator = 0x00720054, // LO M1TN 0 SelectorAttributePrivateCreator = 0x00720056, // LO M1 0 SelectorAEValue = 0x0072005E, // AE M1TN 0 SelectorASValue = 0x0072005F, // AS M1TN 0 SelectorATValue = 0x00720060, // AT M1TN 0 SelectorDAValue = 0x00720061, // DA M1TN 0 SelectorCSValue = 0x00720062, // CS M1TN 0 SelectorDTValue = 0x00720063, // DT M1TN 0 SelectorISValue = 0x00720064, // IS M1TN 0 SelectorOBValue = 0x00720065, // OB M1 0 SelectorLOValue = 0x00720066, // LO M1TN 0 SelectorOFValue = 0x00720067, // OF M1 0 SelectorLTValue = 0x00720068, // LT M1 0 SelectorOWValue = 0x00720069, // OW M1 0 SelectorPNValue = 0x0072006A, // PN M1TN 0 SelectorTMValue = 0x0072006B, // TM M1TN 0 SelectorSHValue = 0x0072006C, // SH M1TN 0 SelectorUNValue = 0x0072006D, // UN M1 0 SelectorSTValue = 0x0072006E, // ST M1 0 SelectorUCValue = 0x0072006F, // UC M1TN 0 SelectorUTValue = 0x00720070, // UT M1 0 SelectorURValue = 0x00720071, // UR M1 0 SelectorDSValue = 0x00720072, // DS M1TN 0 SelectorODValue = 0x00720073, // OD M1 0 SelectorFDValue = 0x00720074, // FD M1TN 0 SelectorOLValue = 0x00720075, // OL M1 0 SelectorFLValue = 0x00720076, // FL M1TN 0 SelectorULValue = 0x00720078, // UL M1TN 0 SelectorUSValue = 0x0072007A, // US M1TN 0 SelectorSLValue = 0x0072007C, // SL M1TN 0 SelectorSSValue = 0x0072007E, // SS M1TN 0 SelectorUIValue = 0x0072007F, // UI M1TN 0 SelectorCodeSequenceValue = 0x00720080, // SQ M1 0 NumberOfScreens = 0x00720100, // US M1 0 NominalScreenDefinitionSequence = 0x00720102, // SQ M1 0 NumberOfVerticalPixels = 0x00720104, // US M1 0 NumberOfHorizontalPixels = 0x00720106, // US M1 0 DisplayEnvironmentSpatialPosition = 0x00720108, // FD M4 0 ScreenMinimumGrayscaleBitDepth = 0x0072010A, // US M1 0 ScreenMinimumColorBitDepth = 0x0072010C, // US M1 0 ApplicationMaximumRepaintTime = 0x0072010E, // US M1 0 DisplaySetsSequence = 0x00720200, // SQ M1 0 DisplaySetNumber = 0x00720202, // US M1 0 DisplaySetLabel = 0x00720203, // LO M1 0 DisplaySetPresentationGroup = 0x00720204, // US M1 0 DisplaySetPresentationGroupDescription = 0x00720206, // LO M1 0 PartialDataDisplayHandling = 0x00720208, // CS M1 0 SynchronizedScrollingSequence = 0x00720210, // SQ M1 0 DisplaySetScrollingGroup = 0x00720212, // US M2TN 0 NavigationIndicatorSequence = 0x00720214, // SQ M1 0 NavigationDisplaySet = 0x00720216, // US M1 0 ReferenceDisplaySets = 0x00720218, // US M1TN 0 ImageBoxesSequence = 0x00720300, // SQ M1 0 ImageBoxNumber = 0x00720302, // US M1 0 ImageBoxLayoutType = 0x00720304, // CS M1 0 ImageBoxTileHorizontalDimension = 0x00720306, // US M1 0 ImageBoxTileVerticalDimension = 0x00720308, // US M1 0 ImageBoxScrollDirection = 0x00720310, // CS M1 0 ImageBoxSmallScrollType = 0x00720312, // CS M1 0 ImageBoxSmallScrollAmount = 0x00720314, // US M1 0 ImageBoxLargeScrollType = 0x00720316, // CS M1 0 ImageBoxLargeScrollAmount = 0x00720318, // US M1 0 ImageBoxOverlapPriority = 0x00720320, // US M1 0 CineRelativeToRealTime = 0x00720330, // FD M1 0 FilterOperationsSequence = 0x00720400, // SQ M1 0 FilterByCategory = 0x00720402, // CS M1 0 FilterByAttributePresence = 0x00720404, // CS M1 0 FilterByOperator = 0x00720406, // CS M1 0 StructuredDisplayBackgroundCIELabValue = 0x00720420, // US M3 0 EmptyImageBoxCIELabValue = 0x00720421, // US M3 0 StructuredDisplayImageBoxSequence = 0x00720422, // SQ M1 0 StructuredDisplayTextBoxSequence = 0x00720424, // SQ M1 0 ReferencedFirstFrameSequence = 0x00720427, // SQ M1 0 ImageBoxSynchronizationSequence = 0x00720430, // SQ M1 0 SynchronizedImageBoxList = 0x00720432, // US M2TN 0 TypeOfSynchronization = 0x00720434, // CS M1 0 BlendingOperationType = 0x00720500, // CS M1 0 ReformattingOperationType = 0x00720510, // CS M1 0 ReformattingThickness = 0x00720512, // FD M1 0 ReformattingInterval = 0x00720514, // FD M1 0 ReformattingOperationInitialViewDirection = 0x00720516, // CS M1 0 ThreeDRenderingType = 0x00720520, // CS M1TN 0 SortingOperationsSequence = 0x00720600, // SQ M1 0 SortByCategory = 0x00720602, // CS M1 0 SortingDirection = 0x00720604, // CS M1 0 DisplaySetPatientOrientation = 0x00720700, // CS M2 0 VOIType = 0x00720702, // CS M1 0 PseudoColorType = 0x00720704, // CS M1 0 PseudoColorPaletteInstanceReferenceSequence = 0x00720705, // SQ M1 0 ShowGrayscaleInverted = 0x00720706, // CS M1 0 ShowImageTrueSizeFlag = 0x00720710, // CS M1 0 ShowGraphicAnnotationFlag = 0x00720712, // CS M1 0 ShowPatientDemographicsFlag = 0x00720714, // CS M1 0 ShowAcquisitionTechniquesFlag = 0x00720716, // CS M1 0 DisplaySetHorizontalJustification = 0x00720717, // CS M1 0 DisplaySetVerticalJustification = 0x00720718, // CS M1 0 ContinuationStartMeterset = 0x00740120, // FD M1 0 ContinuationEndMeterset = 0x00740121, // FD M1 0 ProcedureStepState = 0x00741000, // CS M1 0 ProcedureStepProgressInformationSequence = 0x00741002, // SQ M1 0 ProcedureStepProgress = 0x00741004, // DS M1 0 ProcedureStepProgressDescription = 0x00741006, // ST M1 0 ProcedureStepProgressParametersSequence = 0x00741007, // SQ M1 0 ProcedureStepCommunicationsURISequence = 0x00741008, // SQ M1 0 ContactURI = 0x0074100A, // UR M1 0 ContactDisplayName = 0x0074100C, // LO M1 0 ProcedureStepDiscontinuationReasonCodeSequence = 0x0074100E, // SQ M1 0 BeamTaskSequence = 0x00741020, // SQ M1 0 BeamTaskType = 0x00741022, // CS M1 0 BeamOrderIndexTrial = 0x00741024, // IS M1 1 AutosequenceFlag = 0x00741025, // CS M1 0 TableTopVerticalAdjustedPosition = 0x00741026, // FD M1 0 TableTopLongitudinalAdjustedPosition = 0x00741027, // FD M1 0 TableTopLateralAdjustedPosition = 0x00741028, // FD M1 0 PatientSupportAdjustedAngle = 0x0074102A, // FD M1 0 TableTopEccentricAdjustedAngle = 0x0074102B, // FD M1 0 TableTopPitchAdjustedAngle = 0x0074102C, // FD M1 0 TableTopRollAdjustedAngle = 0x0074102D, // FD M1 0 DeliveryVerificationImageSequence = 0x00741030, // SQ M1 0 VerificationImageTiming = 0x00741032, // CS M1 0 DoubleExposureFlag = 0x00741034, // CS M1 0 DoubleExposureOrdering = 0x00741036, // CS M1 0 DoubleExposureMetersetTrial = 0x00741038, // DS M1 1 DoubleExposureFieldDeltaTrial = 0x0074103A, // DS M4 1 RelatedReferenceRTImageSequence = 0x00741040, // SQ M1 0 GeneralMachineVerificationSequence = 0x00741042, // SQ M1 0 ConventionalMachineVerificationSequence = 0x00741044, // SQ M1 0 IonMachineVerificationSequence = 0x00741046, // SQ M1 0 FailedAttributesSequence = 0x00741048, // SQ M1 0 OverriddenAttributesSequence = 0x0074104A, // SQ M1 0 ConventionalControlPointVerificationSequence = 0x0074104C, // SQ M1 0 IonControlPointVerificationSequence = 0x0074104E, // SQ M1 0 AttributeOccurrenceSequence = 0x00741050, // SQ M1 0 AttributeOccurrencePointer = 0x00741052, // AT M1 0 AttributeItemSelector = 0x00741054, // UL M1 0 AttributeOccurrencePrivateCreator = 0x00741056, // LO M1 0 SelectorSequencePointerItems = 0x00741057, // IS M1TN 0 ScheduledProcedureStepPriority = 0x00741200, // CS M1 0 WorklistLabel = 0x00741202, // LO M1 0 ProcedureStepLabel = 0x00741204, // LO M1 0 ScheduledProcessingParametersSequence = 0x00741210, // SQ M1 0 PerformedProcessingParametersSequence = 0x00741212, // SQ M1 0 UnifiedProcedureStepPerformedProcedureSequence = 0x00741216, // SQ M1 0 RelatedProcedureStepSequence = 0x00741220, // SQ M1 1 ProcedureStepRelationshipType = 0x00741222, // LO M1 1 ReplacedProcedureStepSequence = 0x00741224, // SQ M1 0 DeletionLock = 0x00741230, // LO M1 0 ReceivingAE = 0x00741234, // AE M1 0 RequestingAE = 0x00741236, // AE M1 0 ReasonForCancellation = 0x00741238, // LT M1 0 SCPStatus = 0x00741242, // CS M1 0 SubscriptionListStatus = 0x00741244, // CS M1 0 UnifiedProcedureStepListStatus = 0x00741246, // CS M1 0 BeamOrderIndex = 0x00741324, // UL M1 0 DoubleExposureMeterset = 0x00741338, // FD M1 0 DoubleExposureFieldDelta = 0x0074133A, // FD M4 0 BrachyTaskSequence = 0x00741401, // SQ M1 0 ContinuationStartTotalReferenceAirKerma = 0x00741402, // DS M1 0 ContinuationEndTotalReferenceAirKerma = 0x00741403, // DS M1 0 ContinuationPulseNumber = 0x00741404, // IS M1 0 ChannelDeliveryOrderSequence = 0x00741405, // SQ M1 0 ReferencedChannelNumber = 0x00741406, // IS M1 0 StartCumulativeTimeWeight = 0x00741407, // DS M1 0 EndCumulativeTimeWeight = 0x00741408, // DS M1 0 OmittedChannelSequence = 0x00741409, // SQ M1 0 ReasonForChannelOmission = 0x0074140A, // CS M1 0 ReasonForChannelOmissionDescription = 0x0074140B, // LO M1 0 ChannelDeliveryOrderIndex = 0x0074140C, // IS M1 0 ChannelDeliveryContinuationSequence = 0x0074140D, // SQ M1 0 OmittedApplicationSetupSequence = 0x0074140E, // SQ M1 0 ImplantAssemblyTemplateName = 0x00760001, // LO M1 0 ImplantAssemblyTemplateIssuer = 0x00760003, // LO M1 0 ImplantAssemblyTemplateVersion = 0x00760006, // LO M1 0 ReplacedImplantAssemblyTemplateSequence = 0x00760008, // SQ M1 0 ImplantAssemblyTemplateType = 0x0076000A, // CS M1 0 OriginalImplantAssemblyTemplateSequence = 0x0076000C, // SQ M1 0 DerivationImplantAssemblyTemplateSequence = 0x0076000E, // SQ M1 0 ImplantAssemblyTemplateTargetAnatomySequence = 0x00760010, // SQ M1 0 ProcedureTypeCodeSequence = 0x00760020, // SQ M1 0 SurgicalTechnique = 0x00760030, // LO M1 0 ComponentTypesSequence = 0x00760032, // SQ M1 0 ComponentTypeCodeSequence = 0x00760034, // SQ M1 0 ExclusiveComponentType = 0x00760036, // CS M1 0 MandatoryComponentType = 0x00760038, // CS M1 0 ComponentSequence = 0x00760040, // SQ M1 0 ComponentID = 0x00760055, // US M1 0 ComponentAssemblySequence = 0x00760060, // SQ M1 0 Component1ReferencedID = 0x00760070, // US M1 0 Component1ReferencedMatingFeatureSetID = 0x00760080, // US M1 0 Component1ReferencedMatingFeatureID = 0x00760090, // US M1 0 Component2ReferencedID = 0x007600A0, // US M1 0 Component2ReferencedMatingFeatureSetID = 0x007600B0, // US M1 0 Component2ReferencedMatingFeatureID = 0x007600C0, // US M1 0 ImplantTemplateGroupName = 0x00780001, // LO M1 0 ImplantTemplateGroupDescription = 0x00780010, // ST M1 0 ImplantTemplateGroupIssuer = 0x00780020, // LO M1 0 ImplantTemplateGroupVersion = 0x00780024, // LO M1 0 ReplacedImplantTemplateGroupSequence = 0x00780026, // SQ M1 0 ImplantTemplateGroupTargetAnatomySequence = 0x00780028, // SQ M1 0 ImplantTemplateGroupMembersSequence = 0x0078002A, // SQ M1 0 ImplantTemplateGroupMemberID = 0x0078002E, // US M1 0 ThreeDImplantTemplateGroupMemberMatchingPoint = 0x00780050, // FD M3 0 ThreeDImplantTemplateGroupMemberMatchingAxes = 0x00780060, // FD M9 0 ImplantTemplateGroupMemberMatching2DCoordinatesSequence = 0x00780070, // SQ M1 0 TwoDImplantTemplateGroupMemberMatchingPoint = 0x00780090, // FD M2 0 TwoDImplantTemplateGroupMemberMatchingAxes = 0x007800A0, // FD M4 0 ImplantTemplateGroupVariationDimensionSequence = 0x007800B0, // SQ M1 0 ImplantTemplateGroupVariationDimensionName = 0x007800B2, // LO M1 0 ImplantTemplateGroupVariationDimensionRankSequence = 0x007800B4, // SQ M1 0 ReferencedImplantTemplateGroupMemberID = 0x007800B6, // US M1 0 ImplantTemplateGroupVariationDimensionRank = 0x007800B8, // US M1 0 SurfaceScanAcquisitionTypeCodeSequence = 0x00800001, // SQ M1 0 SurfaceScanModeCodeSequence = 0x00800002, // SQ M1 0 RegistrationMethodCodeSequence = 0x00800003, // SQ M1 0 ShotDurationTime = 0x00800004, // FD M1 0 ShotOffsetTime = 0x00800005, // FD M1 0 SurfacePointPresentationValueData = 0x00800006, // US M1TN 0 SurfacePointColorCIELabValueData = 0x00800007, // US M3T3N 0 UVMappingSequence = 0x00800008, // SQ M1 0 TextureLabel = 0x00800009, // SH M1 0 UValueData = 0x00800010, // OF M1 0 VValueData = 0x00800011, // OF M1 0 ReferencedTextureSequence = 0x00800012, // SQ M1 0 ReferencedSurfaceDataSequence = 0x00800013, // SQ M1 0 AssessmentSummary = 0x00820001, // CS M1 0 AssessmentSummaryDescription = 0x00820003, // UT M1 0 AssessedSOPInstanceSequence = 0x00820004, // SQ M1 0 ReferencedComparisonSOPInstanceSequence = 0x00820005, // SQ M1 0 NumberOfAssessmentObservations = 0x00820006, // UL M1 0 AssessmentObservationsSequence = 0x00820007, // SQ M1 0 ObservationSignificance = 0x00820008, // CS M1 0 ObservationDescription = 0x0082000A, // UT M1 0 StructuredConstraintObservationSequence = 0x0082000C, // SQ M1 0 AssessedAttributeValueSequence = 0x00820010, // SQ M1 0 AssessmentSetID = 0x00820016, // LO M1 0 AssessmentRequesterSequence = 0x00820017, // SQ M1 0 SelectorAttributeName = 0x00820018, // LO M1 0 SelectorAttributeKeyword = 0x00820019, // LO M1 0 AssessmentTypeCodeSequence = 0x00820021, // SQ M1 0 ObservationBasisCodeSequence = 0x00820022, // SQ M1 0 AssessmentLabel = 0x00820023, // LO M1 0 ConstraintType = 0x00820032, // CS M1 0 SpecificationSelectionGuidance = 0x00820033, // UT M1 0 ConstraintValueSequence = 0x00820034, // SQ M1 0 RecommendedDefaultValueSequence = 0x00820035, // SQ M1 0 ConstraintViolationSignificance = 0x00820036, // CS M1 0 ConstraintViolationCondition = 0x00820037, // UT M1 0 ModifiableConstraintFlag = 0x00820038, // CS M1 0 StorageMediaFileSetID = 0x00880130, // SH M1 0 StorageMediaFileSetUID = 0x00880140, // UI M1 0 IconImageSequence = 0x00880200, // SQ M1 0 TopicTitle = 0x00880904, // LO M1 1 TopicSubject = 0x00880906, // ST M1 1 TopicAuthor = 0x00880910, // LO M1 1 TopicKeywords = 0x00880912, // LO M1T32 1 SOPInstanceStatus = 0x01000410, // CS M1 0 SOPAuthorizationDateTime = 0x01000420, // DT M1 0 SOPAuthorizationComment = 0x01000424, // LT M1 0 AuthorizationEquipmentCertificationNumber = 0x01000426, // LO M1 0 MACIDNumber = 0x04000005, // US M1 0 MACCalculationTransferSyntaxUID = 0x04000010, // UI M1 0 MACAlgorithm = 0x04000015, // CS M1 0 DataElementsSigned = 0x04000020, // AT M1TN 0 DigitalSignatureUID = 0x04000100, // UI M1 0 DigitalSignatureDateTime = 0x04000105, // DT M1 0 CertificateType = 0x04000110, // CS M1 0 CertificateOfSigner = 0x04000115, // OB M1 0 Signature = 0x04000120, // OB M1 0 CertifiedTimestampType = 0x04000305, // CS M1 0 CertifiedTimestamp = 0x04000310, // OB M1 0 DigitalSignaturePurposeCodeSequence = 0x04000401, // SQ M1 0 ReferencedDigitalSignatureSequence = 0x04000402, // SQ M1 0 ReferencedSOPInstanceMACSequence = 0x04000403, // SQ M1 0 MAC = 0x04000404, // OB M1 0 EncryptedAttributesSequence = 0x04000500, // SQ M1 0 EncryptedContentTransferSyntaxUID = 0x04000510, // UI M1 0 EncryptedContent = 0x04000520, // OB M1 0 ModifiedAttributesSequence = 0x04000550, // SQ M1 0 NonconformingModifiedAttributesSequence = 0x04000551, // SQ M1 0 NonconformingDataElementValue = 0x04000552, // OB M1 0 OriginalAttributesSequence = 0x04000561, // SQ M1 0 AttributeModificationDateTime = 0x04000562, // DT M1 0 ModifyingSystem = 0x04000563, // LO M1 0 SourceOfPreviousValues = 0x04000564, // LO M1 0 ReasonForTheAttributeModification = 0x04000565, // CS M1 0 InstanceOriginStatus = 0x04000600, // CS M1 0 EscapeTriplet = 0x10000000, // US M3 1 RunLengthTriplet = 0x10000001, // US M3 1 HuffmanTableSize = 0x10000002, // US M1 1 HuffmanTableTriplet = 0x10000003, // US M3 1 ShiftTableSize = 0x10000004, // US M1 1 ShiftTableTriplet = 0x10000005, // US M3 1 ZonalMap = 0x10100000, // US M1TN 1 NumberOfCopies = 0x20000010, // IS M1 0 PrinterConfigurationSequence = 0x2000001E, // SQ M1 0 PrintPriority = 0x20000020, // CS M1 0 MediumType = 0x20000030, // CS M1 0 FilmDestination = 0x20000040, // CS M1 0 FilmSessionLabel = 0x20000050, // LO M1 0 MemoryAllocation = 0x20000060, // IS M1 0 MaximumMemoryAllocation = 0x20000061, // IS M1 0 ColorImagePrintingFlag = 0x20000062, // CS M1 1 CollationFlag = 0x20000063, // CS M1 1 AnnotationFlag = 0x20000065, // CS M1 1 ImageOverlayFlag = 0x20000067, // CS M1 1 PresentationLUTFlag = 0x20000069, // CS M1 1 ImageBoxPresentationLUTFlag = 0x2000006A, // CS M1 1 MemoryBitDepth = 0x200000A0, // US M1 0 PrintingBitDepth = 0x200000A1, // US M1 0 MediaInstalledSequence = 0x200000A2, // SQ M1 0 OtherMediaAvailableSequence = 0x200000A4, // SQ M1 0 SupportedImageDisplayFormatsSequence = 0x200000A8, // SQ M1 0 ReferencedFilmBoxSequence = 0x20000500, // SQ M1 0 ReferencedStoredPrintSequence = 0x20000510, // SQ M1 1 ImageDisplayFormat = 0x20100010, // ST M1 0 AnnotationDisplayFormatID = 0x20100030, // CS M1 0 FilmOrientation = 0x20100040, // CS M1 0 FilmSizeID = 0x20100050, // CS M1 0 PrinterResolutionID = 0x20100052, // CS M1 0 DefaultPrinterResolutionID = 0x20100054, // CS M1 0 MagnificationType = 0x20100060, // CS M1 0 SmoothingType = 0x20100080, // CS M1 0 DefaultMagnificationType = 0x201000A6, // CS M1 0 OtherMagnificationTypesAvailable = 0x201000A7, // CS M1TN 0 DefaultSmoothingType = 0x201000A8, // CS M1 0 OtherSmoothingTypesAvailable = 0x201000A9, // CS M1TN 0 BorderDensity = 0x20100100, // CS M1 0 EmptyImageDensity = 0x20100110, // CS M1 0 MinDensity = 0x20100120, // US M1 0 MaxDensity = 0x20100130, // US M1 0 Trim = 0x20100140, // CS M1 0 ConfigurationInformation = 0x20100150, // ST M1 0 ConfigurationInformationDescription = 0x20100152, // LT M1 0 MaximumCollatedFilms = 0x20100154, // IS M1 0 Illumination = 0x2010015E, // US M1 0 ReflectedAmbientLight = 0x20100160, // US M1 0 PrinterPixelSpacing = 0x20100376, // DS M2 0 ReferencedFilmSessionSequence = 0x20100500, // SQ M1 0 ReferencedImageBoxSequence = 0x20100510, // SQ M1 0 ReferencedBasicAnnotationBoxSequence = 0x20100520, // SQ M1 0 ImageBoxPosition = 0x20200010, // US M1 0 Polarity = 0x20200020, // CS M1 0 RequestedImageSize = 0x20200030, // DS M1 0 RequestedDecimateCropBehavior = 0x20200040, // CS M1 0 RequestedResolutionID = 0x20200050, // CS M1 0 RequestedImageSizeFlag = 0x202000A0, // CS M1 0 DecimateCropResult = 0x202000A2, // CS M1 0 BasicGrayscaleImageSequence = 0x20200110, // SQ M1 0 BasicColorImageSequence = 0x20200111, // SQ M1 0 ReferencedImageOverlayBoxSequence = 0x20200130, // SQ M1 1 ReferencedVOILUTBoxSequence = 0x20200140, // SQ M1 1 AnnotationPosition = 0x20300010, // US M1 0 TextString = 0x20300020, // LO M1 0 ReferencedOverlayPlaneSequence = 0x20400010, // SQ M1 1 ReferencedOverlayPlaneGroups = 0x20400011, // US M1T99 1 OverlayPixelDataSequence = 0x20400020, // SQ M1 1 OverlayMagnificationType = 0x20400060, // CS M1 1 OverlaySmoothingType = 0x20400070, // CS M1 1 OverlayOrImageMagnification = 0x20400072, // CS M1 1 MagnifyToNumberOfColumns = 0x20400074, // US M1 1 OverlayForegroundDensity = 0x20400080, // CS M1 1 OverlayBackgroundDensity = 0x20400082, // CS M1 1 OverlayMode = 0x20400090, // CS M1 1 ThresholdDensity = 0x20400100, // CS M1 1 ReferencedImageBoxSequenceRetired = 0x20400500, // SQ M1 1 PresentationLUTSequence = 0x20500010, // SQ M1 0 PresentationLUTShape = 0x20500020, // CS M1 0 ReferencedPresentationLUTSequence = 0x20500500, // SQ M1 0 PrintJobID = 0x21000010, // SH M1 1 ExecutionStatus = 0x21000020, // CS M1 0 ExecutionStatusInfo = 0x21000030, // CS M1 0 CreationDate = 0x21000040, // DA M1 0 CreationTime = 0x21000050, // TM M1 0 Originator = 0x21000070, // AE M1 0 DestinationAE = 0x21000140, // AE M1 0 OwnerID = 0x21000160, // SH M1 0 NumberOfFilms = 0x21000170, // IS M1 0 ReferencedPrintJobSequencePullStoredPrint = 0x21000500, // SQ M1 1 PrinterStatus = 0x21100010, // CS M1 0 PrinterStatusInfo = 0x21100020, // CS M1 0 PrinterName = 0x21100030, // LO M1 0 PrintQueueID = 0x21100099, // SH M1 1 QueueStatus = 0x21200010, // CS M1 1 PrintJobDescriptionSequence = 0x21200050, // SQ M1 1 ReferencedPrintJobSequence = 0x21200070, // SQ M1 1 PrintManagementCapabilitiesSequence = 0x21300010, // SQ M1 1 PrinterCharacteristicsSequence = 0x21300015, // SQ M1 1 FilmBoxContentSequence = 0x21300030, // SQ M1 1 ImageBoxContentSequence = 0x21300040, // SQ M1 1 AnnotationContentSequence = 0x21300050, // SQ M1 1 ImageOverlayBoxContentSequence = 0x21300060, // SQ M1 1 PresentationLUTContentSequence = 0x21300080, // SQ M1 1 ProposedStudySequence = 0x213000A0, // SQ M1 1 OriginalImageSequence = 0x213000C0, // SQ M1 1 LabelUsingInformationExtractedFromInstances = 0x22000001, // CS M1 0 LabelText = 0x22000002, // UT M1 0 LabelStyleSelection = 0x22000003, // CS M1 0 MediaDisposition = 0x22000004, // LT M1 0 BarcodeValue = 0x22000005, // LT M1 0 BarcodeSymbology = 0x22000006, // CS M1 0 AllowMediaSplitting = 0x22000007, // CS M1 0 IncludeNonDICOMObjects = 0x22000008, // CS M1 0 IncludeDisplayApplication = 0x22000009, // CS M1 0 PreserveCompositeInstancesAfterMediaCreation = 0x2200000A, // CS M1 0 TotalNumberOfPiecesOfMediaCreated = 0x2200000B, // US M1 0 RequestedMediaApplicationProfile = 0x2200000C, // LO M1 0 ReferencedStorageMediaSequence = 0x2200000D, // SQ M1 0 FailureAttributes = 0x2200000E, // AT M1TN 0 AllowLossyCompression = 0x2200000F, // CS M1 0 RequestPriority = 0x22000020, // CS M1 0 RTImageLabel = 0x30020002, // SH M1 0 RTImageName = 0x30020003, // LO M1 0 RTImageDescription = 0x30020004, // ST M1 0 ReportedValuesOrigin = 0x3002000A, // CS M1 0 RTImagePlane = 0x3002000C, // CS M1 0 XRayImageReceptorTranslation = 0x3002000D, // DS M3 0 XRayImageReceptorAngle = 0x3002000E, // DS M1 0 RTImageOrientation = 0x30020010, // DS M6 0 ImagePlanePixelSpacing = 0x30020011, // DS M2 0 RTImagePosition = 0x30020012, // DS M2 0 RadiationMachineName = 0x30020020, // SH M1 0 RadiationMachineSAD = 0x30020022, // DS M1 0 RadiationMachineSSD = 0x30020024, // DS M1 0 RTImageSID = 0x30020026, // DS M1 0 SourceToReferenceObjectDistance = 0x30020028, // DS M1 0 FractionNumber = 0x30020029, // IS M1 0 ExposureSequence = 0x30020030, // SQ M1 0 MetersetExposure = 0x30020032, // DS M1 0 DiaphragmPosition = 0x30020034, // DS M4 0 FluenceMapSequence = 0x30020040, // SQ M1 0 FluenceDataSource = 0x30020041, // CS M1 0 FluenceDataScale = 0x30020042, // DS M1 0 PrimaryFluenceModeSequence = 0x30020050, // SQ M1 0 FluenceMode = 0x30020051, // CS M1 0 FluenceModeID = 0x30020052, // SH M1 0 DVHType = 0x30040001, // CS M1 0 DoseUnits = 0x30040002, // CS M1 0 DoseType = 0x30040004, // CS M1 0 SpatialTransformOfDose = 0x30040005, // CS M1 0 DoseComment = 0x30040006, // LO M1 0 NormalizationPoint = 0x30040008, // DS M3 0 DoseSummationType = 0x3004000A, // CS M1 0 GridFrameOffsetVector = 0x3004000C, // DS M2TN 0 DoseGridScaling = 0x3004000E, // DS M1 0 RTDoseROISequence = 0x30040010, // SQ M1 0 DoseValue = 0x30040012, // DS M1 0 TissueHeterogeneityCorrection = 0x30040014, // CS M1T3 0 DVHNormalizationPoint = 0x30040040, // DS M3 0 DVHNormalizationDoseValue = 0x30040042, // DS M1 0 DVHSequence = 0x30040050, // SQ M1 0 DVHDoseScaling = 0x30040052, // DS M1 0 DVHVolumeUnits = 0x30040054, // CS M1 0 DVHNumberOfBins = 0x30040056, // IS M1 0 DVHData = 0x30040058, // DS M2T2N 0 DVHReferencedROISequence = 0x30040060, // SQ M1 0 DVHROIContributionType = 0x30040062, // CS M1 0 DVHMinimumDose = 0x30040070, // DS M1 0 DVHMaximumDose = 0x30040072, // DS M1 0 DVHMeanDose = 0x30040074, // DS M1 0 StructureSetLabel = 0x30060002, // SH M1 0 StructureSetName = 0x30060004, // LO M1 0 StructureSetDescription = 0x30060006, // ST M1 0 StructureSetDate = 0x30060008, // DA M1 0 StructureSetTime = 0x30060009, // TM M1 0 ReferencedFrameOfReferenceSequence = 0x30060010, // SQ M1 0 RTReferencedStudySequence = 0x30060012, // SQ M1 0 RTReferencedSeriesSequence = 0x30060014, // SQ M1 0 ContourImageSequence = 0x30060016, // SQ M1 0 PredecessorStructureSetSequence = 0x30060018, // SQ M1 0 StructureSetROISequence = 0x30060020, // SQ M1 0 ROINumber = 0x30060022, // IS M1 0 ReferencedFrameOfReferenceUID = 0x30060024, // UI M1 0 ROIName = 0x30060026, // LO M1 0 ROIDescription = 0x30060028, // ST M1 0 ROIDisplayColor = 0x3006002A, // IS M3 0 ROIVolume = 0x3006002C, // DS M1 0 RTRelatedROISequence = 0x30060030, // SQ M1 0 RTROIRelationship = 0x30060033, // CS M1 0 ROIGenerationAlgorithm = 0x30060036, // CS M1 0 ROIDerivationAlgorithmIdentificationSequence = 0x30060037, // SQ M1 0 ROIGenerationDescription = 0x30060038, // LO M1 0 ROIContourSequence = 0x30060039, // SQ M1 0 ContourSequence = 0x30060040, // SQ M1 0 ContourGeometricType = 0x30060042, // CS M1 0 ContourSlabThickness = 0x30060044, // DS M1 0 ContourOffsetVector = 0x30060045, // DS M3 0 NumberOfContourPoints = 0x30060046, // IS M1 0 ContourNumber = 0x30060048, // IS M1 0 AttachedContours = 0x30060049, // IS M1TN 0 ContourData = 0x30060050, // DS M3T3N 0 RTROIObservationsSequence = 0x30060080, // SQ M1 0 ObservationNumber = 0x30060082, // IS M1 0 ReferencedROINumber = 0x30060084, // IS M1 0 ROIObservationLabel = 0x30060085, // SH M1 0 RTROIIdentificationCodeSequence = 0x30060086, // SQ M1 0 ROIObservationDescription = 0x30060088, // ST M1 0 RelatedRTROIObservationsSequence = 0x300600A0, // SQ M1 0 RTROIInterpretedType = 0x300600A4, // CS M1 0 ROIInterpreter = 0x300600A6, // PN M1 0 ROIPhysicalPropertiesSequence = 0x300600B0, // SQ M1 0 ROIPhysicalProperty = 0x300600B2, // CS M1 0 ROIPhysicalPropertyValue = 0x300600B4, // DS M1 0 ROIElementalCompositionSequence = 0x300600B6, // SQ M1 0 ROIElementalCompositionAtomicNumber = 0x300600B7, // US M1 0 ROIElementalCompositionAtomicMassFraction = 0x300600B8, // FL M1 0 AdditionalRTROIIdentificationCodeSequence = 0x300600B9, // SQ M1 1 FrameOfReferenceRelationshipSequence = 0x300600C0, // SQ M1 1 RelatedFrameOfReferenceUID = 0x300600C2, // UI M1 1 FrameOfReferenceTransformationType = 0x300600C4, // CS M1 1 FrameOfReferenceTransformationMatrix = 0x300600C6, // DS M16 0 FrameOfReferenceTransformationComment = 0x300600C8, // LO M1 0 PatientLocationCoordinatesSequence = 0x300600C9, // SQ M1 0 PatientLocationCoordinatesCodeSequence = 0x300600CA, // SQ M1 0 PatientSupportPositionSequence = 0x300600CB, // SQ M1 0 MeasuredDoseReferenceSequence = 0x30080010, // SQ M1 0 MeasuredDoseDescription = 0x30080012, // ST M1 0 MeasuredDoseType = 0x30080014, // CS M1 0 MeasuredDoseValue = 0x30080016, // DS M1 0 TreatmentSessionBeamSequence = 0x30080020, // SQ M1 0 TreatmentSessionIonBeamSequence = 0x30080021, // SQ M1 0 CurrentFractionNumber = 0x30080022, // IS M1 0 TreatmentControlPointDate = 0x30080024, // DA M1 0 TreatmentControlPointTime = 0x30080025, // TM M1 0 TreatmentTerminationStatus = 0x3008002A, // CS M1 0 TreatmentTerminationCode = 0x3008002B, // SH M1 0 TreatmentVerificationStatus = 0x3008002C, // CS M1 0 ReferencedTreatmentRecordSequence = 0x30080030, // SQ M1 0 SpecifiedPrimaryMeterset = 0x30080032, // DS M1 0 SpecifiedSecondaryMeterset = 0x30080033, // DS M1 0 DeliveredPrimaryMeterset = 0x30080036, // DS M1 0 DeliveredSecondaryMeterset = 0x30080037, // DS M1 0 SpecifiedTreatmentTime = 0x3008003A, // DS M1 0 DeliveredTreatmentTime = 0x3008003B, // DS M1 0 ControlPointDeliverySequence = 0x30080040, // SQ M1 0 IonControlPointDeliverySequence = 0x30080041, // SQ M1 0 SpecifiedMeterset = 0x30080042, // DS M1 0 DeliveredMeterset = 0x30080044, // DS M1 0 MetersetRateSet = 0x30080045, // FL M1 0 MetersetRateDelivered = 0x30080046, // FL M1 0 ScanSpotMetersetsDelivered = 0x30080047, // FL M1TN 0 DoseRateDelivered = 0x30080048, // DS M1 0 TreatmentSummaryCalculatedDoseReferenceSequence = 0x30080050, // SQ M1 0 CumulativeDoseToDoseReference = 0x30080052, // DS M1 0 FirstTreatmentDate = 0x30080054, // DA M1 0 MostRecentTreatmentDate = 0x30080056, // DA M1 0 NumberOfFractionsDelivered = 0x3008005A, // IS M1 0 OverrideSequence = 0x30080060, // SQ M1 0 ParameterSequencePointer = 0x30080061, // AT M1 0 OverrideParameterPointer = 0x30080062, // AT M1 0 ParameterItemIndex = 0x30080063, // IS M1 0 MeasuredDoseReferenceNumber = 0x30080064, // IS M1 0 ParameterPointer = 0x30080065, // AT M1 0 OverrideReason = 0x30080066, // ST M1 0 ParameterValueNumber = 0x30080067, // US M1 0 CorrectedParameterSequence = 0x30080068, // SQ M1 0 CorrectionValue = 0x3008006A, // FL M1 0 CalculatedDoseReferenceSequence = 0x30080070, // SQ M1 0 CalculatedDoseReferenceNumber = 0x30080072, // IS M1 0 CalculatedDoseReferenceDescription = 0x30080074, // ST M1 0 CalculatedDoseReferenceDoseValue = 0x30080076, // DS M1 0 StartMeterset = 0x30080078, // DS M1 0 EndMeterset = 0x3008007A, // DS M1 0 ReferencedMeasuredDoseReferenceSequence = 0x30080080, // SQ M1 0 ReferencedMeasuredDoseReferenceNumber = 0x30080082, // IS M1 0 ReferencedCalculatedDoseReferenceSequence = 0x30080090, // SQ M1 0 ReferencedCalculatedDoseReferenceNumber = 0x30080092, // IS M1 0 BeamLimitingDeviceLeafPairsSequence = 0x300800A0, // SQ M1 0 RecordedWedgeSequence = 0x300800B0, // SQ M1 0 RecordedCompensatorSequence = 0x300800C0, // SQ M1 0 RecordedBlockSequence = 0x300800D0, // SQ M1 0 TreatmentSummaryMeasuredDoseReferenceSequence = 0x300800E0, // SQ M1 0 RecordedSnoutSequence = 0x300800F0, // SQ M1 0 RecordedRangeShifterSequence = 0x300800F2, // SQ M1 0 RecordedLateralSpreadingDeviceSequence = 0x300800F4, // SQ M1 0 RecordedRangeModulatorSequence = 0x300800F6, // SQ M1 0 RecordedSourceSequence = 0x30080100, // SQ M1 0 SourceSerialNumber = 0x30080105, // LO M1 0 TreatmentSessionApplicationSetupSequence = 0x30080110, // SQ M1 0 ApplicationSetupCheck = 0x30080116, // CS M1 0 RecordedBrachyAccessoryDeviceSequence = 0x30080120, // SQ M1 0 ReferencedBrachyAccessoryDeviceNumber = 0x30080122, // IS M1 0 RecordedChannelSequence = 0x30080130, // SQ M1 0 SpecifiedChannelTotalTime = 0x30080132, // DS M1 0 DeliveredChannelTotalTime = 0x30080134, // DS M1 0 SpecifiedNumberOfPulses = 0x30080136, // IS M1 0 DeliveredNumberOfPulses = 0x30080138, // IS M1 0 SpecifiedPulseRepetitionInterval = 0x3008013A, // DS M1 0 DeliveredPulseRepetitionInterval = 0x3008013C, // DS M1 0 RecordedSourceApplicatorSequence = 0x30080140, // SQ M1 0 ReferencedSourceApplicatorNumber = 0x30080142, // IS M1 0 RecordedChannelShieldSequence = 0x30080150, // SQ M1 0 ReferencedChannelShieldNumber = 0x30080152, // IS M1 0 BrachyControlPointDeliveredSequence = 0x30080160, // SQ M1 0 SafePositionExitDate = 0x30080162, // DA M1 0 SafePositionExitTime = 0x30080164, // TM M1 0 SafePositionReturnDate = 0x30080166, // DA M1 0 SafePositionReturnTime = 0x30080168, // TM M1 0 PulseSpecificBrachyControlPointDeliveredSequence = 0x30080171, // SQ M1 0 PulseNumber = 0x30080172, // US M1 0 BrachyPulseControlPointDeliveredSequence = 0x30080173, // SQ M1 0 CurrentTreatmentStatus = 0x30080200, // CS M1 0 TreatmentStatusComment = 0x30080202, // ST M1 0 FractionGroupSummarySequence = 0x30080220, // SQ M1 0 ReferencedFractionNumber = 0x30080223, // IS M1 0 FractionGroupType = 0x30080224, // CS M1 0 BeamStopperPosition = 0x30080230, // CS M1 0 FractionStatusSummarySequence = 0x30080240, // SQ M1 0 TreatmentDate = 0x30080250, // DA M1 0 TreatmentTime = 0x30080251, // TM M1 0 RTPlanLabel = 0x300A0002, // SH M1 0 RTPlanName = 0x300A0003, // LO M1 0 RTPlanDescription = 0x300A0004, // ST M1 0 RTPlanDate = 0x300A0006, // DA M1 0 RTPlanTime = 0x300A0007, // TM M1 0 TreatmentProtocols = 0x300A0009, // LO M1TN 0 PlanIntent = 0x300A000A, // CS M1 0 TreatmentSites = 0x300A000B, // LO M1TN 0 RTPlanGeometry = 0x300A000C, // CS M1 0 PrescriptionDescription = 0x300A000E, // ST M1 0 DoseReferenceSequence = 0x300A0010, // SQ M1 0 DoseReferenceNumber = 0x300A0012, // IS M1 0 DoseReferenceUID = 0x300A0013, // UI M1 0 DoseReferenceStructureType = 0x300A0014, // CS M1 0 NominalBeamEnergyUnit = 0x300A0015, // CS M1 0 DoseReferenceDescription = 0x300A0016, // LO M1 0 DoseReferencePointCoordinates = 0x300A0018, // DS M3 0 NominalPriorDose = 0x300A001A, // DS M1 0 DoseReferenceType = 0x300A0020, // CS M1 0 ConstraintWeight = 0x300A0021, // DS M1 0 DeliveryWarningDose = 0x300A0022, // DS M1 0 DeliveryMaximumDose = 0x300A0023, // DS M1 0 TargetMinimumDose = 0x300A0025, // DS M1 0 TargetPrescriptionDose = 0x300A0026, // DS M1 0 TargetMaximumDose = 0x300A0027, // DS M1 0 TargetUnderdoseVolumeFraction = 0x300A0028, // DS M1 0 OrganAtRiskFullVolumeDose = 0x300A002A, // DS M1 0 OrganAtRiskLimitDose = 0x300A002B, // DS M1 0 OrganAtRiskMaximumDose = 0x300A002C, // DS M1 0 OrganAtRiskOverdoseVolumeFraction = 0x300A002D, // DS M1 0 ToleranceTableSequence = 0x300A0040, // SQ M1 0 ToleranceTableNumber = 0x300A0042, // IS M1 0 ToleranceTableLabel = 0x300A0043, // SH M1 0 GantryAngleTolerance = 0x300A0044, // DS M1 0 BeamLimitingDeviceAngleTolerance = 0x300A0046, // DS M1 0 BeamLimitingDeviceToleranceSequence = 0x300A0048, // SQ M1 0 BeamLimitingDevicePositionTolerance = 0x300A004A, // DS M1 0 SnoutPositionTolerance = 0x300A004B, // FL M1 0 PatientSupportAngleTolerance = 0x300A004C, // DS M1 0 TableTopEccentricAngleTolerance = 0x300A004E, // DS M1 0 TableTopPitchAngleTolerance = 0x300A004F, // FL M1 0 TableTopRollAngleTolerance = 0x300A0050, // FL M1 0 TableTopVerticalPositionTolerance = 0x300A0051, // DS M1 0 TableTopLongitudinalPositionTolerance = 0x300A0052, // DS M1 0 TableTopLateralPositionTolerance = 0x300A0053, // DS M1 0 RTPlanRelationship = 0x300A0055, // CS M1 0 FractionGroupSequence = 0x300A0070, // SQ M1 0 FractionGroupNumber = 0x300A0071, // IS M1 0 FractionGroupDescription = 0x300A0072, // LO M1 0 NumberOfFractionsPlanned = 0x300A0078, // IS M1 0 NumberOfFractionPatternDigitsPerDay = 0x300A0079, // IS M1 0 RepeatFractionCycleLength = 0x300A007A, // IS M1 0 FractionPattern = 0x300A007B, // LT M1 0 NumberOfBeams = 0x300A0080, // IS M1 0 BeamDoseSpecificationPoint = 0x300A0082, // DS M3 1 ReferencedDoseReferenceUID = 0x300A0083, // UI M1 0 BeamDose = 0x300A0084, // DS M1 0 BeamMeterset = 0x300A0086, // DS M1 0 BeamDosePointDepth = 0x300A0088, // FL M1 0 BeamDosePointEquivalentDepth = 0x300A0089, // FL M1 0 BeamDosePointSSD = 0x300A008A, // FL M1 0 BeamDoseMeaning = 0x300A008B, // CS M1 0 BeamDoseVerificationControlPointSequence = 0x300A008C, // SQ M1 0 AverageBeamDosePointDepth = 0x300A008D, // FL M1 1 AverageBeamDosePointEquivalentDepth = 0x300A008E, // FL M1 1 AverageBeamDosePointSSD = 0x300A008F, // FL M1 1 BeamDoseType = 0x300A0090, // CS M1 0 AlternateBeamDose = 0x300A0091, // DS M1 0 AlternateBeamDoseType = 0x300A0092, // CS M1 0 DepthValueAveragingFlag = 0x300A0093, // CS M1 0 BeamDosePointSourceToExternalContourDistance = 0x300A0094, // DS M1 0 NumberOfBrachyApplicationSetups = 0x300A00A0, // IS M1 0 BrachyApplicationSetupDoseSpecificationPoint = 0x300A00A2, // DS M3 0 BrachyApplicationSetupDose = 0x300A00A4, // DS M1 0 BeamSequence = 0x300A00B0, // SQ M1 0 TreatmentMachineName = 0x300A00B2, // SH M1 0 PrimaryDosimeterUnit = 0x300A00B3, // CS M1 0 SourceAxisDistance = 0x300A00B4, // DS M1 0 BeamLimitingDeviceSequence = 0x300A00B6, // SQ M1 0 RTBeamLimitingDeviceType = 0x300A00B8, // CS M1 0 SourceToBeamLimitingDeviceDistance = 0x300A00BA, // DS M1 0 IsocenterToBeamLimitingDeviceDistance = 0x300A00BB, // FL M1 0 NumberOfLeafJawPairs = 0x300A00BC, // IS M1 0 LeafPositionBoundaries = 0x300A00BE, // DS M3TN 0 BeamNumber = 0x300A00C0, // IS M1 0 BeamName = 0x300A00C2, // LO M1 0 BeamDescription = 0x300A00C3, // ST M1 0 BeamType = 0x300A00C4, // CS M1 0 BeamDeliveryDurationLimit = 0x300A00C5, // FD M1 0 RadiationType = 0x300A00C6, // CS M1 0 HighDoseTechniqueType = 0x300A00C7, // CS M1 0 ReferenceImageNumber = 0x300A00C8, // IS M1 0 PlannedVerificationImageSequence = 0x300A00CA, // SQ M1 0 ImagingDeviceSpecificAcquisitionParameters = 0x300A00CC, // LO M1TN 0 TreatmentDeliveryType = 0x300A00CE, // CS M1 0 NumberOfWedges = 0x300A00D0, // IS M1 0 WedgeSequence = 0x300A00D1, // SQ M1 0 WedgeNumber = 0x300A00D2, // IS M1 0 WedgeType = 0x300A00D3, // CS M1 0 WedgeID = 0x300A00D4, // SH M1 0 WedgeAngle = 0x300A00D5, // IS M1 0 WedgeFactor = 0x300A00D6, // DS M1 0 TotalWedgeTrayWaterEquivalentThickness = 0x300A00D7, // FL M1 0 WedgeOrientation = 0x300A00D8, // DS M1 0 IsocenterToWedgeTrayDistance = 0x300A00D9, // FL M1 0 SourceToWedgeTrayDistance = 0x300A00DA, // DS M1 0 WedgeThinEdgePosition = 0x300A00DB, // FL M1 0 BolusID = 0x300A00DC, // SH M1 0 BolusDescription = 0x300A00DD, // ST M1 0 EffectiveWedgeAngle = 0x300A00DE, // DS M1 0 NumberOfCompensators = 0x300A00E0, // IS M1 0 MaterialID = 0x300A00E1, // SH M1 0 TotalCompensatorTrayFactor = 0x300A00E2, // DS M1 0 CompensatorSequence = 0x300A00E3, // SQ M1 0 CompensatorNumber = 0x300A00E4, // IS M1 0 CompensatorID = 0x300A00E5, // SH M1 0 SourceToCompensatorTrayDistance = 0x300A00E6, // DS M1 0 CompensatorRows = 0x300A00E7, // IS M1 0 CompensatorColumns = 0x300A00E8, // IS M1 0 CompensatorPixelSpacing = 0x300A00E9, // DS M2 0 CompensatorPosition = 0x300A00EA, // DS M2 0 CompensatorTransmissionData = 0x300A00EB, // DS M1TN 0 CompensatorThicknessData = 0x300A00EC, // DS M1TN 0 NumberOfBoli = 0x300A00ED, // IS M1 0 CompensatorType = 0x300A00EE, // CS M1 0 CompensatorTrayID = 0x300A00EF, // SH M1 0 NumberOfBlocks = 0x300A00F0, // IS M1 0 TotalBlockTrayFactor = 0x300A00F2, // DS M1 0 TotalBlockTrayWaterEquivalentThickness = 0x300A00F3, // FL M1 0 BlockSequence = 0x300A00F4, // SQ M1 0 BlockTrayID = 0x300A00F5, // SH M1 0 SourceToBlockTrayDistance = 0x300A00F6, // DS M1 0 IsocenterToBlockTrayDistance = 0x300A00F7, // FL M1 0 BlockType = 0x300A00F8, // CS M1 0 AccessoryCode = 0x300A00F9, // LO M1 0 BlockDivergence = 0x300A00FA, // CS M1 0 BlockMountingPosition = 0x300A00FB, // CS M1 0 BlockNumber = 0x300A00FC, // IS M1 0 BlockName = 0x300A00FE, // LO M1 0 BlockThickness = 0x300A0100, // DS M1 0 BlockTransmission = 0x300A0102, // DS M1 0 BlockNumberOfPoints = 0x300A0104, // IS M1 0 BlockData = 0x300A0106, // DS M2T2N 0 ApplicatorSequence = 0x300A0107, // SQ M1 0 ApplicatorID = 0x300A0108, // SH M1 0 ApplicatorType = 0x300A0109, // CS M1 0 ApplicatorDescription = 0x300A010A, // LO M1 0 CumulativeDoseReferenceCoefficient = 0x300A010C, // DS M1 0 FinalCumulativeMetersetWeight = 0x300A010E, // DS M1 0 NumberOfControlPoints = 0x300A0110, // IS M1 0 ControlPointSequence = 0x300A0111, // SQ M1 0 ControlPointIndex = 0x300A0112, // IS M1 0 NominalBeamEnergy = 0x300A0114, // DS M1 0 DoseRateSet = 0x300A0115, // DS M1 0 WedgePositionSequence = 0x300A0116, // SQ M1 0 WedgePosition = 0x300A0118, // CS M1 0 BeamLimitingDevicePositionSequence = 0x300A011A, // SQ M1 0 LeafJawPositions = 0x300A011C, // DS M2T2N 0 GantryAngle = 0x300A011E, // DS M1 0 GantryRotationDirection = 0x300A011F, // CS M1 0 BeamLimitingDeviceAngle = 0x300A0120, // DS M1 0 BeamLimitingDeviceRotationDirection = 0x300A0121, // CS M1 0 PatientSupportAngle = 0x300A0122, // DS M1 0 PatientSupportRotationDirection = 0x300A0123, // CS M1 0 TableTopEccentricAxisDistance = 0x300A0124, // DS M1 0 TableTopEccentricAngle = 0x300A0125, // DS M1 0 TableTopEccentricRotationDirection = 0x300A0126, // CS M1 0 TableTopVerticalPosition = 0x300A0128, // DS M1 0 TableTopLongitudinalPosition = 0x300A0129, // DS M1 0 TableTopLateralPosition = 0x300A012A, // DS M1 0 IsocenterPosition = 0x300A012C, // DS M3 0 SurfaceEntryPoint = 0x300A012E, // DS M3 0 SourceToSurfaceDistance = 0x300A0130, // DS M1 0 AverageBeamDosePointSourceToExternalContourDistance = 0x300A0131, // FL M1 0 SourceToExternalContourDistance = 0x300A0132, // FL M1 0 ExternalContourEntryPoint = 0x300A0133, // FL M3 0 CumulativeMetersetWeight = 0x300A0134, // DS M1 0 TableTopPitchAngle = 0x300A0140, // FL M1 0 TableTopPitchRotationDirection = 0x300A0142, // CS M1 0 TableTopRollAngle = 0x300A0144, // FL M1 0 TableTopRollRotationDirection = 0x300A0146, // CS M1 0 HeadFixationAngle = 0x300A0148, // FL M1 0 GantryPitchAngle = 0x300A014A, // FL M1 0 GantryPitchRotationDirection = 0x300A014C, // CS M1 0 GantryPitchAngleTolerance = 0x300A014E, // FL M1 0 FixationEye = 0x300A0150, // CS M1 0 ChairHeadFramePosition = 0x300A0151, // DS M1 0 HeadFixationAngleTolerance = 0x300A0152, // DS M1 0 ChairHeadFramePositionTolerance = 0x300A0153, // DS M1 0 FixationLightAzimuthalAngleTolerance = 0x300A0154, // DS M1 0 FixationLightPolarAngleTolerance = 0x300A0155, // DS M1 0 PatientSetupSequence = 0x300A0180, // SQ M1 0 PatientSetupNumber = 0x300A0182, // IS M1 0 PatientSetupLabel = 0x300A0183, // LO M1 0 PatientAdditionalPosition = 0x300A0184, // LO M1 0 FixationDeviceSequence = 0x300A0190, // SQ M1 0 FixationDeviceType = 0x300A0192, // CS M1 0 FixationDeviceLabel = 0x300A0194, // SH M1 0 FixationDeviceDescription = 0x300A0196, // ST M1 0 FixationDevicePosition = 0x300A0198, // SH M1 0 FixationDevicePitchAngle = 0x300A0199, // FL M1 0 FixationDeviceRollAngle = 0x300A019A, // FL M1 0 ShieldingDeviceSequence = 0x300A01A0, // SQ M1 0 ShieldingDeviceType = 0x300A01A2, // CS M1 0 ShieldingDeviceLabel = 0x300A01A4, // SH M1 0 ShieldingDeviceDescription = 0x300A01A6, // ST M1 0 ShieldingDevicePosition = 0x300A01A8, // SH M1 0 SetupTechnique = 0x300A01B0, // CS M1 0 SetupTechniqueDescription = 0x300A01B2, // ST M1 0 SetupDeviceSequence = 0x300A01B4, // SQ M1 0 SetupDeviceType = 0x300A01B6, // CS M1 0 SetupDeviceLabel = 0x300A01B8, // SH M1 0 SetupDeviceDescription = 0x300A01BA, // ST M1 0 SetupDeviceParameter = 0x300A01BC, // DS M1 0 SetupReferenceDescription = 0x300A01D0, // ST M1 0 TableTopVerticalSetupDisplacement = 0x300A01D2, // DS M1 0 TableTopLongitudinalSetupDisplacement = 0x300A01D4, // DS M1 0 TableTopLateralSetupDisplacement = 0x300A01D6, // DS M1 0 BrachyTreatmentTechnique = 0x300A0200, // CS M1 0 BrachyTreatmentType = 0x300A0202, // CS M1 0 TreatmentMachineSequence = 0x300A0206, // SQ M1 0 SourceSequence = 0x300A0210, // SQ M1 0 SourceNumber = 0x300A0212, // IS M1 0 SourceType = 0x300A0214, // CS M1 0 SourceManufacturer = 0x300A0216, // LO M1 0 ActiveSourceDiameter = 0x300A0218, // DS M1 0 ActiveSourceLength = 0x300A021A, // DS M1 0 SourceModelID = 0x300A021B, // SH M1 0 SourceDescription = 0x300A021C, // LO M1 0 SourceEncapsulationNominalThickness = 0x300A0222, // DS M1 0 SourceEncapsulationNominalTransmission = 0x300A0224, // DS M1 0 SourceIsotopeName = 0x300A0226, // LO M1 0 SourceIsotopeHalfLife = 0x300A0228, // DS M1 0 SourceStrengthUnits = 0x300A0229, // CS M1 0 ReferenceAirKermaRate = 0x300A022A, // DS M1 0 SourceStrength = 0x300A022B, // DS M1 0 SourceStrengthReferenceDate = 0x300A022C, // DA M1 0 SourceStrengthReferenceTime = 0x300A022E, // TM M1 0 ApplicationSetupSequence = 0x300A0230, // SQ M1 0 ApplicationSetupType = 0x300A0232, // CS M1 0 ApplicationSetupNumber = 0x300A0234, // IS M1 0 ApplicationSetupName = 0x300A0236, // LO M1 0 ApplicationSetupManufacturer = 0x300A0238, // LO M1 0 TemplateNumber = 0x300A0240, // IS M1 0 TemplateType = 0x300A0242, // SH M1 0 TemplateName = 0x300A0244, // LO M1 0 TotalReferenceAirKerma = 0x300A0250, // DS M1 0 BrachyAccessoryDeviceSequence = 0x300A0260, // SQ M1 0 BrachyAccessoryDeviceNumber = 0x300A0262, // IS M1 0 BrachyAccessoryDeviceID = 0x300A0263, // SH M1 0 BrachyAccessoryDeviceType = 0x300A0264, // CS M1 0 BrachyAccessoryDeviceName = 0x300A0266, // LO M1 0 BrachyAccessoryDeviceNominalThickness = 0x300A026A, // DS M1 0 BrachyAccessoryDeviceNominalTransmission = 0x300A026C, // DS M1 0 ChannelEffectiveLength = 0x300A0271, // DS M1 0 ChannelInnerLength = 0x300A0272, // DS M1 0 AfterloaderChannelID = 0x300A0273, // SH M1 0 SourceApplicatorTipLength = 0x300A0274, // DS M1 0 ChannelSequence = 0x300A0280, // SQ M1 0 ChannelNumber = 0x300A0282, // IS M1 0 ChannelLength = 0x300A0284, // DS M1 0 ChannelTotalTime = 0x300A0286, // DS M1 0 SourceMovementType = 0x300A0288, // CS M1 0 NumberOfPulses = 0x300A028A, // IS M1 0 PulseRepetitionInterval = 0x300A028C, // DS M1 0 SourceApplicatorNumber = 0x300A0290, // IS M1 0 SourceApplicatorID = 0x300A0291, // SH M1 0 SourceApplicatorType = 0x300A0292, // CS M1 0 SourceApplicatorName = 0x300A0294, // LO M1 0 SourceApplicatorLength = 0x300A0296, // DS M1 0 SourceApplicatorManufacturer = 0x300A0298, // LO M1 0 SourceApplicatorWallNominalThickness = 0x300A029C, // DS M1 0 SourceApplicatorWallNominalTransmission = 0x300A029E, // DS M1 0 SourceApplicatorStepSize = 0x300A02A0, // DS M1 0 TransferTubeNumber = 0x300A02A2, // IS M1 0 TransferTubeLength = 0x300A02A4, // DS M1 0 ChannelShieldSequence = 0x300A02B0, // SQ M1 0 ChannelShieldNumber = 0x300A02B2, // IS M1 0 ChannelShieldID = 0x300A02B3, // SH M1 0 ChannelShieldName = 0x300A02B4, // LO M1 0 ChannelShieldNominalThickness = 0x300A02B8, // DS M1 0 ChannelShieldNominalTransmission = 0x300A02BA, // DS M1 0 FinalCumulativeTimeWeight = 0x300A02C8, // DS M1 0 BrachyControlPointSequence = 0x300A02D0, // SQ M1 0 ControlPointRelativePosition = 0x300A02D2, // DS M1 0 ControlPoint3DPosition = 0x300A02D4, // DS M3 0 CumulativeTimeWeight = 0x300A02D6, // DS M1 0 CompensatorDivergence = 0x300A02E0, // CS M1 0 CompensatorMountingPosition = 0x300A02E1, // CS M1 0 SourceToCompensatorDistance = 0x300A02E2, // DS M1TN 0 TotalCompensatorTrayWaterEquivalentThickness = 0x300A02E3, // FL M1 0 IsocenterToCompensatorTrayDistance = 0x300A02E4, // FL M1 0 CompensatorColumnOffset = 0x300A02E5, // FL M1 0 IsocenterToCompensatorDistances = 0x300A02E6, // FL M1TN 0 CompensatorRelativeStoppingPowerRatio = 0x300A02E7, // FL M1 0 CompensatorMillingToolDiameter = 0x300A02E8, // FL M1 0 IonRangeCompensatorSequence = 0x300A02EA, // SQ M1 0 CompensatorDescription = 0x300A02EB, // LT M1 0 RadiationMassNumber = 0x300A0302, // IS M1 0 RadiationAtomicNumber = 0x300A0304, // IS M1 0 RadiationChargeState = 0x300A0306, // SS M1 0 ScanMode = 0x300A0308, // CS M1 0 ModulatedScanModeType = 0x300A0309, // CS M1 0 VirtualSourceAxisDistances = 0x300A030A, // FL M2 0 SnoutSequence = 0x300A030C, // SQ M1 0 SnoutPosition = 0x300A030D, // FL M1 0 SnoutID = 0x300A030F, // SH M1 0 NumberOfRangeShifters = 0x300A0312, // IS M1 0 RangeShifterSequence = 0x300A0314, // SQ M1 0 RangeShifterNumber = 0x300A0316, // IS M1 0 RangeShifterID = 0x300A0318, // SH M1 0 RangeShifterType = 0x300A0320, // CS M1 0 RangeShifterDescription = 0x300A0322, // LO M1 0 NumberOfLateralSpreadingDevices = 0x300A0330, // IS M1 0 LateralSpreadingDeviceSequence = 0x300A0332, // SQ M1 0 LateralSpreadingDeviceNumber = 0x300A0334, // IS M1 0 LateralSpreadingDeviceID = 0x300A0336, // SH M1 0 LateralSpreadingDeviceType = 0x300A0338, // CS M1 0 LateralSpreadingDeviceDescription = 0x300A033A, // LO M1 0 LateralSpreadingDeviceWaterEquivalentThickness = 0x300A033C, // FL M1 0 NumberOfRangeModulators = 0x300A0340, // IS M1 0 RangeModulatorSequence = 0x300A0342, // SQ M1 0 RangeModulatorNumber = 0x300A0344, // IS M1 0 RangeModulatorID = 0x300A0346, // SH M1 0 RangeModulatorType = 0x300A0348, // CS M1 0 RangeModulatorDescription = 0x300A034A, // LO M1 0 BeamCurrentModulationID = 0x300A034C, // SH M1 0 PatientSupportType = 0x300A0350, // CS M1 0 PatientSupportID = 0x300A0352, // SH M1 0 PatientSupportAccessoryCode = 0x300A0354, // LO M1 0 TrayAccessoryCode = 0x300A0355, // LO M1 0 FixationLightAzimuthalAngle = 0x300A0356, // FL M1 0 FixationLightPolarAngle = 0x300A0358, // FL M1 0 MetersetRate = 0x300A035A, // FL M1 0 RangeShifterSettingsSequence = 0x300A0360, // SQ M1 0 RangeShifterSetting = 0x300A0362, // LO M1 0 IsocenterToRangeShifterDistance = 0x300A0364, // FL M1 0 RangeShifterWaterEquivalentThickness = 0x300A0366, // FL M1 0 LateralSpreadingDeviceSettingsSequence = 0x300A0370, // SQ M1 0 LateralSpreadingDeviceSetting = 0x300A0372, // LO M1 0 IsocenterToLateralSpreadingDeviceDistance = 0x300A0374, // FL M1 0 RangeModulatorSettingsSequence = 0x300A0380, // SQ M1 0 RangeModulatorGatingStartValue = 0x300A0382, // FL M1 0 RangeModulatorGatingStopValue = 0x300A0384, // FL M1 0 RangeModulatorGatingStartWaterEquivalentThickness = 0x300A0386, // FL M1 0 RangeModulatorGatingStopWaterEquivalentThickness = 0x300A0388, // FL M1 0 IsocenterToRangeModulatorDistance = 0x300A038A, // FL M1 0 ScanSpotTimeOffset = 0x300A038F, // FL M1TN 0 ScanSpotTuneID = 0x300A0390, // SH M1 0 ScanSpotPrescribedIndices = 0x300A0391, // IS M1TN 0 NumberOfScanSpotPositions = 0x300A0392, // IS M1 0 ScanSpotReordered = 0x300A0393, // CS M1 0 ScanSpotPositionMap = 0x300A0394, // FL M1TN 0 ScanSpotReorderingAllowed = 0x300A0395, // CS M1 0 ScanSpotMetersetWeights = 0x300A0396, // FL M1TN 0 ScanningSpotSize = 0x300A0398, // FL M2 0 NumberOfPaintings = 0x300A039A, // IS M1 0 IonToleranceTableSequence = 0x300A03A0, // SQ M1 0 IonBeamSequence = 0x300A03A2, // SQ M1 0 IonBeamLimitingDeviceSequence = 0x300A03A4, // SQ M1 0 IonBlockSequence = 0x300A03A6, // SQ M1 0 IonControlPointSequence = 0x300A03A8, // SQ M1 0 IonWedgeSequence = 0x300A03AA, // SQ M1 0 IonWedgePositionSequence = 0x300A03AC, // SQ M1 0 ReferencedSetupImageSequence = 0x300A0401, // SQ M1 0 SetupImageComment = 0x300A0402, // ST M1 0 MotionSynchronizationSequence = 0x300A0410, // SQ M1 0 ControlPointOrientation = 0x300A0412, // FL M3 0 GeneralAccessorySequence = 0x300A0420, // SQ M1 0 GeneralAccessoryID = 0x300A0421, // SH M1 0 GeneralAccessoryDescription = 0x300A0422, // ST M1 0 GeneralAccessoryType = 0x300A0423, // CS M1 0 GeneralAccessoryNumber = 0x300A0424, // IS M1 0 SourceToGeneralAccessoryDistance = 0x300A0425, // FL M1 0 ApplicatorGeometrySequence = 0x300A0431, // SQ M1 0 ApplicatorApertureShape = 0x300A0432, // CS M1 0 ApplicatorOpening = 0x300A0433, // FL M1 0 ApplicatorOpeningX = 0x300A0434, // FL M1 0 ApplicatorOpeningY = 0x300A0435, // FL M1 0 SourceToApplicatorMountingPositionDistance = 0x300A0436, // FL M1 0 NumberOfBlockSlabItems = 0x300A0440, // IS M1 0 BlockSlabSequence = 0x300A0441, // SQ M1 0 BlockSlabThickness = 0x300A0442, // DS M1 0 BlockSlabNumber = 0x300A0443, // US M1 0 DeviceMotionControlSequence = 0x300A0450, // SQ M1 0 DeviceMotionExecutionMode = 0x300A0451, // CS M1 0 DeviceMotionObservationMode = 0x300A0452, // CS M1 0 DeviceMotionParameterCodeSequence = 0x300A0453, // SQ M1 0 DistalDepthFraction = 0x300A0501, // FL M1 0 DistalDepth = 0x300A0502, // FL M1 0 NominalRangeModulationFractions = 0x300A0503, // FL M2 0 NominalRangeModulatedRegionDepths = 0x300A0504, // FL M2 0 DepthDoseParametersSequence = 0x300A0505, // SQ M1 0 DeliveredDepthDoseParametersSequence = 0x300A0506, // SQ M1 0 DeliveredDistalDepthFraction = 0x300A0507, // FL M1 0 DeliveredDistalDepth = 0x300A0508, // FL M1 0 DeliveredNominalRangeModulationFractions = 0x300A0509, // FL M2 0 DeliveredNominalRangeModulatedRegionDepths = 0x300A0510, // FL M2 0 DeliveredReferenceDoseDefinition = 0x300A0511, // CS M1 0 ReferenceDoseDefinition = 0x300A0512, // CS M1 0 RTControlPointIndex = 0x300A0600, // US M1 0 RadiationGenerationModeIndex = 0x300A0601, // US M1 0 ReferencedDefinedDeviceIndex = 0x300A0602, // US M1 0 RadiationDoseIdentificationIndex = 0x300A0603, // US M1 0 NumberOfRTControlPoints = 0x300A0604, // US M1 0 ReferencedRadiationGenerationModeIndex = 0x300A0605, // US M1 0 TreatmentPositionIndex = 0x300A0606, // US M1 0 ReferencedDeviceIndex = 0x300A0607, // US M1 0 TreatmentPositionGroupLabel = 0x300A0608, // LO M1 0 TreatmentPositionGroupUID = 0x300A0609, // UI M1 0 TreatmentPositionGroupSequence = 0x300A060A, // SQ M1 0 ReferencedTreatmentPositionIndex = 0x300A060B, // US M1 0 ReferencedRadiationDoseIdentificationIndex = 0x300A060C, // US M1 0 RTAccessoryHolderWaterEquivalentThickness = 0x300A060D, // FD M1 0 ReferencedRTAccessoryHolderDeviceIndex = 0x300A060E, // US M1 0 RTAccessoryHolderSlotExistenceFlag = 0x300A060F, // CS M1 0 RTAccessoryHolderSlotSequence = 0x300A0610, // SQ M1 0 RTAccessoryHolderSlotID = 0x300A0611, // LO M1 0 RTAccessoryHolderSlotDistance = 0x300A0612, // FD M1 0 RTAccessorySlotDistance = 0x300A0613, // FD M1 0 RTAccessoryHolderDefinitionSequence = 0x300A0614, // SQ M1 0 RTAccessoryDeviceSlotID = 0x300A0615, // LO M1 0 RTRadiationSequence = 0x300A0616, // SQ M1 0 RadiationDoseSequence = 0x300A0617, // SQ M1 0 RadiationDoseIdentificationSequence = 0x300A0618, // SQ M1 0 RadiationDoseIdentificationLabel = 0x300A0619, // LO M1 0 ReferenceDoseType = 0x300A061A, // CS M1 0 PrimaryDoseValueIndicator = 0x300A061B, // CS M1 0 DoseValuesSequence = 0x300A061C, // SQ M1 0 DoseValuePurpose = 0x300A061D, // CS M1TN 0 ReferenceDosePointCoordinates = 0x300A061E, // FD M3 0 RadiationDoseValuesParametersSequence = 0x300A061F, // SQ M1 0 MetersetToDoseMappingSequence = 0x300A0620, // SQ M1 0 ExpectedInVivoMeasurementValuesSequence = 0x300A0621, // SQ M1 0 ExpectedInVivoMeasurementValueIndex = 0x300A0622, // US M1 0 RadiationDoseInVivoMeasurementLabel = 0x300A0623, // LO M1 0 RadiationDoseCentralAxisDisplacement = 0x300A0624, // FD M2 0 RadiationDoseValue = 0x300A0625, // FD M1 0 RadiationDoseSourceToSkinDistance = 0x300A0626, // FD M1 0 RadiationDoseMeasurementPointCoordinates = 0x300A0627, // FD M3 0 RadiationDoseSourceToExternalContourDistance = 0x300A0628, // FD M1 0 RTToleranceSetSequence = 0x300A0629, // SQ M1 0 RTToleranceSetLabel = 0x300A062A, // LO M1 0 AttributeToleranceValuesSequence = 0x300A062B, // SQ M1 0 ToleranceValue = 0x300A062C, // FD M1 0 PatientSupportPositionToleranceSequence = 0x300A062D, // SQ M1 0 TreatmentTimeLimit = 0x300A062E, // FD M1 0 CArmPhotonElectronControlPointSequence = 0x300A062F, // SQ M1 0 ReferencedRTRadiationSequence = 0x300A0630, // SQ M1 0 ReferencedRTInstanceSequence = 0x300A0631, // SQ M1 0 ReferencedRTPatientSetupSequence = 0x300A0632, // SQ M1 0 SourceToPatientSurfaceDistance = 0x300A0634, // FD M1 0 TreatmentMachineSpecialModeCodeSequence = 0x300A0635, // SQ M1 0 IntendedNumberOfFractions = 0x300A0636, // US M1 0 RTRadiationSetIntent = 0x300A0637, // CS M1 0 RTRadiationPhysicalAndGeometricContentDetailFlag = 0x300A0638, // CS M1 0 RTRecordFlag = 0x300A0639, // CS M1 0 TreatmentDeviceIdentificationSequence = 0x300A063A, // SQ M1 0 ReferencedRTPhysicianIntentSequence = 0x300A063B, // SQ M1 0 CumulativeMeterset = 0x300A063C, // FD M1 0 DeliveryRate = 0x300A063D, // FD M1 0 DeliveryRateUnitSequence = 0x300A063E, // SQ M1 0 TreatmentPositionSequence = 0x300A063F, // SQ M1 0 RadiationSourceAxisDistance = 0x300A0640, // FD M1 0 NumberOfRTBeamLimitingDevices = 0x300A0641, // US M1 0 RTBeamLimitingDeviceProximalDistance = 0x300A0642, // FD M1 0 RTBeamLimitingDeviceDistalDistance = 0x300A0643, // FD M1 0 ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence = 0x300A0644, // SQ M1 0 BeamModifierOrientationAngle = 0x300A0645, // FD M1 0 FixedRTBeamDelimiterDeviceSequence = 0x300A0646, // SQ M1 0 ParallelRTBeamDelimiterDeviceSequence = 0x300A0647, // SQ M1 0 NumberOfParallelRTBeamDelimiters = 0x300A0648, // US M1 0 ParallelRTBeamDelimiterBoundaries = 0x300A0649, // FD M2TN 0 ParallelRTBeamDelimiterPositions = 0x300A064A, // FD M2TN 0 RTBeamLimitingDeviceOffset = 0x300A064B, // FD M2 0 RTBeamDelimiterGeometrySequence = 0x300A064C, // SQ M1 0 RTBeamLimitingDeviceDefinitionSequence = 0x300A064D, // SQ M1 0 ParallelRTBeamDelimiterOpeningMode = 0x300A064E, // CS M1 0 ParallelRTBeamDelimiterLeafMountingSide = 0x300A064F, // CS M1TN 0 PatientSetupUID = 0x300A0650, // UI M1 0 WedgeDefinitionSequence = 0x300A0651, // SQ M1 0 RadiationBeamWedgeAngle = 0x300A0652, // FD M1 0 RadiationBeamWedgeThinEdgeDistance = 0x300A0653, // FD M1 0 RadiationBeamEffectiveWedgeAngle = 0x300A0654, // FD M1 0 NumberOfWedgePositions = 0x300A0655, // US M1 0 RTBeamLimitingDeviceOpeningSequence = 0x300A0656, // SQ M1 0 NumberOfRTBeamLimitingDeviceOpenings = 0x300A0657, // US M1 0 RadiationDosimeterUnitSequence = 0x300A0658, // SQ M1 0 RTDeviceDistanceReferenceLocationCodeSequence = 0x300A0659, // SQ M1 0 RadiationDeviceConfigurationAndCommissioningKeySequence = 0x300A065A, // SQ M1 0 PatientSupportPositionParameterSequence = 0x300A065B, // SQ M1 0 PatientSupportPositionSpecificationMethod = 0x300A065C, // CS M1 0 PatientSupportPositionDeviceParameterSequence = 0x300A065D, // SQ M1 0 DeviceOrderIndex = 0x300A065E, // US M1 0 PatientSupportPositionParameterOrderIndex = 0x300A065F, // US M1 0 PatientSupportPositionDeviceToleranceSequence = 0x300A0660, // SQ M1 0 PatientSupportPositionToleranceOrderIndex = 0x300A0661, // US M1 0 CompensatorDefinitionSequence = 0x300A0662, // SQ M1 0 CompensatorMapOrientation = 0x300A0663, // CS M1 0 CompensatorProximalThicknessMap = 0x300A0664, // OF M1 0 CompensatorDistalThicknessMap = 0x300A0665, // OF M1 0 CompensatorBasePlaneOffset = 0x300A0666, // FD M1 0 CompensatorShapeFabricationCodeSequence = 0x300A0667, // SQ M1 0 CompensatorShapeSequence = 0x300A0668, // SQ M1 0 RadiationBeamCompensatorMillingToolDiameter = 0x300A0669, // FD M1 0 BlockDefinitionSequence = 0x300A066A, // SQ M1 0 BlockEdgeData = 0x300A066B, // OF M1 0 BlockOrientation = 0x300A066C, // CS M1 0 RadiationBeamBlockThickness = 0x300A066D, // FD M1 0 RadiationBeamBlockSlabThickness = 0x300A066E, // FD M1 0 BlockEdgeDataSequence = 0x300A066F, // SQ M1 0 NumberOfRTAccessoryHolders = 0x300A0670, // US M1 0 GeneralAccessoryDefinitionSequence = 0x300A0671, // SQ M1 0 NumberOfGeneralAccessories = 0x300A0672, // US M1 0 BolusDefinitionSequence = 0x300A0673, // SQ M1 0 NumberOfBoluses = 0x300A0674, // US M1 0 EquipmentFrameOfReferenceUID = 0x300A0675, // UI M1 0 EquipmentFrameOfReferenceDescription = 0x300A0676, // ST M1 0 EquipmentReferencePointCoordinatesSequence = 0x300A0677, // SQ M1 0 EquipmentReferencePointCodeSequence = 0x300A0678, // SQ M1 0 RTBeamLimitingDeviceAngle = 0x300A0679, // FD M1 0 SourceRollAngle = 0x300A067A, // FD M1 0 RadiationGenerationModeSequence = 0x300A067B, // SQ M1 0 RadiationGenerationModeLabel = 0x300A067C, // SH M1 0 RadiationGenerationModeDescription = 0x300A067D, // ST M1 0 RadiationGenerationModeMachineCodeSequence = 0x300A067E, // SQ M1 0 RadiationTypeCodeSequence = 0x300A067F, // SQ M1 0 NominalEnergy = 0x300A0680, // DS M1 0 MinimumNominalEnergy = 0x300A0681, // DS M1 0 MaximumNominalEnergy = 0x300A0682, // DS M1 0 RadiationFluenceModifierCodeSequence = 0x300A0683, // SQ M1 0 EnergyUnitCodeSequence = 0x300A0684, // SQ M1 0 NumberOfRadiationGenerationModes = 0x300A0685, // US M1 0 PatientSupportDevicesSequence = 0x300A0686, // SQ M1 0 NumberOfPatientSupportDevices = 0x300A0687, // US M1 0 RTBeamModifierDefinitionDistance = 0x300A0688, // FD M1 0 BeamAreaLimitSequence = 0x300A0689, // SQ M1 0 ReferencedRTPrescriptionSequence = 0x300A068A, // SQ M1 0 ReferencedRTPlanSequence = 0x300C0002, // SQ M1 0 ReferencedBeamSequence = 0x300C0004, // SQ M1 0 ReferencedBeamNumber = 0x300C0006, // IS M1 0 ReferencedReferenceImageNumber = 0x300C0007, // IS M1 0 StartCumulativeMetersetWeight = 0x300C0008, // DS M1 0 EndCumulativeMetersetWeight = 0x300C0009, // DS M1 0 ReferencedBrachyApplicationSetupSequence = 0x300C000A, // SQ M1 0 ReferencedBrachyApplicationSetupNumber = 0x300C000C, // IS M1 0 ReferencedSourceNumber = 0x300C000E, // IS M1 0 ReferencedFractionGroupSequence = 0x300C0020, // SQ M1 0 ReferencedFractionGroupNumber = 0x300C0022, // IS M1 0 ReferencedVerificationImageSequence = 0x300C0040, // SQ M1 0 ReferencedReferenceImageSequence = 0x300C0042, // SQ M1 0 ReferencedDoseReferenceSequence = 0x300C0050, // SQ M1 0 ReferencedDoseReferenceNumber = 0x300C0051, // IS M1 0 BrachyReferencedDoseReferenceSequence = 0x300C0055, // SQ M1 0 ReferencedStructureSetSequence = 0x300C0060, // SQ M1 0 ReferencedPatientSetupNumber = 0x300C006A, // IS M1 0 ReferencedDoseSequence = 0x300C0080, // SQ M1 0 ReferencedToleranceTableNumber = 0x300C00A0, // IS M1 0 ReferencedBolusSequence = 0x300C00B0, // SQ M1 0 ReferencedWedgeNumber = 0x300C00C0, // IS M1 0 ReferencedCompensatorNumber = 0x300C00D0, // IS M1 0 ReferencedBlockNumber = 0x300C00E0, // IS M1 0 ReferencedControlPointIndex = 0x300C00F0, // IS M1 0 ReferencedControlPointSequence = 0x300C00F2, // SQ M1 0 ReferencedStartControlPointIndex = 0x300C00F4, // IS M1 0 ReferencedStopControlPointIndex = 0x300C00F6, // IS M1 0 ReferencedRangeShifterNumber = 0x300C0100, // IS M1 0 ReferencedLateralSpreadingDeviceNumber = 0x300C0102, // IS M1 0 ReferencedRangeModulatorNumber = 0x300C0104, // IS M1 0 OmittedBeamTaskSequence = 0x300C0111, // SQ M1 0 ReasonForOmission = 0x300C0112, // CS M1 0 ReasonForOmissionDescription = 0x300C0113, // LO M1 0 ApprovalStatus = 0x300E0002, // CS M1 0 ReviewDate = 0x300E0004, // DA M1 0 ReviewTime = 0x300E0005, // TM M1 0 ReviewerName = 0x300E0008, // PN M1 0 RadiobiologicalDoseEffectSequence = 0x30100001, // SQ M1 0 RadiobiologicalDoseEffectFlag = 0x30100002, // CS M1 0 EffectiveDoseCalculationMethodCategoryCodeSequence = 0x30100003, // SQ M1 0 EffectiveDoseCalculationMethodCodeSequence = 0x30100004, // SQ M1 0 EffectiveDoseCalculationMethodDescription = 0x30100005, // LO M1 0 ConceptualVolumeUID = 0x30100006, // UI M1 0 OriginatingSOPInstanceReferenceSequence = 0x30100007, // SQ M1 0 ConceptualVolumeConstituentSequence = 0x30100008, // SQ M1 0 EquivalentConceptualVolumeInstanceReferenceSequence = 0x30100009, // SQ M1 0 EquivalentConceptualVolumesSequence = 0x3010000A, // SQ M1 0 ReferencedConceptualVolumeUID = 0x3010000B, // UI M1 0 ConceptualVolumeCombinationExpression = 0x3010000C, // UT M1 0 ConceptualVolumeConstituentIndex = 0x3010000D, // US M1 0 ConceptualVolumeCombinationFlag = 0x3010000E, // CS M1 0 ConceptualVolumeCombinationDescription = 0x3010000F, // ST M1 0 ConceptualVolumeSegmentationDefinedFlag = 0x30100010, // CS M1 0 ConceptualVolumeSegmentationReferenceSequence = 0x30100011, // SQ M1 0 ConceptualVolumeConstituentSegmentationReferenceSequence = 0x30100012, // SQ M1 0 ConstituentConceptualVolumeUID = 0x30100013, // UI M1 0 DerivationConceptualVolumeSequence = 0x30100014, // SQ M1 0 SourceConceptualVolumeUID = 0x30100015, // UI M1 0 ConceptualVolumeDerivationAlgorithmSequence = 0x30100016, // SQ M1 0 ConceptualVolumeDescription = 0x30100017, // ST M1 0 SourceConceptualVolumeSequence = 0x30100018, // SQ M1 0 AuthorIdentificationSequence = 0x30100019, // SQ M1 0 ManufacturerModelVersion = 0x3010001A, // LO M1 0 DeviceAlternateIdentifier = 0x3010001B, // UC M1 0 DeviceAlternateIdentifierType = 0x3010001C, // CS M1 0 DeviceAlternateIdentifierFormat = 0x3010001D, // LT M1 0 SegmentationCreationTemplateLabel = 0x3010001E, // LO M1 0 SegmentationTemplateUID = 0x3010001F, // UI M1 0 ReferencedSegmentReferenceIndex = 0x30100020, // US M1 0 SegmentReferenceSequence = 0x30100021, // SQ M1 0 SegmentReferenceIndex = 0x30100022, // US M1 0 DirectSegmentReferenceSequence = 0x30100023, // SQ M1 0 CombinationSegmentReferenceSequence = 0x30100024, // SQ M1 0 ConceptualVolumeSequence = 0x30100025, // SQ M1 0 SegmentedRTAccessoryDeviceSequence = 0x30100026, // SQ M1 0 SegmentCharacteristicsSequence = 0x30100027, // SQ M1 0 RelatedSegmentCharacteristicsSequence = 0x30100028, // SQ M1 0 SegmentCharacteristicsPrecedence = 0x30100029, // US M1 0 RTSegmentAnnotationSequence = 0x3010002A, // SQ M1 0 SegmentAnnotationCategoryCodeSequence = 0x3010002B, // SQ M1 0 SegmentAnnotationTypeCodeSequence = 0x3010002C, // SQ M1 0 DeviceLabel = 0x3010002D, // LO M1 0 DeviceTypeCodeSequence = 0x3010002E, // SQ M1 0 PatientEquipmentRelationshipCodeSequence = 0x30100030, // SQ M1 0 ReferencedFiducialsUID = 0x30100031, // UI M1 0 PatientTreatmentOrientationSequence = 0x30100032, // SQ M1 0 UserContentLabel = 0x30100033, // SH M1 0 UserContentLongLabel = 0x30100034, // LO M1 0 EntityLabel = 0x30100035, // SH M1 0 EntityName = 0x30100036, // LO M1 0 EntityDescription = 0x30100037, // ST M1 0 EntityLongLabel = 0x30100038, // LO M1 0 DeviceIndex = 0x30100039, // US M1 0 RTTreatmentPhaseIndex = 0x3010003A, // US M1 0 RTTreatmentPhaseUID = 0x3010003B, // UI M1 0 RTPrescriptionIndex = 0x3010003C, // US M1 0 RTSegmentAnnotationIndex = 0x3010003D, // US M1 0 BasisRTTreatmentPhaseIndex = 0x3010003E, // US M1 0 RelatedRTTreatmentPhaseIndex = 0x3010003F, // US M1 0 ReferencedRTTreatmentPhaseIndex = 0x30100040, // US M1 0 ReferencedRTPrescriptionIndex = 0x30100041, // US M1 0 ReferencedParentRTPrescriptionIndex = 0x30100042, // US M1 0 ManufacturerDeviceIdentifier = 0x30100043, // ST M1 0 InstanceLevelReferencedPerformedProcedureStepSequence = 0x30100044, // SQ M1 0 RTTreatmentPhaseIntentPresenceFlag = 0x30100045, // CS M1 0 RadiotherapyTreatmentType = 0x30100046, // CS M1 0 TeletherapyRadiationType = 0x30100047, // CS M1TN 0 BrachytherapySourceType = 0x30100048, // CS M1TN 0 ReferencedRTTreatmentPhaseSequence = 0x30100049, // SQ M1 0 ReferencedDirectSegmentInstanceSequence = 0x3010004A, // SQ M1 0 IntendedRTTreatmentPhaseSequence = 0x3010004B, // SQ M1 0 IntendedPhaseStartDate = 0x3010004C, // DA M1 0 IntendedPhaseEndDate = 0x3010004D, // DA M1 0 RTTreatmentPhaseIntervalSequence = 0x3010004E, // SQ M1 0 TemporalRelationshipIntervalAnchor = 0x3010004F, // CS M1 0 MinimumNumberOfIntervalDays = 0x30100050, // FD M1 0 MaximumNumberOfIntervalDays = 0x30100051, // FD M1 0 PertinentSOPClassesInStudy = 0x30100052, // UI M1TN 0 PertinentSOPClassesInSeries = 0x30100053, // UI M1TN 0 RTPrescriptionLabel = 0x30100054, // LO M1 0 RTPhysicianIntentPredecessorSequence = 0x30100055, // SQ M1 0 RTTreatmentApproachLabel = 0x30100056, // LO M1 0 RTPhysicianIntentSequence = 0x30100057, // SQ M1 0 RTPhysicianIntentIndex = 0x30100058, // US M1 0 RTTreatmentIntentType = 0x30100059, // CS M1 0 RTPhysicianIntentNarrative = 0x3010005A, // UT M1 0 RTProtocolCodeSequence = 0x3010005B, // SQ M1 0 ReasonForSuperseding = 0x3010005C, // ST M1 0 RTDiagnosisCodeSequence = 0x3010005D, // SQ M1 0 ReferencedRTPhysicianIntentIndex = 0x3010005E, // US M1 0 RTPhysicianIntentInputInstanceSequence = 0x3010005F, // SQ M1 0 RTAnatomicPrescriptionSequence = 0x30100060, // SQ M1 0 PriorTreatmentDoseDescription = 0x30100061, // UT M1 0 PriorTreatmentReferenceSequence = 0x30100062, // SQ M1 0 DosimetricObjectiveEvaluationScope = 0x30100063, // CS M1 0 TherapeuticRoleCategoryCodeSequence = 0x30100064, // SQ M1 0 TherapeuticRoleTypeCodeSequence = 0x30100065, // SQ M1 0 ConceptualVolumeOptimizationPrecedence = 0x30100066, // US M1 0 ConceptualVolumeCategoryCodeSequence = 0x30100067, // SQ M1 0 ConceptualVolumeBlockingConstraint = 0x30100068, // CS M1 0 ConceptualVolumeTypeCodeSequence = 0x30100069, // SQ M1 0 ConceptualVolumeTypeModifierCodeSequence = 0x3010006A, // SQ M1 0 RTPrescriptionSequence = 0x3010006B, // SQ M1 0 DosimetricObjectiveSequence = 0x3010006C, // SQ M1 0 DosimetricObjectiveTypeCodeSequence = 0x3010006D, // SQ M1 0 DosimetricObjectiveUID = 0x3010006E, // UI M1 0 ReferencedDosimetricObjectiveUID = 0x3010006F, // UI M1 0 DosimetricObjectiveParameterSequence = 0x30100070, // SQ M1 0 ReferencedDosimetricObjectivesSequence = 0x30100071, // SQ M1 0 AbsoluteDosimetricObjectiveFlag = 0x30100073, // CS M1 0 DosimetricObjectiveWeight = 0x30100074, // FD M1 0 DosimetricObjectivePurpose = 0x30100075, // CS M1 0 PlanningInputInformationSequence = 0x30100076, // SQ M1 0 TreatmentSite = 0x30100077, // LO M1 0 TreatmentSiteCodeSequence = 0x30100078, // SQ M1 0 FractionPatternSequence = 0x30100079, // SQ M1 0 TreatmentTechniqueNotes = 0x3010007A, // UT M1 0 PrescriptionNotes = 0x3010007B, // UT M1 0 NumberOfIntervalFractions = 0x3010007C, // IS M1 0 NumberOfFractions = 0x3010007D, // US M1 0 IntendedDeliveryDuration = 0x3010007E, // US M1 0 FractionationNotes = 0x3010007F, // UT M1 0 RTTreatmentTechniqueCodeSequence = 0x30100080, // SQ M1 0 PrescriptionNotesSequence = 0x30100081, // SQ M1 0 FractionBasedRelationshipSequence = 0x30100082, // SQ M1 0 FractionBasedRelationshipIntervalAnchor = 0x30100083, // CS M1 0 MinimumHoursBetweenFractions = 0x30100084, // FD M1 0 IntendedFractionStartTime = 0x30100085, // TM M1TN 0 IntendedStartDayOfWeek = 0x30100086, // LT M1 0 WeekdayFractionPatternSequence = 0x30100087, // SQ M1 0 DeliveryTimeStructureCodeSequence = 0x30100088, // SQ M1 0 Arbitrary = 0x40000010, // LT M1 1 TextComments = 0x40004000, // LT M1 1 ResultsID = 0x40080040, // SH M1 1 ResultsIDIssuer = 0x40080042, // LO M1 1 ReferencedInterpretationSequence = 0x40080050, // SQ M1 1 ReportProductionStatusTrial = 0x400800FF, // CS M1 1 InterpretationRecordedDate = 0x40080100, // DA M1 1 InterpretationRecordedTime = 0x40080101, // TM M1 1 InterpretationRecorder = 0x40080102, // PN M1 1 ReferenceToRecordedSound = 0x40080103, // LO M1 1 InterpretationTranscriptionDate = 0x40080108, // DA M1 1 InterpretationTranscriptionTime = 0x40080109, // TM M1 1 InterpretationTranscriber = 0x4008010A, // PN M1 1 InterpretationText = 0x4008010B, // ST M1 1 InterpretationAuthor = 0x4008010C, // PN M1 1 InterpretationApproverSequence = 0x40080111, // SQ M1 1 InterpretationApprovalDate = 0x40080112, // DA M1 1 InterpretationApprovalTime = 0x40080113, // TM M1 1 PhysicianApprovingInterpretation = 0x40080114, // PN M1 1 InterpretationDiagnosisDescription = 0x40080115, // LT M1 1 InterpretationDiagnosisCodeSequence = 0x40080117, // SQ M1 1 ResultsDistributionListSequence = 0x40080118, // SQ M1 1 DistributionName = 0x40080119, // PN M1 1 DistributionAddress = 0x4008011A, // LO M1 1 InterpretationID = 0x40080200, // SH M1 1 InterpretationIDIssuer = 0x40080202, // LO M1 1 InterpretationTypeID = 0x40080210, // CS M1 1 InterpretationStatusID = 0x40080212, // CS M1 1 Impressions = 0x40080300, // ST M1 1 ResultsComments = 0x40084000, // ST M1 1 LowEnergyDetectors = 0x40100001, // CS M1 DICOS HighEnergyDetectors = 0x40100002, // CS M1 DICOS DetectorGeometrySequence = 0x40100004, // SQ M1 DICOS ThreatROIVoxelSequence = 0x40101001, // SQ M1 DICOS ThreatROIBase = 0x40101004, // FL M3 DICOS ThreatROIExtents = 0x40101005, // FL M3 DICOS ThreatROIBitmap = 0x40101006, // OB M1 DICOS RouteSegmentID = 0x40101007, // SH M1 DICOS GantryType = 0x40101008, // CS M1 DICOS OOIOwnerType = 0x40101009, // CS M1 DICOS RouteSegmentSequence = 0x4010100A, // SQ M1 DICOS PotentialThreatObjectID = 0x40101010, // US M1 DICOS ThreatSequence = 0x40101011, // SQ M1 DICOS ThreatCategory = 0x40101012, // CS M1 DICOS ThreatCategoryDescription = 0x40101013, // LT M1 DICOS ATDAbilityAssessment = 0x40101014, // CS M1 DICOS ATDAssessmentFlag = 0x40101015, // CS M1 DICOS ATDAssessmentProbability = 0x40101016, // FL M1 DICOS Mass = 0x40101017, // FL M1 DICOS Density = 0x40101018, // FL M1 DICOS ZEffective = 0x40101019, // FL M1 DICOS BoardingPassID = 0x4010101A, // SH M1 DICOS CenterOfMass = 0x4010101B, // FL M3 DICOS CenterOfPTO = 0x4010101C, // FL M3 DICOS BoundingPolygon = 0x4010101D, // FL M6TN DICOS RouteSegmentStartLocationID = 0x4010101E, // SH M1 DICOS RouteSegmentEndLocationID = 0x4010101F, // SH M1 DICOS RouteSegmentLocationIDType = 0x40101020, // CS M1 DICOS AbortReason = 0x40101021, // CS M1TN DICOS VolumeOfPTO = 0x40101023, // FL M1 DICOS AbortFlag = 0x40101024, // CS M1 DICOS RouteSegmentStartTime = 0x40101025, // DT M1 DICOS RouteSegmentEndTime = 0x40101026, // DT M1 DICOS TDRType = 0x40101027, // CS M1 DICOS InternationalRouteSegment = 0x40101028, // CS M1 DICOS ThreatDetectionAlgorithmandVersion = 0x40101029, // LO M1TN DICOS AssignedLocation = 0x4010102A, // SH M1 DICOS AlarmDecisionTime = 0x4010102B, // DT M1 DICOS AlarmDecision = 0x40101031, // CS M1 DICOS NumberOfTotalObjects = 0x40101033, // US M1 DICOS NumberOfAlarmObjects = 0x40101034, // US M1 DICOS PTORepresentationSequence = 0x40101037, // SQ M1 DICOS ATDAssessmentSequence = 0x40101038, // SQ M1 DICOS TIPType = 0x40101039, // CS M1 DICOS DICOSVersion = 0x4010103A, // CS M1 DICOS OOIOwnerCreationTime = 0x40101041, // DT M1 DICOS OOIType = 0x40101042, // CS M1 DICOS OOISize = 0x40101043, // FL M3 DICOS AcquisitionStatus = 0x40101044, // CS M1 DICOS BasisMaterialsCodeSequence = 0x40101045, // SQ M1 DICOS PhantomType = 0x40101046, // CS M1 DICOS OOIOwnerSequence = 0x40101047, // SQ M1 DICOS ScanType = 0x40101048, // CS M1 DICOS ItineraryID = 0x40101051, // LO M1 DICOS ItineraryIDType = 0x40101052, // SH M1 DICOS ItineraryIDAssigningAuthority = 0x40101053, // LO M1 DICOS RouteID = 0x40101054, // SH M1 DICOS RouteIDAssigningAuthority = 0x40101055, // SH M1 DICOS InboundArrivalType = 0x40101056, // CS M1 DICOS CarrierID = 0x40101058, // SH M1 DICOS CarrierIDAssigningAuthority = 0x40101059, // CS M1 DICOS SourceOrientation = 0x40101060, // FL M3 DICOS SourcePosition = 0x40101061, // FL M3 DICOS BeltHeight = 0x40101062, // FL M1 DICOS AlgorithmRoutingCodeSequence = 0x40101064, // SQ M1 DICOS TransportClassification = 0x40101067, // CS M1 DICOS OOITypeDescriptor = 0x40101068, // LT M1 DICOS TotalProcessingTime = 0x40101069, // FL M1 DICOS DetectorCalibrationData = 0x4010106C, // OB M1 DICOS AdditionalScreeningPerformed = 0x4010106D, // CS M1 DICOS AdditionalInspectionSelectionCriteria = 0x4010106E, // CS M1 DICOS AdditionalInspectionMethodSequence = 0x4010106F, // SQ M1 DICOS AITDeviceType = 0x40101070, // CS M1 DICOS QRMeasurementsSequence = 0x40101071, // SQ M1 DICOS TargetMaterialSequence = 0x40101072, // SQ M1 DICOS SNRThreshold = 0x40101073, // FD M1 DICOS ImageScaleRepresentation = 0x40101075, // DS M1 DICOS ReferencedPTOSequence = 0x40101076, // SQ M1 DICOS ReferencedTDRInstanceSequence = 0x40101077, // SQ M1 DICOS PTOLocationDescription = 0x40101078, // ST M1 DICOS AnomalyLocatorIndicatorSequence = 0x40101079, // SQ M1 DICOS AnomalyLocatorIndicator = 0x4010107A, // FL M3 DICOS PTORegionSequence = 0x4010107B, // SQ M1 DICOS InspectionSelectionCriteria = 0x4010107C, // CS M1 DICOS SecondaryInspectionMethodSequence = 0x4010107D, // SQ M1 DICOS PRCSToRCSOrientation = 0x4010107E, // DS M6 DICOS MACParametersSequence = 0x4FFE0001, // SQ M1 0 CurveDimensions = 0x50000005, // US M1 1 NumberOfPoints = 0x50000010, // US M1 1 TypeOfData = 0x50000020, // CS M1 1 CurveDescription = 0x50000022, // LO M1 1 AxisUnits = 0x50000030, // SH M1TN 1 AxisLabels = 0x50000040, // SH M1TN 1 DataValueRepresentation = 0x50000103, // US M1 1 MinimumCoordinateValue = 0x50000104, // US M1TN 1 MaximumCoordinateValue = 0x50000105, // US M1TN 1 CurveRange = 0x50000106, // SH M1TN 1 CurveDataDescriptor = 0x50000110, // US M1TN 1 CoordinateStartValue = 0x50000112, // US M1TN 1 CoordinateStepValue = 0x50000114, // US M1TN 1 CurveActivationLayer = 0x50001001, // CS M1 1 AudioType = 0x50002000, // US M1 1 AudioSampleFormat = 0x50002002, // US M1 1 NumberOfChannels = 0x50002004, // US M1 1 NumberOfSamples = 0x50002006, // UL M1 1 SampleRate = 0x50002008, // UL M1 1 TotalTime = 0x5000200A, // UL M1 1 AudioSampleData = 0x5000200C, // OX M1 1 AudioComments = 0x5000200E, // LT M1 1 CurveLabel = 0x50002500, // LO M1 1 CurveReferencedOverlaySequence = 0x50002600, // SQ M1 1 CurveReferencedOverlayGroup = 0x50002610, // US M1 1 CurveData = 0x50003000, // OX M1 1 CurveDimensions2 = 0x50020005, // US M1 1 NumberOfPoints2 = 0x50020010, // US M1 1 TypeOfData2 = 0x50020020, // CS M1 1 CurveDescription2 = 0x50020022, // LO M1 1 AxisUnits2 = 0x50020030, // SH M1TN 1 AxisLabels2 = 0x50020040, // SH M1TN 1 DataValueRepresentation2 = 0x50020103, // US M1 1 MinimumCoordinateValue2 = 0x50020104, // US M1TN 1 MaximumCoordinateValue2 = 0x50020105, // US M1TN 1 CurveRange2 = 0x50020106, // SH M1TN 1 CurveDataDescriptor2 = 0x50020110, // US M1TN 1 CoordinateStartValue2 = 0x50020112, // US M1TN 1 CoordinateStepValue2 = 0x50020114, // US M1TN 1 CurveActivationLayer2 = 0x50021001, // CS M1 1 AudioType2 = 0x50022000, // US M1 1 AudioSampleFormat2 = 0x50022002, // US M1 1 NumberOfChannels2 = 0x50022004, // US M1 1 NumberOfSamples2 = 0x50022006, // UL M1 1 SampleRate2 = 0x50022008, // UL M1 1 TotalTime2 = 0x5002200A, // UL M1 1 AudioSampleData2 = 0x5002200C, // OX M1 1 AudioComments2 = 0x5002200E, // LT M1 1 CurveLabel2 = 0x50022500, // LO M1 1 CurveReferencedOverlaySequence2 = 0x50022600, // SQ M1 1 CurveReferencedOverlayGroup2 = 0x50022610, // US M1 1 CurveData2 = 0x50023000, // OX M1 1 CurveDimensions3 = 0x50040005, // US M1 1 NumberOfPoints3 = 0x50040010, // US M1 1 TypeOfData3 = 0x50040020, // CS M1 1 CurveDescription3 = 0x50040022, // LO M1 1 AxisUnits3 = 0x50040030, // SH M1TN 1 AxisLabels3 = 0x50040040, // SH M1TN 1 DataValueRepresentation3 = 0x50040103, // US M1 1 MinimumCoordinateValue3 = 0x50040104, // US M1TN 1 MaximumCoordinateValue3 = 0x50040105, // US M1TN 1 CurveRange3 = 0x50040106, // SH M1TN 1 CurveDataDescriptor3 = 0x50040110, // US M1TN 1 CoordinateStartValue3 = 0x50040112, // US M1TN 1 CoordinateStepValue3 = 0x50040114, // US M1TN 1 CurveActivationLayer3 = 0x50041001, // CS M1 1 AudioType3 = 0x50042000, // US M1 1 AudioSampleFormat3 = 0x50042002, // US M1 1 NumberOfChannels3 = 0x50042004, // US M1 1 NumberOfSamples3 = 0x50042006, // UL M1 1 SampleRate3 = 0x50042008, // UL M1 1 TotalTime3 = 0x5004200A, // UL M1 1 AudioSampleData3 = 0x5004200C, // OX M1 1 AudioComments3 = 0x5004200E, // LT M1 1 CurveLabel3 = 0x50042500, // LO M1 1 CurveReferencedOverlaySequence3 = 0x50042600, // SQ M1 1 CurveReferencedOverlayGroup3 = 0x50042610, // US M1 1 CurveData3 = 0x50043000, // OX M1 1 CurveDimensions4 = 0x50060005, // US M1 1 NumberOfPoints4 = 0x50060010, // US M1 1 TypeOfData4 = 0x50060020, // CS M1 1 CurveDescription4 = 0x50060022, // LO M1 1 AxisUnits4 = 0x50060030, // SH M1TN 1 AxisLabels4 = 0x50060040, // SH M1TN 1 DataValueRepresentation4 = 0x50060103, // US M1 1 MinimumCoordinateValue4 = 0x50060104, // US M1TN 1 MaximumCoordinateValue4 = 0x50060105, // US M1TN 1 CurveRange4 = 0x50060106, // SH M1TN 1 CurveDataDescriptor4 = 0x50060110, // US M1TN 1 CoordinateStartValue4 = 0x50060112, // US M1TN 1 CoordinateStepValue4 = 0x50060114, // US M1TN 1 CurveActivationLayer4 = 0x50061001, // CS M1 1 AudioType4 = 0x50062000, // US M1 1 AudioSampleFormat4 = 0x50062002, // US M1 1 NumberOfChannels4 = 0x50062004, // US M1 1 NumberOfSamples4 = 0x50062006, // UL M1 1 SampleRate4 = 0x50062008, // UL M1 1 TotalTime4 = 0x5006200A, // UL M1 1 AudioSampleData4 = 0x5006200C, // OX M1 1 AudioComments4 = 0x5006200E, // LT M1 1 CurveLabel4 = 0x50062500, // LO M1 1 CurveReferencedOverlaySequence4 = 0x50062600, // SQ M1 1 CurveReferencedOverlayGroup4 = 0x50062610, // US M1 1 CurveData4 = 0x50063000, // OX M1 1 CurveDimensions5 = 0x50080005, // US M1 1 NumberOfPoints5 = 0x50080010, // US M1 1 TypeOfData5 = 0x50080020, // CS M1 1 CurveDescription5 = 0x50080022, // LO M1 1 AxisUnits5 = 0x50080030, // SH M1TN 1 AxisLabels5 = 0x50080040, // SH M1TN 1 DataValueRepresentation5 = 0x50080103, // US M1 1 MinimumCoordinateValue5 = 0x50080104, // US M1TN 1 MaximumCoordinateValue5 = 0x50080105, // US M1TN 1 CurveRange5 = 0x50080106, // SH M1TN 1 CurveDataDescriptor5 = 0x50080110, // US M1TN 1 CoordinateStartValue5 = 0x50080112, // US M1TN 1 CoordinateStepValue5 = 0x50080114, // US M1TN 1 CurveActivationLayer5 = 0x50081001, // CS M1 1 AudioType5 = 0x50082000, // US M1 1 AudioSampleFormat5 = 0x50082002, // US M1 1 NumberOfChannels5 = 0x50082004, // US M1 1 NumberOfSamples5 = 0x50082006, // UL M1 1 SampleRate5 = 0x50082008, // UL M1 1 TotalTime5 = 0x5008200A, // UL M1 1 AudioSampleData5 = 0x5008200C, // OX M1 1 AudioComments5 = 0x5008200E, // LT M1 1 CurveLabel5 = 0x50082500, // LO M1 1 CurveReferencedOverlaySequence5 = 0x50082600, // SQ M1 1 CurveReferencedOverlayGroup5 = 0x50082610, // US M1 1 CurveData5 = 0x50083000, // OX M1 1 CurveDimensions6 = 0x500A0005, // US M1 1 NumberOfPoints6 = 0x500A0010, // US M1 1 TypeOfData6 = 0x500A0020, // CS M1 1 CurveDescription6 = 0x500A0022, // LO M1 1 AxisUnits6 = 0x500A0030, // SH M1TN 1 AxisLabels6 = 0x500A0040, // SH M1TN 1 DataValueRepresentation6 = 0x500A0103, // US M1 1 MinimumCoordinateValue6 = 0x500A0104, // US M1TN 1 MaximumCoordinateValue6 = 0x500A0105, // US M1TN 1 CurveRange6 = 0x500A0106, // SH M1TN 1 CurveDataDescriptor6 = 0x500A0110, // US M1TN 1 CoordinateStartValue6 = 0x500A0112, // US M1TN 1 CoordinateStepValue6 = 0x500A0114, // US M1TN 1 CurveActivationLayer6 = 0x500A1001, // CS M1 1 AudioType6 = 0x500A2000, // US M1 1 AudioSampleFormat6 = 0x500A2002, // US M1 1 NumberOfChannels6 = 0x500A2004, // US M1 1 NumberOfSamples6 = 0x500A2006, // UL M1 1 SampleRate6 = 0x500A2008, // UL M1 1 TotalTime6 = 0x500A200A, // UL M1 1 AudioSampleData6 = 0x500A200C, // OX M1 1 AudioComments6 = 0x500A200E, // LT M1 1 CurveLabel6 = 0x500A2500, // LO M1 1 CurveReferencedOverlaySequence6 = 0x500A2600, // SQ M1 1 CurveReferencedOverlayGroup6 = 0x500A2610, // US M1 1 CurveData6 = 0x500A3000, // OX M1 1 CurveDimensions7 = 0x500C0005, // US M1 1 NumberOfPoints7 = 0x500C0010, // US M1 1 TypeOfData7 = 0x500C0020, // CS M1 1 CurveDescription7 = 0x500C0022, // LO M1 1 AxisUnits7 = 0x500C0030, // SH M1TN 1 AxisLabels7 = 0x500C0040, // SH M1TN 1 DataValueRepresentation7 = 0x500C0103, // US M1 1 MinimumCoordinateValue7 = 0x500C0104, // US M1TN 1 MaximumCoordinateValue7 = 0x500C0105, // US M1TN 1 CurveRange7 = 0x500C0106, // SH M1TN 1 CurveDataDescriptor7 = 0x500C0110, // US M1TN 1 CoordinateStartValue7 = 0x500C0112, // US M1TN 1 CoordinateStepValue7 = 0x500C0114, // US M1TN 1 CurveActivationLayer7 = 0x500C1001, // CS M1 1 AudioType7 = 0x500C2000, // US M1 1 AudioSampleFormat7 = 0x500C2002, // US M1 1 NumberOfChannels7 = 0x500C2004, // US M1 1 NumberOfSamples7 = 0x500C2006, // UL M1 1 SampleRate7 = 0x500C2008, // UL M1 1 TotalTime7 = 0x500C200A, // UL M1 1 AudioSampleData7 = 0x500C200C, // OX M1 1 AudioComments7 = 0x500C200E, // LT M1 1 CurveLabel7 = 0x500C2500, // LO M1 1 CurveReferencedOverlaySequence7 = 0x500C2600, // SQ M1 1 CurveReferencedOverlayGroup7 = 0x500C2610, // US M1 1 CurveData7 = 0x500C3000, // OX M1 1 CurveDimensions8 = 0x500E0005, // US M1 1 NumberOfPoints8 = 0x500E0010, // US M1 1 TypeOfData8 = 0x500E0020, // CS M1 1 CurveDescription8 = 0x500E0022, // LO M1 1 AxisUnits8 = 0x500E0030, // SH M1TN 1 AxisLabels8 = 0x500E0040, // SH M1TN 1 DataValueRepresentation8 = 0x500E0103, // US M1 1 MinimumCoordinateValue8 = 0x500E0104, // US M1TN 1 MaximumCoordinateValue8 = 0x500E0105, // US M1TN 1 CurveRange8 = 0x500E0106, // SH M1TN 1 CurveDataDescriptor8 = 0x500E0110, // US M1TN 1 CoordinateStartValue8 = 0x500E0112, // US M1TN 1 CoordinateStepValue8 = 0x500E0114, // US M1TN 1 CurveActivationLayer8 = 0x500E1001, // CS M1 1 AudioType8 = 0x500E2000, // US M1 1 AudioSampleFormat8 = 0x500E2002, // US M1 1 NumberOfChannels8 = 0x500E2004, // US M1 1 NumberOfSamples8 = 0x500E2006, // UL M1 1 SampleRate8 = 0x500E2008, // UL M1 1 TotalTime8 = 0x500E200A, // UL M1 1 AudioSampleData8 = 0x500E200C, // OX M1 1 AudioComments8 = 0x500E200E, // LT M1 1 CurveLabel8 = 0x500E2500, // LO M1 1 CurveReferencedOverlaySequence8 = 0x500E2600, // SQ M1 1 CurveReferencedOverlayGroup8 = 0x500E2610, // US M1 1 CurveData8 = 0x500E3000, // OX M1 1 CurveDimensions9 = 0x50100005, // US M1 1 NumberOfPoints9 = 0x50100010, // US M1 1 TypeOfData9 = 0x50100020, // CS M1 1 CurveDescription9 = 0x50100022, // LO M1 1 AxisUnits9 = 0x50100030, // SH M1TN 1 AxisLabels9 = 0x50100040, // SH M1TN 1 DataValueRepresentation9 = 0x50100103, // US M1 1 MinimumCoordinateValue9 = 0x50100104, // US M1TN 1 MaximumCoordinateValue9 = 0x50100105, // US M1TN 1 CurveRange9 = 0x50100106, // SH M1TN 1 CurveDataDescriptor9 = 0x50100110, // US M1TN 1 CoordinateStartValue9 = 0x50100112, // US M1TN 1 CoordinateStepValue9 = 0x50100114, // US M1TN 1 CurveActivationLayer9 = 0x50101001, // CS M1 1 AudioType9 = 0x50102000, // US M1 1 AudioSampleFormat9 = 0x50102002, // US M1 1 NumberOfChannels9 = 0x50102004, // US M1 1 NumberOfSamples9 = 0x50102006, // UL M1 1 SampleRate9 = 0x50102008, // UL M1 1 TotalTime9 = 0x5010200A, // UL M1 1 AudioSampleData9 = 0x5010200C, // OX M1 1 AudioComments9 = 0x5010200E, // LT M1 1 CurveLabel9 = 0x50102500, // LO M1 1 CurveReferencedOverlaySequence9 = 0x50102600, // SQ M1 1 CurveReferencedOverlayGroup9 = 0x50102610, // US M1 1 CurveData9 = 0x50103000, // OX M1 1 CurveDimensions10 = 0x50120005, // US M1 1 NumberOfPoints10 = 0x50120010, // US M1 1 TypeOfData10 = 0x50120020, // CS M1 1 CurveDescription10 = 0x50120022, // LO M1 1 AxisUnits10 = 0x50120030, // SH M1TN 1 AxisLabels10 = 0x50120040, // SH M1TN 1 DataValueRepresentation10 = 0x50120103, // US M1 1 MinimumCoordinateValue10 = 0x50120104, // US M1TN 1 MaximumCoordinateValue10 = 0x50120105, // US M1TN 1 CurveRange10 = 0x50120106, // SH M1TN 1 CurveDataDescriptor10 = 0x50120110, // US M1TN 1 CoordinateStartValue10 = 0x50120112, // US M1TN 1 CoordinateStepValue10 = 0x50120114, // US M1TN 1 CurveActivationLayer10 = 0x50121001, // CS M1 1 AudioType10 = 0x50122000, // US M1 1 AudioSampleFormat10 = 0x50122002, // US M1 1 NumberOfChannels10 = 0x50122004, // US M1 1 NumberOfSamples10 = 0x50122006, // UL M1 1 SampleRate10 = 0x50122008, // UL M1 1 TotalTime10 = 0x5012200A, // UL M1 1 AudioSampleData10 = 0x5012200C, // OX M1 1 AudioComments10 = 0x5012200E, // LT M1 1 CurveLabel10 = 0x50122500, // LO M1 1 CurveReferencedOverlaySequence10 = 0x50122600, // SQ M1 1 CurveReferencedOverlayGroup10 = 0x50122610, // US M1 1 CurveData10 = 0x50123000, // OX M1 1 CurveDimensions11 = 0x50140005, // US M1 1 NumberOfPoints11 = 0x50140010, // US M1 1 TypeOfData11 = 0x50140020, // CS M1 1 CurveDescription11 = 0x50140022, // LO M1 1 AxisUnits11 = 0x50140030, // SH M1TN 1 AxisLabels11 = 0x50140040, // SH M1TN 1 DataValueRepresentation11 = 0x50140103, // US M1 1 MinimumCoordinateValue11 = 0x50140104, // US M1TN 1 MaximumCoordinateValue11 = 0x50140105, // US M1TN 1 CurveRange11 = 0x50140106, // SH M1TN 1 CurveDataDescriptor11 = 0x50140110, // US M1TN 1 CoordinateStartValue11 = 0x50140112, // US M1TN 1 CoordinateStepValue11 = 0x50140114, // US M1TN 1 CurveActivationLayer11 = 0x50141001, // CS M1 1 AudioType11 = 0x50142000, // US M1 1 AudioSampleFormat11 = 0x50142002, // US M1 1 NumberOfChannels11 = 0x50142004, // US M1 1 NumberOfSamples11 = 0x50142006, // UL M1 1 SampleRate11 = 0x50142008, // UL M1 1 TotalTime11 = 0x5014200A, // UL M1 1 AudioSampleData11 = 0x5014200C, // OX M1 1 AudioComments11 = 0x5014200E, // LT M1 1 CurveLabel11 = 0x50142500, // LO M1 1 CurveReferencedOverlaySequence11 = 0x50142600, // SQ M1 1 CurveReferencedOverlayGroup11 = 0x50142610, // US M1 1 CurveData11 = 0x50143000, // OX M1 1 CurveDimensions12 = 0x50160005, // US M1 1 NumberOfPoints12 = 0x50160010, // US M1 1 TypeOfData12 = 0x50160020, // CS M1 1 CurveDescription12 = 0x50160022, // LO M1 1 AxisUnits12 = 0x50160030, // SH M1TN 1 AxisLabels12 = 0x50160040, // SH M1TN 1 DataValueRepresentation12 = 0x50160103, // US M1 1 MinimumCoordinateValue12 = 0x50160104, // US M1TN 1 MaximumCoordinateValue12 = 0x50160105, // US M1TN 1 CurveRange12 = 0x50160106, // SH M1TN 1 CurveDataDescriptor12 = 0x50160110, // US M1TN 1 CoordinateStartValue12 = 0x50160112, // US M1TN 1 CoordinateStepValue12 = 0x50160114, // US M1TN 1 CurveActivationLayer12 = 0x50161001, // CS M1 1 AudioType12 = 0x50162000, // US M1 1 AudioSampleFormat12 = 0x50162002, // US M1 1 NumberOfChannels12 = 0x50162004, // US M1 1 NumberOfSamples12 = 0x50162006, // UL M1 1 SampleRate12 = 0x50162008, // UL M1 1 TotalTime12 = 0x5016200A, // UL M1 1 AudioSampleData12 = 0x5016200C, // OX M1 1 AudioComments12 = 0x5016200E, // LT M1 1 CurveLabel12 = 0x50162500, // LO M1 1 CurveReferencedOverlaySequence12 = 0x50162600, // SQ M1 1 CurveReferencedOverlayGroup12 = 0x50162610, // US M1 1 CurveData12 = 0x50163000, // OX M1 1 CurveDimensions13 = 0x50180005, // US M1 1 NumberOfPoints13 = 0x50180010, // US M1 1 TypeOfData13 = 0x50180020, // CS M1 1 CurveDescription13 = 0x50180022, // LO M1 1 AxisUnits13 = 0x50180030, // SH M1TN 1 AxisLabels13 = 0x50180040, // SH M1TN 1 DataValueRepresentation13 = 0x50180103, // US M1 1 MinimumCoordinateValue13 = 0x50180104, // US M1TN 1 MaximumCoordinateValue13 = 0x50180105, // US M1TN 1 CurveRange13 = 0x50180106, // SH M1TN 1 CurveDataDescriptor13 = 0x50180110, // US M1TN 1 CoordinateStartValue13 = 0x50180112, // US M1TN 1 CoordinateStepValue13 = 0x50180114, // US M1TN 1 CurveActivationLayer13 = 0x50181001, // CS M1 1 AudioType13 = 0x50182000, // US M1 1 AudioSampleFormat13 = 0x50182002, // US M1 1 NumberOfChannels13 = 0x50182004, // US M1 1 NumberOfSamples13 = 0x50182006, // UL M1 1 SampleRate13 = 0x50182008, // UL M1 1 TotalTime13 = 0x5018200A, // UL M1 1 AudioSampleData13 = 0x5018200C, // OX M1 1 AudioComments13 = 0x5018200E, // LT M1 1 CurveLabel13 = 0x50182500, // LO M1 1 CurveReferencedOverlaySequence13 = 0x50182600, // SQ M1 1 CurveReferencedOverlayGroup13 = 0x50182610, // US M1 1 CurveData13 = 0x50183000, // OX M1 1 CurveDimensions14 = 0x501A0005, // US M1 1 NumberOfPoints14 = 0x501A0010, // US M1 1 TypeOfData14 = 0x501A0020, // CS M1 1 CurveDescription14 = 0x501A0022, // LO M1 1 AxisUnits14 = 0x501A0030, // SH M1TN 1 AxisLabels14 = 0x501A0040, // SH M1TN 1 DataValueRepresentation14 = 0x501A0103, // US M1 1 MinimumCoordinateValue14 = 0x501A0104, // US M1TN 1 MaximumCoordinateValue14 = 0x501A0105, // US M1TN 1 CurveRange14 = 0x501A0106, // SH M1TN 1 CurveDataDescriptor14 = 0x501A0110, // US M1TN 1 CoordinateStartValue14 = 0x501A0112, // US M1TN 1 CoordinateStepValue14 = 0x501A0114, // US M1TN 1 CurveActivationLayer14 = 0x501A1001, // CS M1 1 AudioType14 = 0x501A2000, // US M1 1 AudioSampleFormat14 = 0x501A2002, // US M1 1 NumberOfChannels14 = 0x501A2004, // US M1 1 NumberOfSamples14 = 0x501A2006, // UL M1 1 SampleRate14 = 0x501A2008, // UL M1 1 TotalTime14 = 0x501A200A, // UL M1 1 AudioSampleData14 = 0x501A200C, // OX M1 1 AudioComments14 = 0x501A200E, // LT M1 1 CurveLabel14 = 0x501A2500, // LO M1 1 CurveReferencedOverlaySequence14 = 0x501A2600, // SQ M1 1 CurveReferencedOverlayGroup14 = 0x501A2610, // US M1 1 CurveData14 = 0x501A3000, // OX M1 1 CurveDimensions15 = 0x501C0005, // US M1 1 NumberOfPoints15 = 0x501C0010, // US M1 1 TypeOfData15 = 0x501C0020, // CS M1 1 CurveDescription15 = 0x501C0022, // LO M1 1 AxisUnits15 = 0x501C0030, // SH M1TN 1 AxisLabels15 = 0x501C0040, // SH M1TN 1 DataValueRepresentation15 = 0x501C0103, // US M1 1 MinimumCoordinateValue15 = 0x501C0104, // US M1TN 1 MaximumCoordinateValue15 = 0x501C0105, // US M1TN 1 CurveRange15 = 0x501C0106, // SH M1TN 1 CurveDataDescriptor15 = 0x501C0110, // US M1TN 1 CoordinateStartValue15 = 0x501C0112, // US M1TN 1 CoordinateStepValue15 = 0x501C0114, // US M1TN 1 CurveActivationLayer15 = 0x501C1001, // CS M1 1 AudioType15 = 0x501C2000, // US M1 1 AudioSampleFormat15 = 0x501C2002, // US M1 1 NumberOfChannels15 = 0x501C2004, // US M1 1 NumberOfSamples15 = 0x501C2006, // UL M1 1 SampleRate15 = 0x501C2008, // UL M1 1 TotalTime15 = 0x501C200A, // UL M1 1 AudioSampleData15 = 0x501C200C, // OX M1 1 AudioComments15 = 0x501C200E, // LT M1 1 CurveLabel15 = 0x501C2500, // LO M1 1 CurveReferencedOverlaySequence15 = 0x501C2600, // SQ M1 1 CurveReferencedOverlayGroup15 = 0x501C2610, // US M1 1 CurveData15 = 0x501C3000, // OX M1 1 CurveDimensions16 = 0x501E0005, // US M1 1 NumberOfPoints16 = 0x501E0010, // US M1 1 TypeOfData16 = 0x501E0020, // CS M1 1 CurveDescription16 = 0x501E0022, // LO M1 1 AxisUnits16 = 0x501E0030, // SH M1TN 1 AxisLabels16 = 0x501E0040, // SH M1TN 1 DataValueRepresentation16 = 0x501E0103, // US M1 1 MinimumCoordinateValue16 = 0x501E0104, // US M1TN 1 MaximumCoordinateValue16 = 0x501E0105, // US M1TN 1 CurveRange16 = 0x501E0106, // SH M1TN 1 CurveDataDescriptor16 = 0x501E0110, // US M1TN 1 CoordinateStartValue16 = 0x501E0112, // US M1TN 1 CoordinateStepValue16 = 0x501E0114, // US M1TN 1 CurveActivationLayer16 = 0x501E1001, // CS M1 1 AudioType16 = 0x501E2000, // US M1 1 AudioSampleFormat16 = 0x501E2002, // US M1 1 NumberOfChannels16 = 0x501E2004, // US M1 1 NumberOfSamples16 = 0x501E2006, // UL M1 1 SampleRate16 = 0x501E2008, // UL M1 1 TotalTime16 = 0x501E200A, // UL M1 1 AudioSampleData16 = 0x501E200C, // OX M1 1 AudioComments16 = 0x501E200E, // LT M1 1 CurveLabel16 = 0x501E2500, // LO M1 1 CurveReferencedOverlaySequence16 = 0x501E2600, // SQ M1 1 CurveReferencedOverlayGroup16 = 0x501E2610, // US M1 1 CurveData16 = 0x501E3000, // OX M1 1 SharedFunctionalGroupsSequence = 0x52009229, // SQ M1 0 PerFrameFunctionalGroupsSequence = 0x52009230, // SQ M1 0 WaveformSequence = 0x54000100, // SQ M1 0 ChannelMinimumValue = 0x54000110, // OX M1 0 ChannelMaximumValue = 0x54000112, // OX M1 0 WaveformBitsAllocated = 0x54001004, // US M1 0 WaveformSampleInterpretation = 0x54001006, // CS M1 0 WaveformPaddingValue = 0x5400100A, // OX M1 0 WaveformData = 0x54001010, // OX M1 0 FirstOrderPhaseCorrectionAngle = 0x56000010, // OF M1 0 SpectroscopyData = 0x56000020, // OF M1 0 OverlayRows = 0x60000010, // US M1 0 OverlayColumns = 0x60000011, // US M1 0 OverlayPlanes = 0x60000012, // US M1 1 NumberOfFramesInOverlay = 0x60000015, // IS M1 0 OverlayDescription = 0x60000022, // LO M1 0 OverlayType = 0x60000040, // CS M1 0 OverlaySubtype = 0x60000045, // LO M1 0 OverlayOrigin = 0x60000050, // SS M2 0 ImageFrameOrigin = 0x60000051, // US M1 0 OverlayPlaneOrigin = 0x60000052, // US M1 1 OverlayCompressionCode = 0x60000060, // CS M1 1 OverlayCompressionOriginator = 0x60000061, // SH M1 1 OverlayCompressionLabel = 0x60000062, // SH M1 1 OverlayCompressionDescription = 0x60000063, // CS M1 1 OverlayCompressionStepPointers = 0x60000066, // AT M1TN 1 OverlayRepeatInterval = 0x60000068, // US M1 1 OverlayBitsGrouped = 0x60000069, // US M1 1 OverlayBitsAllocated = 0x60000100, // US M1 0 OverlayBitPosition = 0x60000102, // US M1 0 OverlayFormat = 0x60000110, // CS M1 1 OverlayLocation = 0x60000200, // US M1 1 OverlayCodeLabel = 0x60000800, // CS M1TN 1 OverlayNumberOfTables = 0x60000802, // US M1 1 OverlayCodeTableLocation = 0x60000803, // AT M1TN 1 OverlayBitsForCodeWord = 0x60000804, // US M1 1 OverlayActivationLayer = 0x60001001, // CS M1 0 OverlayDescriptorGray = 0x60001100, // US M1 1 OverlayDescriptorRed = 0x60001101, // US M1 1 OverlayDescriptorGreen = 0x60001102, // US M1 1 OverlayDescriptorBlue = 0x60001103, // US M1 1 OverlaysGray = 0x60001200, // US M1TN 1 OverlaysRed = 0x60001201, // US M1TN 1 OverlaysGreen = 0x60001202, // US M1TN 1 OverlaysBlue = 0x60001203, // US M1TN 1 ROIArea = 0x60001301, // IS M1 0 ROIMean = 0x60001302, // DS M1 0 ROIStandardDeviation = 0x60001303, // DS M1 0 OverlayLabel = 0x60001500, // LO M1 0 OverlayData = 0x60003000, // OX M1 0 OverlayComments = 0x60004000, // LT M1 1 OverlayRows2 = 0x60020010, // US M1 0 OverlayColumns2 = 0x60020011, // US M1 0 OverlayPlanes2 = 0x60020012, // US M1 1 NumberOfFramesInOverlay2 = 0x60020015, // IS M1 0 OverlayDescription2 = 0x60020022, // LO M1 0 OverlayType2 = 0x60020040, // CS M1 0 OverlaySubtype2 = 0x60020045, // LO M1 0 OverlayOrigin2 = 0x60020050, // SS M2 0 ImageFrameOrigin2 = 0x60020051, // US M1 0 OverlayPlaneOrigin2 = 0x60020052, // US M1 1 OverlayCompressionCode2 = 0x60020060, // CS M1 1 OverlayCompressionOriginator2 = 0x60020061, // SH M1 1 OverlayCompressionLabel2 = 0x60020062, // SH M1 1 OverlayCompressionDescription2 = 0x60020063, // CS M1 1 OverlayCompressionStepPointers2 = 0x60020066, // AT M1TN 1 OverlayRepeatInterval2 = 0x60020068, // US M1 1 OverlayBitsGrouped2 = 0x60020069, // US M1 1 OverlayBitsAllocated2 = 0x60020100, // US M1 0 OverlayBitPosition2 = 0x60020102, // US M1 0 OverlayFormat2 = 0x60020110, // CS M1 1 OverlayLocation2 = 0x60020200, // US M1 1 OverlayCodeLabel2 = 0x60020800, // CS M1TN 1 OverlayNumberOfTables2 = 0x60020802, // US M1 1 OverlayCodeTableLocation2 = 0x60020803, // AT M1TN 1 OverlayBitsForCodeWord2 = 0x60020804, // US M1 1 OverlayActivationLayer2 = 0x60021001, // CS M1 0 OverlayDescriptorGray2 = 0x60021100, // US M1 1 OverlayDescriptorRed2 = 0x60021101, // US M1 1 OverlayDescriptorGreen2 = 0x60021102, // US M1 1 OverlayDescriptorBlue2 = 0x60021103, // US M1 1 OverlaysGray2 = 0x60021200, // US M1TN 1 OverlaysRed2 = 0x60021201, // US M1TN 1 OverlaysGreen2 = 0x60021202, // US M1TN 1 OverlaysBlue2 = 0x60021203, // US M1TN 1 ROIArea2 = 0x60021301, // IS M1 0 ROIMean2 = 0x60021302, // DS M1 0 ROIStandardDeviation2 = 0x60021303, // DS M1 0 OverlayLabel2 = 0x60021500, // LO M1 0 OverlayData2 = 0x60023000, // OX M1 0 OverlayComments2 = 0x60024000, // LT M1 1 OverlayRows3 = 0x60040010, // US M1 0 OverlayColumns3 = 0x60040011, // US M1 0 OverlayPlanes3 = 0x60040012, // US M1 1 NumberOfFramesInOverlay3 = 0x60040015, // IS M1 0 OverlayDescription3 = 0x60040022, // LO M1 0 OverlayType3 = 0x60040040, // CS M1 0 OverlaySubtype3 = 0x60040045, // LO M1 0 OverlayOrigin3 = 0x60040050, // SS M2 0 ImageFrameOrigin3 = 0x60040051, // US M1 0 OverlayPlaneOrigin3 = 0x60040052, // US M1 1 OverlayCompressionCode3 = 0x60040060, // CS M1 1 OverlayCompressionOriginator3 = 0x60040061, // SH M1 1 OverlayCompressionLabel3 = 0x60040062, // SH M1 1 OverlayCompressionDescription3 = 0x60040063, // CS M1 1 OverlayCompressionStepPointers3 = 0x60040066, // AT M1TN 1 OverlayRepeatInterval3 = 0x60040068, // US M1 1 OverlayBitsGrouped3 = 0x60040069, // US M1 1 OverlayBitsAllocated3 = 0x60040100, // US M1 0 OverlayBitPosition3 = 0x60040102, // US M1 0 OverlayFormat3 = 0x60040110, // CS M1 1 OverlayLocation3 = 0x60040200, // US M1 1 OverlayCodeLabel3 = 0x60040800, // CS M1TN 1 OverlayNumberOfTables3 = 0x60040802, // US M1 1 OverlayCodeTableLocation3 = 0x60040803, // AT M1TN 1 OverlayBitsForCodeWord3 = 0x60040804, // US M1 1 OverlayActivationLayer3 = 0x60041001, // CS M1 0 OverlayDescriptorGray3 = 0x60041100, // US M1 1 OverlayDescriptorRed3 = 0x60041101, // US M1 1 OverlayDescriptorGreen3 = 0x60041102, // US M1 1 OverlayDescriptorBlue3 = 0x60041103, // US M1 1 OverlaysGray3 = 0x60041200, // US M1TN 1 OverlaysRed3 = 0x60041201, // US M1TN 1 OverlaysGreen3 = 0x60041202, // US M1TN 1 OverlaysBlue3 = 0x60041203, // US M1TN 1 ROIArea3 = 0x60041301, // IS M1 0 ROIMean3 = 0x60041302, // DS M1 0 ROIStandardDeviation3 = 0x60041303, // DS M1 0 OverlayLabel3 = 0x60041500, // LO M1 0 OverlayData3 = 0x60043000, // OX M1 0 OverlayComments3 = 0x60044000, // LT M1 1 OverlayRows4 = 0x60060010, // US M1 0 OverlayColumns4 = 0x60060011, // US M1 0 OverlayPlanes4 = 0x60060012, // US M1 1 NumberOfFramesInOverlay4 = 0x60060015, // IS M1 0 OverlayDescription4 = 0x60060022, // LO M1 0 OverlayType4 = 0x60060040, // CS M1 0 OverlaySubtype4 = 0x60060045, // LO M1 0 OverlayOrigin4 = 0x60060050, // SS M2 0 ImageFrameOrigin4 = 0x60060051, // US M1 0 OverlayPlaneOrigin4 = 0x60060052, // US M1 1 OverlayCompressionCode4 = 0x60060060, // CS M1 1 OverlayCompressionOriginator4 = 0x60060061, // SH M1 1 OverlayCompressionLabel4 = 0x60060062, // SH M1 1 OverlayCompressionDescription4 = 0x60060063, // CS M1 1 OverlayCompressionStepPointers4 = 0x60060066, // AT M1TN 1 OverlayRepeatInterval4 = 0x60060068, // US M1 1 OverlayBitsGrouped4 = 0x60060069, // US M1 1 OverlayBitsAllocated4 = 0x60060100, // US M1 0 OverlayBitPosition4 = 0x60060102, // US M1 0 OverlayFormat4 = 0x60060110, // CS M1 1 OverlayLocation4 = 0x60060200, // US M1 1 OverlayCodeLabel4 = 0x60060800, // CS M1TN 1 OverlayNumberOfTables4 = 0x60060802, // US M1 1 OverlayCodeTableLocation4 = 0x60060803, // AT M1TN 1 OverlayBitsForCodeWord4 = 0x60060804, // US M1 1 OverlayActivationLayer4 = 0x60061001, // CS M1 0 OverlayDescriptorGray4 = 0x60061100, // US M1 1 OverlayDescriptorRed4 = 0x60061101, // US M1 1 OverlayDescriptorGreen4 = 0x60061102, // US M1 1 OverlayDescriptorBlue4 = 0x60061103, // US M1 1 OverlaysGray4 = 0x60061200, // US M1TN 1 OverlaysRed4 = 0x60061201, // US M1TN 1 OverlaysGreen4 = 0x60061202, // US M1TN 1 OverlaysBlue4 = 0x60061203, // US M1TN 1 ROIArea4 = 0x60061301, // IS M1 0 ROIMean4 = 0x60061302, // DS M1 0 ROIStandardDeviation4 = 0x60061303, // DS M1 0 OverlayLabel4 = 0x60061500, // LO M1 0 OverlayData4 = 0x60063000, // OX M1 0 OverlayComments4 = 0x60064000, // LT M1 1 OverlayRows5 = 0x60080010, // US M1 0 OverlayColumns5 = 0x60080011, // US M1 0 OverlayPlanes5 = 0x60080012, // US M1 1 NumberOfFramesInOverlay5 = 0x60080015, // IS M1 0 OverlayDescription5 = 0x60080022, // LO M1 0 OverlayType5 = 0x60080040, // CS M1 0 OverlaySubtype5 = 0x60080045, // LO M1 0 OverlayOrigin5 = 0x60080050, // SS M2 0 ImageFrameOrigin5 = 0x60080051, // US M1 0 OverlayPlaneOrigin5 = 0x60080052, // US M1 1 OverlayCompressionCode5 = 0x60080060, // CS M1 1 OverlayCompressionOriginator5 = 0x60080061, // SH M1 1 OverlayCompressionLabel5 = 0x60080062, // SH M1 1 OverlayCompressionDescription5 = 0x60080063, // CS M1 1 OverlayCompressionStepPointers5 = 0x60080066, // AT M1TN 1 OverlayRepeatInterval5 = 0x60080068, // US M1 1 OverlayBitsGrouped5 = 0x60080069, // US M1 1 OverlayBitsAllocated5 = 0x60080100, // US M1 0 OverlayBitPosition5 = 0x60080102, // US M1 0 OverlayFormat5 = 0x60080110, // CS M1 1 OverlayLocation5 = 0x60080200, // US M1 1 OverlayCodeLabel5 = 0x60080800, // CS M1TN 1 OverlayNumberOfTables5 = 0x60080802, // US M1 1 OverlayCodeTableLocation5 = 0x60080803, // AT M1TN 1 OverlayBitsForCodeWord5 = 0x60080804, // US M1 1 OverlayActivationLayer5 = 0x60081001, // CS M1 0 OverlayDescriptorGray5 = 0x60081100, // US M1 1 OverlayDescriptorRed5 = 0x60081101, // US M1 1 OverlayDescriptorGreen5 = 0x60081102, // US M1 1 OverlayDescriptorBlue5 = 0x60081103, // US M1 1 OverlaysGray5 = 0x60081200, // US M1TN 1 OverlaysRed5 = 0x60081201, // US M1TN 1 OverlaysGreen5 = 0x60081202, // US M1TN 1 OverlaysBlue5 = 0x60081203, // US M1TN 1 ROIArea5 = 0x60081301, // IS M1 0 ROIMean5 = 0x60081302, // DS M1 0 ROIStandardDeviation5 = 0x60081303, // DS M1 0 OverlayLabel5 = 0x60081500, // LO M1 0 OverlayData5 = 0x60083000, // OX M1 0 OverlayComments5 = 0x60084000, // LT M1 1 OverlayRows6 = 0x600A0010, // US M1 0 OverlayColumns6 = 0x600A0011, // US M1 0 OverlayPlanes6 = 0x600A0012, // US M1 1 NumberOfFramesInOverlay6 = 0x600A0015, // IS M1 0 OverlayDescription6 = 0x600A0022, // LO M1 0 OverlayType6 = 0x600A0040, // CS M1 0 OverlaySubtype6 = 0x600A0045, // LO M1 0 OverlayOrigin6 = 0x600A0050, // SS M2 0 ImageFrameOrigin6 = 0x600A0051, // US M1 0 OverlayPlaneOrigin6 = 0x600A0052, // US M1 1 OverlayCompressionCode6 = 0x600A0060, // CS M1 1 OverlayCompressionOriginator6 = 0x600A0061, // SH M1 1 OverlayCompressionLabel6 = 0x600A0062, // SH M1 1 OverlayCompressionDescription6 = 0x600A0063, // CS M1 1 OverlayCompressionStepPointers6 = 0x600A0066, // AT M1TN 1 OverlayRepeatInterval6 = 0x600A0068, // US M1 1 OverlayBitsGrouped6 = 0x600A0069, // US M1 1 OverlayBitsAllocated6 = 0x600A0100, // US M1 0 OverlayBitPosition6 = 0x600A0102, // US M1 0 OverlayFormat6 = 0x600A0110, // CS M1 1 OverlayLocation6 = 0x600A0200, // US M1 1 OverlayCodeLabel6 = 0x600A0800, // CS M1TN 1 OverlayNumberOfTables6 = 0x600A0802, // US M1 1 OverlayCodeTableLocation6 = 0x600A0803, // AT M1TN 1 OverlayBitsForCodeWord6 = 0x600A0804, // US M1 1 OverlayActivationLayer6 = 0x600A1001, // CS M1 0 OverlayDescriptorGray6 = 0x600A1100, // US M1 1 OverlayDescriptorRed6 = 0x600A1101, // US M1 1 OverlayDescriptorGreen6 = 0x600A1102, // US M1 1 OverlayDescriptorBlue6 = 0x600A1103, // US M1 1 OverlaysGray6 = 0x600A1200, // US M1TN 1 OverlaysRed6 = 0x600A1201, // US M1TN 1 OverlaysGreen6 = 0x600A1202, // US M1TN 1 OverlaysBlue6 = 0x600A1203, // US M1TN 1 ROIArea6 = 0x600A1301, // IS M1 0 ROIMean6 = 0x600A1302, // DS M1 0 ROIStandardDeviation6 = 0x600A1303, // DS M1 0 OverlayLabel6 = 0x600A1500, // LO M1 0 OverlayData6 = 0x600A3000, // OX M1 0 OverlayComments6 = 0x600A4000, // LT M1 1 OverlayRows7 = 0x600C0010, // US M1 0 OverlayColumns7 = 0x600C0011, // US M1 0 OverlayPlanes7 = 0x600C0012, // US M1 1 NumberOfFramesInOverlay7 = 0x600C0015, // IS M1 0 OverlayDescription7 = 0x600C0022, // LO M1 0 OverlayType7 = 0x600C0040, // CS M1 0 OverlaySubtype7 = 0x600C0045, // LO M1 0 OverlayOrigin7 = 0x600C0050, // SS M2 0 ImageFrameOrigin7 = 0x600C0051, // US M1 0 OverlayPlaneOrigin7 = 0x600C0052, // US M1 1 OverlayCompressionCode7 = 0x600C0060, // CS M1 1 OverlayCompressionOriginator7 = 0x600C0061, // SH M1 1 OverlayCompressionLabel7 = 0x600C0062, // SH M1 1 OverlayCompressionDescription7 = 0x600C0063, // CS M1 1 OverlayCompressionStepPointers7 = 0x600C0066, // AT M1TN 1 OverlayRepeatInterval7 = 0x600C0068, // US M1 1 OverlayBitsGrouped7 = 0x600C0069, // US M1 1 OverlayBitsAllocated7 = 0x600C0100, // US M1 0 OverlayBitPosition7 = 0x600C0102, // US M1 0 OverlayFormat7 = 0x600C0110, // CS M1 1 OverlayLocation7 = 0x600C0200, // US M1 1 OverlayCodeLabel7 = 0x600C0800, // CS M1TN 1 OverlayNumberOfTables7 = 0x600C0802, // US M1 1 OverlayCodeTableLocation7 = 0x600C0803, // AT M1TN 1 OverlayBitsForCodeWord7 = 0x600C0804, // US M1 1 OverlayActivationLayer7 = 0x600C1001, // CS M1 0 OverlayDescriptorGray7 = 0x600C1100, // US M1 1 OverlayDescriptorRed7 = 0x600C1101, // US M1 1 OverlayDescriptorGreen7 = 0x600C1102, // US M1 1 OverlayDescriptorBlue7 = 0x600C1103, // US M1 1 OverlaysGray7 = 0x600C1200, // US M1TN 1 OverlaysRed7 = 0x600C1201, // US M1TN 1 OverlaysGreen7 = 0x600C1202, // US M1TN 1 OverlaysBlue7 = 0x600C1203, // US M1TN 1 ROIArea7 = 0x600C1301, // IS M1 0 ROIMean7 = 0x600C1302, // DS M1 0 ROIStandardDeviation7 = 0x600C1303, // DS M1 0 OverlayLabel7 = 0x600C1500, // LO M1 0 OverlayData7 = 0x600C3000, // OX M1 0 OverlayComments7 = 0x600C4000, // LT M1 1 OverlayRows8 = 0x600E0010, // US M1 0 OverlayColumns8 = 0x600E0011, // US M1 0 OverlayPlanes8 = 0x600E0012, // US M1 1 NumberOfFramesInOverlay8 = 0x600E0015, // IS M1 0 OverlayDescription8 = 0x600E0022, // LO M1 0 OverlayType8 = 0x600E0040, // CS M1 0 OverlaySubtype8 = 0x600E0045, // LO M1 0 OverlayOrigin8 = 0x600E0050, // SS M2 0 ImageFrameOrigin8 = 0x600E0051, // US M1 0 OverlayPlaneOrigin8 = 0x600E0052, // US M1 1 OverlayCompressionCode8 = 0x600E0060, // CS M1 1 OverlayCompressionOriginator8 = 0x600E0061, // SH M1 1 OverlayCompressionLabel8 = 0x600E0062, // SH M1 1 OverlayCompressionDescription8 = 0x600E0063, // CS M1 1 OverlayCompressionStepPointers8 = 0x600E0066, // AT M1TN 1 OverlayRepeatInterval8 = 0x600E0068, // US M1 1 OverlayBitsGrouped8 = 0x600E0069, // US M1 1 OverlayBitsAllocated8 = 0x600E0100, // US M1 0 OverlayBitPosition8 = 0x600E0102, // US M1 0 OverlayFormat8 = 0x600E0110, // CS M1 1 OverlayLocation8 = 0x600E0200, // US M1 1 OverlayCodeLabel8 = 0x600E0800, // CS M1TN 1 OverlayNumberOfTables8 = 0x600E0802, // US M1 1 OverlayCodeTableLocation8 = 0x600E0803, // AT M1TN 1 OverlayBitsForCodeWord8 = 0x600E0804, // US M1 1 OverlayActivationLayer8 = 0x600E1001, // CS M1 0 OverlayDescriptorGray8 = 0x600E1100, // US M1 1 OverlayDescriptorRed8 = 0x600E1101, // US M1 1 OverlayDescriptorGreen8 = 0x600E1102, // US M1 1 OverlayDescriptorBlue8 = 0x600E1103, // US M1 1 OverlaysGray8 = 0x600E1200, // US M1TN 1 OverlaysRed8 = 0x600E1201, // US M1TN 1 OverlaysGreen8 = 0x600E1202, // US M1TN 1 OverlaysBlue8 = 0x600E1203, // US M1TN 1 ROIArea8 = 0x600E1301, // IS M1 0 ROIMean8 = 0x600E1302, // DS M1 0 ROIStandardDeviation8 = 0x600E1303, // DS M1 0 OverlayLabel8 = 0x600E1500, // LO M1 0 OverlayData8 = 0x600E3000, // OX M1 0 OverlayComments8 = 0x600E4000, // LT M1 1 OverlayRows9 = 0x60100010, // US M1 0 OverlayColumns9 = 0x60100011, // US M1 0 OverlayPlanes9 = 0x60100012, // US M1 1 NumberOfFramesInOverlay9 = 0x60100015, // IS M1 0 OverlayDescription9 = 0x60100022, // LO M1 0 OverlayType9 = 0x60100040, // CS M1 0 OverlaySubtype9 = 0x60100045, // LO M1 0 OverlayOrigin9 = 0x60100050, // SS M2 0 ImageFrameOrigin9 = 0x60100051, // US M1 0 OverlayPlaneOrigin9 = 0x60100052, // US M1 1 OverlayCompressionCode9 = 0x60100060, // CS M1 1 OverlayCompressionOriginator9 = 0x60100061, // SH M1 1 OverlayCompressionLabel9 = 0x60100062, // SH M1 1 OverlayCompressionDescription9 = 0x60100063, // CS M1 1 OverlayCompressionStepPointers9 = 0x60100066, // AT M1TN 1 OverlayRepeatInterval9 = 0x60100068, // US M1 1 OverlayBitsGrouped9 = 0x60100069, // US M1 1 OverlayBitsAllocated9 = 0x60100100, // US M1 0 OverlayBitPosition9 = 0x60100102, // US M1 0 OverlayFormat9 = 0x60100110, // CS M1 1 OverlayLocation9 = 0x60100200, // US M1 1 OverlayCodeLabel9 = 0x60100800, // CS M1TN 1 OverlayNumberOfTables9 = 0x60100802, // US M1 1 OverlayCodeTableLocation9 = 0x60100803, // AT M1TN 1 OverlayBitsForCodeWord9 = 0x60100804, // US M1 1 OverlayActivationLayer9 = 0x60101001, // CS M1 0 OverlayDescriptorGray9 = 0x60101100, // US M1 1 OverlayDescriptorRed9 = 0x60101101, // US M1 1 OverlayDescriptorGreen9 = 0x60101102, // US M1 1 OverlayDescriptorBlue9 = 0x60101103, // US M1 1 OverlaysGray9 = 0x60101200, // US M1TN 1 OverlaysRed9 = 0x60101201, // US M1TN 1 OverlaysGreen9 = 0x60101202, // US M1TN 1 OverlaysBlue9 = 0x60101203, // US M1TN 1 ROIArea9 = 0x60101301, // IS M1 0 ROIMean9 = 0x60101302, // DS M1 0 ROIStandardDeviation9 = 0x60101303, // DS M1 0 OverlayLabel9 = 0x60101500, // LO M1 0 OverlayData9 = 0x60103000, // OX M1 0 OverlayComments9 = 0x60104000, // LT M1 1 OverlayRows10 = 0x60120010, // US M1 0 OverlayColumns10 = 0x60120011, // US M1 0 OverlayPlanes10 = 0x60120012, // US M1 1 NumberOfFramesInOverlay10 = 0x60120015, // IS M1 0 OverlayDescription10 = 0x60120022, // LO M1 0 OverlayType10 = 0x60120040, // CS M1 0 OverlaySubtype10 = 0x60120045, // LO M1 0 OverlayOrigin10 = 0x60120050, // SS M2 0 ImageFrameOrigin10 = 0x60120051, // US M1 0 OverlayPlaneOrigin10 = 0x60120052, // US M1 1 OverlayCompressionCode10 = 0x60120060, // CS M1 1 OverlayCompressionOriginator10 = 0x60120061, // SH M1 1 OverlayCompressionLabel10 = 0x60120062, // SH M1 1 OverlayCompressionDescription10 = 0x60120063, // CS M1 1 OverlayCompressionStepPointers10 = 0x60120066, // AT M1TN 1 OverlayRepeatInterval10 = 0x60120068, // US M1 1 OverlayBitsGrouped10 = 0x60120069, // US M1 1 OverlayBitsAllocated10 = 0x60120100, // US M1 0 OverlayBitPosition10 = 0x60120102, // US M1 0 OverlayFormat10 = 0x60120110, // CS M1 1 OverlayLocation10 = 0x60120200, // US M1 1 OverlayCodeLabel10 = 0x60120800, // CS M1TN 1 OverlayNumberOfTables10 = 0x60120802, // US M1 1 OverlayCodeTableLocation10 = 0x60120803, // AT M1TN 1 OverlayBitsForCodeWord10 = 0x60120804, // US M1 1 OverlayActivationLayer10 = 0x60121001, // CS M1 0 OverlayDescriptorGray10 = 0x60121100, // US M1 1 OverlayDescriptorRed10 = 0x60121101, // US M1 1 OverlayDescriptorGreen10 = 0x60121102, // US M1 1 OverlayDescriptorBlue10 = 0x60121103, // US M1 1 OverlaysGray10 = 0x60121200, // US M1TN 1 OverlaysRed10 = 0x60121201, // US M1TN 1 OverlaysGreen10 = 0x60121202, // US M1TN 1 OverlaysBlue10 = 0x60121203, // US M1TN 1 ROIArea10 = 0x60121301, // IS M1 0 ROIMean10 = 0x60121302, // DS M1 0 ROIStandardDeviation10 = 0x60121303, // DS M1 0 OverlayLabel10 = 0x60121500, // LO M1 0 OverlayData10 = 0x60123000, // OX M1 0 OverlayComments10 = 0x60124000, // LT M1 1 OverlayRows11 = 0x60140010, // US M1 0 OverlayColumns11 = 0x60140011, // US M1 0 OverlayPlanes11 = 0x60140012, // US M1 1 NumberOfFramesInOverlay11 = 0x60140015, // IS M1 0 OverlayDescription11 = 0x60140022, // LO M1 0 OverlayType11 = 0x60140040, // CS M1 0 OverlaySubtype11 = 0x60140045, // LO M1 0 OverlayOrigin11 = 0x60140050, // SS M2 0 ImageFrameOrigin11 = 0x60140051, // US M1 0 OverlayPlaneOrigin11 = 0x60140052, // US M1 1 OverlayCompressionCode11 = 0x60140060, // CS M1 1 OverlayCompressionOriginator11 = 0x60140061, // SH M1 1 OverlayCompressionLabel11 = 0x60140062, // SH M1 1 OverlayCompressionDescription11 = 0x60140063, // CS M1 1 OverlayCompressionStepPointers11 = 0x60140066, // AT M1TN 1 OverlayRepeatInterval11 = 0x60140068, // US M1 1 OverlayBitsGrouped11 = 0x60140069, // US M1 1 OverlayBitsAllocated11 = 0x60140100, // US M1 0 OverlayBitPosition11 = 0x60140102, // US M1 0 OverlayFormat11 = 0x60140110, // CS M1 1 OverlayLocation11 = 0x60140200, // US M1 1 OverlayCodeLabel11 = 0x60140800, // CS M1TN 1 OverlayNumberOfTables11 = 0x60140802, // US M1 1 OverlayCodeTableLocation11 = 0x60140803, // AT M1TN 1 OverlayBitsForCodeWord11 = 0x60140804, // US M1 1 OverlayActivationLayer11 = 0x60141001, // CS M1 0 OverlayDescriptorGray11 = 0x60141100, // US M1 1 OverlayDescriptorRed11 = 0x60141101, // US M1 1 OverlayDescriptorGreen11 = 0x60141102, // US M1 1 OverlayDescriptorBlue11 = 0x60141103, // US M1 1 OverlaysGray11 = 0x60141200, // US M1TN 1 OverlaysRed11 = 0x60141201, // US M1TN 1 OverlaysGreen11 = 0x60141202, // US M1TN 1 OverlaysBlue11 = 0x60141203, // US M1TN 1 ROIArea11 = 0x60141301, // IS M1 0 ROIMean11 = 0x60141302, // DS M1 0 ROIStandardDeviation11 = 0x60141303, // DS M1 0 OverlayLabel11 = 0x60141500, // LO M1 0 OverlayData11 = 0x60143000, // OX M1 0 OverlayComments11 = 0x60144000, // LT M1 1 OverlayRows12 = 0x60160010, // US M1 0 OverlayColumns12 = 0x60160011, // US M1 0 OverlayPlanes12 = 0x60160012, // US M1 1 NumberOfFramesInOverlay12 = 0x60160015, // IS M1 0 OverlayDescription12 = 0x60160022, // LO M1 0 OverlayType12 = 0x60160040, // CS M1 0 OverlaySubtype12 = 0x60160045, // LO M1 0 OverlayOrigin12 = 0x60160050, // SS M2 0 ImageFrameOrigin12 = 0x60160051, // US M1 0 OverlayPlaneOrigin12 = 0x60160052, // US M1 1 OverlayCompressionCode12 = 0x60160060, // CS M1 1 OverlayCompressionOriginator12 = 0x60160061, // SH M1 1 OverlayCompressionLabel12 = 0x60160062, // SH M1 1 OverlayCompressionDescription12 = 0x60160063, // CS M1 1 OverlayCompressionStepPointers12 = 0x60160066, // AT M1TN 1 OverlayRepeatInterval12 = 0x60160068, // US M1 1 OverlayBitsGrouped12 = 0x60160069, // US M1 1 OverlayBitsAllocated12 = 0x60160100, // US M1 0 OverlayBitPosition12 = 0x60160102, // US M1 0 OverlayFormat12 = 0x60160110, // CS M1 1 OverlayLocation12 = 0x60160200, // US M1 1 OverlayCodeLabel12 = 0x60160800, // CS M1TN 1 OverlayNumberOfTables12 = 0x60160802, // US M1 1 OverlayCodeTableLocation12 = 0x60160803, // AT M1TN 1 OverlayBitsForCodeWord12 = 0x60160804, // US M1 1 OverlayActivationLayer12 = 0x60161001, // CS M1 0 OverlayDescriptorGray12 = 0x60161100, // US M1 1 OverlayDescriptorRed12 = 0x60161101, // US M1 1 OverlayDescriptorGreen12 = 0x60161102, // US M1 1 OverlayDescriptorBlue12 = 0x60161103, // US M1 1 OverlaysGray12 = 0x60161200, // US M1TN 1 OverlaysRed12 = 0x60161201, // US M1TN 1 OverlaysGreen12 = 0x60161202, // US M1TN 1 OverlaysBlue12 = 0x60161203, // US M1TN 1 ROIArea12 = 0x60161301, // IS M1 0 ROIMean12 = 0x60161302, // DS M1 0 ROIStandardDeviation12 = 0x60161303, // DS M1 0 OverlayLabel12 = 0x60161500, // LO M1 0 OverlayData12 = 0x60163000, // OX M1 0 OverlayComments12 = 0x60164000, // LT M1 1 OverlayRows13 = 0x60180010, // US M1 0 OverlayColumns13 = 0x60180011, // US M1 0 OverlayPlanes13 = 0x60180012, // US M1 1 NumberOfFramesInOverlay13 = 0x60180015, // IS M1 0 OverlayDescription13 = 0x60180022, // LO M1 0 OverlayType13 = 0x60180040, // CS M1 0 OverlaySubtype13 = 0x60180045, // LO M1 0 OverlayOrigin13 = 0x60180050, // SS M2 0 ImageFrameOrigin13 = 0x60180051, // US M1 0 OverlayPlaneOrigin13 = 0x60180052, // US M1 1 OverlayCompressionCode13 = 0x60180060, // CS M1 1 OverlayCompressionOriginator13 = 0x60180061, // SH M1 1 OverlayCompressionLabel13 = 0x60180062, // SH M1 1 OverlayCompressionDescription13 = 0x60180063, // CS M1 1 OverlayCompressionStepPointers13 = 0x60180066, // AT M1TN 1 OverlayRepeatInterval13 = 0x60180068, // US M1 1 OverlayBitsGrouped13 = 0x60180069, // US M1 1 OverlayBitsAllocated13 = 0x60180100, // US M1 0 OverlayBitPosition13 = 0x60180102, // US M1 0 OverlayFormat13 = 0x60180110, // CS M1 1 OverlayLocation13 = 0x60180200, // US M1 1 OverlayCodeLabel13 = 0x60180800, // CS M1TN 1 OverlayNumberOfTables13 = 0x60180802, // US M1 1 OverlayCodeTableLocation13 = 0x60180803, // AT M1TN 1 OverlayBitsForCodeWord13 = 0x60180804, // US M1 1 OverlayActivationLayer13 = 0x60181001, // CS M1 0 OverlayDescriptorGray13 = 0x60181100, // US M1 1 OverlayDescriptorRed13 = 0x60181101, // US M1 1 OverlayDescriptorGreen13 = 0x60181102, // US M1 1 OverlayDescriptorBlue13 = 0x60181103, // US M1 1 OverlaysGray13 = 0x60181200, // US M1TN 1 OverlaysRed13 = 0x60181201, // US M1TN 1 OverlaysGreen13 = 0x60181202, // US M1TN 1 OverlaysBlue13 = 0x60181203, // US M1TN 1 ROIArea13 = 0x60181301, // IS M1 0 ROIMean13 = 0x60181302, // DS M1 0 ROIStandardDeviation13 = 0x60181303, // DS M1 0 OverlayLabel13 = 0x60181500, // LO M1 0 OverlayData13 = 0x60183000, // OX M1 0 OverlayComments13 = 0x60184000, // LT M1 1 OverlayRows14 = 0x601A0010, // US M1 0 OverlayColumns14 = 0x601A0011, // US M1 0 OverlayPlanes14 = 0x601A0012, // US M1 1 NumberOfFramesInOverlay14 = 0x601A0015, // IS M1 0 OverlayDescription14 = 0x601A0022, // LO M1 0 OverlayType14 = 0x601A0040, // CS M1 0 OverlaySubtype14 = 0x601A0045, // LO M1 0 OverlayOrigin14 = 0x601A0050, // SS M2 0 ImageFrameOrigin14 = 0x601A0051, // US M1 0 OverlayPlaneOrigin14 = 0x601A0052, // US M1 1 OverlayCompressionCode14 = 0x601A0060, // CS M1 1 OverlayCompressionOriginator14 = 0x601A0061, // SH M1 1 OverlayCompressionLabel14 = 0x601A0062, // SH M1 1 OverlayCompressionDescription14 = 0x601A0063, // CS M1 1 OverlayCompressionStepPointers14 = 0x601A0066, // AT M1TN 1 OverlayRepeatInterval14 = 0x601A0068, // US M1 1 OverlayBitsGrouped14 = 0x601A0069, // US M1 1 OverlayBitsAllocated14 = 0x601A0100, // US M1 0 OverlayBitPosition14 = 0x601A0102, // US M1 0 OverlayFormat14 = 0x601A0110, // CS M1 1 OverlayLocation14 = 0x601A0200, // US M1 1 OverlayCodeLabel14 = 0x601A0800, // CS M1TN 1 OverlayNumberOfTables14 = 0x601A0802, // US M1 1 OverlayCodeTableLocation14 = 0x601A0803, // AT M1TN 1 OverlayBitsForCodeWord14 = 0x601A0804, // US M1 1 OverlayActivationLayer14 = 0x601A1001, // CS M1 0 OverlayDescriptorGray14 = 0x601A1100, // US M1 1 OverlayDescriptorRed14 = 0x601A1101, // US M1 1 OverlayDescriptorGreen14 = 0x601A1102, // US M1 1 OverlayDescriptorBlue14 = 0x601A1103, // US M1 1 OverlaysGray14 = 0x601A1200, // US M1TN 1 OverlaysRed14 = 0x601A1201, // US M1TN 1 OverlaysGreen14 = 0x601A1202, // US M1TN 1 OverlaysBlue14 = 0x601A1203, // US M1TN 1 ROIArea14 = 0x601A1301, // IS M1 0 ROIMean14 = 0x601A1302, // DS M1 0 ROIStandardDeviation14 = 0x601A1303, // DS M1 0 OverlayLabel14 = 0x601A1500, // LO M1 0 OverlayData14 = 0x601A3000, // OX M1 0 OverlayComments14 = 0x601A4000, // LT M1 1 OverlayRows15 = 0x601C0010, // US M1 0 OverlayColumns15 = 0x601C0011, // US M1 0 OverlayPlanes15 = 0x601C0012, // US M1 1 NumberOfFramesInOverlay15 = 0x601C0015, // IS M1 0 OverlayDescription15 = 0x601C0022, // LO M1 0 OverlayType15 = 0x601C0040, // CS M1 0 OverlaySubtype15 = 0x601C0045, // LO M1 0 OverlayOrigin15 = 0x601C0050, // SS M2 0 ImageFrameOrigin15 = 0x601C0051, // US M1 0 OverlayPlaneOrigin15 = 0x601C0052, // US M1 1 OverlayCompressionCode15 = 0x601C0060, // CS M1 1 OverlayCompressionOriginator15 = 0x601C0061, // SH M1 1 OverlayCompressionLabel15 = 0x601C0062, // SH M1 1 OverlayCompressionDescription15 = 0x601C0063, // CS M1 1 OverlayCompressionStepPointers15 = 0x601C0066, // AT M1TN 1 OverlayRepeatInterval15 = 0x601C0068, // US M1 1 OverlayBitsGrouped15 = 0x601C0069, // US M1 1 OverlayBitsAllocated15 = 0x601C0100, // US M1 0 OverlayBitPosition15 = 0x601C0102, // US M1 0 OverlayFormat15 = 0x601C0110, // CS M1 1 OverlayLocation15 = 0x601C0200, // US M1 1 OverlayCodeLabel15 = 0x601C0800, // CS M1TN 1 OverlayNumberOfTables15 = 0x601C0802, // US M1 1 OverlayCodeTableLocation15 = 0x601C0803, // AT M1TN 1 OverlayBitsForCodeWord15 = 0x601C0804, // US M1 1 OverlayActivationLayer15 = 0x601C1001, // CS M1 0 OverlayDescriptorGray15 = 0x601C1100, // US M1 1 OverlayDescriptorRed15 = 0x601C1101, // US M1 1 OverlayDescriptorGreen15 = 0x601C1102, // US M1 1 OverlayDescriptorBlue15 = 0x601C1103, // US M1 1 OverlaysGray15 = 0x601C1200, // US M1TN 1 OverlaysRed15 = 0x601C1201, // US M1TN 1 OverlaysGreen15 = 0x601C1202, // US M1TN 1 OverlaysBlue15 = 0x601C1203, // US M1TN 1 ROIArea15 = 0x601C1301, // IS M1 0 ROIMean15 = 0x601C1302, // DS M1 0 ROIStandardDeviation15 = 0x601C1303, // DS M1 0 OverlayLabel15 = 0x601C1500, // LO M1 0 OverlayData15 = 0x601C3000, // OX M1 0 OverlayComments15 = 0x601C4000, // LT M1 1 OverlayRows16 = 0x601E0010, // US M1 0 OverlayColumns16 = 0x601E0011, // US M1 0 OverlayPlanes16 = 0x601E0012, // US M1 1 NumberOfFramesInOverlay16 = 0x601E0015, // IS M1 0 OverlayDescription16 = 0x601E0022, // LO M1 0 OverlayType16 = 0x601E0040, // CS M1 0 OverlaySubtype16 = 0x601E0045, // LO M1 0 OverlayOrigin16 = 0x601E0050, // SS M2 0 ImageFrameOrigin16 = 0x601E0051, // US M1 0 OverlayPlaneOrigin16 = 0x601E0052, // US M1 1 OverlayCompressionCode16 = 0x601E0060, // CS M1 1 OverlayCompressionOriginator16 = 0x601E0061, // SH M1 1 OverlayCompressionLabel16 = 0x601E0062, // SH M1 1 OverlayCompressionDescription16 = 0x601E0063, // CS M1 1 OverlayCompressionStepPointers16 = 0x601E0066, // AT M1TN 1 OverlayRepeatInterval16 = 0x601E0068, // US M1 1 OverlayBitsGrouped16 = 0x601E0069, // US M1 1 OverlayBitsAllocated16 = 0x601E0100, // US M1 0 OverlayBitPosition16 = 0x601E0102, // US M1 0 OverlayFormat16 = 0x601E0110, // CS M1 1 OverlayLocation16 = 0x601E0200, // US M1 1 OverlayCodeLabel16 = 0x601E0800, // CS M1TN 1 OverlayNumberOfTables16 = 0x601E0802, // US M1 1 OverlayCodeTableLocation16 = 0x601E0803, // AT M1TN 1 OverlayBitsForCodeWord16 = 0x601E0804, // US M1 1 OverlayActivationLayer16 = 0x601E1001, // CS M1 0 OverlayDescriptorGray16 = 0x601E1100, // US M1 1 OverlayDescriptorRed16 = 0x601E1101, // US M1 1 OverlayDescriptorGreen16 = 0x601E1102, // US M1 1 OverlayDescriptorBlue16 = 0x601E1103, // US M1 1 OverlaysGray16 = 0x601E1200, // US M1TN 1 OverlaysRed16 = 0x601E1201, // US M1TN 1 OverlaysGreen16 = 0x601E1202, // US M1TN 1 OverlaysBlue16 = 0x601E1203, // US M1TN 1 ROIArea16 = 0x601E1301, // IS M1 0 ROIMean16 = 0x601E1302, // DS M1 0 ROIStandardDeviation16 = 0x601E1303, // DS M1 0 OverlayLabel16 = 0x601E1500, // LO M1 0 OverlayData16 = 0x601E3000, // OX M1 0 OverlayComments16 = 0x601E4000, // LT M1 1 ExtendedOffsetTable = 0x7FE00001, // OV M1 0 ExtendedOffsetTableLengths = 0x7FE00002, // OV M1 0 FloatPixelData = 0x7FE00008, // OF M1 0 DoubleFloatPixelData = 0x7FE00009, // OD M1 0 PixelData = 0x7FE00010, // OX M1 0 CoefficientsSDVN = 0x7FE00020, // OW M1 1 CoefficientsSDHN = 0x7FE00030, // OW M1 1 CoefficientsSDDN = 0x7FE00040, // OW M1 1 VariablePixelData = 0x7F000010, // OX M1 1 VariableNextDataGroup = 0x7F000011, // US M1 1 VariableCoefficientsSDVN = 0x7F000020, // OW M1 1 VariableCoefficientsSDHN = 0x7F000030, // OW M1 1 VariableCoefficientsSDDN = 0x7F000040, // OW M1 1 DigitalSignaturesSequence = 0xFFFAFFFA, // SQ M1 0 DataSetTrailingPadding = 0xFFFCFFFC, // OB M1 0 Item = 0xFFFEE000, // XX M0 0 ItemDelimitationItem = 0xFFFEE00D, // XX M0 0 SequenceDelimitationItem = 0xFFFEE0DD // XX M0 0 }; } // end namespace DC #endif /* vtkDICOMDictHash_h */ // VTK-HeaderTest-Exclude: vtkDICOMDictHash.h vtk-dicom-0.8.12/Source/vtkDICOMDictPrivate.cxx000066400000000000000000046774741356440565500212540ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. This file was generated by parsetpl.py and makedict.py on Dec 30, 2018 from the following files in David Clunie's dicom3tools package, dicom3tools_1.00.snapshot.20181103094127/libsrc/standard/elmdict/ acuson.tpl dicondep.tpl hitachi.tpl papyrus.tpl siemens.tpl agfa.tpl elscint.tpl isg.tpl philips.tpl spi.tpl camtron.tpl gems.tpl other.tpl picker.tpl toshiba.tpl Errata: AGFA -{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "Logarithmic PLT Full Scale" }, +{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" }, AGFA PACS Archive Mirroring 1.0 -{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "" }, -{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "" }, +{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" }, +{ 0x0031, 0x0001, 0, VR::CS, VM::M1, "DateTimeVerified" }, MITRA LINKED ATTRIBUTES 1.0 -{ 0x0031, 0x0020, 0, VR::IS, VM::M1, "" }, +{ 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" }, MITRA OBJECT UTF8 ATTRIBUTES 1.0 -{ 0x0033, 0x0002, 0, VR::OB, VM::M1, "" }, -{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "" }, -{ 0x0033, 0x0006, 0, VR::OB, VM::M1, "" }, -{ 0x0033, 0x0008, 0, VR::OB, VM::M1, "" }, -{ 0x0033, 0x000a, 0, VR::OB, VM::M1, "" }, -{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "" }, -{ 0x0033, 0x000e, 0, VR::OB, VM::M1, "" }, +{ 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" }, +{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" }, +{ 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" }, +{ 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" }, +{ 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" }, +{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" }, +{ 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" }, SIEMENS MR HEADER -{ 0x0051, 0x000b, 0, VR::SH, VM::M1, "AcquisitionMatrixText" }, +{ 0x0051, 0x000b, 0, VR::LO, VM::M1, "AcquisitionMatrixText" }, Applicare/Centricity Radiology Web/Version 2.0 -{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "Secondary pineLabel" }, +{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" }, GEMS_ADWSoft_3D1 -{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "Reconstruction Parameters Sequence" }, +{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" }, GEMS_DL_STUDY_01 -{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "Study Dose" }, +{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" }, -{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "Study luoroTime" }, +{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "StudyFluoroTime" }, GEMS_DL_FRAME_01 -{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "Table Lateral Position" }, +{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" }, Philips MR Imaging DD 004 -{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "Sort Attributes" }, +{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "SortAttributes" }, -{ 0x2005, 0x0086, 0, VR::CS, VM::M1, "Inset Scanogram" }, +{ 0x2005, 0x0086, 0, VR::CS, VM::M1, "InsetScanogram" }, PRIVATE_CODE_STRING_1003 -{ 0x1003, 0x0012, 0, VR::UN, VM::M1, "Probe Name" }, +{ 0x1003, 0x0012, 0, VR::UN, VM::M1, "ProbeName" }, PRIVATE_CODE_STRING_1001 -{ 0x1001, 0x00F3, 0, VR::SL, VM::M1, "Sorting Method" }, +{ 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" }, RadWorksTBR -{ 0x3111, 0x0002, 0, VR::CS, VM::M1, "Compression Type" }, +{ 0x3111, 0x0002, 0, VR::CS, VM::M1, "CompressionType" }, AMI Sequence AnnotElements_01 -{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "Transformation Matrix" }, +{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" }, GEMS_ACQU_01 -{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "End NumberForBaseline" }, +{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "EndNumberForBaseline" }, -{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetition Time" }, +{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetitionTime" }, Applicare/RadWorks/Version 5.0 -{ 0x3109, 0x0033, 0, VR::CS, VM::M1, "RequestStorage ommitment" }, +{ 0x3109, 0x0033, 0, VR::CS, VM::M1, "RequestStorageCommitment" }, AMI Sequence Annotations_01 -{ 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrame Number" }, +{ 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" }, AMI ImageContext_01 -{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "Show mageOverlay" }, +{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" }, AMI StudyExtensions_01 -{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "Last Released Annot Label" }, +{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" }, AMI ImageTransform_01 -{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "Transformation Matrix" }, +{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" }, SIEMENS CSA REPORT -{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOP InstanceUID" }, +{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" }, GEMS_MR_RAW_01 +{ 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" }, +{ 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" }, +{ 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" }, +{ 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" }, +{ 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" }, +{ 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" }, +{ 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" }, +{ 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" }, +{ 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" }, +{ 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" }, +{ 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" }, GEMS_FUNCTOOL_01 -{ 0x0051, 0x000c, 0, VR::SL, VM::M1, "WizardStateDataSize" }, -{ 0x0051, 0x000d, 0, VR::OB, VM::M1, "WizardState" }, +{ 0x0051, 0x000c, 0, VR::LO, VM::M1, "AnalysisPackage" }, +{ 0x0051, 0x000d, 0, VR::SL, VM::M1, "" }, GEMS_IMAG_01 -{ 0x0027, 0x0033, 0, VR::SL, VM::M1, "ImagingOptions" }, +{ 0x0027, 0x0033, 0, VR::UL, VM::M1, "ImagingOptions" }, GEMS_RELA_01 +{ 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" }, GEMS_PARM_01 -{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBH Coefficients" }, +{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" }, -{ 0x0043, 0x0064, 0, VR::CS, VM::M1TN, "ReconFilter" }, +{ 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" }, +{ 0x0043, 0x009b, 0, VR::DS, VM::M1, "NPWFactor" }, +{ 0x0043, 0x009c, 0, VR::OB, VM::M1, "ResearchTag1" }, +{ 0x0043, 0x009d, 0, VR::OB, VM::M1, "ResearchTag2" }, +{ 0x0043, 0x009e, 0, VR::OB, VM::M1, "ResearchTag3" }, +{ 0x0043, 0x009f, 0, VR::OB, VM::M1, "ResearchTag4" }, +{ 0x0043, 0x00a0, 0, VR::SQ, VM::M1, "SpectroscopyPixelSequence" }, +{ 0x0043, 0x00a1, 0, VR::SQ, VM::M1, "SpectroscopyDefaultDisplaySequence" }, +{ 0x0043, 0x00a2, 0, VR::DS, VM::M1TN, "MEFData" }, +{ 0x0043, 0x00a3, 0, VR::CS, VM::M1, "ASLContrastTechnique" }, +{ 0x0043, 0x00a4, 0, VR::LO, VM::M1, "DetailedTextForASLLabelingTechnique" }, +{ 0x0043, 0x00a5, 0, VR::IS, VM::M1, "DurationOfTheLabelOrControlPulse" }, +{ 0x0043, 0x00a6, 0, VR::DS, VM::M1, "OffsetFrequencyValueForFastB1Map" }, +{ 0x0043, 0x00a7, 0, VR::DS, VM::M1, "MotionEncodingFactor" }, +{ 0x0043, 0x00a8, 0, VR::DS, VM::M3, "DualDriveModeAndAmplitudeAttenuationAndPhaseOffset" }, +{ 0x0043, 0x00a9, 0, VR::LO, VM::M1TN, "CalibrationData3D" }, +{ 0x0043, 0x00aa, 0, VR::LO, VM::M1TN, "AdditionalFilteringParameters" }, +{ 0x0043, 0x00ab, 0, VR::DS, VM::M1TN, "SilenzData" }, +{ 0x0043, 0x00ac, 0, VR::DS, VM::M1TN, "QMAPDelayData" }, +{ 0x0043, 0x00ad, 0, VR::DS, VM::M1TN, "OtherRecoveryTimesValues" }, +{ 0x0043, 0x00ae, 0, VR::LO, VM::M1TN, "OtherRecoveryTimesLabels" }, +{ 0x0043, 0x00af, 0, VR::DS, VM::M1TN, "AdditionalEchoTimes" }, +{ 0x0043, 0x00b0, 0, VR::FL, VM::M1, "RescanTimeInAcquisition" }, +{ 0x0043, 0x00b1, 0, VR::SS, VM::M1, "ExcitationMode" }, +{ 0x0043, 0x00b2, 0, VR::DS, VM::M1TN, "AdvancedEddyCorrection" }, GEMS_STDY_01 -{ 0x0023, 0x0080, 0, VR::SQ, VM::M1, "HasMPPSRelatedTags" }, +{ 0x0023, 0x0080, 0, VR::SQ, VM::M1, "PPSDataSequence" }, GEMS_CT_FLRO_1 +{ 0x0029, 0x0001, 0, VR::SS, VM::M1, "CTIntFluoro" }, +{ 0x0029, 0x0002, 0, VR::DS, VM::M1, "ImagePreciseLocation" }, GEMS_HELIOS_01 +{ 0x0045, 0x003F, 0, VR::IS, VM::M1, "RPeakTimeDelay" }, +{ 0x0045, 0x0044, 0, VR::IS, VM::M1, "ActualRPeakTimeDelay" }, +{ 0x0045, 0x0045, 0, VR::ST, VM::M1, "CardiacScanOptions" }, GEHC_CT_ADVAPP_001 +{ 0x0053, 0x0063, 0, VR::CS, VM::M1, "ImagePositionPatientSetting" }, +{ 0x0053, 0x0069, 0, VR::LO, VM::M1, "ImageCheckAnnotation" }, +{ 0x0053, 0x0070, 0, VR::IS, VM::M1, "MultiEnergySourceCount" }, +{ 0x0053, 0x0071, 0, VR::LO, VM::M1, "MultiEnergyScanType" }, +{ 0x0053, 0x0072, 0, VR::LO, VM::M1, "MultiEnergyReconType" }, +{ 0x0053, 0x0073, 0, VR::LO, VM::M1, "MultiEnergyImageType" }, +{ 0x0053, 0x0074, 0, VR::LO, VM::M1, "MultiEnergyMaterialType" }, +{ 0x0053, 0x0075, 0, VR::DS, VM::M1, "MonchromaticEnergy" }, +{ 0x0053, 0x0076, 0, VR::DS, VM::M1, "MultiEnergyWeightedSubtractionWeight1" }, +{ 0x0053, 0x0077, 0, VR::DS, VM::M1, "MultiEnergyWeightedSubtractionWeight2" }, +{ 0x0053, 0x0078, 0, VR::LO, VM::M1, "MultiEnergyWeightedSubtractionType" }, +{ 0x0053, 0x0079, 0, VR::LO, VM::M1, "MultiEnergyAcqMethod" }, +{ 0x0053, 0x007A, 0, VR::SH, VM::M1, "MultiEnergyFeatAnnotName" }, +{ 0x0053, 0x007B, 0, VR::SH, VM::M1, "MultiEnergyNoiseReduced" }, +{ 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReducdeMethod" }, +{ 0x0053, 0x007E, 0, VR::DS, VM::M1, "MultiEnergyHighLowRatio" }, +{ 0x0053, 0x007F, 0, VR::DS, VM::M1, "MultiEnergyDutyCycle" }, +{ 0x0053, 0x0080, 0, VR::DS, VM::M1, "MeasuredEffectiveHighkVp" }, +{ 0x0053, 0x0081, 0, VR::DS, VM::M1, "MeasuredEffectiveLowkVp" }, +{ 0x0053, 0x0082, 0, VR::DS, VM::M1, "MeasuredEffectiveMeankVp" }, +{ 0x0053, 0x0083, 0, VR::DS, VM::M1, "MeasuredEffectiveMeanmA" }, +{ 0x0053, 0x0084, 0, VR::DS, VM::M1, "CommandedFirstkVp" }, +{ 0x0053, 0x0085, 0, VR::DS, VM::M1, "CommandedFirstmA" }, +{ 0x0053, 0x0086, 0, VR::DS, VM::M1, "CommandedSecondkVp" }, +{ 0x0053, 0x0087, 0, VR::DS, VM::M1, "CommandedSecondmA" }, +{ 0x0053, 0x0088, 0, VR::SH, VM::M1, "MultiEnergyKVAnnotName" }, +{ 0x0053, 0x0089, 0, VR::SH, VM::M1, "MultiEnergyKVUnitLabel" }, +{ 0x0053, 0x008A, 0, VR::LO, VM::M1, "MaterialType1" }, +{ 0x0053, 0x008B, 0, VR::LO, VM::M1, "MaterialType2" }, +{ 0x0053, 0x008C, 0, VR::LO, VM::M1, "GSIScanModePreset" }, +{ 0x0053, 0x008D, 0, VR::IS, VM::M2, "MonoWindowLow" }, +{ 0x0053, 0x008E, 0, VR::IS, VM::M2, "MonoWindoHigh" }, +{ 0x0053, 0x008F, 0, VR::FL, VM::M110, "MD1AttenuationCurve" }, +{ 0x0053, 0x0092, 0, VR::DS, VM::M1, "MD1intercept" }, +{ 0x0053, 0x0093, 0, VR::DS, VM::M1, "MD1slope" }, +{ 0x0053, 0x0095, 0, VR::OW, VM::M1, "MD1supportData" }, +{ 0x0053, 0x0096, 0, VR::OW, VM::M1, "MD2supportData" }, +{ 0x0053, 0x0097, 0, VR::OW, VM::M1, "NM1data" }, +{ 0x0053, 0x0098, 0, VR::DS, VM::M1, "MD2intercept" }, +{ 0x0053, 0x0099, 0, VR::DS, VM::M1, "MD2slope" }, +{ 0x0053, 0x009A, 0, VR::OW, VM::M1, "NM2data" }, +{ 0x0053, 0x009B, 0, VR::FL, VM::M110, "MD2attenuationCurve" }, +{ 0x0053, 0x009C, 0, VR::SH, VM::M1, "GSIdataVersion" }, +{ 0x0053, 0x009E, 0, VR::IS, VM::M1, "MultiEnergyNumNoiseRedPairs" }, +{ 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" }, BRAINWAVE: 1.2.840.113819.3 +{ 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" }, +{ 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" }, +{ 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID" +{ 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" }, +{ 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" }, +{ 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" }, +{ 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" }, +{ 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" }, +{ 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" }, +{ 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" }, +{ 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" }, +{ 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" }, +{ 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" }, +{ 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" }, +{ 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" }, +{ 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" }, +{ 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" }, +{ 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" }, +{ 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" }, +{ 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" }, +{ 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" }, +{ 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" }, +{ 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" }, +{ 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" }, +{ 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" }, +{ 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" }, +{ 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" }, +{ 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" }, +{ 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" }, +{ 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" }, +{ 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" }, +{ 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" }, +{ 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" }, INTELERAD MEDICAL SYSTEMS -{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "MD5Sum" }, +{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" }, CMR42 CIRCLECVI +{ 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" }, +{ 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" }, +{ 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" }, Philips Imaging DD 129 -{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" }, http://www.gemedicalsystems.com/it_solutions/rad_pacs/ -{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "Reference to pacs study" }, -{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "Reference to pacs image" }, -{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "Pacs examnotes flag" }, +{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" }, +{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" }, +{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" }, http://www.gemedicalsystems.com/it_solutions/orthoview/2.1 -{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoView Session Date/Time" }, -{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoView Session Creator" }, -{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoView Session Completion Flag" }, -{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoView File Sequence" }, -{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoView File Name" }, -{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoView File Content" }, +{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" }, +{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" }, +{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" }, +{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" }, +{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" }, +{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" }, =========================================================================*/ #include "vtkDICOMDictionary.h" #include "vtkDICOMDictPrivate.h" namespace { typedef vtkDICOMVR VR; typedef vtkDICOMVM VM; typedef vtkDICOMDictEntry::Entry DictEntry; // ----- WG12 Supplement 43 ----- const DictEntry Dict001Contents[] = { { 0x0009, 0x0001, 0, VR::SQ, VM::M1, "EventTimerSequence" }, { 0x0009, 0x0002, 0, VR::FD, VM::M1, "EventTimeInterval" }, { 0x0009, 0x0003, 0, VR::SQ, VM::M1, "EventCodeSequence" }, { 0x0019, 0x0001, 0, VR::FD, VM::M1, "FocusDepth" }, { 0x0019, 0x0003, 0, VR::SQ, VM::M1, "ExcludedIntervalsSequence" }, { 0x0019, 0x0004, 0, VR::DT, VM::M1, "ExclusionStartDatetime" }, { 0x0019, 0x0005, 0, VR::FD, VM::M1, "ExclusionDuration" }, { 0x0019, 0x0006, 0, VR::SQ, VM::M1, "USImageDescriptionSequence" }, { 0x0019, 0x0007, 0, VR::SQ, VM::M1, "ImageDataTypeSequence" }, { 0x0019, 0x0008, 0, VR::CS, VM::M1, "DataType" }, { 0x0019, 0x0009, 0, VR::SQ, VM::M1, "TransducerScanGeometryCodeSequence" }, { 0x0019, 0x000B, 0, VR::CS, VM::M1, "AliasedDataType" }, { 0x0019, 0x000C, 0, VR::CS, VM::M1, "PositionMeasuringDeviceUsed" }, { 0x0019, 0x000D, 0, VR::SQ, VM::M1, "TransducerScanningConfigurationCodeSequence" }, { 0x0019, 0x000E, 0, VR::SQ, VM::M1, "TransducerBeamSteeringCodeSequence" }, { 0x0019, 0x000F, 0, VR::SQ, VM::M1, "TransducerAccessCodeSequence" }, { 0x0021, 0x0001, 0, VR::FD, VM::M1, "ImagePositionVolume" }, { 0x0021, 0x0002, 0, VR::FD, VM::M1, "ImageOrientationVolume" }, { 0x0021, 0x0007, 0, VR::CS, VM::M1, "UltrasoundAcquisitionGeometry" }, { 0x0021, 0x0008, 0, VR::FD, VM::M1, "ApexPosition" }, { 0x0021, 0x0009, 0, VR::FD, VM::M1, "VolumeToTransducerMappingMatrix" }, { 0x0021, 0x000A, 0, VR::FD, VM::M1, "VolumeToTableMappingMatrix" }, { 0x0021, 0x000C, 0, VR::CS, VM::M1, "PatientFrameOfReferenceSource" }, { 0x0021, 0x000D, 0, VR::FD, VM::M1, "TemporalPositionTimeOffset" }, { 0x0021, 0x000E, 0, VR::SQ, VM::M1, "PlanePositionVolumeSequence" }, { 0x0021, 0x000F, 0, VR::SQ, VM::M1, "PlaneOrientationVolumeSequence" }, { 0x0021, 0x0010, 0, VR::SQ, VM::M1, "TemporalPositionSequence" }, { 0x0021, 0x0011, 0, VR::CS, VM::M1, "DimensionOrganizationType" }, { 0x0029, 0x0001, 0, VR::SQ, VM::M1, "DataFrameAssignmentSequence" }, { 0x0029, 0x0002, 0, VR::CS, VM::M1, "DataPathAssignment" }, { 0x0029, 0x0003, 0, VR::US, VM::M1, "BitsMappedToColorLookupTable" }, { 0x0029, 0x0004, 0, VR::SQ, VM::M1, "Opacity1LUTSequence" }, { 0x0029, 0x0005, 0, VR::CS, VM::M1, "Opacity1LUTTransferFunction" }, { 0x0029, 0x0006, 0, VR::FD, VM::M1, "OpacityConstant" }, { 0x0029, 0x0007, 0, VR::US, VM::M1, "OpacityLookupTableDescriptor" }, { 0x0029, 0x0008, 0, VR::OW, VM::M1, "OpacityLookupTableData" }, { 0x0029, 0x000B, 0, VR::SQ, VM::M1, "EnhancedPaletteColorLookupTableSequence" }, { 0x0029, 0x000C, 0, VR::SQ, VM::M1, "Opacity2LUTSequence" }, { 0x0029, 0x000D, 0, VR::CS, VM::M1, "Opacity2LUTTransferFunction" }, { 0x0029, 0x000E, 0, VR::CS, VM::M1, "DataPathID" }, { 0x0029, 0x000F, 0, VR::CS, VM::M1, "RGBLUTTransferFunction" }, { 0x0029, 0x0010, 0, VR::CS, VM::M1, "AlphaLUTTransferFunction" }, { 0x0041, 0x0001, 0, VR::CS, VM::M1, "PerformedProtocolType" }, }; const unsigned short Dict001TagHashTable[] = { 44, 49, 54, 59, 64, 69, 72, 43, 75, 43, 78, 81, 43, 43, 84, 43, 87, 90, 93, 43, 96, 99, 102, 107, 110, 43, 113, 43, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 151, 154, 159, 162, 0, 2, 21, 10, 29, 2, 2, 23, 13, 32, 5, 2, 22, 12, 31, 4, 2, 25, 15, 34, 7, 2, 24, 14, 33, 6, 1, 27, 17, 1, 26, 16, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 41, 16, 1, 10, 9, 1, 9, 8, 1, 11, 11, 1, 13, 13, 1, 12, 12, 2, 15, 15, 42, 1, 1, 14, 14, 1, 3, 1, 1, 4, 3, 1, 6, 5, 1, 5, 4, 1, 8, 7, 1, 7, 6, 1, 16, 1, 1, 35, 8, 1, 36, 11, 1, 17, 2, 1, 38, 13, 1, 37, 12, 2, 18, 7, 40, 15, 1, 39, 14, 2, 20, 9, 28, 1, 1, 19, 8, 1, 30, 3, }; const unsigned short Dict001KeyHashTable[] = { 44, 43, 47, 43, 54, 43, 59, 43, 43, 43, 64, 67, 70, 43, 73, 76, 43, 79, 84, 87, 92, 97, 102, 43, 43, 107, 110, 113, 43, 116, 119, 124, 43, 127, 130, 133, 138, 43, 43, 141, 146, 155, 43, 0, 1, 22, 8750, 3, 17, 34302, 19, 51186, 38, 52490, 2, 11, 37904, 13, 35243, 2, 0, 46449, 27, 16500, 1, 10, 60945, 1, 32, 24780, 1, 7, 53379, 1, 1, 30311, 1, 4, 60927, 2, 14, 54507, 15, 25855, 1, 8, 36001, 2, 26, 50860, 33, 40095, 2, 6, 50323, 20, 35064, 2, 9, 63524, 34, 30846, 2, 25, 52, 37, 12120, 1, 3, 40707, 1, 23, 22638, 1, 39, 19930, 1, 29, 30296, 2, 40, 58534, 41, 21319, 1, 18, 2116, 1, 42, 41652, 1, 21, 3893, 2, 16, 17014, 36, 64771, 1, 30, 55306, 2, 24, 1340, 31, 49666, 4, 2, 53049, 5, 57174, 28, 51836, 35, 24086, 1, 12, 21015, }; vtkDICOMDictionary::Dict Dict001Data = { "WG12 Supplement 43", 43, 43, Dict001TagHashTable, Dict001KeyHashTable, Dict001Contents }; // ----- SVISION ----- const DictEntry Dict002Contents[] = { { 0x0017, 0x0000, 0, VR::LO, VM::M1, "ExtendedBodyPart" }, { 0x0017, 0x0010, 0, VR::LO, VM::M1, "ExtendedViewPosition" }, { 0x0017, 0x0020, 0, VR::SQ, VM::M1, "ScheduledProcedureStepList" }, { 0x0017, 0x00a0, 0, VR::IS, VM::M1, "FixedGridSystem" }, { 0x0017, 0x00f0, 0, VR::IS, VM::M1, "ImagesSOPClass" }, { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0016, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0038, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0041, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0075, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0079, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0091, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0092, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0093, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0094, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a8, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00f0, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0000, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0001, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0031, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0041, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0050, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0051, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0052, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0060, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0090, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0091, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0092, 0, VR::DS, VM::M1, "" }, { 0x0023, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0023, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0023, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0023, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0023, 0x00f0, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0003, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0005, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0006, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0007, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0008, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0009, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x000a, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0025, 0x0021, 0, VR::LO, VM::M1, "" }, { 0x0027, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0027, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0027, 0x0010, 0, VR::DT, VM::M1, "" }, { 0x0027, 0x0011, 0, VR::DT, VM::M1, "" }, { 0x0027, 0x0012, 0, VR::DT, VM::M1, "" }, { 0x0027, 0x0013, 0, VR::DT, VM::M1, "" }, { 0x0029, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0003, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0005, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict002TagHashTable[] = { 89, 92, 101, 104, 109, 112, 88, 117, 120, 125, 132, 135, 88, 88, 88, 138, 141, 146, 88, 88, 149, 152, 88, 155, 158, 165, 172, 175, 88, 88, 88, 88, 178, 189, 198, 205, 212, 215, 218, 223, 228, 231, 236, 239, 242, 247, 88, 254, 257, 262, 269, 272, 275, 280, 283, 286, 88, 293, 296, 88, 88, 88, 88, 88, 299, 88, 302, 305, 88, 88, 88, 88, 308, 88, 88, 88, 88, 88, 88, 88, 88, 88, 311, 314, 88, 88, 88, 88, 0, 1, 16, 64, 4, 10, 24, 17, 65, 46, 32, 57, 146, 1, 56, 145, 2, 36, 168, 55, 144, 1, 75, 33, 2, 3, 160, 74, 32, 1, 1, 16, 2, 25, 120, 49, 64, 3, 8, 16, 26, 121, 50, 65, 1, 35, 161, 1, 34, 160, 1, 9, 22, 2, 22, 112, 48, 49, 1, 47, 48, 1, 23, 116, 1, 24, 117, 1, 0, 0, 3, 6, 1, 20, 104, 51, 80, 3, 5, 0, 21, 105, 52, 81, 1, 53, 82, 1, 7, 2, 5, 19, 96, 41, 1, 61, 3, 62, 240, 68, 5, 4, 15, 56, 40, 0, 60, 2, 67, 4, 3, 43, 3, 59, 1, 70, 7, 3, 42, 2, 58, 0, 69, 6, 1, 64, 1, 1, 63, 0, 2, 66, 3, 77, 1, 2, 65, 2, 76, 0, 1, 83, 1, 2, 13, 48, 82, 0, 1, 85, 3, 1, 84, 2, 2, 72, 9, 87, 5, 3, 14, 52, 71, 8, 86, 4, 1, 73, 10, 2, 32, 147, 45, 17, 3, 12, 40, 31, 146, 44, 16, 1, 30, 145, 1, 29, 144, 2, 4, 240, 81, 19, 1, 80, 18, 1, 79, 17, 3, 2, 32, 33, 148, 78, 16, 1, 11, 32, 1, 39, 240, 1, 54, 96, 1, 28, 129, 1, 27, 128, 1, 18, 80, 1, 38, 177, 1, 37, 176, }; const unsigned short Dict002KeyHashTable[] = { 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 256, 88, 259, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 262, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 265, 88, 88, 88, 268, 0, 83, 5, 61, 6, 61, 7, 61, 8, 61, 9, 61, 10, 61, 11, 61, 12, 61, 13, 61, 14, 61, 15, 61, 16, 61, 17, 61, 18, 61, 19, 61, 20, 61, 21, 61, 22, 61, 23, 61, 24, 61, 25, 61, 26, 61, 27, 61, 28, 61, 29, 61, 30, 61, 31, 61, 32, 61, 33, 61, 34, 61, 35, 61, 36, 61, 37, 61, 38, 61, 39, 61, 40, 61, 41, 61, 42, 61, 43, 61, 44, 61, 45, 61, 46, 61, 47, 61, 48, 61, 49, 61, 50, 61, 51, 61, 52, 61, 53, 61, 54, 61, 55, 61, 56, 61, 57, 61, 58, 61, 59, 61, 60, 61, 61, 61, 62, 61, 63, 61, 64, 61, 65, 61, 66, 61, 67, 61, 68, 61, 69, 61, 70, 61, 71, 61, 72, 61, 73, 61, 74, 61, 75, 61, 76, 61, 77, 61, 78, 61, 79, 61, 80, 61, 81, 61, 82, 61, 83, 61, 84, 61, 85, 61, 86, 61, 87, 61, 1, 1, 38140, 1, 3, 41225, 1, 4, 13074, 1, 0, 20523, 1, 2, 58976, }; vtkDICOMDictionary::Dict Dict002Data = { "SVISION", 88, 88, Dict002TagHashTable, Dict002KeyHashTable, Dict002Contents }; // ----- GEMS_XR3DCAL_01 ----- const DictEntry Dict003Contents[] = { { 0x0021, 0x0020, 0, VR::LT, VM::M1, "GeneralizedCalibration" }, }; const unsigned short Dict003TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict003KeyHashTable[] = { 2, 0, 1, 0, 46679, }; vtkDICOMDictionary::Dict Dict003Data = { "GEMS_XR3DCAL_01", 1, 1, Dict003TagHashTable, Dict003KeyHashTable, Dict003Contents }; // ----- GEMS_IMPS_01 ----- const DictEntry Dict004Contents[] = { { 0x0029, 0x0004, 0, VR::SL, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0005, 0, VR::DS, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0006, 0, VR::DS, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0007, 0, VR::SL, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0008, 0, VR::SH, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0009, 0, VR::SH, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x000a, 0, VR::SS, VM::M1, "LowerRangeOfPixels" }, { 0x0029, 0x0015, 0, VR::SL, VM::M1, "LowerRangeOfPixels1" }, { 0x0029, 0x0016, 0, VR::SL, VM::M1, "UpperRangeOfPixels1" }, { 0x0029, 0x0017, 0, VR::SL, VM::M1, "LowerRangeOfPixels2" }, { 0x0029, 0x0018, 0, VR::SL, VM::M1, "UpperRangeOfPixels2" }, { 0x0029, 0x001a, 0, VR::SL, VM::M1, "LengthOfTotalHeaderInBytes" }, { 0x0029, 0x0026, 0, VR::SS, VM::M1, "VersionOfHeaderStructure" }, { 0x0029, 0x0034, 0, VR::SL, VM::M1, "AdvantageCompOverflow" }, { 0x0029, 0x0035, 0, VR::SL, VM::M1, "AdvantageCompUnderflow" }, }; const unsigned short Dict004TagHashTable[] = { 16, 23, 26, 33, 38, 41, 44, 15, 15, 15, 15, 15, 15, 47, 50, 0, 3, 0, 4, 7, 21, 12, 38, 1, 3, 7, 3, 2, 6, 5, 9, 9, 23, 2, 4, 8, 8, 22, 1, 10, 24, 1, 6, 10, 1, 11, 26, 1, 14, 53, 2, 1, 5, 13, 52, }; const unsigned short Dict004KeyHashTable[] = { 16, 19, 24, 27, 30, 15, 15, 15, 15, 15, 15, 33, 36, 15, 39, 0, 1, 13, 17181, 2, 8, 51880, 14, 36140, 1, 10, 51880, 1, 7, 53853, 1, 9, 53853, 1, 12, 19777, 1, 11, 57909, 7, 0, 37113, 1, 37113, 2, 37113, 3, 37113, 4, 37113, 5, 37113, 6, 37113, }; vtkDICOMDictionary::Dict Dict004Data = { "GEMS_IMPS_01", 15, 15, Dict004TagHashTable, Dict004KeyHashTable, Dict004Contents }; // ----- Applicare/Centricity Radiology Web/Version 2.0 ----- const DictEntry Dict005Contents[] = { { 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" }, { 0x4111, 0x0002, 0, VR::IS, VM::M1, "AdditionalTagsForPresentationState" }, }; const unsigned short Dict005TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict005KeyHashTable[] = { 3, 6, 0, 1, 0, 62822, 1, 1, 41832, }; vtkDICOMDictionary::Dict Dict005Data = { "Applicare/Centricity Radiology Web/Version 2.0", 2, 2, Dict005TagHashTable, Dict005KeyHashTable, Dict005Contents }; // ----- TOSHIBA_MEC_OT3 ----- const DictEntry Dict006Contents[] = { { 0x0009, 0x0000, 0, VR::LO, VM::M1, "HISRISStudyID" }, }; const unsigned short Dict006TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict006KeyHashTable[] = { 2, 0, 1, 0, 20925, }; vtkDICOMDictionary::Dict Dict006Data = { "TOSHIBA_MEC_OT3", 1, 1, Dict006TagHashTable, Dict006KeyHashTable, Dict006Contents }; // ----- GEIIS ----- const DictEntry Dict007Contents[] = { { 0x0009, 0x0010, 0, VR::SQ, VM::M1, "GEPrivateImageThumbnailSequence" }, { 0x0009, 0x0012, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::UL, VM::M1, "ShiftCount" }, { 0x0029, 0x0012, 0, VR::UL, VM::M1, "Offset" }, { 0x0029, 0x0014, 0, VR::UL, VM::M1, "ActualFrameNumber" }, { 0x0905, 0x0030, 0, VR::LO, VM::M1, "AssigningAuthorityForPatientID" }, { 0x0907, 0x0010, 0, VR::UI, VM::M1, "OriginalStudyInstanceUID" }, { 0x0907, 0x0020, 0, VR::UI, VM::M1, "OriginalSeriesInstanceUID" }, { 0x0907, 0x0030, 0, VR::UI, VM::M1, "OriginalSOPInstanceUID" }, { 0x7fd1, 0x0010, 0, VR::UL, VM::M1, "CompressionType" }, { 0x7fd1, 0x0020, 0, VR::UL, VM::M1TN, "MultiframeOffsets" }, { 0x7fd1, 0x0030, 0, VR::UL, VM::M1, "MultiResolutionLevels" }, { 0x7fd1, 0x0040, 0, VR::UL, VM::M1TN, "SubbandRows" }, { 0x7fd1, 0x0050, 0, VR::UL, VM::M1TN, "SubbandColumns" }, { 0x7fd1, 0x0060, 0, VR::UL, VM::M1TN, "SubbandBytecounts" }, }; const unsigned short Dict007TagHashTable[] = { 16, 19, 15, 15, 15, 22, 25, 15, 28, 15, 31, 36, 39, 48, 53, 0, 1, 6, 16, 1, 4, 20, 1, 10, 32, 1, 11, 48, 1, 9, 16, 2, 0, 16, 14, 96, 1, 5, 48, 4, 1, 18, 2, 16, 7, 32, 12, 64, 2, 8, 48, 13, 80, 1, 3, 18, }; const unsigned short Dict007KeyHashTable[] = { 16, 23, 15, 26, 15, 29, 32, 35, 38, 43, 15, 46, 49, 52, 55, 0, 3, 0, 15028, 10, 19611, 13, 20619, 1, 6, 52327, 1, 12, 41716, 1, 11, 8182, 1, 9, 14717, 1, 2, 17675, 2, 4, 9253, 7, 48940, 1, 5, 36255, 1, 1, 358, 1, 8, 58105, 1, 3, 18417, 1, 14, 890, }; vtkDICOMDictionary::Dict Dict007Data = { "GEIIS", 15, 15, Dict007TagHashTable, Dict007KeyHashTable, Dict007Contents }; // ----- Philips NM Private Group ----- const DictEntry Dict008Contents[] = { { 0x7043, 0x0000, 0, VR::SH, VM::M1, "" }, }; const unsigned short Dict008TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict008KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict008Data = { "Philips NM Private Group", 1, 1, Dict008TagHashTable, Dict008KeyHashTable, Dict008Contents }; // ----- GEMS_ACRQA_1.0 BLOCK1 ----- const DictEntry Dict009Contents[] = { { 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" }, { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" }, { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" }, { 0x0023, 0x0030, 0, VR::LO, VM::M1, "CRLatitude" }, { 0x0023, 0x0040, 0, VR::LO, VM::M1, "CRGroupNumber" }, { 0x0023, 0x0050, 0, VR::US, VM::M1, "CRImageSerialNumber" }, { 0x0023, 0x0060, 0, VR::LO, VM::M1, "CRBarCodeNumber" }, { 0x0023, 0x0070, 0, VR::LO, VM::M1, "CRFilmOutputExposure" }, { 0x0023, 0x0080, 0, VR::LO, VM::M1, "CRFilmFormat" }, { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" }, }; const unsigned short Dict009TagHashTable[] = { 10, 11, 16, 19, 22, 25, 28, 31, 34, 37, 0, 2, 1, 16, 8, 128, 1, 7, 112, 1, 2, 32, 1, 5, 80, 1, 0, 0, 1, 6, 96, 1, 9, 144, 1, 4, 64, 1, 3, 48, }; const unsigned short Dict009KeyHashTable[] = { 11, 14, 17, 22, 27, 10, 30, 35, 10, 10, 0, 1, 2, 48761, 1, 1, 46224, 2, 3, 41522, 5, 31050, 2, 6, 39736, 8, 39860, 1, 4, 55886, 2, 7, 30788, 9, 22214, 1, 0, 6115, }; vtkDICOMDictionary::Dict Dict009Data = { "GEMS_ACRQA_1.0 BLOCK1", 10, 10, Dict009TagHashTable, Dict009KeyHashTable, Dict009Contents }; // ----- GEMS_ACRQA_1.0 BLOCK3 ----- const DictEntry Dict010Contents[] = { { 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" }, { 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" }, { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" }, { 0x0023, 0x0030, 0, VR::US, VM::M1, "CRORN" }, { 0x0023, 0x0040, 0, VR::US, VM::M1, "CRORD" }, { 0x0023, 0x0050, 0, VR::LO, VM::M1, "CRCassetteSize" }, { 0x0023, 0x0060, 0, VR::LO, VM::M1, "CRMachineID" }, { 0x0023, 0x0070, 0, VR::LO, VM::M1, "CRMachineType" }, { 0x0023, 0x0080, 0, VR::LO, VM::M1, "CRTechnicianCode" }, { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CREnergySubtractionParameters" }, }; const unsigned short Dict010TagHashTable[] = { 10, 11, 16, 19, 22, 25, 28, 31, 34, 37, 0, 2, 1, 16, 8, 128, 1, 7, 112, 1, 2, 32, 1, 5, 80, 1, 0, 0, 1, 6, 96, 1, 9, 144, 1, 4, 64, 1, 3, 48, }; const unsigned short Dict010KeyHashTable[] = { 11, 14, 10, 17, 20, 23, 28, 33, 10, 36, 0, 1, 6, 9446, 1, 5, 26824, 1, 8, 55588, 1, 9, 43581, 2, 3, 37578, 4, 37577, 2, 1, 36380, 2, 37577, 1, 0, 36379, 1, 7, 30116, }; vtkDICOMDictionary::Dict Dict010Data = { "GEMS_ACRQA_1.0 BLOCK3", 10, 10, Dict010TagHashTable, Dict010KeyHashTable, Dict010Contents }; // ----- GEMS_ACRQA_1.0 BLOCK2 ----- const DictEntry Dict011Contents[] = { { 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" }, { 0x0023, 0x0010, 0, VR::DS, VM::M1, "CRCShift" }, { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRGT" }, { 0x0023, 0x0030, 0, VR::DS, VM::M1, "CRGA" }, { 0x0023, 0x0040, 0, VR::DS, VM::M1, "CRGC" }, { 0x0023, 0x0050, 0, VR::DS, VM::M1, "CRGS" }, { 0x0023, 0x0060, 0, VR::DS, VM::M1, "CRRT" }, { 0x0023, 0x0070, 0, VR::DS, VM::M1, "CRRE" }, { 0x0023, 0x0080, 0, VR::US, VM::M1, "CRRN" }, { 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" }, }; const unsigned short Dict011TagHashTable[] = { 10, 11, 16, 19, 22, 25, 28, 31, 34, 37, 0, 2, 1, 16, 8, 128, 1, 7, 112, 1, 2, 32, 1, 5, 80, 1, 0, 0, 1, 6, 96, 1, 9, 144, 1, 4, 64, 1, 3, 48, }; const unsigned short Dict011KeyHashTable[] = { 11, 10, 14, 10, 10, 21, 24, 27, 32, 35, 0, 1, 3, 34077, 3, 4, 34077, 6, 34115, 9, 36381, 1, 0, 28887, 1, 8, 34114, 2, 1, 64674, 7, 34113, 1, 5, 34078, 1, 2, 34078, }; vtkDICOMDictionary::Dict Dict011Data = { "GEMS_ACRQA_1.0 BLOCK2", 10, 10, Dict011TagHashTable, Dict011KeyHashTable, Dict011Contents }; // ----- Siemens Ultrasound Miscellaneous ----- const DictEntry Dict012Contents[] = { { 0x0019, 0x0020, 0, VR::SH, VM::M1, "" }, }; const unsigned short Dict012TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict012KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict012Data = { "Siemens Ultrasound Miscellaneous", 1, 1, Dict012TagHashTable, Dict012KeyHashTable, Dict012Contents }; // ----- SPI ----- const DictEntry Dict013Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" }, { 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" }, { 0x0009, 0x0041, 0, VR::SH, VM::M1, "DataObjectSubtype" }, { 0x0011, 0x0010, 0, VR::LO, VM::M1, "Organ" }, { 0x0011, 0x0015, 0, VR::LO, VM::M1, "AllergyIndication" }, { 0x0011, 0x0020, 0, VR::LO, VM::M1, "Pregnancy" }, { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" }, }; const unsigned short Dict013TagHashTable[] = { 9, 14, 8, 8, 23, 8, 8, 8, 0, 2, 2, 64, 7, 96, 4, 0, 16, 3, 65, 4, 16, 6, 32, 2, 1, 21, 5, 21, }; const unsigned short Dict013KeyHashTable[] = { 9, 8, 12, 15, 18, 8, 23, 26, 0, 1, 2, 24415, 1, 3, 55708, 1, 0, 52021, 2, 4, 39623, 6, 29229, 1, 7, 57071, 2, 1, 1220, 5, 21898, }; vtkDICOMDictionary::Dict Dict013Data = { "SPI", 8, 8, Dict013TagHashTable, Dict013KeyHashTable, Dict013Contents }; // ----- GE ??? From Adantage Review CS ----- const DictEntry Dict014Contents[] = { { 0x0019, 0x0030, 0, VR::LO, VM::M1, "CREDRMode" }, { 0x0019, 0x0040, 0, VR::LO, VM::M1, "CRLatitude" }, { 0x0019, 0x0050, 0, VR::LO, VM::M1, "CRGroupNumber" }, { 0x0019, 0x0070, 0, VR::LO, VM::M1, "CRImageSerialNumber" }, { 0x0019, 0x0080, 0, VR::LO, VM::M1, "CRBarCodeNumber" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "CRFilmOutputExposures" }, }; const unsigned short Dict014TagHashTable[] = { 7, 10, 13, 6, 16, 19, 0, 1, 2, 80, 1, 5, 144, 1, 3, 112, 1, 1, 64, 2, 0, 48, 4, 128, }; const unsigned short Dict014KeyHashTable[] = { 7, 6, 6, 6, 12, 17, 0, 2, 0, 59423, 3, 29905, 2, 1, 3667, 2, 5762, 2, 4, 44381, 5, 33146, }; vtkDICOMDictionary::Dict Dict014Data = { "GE ??? From Adantage Review CS", 6, 6, Dict014TagHashTable, Dict014KeyHashTable, Dict014Contents }; // ----- SIEMENS SMS-AX QUANT 1.0 ----- const DictEntry Dict015Contents[] = { { 0x0023, 0x0000, 0, VR::DS, VM::M2, "HorizontalCalibrationPixelSize" }, { 0x0023, 0x0001, 0, VR::DS, VM::M2, "VerticalCalibrationPixelSize" }, { 0x0023, 0x0002, 0, VR::LO, VM::M1, "CalibrationObject" }, { 0x0023, 0x0003, 0, VR::DS, VM::M1, "CalibrationObjectSize" }, { 0x0023, 0x0004, 0, VR::LO, VM::M1, "CalibrationMethod" }, { 0x0023, 0x0005, 0, VR::ST, VM::M1, "Filename" }, { 0x0023, 0x0006, 0, VR::IS, VM::M1, "FrameNumber" }, { 0x0023, 0x0007, 0, VR::IS, VM::M2, "CalibrationFactorMultiplicity" }, { 0x0023, 0x0008, 0, VR::IS, VM::M1, "CalibrationTableObjectDistance" }, }; const unsigned short Dict015TagHashTable[] = { 10, 13, 16, 19, 9, 22, 25, 28, 33, 0, 1, 7, 7, 1, 6, 6, 1, 5, 5, 1, 4, 4, 1, 3, 3, 1, 2, 2, 2, 1, 1, 8, 8, 1, 0, 0, }; const unsigned short Dict015KeyHashTable[] = { 10, 13, 9, 18, 9, 23, 9, 26, 31, 0, 1, 0, 13876, 2, 3, 18830, 5, 23389, 2, 1, 44985, 8, 15636, 1, 2, 21895, 2, 4, 18319, 6, 54082, 1, 7, 23685, }; vtkDICOMDictionary::Dict Dict015Data = { "SIEMENS SMS-AX QUANT 1.0", 9, 9, Dict015TagHashTable, Dict015KeyHashTable, Dict015Contents }; // ----- AgilityRuntime ----- const DictEntry Dict016Contents[] = { { 0x0011, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0021, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0022, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0012, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0013, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0029, 0x001f, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict016TagHashTable[] = { 9, 14, 17, 20, 8, 25, 28, 8, 0, 2, 1, 33, 3, 17, 1, 0, 32, 1, 5, 19, 2, 2, 34, 4, 18, 1, 6, 20, 1, 7, 31, }; const unsigned short Dict016KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict016Data = { "AgilityRuntime", 8, 8, Dict016TagHashTable, Dict016KeyHashTable, Dict016Contents }; // ----- SIEMENS RA GEN ----- const DictEntry Dict017Contents[] = { { 0x0011, 0x0020, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0025, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0026, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0035, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0040, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x001f, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0036, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0056, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0058, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0062, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0066, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0072, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0074, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0076, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x007a, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x007c, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x007e, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0080, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0084, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0086, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0088, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x008a, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x008c, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x008e, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0092, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0094, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0096, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0098, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009a, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x009e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a2, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a5, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a6, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a7, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a8, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a9, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00aa, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ab, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ac, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ad, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ff, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0025, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict017TagHashTable[] = { 87, 88, 93, 96, 101, 106, 111, 116, 119, 122, 87, 131, 136, 139, 142, 145, 150, 153, 87, 160, 87, 163, 87, 166, 87, 169, 87, 172, 87, 87, 87, 87, 87, 175, 87, 182, 187, 190, 87, 195, 87, 200, 203, 206, 209, 212, 215, 218, 221, 224, 229, 232, 235, 240, 243, 246, 253, 256, 259, 262, 265, 268, 271, 274, 277, 87, 282, 87, 287, 87, 292, 87, 297, 87, 302, 87, 305, 87, 308, 87, 311, 87, 316, 87, 319, 87, 87, 0, 2, 24, 64, 81, 32, 1, 76, 171, 2, 25, 66, 75, 170, 2, 74, 169, 82, 37, 2, 26, 68, 73, 168, 2, 7, 31, 83, 39, 1, 27, 70, 1, 78, 173, 4, 49, 120, 77, 172, 84, 40, 86, 64, 2, 50, 122, 68, 162, 1, 6, 21, 1, 51, 124, 1, 72, 167, 2, 52, 126, 71, 166, 1, 70, 165, 3, 45, 112, 69, 164, 85, 48, 1, 46, 114, 1, 47, 116, 1, 48, 118, 1, 43, 104, 1, 44, 106, 3, 3, 48, 20, 56, 39, 96, 2, 21, 58, 40, 98, 1, 4, 53, 2, 22, 60, 41, 100, 2, 23, 62, 42, 102, 1, 16, 48, 1, 65, 154, 1, 17, 50, 1, 64, 152, 1, 18, 52, 1, 67, 158, 1, 19, 54, 1, 66, 156, 2, 0, 32, 12, 40, 1, 61, 146, 1, 13, 42, 2, 1, 37, 80, 21, 1, 14, 44, 1, 63, 150, 3, 2, 38, 15, 46, 79, 255, 1, 62, 148, 1, 8, 32, 1, 58, 138, 1, 9, 34, 1, 57, 136, 1, 10, 36, 1, 60, 142, 1, 11, 38, 2, 35, 88, 59, 140, 2, 36, 90, 54, 130, 2, 37, 92, 53, 128, 2, 38, 94, 56, 134, 2, 31, 80, 55, 132, 1, 32, 82, 1, 33, 84, 1, 34, 86, 2, 5, 64, 28, 72, 1, 29, 74, 1, 30, 76, }; const unsigned short Dict017KeyHashTable[] = { 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 87, 0, 61, 1, 61, 2, 61, 3, 61, 4, 61, 5, 61, 6, 61, 7, 61, 8, 61, 9, 61, 10, 61, 11, 61, 12, 61, 13, 61, 14, 61, 15, 61, 16, 61, 17, 61, 18, 61, 19, 61, 20, 61, 21, 61, 22, 61, 23, 61, 24, 61, 25, 61, 26, 61, 27, 61, 28, 61, 29, 61, 30, 61, 31, 61, 32, 61, 33, 61, 34, 61, 35, 61, 36, 61, 37, 61, 38, 61, 39, 61, 40, 61, 41, 61, 42, 61, 43, 61, 44, 61, 45, 61, 46, 61, 47, 61, 48, 61, 49, 61, 50, 61, 51, 61, 52, 61, 53, 61, 54, 61, 55, 61, 56, 61, 57, 61, 58, 61, 59, 61, 60, 61, 61, 61, 62, 61, 63, 61, 64, 61, 65, 61, 66, 61, 67, 61, 68, 61, 69, 61, 70, 61, 71, 61, 72, 61, 73, 61, 74, 61, 75, 61, 76, 61, 77, 61, 78, 61, 79, 61, 80, 61, 81, 61, 82, 61, 83, 61, 84, 61, 85, 61, 86, 61, }; vtkDICOMDictionary::Dict Dict017Data = { "SIEMENS RA GEN", 87, 87, Dict017TagHashTable, Dict017KeyHashTable, Dict017Contents }; // ----- Mayo/IBM Archive Project ----- const DictEntry Dict018Contents[] = { { 0x0021, 0x0001, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0011, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0012, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0013, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0014, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0015, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0016, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0017, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0019, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001a, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001b, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001c, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001d, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001e, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x001f, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0041, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0050, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0060, 0, VR::UN, VM::M1, "" }, { 0x0021, 0x0065, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict018TagHashTable[] = { 24, 27, 30, 33, 36, 41, 46, 49, 52, 55, 60, 63, 66, 69, 72, 75, 78, 81, 84, 23, 87, 23, 23, 0, 1, 22, 101, 1, 17, 32, 1, 2, 17, 1, 1, 16, 2, 4, 19, 18, 64, 2, 3, 18, 19, 65, 1, 6, 21, 1, 5, 20, 1, 8, 23, 2, 0, 1, 7, 22, 1, 10, 25, 1, 9, 24, 1, 12, 27, 1, 11, 26, 1, 14, 29, 1, 13, 28, 1, 16, 31, 1, 15, 30, 1, 21, 96, 1, 20, 80, }; const unsigned short Dict018KeyHashTable[] = { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 0, 23, 0, 233, 1, 233, 2, 233, 3, 233, 4, 233, 5, 233, 6, 233, 7, 233, 8, 233, 9, 233, 10, 233, 11, 233, 12, 233, 13, 233, 14, 233, 15, 233, 16, 233, 17, 233, 18, 233, 19, 233, 20, 233, 21, 233, 22, 233, }; vtkDICOMDictionary::Dict Dict018Data = { "Mayo/IBM Archive Project", 23, 23, Dict018TagHashTable, Dict018KeyHashTable, Dict018Contents }; // ----- SIEMENS SIENET ----- const DictEntry Dict019Contents[] = { { 0x0019, 0x0001, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict019TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict019KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict019Data = { "SIEMENS SIENET", 1, 1, Dict019TagHashTable, Dict019KeyHashTable, Dict019Contents }; // ----- MDS NORDION OTP ANATOMY MODELLING ----- const DictEntry Dict020Contents[] = { { 0x3005, 0x0000, 0, VR::SQ, VM::M1, "" }, { 0x3005, 0x0002, 0, VR::CS, VM::M1, "" }, { 0x3005, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x3005, 0x0006, 0, VR::DS, VM::M1, "" }, { 0x3005, 0x0008, 0, VR::DS, VM::M1, "" }, { 0x3005, 0x000a, 0, VR::CS, VM::M1, "" }, { 0x3005, 0x000c, 0, VR::CS, VM::M1, "" }, { 0x3005, 0x000e, 0, VR::CS, VM::M1, "" }, { 0x3005, 0x0010, 0, VR::DS, VM::M1, "" }, { 0x3005, 0x0012, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict020TagHashTable[] = { 10, 11, 10, 18, 10, 25, 10, 30, 10, 33, 0, 3, 2, 4, 7, 14, 8, 16, 3, 3, 6, 4, 8, 9, 18, 2, 0, 0, 5, 10, 1, 1, 2, 1, 6, 12, }; const unsigned short Dict020KeyHashTable[] = { 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 0, 538, 1, 538, 2, 538, 3, 538, 4, 538, 5, 538, 6, 538, 7, 538, 8, 538, 9, 538, }; vtkDICOMDictionary::Dict Dict020Data = { "MDS NORDION OTP ANATOMY MODELLING", 10, 10, Dict020TagHashTable, Dict020KeyHashTable, Dict020Contents }; // ----- SIEMENS CT APPL DATASET ----- const DictEntry Dict021Contents[] = { { 0x0029, 0x0000, 0, VR::LT, VM::M1, "DualEnergyAlgorithmParameters" }, { 0x0029, 0x0001, 0, VR::US, VM::M1, "ValidCTVolumeMBoxTasks" }, { 0x0029, 0x0002, 0, VR::LT, VM::M1, "ScanOptions" }, { 0x0029, 0x0003, 0, VR::ST, VM::M1, "AcquisitionDateandTime" }, { 0x0029, 0x0004, 0, VR::ST, VM::M1, "AcquisitionNumber" }, { 0x0029, 0x0005, 0, VR::ST, VM::M1, "DynamicData" }, { 0x0029, 0x0006, 0, VR::DS, VM::M6, "ImageOrientationPatient" }, { 0x0029, 0x0007, 0, VR::LT, VM::M1, "FrameOfReferenceUid" }, { 0x0029, 0x0008, 0, VR::LT, VM::M1, "PatientPosition" }, { 0x0029, 0x0009, 0, VR::LT, VM::M1, "ConvolutionKernel" }, { 0x0029, 0x0010, 0, VR::LT, VM::M1, "Kvp" }, { 0x0029, 0x0011, 0, VR::LT, VM::M1, "ReconstructionDiameter" }, { 0x0029, 0x0012, 0, VR::LT, VM::M1, "RescaleIntercept" }, { 0x0029, 0x0013, 0, VR::LT, VM::M1, "RescaleSlope" }, { 0x0029, 0x0014, 0, VR::LT, VM::M1, "SliceThickness" }, { 0x0029, 0x0015, 0, VR::LT, VM::M1, "TableHeight" }, { 0x0029, 0x0016, 0, VR::LT, VM::M1, "GantryDetectorTilt" }, { 0x0029, 0x0017, 0, VR::LT, VM::M1, "PixelSpacing" }, { 0x0029, 0x0018, 0, VR::ST, VM::M1, "VolumePatientPositionNotEqual" }, { 0x0029, 0x0019, 0, VR::ST, VM::M1, "VolumeLossyImageCompressionNotEqual" }, { 0x0029, 0x0020, 0, VR::ST, VM::M1, "VolumeConvolutionKernelNotEqual" }, { 0x0029, 0x0021, 0, VR::ST, VM::M1, "VolumePixelSpacingNotEqual" }, { 0x0029, 0x0022, 0, VR::ST, VM::M1, "VolumeKvpNotEqual" }, { 0x0029, 0x0023, 0, VR::ST, VM::M1, "VolumeReconstructionDiameterNotEqual" }, { 0x0029, 0x0024, 0, VR::ST, VM::M1, "VolumeTableHeightNotEqual" }, { 0x0029, 0x0025, 0, VR::ST, VM::M1, "VolumeHasGaps" }, { 0x0029, 0x0026, 0, VR::ST, VM::M1, "VolumeNumberOfMissingImages" }, { 0x0029, 0x0027, 0, VR::ST, VM::M1, "VolumeMaxGap" }, { 0x0029, 0x0028, 0, VR::LT, VM::M1, "VolumePositionOfGaps" }, { 0x0029, 0x0029, 0, VR::FD, VM::M1, "CalibrationFactor" }, { 0x0029, 0x002A, 0, VR::CS, VM::M1, "FlashMode" }, { 0x0029, 0x002B, 0, VR::LT, VM::M1, "Warnings" }, { 0x0029, 0x002C, 0, VR::ST, VM::M1, "VolumeHighBitNotEqual" }, { 0x0029, 0x002D, 0, VR::ST, VM::M1, "VolumeImageTypeNotEqual" }, { 0x0029, 0x002E, 0, VR::ST, VM::M1, "ImageType0" }, { 0x0029, 0x002F, 0, VR::ST, VM::M1, "ImageType1" }, { 0x0029, 0x0030, 0, VR::ST, VM::M1, "ImageType2" }, { 0x0029, 0x0031, 0, VR::ST, VM::M1, "ImageType3" }, { 0x0029, 0x0032, 0, VR::ST, VM::M1, "PhotometricInterpretationNotMONOCHROME2" }, { 0x0029, 0x0033, 0, VR::DA, VM::M1, "FirstAcquisitionDate" }, { 0x0029, 0x0034, 0, VR::DA, VM::M1, "LastAcquisitionDate" }, { 0x0029, 0x0035, 0, VR::TM, VM::M1, "FirstAcquisitionTime" }, { 0x0029, 0x0036, 0, VR::TM, VM::M1, "LastAcquisitionTime" }, { 0x0029, 0x0037, 0, VR::ST, VM::M1, "InternalData" }, { 0x0029, 0x0038, 0, VR::ST, VM::M1, "RangesSOM7" }, { 0x0029, 0x0039, 0, VR::LT, VM::M1, "CalculatedGantryDetectorTilt" }, { 0x0029, 0x0040, 0, VR::ST, VM::M1, "VolumeSliceDistance" }, { 0x0029, 0x0041, 0, VR::DS, VM::M1, "FirstSliceZCoordinate" }, { 0x0029, 0x0042, 0, VR::DS, VM::M1, "LastSliceZCoordinate" }, { 0x0029, 0x0043, 0, VR::DS, VM::M1, "ContentDateTime" }, { 0x0029, 0x0044, 0, VR::DS, VM::M1, "DeltaTime" }, { 0x0029, 0x0045, 0, VR::DS, VM::M1, "FrameCount" }, }; const unsigned short Dict021TagHashTable[] = { 53, 58, 63, 68, 73, 80, 87, 92, 97, 102, 107, 112, 117, 120, 123, 126, 129, 132, 52, 52, 52, 52, 52, 52, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 52, 52, 52, 52, 52, 52, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 52, 52, 0, 2, 29, 41, 46, 64, 2, 28, 40, 47, 65, 2, 31, 43, 48, 66, 2, 30, 42, 49, 67, 3, 11, 17, 33, 45, 50, 68, 3, 10, 16, 32, 44, 51, 69, 2, 13, 19, 35, 47, 2, 12, 18, 34, 46, 2, 15, 21, 21, 33, 2, 14, 20, 20, 32, 2, 17, 23, 23, 35, 2, 16, 22, 22, 34, 1, 25, 37, 1, 24, 36, 1, 27, 39, 1, 26, 38, 1, 45, 57, 1, 44, 56, 1, 37, 49, 1, 36, 48, 1, 39, 51, 1, 38, 50, 1, 41, 53, 1, 40, 52, 1, 43, 55, 1, 42, 54, 1, 9, 9, 1, 8, 8, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 19, 25, 1, 18, 24, }; const unsigned short Dict021KeyHashTable[] = { 53, 52, 52, 52, 56, 59, 62, 52, 52, 67, 74, 52, 52, 52, 79, 84, 93, 98, 52, 101, 106, 52, 52, 52, 52, 52, 109, 114, 121, 126, 133, 52, 52, 136, 139, 142, 149, 52, 52, 52, 52, 52, 52, 158, 163, 166, 52, 52, 169, 172, 177, 182, 0, 1, 39, 40809, 1, 43, 31782, 1, 21, 33650, 2, 10, 50420, 28, 24391, 3, 6, 25368, 38, 7779, 51, 62660, 2, 11, 25178, 12, 47626, 2, 7, 3826, 31, 57640, 4, 13, 35886, 27, 5983, 33, 47907, 48, 23235, 2, 0, 4568, 5, 53825, 1, 42, 16560, 2, 22, 9909, 23, 61216, 1, 1, 16095, 2, 15, 4687, 34, 48912, 3, 24, 49759, 35, 48912, 45, 12602, 2, 18, 64433, 36, 48912, 3, 16, 52297, 32, 33698, 37, 48912, 1, 50, 48816, 1, 41, 52029, 1, 2, 60577, 3, 4, 55361, 26, 61522, 47, 19115, 4, 29, 54066, 30, 32257, 40, 5339, 46, 13297, 2, 8, 27213, 20, 60843, 1, 17, 54896, 1, 49, 46488, 1, 25, 39073, 2, 14, 53956, 19, 11757, 2, 3, 54035, 9, 15761, 1, 44, 55446, }; vtkDICOMDictionary::Dict Dict021Data = { "SIEMENS CT APPL DATASET", 52, 52, Dict021TagHashTable, Dict021KeyHashTable, Dict021Contents }; // ----- DCMTK_ANONYMIZER ----- const DictEntry Dict022Contents[] = { { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "AnonymizerUIDMap" }, { 0x0009, 0x0010, 0, VR::UI, VM::M1, "AnonymizerUIDKey" }, { 0x0009, 0x0020, 0, VR::UI, VM::M1, "AnonymizerUIDValue" }, { 0x0009, 0x0030, 0, VR::SQ, VM::M1, "AnonymizerPatientIDMap" }, { 0x0009, 0x0040, 0, VR::LO, VM::M1, "AnonymizerPatientIDKey" }, { 0x0009, 0x0050, 0, VR::LO, VM::M1, "AnonymizerPatientIDValue" }, }; const unsigned short Dict022TagHashTable[] = { 7, 10, 6, 13, 18, 21, 0, 1, 4, 64, 1, 1, 16, 2, 0, 0, 3, 48, 1, 5, 80, 1, 2, 32, }; const unsigned short Dict022KeyHashTable[] = { 6, 6, 7, 6, 6, 16, 0, 4, 1, 45231, 2, 25229, 4, 19471, 5, 21997, 2, 0, 45570, 3, 19810, }; vtkDICOMDictionary::Dict Dict022Data = { "DCMTK_ANONYMIZER", 6, 6, Dict022TagHashTable, Dict022KeyHashTable, Dict022Contents }; // ----- ULTRAVISUAL_TAG_SET1 ----- const DictEntry Dict023Contents[] = { { 0x0011, 0x0001, 0, VR::CS, VM::M1, "" }, { 0x0011, 0x0002, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0003, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0011, 0x0011, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0012, 0, VR::UI, VM::M1, "" }, { 0x0011, 0x0018, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0019, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x001a, 0, VR::CS, VM::M1, "" }, { 0x0011, 0x001b, 0, VR::IS, VM::M1, "" }, { 0x0011, 0x001c, 0, VR::IS, VM::M1, "" }, { 0x0011, 0x001d, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict023TagHashTable[] = { 14, 19, 13, 22, 13, 27, 30, 13, 33, 36, 39, 42, 45, 0, 2, 5, 17, 11, 28, 1, 4, 16, 2, 0, 1, 6, 18, 1, 2, 3, 1, 1, 2, 1, 8, 25, 1, 7, 24, 1, 10, 27, 1, 9, 26, 2, 3, 8, 12, 29, }; const unsigned short Dict023KeyHashTable[] = { 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 0, 13, 0, 413, 1, 413, 2, 413, 3, 413, 4, 413, 5, 413, 6, 413, 7, 413, 8, 413, 9, 413, 10, 413, 11, 413, 12, 413, }; vtkDICOMDictionary::Dict Dict023Data = { "ULTRAVISUAL_TAG_SET1", 13, 13, Dict023TagHashTable, Dict023KeyHashTable, Dict023Contents }; // ----- syngoDynamics ----- const DictEntry Dict024Contents[] = { { 0x0021, 0x00ae, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x00b0, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x00b1, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict024TagHashTable[] = { 4, 3, 9, 0, 2, 0, 174, 1, 176, 1, 2, 177, }; const unsigned short Dict024KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict024Data = { "syngoDynamics", 3, 3, Dict024TagHashTable, Dict024KeyHashTable, Dict024Contents }; // ----- SIEMENS SYNGO ULTRA-SOUND TOYON DATA STREAMING ----- const DictEntry Dict025Contents[] = { { 0x7FD1, 0x0001, 0, VR::OB, VM::M1, "Padding" }, { 0x7FD1, 0x0009, 0, VR::OB, VM::M1, "VersionID" }, { 0x7FD1, 0x0010, 0, VR::LO, VM::M1, "Payload" }, { 0x7FD1, 0x0011, 0, VR::LO, VM::M1, "AfterPayload" }, }; const unsigned short Dict025TagHashTable[] = { 4, 4, 5, 8, 0, 1, 2, 16, 3, 0, 1, 1, 9, 3, 17, }; const unsigned short Dict025KeyHashTable[] = { 5, 10, 4, 13, 0, 2, 0, 19727, 1, 42278, 1, 3, 47800, 1, 2, 27755, }; vtkDICOMDictionary::Dict Dict025Data = { "SIEMENS SYNGO ULTRA-SOUND TOYON DATA STREAMING", 4, 4, Dict025TagHashTable, Dict025KeyHashTable, Dict025Contents }; // ----- Hipaa Private Creator ----- const DictEntry Dict026Contents[] = { { 0x0011, 0x0001, 0, VR::LT, VM::M1, "EncryptedInstanceCreatorID" }, { 0x0011, 0x0002, 0, VR::LT, VM::M1, "EncryptedSOPInstanceUID" }, { 0x0011, 0x0003, 0, VR::LT, VM::M1, "EncryptedAccessionNumber" }, { 0x0011, 0x0004, 0, VR::LT, VM::M1, "EncryptedInstitutionName" }, { 0x0011, 0x0005, 0, VR::LT, VM::M1, "EncryptedInstitutionAddress" }, { 0x0011, 0x0006, 0, VR::LT, VM::M1, "EncryptedReferringPhysicianName" }, { 0x0011, 0x0007, 0, VR::LT, VM::M1, "EncryptedReferringPhysicianAddress" }, { 0x0011, 0x0008, 0, VR::LT, VM::M1, "EncryptedStationName" }, { 0x0011, 0x0009, 0, VR::LT, VM::M1, "EncryptedStudyDescription" }, { 0x0011, 0x0010, 0, VR::LT, VM::M1, "EncryptedSeriesDescription" }, { 0x0011, 0x0011, 0, VR::LT, VM::M1, "EncryptedInstitutionalDepartmentName" }, { 0x0011, 0x0012, 0, VR::LT, VM::M1, "EncryptedPhysiciansOfRecord" }, { 0x0011, 0x0013, 0, VR::LT, VM::M1, "EncryptedPerformingPhysicianName" }, { 0x0011, 0x0014, 0, VR::LT, VM::M1, "EncryptedNameOfPhysiciansReadingStudy" }, { 0x0011, 0x0015, 0, VR::LT, VM::M1, "EncryptedOperatorName" }, { 0x0011, 0x0016, 0, VR::LT, VM::M1, "EncryptedAdmittingDiagnosesDescription" }, { 0x0011, 0x0017, 0, VR::LT, VM::M1, "EncryptedReferencedSOPInstanceUID" }, { 0x0011, 0x0018, 0, VR::LT, VM::M1, "EncryptedDerivationDescription" }, { 0x0011, 0x0019, 0, VR::LT, VM::M1, "EncryptedPatientName" }, { 0x0011, 0x0020, 0, VR::LT, VM::M1, "EncryptedPatientID" }, { 0x0011, 0x0021, 0, VR::LT, VM::M1, "EncryptedPatientBirthDate" }, { 0x0011, 0x0022, 0, VR::LT, VM::M1, "EncryptedPatientBirthTime" }, { 0x0011, 0x0023, 0, VR::LT, VM::M1, "EncryptedPatientSex" }, { 0x0011, 0x0024, 0, VR::LT, VM::M1, "EncryptedOtherPatientIDs" }, { 0x0011, 0x0025, 0, VR::LT, VM::M1, "EncryptedOtherPatientNames" }, { 0x0011, 0x0026, 0, VR::LT, VM::M1, "EncryptedPatientAge" }, { 0x0011, 0x0027, 0, VR::LT, VM::M1, "EncryptedPatientSize" }, { 0x0011, 0x0028, 0, VR::LT, VM::M1, "EncryptedPatientWeight" }, { 0x0011, 0x0029, 0, VR::LT, VM::M1, "EncryptedMedicalRecordLocator" }, { 0x0011, 0x0030, 0, VR::LT, VM::M1, "EncryptedEthnicGroup" }, { 0x0011, 0x0031, 0, VR::LT, VM::M1, "EncryptedOccupation" }, { 0x0011, 0x0032, 0, VR::LT, VM::M1, "EncryptedAdditionalPatient'sHistory" }, { 0x0011, 0x0033, 0, VR::LT, VM::M1, "EncryptedPatientComments" }, { 0x0011, 0x0034, 0, VR::LT, VM::M1, "EncryptedDeviceSerialNumber" }, { 0x0011, 0x0035, 0, VR::LT, VM::M1, "EncryptedProtocolName" }, { 0x0011, 0x0036, 0, VR::LT, VM::M1, "EncryptedStudyInstanceUID" }, { 0x0011, 0x0037, 0, VR::LT, VM::M1, "EncryptedSeriesInstanceUID" }, { 0x0011, 0x0038, 0, VR::LT, VM::M1, "EncryptedStudyID" }, { 0x0011, 0x0039, 0, VR::LT, VM::M1, "EncryptedFrameOfReferenceUID" }, { 0x0011, 0x0040, 0, VR::LT, VM::M1, "EncryptedSynchronizationFrameOfReferenceUID" }, { 0x0011, 0x0041, 0, VR::LT, VM::M1, "EncryptedImageComments" }, { 0x0011, 0x0042, 0, VR::LT, VM::M1, "EncryptedUID" }, }; const unsigned short Dict026TagHashTable[] = { 43, 46, 49, 52, 55, 58, 61, 66, 71, 76, 81, 84, 87, 90, 93, 96, 99, 42, 102, 105, 108, 111, 114, 117, 120, 123, 42, 42, 42, 42, 42, 42, 126, 129, 132, 135, 138, 141, 144, 149, 154, 159, 0, 1, 10, 17, 1, 9, 16, 1, 12, 19, 1, 11, 18, 1, 14, 21, 1, 13, 20, 2, 16, 23, 20, 33, 2, 15, 22, 19, 32, 2, 18, 25, 22, 35, 2, 17, 24, 21, 34, 1, 24, 37, 1, 23, 36, 1, 26, 39, 1, 25, 38, 1, 28, 41, 1, 27, 40, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 1, 5, 6, 1, 8, 9, 1, 7, 8, 1, 30, 49, 1, 29, 48, 1, 32, 51, 1, 31, 50, 1, 34, 53, 1, 33, 52, 2, 36, 55, 39, 64, 2, 35, 54, 40, 65, 2, 38, 57, 41, 66, 1, 37, 56, }; const unsigned short Dict026KeyHashTable[] = { 43, 48, 42, 42, 42, 51, 42, 54, 61, 64, 67, 72, 81, 42, 84, 89, 94, 99, 42, 42, 102, 42, 105, 42, 108, 42, 111, 114, 121, 42, 126, 131, 42, 136, 139, 42, 142, 42, 147, 42, 42, 150, 0, 2, 11, 19549, 30, 3812, 1, 4, 26701, 1, 26, 46835, 3, 15, 3435, 16, 61764, 37, 38245, 1, 2, 42958, 1, 28, 45246, 2, 14, 64415, 24, 41218, 4, 12, 9441, 18, 42339, 36, 11617, 41, 65265, 1, 7, 5185, 2, 22, 3969, 27, 39869, 2, 0, 65247, 20, 30904, 2, 9, 49509, 34, 21295, 1, 31, 34790, 1, 5, 3774, 1, 23, 34050, 1, 21, 44796, 1, 3, 62122, 3, 13, 20902, 19, 53353, 29, 34096, 2, 33, 61608, 40, 25472, 2, 1, 24195, 39, 56604, 2, 25, 3503, 35, 14538, 1, 6, 25018, 1, 32, 28606, 2, 8, 52430, 38, 62112, 1, 17, 58327, 1, 10, 15, }; vtkDICOMDictionary::Dict Dict026Data = { "Hipaa Private Creator", 42, 42, Dict026TagHashTable, Dict026KeyHashTable, Dict026Contents }; // ----- GEMS_GNHD_01 ----- const DictEntry Dict027Contents[] = { { 0x0033, 0x0001, 0, VR::UN, VM::M1, "" }, { 0x0033, 0x0002, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict027TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict027KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict027Data = { "GEMS_GNHD_01", 2, 2, Dict027TagHashTable, Dict027KeyHashTable, Dict027Contents }; // ----- PAPYRUS 3.0 ----- const DictEntry Dict028Contents[] = { { 0x0041, 0x0000, 0, VR::LT, VM::M1, "PapyrusComments" }, { 0x0041, 0x0010, 0, VR::SQ, VM::M1, "PointerSequence" }, { 0x0041, 0x0011, 0, VR::UL, VM::M1, "ImagePointer" }, { 0x0041, 0x0012, 0, VR::UL, VM::M1, "PixelOffset" }, { 0x0041, 0x0013, 0, VR::SQ, VM::M1, "ImageIdentifierSequence" }, { 0x0041, 0x0014, 0, VR::SQ, VM::M1, "ExternalFileReferenceSequence" }, { 0x0041, 0x0015, 0, VR::US, VM::M1, "NumberOfImages" }, { 0x0041, 0x0021, 0, VR::UI, VM::M1, "ReferencedSOPClassUID" }, { 0x0041, 0x0022, 0, VR::UI, VM::M1, "ReferencedSOPInstanceUID" }, { 0x0041, 0x0031, 0, VR::LT, VM::M1, "ReferencedFileName" }, { 0x0041, 0x0032, 0, VR::LT, VM::M1TN, "ReferencedFilePath" }, { 0x0041, 0x0041, 0, VR::UI, VM::M1, "ReferencedImageSOPClassUID" }, { 0x0041, 0x0042, 0, VR::UI, VM::M1, "ReferencedImageSOPInstanceUID" }, { 0x0041, 0x0050, 0, VR::SQ, VM::M1, "ImageSequence" }, }; const unsigned short Dict028TagHashTable[] = { 15, 22, 27, 30, 14, 14, 14, 14, 35, 14, 38, 41, 44, 47, 0, 3, 5, 20, 8, 34, 11, 65, 2, 6, 21, 9, 49, 1, 10, 50, 2, 12, 66, 13, 80, 1, 0, 0, 1, 1, 16, 1, 2, 17, 1, 3, 18, 2, 4, 19, 7, 33, }; const unsigned short Dict028KeyHashTable[] = { 14, 14, 15, 18, 14, 23, 14, 26, 29, 34, 14, 37, 44, 49, 0, 1, 4, 43943, 2, 1, 49618, 9, 38509, 1, 13, 32018, 1, 0, 44436, 2, 3, 50245, 12, 17474, 1, 6, 44360, 3, 2, 13881, 10, 43659, 11, 25051, 2, 5, 32974, 7, 31789, 1, 8, 54838, }; vtkDICOMDictionary::Dict Dict028Data = { "PAPYRUS 3.0", 14, 14, Dict028TagHashTable, Dict028KeyHashTable, Dict028Contents }; // ----- BrainLAB_Conversion ----- const DictEntry Dict029Contents[] = { { 0x0009, 0x0001, 0, VR::LO, VM::M1, "ExportPlatformName" }, { 0x0009, 0x0002, 0, VR::OB, VM::M1, "ExportPlatformData" }, }; const unsigned short Dict029TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict029KeyHashTable[] = { 3, 6, 0, 1, 1, 2851, 1, 0, 51350, }; vtkDICOMDictionary::Dict Dict029Data = { "BrainLAB_Conversion", 2, 2, Dict029TagHashTable, Dict029KeyHashTable, Dict029Contents }; // ----- Philips MR Imaging DD 003 ----- const DictEntry Dict030Contents[] = { { 0x2005, 0x0000, 0, VR::UL, VM::M1, "NumberOfSOPCommon" }, { 0x2005, 0x0001, 0, VR::UL, VM::M1, "NoOfFilmConsumption" }, { 0x2005, 0x0013, 0, VR::UL, VM::M1, "NumberOfCodes" }, { 0x2005, 0x0034, 0, VR::SL, VM::M1, "NumberOfImagePerSeriesRef" }, { 0x2005, 0x0043, 0, VR::SS, VM::M1, "NoDateOfLastCalibration" }, { 0x2005, 0x0044, 0, VR::SS, VM::M1, "NoTimeOfLastCalibration" }, { 0x2005, 0x0045, 0, VR::SS, VM::M1, "NrOfSoftwareVersion" }, { 0x2005, 0x0047, 0, VR::SS, VM::M1, "NrOfPatientOtherNames" }, { 0x2005, 0x0048, 0, VR::SS, VM::M1, "NrOfReqRecipeOfResults" }, { 0x2005, 0x0049, 0, VR::SS, VM::M1, "NrOfSeriesOperatorsName" }, { 0x2005, 0x0050, 0, VR::SS, VM::M1, "NrOfSeriesPerfPhysiName" }, { 0x2005, 0x0051, 0, VR::SS, VM::M1, "NrOfStudyAdmittingDiagnosticDescr" }, { 0x2005, 0x0052, 0, VR::SS, VM::M1, "NrOfStudyPatientContrastAllergies" }, { 0x2005, 0x0053, 0, VR::SS, VM::M1, "NrOfStudyPatientMedicalAlerts" }, { 0x2005, 0x0054, 0, VR::SS, VM::M1, "NrOfStudyPhysiciansOfRecord" }, { 0x2005, 0x0055, 0, VR::SS, VM::M1, "NrOfStudyPhysiReadingStudy" }, { 0x2005, 0x0056, 0, VR::SS, VM::M1, "NrSCSoftwareVersions" }, { 0x2005, 0x0057, 0, VR::SS, VM::M1, "NrRunningAttributes" }, { 0x2005, 0x0070, 0, VR::OW, VM::M1, "SpectrumPixelData" }, { 0x2005, 0x0081, 0, VR::UI, VM::M1, "DefaultImageUID" }, { 0x2005, 0x0082, 0, VR::CS, VM::M1TN, "RunningAttributes" }, }; const unsigned short Dict030TagHashTable[] = { 22, 25, 28, 31, 34, 37, 44, 49, 54, 61, 21, 64, 67, 21, 21, 70, 21, 73, 76, 21, 21, 0, 1, 14, 84, 1, 15, 85, 1, 16, 86, 1, 17, 87, 1, 10, 80, 3, 2, 19, 5, 68, 11, 81, 2, 6, 69, 12, 82, 2, 13, 83, 20, 130, 3, 1, 1, 7, 71, 19, 129, 1, 0, 0, 1, 3, 52, 1, 4, 67, 1, 18, 112, 1, 8, 72, 1, 9, 73, }; const unsigned short Dict030KeyHashTable[] = { 21, 21, 21, 22, 21, 29, 32, 21, 21, 35, 38, 41, 21, 21, 44, 51, 56, 61, 21, 21, 70, 0, 3, 1, 55599, 4, 30326, 19, 53628, 1, 10, 55407, 1, 3, 29747, 1, 16, 55710, 1, 5, 12568, 1, 9, 3858, 3, 7, 6875, 8, 8487, 13, 4804, 2, 0, 48819, 2, 34170, 2, 14, 15210, 18, 52308, 4, 11, 13077, 12, 40105, 15, 2458, 20, 27148, 2, 6, 60827, 17, 42261, }; vtkDICOMDictionary::Dict Dict030Data = { "Philips MR Imaging DD 003", 21, 21, Dict030TagHashTable, Dict030KeyHashTable, Dict030Contents }; // ----- ACUSON ----- const DictEntry Dict031Contents[] = { { 0x0009, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0002, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0003, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0004, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0005, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0006, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0007, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0008, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0009, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x000a, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x000b, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x000c, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x000d, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x000e, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x000f, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0011, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0012, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0013, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0014, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0015, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict031TagHashTable[] = { 23, 26, 29, 34, 39, 44, 49, 54, 59, 62, 65, 68, 71, 74, 77, 80, 22, 22, 22, 22, 22, 22, 0, 1, 9, 9, 1, 8, 8, 2, 11, 11, 17, 17, 2, 10, 10, 16, 16, 2, 13, 13, 19, 19, 2, 12, 12, 18, 18, 2, 15, 15, 21, 21, 2, 14, 14, 20, 20, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, }; const unsigned short Dict031KeyHashTable[] = { 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 0, 244, 1, 244, 2, 244, 3, 244, 4, 244, 5, 244, 6, 244, 7, 244, 8, 244, 9, 244, 10, 244, 11, 244, 12, 244, 13, 244, 14, 244, 15, 244, 16, 244, 17, 244, 18, 244, 19, 244, 20, 244, 21, 244, }; vtkDICOMDictionary::Dict Dict031Data = { "ACUSON", 22, 22, Dict031TagHashTable, Dict031KeyHashTable, Dict031Contents }; // ----- Philips MR Imaging DD 001 ----- const DictEntry Dict032Contents[] = { { 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" }, { 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" }, { 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" }, { 0x2005, 0x0003, 0, VR::IS, VM::M1, "ImageAnnotationCount" }, { 0x2005, 0x0004, 0, VR::CS, VM::M1, "ImageDisplayOrientation" }, { 0x2005, 0x0005, 0, VR::CS, VM::M1, "SynergyReconstructionType" }, { 0x2005, 0x0007, 0, VR::IS, VM::M1, "ImageLineCount" }, { 0x2005, 0x0008, 0, VR::FL, VM::M1, "ImageOffcenterAP" }, { 0x2005, 0x0009, 0, VR::FL, VM::M1, "ImageOffcenterFH" }, { 0x2005, 0x000a, 0, VR::FL, VM::M1, "ImageOffCentreRL" }, { 0x2005, 0x000b, 0, VR::FL, VM::M1, "MaxFP" }, { 0x2005, 0x000c, 0, VR::FL, VM::M1, "MinFP" }, { 0x2005, 0x000d, 0, VR::FL, VM::M1, "ScaleIntercept" }, { 0x2005, 0x000e, 0, VR::FL, VM::M1, "ScaleSlope" }, { 0x2005, 0x000f, 0, VR::DS, VM::M1, "WindowCenter" }, { 0x2005, 0x0010, 0, VR::DS, VM::M1, "WindowWidth" }, { 0x2005, 0x0011, 0, VR::CS, VM::M1TN, "ImageType" }, { 0x2005, 0x0012, 0, VR::CS, VM::M1, "CardiacGating" }, { 0x2005, 0x0013, 0, VR::CS, VM::M1, "DevelopmentMode" }, { 0x2005, 0x0014, 0, VR::CS, VM::M1, "Diffusion" }, { 0x2005, 0x0015, 0, VR::CS, VM::M1, "FatSaturation" }, { 0x2005, 0x0016, 0, VR::CS, VM::M1, "FlowCompensation" }, { 0x2005, 0x0017, 0, VR::CS, VM::M1, "FourierInterpolation" }, { 0x2005, 0x0018, 0, VR::LO, VM::M1, "HardcopyProtocol" }, { 0x2005, 0x0019, 0, VR::CS, VM::M1, "InverseReconstructed" }, { 0x2005, 0x001a, 0, VR::SS, VM::M1, "LabelSyntax" }, { 0x2005, 0x001b, 0, VR::CS, VM::M1, "MagnetizationPrepared" }, { 0x2005, 0x001c, 0, VR::CS, VM::M1, "MagnetizationTransferContrast" }, { 0x2005, 0x001d, 0, VR::SS, VM::M1, "MeasurementScanResolution" }, { 0x2005, 0x001e, 0, VR::SH, VM::M1, "MIPProtocol" }, { 0x2005, 0x001f, 0, VR::SH, VM::M1, "MPRProtocol" }, { 0x2005, 0x0020, 0, VR::SL, VM::M1, "NumberOfChemicalShifts" }, { 0x2005, 0x0021, 0, VR::SS, VM::M1, "NumberOfMixes" }, { 0x2005, 0x0022, 0, VR::IS, VM::M1, "NumberOfReferences" }, { 0x2005, 0x0023, 0, VR::SS, VM::M1, "NumberOfSlabs" }, { 0x2005, 0x0025, 0, VR::SS, VM::M1, "NumberOfVolumes" }, { 0x2005, 0x0026, 0, VR::CS, VM::M1, "OverSamplingPhase" }, { 0x2005, 0x0027, 0, VR::CS, VM::M1, "PackageMode" }, { 0x2005, 0x0028, 0, VR::CS, VM::M1, "PartialFourierFrequency" }, { 0x2005, 0x0029, 0, VR::CS, VM::M1, "PartialFourierPhase" }, { 0x2005, 0x002a, 0, VR::IS, VM::M1, "PatientReferenceID" }, { 0x2005, 0x002b, 0, VR::SS, VM::M1, "PercentScanComplete" }, { 0x2005, 0x002c, 0, VR::CS, VM::M1, "PhaseEncodeReordering" }, { 0x2005, 0x002d, 0, VR::IS, VM::M1, "PlanScanSurveyNumberOfImages" }, { 0x2005, 0x002e, 0, VR::CS, VM::M1, "PPGPPUGating" }, { 0x2005, 0x002f, 0, VR::CS, VM::M1, "SpatialPresaturation" }, { 0x2005, 0x0030, 0, VR::FL, VM::M1TN, "RepetitionTime" }, { 0x2005, 0x0031, 0, VR::CS, VM::M1, "RespiratoryGating" }, { 0x2005, 0x0032, 0, VR::CS, VM::M1, "SampleRepresentation" }, { 0x2005, 0x0033, 0, VR::FL, VM::M1, "AcquisitionDuration" }, { 0x2005, 0x0034, 0, VR::CS, VM::M1, "SegmentedKSpace" }, { 0x2005, 0x0035, 0, VR::CS, VM::M1, "DataType" }, { 0x2005, 0x0036, 0, VR::CS, VM::M1, "IsCardiac" }, { 0x2005, 0x0037, 0, VR::CS, VM::M1, "IsSpectro" }, { 0x2005, 0x0038, 0, VR::CS, VM::M1, "Spoiled" }, { 0x2005, 0x0039, 0, VR::CS, VM::M1, "SteadyState" }, { 0x2005, 0x003a, 0, VR::SH, VM::M1, "SubAnatomy" }, { 0x2005, 0x003b, 0, VR::CS, VM::M1, "TimeReversedSteadyState" }, { 0x2005, 0x003c, 0, VR::CS, VM::M1, "TiltOptimizedNonsaturatedExcitation" }, { 0x2005, 0x003d, 0, VR::SS, VM::M1, "NumberOfRRIntervalRanges" }, { 0x2005, 0x003e, 0, VR::SL, VM::M1TN, "RRIntervalsDistribution" }, { 0x2005, 0x003f, 0, VR::SL, VM::M1, "PlanScanAcquisitionNumber" }, { 0x2005, 0x0040, 0, VR::SL, VM::M1TN, "PlanScanSurveyChemicalShiftNumber" }, { 0x2005, 0x0041, 0, VR::SL, VM::M1TN, "PlanScanSurveyDynamicScanNumber" }, { 0x2005, 0x0042, 0, VR::SL, VM::M1TN, "PlanScanSurveyEchoNumber" }, { 0x2005, 0x0043, 0, VR::CS, VM::M1TN, "PlanScanSurveyImageType" }, { 0x2005, 0x0044, 0, VR::SL, VM::M1TN, "PlanScanSurveyPhaseNumber" }, { 0x2005, 0x0045, 0, VR::SL, VM::M1TN, "PlanScanSurveyReconstructionNumber" }, { 0x2005, 0x0046, 0, VR::CS, VM::M1TN, "PlanScanSurveyScanningSequence" }, { 0x2005, 0x0047, 0, VR::SL, VM::M1TN, "PlanScanSurveyCSliceNumber" }, { 0x2005, 0x0048, 0, VR::IS, VM::M1TN, "ReferencedAcquisitionNumber" }, { 0x2005, 0x0049, 0, VR::IS, VM::M1TN, "ReferencedChemicalShiftNumber" }, { 0x2005, 0x004a, 0, VR::IS, VM::M1TN, "ReferenceDynamicScanNumber" }, { 0x2005, 0x004b, 0, VR::IS, VM::M1TN, "ReferencedEchoNumber" }, { 0x2005, 0x004c, 0, VR::CS, VM::M1TN, "ReferencedEntity" }, { 0x2005, 0x004d, 0, VR::CS, VM::M1TN, "ReferencedImageType" }, { 0x2005, 0x004e, 0, VR::FL, VM::M1TN, "SlabFOVRL" }, { 0x2005, 0x004f, 0, VR::FL, VM::M1TN, "SlabOffcentreAP" }, { 0x2005, 0x0050, 0, VR::FL, VM::M1TN, "SlabOffcentreFH" }, { 0x2005, 0x0051, 0, VR::FL, VM::M1TN, "SlabOffcentreRL" }, { 0x2005, 0x0052, 0, VR::CS, VM::M1TN, "SlabType" }, { 0x2005, 0x0053, 0, VR::CS, VM::M1TN, "SlabViewAxis" }, { 0x2005, 0x0054, 0, VR::FL, VM::M1TN, "VolumeAngulationAP" }, { 0x2005, 0x0055, 0, VR::FL, VM::M1TN, "VolumeAngulationFH" }, { 0x2005, 0x0056, 0, VR::FL, VM::M1TN, "VolumeAngulationRL" }, { 0x2005, 0x0057, 0, VR::FL, VM::M1TN, "VolumeFOVAP" }, { 0x2005, 0x0058, 0, VR::FL, VM::M1TN, "VolumeFOVFH" }, { 0x2005, 0x0059, 0, VR::FL, VM::M1TN, "VolumeFOVRL" }, { 0x2005, 0x005a, 0, VR::FL, VM::M1TN, "VolumeOffcentreAP" }, { 0x2005, 0x005b, 0, VR::FL, VM::M1TN, "VolumeOffcentreFH" }, { 0x2005, 0x005c, 0, VR::FL, VM::M1TN, "VolumeOffcentreRL" }, { 0x2005, 0x005d, 0, VR::CS, VM::M1TN, "VolumeType" }, { 0x2005, 0x005e, 0, VR::CS, VM::M1TN, "VolumeViewAxis" }, { 0x2005, 0x005f, 0, VR::CS, VM::M1, "StudyOrigin" }, { 0x2005, 0x0060, 0, VR::IS, VM::M1, "StudySequenceNumber" }, { 0x2005, 0x0061, 0, VR::CS, VM::M1, "PrepulseType" }, { 0x2005, 0x0063, 0, VR::SS, VM::M1, "fMRIStatusIndication" }, { 0x2005, 0x0064, 0, VR::IS, VM::M1TN, "ReferencePhaseNumber" }, { 0x2005, 0x0065, 0, VR::IS, VM::M1TN, "ReferenceReconstructionNumber" }, { 0x2005, 0x0066, 0, VR::CS, VM::M1TN, "ReferenceScanningSequence" }, { 0x2005, 0x0067, 0, VR::IS, VM::M1TN, "ReferenceSliceNumber" }, { 0x2005, 0x0068, 0, VR::CS, VM::M1TN, "ReferenceType" }, { 0x2005, 0x0069, 0, VR::FL, VM::M1TN, "SlabAngulationAP" }, { 0x2005, 0x006a, 0, VR::FL, VM::M1TN, "SlabAngulationFH" }, { 0x2005, 0x006b, 0, VR::FL, VM::M1TN, "SlabAngulationRL" }, { 0x2005, 0x006c, 0, VR::FL, VM::M1TN, "SlabFOVAP" }, { 0x2005, 0x006d, 0, VR::FL, VM::M1TN, "SlabFOVFH" }, { 0x2005, 0x006e, 0, VR::CS, VM::M1TN, "ScanningSequence" }, { 0x2005, 0x006f, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x2005, 0x0070, 0, VR::LO, VM::M1, "HardcopyProtocolEV" }, { 0x2005, 0x0071, 0, VR::FL, VM::M1TN, "StackAngulationAP" }, { 0x2005, 0x0072, 0, VR::FL, VM::M1TN, "StackAngulationFH" }, { 0x2005, 0x0073, 0, VR::FL, VM::M1TN, "StackAngulationRL" }, { 0x2005, 0x0074, 0, VR::FL, VM::M1TN, "StackFOVAP" }, { 0x2005, 0x0075, 0, VR::FL, VM::M1TN, "StackFOVFH" }, { 0x2005, 0x0076, 0, VR::FL, VM::M1TN, "StackFOVRL" }, { 0x2005, 0x0078, 0, VR::FL, VM::M1TN, "StackOffcentreAP" }, { 0x2005, 0x0079, 0, VR::FL, VM::M1TN, "StackOffcentreFH" }, { 0x2005, 0x007a, 0, VR::FL, VM::M1TN, "StackOffcentreRL" }, { 0x2005, 0x007b, 0, VR::CS, VM::M1TN, "StackPreparationDirection" }, { 0x2005, 0x007e, 0, VR::FL, VM::M1TN, "StackSliceDistance" }, { 0x2005, 0x0080, 0, VR::SQ, VM::M1, "SeriesPlanScan" }, { 0x2005, 0x0081, 0, VR::CS, VM::M1TN, "StackViewAxis" }, { 0x2005, 0x0083, 0, VR::SQ, VM::M1, "SeriesSlab" }, { 0x2005, 0x0084, 0, VR::SQ, VM::M1, "SeriesReference" }, { 0x2005, 0x0085, 0, VR::SQ, VM::M1, "SeriesVolume" }, { 0x2005, 0x0086, 0, VR::SS, VM::M1, "NumberOfGeometry" }, { 0x2005, 0x0087, 0, VR::SL, VM::M1TN, "NumberOfGeometrySlices" }, { 0x2005, 0x0088, 0, VR::FL, VM::M1TN, "GeomAngulationAP" }, { 0x2005, 0x0089, 0, VR::FL, VM::M1TN, "GeomAngulationFH" }, { 0x2005, 0x008A, 0, VR::FL, VM::M1TN, "GeomAngulationRL" }, { 0x2005, 0x008B, 0, VR::FL, VM::M1TN, "GeomFOVAP" }, { 0x2005, 0x008C, 0, VR::FL, VM::M1TN, "GeomFOVFH" }, { 0x2005, 0x008D, 0, VR::FL, VM::M1TN, "GeomFOVRL" }, { 0x2005, 0x008E, 0, VR::FL, VM::M1TN, "GeomOffCentreAP" }, { 0x2005, 0x008F, 0, VR::FL, VM::M1TN, "GeomOffCentreFH" }, { 0x2005, 0x0090, 0, VR::FL, VM::M1TN, "GeomOffCentreRL" }, { 0x2005, 0x0091, 0, VR::CS, VM::M1TN, "GeomPreparationDirect" }, { 0x2005, 0x0092, 0, VR::FL, VM::M1TN, "GeomRadialAngle" }, { 0x2005, 0x0093, 0, VR::CS, VM::M1TN, "GeomRadialAxis" }, { 0x2005, 0x0094, 0, VR::FL, VM::M1TN, "GeomSliceDistance" }, { 0x2005, 0x0095, 0, VR::SL, VM::M1TN, "GeomSliceNumber" }, { 0x2005, 0x0096, 0, VR::CS, VM::M1TN, "GeomType" }, { 0x2005, 0x0097, 0, VR::CS, VM::M1TN, "GeomViewAxis" }, { 0x2005, 0x0098, 0, VR::CS, VM::M1TN, "GeomColour" }, { 0x2005, 0x0099, 0, VR::CS, VM::M1TN, "GeomApplicationType" }, { 0x2005, 0x009a, 0, VR::SL, VM::M1TN, "GeomId" }, { 0x2005, 0x009b, 0, VR::SH, VM::M1TN, "GeomApplicationName" }, { 0x2005, 0x009c, 0, VR::SH, VM::M1TN, "GeomLabelName" }, { 0x2005, 0x009d, 0, VR::CS, VM::M1TN, "GeomLineStyle" }, { 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" }, { 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" }, { 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" }, { 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" }, { 0x2005, 0x00a2, 0, VR::CS, VM::M1, "IsCOCA" }, { 0x2005, 0x00a3, 0, VR::IS, VM::M1, "StackCoilID" }, { 0x2005, 0x00a4, 0, VR::IS, VM::M1, "StackCBBCoil1" }, { 0x2005, 0x00a5, 0, VR::IS, VM::M1, "StackCBBCoil2" }, { 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" }, { 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" }, { 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" }, { 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" }, { 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" }, { 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" }, { 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" }, { 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" }, }; const unsigned short Dict032TagHashTable[] = { 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 167, 170, 173, 166, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, 260, 166, 263, 266, 269, 272, 275, 280, 285, 290, 295, 300, 303, 308, 313, 318, 323, 328, 333, 338, 343, 348, 353, 358, 363, 368, 373, 378, 383, 388, 393, 398, 403, 408, 413, 418, 423, 428, 433, 438, 443, 448, 453, 458, 463, 468, 473, 476, 479, 482, 485, 488, 491, 496, 501, 504, 507, 510, 513, 516, 521, 526, 531, 534, 537, 540, 543, 546, 549, 552, 166, 555, 558, 561, 564, 567, 570, 575, 578, 581, 584, 587, 590, 166, 593, 596, 599, 602, 166, 166, 605, 166, 608, 611, 614, 617, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 0, 1, 5, 5, 1, 4, 4, 1, 6, 7, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 12, 13, 1, 11, 12, 1, 14, 15, 1, 13, 14, 1, 8, 9, 1, 7, 8, 1, 10, 11, 1, 9, 10, 1, 20, 21, 1, 19, 20, 1, 22, 23, 1, 21, 22, 1, 16, 17, 1, 15, 16, 1, 18, 19, 1, 17, 18, 1, 28, 29, 1, 27, 28, 1, 30, 31, 1, 29, 30, 1, 24, 25, 1, 23, 24, 1, 26, 27, 1, 25, 26, 1, 35, 37, 1, 37, 39, 1, 36, 38, 1, 32, 33, 1, 31, 32, 2, 34, 35, 127, 135, 2, 33, 34, 126, 134, 2, 43, 45, 125, 133, 2, 42, 44, 124, 132, 2, 45, 47, 123, 131, 1, 44, 46, 2, 39, 41, 122, 129, 2, 38, 40, 121, 128, 2, 41, 43, 135, 143, 2, 40, 42, 134, 142, 2, 51, 53, 133, 141, 2, 50, 52, 132, 140, 2, 53, 55, 131, 139, 2, 52, 54, 130, 138, 2, 47, 49, 129, 137, 2, 46, 48, 128, 136, 2, 49, 51, 143, 151, 2, 48, 50, 142, 150, 2, 59, 61, 141, 149, 2, 58, 60, 140, 148, 2, 61, 63, 139, 147, 2, 60, 62, 138, 146, 2, 55, 57, 137, 145, 2, 54, 56, 136, 144, 2, 57, 59, 151, 159, 2, 56, 58, 150, 158, 2, 66, 68, 149, 157, 2, 67, 69, 148, 156, 2, 68, 70, 147, 155, 2, 69, 71, 146, 154, 2, 62, 64, 145, 153, 2, 63, 65, 144, 152, 2, 64, 66, 159, 167, 2, 65, 67, 158, 166, 2, 74, 76, 157, 165, 2, 75, 77, 156, 164, 2, 76, 78, 155, 163, 2, 77, 79, 154, 162, 2, 70, 72, 153, 161, 2, 71, 73, 152, 160, 1, 72, 74, 1, 73, 75, 1, 82, 84, 1, 83, 85, 1, 84, 86, 1, 85, 87, 2, 78, 80, 161, 169, 2, 79, 81, 160, 168, 1, 80, 82, 1, 81, 83, 1, 90, 92, 1, 91, 93, 1, 92, 94, 2, 93, 95, 164, 178, 2, 86, 88, 163, 177, 2, 87, 89, 162, 176, 1, 88, 90, 1, 89, 91, 1, 97, 100, 1, 98, 101, 1, 99, 102, 1, 100, 103, 1, 94, 96, 1, 95, 97, 1, 96, 99, 1, 105, 108, 1, 106, 109, 1, 107, 110, 1, 108, 111, 2, 101, 104, 165, 192, 1, 102, 105, 1, 103, 106, 1, 104, 107, 1, 113, 116, 1, 114, 117, 1, 115, 118, 1, 109, 112, 1, 110, 113, 1, 111, 114, 1, 112, 115, 1, 120, 126, 1, 116, 120, 1, 117, 121, 1, 118, 122, 1, 119, 123, }; const unsigned short Dict032KeyHashTable[] = { 167, 166, 170, 175, 178, 181, 166, 184, 187, 166, 166, 190, 195, 166, 200, 166, 166, 203, 166, 166, 208, 211, 220, 225, 230, 233, 166, 240, 166, 166, 166, 245, 248, 251, 254, 166, 257, 166, 166, 262, 265, 268, 273, 166, 278, 281, 284, 166, 291, 300, 307, 310, 313, 166, 316, 166, 321, 326, 329, 332, 335, 166, 166, 340, 343, 166, 166, 346, 166, 349, 352, 355, 358, 361, 366, 369, 374, 377, 380, 166, 383, 166, 386, 166, 166, 166, 166, 389, 396, 166, 399, 402, 405, 408, 166, 411, 420, 166, 423, 426, 429, 432, 166, 166, 166, 437, 442, 445, 450, 453, 166, 458, 461, 464, 467, 166, 470, 166, 473, 480, 166, 485, 488, 491, 166, 498, 166, 166, 501, 166, 506, 509, 512, 519, 522, 166, 525, 166, 530, 166, 166, 535, 542, 545, 548, 551, 556, 559, 166, 564, 166, 166, 166, 569, 572, 577, 580, 166, 166, 166, 583, 588, 595, 166, 600, 603, 0, 1, 109, 49954, 2, 67, 62130, 115, 13723, 1, 83, 60351, 1, 35, 25655, 1, 105, 10677, 1, 54, 38349, 1, 77, 63682, 2, 74, 33719, 112, 13152, 2, 82, 60350, 86, 53671, 1, 9, 18078, 2, 11, 5453, 92, 61434, 1, 34, 1494, 4, 81, 10779, 85, 53670, 91, 39991, 100, 34564, 2, 99, 37452, 132, 61192, 2, 51, 49223, 129, 26841, 1, 24, 56701, 3, 104, 55749, 135, 55077, 152, 33047, 2, 98, 15606, 164, 44432, 1, 131, 61191, 1, 128, 26840, 1, 42, 53326, 1, 134, 55076, 2, 93, 4587, 163, 44431, 1, 117, 52869, 1, 149, 33877, 2, 22, 3984, 61, 51573, 2, 27, 55180, 30, 30682, 1, 125, 4858, 1, 137, 54000, 3, 49, 1633, 146, 61458, 150, 4653, 4, 52, 43124, 116, 52868, 141, 46553, 156, 33831, 3, 66, 11858, 119, 18552, 157, 33831, 1, 73, 31725, 1, 43, 32630, 1, 14, 33751, 2, 40, 41408, 108, 22015, 2, 5, 13259, 140, 10872, 1, 53, 40588, 1, 13, 41065, 1, 69, 7014, 2, 1, 24130, 148, 34531, 1, 126, 15464, 1, 76, 10680, 1, 79, 63685, 1, 0, 24129, 1, 123, 24722, 1, 84, 60353, 1, 50, 29144, 2, 15, 45982, 44, 37827, 1, 127, 49244, 2, 12, 47624, 33, 10975, 1, 59, 624, 1, 139, 4411, 1, 48, 11426, 1, 87, 53673, 1, 16, 43652, 3, 32, 23667, 89, 18600, 138, 12327, 1, 37, 15493, 1, 133, 61194, 1, 130, 26843, 1, 8, 34537, 1, 136, 55079, 4, 23, 51555, 57, 27120, 142, 51512, 162, 44434, 1, 88, 18599, 1, 45, 45051, 1, 72, 23622, 1, 114, 13720, 2, 7, 34536, 58, 19899, 2, 71, 50802, 95, 64877, 1, 17, 54906, 2, 75, 9123, 118, 52871, 1, 56, 65434, 2, 111, 13149, 113, 13719, 1, 161, 48623, 1, 28, 38830, 1, 60, 12392, 1, 94, 53325, 1, 63, 59675, 3, 4, 33438, 55, 18047, 110, 13148, 2, 80, 3491, 124, 8428, 1, 143, 46886, 1, 25, 64947, 3, 39, 14182, 103, 55746, 160, 65081, 1, 107, 35459, 2, 2, 24132, 3, 30386, 1, 26, 10424, 1, 154, 33438, 3, 62, 40410, 97, 58007, 102, 55745, 1, 10, 3786, 1, 159, 25298, 2, 65, 33680, 70, 13019, 2, 31, 2176, 101, 12482, 3, 18, 37280, 47, 63017, 96, 61890, 1, 120, 65180, 1, 144, 21027, 1, 41, 48518, 2, 155, 36917, 165, 27267, 1, 151, 12377, 2, 21, 17711, 29, 23239, 2, 6, 18278, 145, 6861, 1, 64, 1987, 2, 147, 5404, 158, 20134, 1, 90, 18602, 1, 38, 58614, 2, 19, 3682, 121, 8544, 3, 36, 62562, 68, 27298, 122, 31703, 2, 20, 47900, 106, 10677, 1, 153, 8836, 2, 46, 4755, 78, 63682, }; vtkDICOMDictionary::Dict Dict032Data = { "Philips MR Imaging DD 001", 166, 166, Dict032TagHashTable, Dict032KeyHashTable, Dict032Contents }; // ----- Philips MR Imaging DD 005 ----- const DictEntry Dict033Contents[] = { { 0x2005, 0x0000, 0, VR::CS, VM::M1, "VolumeViewEnabled" }, { 0x2005, 0x0001, 0, VR::UL, VM::M1, "NumberOfStudyReference" }, { 0x2005, 0x0002, 0, VR::SQ, VM::M1, "SPSCode" }, { 0x2005, 0x0003, 0, VR::UL, VM::M1, "NumberOfSPSCodes" }, { 0x2005, 0x0004, 0, VR::SS, VM::M1, "" }, { 0x2005, 0x0006, 0, VR::SS, VM::M1, "NumberOfPSSpecificCharacterSets" }, { 0x2005, 0x0007, 0, VR::SS, VM::M1, "NumberOfSpecificCharacterSet" }, { 0x2005, 0x0009, 0, VR::DS, VM::M1, "RescaleInterceptOriginal" }, { 0x2005, 0x000a, 0, VR::DS, VM::M1, "RescaleSlopeOriginal" }, { 0x2005, 0x000b, 0, VR::LO, VM::M1, "RescaleTypeOriginal" }, { 0x2005, 0x000e, 0, VR::SQ, VM::M1, "PrivateSharedSequence" }, { 0x2005, 0x000f, 0, VR::SQ, VM::M1, "PrivatePerFrameSequence" }, { 0x2005, 0x0010, 0, VR::IS, VM::M1, "MFConvTreatSpectroMixNumber" }, { 0x2005, 0x0011, 0, VR::UI, VM::M1, "MFPrivateReferencedSOPInstanceUID" }, { 0x2005, 0x0012, 0, VR::IS, VM::M1, "DiffusionBValueNumber" }, { 0x2005, 0x0013, 0, VR::IS, VM::M1, "GradientOrientationNumber" }, { 0x2005, 0x0014, 0, VR::SL, VM::M1, "NumberOfDiffusionBValues" }, { 0x2005, 0x0015, 0, VR::SL, VM::M1, "NumberOfDiffusionGradientOrientations" }, { 0x2005, 0x0016, 0, VR::CS, VM::M1, "PlanMode" }, { 0x2005, 0x0017, 0, VR::FD, VM::M3, "DiffusionBMatrix" }, { 0x2005, 0x0018, 0, VR::CS, VM::M3, "OperatingModeType" }, { 0x2005, 0x0019, 0, VR::CS, VM::M3, "OperatingMode" }, { 0x2005, 0x001a, 0, VR::CS, VM::M1, "FatSaturationTechnique" }, { 0x2005, 0x001b, 0, VR::IS, VM::M1, "VersionNumberDeletedImages" }, { 0x2005, 0x001c, 0, VR::IS, VM::M1, "VersionNumberDeletedSpectra" }, { 0x2005, 0x001d, 0, VR::IS, VM::M1, "VersionNumberDeletedBlobsets" }, { 0x2005, 0x001e, 0, VR::UL, VM::M1, "LUT1Offset" }, { 0x2005, 0x001f, 0, VR::UL, VM::M1, "LUT1Range" }, { 0x2005, 0x0020, 0, VR::UL, VM::M1, "LUT1BeginColor" }, { 0x2005, 0x0021, 0, VR::UL, VM::M1, "LUT1EndColor" }, { 0x2005, 0x0022, 0, VR::UL, VM::M1, "LUT2Offset" }, { 0x2005, 0x0023, 0, VR::UL, VM::M1, "LUT2Range" }, { 0x2005, 0x0024, 0, VR::UL, VM::M1, "LUT2BeginColor" }, { 0x2005, 0x0025, 0, VR::UL, VM::M1, "LUT2EndColor" }, { 0x2005, 0x0026, 0, VR::CS, VM::M1, "ViewingHardcopyOnly" }, { 0x2005, 0x0027, 0, VR::CS, VM::M1, "" }, { 0x2005, 0x0028, 0, VR::SL, VM::M1, "NumberOfLabelTypes" }, { 0x2005, 0x0029, 0, VR::CS, VM::M1, "LabelType" }, { 0x2005, 0x002a, 0, VR::CS, VM::M1, "ExamPrintStatus" }, { 0x2005, 0x002b, 0, VR::CS, VM::M1, "ExamExportStatus" }, { 0x2005, 0x002c, 0, VR::CS, VM::M1, "ExamStorageCommitStatus" }, { 0x2005, 0x002d, 0, VR::CS, VM::M1, "ExamMediaWriteStatus" }, { 0x2005, 0x002e, 0, VR::FL, VM::M1, "DBdt" }, { 0x2005, 0x002f, 0, VR::FL, VM::M1, "ProtonSAR" }, { 0x2005, 0x0030, 0, VR::FL, VM::M1, "NonProtonSAR" }, { 0x2005, 0x0031, 0, VR::FL, VM::M1, "LocalSAR" }, { 0x2005, 0x0032, 0, VR::CS, VM::M1, "SafetyOverrideMode" }, { 0x2005, 0x0033, 0, VR::DT, VM::M1, "EVDVDJobInParamsDatetime" }, { 0x2005, 0x0034, 0, VR::DT, VM::M1, "DVDJobInParamsVolumeLabel" }, { 0x2005, 0x0035, 0, VR::CS, VM::M1, "SpectroExamcard" }, { 0x2005, 0x0036, 0, VR::UI, VM::M1, "ReferencedSeriesInstanceUID" }, { 0x2005, 0x0037, 0, VR::CS, VM::M1, "ColorLUTType" }, { 0x2005, 0x0038, 0, VR::LT, VM::M1, "" }, { 0x2005, 0x0039, 0, VR::LT, VM::M1, "" }, { 0x2005, 0x003a, 0, VR::LT, VM::M1, "DataDictionaryContentsVersion" }, { 0x2005, 0x003b, 0, VR::CS, VM::M1, "IsCoilSurvey" }, { 0x2005, 0x003c, 0, VR::FL, VM::M1, "StackTablePosLong" }, { 0x2005, 0x003d, 0, VR::FL, VM::M1, "StackTablePosLat" }, { 0x2005, 0x003e, 0, VR::FL, VM::M1, "StackPosteriorCoilPos" }, { 0x2005, 0x003f, 0, VR::CS, VM::M1, "AIMDLimitsApplied" }, { 0x2005, 0x0040, 0, VR::FL, VM::M1, "AIMDHeadSARLimit" }, { 0x2005, 0x0041, 0, VR::FL, VM::M1, "AIMDWholeBodySARLimit" }, { 0x2005, 0x0042, 0, VR::FL, VM::M1, "AIMDB1RMSLimit" }, { 0x2005, 0x0043, 0, VR::FL, VM::M1, "AIMDdbDtLimit" }, { 0x2005, 0x0044, 0, VR::IS, VM::M1, "TFEFactor" }, { 0x2005, 0x0045, 0, VR::CS, VM::M1, "AttenuationCorrection" }, { 0x2005, 0x0046, 0, VR::FL, VM::M1, "FWHMShim" }, { 0x2005, 0x0047, 0, VR::FL, VM::M1, "PowerOptimization" }, { 0x2005, 0x0048, 0, VR::FL, VM::M1, "CoilQ" }, { 0x2005, 0x0049, 0, VR::FL, VM::M1, "ReceiverGain" }, { 0x2005, 0x004a, 0, VR::FL, VM::M1, "DataWindowDuration" }, { 0x2005, 0x004b, 0, VR::FL, VM::M1, "MixingTime" }, { 0x2005, 0x004c, 0, VR::FL, VM::M1, "FirstEchoTime" }, { 0x2005, 0x004d, 0, VR::CS, VM::M1, "IsB0Series" }, { 0x2005, 0x004e, 0, VR::CS, VM::M1, "IsB1Series" }, { 0x2005, 0x004f, 0, VR::CS, VM::M1, "VolumeSelect" }, { 0x2005, 0x0050, 0, VR::SS, VM::M1, "NumberOfPatientOtherIDs" }, { 0x2005, 0x0051, 0, VR::IS, VM::M1, "OriginalSeriesNumber" }, { 0x2005, 0x0052, 0, VR::UI, VM::M1, "OriginalSeriesInstanceUID" }, { 0x2005, 0x0053, 0, VR::CS, VM::M1, "SplitSeriesJobParams" }, { 0x2005, 0x0054, 0, VR::SS, VM::M1, "PreferredDimensionForSplitting" }, { 0x2005, 0x0055, 0, VR::FD, VM::M3, "VelocityEncodingDirection" }, { 0x2005, 0x0056, 0, VR::SS, VM::M1, "ContrastBolusNumberOfInjections" }, { 0x2005, 0x0057, 0, VR::LT, VM::M1, "ContrastBolusAgentCode" }, { 0x2005, 0x0058, 0, VR::LT, VM::M1, "ContrastBolusAdminRouteCode" }, { 0x2005, 0x0059, 0, VR::DS, VM::M1, "ContrastBolusVolume" }, { 0x2005, 0x005a, 0, VR::DS, VM::M1, "ContrastBolusIngredientConcentration" }, { 0x2005, 0x005b, 0, VR::IS, VM::M1, "ContrastBolusDynamicNumber" }, { 0x2005, 0x005c, 0, VR::SQ, VM::M1, "ContrastBolusSequence" }, { 0x2005, 0x005d, 0, VR::IS, VM::M1, "ContrastBolusID" }, { 0x2005, 0x0060, 0, VR::CS, VM::M1, "LUTToRGBJobParams" }, { 0x2005, 0x0090, 0, VR::SQ, VM::M1, "OriginalVOILUTSequence" }, { 0x2005, 0x0091, 0, VR::SQ, VM::M1, "OriginalModalityLUTSequence" }, }; const unsigned short Dict033TagHashTable[] = { 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178, 181, 184, 189, 194, 197, 200, 203, 206, 209, 212, 215, 93, 93, 218, 221, 224, 229, 234, 237, 240, 243, 246, 93, 93, 251, 254, 257, 93, 260, 263, 266, 269, 272, 275, 278, 281, 284, 287, 290, 293, 296, 299, 302, 305, 308, 311, 314, 317, 320, 323, 326, 329, 332, 335, 338, 341, 344, 347, 350, 353, 356, 359, 362, 365, 0, 1, 51, 55, 1, 50, 54, 1, 45, 49, 1, 44, 48, 1, 47, 51, 1, 46, 50, 1, 57, 61, 1, 56, 60, 1, 59, 63, 1, 58, 62, 1, 53, 57, 1, 52, 56, 1, 55, 59, 1, 54, 58, 1, 64, 68, 1, 65, 69, 1, 66, 70, 1, 67, 71, 1, 60, 64, 1, 61, 65, 1, 62, 66, 1, 63, 67, 1, 72, 76, 1, 73, 77, 1, 74, 78, 1, 75, 79, 1, 68, 72, 1, 69, 73, 1, 70, 74, 1, 71, 75, 2, 80, 84, 92, 145, 2, 81, 85, 91, 144, 1, 82, 86, 1, 83, 87, 1, 76, 80, 1, 77, 81, 1, 78, 82, 1, 79, 83, 1, 88, 92, 1, 89, 93, 1, 84, 88, 1, 85, 89, 2, 4, 4, 86, 90, 2, 6, 7, 87, 91, 1, 5, 6, 1, 1, 1, 1, 0, 0, 1, 3, 3, 2, 2, 2, 90, 96, 1, 11, 15, 1, 10, 14, 1, 7, 9, 1, 9, 11, 1, 8, 10, 1, 17, 21, 1, 16, 20, 1, 19, 23, 1, 18, 22, 1, 13, 17, 1, 12, 16, 1, 15, 19, 1, 14, 18, 1, 25, 29, 1, 24, 28, 1, 27, 31, 1, 26, 30, 1, 21, 25, 1, 20, 24, 1, 23, 27, 1, 22, 26, 1, 33, 37, 1, 32, 36, 1, 35, 39, 1, 34, 38, 1, 29, 33, 1, 28, 32, 1, 31, 35, 1, 30, 34, 1, 41, 45, 1, 40, 44, 1, 43, 47, 1, 42, 46, 1, 37, 41, 1, 36, 40, 1, 39, 43, 1, 38, 42, 1, 49, 53, 1, 48, 52, }; const unsigned short Dict033KeyHashTable[] = { 94, 93, 99, 104, 107, 114, 93, 119, 122, 93, 125, 134, 137, 142, 147, 150, 153, 93, 93, 93, 156, 159, 162, 165, 170, 175, 178, 93, 181, 184, 93, 187, 190, 93, 193, 196, 201, 204, 93, 209, 214, 217, 93, 220, 223, 226, 231, 234, 93, 237, 242, 245, 93, 248, 93, 93, 93, 93, 255, 93, 258, 261, 264, 269, 272, 275, 93, 282, 285, 288, 291, 93, 93, 296, 93, 301, 304, 93, 307, 312, 315, 93, 93, 326, 93, 93, 329, 332, 93, 335, 93, 93, 338, 0, 2, 7, 47539, 84, 23719, 2, 49, 22728, 72, 57933, 1, 66, 33993, 3, 24, 36301, 33, 33014, 38, 1569, 2, 0, 57014, 6, 21057, 1, 46, 8699, 1, 45, 33446, 4, 17, 61713, 27, 42566, 41, 16921, 71, 24494, 1, 89, 65506, 2, 25, 25793, 26, 17726, 2, 42, 48974, 43, 7584, 1, 77, 32320, 1, 69, 64658, 1, 87, 26990, 1, 65, 27641, 1, 18, 41920, 1, 80, 28813, 2, 60, 41824, 85, 52429, 2, 22, 24280, 54, 9189, 1, 64, 45714, 1, 63, 48159, 1, 19, 14899, 1, 67, 59372, 1, 90, 38104, 1, 81, 21068, 1, 47, 6827, 2, 10, 65393, 56, 31978, 1, 73, 42594, 2, 20, 13936, 59, 14428, 2, 51, 25732, 57, 46683, 1, 50, 58426, 1, 12, 18892, 1, 15, 39393, 1, 23, 53945, 2, 30, 10846, 34, 31377, 1, 28, 51253, 1, 48, 11722, 2, 1, 60066, 36, 4915, 1, 68, 47271, 1, 44, 55945, 3, 11, 49006, 76, 28201, 86, 34175, 1, 32, 58094, 1, 9, 64843, 1, 83, 27369, 2, 40, 6660, 61, 59972, 1, 70, 42806, 1, 29, 55957, 3, 21, 40794, 39, 36953, 74, 56150, 1, 58, 9144, 1, 78, 43832, 1, 91, 1285, 2, 8, 59662, 75, 35235, 2, 31, 4624, 82, 34559, 1, 5, 23985, 1, 13, 58783, 2, 2, 42696, 37, 10221, 1, 16, 63633, 5, 4, 57, 35, 57, 52, 57, 53, 57, 55, 28638, 1, 79, 10888, 1, 92, 54585, 1, 62, 23217, 1, 14, 11895, 2, 3, 5575, 88, 4249, }; vtkDICOMDictionary::Dict Dict033Data = { "Philips MR Imaging DD 005", 93, 93, Dict033TagHashTable, Dict033KeyHashTable, Dict033Contents }; // ----- Philips MR Imaging DD 004 ----- const DictEntry Dict034Contents[] = { { 0x2005, 0x0000, 0, VR::SS, VM::M1, "SpectrumExtraNumber" }, { 0x2005, 0x0001, 0, VR::SS, VM::M1, "SpectrumKxCoordinate" }, { 0x2005, 0x0002, 0, VR::SS, VM::M1, "SpectrumKyCoordinate" }, { 0x2005, 0x0003, 0, VR::SS, VM::M1, "SpectrumLocationNumber" }, { 0x2005, 0x0004, 0, VR::SS, VM::M1, "SpectrumMixNumber" }, { 0x2005, 0x0005, 0, VR::SS, VM::M1, "SpectrumXCoordinate" }, { 0x2005, 0x0006, 0, VR::SS, VM::M1, "SpectrumYCoordinate" }, { 0x2005, 0x0007, 0, VR::FL, VM::M1, "SpectrumDCLevel" }, { 0x2005, 0x0008, 0, VR::FL, VM::M1, "SpectrumNoiseLevel" }, { 0x2005, 0x0009, 0, VR::FL, VM::M1, "SpectrumBeginTime" }, { 0x2005, 0x0010, 0, VR::FL, VM::M1, "SpectrumEchoTime" }, { 0x2005, 0x0012, 0, VR::FL, VM::M1, "SpectrumInversionTime" }, { 0x2005, 0x0013, 0, VR::SS, VM::M1, "SpectrumNumber" }, { 0x2005, 0x0014, 0, VR::SS, VM::M1, "SpectrumNumberOfAverages" }, { 0x2005, 0x0015, 0, VR::SS, VM::M1, "SpectrumNumberOfSamples" }, { 0x2005, 0x0016, 0, VR::SS, VM::M1, "SpectrumScanSequenceNumber" }, { 0x2005, 0x0017, 0, VR::SS, VM::M1, "SpectrumNumberOfPeaks" }, { 0x2005, 0x0018, 0, VR::SQ, VM::M1, "SpectrumPeak" }, { 0x2005, 0x0019, 0, VR::FL, VM::M1TN, "SpectrumPeakIntensity" }, { 0x2005, 0x0020, 0, VR::LO, VM::M1TN, "SpectrumPeakLabel" }, { 0x2005, 0x0021, 0, VR::FL, VM::M1TN, "SpectrumPeakPhase" }, { 0x2005, 0x0022, 0, VR::FL, VM::M1TN, "SpectrumPeakPosition" }, { 0x2005, 0x0023, 0, VR::CS, VM::M1TN, "SpectrumPeakType" }, { 0x2005, 0x0024, 0, VR::FL, VM::M1TN, "SpectrumPeakWidth" }, { 0x2005, 0x0025, 0, VR::CS, VM::M1, "SpectroSIB0Correction" }, { 0x2005, 0x0026, 0, VR::FL, VM::M1, "SpectroB0EchoTopPosition" }, { 0x2005, 0x0027, 0, VR::CS, VM::M1, "SpectroComplexComponent" }, { 0x2005, 0x0028, 0, VR::CS, VM::M1, "SpectroDataOrigin" }, { 0x2005, 0x0029, 0, VR::FL, VM::M1, "SpectroEchoTopPosition" }, { 0x2005, 0x0030, 0, VR::CS, VM::M1TN, "InPlaneTransforms" }, { 0x2005, 0x0031, 0, VR::SS, VM::M1, "NumberOfSpectraAcquired" }, { 0x2005, 0x0033, 0, VR::FL, VM::M1, "PhaseEncodingEchoTopPositions" }, { 0x2005, 0x0034, 0, VR::CS, VM::M1, "PhysicalQuantityForChemicalShift" }, { 0x2005, 0x0035, 0, VR::CS, VM::M1, "PhysicalQuantitySpatial" }, { 0x2005, 0x0036, 0, VR::FL, VM::M1, "ReferenceFrequency" }, { 0x2005, 0x0037, 0, VR::FL, VM::M1, "SampleOffset" }, { 0x2005, 0x0038, 0, VR::FL, VM::M1, "SamplePitch" }, { 0x2005, 0x0039, 0, VR::SS, VM::M2, "SearchIntervalForPeaks" }, { 0x2005, 0x0040, 0, VR::CS, VM::M1, "SignalDomainForChemicalShift" }, { 0x2005, 0x0041, 0, VR::CS, VM::M1, "SignalDomainSpatial" }, { 0x2005, 0x0042, 0, VR::CS, VM::M1, "SignalType" }, { 0x2005, 0x0043, 0, VR::CS, VM::M1, "SpectroAdditionalRotations" }, { 0x2005, 0x0044, 0, VR::SS, VM::M1TN, "SpectroDisplayRanges" }, { 0x2005, 0x0045, 0, VR::CS, VM::M1, "SpectroEchoAcquisition" }, { 0x2005, 0x0046, 0, VR::CS, VM::M1, "SpectroFrequencyUnit" }, { 0x2005, 0x0047, 0, VR::FL, VM::M1, "SpectroGamma" }, { 0x2005, 0x0048, 0, VR::CS, VM::M1, "SpectroHiddenLineRemoval" }, { 0x2005, 0x0049, 0, VR::FL, VM::M1, "SpectroHorizontalShift" }, { 0x2005, 0x0050, 0, VR::FL, VM::M2, "SpectroHorizontalWindow" }, { 0x2005, 0x0051, 0, VR::SS, VM::M1, "SpectroNumberOfDisplayRanges" }, { 0x2005, 0x0052, 0, VR::SS, VM::M1, "SpectroNumberOfEchoPulses" }, { 0x2005, 0x0053, 0, VR::LO, VM::M1TN, "SpectroProcessingHistory" }, { 0x2005, 0x0054, 0, VR::CS, VM::M1, "SpectroScanType" }, { 0x2005, 0x0055, 0, VR::FL, VM::M1TN, "SpectroSICSIntervals" }, { 0x2005, 0x0056, 0, VR::CS, VM::M1, "SpectroSIMode" }, { 0x2005, 0x0057, 0, VR::SS, VM::M1, "SpectroSpectralBW" }, { 0x2005, 0x0058, 0, VR::LO, VM::M1, "SpectroTitleLine" }, { 0x2005, 0x0059, 0, VR::FL, VM::M1, "SpectroTurboEchoSpacing" }, { 0x2005, 0x0060, 0, VR::FL, VM::M1, "SpectroVerticalShift" }, { 0x2005, 0x0061, 0, VR::FL, VM::M2, "SpectroVerticalWindow" }, { 0x2005, 0x0062, 0, VR::FL, VM::M1, "SpectroOffset" }, { 0x2005, 0x0063, 0, VR::FL, VM::M1, "SpectrumPitch" }, { 0x2005, 0x0064, 0, VR::CS, VM::M1, "VolumeSelection" }, { 0x2005, 0x0070, 0, VR::SS, VM::M1, "NumberMixesSpectro" }, { 0x2005, 0x0071, 0, VR::SQ, VM::M1, "SeriesSPMix" }, { 0x2005, 0x0072, 0, VR::SS, VM::M1T2, "SPMixTResolution" }, { 0x2005, 0x0073, 0, VR::SS, VM::M1T2, "SPMixKXResolution" }, { 0x2005, 0x0074, 0, VR::SS, VM::M1T2, "SPMixKYResolution" }, { 0x2005, 0x0075, 0, VR::SS, VM::M1T2, "SPMixFResolution" }, { 0x2005, 0x0076, 0, VR::SS, VM::M1T2, "SPMixXResolution" }, { 0x2005, 0x0077, 0, VR::SS, VM::M1T2, "SPMixYResolution" }, { 0x2005, 0x0078, 0, VR::SS, VM::M1T2, "SPMixNumberOfSpectraIntended" }, { 0x2005, 0x0079, 0, VR::SS, VM::M1T2, "SPMixNumberOfAverages" }, { 0x2005, 0x0080, 0, VR::SL, VM::M1, "NumberOfMFImageObjects" }, { 0x2005, 0x0081, 0, VR::IS, VM::M1, "ScanoGramSurveyNumberOfImages" }, { 0x2005, 0x0082, 0, VR::UL, VM::M1, "NumberOfProcedureCodes" }, { 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "SortAttributes" }, { 0x2005, 0x0084, 0, VR::SS, VM::M1, "NumberOfSortAttributes" }, { 0x2005, 0x0085, 0, VR::CS, VM::M1, "ImageDisplayDirection" }, { 0x2005, 0x0086, 0, VR::CS, VM::M1, "InsetScanogram" }, { 0x2005, 0x0087, 0, VR::SS, VM::M1, "DisplayLayoutNumberOfColumns" }, { 0x2005, 0x0088, 0, VR::SS, VM::M1, "DisplayLayoutNumberOfRows" }, { 0x2005, 0x0089, 0, VR::SQ, VM::M1, "ViewingProtocol" }, { 0x2005, 0x0090, 0, VR::CS, VM::M1, "StackCoilFunction" }, { 0x2005, 0x0091, 0, VR::PN, VM::M1, "PatientNameJobInParams" }, { 0x2005, 0x0092, 0, VR::IS, VM::M1, "GeolinkID" }, { 0x2005, 0x0093, 0, VR::IS, VM::M1, "StationNumber" }, { 0x2005, 0x0094, 0, VR::CS, VM::M1TN, "ProcessingHistory" }, { 0x2005, 0x0095, 0, VR::UI, VM::M1, "ViewProcedureString" }, { 0x2005, 0x0096, 0, VR::CS, VM::M1, "FlowImagesPresent" }, { 0x2005, 0x0097, 0, VR::LO, VM::M1, "AnatomicRegionCodeValue" }, { 0x2005, 0x0098, 0, VR::CS, VM::M1, "MobiviewEnabled" }, { 0x2005, 0x0099, 0, VR::CS, VM::M1, "IViewBoldEnabled" }, }; const unsigned short Dict034TagHashTable[] = { 94, 97, 100, 103, 106, 93, 93, 93, 109, 112, 115, 120, 125, 128, 131, 136, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 176, 181, 184, 187, 192, 197, 200, 203, 206, 209, 212, 215, 218, 93, 93, 221, 224, 229, 232, 235, 240, 243, 246, 249, 254, 257, 260, 93, 263, 266, 93, 93, 269, 272, 275, 278, 283, 286, 291, 296, 301, 304, 307, 93, 310, 313, 93, 316, 319, 324, 327, 330, 333, 336, 339, 342, 93, 93, 93, 93, 345, 348, 93, 93, 351, 354, 0, 1, 35, 55, 1, 34, 54, 1, 30, 49, 1, 29, 48, 1, 31, 51, 1, 80, 135, 1, 79, 134, 2, 37, 57, 78, 133, 2, 36, 56, 77, 132, 1, 76, 131, 1, 75, 130, 2, 42, 68, 74, 129, 2, 43, 69, 73, 128, 1, 44, 70, 1, 45, 71, 1, 38, 64, 1, 39, 65, 1, 40, 66, 1, 41, 67, 1, 82, 137, 1, 81, 136, 1, 90, 151, 1, 89, 150, 2, 46, 72, 88, 149, 2, 47, 73, 87, 148, 1, 86, 147, 1, 85, 146, 2, 52, 84, 84, 145, 2, 53, 85, 83, 144, 1, 54, 86, 1, 55, 87, 1, 48, 80, 1, 49, 81, 1, 50, 82, 1, 51, 83, 1, 92, 153, 1, 91, 152, 1, 56, 88, 2, 5, 5, 57, 89, 1, 4, 4, 1, 7, 7, 2, 6, 6, 62, 100, 1, 1, 1, 1, 0, 0, 1, 3, 3, 2, 2, 2, 58, 96, 1, 59, 97, 1, 60, 98, 1, 61, 99, 1, 9, 9, 1, 8, 8, 1, 14, 21, 1, 13, 20, 1, 16, 23, 2, 15, 22, 67, 116, 1, 68, 117, 2, 10, 16, 69, 118, 2, 12, 19, 70, 119, 2, 11, 18, 63, 112, 1, 64, 113, 1, 65, 114, 1, 66, 115, 1, 18, 25, 1, 17, 24, 1, 71, 120, 2, 24, 37, 72, 121, 1, 23, 36, 1, 26, 39, 1, 25, 38, 1, 20, 33, 1, 19, 32, 1, 22, 35, 1, 21, 34, 1, 28, 41, 1, 27, 40, 1, 33, 53, 1, 32, 52, }; const unsigned short Dict034KeyHashTable[] = { 94, 97, 93, 100, 105, 108, 113, 120, 123, 93, 93, 126, 129, 134, 137, 93, 142, 145, 148, 153, 156, 159, 93, 164, 167, 172, 175, 178, 181, 184, 187, 190, 93, 193, 93, 93, 93, 196, 93, 93, 199, 204, 93, 207, 212, 93, 217, 220, 223, 230, 93, 237, 93, 240, 93, 93, 245, 93, 248, 251, 254, 257, 260, 267, 270, 273, 278, 93, 285, 290, 293, 296, 93, 93, 93, 93, 299, 304, 93, 311, 314, 93, 317, 320, 325, 328, 93, 331, 334, 339, 93, 342, 93, 0, 1, 84, 44101, 1, 3, 38253, 2, 42, 29112, 65, 36887, 1, 81, 5654, 2, 15, 35362, 19, 548, 3, 30, 12321, 35, 27432, 92, 17723, 1, 16, 50751, 1, 60, 28500, 1, 66, 10602, 2, 53, 54175, 61, 52276, 1, 5, 9735, 2, 1, 14873, 12, 28911, 1, 36, 43451, 1, 21, 45121, 2, 40, 59823, 78, 25073, 1, 43, 7938, 1, 59, 33695, 2, 6, 37012, 24, 7598, 1, 67, 17443, 2, 28, 31524, 83, 64272, 1, 57, 33548, 1, 2, 21714, 1, 56, 34788, 1, 51, 27384, 1, 13, 20147, 1, 48, 13981, 1, 23, 12866, 1, 77, 49925, 1, 71, 29820, 2, 44, 55259, 82, 49256, 1, 17, 12976, 2, 45, 24865, 69, 39587, 2, 0, 5069, 31, 40743, 1, 26, 25738, 1, 47, 47030, 3, 41, 8165, 62, 60847, 75, 58610, 3, 20, 54253, 68, 60203, 91, 58805, 1, 70, 1328, 2, 37, 59934, 55, 43411, 1, 25, 23518, 1, 87, 610, 1, 54, 21511, 1, 46, 51727, 1, 79, 49470, 3, 34, 9704, 58, 25547, 72, 26964, 1, 50, 13867, 1, 86, 50704, 2, 32, 25911, 88, 30571, 3, 14, 37917, 52, 21266, 73, 7957, 2, 18, 23596, 90, 61437, 1, 10, 57461, 1, 85, 64505, 1, 63, 59345, 2, 80, 32924, 89, 38632, 3, 7, 34770, 9, 47883, 74, 31673, 1, 22, 9116, 1, 49, 24669, 1, 39, 64323, 2, 4, 43084, 33, 19116, 1, 64, 58353, 1, 76, 64299, 1, 11, 1553, 2, 29, 44735, 38, 36118, 1, 8, 15065, 1, 27, 47868, }; vtkDICOMDictionary::Dict Dict034Data = { "Philips MR Imaging DD 004", 93, 93, Dict034TagHashTable, Dict034KeyHashTable, Dict034Contents }; // ----- dcm4che/archive ----- const DictEntry Dict035Contents[] = { { 0x0043, 0x0010, 0, VR::OB, VM::M1, "PatientPk" }, { 0x0043, 0x0011, 0, VR::OB, VM::M1, "StudyPk" }, { 0x0043, 0x0012, 0, VR::OB, VM::M1, "SeriesPk" }, { 0x0043, 0x0013, 0, VR::OB, VM::M1, "InstancePk" }, { 0x0043, 0x0014, 0, VR::AE, VM::M1, "CallingAETitle" }, { 0x0043, 0x0015, 0, VR::AE, VM::M1, "CalledAETitle" }, { 0x0043, 0x0016, 0, VR::DT, VM::M1, "InstanceUpdated" }, { 0x0043, 0x0020, 0, VR::SQ, VM::M1, "WorkItemSeq" }, { 0x0043, 0x0030, 0, VR::UI, VM::M1, "Dcm4cheURIReferencedTransferSyntaxUID" }, }; const unsigned short Dict035TagHashTable[] = { 10, 13, 16, 19, 9, 22, 25, 9, 30, 0, 1, 3, 19, 1, 0, 16, 1, 1, 17, 1, 6, 22, 1, 4, 20, 2, 5, 21, 8, 48, 2, 2, 18, 7, 32, }; const unsigned short Dict035KeyHashTable[] = { 10, 9, 9, 15, 9, 20, 9, 27, 30, 0, 2, 5, 55426, 6, 1849, 2, 3, 42978, 7, 16085, 3, 1, 64148, 2, 49206, 8, 36481, 1, 4, 23520, 1, 0, 26693, }; vtkDICOMDictionary::Dict Dict035Data = { "dcm4che/archive", 9, 9, Dict035TagHashTable, Dict035KeyHashTable, Dict035Contents }; // ----- AMI Annotations_02 ----- const DictEntry Dict036Contents[] = { { 0x3101, 0x0020, 0, VR::SQ, VM::M1, "AnnotationSequence" }, }; const unsigned short Dict036TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict036KeyHashTable[] = { 2, 0, 1, 0, 13593, }; vtkDICOMDictionary::Dict Dict036Data = { "AMI Annotations_02", 1, 1, Dict036TagHashTable, Dict036KeyHashTable, Dict036Contents }; // ----- TERARECON AQUARIUS ----- const DictEntry Dict037Contents[] = { { 0x0077, 0x0010, 0, VR::UI, VM::M1TN, "OriginalSeriesStudyUID" }, { 0x0077, 0x0012, 0, VR::UI, VM::M1TN, "OriginalSOPUID" }, { 0x0077, 0x0014, 0, VR::LO, VM::M1TN, "ReferencedVolumeID" }, { 0x0077, 0x0016, 0, VR::CS, VM::M1, "BinaryDataNameSCS" }, { 0x0077, 0x0020, 0, VR::LO, VM::M1TN, "BinaryDataName" }, { 0x0077, 0x0022, 0, VR::CS, VM::M1TN, "NumberOfSOPInstanceUID" }, { 0x0077, 0x0024, 0, VR::CS, VM::M1TN, "NumberOfSeriesInstanceUID" }, { 0x0077, 0x0026, 0, VR::US, VM::M1, "NumberOfBinaryData" }, { 0x0077, 0x0028, 0, VR::CS, VM::M1TN, "BinaryDataType" }, { 0x0077, 0x0030, 0, VR::UL, VM::M1TN, "BinaryDataSize" }, { 0x0077, 0x0032, 0, VR::LO, VM::M1TN, "BinaryDataSubType" }, { 0x0077, 0x0040, 0, VR::LO, VM::M1TN, "AdditionalInformation" }, { 0x0077, 0x0050, 0, VR::OB, VM::M1, "FirstBinaryData" }, { 0x0077, 0x0060, 0, VR::OB, VM::M1, "FirstThumbnail" }, { 0x0077, 0x0070, 0, VR::LO, VM::M1, "AlgorithmID" }, { 0x0077, 0x0080, 0, VR::LO, VM::M1, "VolumeID" }, { 0x0077, 0x0084, 0, VR::LO, VM::M1TN, "COFObjectUID" }, { 0x0077, 0x0086, 0, VR::LO, VM::M1TN, "WorkflowSceneStatus" }, { 0x0077, 0x0088, 0, VR::UI, VM::M1TN, "ReferenceSOPInstanceUIDs" }, { 0x0077, 0x0090, 0, VR::FL, VM::M1, "COFRefinementLevel" }, }; const unsigned short Dict037TagHashTable[] = { 21, 20, 28, 35, 38, 20, 43, 46, 49, 20, 54, 20, 57, 20, 60, 63, 66, 20, 69, 72, 0, 3, 1, 18, 7, 38, 16, 132, 3, 0, 16, 6, 36, 17, 134, 1, 13, 96, 2, 5, 34, 15, 128, 1, 4, 32, 1, 14, 112, 2, 10, 50, 19, 144, 1, 9, 48, 1, 18, 136, 1, 8, 40, 1, 11, 64, 1, 3, 22, 1, 2, 20, 1, 12, 80, }; const unsigned short Dict037KeyHashTable[] = { 21, 24, 20, 20, 27, 30, 33, 20, 42, 47, 20, 20, 52, 20, 57, 60, 20, 63, 66, 20, 0, 1, 12, 49303, 1, 14, 27846, 1, 11, 55840, 1, 13, 20943, 4, 1, 41434, 8, 26096, 16, 29196, 19, 45123, 2, 0, 40350, 18, 13890, 2, 4, 14003, 6, 52803, 2, 5, 4696, 10, 43645, 1, 15, 16291, 1, 9, 23444, 1, 2, 31239, 3, 3, 8779, 7, 3460, 17, 64960, }; vtkDICOMDictionary::Dict Dict037Data = { "TERARECON AQUARIUS", 20, 20, Dict037TagHashTable, Dict037KeyHashTable, Dict037Contents }; // ----- TOSHIBA COMAPL OOG ----- const DictEntry Dict038Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLOOGType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLOOGVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLOOGInfo" }, }; const unsigned short Dict038TagHashTable[] = { 4, 3, 9, 0, 2, 0, 8, 2, 16, 1, 1, 9, }; const unsigned short Dict038KeyHashTable[] = { 4, 9, 3, 0, 2, 0, 15896, 1, 42148, 1, 2, 11099, }; vtkDICOMDictionary::Dict Dict038Data = { "TOSHIBA COMAPL OOG", 3, 3, Dict038TagHashTable, Dict038KeyHashTable, Dict038Contents }; // ----- SYNARC_1.0 ----- const DictEntry Dict039Contents[] = { { 0x0099, 0x0001, 0, VR::OB, VM::M1, "" }, { 0x0099, 0x0002, 0, VR::OB, VM::M1, "" }, { 0x0099, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0099, 0x0004, 0, VR::US, VM::M1TN, "" }, { 0x0099, 0x0005, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict039TagHashTable[] = { 5, 5, 6, 9, 14, 0, 1, 2, 3, 2, 1, 2, 4, 5, 2, 0, 1, 3, 4, }; const unsigned short Dict039KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict039Data = { "SYNARC_1.0", 5, 5, Dict039TagHashTable, Dict039KeyHashTable, Dict039Contents }; // ----- LORAD Selenia ----- const DictEntry Dict040Contents[] = { { 0x0019, 0x0006, 0, VR::LO, VM::M1, "PaddleID" }, { 0x0019, 0x0007, 0, VR::SH, VM::M1, "PaddlePosition" }, { 0x0019, 0x0008, 0, VR::LO, VM::M1, "CollimationSize" }, { 0x0019, 0x0016, 0, VR::DS, VM::M1, "PaddleAngle" }, { 0x0019, 0x0026, 0, VR::LO, VM::M1, "PaddleIDDescription" }, { 0x0019, 0x0027, 0, VR::SH, VM::M1, "PaddlePositionDescription" }, { 0x0019, 0x0028, 0, VR::LO, VM::M1, "CollimationSizeDescription" }, { 0x0019, 0x0029, 0, VR::LO, VM::M1, "AECUserDensityScaleFactorDescription" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "AECUserDensityScaleFactor" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "AECSystemDensityScaleFactor" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "AECCalculatedmAs" }, { 0x0019, 0x0033, 0, VR::US, VM::M1, "AECAutoPixel1" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "AECAutoPixel2" }, { 0x0019, 0x0035, 0, VR::US, VM::M1, "AECSensor" }, { 0x0019, 0x0037, 0, VR::LO, VM::M1, "NPTMode" }, { 0x0019, 0x0040, 0, VR::DS, VM::M1, "SkinEdge" }, { 0x0019, 0x0041, 0, VR::DS, VM::M1, "ExposureIndex" }, { 0x0019, 0x0050, 0, VR::DS, VM::M1, "DisplayMinimumOD" }, { 0x0019, 0x0051, 0, VR::DS, VM::M1, "DispalyMaximumOD" }, { 0x0019, 0x0052, 0, VR::IS, VM::M1, "DisplayMinimumNits" }, { 0x0019, 0x0053, 0, VR::IS, VM::M1, "DisplayMaximumNits" }, { 0x0019, 0x0060, 0, VR::LT, VM::M1, "GeometryCalibration" }, { 0x0019, 0x0070, 0, VR::LO, VM::M1, "FrameOfReferenceID" }, { 0x0019, 0x0071, 0, VR::CS, VM::M1, "PairedPosition" }, { 0x0019, 0x0080, 0, VR::SH, VM::M1, "DetectorImageOffset" }, { 0x0019, 0x0090, 0, VR::DS, VM::M1, "ConventionalTomoAngle" }, }; const unsigned short Dict040TagHashTable[] = { 27, 30, 26, 26, 33, 36, 26, 26, 26, 39, 42, 47, 26, 26, 52, 55, 60, 65, 70, 73, 76, 81, 84, 89, 26, 94, 0, 1, 22, 112, 1, 23, 113, 1, 1, 7, 1, 0, 6, 1, 25, 144, 2, 5, 39, 15, 64, 2, 4, 38, 16, 65, 1, 9, 49, 2, 3, 22, 8, 48, 2, 11, 51, 21, 96, 2, 2, 8, 10, 50, 1, 13, 53, 1, 12, 52, 2, 14, 55, 17, 80, 1, 18, 81, 2, 7, 41, 19, 82, 2, 6, 40, 20, 83, 1, 24, 128, }; const unsigned short Dict040KeyHashTable[] = { 27, 26, 26, 26, 32, 35, 38, 45, 50, 26, 53, 56, 61, 26, 66, 69, 74, 77, 26, 80, 83, 86, 26, 26, 89, 92, 0, 2, 0, 3062, 16, 7692, 1, 17, 22191, 1, 22, 55974, 3, 4, 49713, 8, 53075, 9, 56322, 2, 10, 18833, 19, 39155, 1, 14, 27682, 1, 5, 40587, 2, 15, 21290, 21, 55587, 2, 3, 9273, 13, 9174, 1, 18, 58731, 2, 6, 5448, 25, 33118, 1, 1, 38450, 1, 24, 23228, 1, 2, 40612, 1, 11, 30079, 1, 12, 30079, 1, 7, 2416, 2, 20, 13643, 23, 34231, }; vtkDICOMDictionary::Dict Dict040Data = { "LORAD Selenia", 26, 26, Dict040TagHashTable, Dict040KeyHashTable, Dict040Contents }; // ----- SIEMENS SYNGO LAYOUT PROTOCOL ----- const DictEntry Dict041Contents[] = { { 0x0073, 0x0002, 0, VR::US, VM::M1, "HangingProtocolExcellenceRank" }, { 0x0073, 0x0004, 0, VR::CS, VM::M1, "TemplateDataRoleID" }, { 0x0073, 0x0006, 0, VR::CS, VM::M1, "DataSharingFlag" }, { 0x0073, 0x0008, 0, VR::SQ, VM::M1, "BaggingOperationsSequence" }, { 0x0073, 0x0010, 0, VR::LO, VM::M1, "SynchronizationType" }, { 0x0073, 0x0012, 0, VR::LO, VM::M1, "CustomFilterType" }, { 0x0073, 0x0014, 0, VR::LO, VM::M1, "CustomSorterType" }, { 0x0073, 0x0016, 0, VR::CS, VM::M1, "ReferenceTemplateDataRoleID" }, { 0x0073, 0x0018, 0, VR::CS, VM::M1, "ModelTemplateDataRoleID" }, { 0x0073, 0x0020, 0, VR::DT, VM::M1TN, "SelectorDTValue" }, { 0x0073, 0x0022, 0, VR::DA, VM::M1TN, "SelectorDAValue" }, { 0x0073, 0x0024, 0, VR::TM, VM::M1TN, "SelectorTMValue" }, { 0x0073, 0x0026, 0, VR::UI, VM::M1TN, "SelectorUIValue" }, { 0x0073, 0x0028, 0, VR::CS, VM::M1, "ReferencedTemplateDataRole" }, { 0x0073, 0x0030, 0, VR::SQ, VM::M1, "CustomPropertySequence" }, { 0x0073, 0x0032, 0, VR::CS, VM::M1, "CustomPropertyType" }, { 0x0073, 0x0034, 0, VR::LO, VM::M1, "CustomPropertyName" }, { 0x0073, 0x0036, 0, VR::LO, VM::M1, "CustomPropertyValue" }, { 0x0073, 0x0038, 0, VR::SQ, VM::M1, "LayoutPropertySequence" }, { 0x0073, 0x0040, 0, VR::SQ, VM::M1, "SynchronizationSequence" }, { 0x0073, 0x0042, 0, VR::CS, VM::M1, "PresentationCreatorType" }, { 0x0073, 0x0044, 0, VR::CS, VM::M1, "CineNavigationType" }, { 0x0073, 0x0046, 0, VR::CS, VM::M1, "InternalFlag" }, { 0x0073, 0x0048, 0, VR::LO, VM::M1, "SemanticNamingStrategy" }, { 0x0073, 0x0050, 0, VR::LO, VM::M1, "ParameterString" }, { 0x0073, 0x0052, 0, VR::CS, VM::M1, "SortingOrder" }, { 0x0073, 0x0054, 0, VR::CS, VM::M1, "syngoTemplateType" }, { 0x0073, 0x0056, 0, VR::CS, VM::M1, "SorterType" }, { 0x0073, 0x0058, 0, VR::SH, VM::M1, "DataDisplayProtocolVersion" }, { 0x0073, 0x005A, 0, VR::CS, VM::M1, "TimepointValue" }, { 0x0073, 0x005B, 0, VR::CS, VM::M1, "SharingGroupSequence" }, { 0x0073, 0x005C, 0, VR::CS, VM::M1, "TemplateSelectorOperator" }, { 0x0073, 0x005D, 0, VR::CS, VM::M1, "SharingType" }, { 0x0073, 0x0060, 0, VR::SQ, VM::M1, "ViewportDefinitionsSequence" }, { 0x0073, 0x0062, 0, VR::CS, VM::M1, "ProtocolType" }, { 0x0073, 0x0064, 0, VR::SQ, VM::M1, "TemplateSelectorSequence" }, { 0x0073, 0x0066, 0, VR::CS, VM::M1, "DefaultTemplate" }, { 0x0073, 0x0068, 0, VR::CS, VM::M1, "IsPreferred" }, { 0x0073, 0x006A, 0, VR::SQ, VM::M1, "TimepointInitialValueSequence" }, { 0x0073, 0x006C, 0, VR::CS, VM::M1, "TimepointVariable" }, { 0x0073, 0x0070, 0, VR::SH, VM::M1, "DisplayProtocolName" }, { 0x0073, 0x0072, 0, VR::LO, VM::M1, "DisplayProtocolDescription" }, { 0x0073, 0x0074, 0, VR::CS, VM::M1, "DisplayProtocolLevel" }, { 0x0073, 0x0076, 0, VR::LO, VM::M1, "DisplayProtocolCreator" }, { 0x0073, 0x0078, 0, VR::DT, VM::M1, "DisplayProtocolCreationDatetime" }, { 0x0073, 0x007A, 0, VR::UI, VM::M1, "ReferencedDataProtocol" }, { 0x0073, 0x007C, 0, VR::US, VM::M1, "DisplayProtocolExcellenceRank" }, { 0x0073, 0x007E, 0, VR::SQ, VM::M1, "LayoutSequence" }, { 0x0073, 0x0080, 0, VR::US, VM::M1, "LayoutNumber" }, { 0x0073, 0x0082, 0, VR::LO, VM::M1, "LayoutDescription" }, { 0x0073, 0x0084, 0, VR::SQ, VM::M1, "SegmentSequence" }, { 0x0073, 0x0086, 0, VR::US, VM::M1, "SegmentNumber" }, { 0x0073, 0x0088, 0, VR::LO, VM::M1, "SegmentDescription" }, { 0x0073, 0x008A, 0, VR::CS, VM::M1, "SegmentType" }, { 0x0073, 0x008C, 0, VR::US, VM::M1, "TileHorizontalDimension" }, { 0x0073, 0x008E, 0, VR::US, VM::M1, "TileVerticalDimension" }, { 0x0073, 0x0090, 0, VR::CS, VM::M1, "FillOrder" }, { 0x0073, 0x0092, 0, VR::CS, VM::M1, "SegmentSmallScrollType" }, { 0x0073, 0x0094, 0, VR::US, VM::M1, "SegmentSmallScrollAmount" }, { 0x0073, 0x0096, 0, VR::CS, VM::M1, "SegmentLargeScrollType" }, { 0x0073, 0x0098, 0, VR::US, VM::M1, "SegmentLargeScrollAmount" }, { 0x0073, 0x009A, 0, VR::US, VM::M1, "SegmentOverlapPriority" }, { 0x0073, 0x009C, 0, VR::SQ, VM::M1, "DataRoleViewSequence" }, { 0x0073, 0x009E, 0, VR::US, VM::M1, "DataRoleViewNumber" }, { 0x0073, 0x00A2, 0, VR::US, VM::M1, "ReferencedDataRole" }, { 0x0073, 0x00A4, 0, VR::CS, VM::M1, "SharingEnabled" }, { 0x0073, 0x00A8, 0, VR::US, VM::M2TN, "ReferencedDataRoleViews" }, { 0x0073, 0x00B0, 0, VR::SH, VM::M1, "DataProtocolName" }, { 0x0073, 0x00B2, 0, VR::LO, VM::M1, "DataProtocolDescription" }, { 0x0073, 0x00B4, 0, VR::CS, VM::M1, "DataProtocolLevel" }, { 0x0073, 0x00B6, 0, VR::LO, VM::M1, "DataProtocolCreator" }, { 0x0073, 0x00B8, 0, VR::DT, VM::M1, "DataProtocolCreationDatetime" }, { 0x0073, 0x00BA, 0, VR::US, VM::M1, "DataProtocolExcellenceRank" }, { 0x0073, 0x00BC, 0, VR::SQ, VM::M1, "DataProtocolDefinitionSequence" }, { 0x0073, 0x00BE, 0, VR::SQ, VM::M1, "DataRoleSequence" }, { 0x0073, 0x00C0, 0, VR::US, VM::M1, "DataRoleNumber" }, { 0x0073, 0x00C2, 0, VR::SH, VM::M1, "DataRoleName" }, { 0x0073, 0x00C6, 0, VR::SQ, VM::M1, "SelectorOperationsSequence" }, { 0x0073, 0x00C8, 0, VR::CS, VM::M1, "SelectorUsageFlag" }, { 0x0073, 0x00CA, 0, VR::CS, VM::M1, "SelectByAttributePresence" }, { 0x0073, 0x00CC, 0, VR::CS, VM::M1, "SelectByCategory" }, { 0x0073, 0x00CE, 0, VR::CS, VM::M1, "SelectByOperator" }, { 0x0073, 0x00D0, 0, VR::LO, VM::M1, "CustomSelectorType" }, { 0x0073, 0x00D2, 0, VR::CS, VM::M1, "SelectorOperator" }, { 0x0073, 0x00D4, 0, VR::CS, VM::M1, "ReformattingRequired" }, { 0x0073, 0x00D6, 0, VR::SQ, VM::M1, "RegistrationDataSequence" }, { 0x0073, 0x00D8, 0, VR::US, VM::M1, "ReferenceDataRoleNumber" }, { 0x0073, 0x00DA, 0, VR::SQ, VM::M1, "ModelDataSequence" }, { 0x0073, 0x00DC, 0, VR::US, VM::M1, "ModelDataRoleNumber" }, { 0x0073, 0x00DE, 0, VR::SQ, VM::M1, "FusionDisplaySequence" }, { 0x0073, 0x00E0, 0, VR::FD, VM::M1, "Transparency" }, { 0x0073, 0x00E2, 0, VR::CS, VM::M1, "TimePoint" }, { 0x0073, 0x00E4, 0, VR::LO, VM::M1, "FirstTimePointToken" }, { 0x0073, 0x00E6, 0, VR::LO, VM::M1, "LastTimePointToken" }, { 0x0073, 0x00E8, 0, VR::LO, VM::M1, "IntermediateTimePointToken" }, { 0x0073, 0x00EA, 0, VR::SQ, VM::M1, "DataProcessorSequence" }, { 0x0073, 0x00EC, 0, VR::LO, VM::M1, "DataProcessorType" }, { 0x0073, 0x00EE, 0, VR::SQ, VM::M1, "TemplateDataRoleSequence" }, { 0x0073, 0x00F0, 0, VR::SQ, VM::M1, "ViewSequence" }, { 0x0073, 0x00F4, 0, VR::LO, VM::M1, "ViewType" }, { 0x0073, 0x00F6, 0, VR::LO, VM::M1, "CustomBaggingType" }, { 0x0073, 0x00F8, 0, VR::US, VM::M1, "ReferencedDisplaySegmentNumber" }, { 0x0073, 0x00FA, 0, VR::LO, VM::M1, "DataRoleType" }, { 0x0073, 0x00FC, 0, VR::CS, VM::M1, "UnassignedFlag" }, { 0x0073, 0x00FE, 0, VR::CS, VM::M1, "InitialDisplayScrollPosition" }, { 0x0073, 0x00FF, 0, VR::LO, VM::M1, "VRTPreset" }, }; const unsigned short Dict041TagHashTable[] = { 107, 112, 106, 115, 118, 121, 124, 127, 106, 130, 133, 136, 139, 144, 147, 150, 153, 158, 161, 164, 167, 170, 173, 176, 181, 184, 187, 190, 195, 198, 201, 204, 209, 212, 217, 220, 225, 230, 235, 238, 243, 248, 253, 256, 106, 261, 264, 267, 106, 272, 106, 277, 106, 282, 106, 287, 106, 292, 106, 295, 106, 300, 106, 303, 306, 309, 312, 315, 318, 321, 324, 327, 106, 330, 333, 106, 106, 336, 106, 339, 342, 345, 348, 351, 354, 357, 360, 106, 365, 106, 368, 106, 373, 106, 376, 106, 379, 106, 384, 106, 389, 106, 394, 106, 397, 106, 0, 2, 8, 24, 65, 164, 1, 41, 114, 1, 40, 112, 1, 66, 168, 1, 43, 118, 1, 0, 2, 1, 42, 116, 1, 45, 122, 1, 2, 6, 1, 44, 120, 2, 1, 4, 56, 144, 1, 47, 126, 1, 57, 146, 1, 46, 124, 2, 3, 8, 58, 148, 1, 34, 98, 1, 59, 150, 1, 33, 96, 1, 60, 152, 1, 36, 102, 1, 61, 154, 2, 35, 100, 98, 240, 1, 62, 156, 1, 38, 106, 1, 63, 158, 2, 37, 104, 99, 244, 1, 48, 128, 1, 100, 246, 1, 49, 130, 2, 39, 108, 101, 248, 1, 50, 132, 2, 25, 82, 102, 250, 1, 51, 134, 2, 24, 80, 103, 252, 2, 52, 136, 105, 255, 2, 27, 86, 104, 254, 1, 53, 138, 2, 26, 84, 90, 224, 2, 30, 91, 54, 140, 2, 29, 90, 91, 226, 1, 55, 142, 2, 28, 88, 92, 228, 1, 93, 230, 1, 32, 93, 2, 31, 92, 94, 232, 2, 20, 66, 95, 234, 2, 19, 64, 96, 236, 2, 22, 70, 97, 238, 2, 21, 68, 82, 208, 1, 83, 210, 2, 23, 72, 84, 212, 1, 85, 214, 1, 86, 216, 1, 15, 50, 1, 87, 218, 1, 14, 48, 1, 88, 220, 1, 17, 54, 1, 89, 222, 1, 16, 52, 1, 75, 192, 1, 76, 194, 1, 18, 56, 1, 77, 198, 1, 78, 200, 1, 10, 34, 1, 79, 202, 1, 9, 32, 1, 80, 204, 1, 12, 38, 1, 81, 206, 2, 11, 36, 67, 176, 1, 68, 178, 2, 13, 40, 69, 180, 1, 70, 182, 1, 71, 184, 2, 5, 18, 72, 186, 2, 4, 16, 73, 188, 2, 7, 22, 74, 190, 1, 6, 20, 1, 64, 162, }; const unsigned short Dict041KeyHashTable[] = { 107, 106, 116, 119, 122, 129, 132, 106, 135, 140, 106, 143, 150, 106, 155, 158, 106, 161, 106, 106, 164, 167, 106, 106, 106, 106, 106, 106, 106, 170, 175, 178, 181, 184, 187, 190, 197, 202, 106, 106, 106, 207, 106, 212, 106, 217, 106, 106, 222, 106, 225, 106, 228, 231, 234, 106, 237, 106, 244, 251, 254, 106, 257, 106, 106, 106, 264, 106, 106, 271, 274, 277, 286, 293, 296, 299, 106, 302, 309, 312, 315, 318, 323, 326, 329, 338, 341, 106, 106, 344, 106, 349, 106, 106, 106, 354, 106, 357, 106, 360, 106, 365, 106, 374, 106, 379, 0, 4, 1, 11129, 39, 28218, 59, 8738, 95, 8140, 1, 101, 25284, 1, 70, 38003, 3, 22, 43580, 33, 36063, 103, 52014, 1, 68, 41640, 1, 89, 31981, 2, 75, 27925, 91, 53887, 1, 42, 47686, 3, 26, 33812, 29, 23896, 100, 11335, 2, 60, 17049, 64, 33372, 1, 21, 14804, 1, 69, 3529, 1, 12, 6216, 1, 36, 49621, 1, 77, 47099, 2, 55, 22799, 79, 64590, 1, 5, 22177, 1, 49, 10932, 1, 16, 14263, 1, 71, 47157, 1, 67, 52600, 3, 72, 46181, 90, 55302, 92, 16202, 2, 47, 57084, 48, 26964, 2, 18, 55174, 50, 18894, 2, 32, 34305, 62, 9462, 2, 30, 64590, 102, 38516, 2, 35, 1963, 46, 6842, 1, 81, 36230, 1, 38, 49758, 1, 23, 14133, 1, 41, 10902, 1, 97, 50520, 3, 10, 11592, 56, 15032, 58, 5334, 3, 31, 53282, 45, 10481, 65, 62477, 1, 104, 62747, 1, 94, 51475, 3, 17, 13642, 40, 55624, 105, 13343, 3, 52, 23497, 57, 608, 66, 920, 1, 82, 29331, 1, 80, 31164, 4, 4, 16309, 73, 62702, 87, 15357, 88, 8122, 3, 13, 54508, 19, 36916, 53, 43013, 1, 8, 64205, 1, 14, 18002, 1, 3, 49543, 3, 6, 19090, 9, 62299, 98, 14622, 1, 76, 36234, 1, 25, 56892, 1, 11, 64578, 2, 20, 23597, 85, 25277, 1, 74, 15180, 1, 34, 49879, 4, 27, 34821, 37, 22910, 84, 57066, 99, 27371, 1, 43, 17780, 1, 83, 17942, 2, 54, 15089, 96, 15924, 2, 0, 24678, 63, 63449, 1, 24, 50211, 1, 78, 21794, 2, 7, 59207, 93, 20920, 4, 2, 30096, 28, 48868, 44, 41665, 86, 26234, 2, 15, 16544, 61, 62286, 1, 51, 31276, }; vtkDICOMDictionary::Dict Dict041Data = { "SIEMENS SYNGO LAYOUT PROTOCOL", 106, 106, Dict041TagHashTable, Dict041KeyHashTable, Dict041Contents }; // ----- SIEMENS MR VA0 RAW ----- const DictEntry Dict042Contents[] = { { 0x0021, 0x0000, 0, VR::CS, VM::M1, "SequenceType" }, { 0x0021, 0x0001, 0, VR::IS, VM::M1, "VectorSizeOriginal" }, { 0x0021, 0x0002, 0, VR::IS, VM::M1, "VectorSizeExtended" }, { 0x0021, 0x0003, 0, VR::DS, VM::M1, "AcquiredSpectralRange" }, { 0x0021, 0x0004, 0, VR::DS, VM::M3, "VOIPosition" }, { 0x0021, 0x0005, 0, VR::DS, VM::M3, "VOISize" }, { 0x0021, 0x0006, 0, VR::IS, VM::M3, "CSIMatrixSizeOriginal" }, { 0x0021, 0x0007, 0, VR::IS, VM::M3, "CSIMatrixSizeExtended" }, { 0x0021, 0x0008, 0, VR::DS, VM::M3, "SpatialGridShift" }, { 0x0021, 0x0009, 0, VR::DS, VM::M1, "SignalLimitsMinimum" }, { 0x0021, 0x0010, 0, VR::DS, VM::M1, "SignalLimitsMaximum" }, { 0x0021, 0x0011, 0, VR::DS, VM::M1, "SpecInfoMask" }, { 0x0021, 0x0012, 0, VR::DS, VM::M1, "EPITimeRateOfChangeOfMagnitude" }, { 0x0021, 0x0013, 0, VR::DS, VM::M1, "EPITimeRateOfChangeOfXComponent" }, { 0x0021, 0x0014, 0, VR::DS, VM::M1, "EPITimeRateOfChangeOfYComponent" }, { 0x0021, 0x0015, 0, VR::DS, VM::M1, "EPITimeRateOfChangeOfZComponent" }, { 0x0021, 0x0016, 0, VR::DS, VM::M1, "EPITimeRateOfChangeLegalLimit1" }, { 0x0021, 0x0017, 0, VR::IS, VM::M1, "EPIOperationModeFlag" }, { 0x0021, 0x0018, 0, VR::DS, VM::M1, "EPIFieldCalculationSafetyFactor" }, { 0x0021, 0x0019, 0, VR::DS, VM::M1, "EPILegalLimit1OfChangeValue" }, { 0x0021, 0x0020, 0, VR::DS, VM::M1, "EPILegalLimit2OfChangeValue" }, { 0x0021, 0x0021, 0, VR::DS, VM::M1, "EPIRiseTime" }, { 0x0021, 0x0030, 0, VR::DS, VM::M16, "ArrayCoilADCOffset" }, { 0x0021, 0x0031, 0, VR::DS, VM::M16, "ArrayCoilPreamplifierGain" }, { 0x0021, 0x0050, 0, VR::LO, VM::M1, "SaturationType" }, { 0x0021, 0x0051, 0, VR::DS, VM::M3, "SaturationNormalVector" }, { 0x0021, 0x0052, 0, VR::DS, VM::M3, "SaturationPositionVector" }, { 0x0021, 0x0053, 0, VR::DS, VM::M6, "SaturationThickness" }, { 0x0021, 0x0054, 0, VR::DS, VM::M6, "SaturationWidth" }, { 0x0021, 0x0055, 0, VR::DS, VM::M6, "SaturationDistance" }, }; const unsigned short Dict042TagHashTable[] = { 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 30, 30, 30, 30, 67, 70, 73, 76, 79, 82, 85, 90, 95, 100, 105, 110, 30, 30, 0, 1, 21, 33, 1, 20, 32, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 9, 9, 1, 8, 8, 1, 23, 49, 1, 22, 48, 1, 11, 17, 1, 10, 16, 1, 13, 19, 1, 12, 18, 2, 15, 21, 24, 80, 2, 14, 20, 25, 81, 2, 17, 23, 26, 82, 2, 16, 22, 27, 83, 2, 19, 25, 28, 84, 2, 18, 24, 29, 85, }; const unsigned short Dict042KeyHashTable[] = { 31, 30, 38, 41, 46, 30, 30, 49, 56, 61, 64, 67, 72, 75, 78, 30, 81, 84, 30, 87, 90, 93, 30, 96, 30, 99, 102, 107, 30, 30, 0, 3, 4, 42076, 14, 5059, 19, 58440, 1, 22, 35412, 2, 13, 38773, 21, 26431, 1, 16, 18571, 3, 7, 19185, 8, 17128, 18, 31251, 2, 3, 10853, 5, 30301, 1, 25, 16479, 1, 11, 41105, 2, 6, 5553, 9, 32093, 1, 2, 8500, 1, 17, 17085, 1, 29, 45098, 1, 1, 60404, 1, 10, 18303, 1, 27, 11852, 1, 12, 26116, 1, 28, 547, 1, 26, 816, 1, 20, 63300, 2, 0, 6253, 23, 7368, 2, 15, 36880, 24, 22965, }; vtkDICOMDictionary::Dict Dict042Data = { "SIEMENS MR VA0 RAW", 30, 30, Dict042TagHashTable, Dict042KeyHashTable, Dict042Contents }; // ----- SIEMENS CM VA0 LAB ----- const DictEntry Dict043Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "GeneratorIdentificationLabel" }, { 0x0009, 0x0011, 0, VR::LO, VM::M1, "GantryIdentificationLabel" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "XRayTubeIdentificationLabel" }, { 0x0009, 0x0013, 0, VR::LO, VM::M1, "DetectorIdentificationLabel" }, { 0x0009, 0x0014, 0, VR::LO, VM::M1, "DASIdentificationLabel" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "SMIIdentificationLabel" }, { 0x0009, 0x0016, 0, VR::LO, VM::M1, "CPUIdentificationLabel" }, { 0x0009, 0x0020, 0, VR::SH, VM::M1, "HeaderVersion" }, }; const unsigned short Dict043TagHashTable[] = { 9, 12, 17, 20, 23, 26, 8, 29, 0, 1, 1, 17, 2, 0, 16, 7, 32, 1, 3, 19, 1, 2, 18, 1, 5, 21, 1, 4, 20, 1, 6, 22, }; const unsigned short Dict043KeyHashTable[] = { 9, 12, 8, 15, 18, 8, 23, 26, 0, 1, 5, 29799, 1, 3, 55069, 1, 2, 18716, 2, 1, 54980, 7, 47602, 1, 0, 122, 2, 4, 60080, 6, 33446, }; vtkDICOMDictionary::Dict Dict043Data = { "SIEMENS CM VA0 LAB", 8, 8, Dict043TagHashTable, Dict043KeyHashTable, Dict043Contents }; // ----- CoActiv_PvtTags ----- const DictEntry Dict044Contents[] = { { 0x7501, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x7501, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x7501, 0x0003, 0, VR::UI, VM::M1, "" }, { 0x7501, 0x0004, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict044TagHashTable[] = { 5, 8, 11, 14, 0, 1, 0, 1, 1, 3, 4, 1, 2, 3, 1, 1, 2, }; const unsigned short Dict044KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict044Data = { "CoActiv_PvtTags", 4, 4, Dict044TagHashTable, Dict044KeyHashTable, Dict044Contents }; // ----- MDDX ----- const DictEntry Dict045Contents[] = { { 0x0011, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" }, { 0x0011, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" }, { 0x0011, 0x0003, 0, VR::LO, VM::M1, "MaskID" }, { 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" }, { 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" }, { 0x7fe1, 0x0003, 0, VR::LO, VM::M1, "MaskID" }, }; const unsigned short Dict045TagHashTable[] = { 7, 10, 6, 6, 15, 20, 0, 1, 2, 3, 2, 1, 2, 3, 1, 2, 0, 1, 4, 2, 1, 5, 3, }; const unsigned short Dict045KeyHashTable[] = { 7, 6, 6, 12, 17, 6, 0, 2, 0, 44074, 3, 44074, 2, 1, 2946, 4, 2946, 2, 2, 48063, 5, 48063, }; vtkDICOMDictionary::Dict Dict045Data = { "MDDX", 6, 6, Dict045TagHashTable, Dict045KeyHashTable, Dict045Contents }; // ----- http://www.gemedicalsystems.com/it_solutions/orthoview/2.1 ----- const DictEntry Dict046Contents[] = { { 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" }, { 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" }, { 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" }, { 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" }, { 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" }, { 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" }, }; const unsigned short Dict046TagHashTable[] = { 7, 10, 15, 20, 6, 6, 0, 1, 3, 64, 2, 0, 16, 1, 32, 2, 4, 80, 5, 96, 1, 2, 48, }; const unsigned short Dict046KeyHashTable[] = { 7, 12, 6, 15, 6, 20, 0, 2, 1, 15840, 2, 7958, 1, 0, 19322, 2, 4, 12279, 5, 9030, 1, 3, 19440, }; vtkDICOMDictionary::Dict Dict046Data = { "http://www.gemedicalsystems.com/it_solutions/orthoview/2.1", 6, 6, Dict046TagHashTable, Dict046KeyHashTable, Dict046Contents }; // ----- PHILIPS NM -Private ----- const DictEntry Dict047Contents[] = { { 0x7051, 0x0000, 0, VR::US, VM::M1, "CurrentSegment" }, { 0x7051, 0x0001, 0, VR::US, VM::M1, "NumberOfSegments" }, { 0x7051, 0x0002, 0, VR::FL, VM::M1, "SegmentStartPosition" }, { 0x7051, 0x0003, 0, VR::FL, VM::M1, "SegmentStopPosition" }, { 0x7051, 0x0004, 0, VR::FL, VM::M1, "RelativeCOROffsetXDirection" }, { 0x7051, 0x0005, 0, VR::FL, VM::M1, "RelativeCOROffsetZDirection" }, { 0x7051, 0x0006, 0, VR::US, VM::M1, "CurrentRotationNumber" }, { 0x7051, 0x0007, 0, VR::US, VM::M1, "NumberOfRotations" }, { 0x7051, 0x0010, 0, VR::DS, VM::M1TN, "AlignmentTranslations" }, { 0x7051, 0x0011, 0, VR::DS, VM::M1TN, "AlignmentRotations" }, { 0x7051, 0x0012, 0, VR::DS, VM::M1, "AlignmentTimestamp" }, { 0x7051, 0x0015, 0, VR::UI, VM::M1, "RelatedXraySeriesInstanceUID" }, { 0x7051, 0x0025, 0, VR::LO, VM::M1, "" }, { 0x7051, 0x0026, 0, VR::DS, VM::M1, "" }, { 0x7051, 0x0027, 0, VR::IS, VM::M1, "" }, { 0x7051, 0x0028, 0, VR::IS, VM::M1, "" }, { 0x7051, 0x0029, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict047TagHashTable[] = { 17, 17, 18, 21, 26, 31, 38, 43, 48, 55, 17, 17, 17, 17, 17, 17, 17, 0, 1, 0, 0, 2, 1, 1, 8, 16, 2, 2, 2, 9, 17, 3, 3, 3, 10, 18, 12, 37, 2, 4, 4, 13, 38, 2, 5, 5, 14, 39, 3, 6, 6, 11, 21, 15, 40, 2, 7, 7, 16, 41, }; const unsigned short Dict047KeyHashTable[] = { 17, 18, 17, 23, 26, 29, 17, 32, 17, 35, 46, 17, 49, 52, 55, 60, 17, 0, 2, 6, 17152, 11, 42235, 1, 4, 49858, 1, 7, 40226, 1, 3, 24142, 1, 0, 46516, 5, 12, 316, 13, 316, 14, 316, 15, 316, 16, 316, 1, 9, 51405, 1, 2, 25119, 1, 5, 31098, 2, 1, 29995, 10, 22762, 1, 8, 47239, }; vtkDICOMDictionary::Dict Dict047Data = { "PHILIPS NM -Private", 17, 17, Dict047TagHashTable, Dict047KeyHashTable, Dict047Contents }; // ----- SIEMENS WH SR 1.0 ----- const DictEntry Dict048Contents[] = { { 0x0071, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0071, 0x0002, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict048TagHashTable[] = { 3, 6, 0, 1, 1, 2, 1, 0, 1, }; const unsigned short Dict048KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict048Data = { "SIEMENS WH SR 1.0", 2, 2, Dict048TagHashTable, Dict048KeyHashTable, Dict048Contents }; // ----- PMOD_1 ----- const DictEntry Dict049Contents[] = { { 0x0055, 0x0001, 0, VR::FD, VM::M1TN, "FrameStartTimesVector" }, { 0x0055, 0x0002, 0, VR::FD, VM::M3T3N, "FramePositionsVector" }, { 0x0055, 0x0003, 0, VR::FD, VM::M6T6N, "FrameOrientationsVector" }, { 0x0055, 0x0004, 0, VR::FD, VM::M1TN, "FrameDurationsVector" }, { 0x0055, 0x0005, 0, VR::FD, VM::M1TN, "FrameRescaleSlopeVector" }, }; const unsigned short Dict049TagHashTable[] = { 6, 11, 16, 5, 5, 0, 2, 0, 1, 3, 4, 2, 1, 2, 4, 5, 1, 2, 3, }; const unsigned short Dict049KeyHashTable[] = { 5, 6, 5, 11, 16, 0, 2, 2, 11757, 3, 64319, 2, 0, 60720, 4, 17754, 1, 1, 8603, }; vtkDICOMDictionary::Dict Dict049Data = { "PMOD_1", 5, 5, Dict049TagHashTable, Dict049KeyHashTable, Dict049Contents }; // ----- QCA Results ----- const DictEntry Dict050Contents[] = { { 0x0009, 0x0000, 0, VR::CS, VM::M1, "AnalysisType" }, { 0x0009, 0x0004, 0, VR::LO, VM::M1, "SegmentName" }, { 0x0009, 0x0012, 0, VR::DS, VM::M1, "PreProcedureCatheterSize" }, { 0x0009, 0x0013, 0, VR::DS, VM::M1, "PreProcedureReferenceDiameter" }, { 0x0009, 0x0014, 0, VR::DS, VM::M1, "PreProcedureMinimumLumenDiameter" }, { 0x0009, 0x0015, 0, VR::DS, VM::M1, "PreProcedureAverageDiameter" }, { 0x0009, 0x0016, 0, VR::DS, VM::M1, "PreProcedureStenosisLength" }, { 0x0009, 0x0017, 0, VR::DS, VM::M1, "PreProcedureStenosisPercentage" }, { 0x0009, 0x0018, 0, VR::DS, VM::M1, "PreProcedureGeometricAreaReductionPercentage" }, { 0x0009, 0x0022, 0, VR::DS, VM::M1, "PostProcedureCatheterSize" }, { 0x0009, 0x0023, 0, VR::DS, VM::M1, "PostProcedureReferenceDiameter" }, { 0x0009, 0x0024, 0, VR::DS, VM::M1, "PostProcedureMinimumLumenDiameter" }, { 0x0009, 0x0025, 0, VR::DS, VM::M1, "PostProcedureAverageDiameter" }, { 0x0009, 0x0026, 0, VR::DS, VM::M1, "PostProcedureStenosisLength" }, { 0x0009, 0x0027, 0, VR::DS, VM::M1, "PostProcedureStenosisPercentage" }, { 0x0009, 0x0028, 0, VR::DS, VM::M1, "PostProcedureGeometricAreaReductionPercentage" }, }; const unsigned short Dict050TagHashTable[] = { 16, 17, 16, 16, 16, 16, 16, 16, 16, 22, 25, 30, 35, 40, 47, 52, 0, 2, 8, 24, 15, 40, 1, 0, 0, 2, 3, 19, 10, 35, 2, 2, 18, 9, 34, 2, 5, 21, 12, 37, 3, 1, 4, 4, 20, 11, 36, 2, 7, 23, 14, 39, 2, 6, 22, 13, 38, }; const unsigned short Dict050KeyHashTable[] = { 17, 16, 16, 16, 16, 16, 16, 20, 23, 26, 29, 34, 41, 44, 47, 52, 0, 1, 2, 59650, 1, 15, 2407, 1, 8, 40137, 1, 1, 56857, 2, 12, 7069, 14, 34448, 3, 0, 39878, 5, 42205, 7, 37014, 1, 11, 10247, 1, 4, 52177, 2, 10, 50744, 13, 18002, 3, 3, 40892, 6, 40912, 9, 9799, }; vtkDICOMDictionary::Dict Dict050Data = { "QCA Results", 16, 16, Dict050TagHashTable, Dict050KeyHashTable, Dict050Contents }; // ----- SIEMENS MED MG ----- const DictEntry Dict051Contents[] = { { 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" }, { 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" }, { 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" }, { 0x0029, 0x0030, 0, VR::US, VM::M1, "ListOfTotalDisplayLength" }, { 0x0029, 0x0040, 0, VR::LO, VM::M1TN, "ListOfDisplayPrefix" }, { 0x0029, 0x0050, 0, VR::LO, VM::M1TN, "ListOfDisplayPostfix" }, { 0x0029, 0x0060, 0, VR::US, VM::M1, "ListOfTextPosition" }, { 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" }, }; const unsigned short Dict051TagHashTable[] = { 9, 18, 8, 8, 25, 8, 8, 8, 0, 4, 4, 64, 5, 80, 6, 96, 7, 112, 3, 0, 16, 2, 32, 3, 48, 1, 1, 21, }; const unsigned short Dict051KeyHashTable[] = { 9, 12, 17, 8, 22, 25, 8, 28, 0, 1, 6, 28194, 2, 5, 28059, 7, 2168, 2, 3, 16906, 4, 43179, 1, 2, 50495, 1, 1, 4798, 1, 0, 31019, }; vtkDICOMDictionary::Dict Dict051Data = { "SIEMENS MED MG", 8, 8, Dict051TagHashTable, Dict051KeyHashTable, Dict051Contents }; // ----- GEMS_CTHD_01 ----- const DictEntry Dict052Contents[] = { { 0x0033, 0x0002, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict052TagHashTable[] = { 2, 0, 1, 0, 2, }; const unsigned short Dict052KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict052Data = { "GEMS_CTHD_01", 1, 1, Dict052TagHashTable, Dict052KeyHashTable, Dict052Contents }; // ----- astm.org/diconde/iod/Component ----- const DictEntry Dict053Contents[] = { { 0x0011, 0x0023, 0, VR::ST, VM::M1TN, "CADFileFormat" }, { 0x0011, 0x0024, 0, VR::ST, VM::M1TN, "ComponentReferenceSystem" }, { 0x0011, 0x0025, 0, VR::ST, VM::M1TN, "ComponentManufacturingProcedure" }, { 0x0011, 0x0028, 0, VR::ST, VM::M1TN, "ComponentManufacturer" }, { 0x0011, 0x0030, 0, VR::DS, VM::M1TN, "MaterialThickness" }, { 0x0011, 0x0032, 0, VR::DS, VM::M1TN, "MaterialPipeDiameter" }, { 0x0011, 0x0034, 0, VR::DS, VM::M1TN, "MaterialIsolationDiameter" }, { 0x0011, 0x0042, 0, VR::ST, VM::M1TN, "MaterialGrade" }, { 0x0011, 0x0044, 0, VR::ST, VM::M1TN, "MaterialPropertiesFileID" }, { 0x0011, 0x0045, 0, VR::ST, VM::M1TN, "MaterialPropertiesFileFormat" }, { 0x0011, 0x0046, 0, VR::LT, VM::M1, "MaterialNotes" }, { 0x0011, 0x0050, 0, VR::CS, VM::M1, "ComponentShape" }, { 0x0011, 0x0052, 0, VR::CS, VM::M1, "CurvatureType" }, { 0x0011, 0x0054, 0, VR::DS, VM::M1, "OuterDiameter" }, { 0x0011, 0x0056, 0, VR::DS, VM::M1, "InnerDiameter" }, }; const unsigned short Dict053TagHashTable[] = { 15, 15, 15, 16, 19, 22, 27, 30, 37, 42, 45, 50, 53, 15, 15, 0, 1, 4, 48, 1, 11, 80, 2, 0, 35, 5, 50, 1, 12, 82, 3, 2, 37, 6, 52, 7, 66, 2, 1, 36, 13, 84, 1, 8, 68, 2, 9, 69, 14, 86, 1, 10, 70, 1, 3, 40, }; const unsigned short Dict053KeyHashTable[] = { 16, 25, 28, 33, 15, 15, 38, 15, 15, 15, 41, 46, 15, 15, 51, 0, 4, 0, 28810, 3, 30475, 5, 34019, 6, 35263, 1, 4, 48497, 2, 10, 57109, 14, 31830, 2, 1, 12871, 7, 33772, 1, 13, 62519, 2, 2, 7589, 11, 47473, 2, 8, 8877, 12, 39507, 1, 9, 58756, }; vtkDICOMDictionary::Dict Dict053Data = { "astm.org/diconde/iod/Component", 15, 15, Dict053TagHashTable, Dict053KeyHashTable, Dict053Contents }; // ----- GEMS_IDI_01 ----- const DictEntry Dict054Contents[] = { { 0x0073, 0x0020, 0, VR::DS, VM::M1, "HeightMapPlaneDistance" }, { 0x0073, 0x0021, 0, VR::DS, VM::M1, "HeightMapPlaneOffset" }, { 0x0073, 0x0030, 0, VR::OW, VM::M1, "HeightMapPlaneIndices" }, { 0x0073, 0x0031, 0, VR::OW, VM::M1, "XMapPlaneIndices" }, { 0x0073, 0x0032, 0, VR::OW, VM::M1, "YMapPlaneIndices" }, { 0x0073, 0x0040, 0, VR::DS, VM::M1, "CentralProjectionDetectorSecondaryAngle" }, { 0x0073, 0x0050, 0, VR::DS, VM::M2, "DetectorActiveDimensions" }, }; const unsigned short Dict054TagHashTable[] = { 8, 11, 14, 17, 20, 23, 26, 0, 1, 6, 80, 1, 4, 50, 1, 5, 64, 1, 2, 48, 1, 3, 49, 1, 0, 32, 1, 1, 33, }; const unsigned short Dict054KeyHashTable[] = { 8, 11, 14, 7, 7, 21, 7, 0, 1, 3, 31206, 1, 4, 60678, 3, 0, 30499, 1, 9575, 2, 45711, 2, 5, 5337, 6, 31353, }; vtkDICOMDictionary::Dict Dict054Data = { "GEMS_IDI_01", 7, 7, Dict054TagHashTable, Dict054KeyHashTable, Dict054Contents }; // ----- PMOD_GENPET ----- const DictEntry Dict055Contents[] = { { 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "SlicesNames" }, { 0x7fe1, 0x0002, 0, VR::UT, VM::M1, "GeneCodes" }, { 0x7fe1, 0x0003, 0, VR::UT, VM::M1, "GeneLabels" }, }; const unsigned short Dict055TagHashTable[] = { 3, 4, 9, 0, 2, 0, 1, 1, 2, 1, 2, 3, }; const unsigned short Dict055KeyHashTable[] = { 4, 7, 3, 0, 1, 1, 21830, 2, 0, 47785, 2, 42962, }; vtkDICOMDictionary::Dict Dict055Data = { "PMOD_GENPET", 3, 3, Dict055TagHashTable, Dict055KeyHashTable, Dict055Contents }; // ----- SHS MagicView 300 ----- const DictEntry Dict056Contents[] = { { 0x0029, 0x0002, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0003, 0, VR::FD, VM::M1, "" }, }; const unsigned short Dict056TagHashTable[] = { 3, 6, 0, 1, 1, 3, 1, 0, 2, }; const unsigned short Dict056KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict056Data = { "SHS MagicView 300", 2, 2, Dict056TagHashTable, Dict056KeyHashTable, Dict056Contents }; // ----- INTELERAD MEDICAL SYSTEMS INTELEVIEWER ----- const DictEntry Dict057Contents[] = { { 0x0071, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0071, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0071, 0x0003, 0, VR::UN, VM::M1, "" }, { 0x0071, 0x0004, 0, VR::UN, VM::M1, "" }, { 0x0071, 0x0005, 0, VR::UN, VM::M1, "" }, { 0x0071, 0x0006, 0, VR::UN, VM::M1, "" }, { 0x0071, 0x0007, 0, VR::UN, VM::M1, "" }, { 0x0071, 0x000A, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict057TagHashTable[] = { 8, 9, 12, 17, 20, 23, 26, 29, 0, 1, 0, 1, 2, 1, 2, 7, 10, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5, 6, 1, 6, 7, }; const unsigned short Dict057KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict057Data = { "INTELERAD MEDICAL SYSTEMS INTELEVIEWER", 8, 8, Dict057TagHashTable, Dict057KeyHashTable, Dict057Contents }; // ----- SIEMENS IKM CKS CXRCAD FINDINGS ----- const DictEntry Dict058Contents[] = { { 0x0029, 0x0001, 0, VR::UT, VM::M1, "" }, }; const unsigned short Dict058TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict058KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict058Data = { "SIEMENS IKM CKS CXRCAD FINDINGS", 1, 1, Dict058TagHashTable, Dict058KeyHashTable, Dict058Contents }; // ----- SIEMENS NUMARIS II ----- const DictEntry Dict059Contents[] = { { 0x7fe3, 0x0000, 0, VR::LO, VM::M1, "ImageGraphicsFormatCode" }, { 0x7fe3, 0x0010, 0, VR::OB, VM::M1, "ImageGraphics" }, { 0x7fe3, 0x0020, 0, VR::OB, VM::M1, "ImageGraphicsDummy" }, }; const unsigned short Dict059TagHashTable[] = { 4, 9, 3, 0, 2, 1, 16, 2, 32, 1, 0, 0, }; const unsigned short Dict059KeyHashTable[] = { 4, 7, 3, 0, 1, 2, 53079, 2, 0, 55636, 1, 54408, }; vtkDICOMDictionary::Dict Dict059Data = { "SIEMENS NUMARIS II", 3, 3, Dict059TagHashTable, Dict059KeyHashTable, Dict059Contents }; // ----- REPORT_FROM_APP ----- const DictEntry Dict060Contents[] = { { 0x0039, 0x0095, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict060TagHashTable[] = { 2, 0, 1, 0, 149, }; const unsigned short Dict060KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict060Data = { "REPORT_FROM_APP", 1, 1, Dict060TagHashTable, Dict060KeyHashTable, Dict060Contents }; // ----- KINETDX ----- const DictEntry Dict061Contents[] = { { 0x0021, 0x00a5, 0, VR::US, VM::M1, "" }, { 0x0021, 0x00a6, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x00a8, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x00aa, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x00ab, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x00ac, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x00b4, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict061TagHashTable[] = { 8, 11, 7, 14, 19, 7, 24, 0, 1, 1, 166, 1, 0, 165, 2, 4, 171, 5, 172, 2, 3, 170, 6, 180, 1, 2, 168, }; const unsigned short Dict061KeyHashTable[] = { 7, 7, 7, 7, 7, 8, 7, 0, 7, 0, 768, 1, 768, 2, 768, 3, 768, 4, 768, 5, 768, 6, 768, }; vtkDICOMDictionary::Dict Dict061Data = { "KINETDX", 7, 7, Dict061TagHashTable, Dict061KeyHashTable, Dict061Contents }; // ----- SIEMENS SYNGO WORKFLOW ----- const DictEntry Dict062Contents[] = { { 0x0031, 0x0010, 0, VR::UI, VM::M1, "InternalPatientUID" }, { 0x0031, 0x0011, 0, VR::SH, VM::M1, "PatientsDeathIndicator" }, { 0x0031, 0x0012, 0, VR::DA, VM::M1, "PatientsDeathDate" }, { 0x0031, 0x0013, 0, VR::TM, VM::M1, "PatientsDeathTime" }, { 0x0031, 0x0014, 0, VR::SH, VM::M1, "VIPIndicator" }, { 0x0031, 0x0015, 0, VR::US, VM::M1, "EmergencyFlag" }, { 0x0031, 0x0020, 0, VR::SH, VM::M1, "InternalVisitUID" }, { 0x0031, 0x0025, 0, VR::SH, VM::M1, "InternalISRUID" }, { 0x0031, 0x0032, 0, VR::SH, VM::M1, "ControlState" }, { 0x0031, 0x0034, 0, VR::US, VM::M1, "LocalFlag" }, { 0x0031, 0x0036, 0, VR::UI, VM::M1TN, "ReferencedStudies" }, { 0x0031, 0x0040, 0, VR::LO, VM::M1, "WorkflowID" }, { 0x0031, 0x0041, 0, VR::LO, VM::M1, "WorkflowDescription" }, { 0x0031, 0x0042, 0, VR::LO, VM::M1, "WorkflowControlState" }, { 0x0031, 0x0043, 0, VR::US, VM::M1, "WorkflowAdHocFlag" }, { 0x0031, 0x0044, 0, VR::US, VM::M1, "HybridFlag" }, { 0x0031, 0x0050, 0, VR::LO, VM::M1, "WorkitemID" }, { 0x0031, 0x0051, 0, VR::LO, VM::M1, "WorkitemName" }, { 0x0031, 0x0052, 0, VR::LO, VM::M1, "WorkitemType" }, { 0x0031, 0x0053, 0, VR::LO, VM::M1TN, "WorkitemRoles" }, { 0x0031, 0x0054, 0, VR::LO, VM::M1, "WorkitemDescription" }, { 0x0031, 0x0055, 0, VR::LO, VM::M1, "WorkitemControlState" }, { 0x0031, 0x0056, 0, VR::LO, VM::M1, "ClaimingUser" }, { 0x0031, 0x0057, 0, VR::LO, VM::M1, "ClaimingHost" }, { 0x0031, 0x0058, 0, VR::LO, VM::M1, "TaskflowID" }, { 0x0031, 0x0059, 0, VR::LO, VM::M1, "TaskflowName" }, { 0x0031, 0x005A, 0, VR::US, VM::M1, "FailedFlag" }, { 0x0031, 0x005B, 0, VR::DT, VM::M1, "ScheduledTime" }, { 0x0031, 0x005C, 0, VR::US, VM::M1, "WorkitemAdHocFlag" }, { 0x0031, 0x005D, 0, VR::US, VM::M1, "PatientUpdatePendingFlag" }, { 0x0031, 0x005E, 0, VR::US, VM::M1, "PatientMixupFlag" }, { 0x0031, 0x0060, 0, VR::LO, VM::M1, "ClientID" }, { 0x0031, 0x0061, 0, VR::LO, VM::M1, "TemplateID" }, { 0x0031, 0x0081, 0, VR::LO, VM::M1, "InstitutionName" }, { 0x0031, 0x0082, 0, VR::ST, VM::M1, "InstitutionAddress" }, { 0x0031, 0x0083, 0, VR::SQ, VM::M1, "InstitutionCodeSequence" }, }; const unsigned short Dict062TagHashTable[] = { 37, 42, 47, 50, 53, 56, 61, 64, 69, 74, 36, 36, 36, 36, 36, 36, 36, 77, 36, 36, 80, 36, 36, 36, 83, 86, 89, 92, 95, 98, 101, 104, 107, 114, 121, 128, 0, 2, 5, 21, 28, 92, 2, 4, 20, 29, 93, 1, 30, 94, 1, 8, 50, 1, 11, 64, 2, 9, 52, 12, 65, 1, 13, 66, 2, 10, 54, 14, 67, 2, 15, 68, 31, 96, 1, 32, 97, 1, 6, 32, 1, 7, 37, 1, 16, 80, 1, 17, 81, 1, 18, 82, 1, 19, 83, 1, 20, 84, 1, 21, 85, 1, 22, 86, 1, 23, 87, 3, 1, 17, 24, 88, 35, 131, 3, 0, 16, 25, 89, 34, 130, 3, 3, 19, 26, 90, 33, 129, 2, 2, 18, 27, 91, }; const unsigned short Dict062KeyHashTable[] = { 37, 40, 36, 45, 36, 48, 36, 55, 60, 63, 36, 66, 69, 36, 36, 36, 72, 75, 36, 78, 81, 86, 91, 36, 94, 99, 102, 36, 109, 36, 112, 36, 115, 118, 127, 130, 0, 1, 16, 37105, 2, 14, 58358, 15, 62104, 1, 20, 59830, 3, 2, 7771, 10, 47213, 21, 29829, 2, 6, 4083, 23, 42368, 1, 17, 43140, 1, 11, 61513, 1, 8, 61655, 1, 29, 36068, 1, 12, 8733, 1, 18, 49858, 1, 30, 39533, 2, 22, 55453, 33, 4647, 2, 24, 39578, 31, 49607, 1, 9, 32493, 2, 1, 40854, 28, 20638, 1, 27, 50875, 3, 3, 23978, 5, 45281, 32, 40133, 1, 19, 62016, 1, 13, 54857, 1, 26, 60345, 4, 0, 58982, 4, 19876, 25, 35332, 34, 5069, 1, 7, 50492, 1, 35, 44232, }; vtkDICOMDictionary::Dict Dict062Data = { "SIEMENS SYNGO WORKFLOW", 36, 36, Dict062TagHashTable, Dict062KeyHashTable, Dict062Contents }; // ----- INTELERAD MEDICAL SYSTEMS ----- const DictEntry Dict063Contents[] = { { 0x0029, 0x0001, 0, VR::FD, VM::M1, "ImageCompressionFraction" }, { 0x0029, 0x0002, 0, VR::FD, VM::M1, "ImageQuality" }, { 0x0029, 0x0003, 0, VR::FD, VM::M1, "ImageBytesTransferred" }, { 0x0029, 0x0010, 0, VR::CS, VM::M1, "J2cParameterType" }, { 0x0029, 0x0011, 0, VR::US, VM::M1, "J2cPixelRepresentation" }, { 0x0029, 0x0012, 0, VR::US, VM::M1, "J2cBitsAllocated" }, { 0x0029, 0x0013, 0, VR::US, VM::M1, "J2cPixelShiftValue" }, { 0x0029, 0x0014, 0, VR::US, VM::M1, "J2cPlanarConfiguration" }, { 0x0029, 0x0015, 0, VR::DS, VM::M1, "J2cRescaleIntercept" }, { 0x0029, 0x0016, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0017, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" }, { 0x0029, 0x0021, 0, VR::US, VM::M1, "HistogramPercentileLabels" }, { 0x0029, 0x0022, 0, VR::US, VM::M1, "HistogramPercentileValues" }, { 0x3F01, 0x0001, 0, VR::LO, VM::M1, "InstitutionCode" }, { 0x3F01, 0x0002, 0, VR::AE, VM::M1, "RoutedTransferAE" }, { 0x3F01, 0x0003, 0, VR::AE, VM::M1, "SourcedAE" }, { 0x3F01, 0x0004, 0, VR::SH, VM::M1, "DeferredValidation" }, { 0x3F01, 0x0005, 0, VR::LO, VM::M1, "SeriesOwner" }, { 0x3F01, 0x0006, 0, VR::LO, VM::M1, "OrderGroupNumber" }, { 0x3F01, 0x0007, 0, VR::SH, VM::M1, "StrippedPixelData" }, { 0x3F01, 0x0008, 0, VR::SH, VM::M1, "PendingMoveRequest" }, { 0x3F01, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x3F01, 0x000A, 0, VR::DA, VM::M1, "" }, { 0x3F01, 0x000B, 0, VR::TM, VM::M1, "" }, { 0x3F03, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x3F03, 0x0002, 0, VR::DT, VM::M1, "" }, { 0x3F03, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x3F03, 0x0004, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict063TagHashTable[] = { 30, 33, 36, 39, 42, 45, 29, 29, 48, 51, 29, 54, 29, 59, 62, 29, 65, 68, 71, 74, 77, 80, 83, 86, 91, 96, 99, 104, 109, 0, 1, 6, 19, 1, 5, 18, 1, 8, 21, 1, 7, 20, 1, 10, 23, 1, 9, 22, 1, 12, 33, 1, 11, 32, 2, 0, 1, 13, 34, 1, 2, 3, 1, 1, 2, 1, 22, 9, 1, 21, 8, 1, 24, 11, 1, 23, 10, 1, 18, 5, 1, 17, 4, 1, 20, 7, 2, 19, 6, 28, 4, 2, 14, 1, 27, 3, 1, 26, 2, 2, 16, 3, 25, 1, 2, 4, 17, 15, 2, 1, 3, 16, }; const unsigned short Dict063KeyHashTable[] = { 30, 29, 29, 29, 29, 29, 33, 38, 29, 29, 41, 29, 46, 51, 29, 54, 59, 80, 29, 29, 29, 87, 29, 29, 29, 92, 95, 29, 98, 0, 1, 2, 63131, 2, 8, 42439, 20, 58686, 1, 7, 40943, 2, 4, 16955, 19, 49041, 2, 5, 28559, 11, 7178, 1, 16, 60783, 2, 6, 62938, 14, 26551, 10, 9, 185, 10, 185, 12, 725, 22, 185, 23, 185, 24, 185, 25, 185, 26, 185, 27, 185, 28, 185, 3, 0, 7051, 13, 8257, 21, 61741, 2, 1, 11564, 18, 14366, 1, 3, 33734, 1, 15, 14781, 1, 17, 57305, }; vtkDICOMDictionary::Dict Dict063Data = { "INTELERAD MEDICAL SYSTEMS", 29, 29, Dict063TagHashTable, Dict063KeyHashTable, Dict063Contents }; // ----- DVMInsight Receiver Tracking ----- const DictEntry Dict064Contents[] = { { 0x5AB3, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0004, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0014, 0, VR::LO, VM::M1, "" }, { 0x5AB3, 0x0016, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict064TagHashTable[] = { 10, 9, 15, 9, 20, 23, 26, 29, 9, 0, 2, 2, 4, 6, 18, 2, 3, 6, 7, 20, 1, 8, 22, 1, 0, 0, 1, 4, 8, 2, 1, 2, 5, 16, }; const unsigned short Dict064KeyHashTable[] = { 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 9, 0, 597, 1, 597, 2, 597, 3, 597, 4, 597, 5, 597, 6, 597, 7, 597, 8, 597, }; vtkDICOMDictionary::Dict Dict064Data = { "DVMInsight Receiver Tracking", 9, 9, Dict064TagHashTable, Dict064KeyHashTable, Dict064Contents }; // ----- SIEMENS SYNGO FUNCTION ASSIGNMENT ----- const DictEntry Dict065Contents[] = { { 0x0029, 0x0001, 0, VR::LO, VM::M1, "DataReference" }, }; const unsigned short Dict065TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict065KeyHashTable[] = { 2, 0, 1, 0, 62574, }; vtkDICOMDictionary::Dict Dict065Data = { "SIEMENS SYNGO FUNCTION ASSIGNMENT", 1, 1, Dict065TagHashTable, Dict065KeyHashTable, Dict065Contents }; // ----- FFP DATA ----- const DictEntry Dict066Contents[] = { { 0x0009, 0x0001, 0, VR::UN, VM::M1, "CRHeaderInformation" }, }; const unsigned short Dict066TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict066KeyHashTable[] = { 2, 0, 1, 0, 60169, }; vtkDICOMDictionary::Dict Dict066Data = { "FFP DATA", 1, 1, Dict066TagHashTable, Dict066KeyHashTable, Dict066Contents }; // ----- astm.org/diconde/iod/ComponentStudy ----- const DictEntry Dict067Contents[] = { { 0x0009, 0x0020, 0, VR::DA, VM::M1, "ExpiryDate" }, }; const unsigned short Dict067TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict067KeyHashTable[] = { 2, 0, 1, 0, 42404, }; vtkDICOMDictionary::Dict Dict067Data = { "astm.org/diconde/iod/ComponentStudy", 1, 1, Dict067TagHashTable, Dict067KeyHashTable, Dict067Contents }; // ----- SIEMENS SYNGO INDEX SERVICE ----- const DictEntry Dict068Contents[] = { { 0x0009, 0x0020, 0, VR::DA, VM::M1, "ObjectInsertionDate" }, { 0x0009, 0x0030, 0, VR::SQ, VM::M1, "InstanceObjectStates" }, { 0x0009, 0x0031, 0, VR::SQ, VM::M1, "SeriesObjectStates" }, { 0x0009, 0x0040, 0, VR::DT, VM::M1, "LastAccessTime" }, { 0x0009, 0x0041, 0, VR::CS, VM::M1, "DeleteProtectedStatus" }, { 0x0009, 0x0042, 0, VR::CS, VM::M1, "ReceivedfromArchiveStatus" }, { 0x0009, 0x0043, 0, VR::CS, VM::M1, "ArchiveStatus" }, { 0x0009, 0x0044, 0, VR::AE, VM::M1, "Location" }, { 0x0009, 0x0045, 0, VR::CS, VM::M1, "LogicalDeletedStatus" }, { 0x0009, 0x0046, 0, VR::DT, VM::M1, "InsertTime" }, { 0x0009, 0x0047, 0, VR::IS, VM::M1, "VisibleInstancesonSeriesLevel" }, { 0x0009, 0x0048, 0, VR::IS, VM::M1, "UnarchivedInstances" }, { 0x0009, 0x0049, 0, VR::IS, VM::M1, "VisibleInstancesonStudyLevel" }, { 0x0009, 0x0050, 0, VR::CS, VM::M1, "HiddenInstance" }, { 0x0009, 0x00A0, 0, VR::LO, VM::M1, "SenderSystemDeviceName" }, }; const unsigned short Dict068TagHashTable[] = { 16, 19, 22, 25, 28, 33, 36, 15, 15, 15, 15, 39, 44, 49, 54, 0, 1, 6, 67, 1, 7, 68, 1, 8, 69, 1, 9, 70, 2, 10, 71, 11, 72, 1, 12, 73, 1, 14, 160, 2, 0, 32, 2, 49, 2, 1, 48, 3, 64, 2, 4, 65, 13, 80, 1, 5, 66, }; const unsigned short Dict068KeyHashTable[] = { 16, 19, 15, 22, 25, 30, 15, 33, 40, 43, 15, 15, 48, 51, 54, 0, 1, 4, 16890, 1, 6, 23062, 1, 7, 18517, 2, 3, 42506, 12, 15723, 1, 10, 57226, 3, 2, 15852, 11, 24801, 13, 49841, 1, 14, 36268, 2, 1, 9188, 5, 53811, 1, 0, 56295, 1, 8, 35058, 1, 9, 63221, }; vtkDICOMDictionary::Dict Dict068Data = { "SIEMENS SYNGO INDEX SERVICE", 15, 15, Dict068TagHashTable, Dict068KeyHashTable, Dict068Contents }; // ----- http://www.gemedicalsystems.com/it_solutions/rad_pacs/ ----- const DictEntry Dict069Contents[] = { { 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" }, { 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" }, { 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" }, }; const unsigned short Dict069TagHashTable[] = { 3, 4, 7, 0, 1, 2, 3, 2, 0, 1, 1, 2, }; const unsigned short Dict069KeyHashTable[] = { 4, 3, 7, 0, 1, 1, 9387, 2, 0, 55847, 2, 3144, }; vtkDICOMDictionary::Dict Dict069Data = { "http://www.gemedicalsystems.com/it_solutions/rad_pacs/", 3, 3, Dict069TagHashTable, Dict069KeyHashTable, Dict069Contents }; // ----- SIEMENS CT APPL TMP DATAMODEL ----- const DictEntry Dict070Contents[] = { { 0x0029, 0x0000, 0, VR::OB, VM::M1, "CTTaskCommonDataModel" }, }; const unsigned short Dict070TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict070KeyHashTable[] = { 2, 0, 1, 0, 20131, }; vtkDICOMDictionary::Dict Dict070Data = { "SIEMENS CT APPL TMP DATAMODEL", 1, 1, Dict070TagHashTable, Dict070KeyHashTable, Dict070Contents }; // ----- CTP ----- const DictEntry Dict071Contents[] = { { 0x0013, 0x0010, 0, VR::LO, VM::M1, "ProjectName" }, { 0x0013, 0x0011, 0, VR::LO, VM::M1, "TrialName" }, { 0x0013, 0x0012, 0, VR::LO, VM::M1, "SiteName" }, { 0x0013, 0x0013, 0, VR::LO, VM::M1, "SiteID" }, { 0x0013, 0x0050, 0, VR::LO, VM::M1, "StudyYear" }, }; const unsigned short Dict071TagHashTable[] = { 6, 9, 14, 17, 5, 0, 1, 3, 19, 2, 2, 18, 4, 80, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict071KeyHashTable[] = { 5, 6, 9, 12, 5, 0, 1, 1, 45997, 1, 2, 35973, 3, 0, 57906, 3, 59860, 4, 57564, }; vtkDICOMDictionary::Dict Dict071Data = { "CTP", 5, 5, Dict071TagHashTable, Dict071KeyHashTable, Dict071Contents }; // ----- PixelMed Publishing ----- const DictEntry Dict072Contents[] = { { 0x0011, 0x0002, 0, VR::UC, VM::M1, "StrainDescription" }, { 0x0011, 0x0003, 0, VR::LO, VM::M1, "StrainNomenclature" }, { 0x0011, 0x0004, 0, VR::LO, VM::M1, "StrainStockNumber" }, { 0x0011, 0x0005, 0, VR::SQ, VM::M1, "StrainSourceRegistryCodeSequence" }, { 0x0011, 0x0006, 0, VR::SQ, VM::M1, "StrainStockSequence" }, { 0x0011, 0x0007, 0, VR::LO, VM::M1, "StrainSource" }, { 0x0011, 0x0008, 0, VR::UT, VM::M1, "StrainAdditionalInformation" }, { 0x0011, 0x0020, 0, VR::SQ, VM::M1, "StrainCodeSequence" }, { 0x0011, 0x0050, 0, VR::LO, VM::M1, "CellLineDesignation" }, { 0x0011, 0x0051, 0, VR::SQ, VM::M1, "CellLineTissueOfOriginCodeSequence" }, { 0x0011, 0x0052, 0, VR::SQ, VM::M1, "CellLineHistologicTypeCodeSequence" }, { 0x0011, 0x0053, 0, VR::SQ, VM::M1, "CellLineSpeciesOfOriginCodeSequence" }, { 0x0011, 0x0054, 0, VR::UL, VM::M1, "CellLineNumberOfPassages" }, { 0x0011, 0x0071, 0, VR::SQ, VM::M1, "SourcePatientGroupIdentificationSequence" }, { 0x0011, 0x0072, 0, VR::SQ, VM::M1, "GroupOfPatientsIdentificationSequence" }, { 0x0011, 0x0073, 0, VR::US, VM::M3, "SubjectRelativePositionInImage" }, { 0x0021, 0x0001, 0, VR::SQ, VM::M1, "UnassignedSharedConvertedAttributesSequence" }, { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "UnassignedPerFrameConvertedAttributesSequence" }, { 0x0021, 0x0003, 0, VR::SQ, VM::M1, "ConversionSourceAttributesSequence" }, { 0x0041, 0x0001, 0, VR::SQ, VM::M1, "QuantityDefinitionCodeSequence" }, { 0x7FE1, 0x0001, 0, VR::OF, VM::M1, "FloatPixelData" }, { 0x7FE1, 0x0002, 0, VR::OD, VM::M1, "DoublePixelData" }, }; const unsigned short Dict072TagHashTable[] = { 23, 28, 33, 36, 22, 39, 22, 22, 22, 42, 45, 52, 55, 58, 22, 22, 22, 22, 63, 66, 69, 74, 0, 2, 5, 7, 10, 82, 2, 4, 6, 11, 83, 1, 12, 84, 1, 6, 8, 1, 7, 32, 1, 13, 113, 3, 14, 114, 16, 1, 21, 2, 1, 15, 115, 1, 18, 3, 2, 17, 2, 20, 1, 1, 1, 3, 1, 0, 2, 2, 3, 5, 8, 80, 3, 2, 4, 9, 81, 19, 1, }; const unsigned short Dict072KeyHashTable[] = { 22, 22, 22, 22, 23, 26, 31, 36, 22, 22, 41, 22, 44, 22, 47, 22, 50, 57, 66, 69, 72, 77, 0, 1, 21, 7700, 2, 9, 47329, 19, 14186, 2, 7, 7942, 8, 31690, 2, 1, 54810, 4, 50578, 1, 11, 49408, 1, 12, 465, 1, 10, 63999, 3, 3, 31670, 14, 30227, 15, 48984, 4, 2, 11371, 5, 8753, 6, 36390, 13, 21999, 1, 17, 1200, 1, 20, 18182, 2, 0, 44345, 18, 716, 1, 16, 7011, }; vtkDICOMDictionary::Dict Dict072Data = { "PixelMed Publishing", 22, 22, Dict072TagHashTable, Dict072KeyHashTable, Dict072Contents }; // ----- POLYTRON-SMS 2.5 ----- const DictEntry Dict073Contents[] = { { 0x0009, 0x0002, 0, VR::OB, VM::M1, "" }, { 0x0009, 0x0004, 0, VR::OB, VM::M1, "" }, { 0x0009, 0x0006, 0, VR::OB, VM::M1, "" }, { 0x0089, 0x0010, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict073TagHashTable[] = { 4, 5, 4, 8, 0, 1, 1, 4, 3, 0, 2, 2, 6, 3, 16, }; const unsigned short Dict073KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict073Data = { "POLYTRON-SMS 2.5", 4, 4, Dict073TagHashTable, Dict073KeyHashTable, Dict073Contents }; // ----- Philips Imaging DD 129 ----- const DictEntry Dict074Contents[] = { { 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" }, { 0x2001, 0x0001, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict074TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict074KeyHashTable[] = { 2, 3, 0, 2, 0, 11901, 1, 2690, }; vtkDICOMDictionary::Dict Dict074Data = { "Philips Imaging DD 129", 2, 2, Dict074TagHashTable, Dict074KeyHashTable, Dict074Contents }; // ----- Philips Imaging DD 124 ----- const DictEntry Dict075Contents[] = { { 0x1001, 0x0003, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict075TagHashTable[] = { 2, 0, 1, 0, 3, }; const unsigned short Dict075KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict075Data = { "Philips Imaging DD 124", 1, 1, Dict075TagHashTable, Dict075KeyHashTable, Dict075Contents }; // ----- PMS-THORA-5.1 ----- const DictEntry Dict076Contents[] = { { 0x0089, 0x0020, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict076TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict076KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict076Data = { "PMS-THORA-5.1", 1, 1, Dict076TagHashTable, Dict076KeyHashTable, Dict076Contents }; // ----- SIEMENS MED SMS USG S2000 ----- const DictEntry Dict077Contents[] = { { 0x0019, 0x0000, 0, VR::SH, VM::M1, "PrivateCreatorVersion" }, { 0x0019, 0x0003, 0, VR::FD, VM::M1, "FrameRate" }, { 0x0019, 0x000C, 0, VR::US, VM::M1, "BurnedInGraphics" }, { 0x0019, 0x000D, 0, VR::SH, VM::M1, "SieClearIndex" }, { 0x0019, 0x000E, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::SH, VM::M1, "BModeSubmode" }, { 0x0019, 0x0021, 0, VR::FD, VM::M1, "BModeDynamicRange" }, { 0x0019, 0x0022, 0, VR::FD, VM::M1, "BModeOverallGain" }, { 0x0019, 0x0023, 0, VR::US, VM::M1, "BModeResolutionSpeedIndex" }, { 0x0019, 0x0024, 0, VR::US, VM::M1, "BModeEdgeEnhanceIndex" }, { 0x0019, 0x0025, 0, VR::US, VM::M1, "BModePersistenceIndex" }, { 0x0019, 0x0026, 0, VR::US, VM::M1, "BModeMapIndex" }, { 0x0019, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002A, 0, VR::US, VM::M1, "BModeTintType" }, { 0x0019, 0x002D, 0, VR::US, VM::M1, "BModeTintIndex" }, { 0x0019, 0x002E, 0, VR::SH, VM::M1, "ClarifyVEIndex" }, { 0x0019, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003A, 0, VR::US, VM::M1, "ImageFlag" }, { 0x0019, 0x003B, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::SH, VM::M1, "ColorFlowState" }, { 0x0019, 0x0041, 0, VR::US, VM::M1, "ColorFlowWallFilterIndex" }, { 0x0019, 0x0042, 0, VR::SH, VM::M1, "ColorFlowSubmode" }, { 0x0019, 0x0043, 0, VR::FD, VM::M1, "ColorFlowOverallGain" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "ColorFlowResolutionSpeedIndex" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "ColorFlowSmoothIndex" }, { 0x0019, 0x0047, 0, VR::US, VM::M1, "ColorFlowPersistenceIndex" }, { 0x0019, 0x0048, 0, VR::US, VM::M1, "ColorFlowMapIndex" }, { 0x0019, 0x0049, 0, VR::US, VM::M1, "ColorFlowPriorityIndex" }, { 0x0019, 0x0054, 0, VR::FD, VM::M1, "ColorFlowMaximumVelocity" }, { 0x0019, 0x0060, 0, VR::FD, VM::M1, "DopplerDynamicRange" }, { 0x0019, 0x0061, 0, VR::FD, VM::M1, "DopplerOverallGain" }, { 0x0019, 0x0062, 0, VR::FD, VM::M1, "DopplerWallFilter" }, { 0x0019, 0x0063, 0, VR::FD, VM::M1, "DopplerGateSize" }, { 0x0019, 0x0065, 0, VR::US, VM::M1, "DopplerMapIndex" }, { 0x0019, 0x0066, 0, VR::SH, VM::M1, "DopplerSubmode" }, { 0x0019, 0x0067, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::US, VM::M1, "DopplerTimeFreqResIndex" }, { 0x0019, 0x006A, 0, VR::US, VM::M1, "DopplerTraceInverted" }, { 0x0019, 0x006C, 0, VR::US, VM::M1, "DopplerTintType" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "DopplerTintIndex" }, { 0x0019, 0x0080, 0, VR::US, VM::M1, "MModeDynamicRange" }, { 0x0019, 0x0081, 0, VR::US, VM::M1, "MModeOverallGain" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "MModeEdgeEnhanceIndex" }, { 0x0019, 0x0083, 0, VR::US, VM::M1, "MModeMapIndex" }, { 0x0019, 0x0086, 0, VR::US, VM::M1, "MModeTintType" }, { 0x0019, 0x0087, 0, VR::SH, VM::M1, "MModeSubmode" }, { 0x0019, 0x0088, 0, VR::US, VM::M1, "MModeTintIndex" }, { 0x0019, 0x0095, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict077TagHashTable[] = { 52, 57, 62, 65, 68, 75, 78, 81, 84, 87, 90, 93, 98, 51, 103, 51, 51, 51, 106, 109, 112, 117, 51, 122, 127, 130, 137, 51, 51, 140, 143, 51, 51, 51, 146, 149, 51, 152, 155, 158, 161, 168, 51, 173, 176, 179, 51, 51, 182, 185, 188, 0, 2, 15, 42, 45, 130, 2, 16, 45, 44, 129, 1, 43, 128, 1, 48, 135, 3, 17, 46, 42, 114, 47, 134, 1, 6, 33, 1, 5, 32, 1, 8, 35, 1, 7, 34, 1, 10, 37, 1, 9, 36, 2, 12, 39, 39, 105, 2, 11, 38, 40, 106, 1, 41, 108, 1, 32, 96, 1, 33, 97, 2, 3, 13, 34, 98, 2, 2, 12, 35, 99, 2, 4, 14, 36, 101, 1, 37, 102, 3, 0, 0, 31, 84, 38, 103, 1, 1, 3, 1, 29, 72, 1, 30, 73, 1, 21, 59, 1, 20, 58, 1, 22, 64, 1, 23, 65, 1, 24, 66, 3, 19, 49, 25, 67, 50, 149, 2, 18, 48, 26, 68, 1, 27, 70, 1, 28, 71, 1, 49, 136, 1, 14, 41, 1, 13, 40, 1, 46, 131, }; const unsigned short Dict077KeyHashTable[] = { 51, 51, 51, 51, 52, 55, 51, 58, 63, 51, 68, 73, 78, 81, 84, 89, 51, 92, 97, 51, 102, 105, 108, 51, 51, 113, 116, 51, 51, 137, 142, 51, 149, 152, 51, 51, 155, 51, 158, 51, 163, 51, 51, 166, 169, 176, 51, 179, 51, 51, 51, 0, 1, 34, 52127, 1, 30, 3275, 2, 31, 21750, 40, 30412, 2, 5, 15073, 10, 60635, 2, 11, 8456, 39, 57808, 2, 1, 15243, 49, 30385, 1, 2, 43419, 1, 36, 63276, 2, 0, 14104, 3, 19277, 1, 42, 11537, 2, 7, 55413, 25, 36453, 2, 15, 7961, 17, 24048, 1, 45, 27830, 1, 41, 62781, 2, 6, 54904, 46, 39821, 1, 8, 14864, 10, 4, 105, 12, 105, 13, 105, 14, 105, 18, 105, 19, 105, 21, 105, 35, 2383, 38, 105, 50, 105, 2, 29, 31831, 43, 13412, 3, 22, 16645, 37, 25028, 47, 39326, 1, 26, 49443, 1, 9, 13998, 1, 16, 60613, 2, 20, 31700, 33, 11475, 1, 28, 31083, 1, 23, 64517, 3, 24, 11653, 44, 58789, 48, 2238, 1, 27, 39803, 1, 32, 40330, }; vtkDICOMDictionary::Dict Dict077Data = { "SIEMENS MED SMS USG S2000", 51, 51, Dict077TagHashTable, Dict077KeyHashTable, Dict077Contents }; // ----- SIEMENS MED OCS SS VERSION INFO ----- const DictEntry Dict078Contents[] = { { 0x0039, 0x0076, 0, VR::LO, VM::M1, "StructureSetPredecessor" }, }; const unsigned short Dict078TagHashTable[] = { 2, 0, 1, 0, 118, }; const unsigned short Dict078KeyHashTable[] = { 2, 0, 1, 0, 27329, }; vtkDICOMDictionary::Dict Dict078Data = { "SIEMENS MED OCS SS VERSION INFO", 1, 1, Dict078TagHashTable, Dict078KeyHashTable, Dict078Contents }; // ----- ELSCINT1 ----- const DictEntry Dict079Contents[] = { { 0x0003, 0x0001, 0, VR::OW, VM::M1, "OffsetListStructure" }, { 0x00E1, 0x0001, 0, VR::US, VM::M1, "DataDictionaryVersion" }, { 0x00E1, 0x0005, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x0006, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x0007, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x0014, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0018, 0, VR::OB, VM::M1, "" }, { 0x00E1, 0x0021, 0, VR::DS, VM::M1, "DLPTotal" }, { 0x00E1, 0x0022, 0, VR::DS, VM::M2, "PresentationRelativeCenter" }, { 0x00E1, 0x0023, 0, VR::DS, VM::M2, "PresentationRelativePart" }, { 0x00E1, 0x0024, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0025, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0030, 0, VR::UI, VM::M1, "" }, { 0x00E1, 0x0031, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0032, 0, VR::US, VM::M2, "" }, { 0x00E1, 0x0037, 0, VR::DS, VM::M1, "TotalDoseSavings" }, { 0x00E1, 0x0039, 0, VR::SQ, VM::M1, "" }, { 0x00E1, 0x003E, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x003F, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0040, 0, VR::SH, VM::M1, "ImageLabel" }, { 0x00E1, 0x0041, 0, VR::DS, VM::M1, "" }, { 0x00E1, 0x0042, 0, VR::LO, VM::M1, "" }, { 0x00E1, 0x0043, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x0050, 0, VR::DS, VM::M1, "AcquisitionDuration" }, { 0x00E1, 0x0051, 0, VR::SH, VM::M1, "" }, { 0x00E1, 0x0060, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0061, 0, VR::LO, VM::M1, "ProtocolFileName" }, { 0x00E1, 0x0062, 0, VR::CS, VM::M1, "" }, { 0x00E1, 0x0063, 0, VR::SH, VM::M1, "PatientLanguage" }, { 0x00E1, 0x0065, 0, VR::LO, VM::M1, "" }, { 0x00E1, 0x006A, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x006B, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x00A0, 0, VR::LO, VM::M1, "" }, { 0x00E1, 0x00C2, 0, VR::UI, VM::M1, "" }, { 0x00E1, 0x00C4, 0, VR::DS, VM::M1, "" }, { 0x00E1, 0x00CF, 0, VR::IS, VM::M1, "" }, { 0x00E1, 0x00EB, 0, VR::US, VM::M1, "" }, { 0x00E1, 0x00EC, 0, VR::US, VM::M1, "" }, { 0x01E1, 0x0018, 0, VR::OB, VM::M1, "" }, { 0x01E1, 0x0021, 0, VR::ST, VM::M1, "" }, { 0x01E1, 0x0026, 0, VR::CS, VM::M1, "PhantomType" }, { 0x01E1, 0x0034, 0, VR::IS, VM::M1, "" }, { 0x01E1, 0x0040, 0, VR::UI, VM::M1, "" }, { 0x01E1, 0x0041, 0, VR::OW, VM::M1, "" }, { 0x01E1, 0x0055, 0, VR::SQ, VM::M1, "ReferenceSequence" }, { 0x01E1, 0x0056, 0, VR::CS, VM::M1, "ReferenceType" }, { 0x01E1, 0x0057, 0, VR::CS, VM::M1, "ReferenceLevel" }, { 0x01F1, 0x0001, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x01F1, 0x0002, 0, VR::CS, VM::M1, "FocalSpotResolution" }, { 0x01F1, 0x0003, 0, VR::CS, VM::M1, "ConcurrentSlicesGeneration" }, { 0x01F1, 0x0004, 0, VR::CS, VM::M1, "AngularSamplingDensity" }, { 0x01F1, 0x0005, 0, VR::DS, VM::M1, "ReconstructionArc" }, { 0x01F1, 0x0007, 0, VR::DS, VM::M1, "TableVelocity" }, { 0x01F1, 0x0008, 0, VR::DS, VM::M1, "AcquisitionLength" }, { 0x01F1, 0x000A, 0, VR::US, VM::M1, "EdgeEnhancementWeight" }, { 0x01F1, 0x000C, 0, VR::DS, VM::M1, "ScannerRelativeCenter" }, { 0x01F1, 0x000D, 0, VR::DS, VM::M1, "RotationAngle" }, { 0x01F1, 0x000E, 0, VR::FL, VM::M1, "" }, { 0x01F1, 0x0026, 0, VR::DS, VM::M1, "Pitch" }, { 0x01F1, 0x0027, 0, VR::DS, VM::M1, "RotationTime" }, { 0x01F1, 0x0028, 0, VR::DS, VM::M1, "TableIncrement" }, { 0x01F1, 0x0030, 0, VR::US, VM::M1, "" }, { 0x01F1, 0x0032, 0, VR::CS, VM::M1, "ImageViewConvention" }, { 0x01F1, 0x0033, 0, VR::DS, VM::M1, "CycleTime" }, { 0x01F1, 0x0036, 0, VR::CS, VM::M1, "" }, { 0x01F1, 0x0037, 0, VR::DS, VM::M1, "" }, { 0x01F1, 0x0038, 0, VR::LO, VM::M1, "" }, { 0x01F1, 0x0039, 0, VR::LO, VM::M1, "" }, { 0x01F1, 0x0040, 0, VR::CS, VM::M1, "" }, { 0x01F1, 0x0042, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x0043, 0, VR::LO, VM::M1, "" }, { 0x01F1, 0x0044, 0, VR::OW, VM::M1, "" }, { 0x01F1, 0x0045, 0, VR::IS, VM::M1, "" }, { 0x01F1, 0x0046, 0, VR::FL, VM::M1, "" }, { 0x01F1, 0x0047, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x0049, 0, VR::DS, VM::M1, "" }, { 0x01F1, 0x004A, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x004B, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x004C, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x004D, 0, VR::SH, VM::M1, "" }, { 0x01F1, 0x004E, 0, VR::LO, VM::M1, "" }, { 0x01F1, 0x004F, 0, VR::US, VM::M1, "DetectorsLayers" }, { 0x01F1, 0x0053, 0, VR::SH, VM::M1, "" }, { 0x01F3, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x01F3, 0x0002, 0, VR::SS, VM::M1, "" }, { 0x01F3, 0x0003, 0, VR::FL, VM::M2, "" }, { 0x01F3, 0x0004, 0, VR::FL, VM::M1, "" }, { 0x01F3, 0x0011, 0, VR::SQ, VM::M1, "" }, { 0x01F3, 0x0012, 0, VR::SS, VM::M1, "" }, { 0x01F3, 0x0013, 0, VR::FL, VM::M2, "" }, { 0x01F3, 0x0014, 0, VR::FL, VM::M1, "" }, { 0x01F3, 0x0015, 0, VR::US, VM::M1, "" }, { 0x01F3, 0x0016, 0, VR::FL, VM::M1, "" }, { 0x01F3, 0x0017, 0, VR::FL, VM::M1, "" }, { 0x01F3, 0x0018, 0, VR::SH, VM::M1, "" }, { 0x01F3, 0x0019, 0, VR::FL, VM::M1, "" }, { 0x01F3, 0x0023, 0, VR::US, VM::M1, "" }, { 0x01F3, 0x0024, 0, VR::IS, VM::M2, "" }, { 0x01F7, 0x0010, 0, VR::OB, VM::M1, "" }, { 0x01F7, 0x0011, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0013, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0014, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0015, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0016, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0017, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0018, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0019, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x001A, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x001B, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x001C, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x001E, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x001F, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0022, 0, VR::UI, VM::M1, "" }, { 0x01F7, 0x0023, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0025, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0026, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0027, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0028, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0029, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x002B, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x002C, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x002D, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x002E, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0030, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0031, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x005C, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0070, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0073, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0074, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x0075, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x007F, 0, VR::OW, VM::M1, "" }, { 0x01F7, 0x009B, 0, VR::IS, VM::M1, "iDoseLevel" }, { 0x01F7, 0x00CB, 0, VR::DS, VM::M1, "keV" }, { 0x01F7, 0x00CC, 0, VR::ST, VM::M1, "SBIVersion" }, { 0x01F7, 0x00CD, 0, VR::CS, VM::M1, "SCCTEquivalent" }, { 0x01F7, 0x00CE, 0, VR::LT, VM::M1, "ReferenceSBIType" }, { 0x01F7, 0x00D3, 0, VR::LT, VM::M1, "BurnedSpectralAnnotations" }, { 0x01F7, 0x00D4, 0, VR::SH, VM::M1, "HeadBody" }, { 0x01F7, 0x00D6, 0, VR::IS, VM::M1, "SpectralLevel" }, { 0x01F9, 0x0001, 0, VR::LO, VM::M1, "SPFilter" }, { 0x01F9, 0x0004, 0, VR::IS, VM::M1, "AdaptiveFilter" }, { 0x01F9, 0x0005, 0, VR::IS, VM::M1, "ReconIncrement" }, { 0x01F9, 0x0008, 0, VR::DS, VM::M1, "" }, { 0x01F9, 0x0009, 0, VR::DS, VM::M1, "" }, { 0x0601, 0x0000, 0, VR::SH, VM::M1, "ImplementationVersion" }, { 0x0601, 0x0020, 0, VR::DS, VM::M1, "RelativeTablePosition" }, { 0x0601, 0x0021, 0, VR::DS, VM::M1, "RelativeTableHeight" }, { 0x0601, 0x0030, 0, VR::SH, VM::M1, "SurviewDirection" }, { 0x0601, 0x0031, 0, VR::DS, VM::M1, "SurviewLength" }, { 0x0601, 0x0050, 0, VR::SH, VM::M1, "ImageViewType" }, { 0x0601, 0x0070, 0, VR::DS, VM::M1, "BatchNumber" }, { 0x0601, 0x0071, 0, VR::DS, VM::M1, "BatchSize" }, { 0x0601, 0x0072, 0, VR::DS, VM::M1, "BatchSliceNumber" }, { 0x07A1, 0x0002, 0, VR::UL, VM::M1, "" }, { 0x07A1, 0x0007, 0, VR::US, VM::M3, "" }, { 0x07A1, 0x0008, 0, VR::DS, VM::M1TN, "" }, { 0x07A1, 0x0009, 0, VR::OW, VM::M1, "" }, { 0x07A1, 0x000A, 0, VR::OB, VM::M1, "" }, { 0x07A1, 0x000C, 0, VR::US, VM::M1, "" }, { 0x07A1, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x07A1, 0x0011, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x0012, 0, VR::FL, VM::M1TN, "" }, { 0x07A1, 0x0013, 0, VR::UL, VM::M1, "" }, { 0x07A1, 0x0016, 0, VR::FL, VM::M1TN, "" }, { 0x07A1, 0x0018, 0, VR::SQ, VM::M1, "" }, { 0x07A1, 0x0019, 0, VR::FL, VM::M1, "" }, { 0x07A1, 0x001C, 0, VR::FL, VM::M1TN, "" }, { 0x07A1, 0x002A, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x002B, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x0036, 0, VR::AE, VM::M1, "" }, { 0x07A1, 0x003D, 0, VR::US, VM::M1, "" }, { 0x07A1, 0x0040, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x0042, 0, VR::SH, VM::M1, "" }, { 0x07A1, 0x0043, 0, VR::IS, VM::M1, "" }, { 0x07A1, 0x0045, 0, VR::LT, VM::M1, "" }, { 0x07A1, 0x0047, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x004A, 0, VR::SH, VM::M1, "" }, { 0x07A1, 0x0050, 0, VR::US, VM::M1, "" }, { 0x07A1, 0x0056, 0, VR::US, VM::M1, "" }, { 0x07A1, 0x0058, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x005D, 0, VR::DT, VM::M1, "" }, { 0x07A1, 0x005F, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x0070, 0, VR::SH, VM::M1, "" }, { 0x07A1, 0x0071, 0, VR::SH, VM::M1, "" }, { 0x07A1, 0x0075, 0, VR::LO, VM::M2, "" }, { 0x07A1, 0x0076, 0, VR::ST, VM::M1, "" }, { 0x07A1, 0x0085, 0, VR::UL, VM::M1, "" }, { 0x07A1, 0x0087, 0, VR::LT, VM::M1, "" }, { 0x07A1, 0x0088, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x008C, 0, VR::ST, VM::M1, "" }, { 0x07A1, 0x0094, 0, VR::ST, VM::M1, "" }, { 0x07A1, 0x0096, 0, VR::DA, VM::M1, "" }, { 0x07A1, 0x0097, 0, VR::SH, VM::M1, "" }, { 0x07A1, 0x0098, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x009F, 0, VR::CS, VM::M1, "" }, { 0x07A1, 0x00D0, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x0003, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x0005, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x0006, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x0009, 0, VR::IS, VM::M1, "" }, { 0x07A3, 0x0013, 0, VR::SH, VM::M1, "" }, { 0x07A3, 0x0014, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0015, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0017, 0, VR::SH, VM::M1, "" }, { 0x07A3, 0x001B, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x001F, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0022, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0023, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0034, 0, VR::SH, VM::M1, "" }, { 0x07A3, 0x0043, 0, VR::DS, VM::M1TN, "" }, { 0x07A3, 0x0055, 0, VR::SH, VM::M1, "" }, { 0x07A3, 0x005C, 0, VR::ST, VM::M1, "" }, { 0x07A3, 0x0061, 0, VR::LT, VM::M1, "" }, { 0x07A3, 0x0062, 0, VR::SQ, VM::M1, "" }, { 0x07A3, 0x0063, 0, VR::SQ, VM::M1, "" }, { 0x07A3, 0x0064, 0, VR::IS, VM::M1TN, "" }, { 0x07A3, 0x0065, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x0066, 0, VR::IS, VM::M1, "" }, { 0x07A3, 0x0080, 0, VR::SQ, VM::M1, "" }, { 0x07A3, 0x008F, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x0092, 0, VR::DS, VM::M1, "" }, { 0x07A3, 0x0093, 0, VR::DS, VM::M1, "" }, { 0x07A3, 0x0099, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x009C, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x009F, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00B9, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00BB, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00C0, 0, VR::SQ, VM::M1, "" }, { 0x07A3, 0x00C1, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00C2, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00C3, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00C4, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00C5, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00C8, 0, VR::AE, VM::M1, "" }, { 0x07A3, 0x00C9, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00CB, 0, VR::SQ, VM::M1, "" }, { 0x07A3, 0x00CC, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00E3, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00F2, 0, VR::CS, VM::M1, "" }, { 0x07A3, 0x00F5, 0, VR::LO, VM::M1, "" }, { 0x07A3, 0x00FA, 0, VR::DT, VM::M1, "" }, { 0x07A3, 0x00FB, 0, VR::DT, VM::M1, "" }, { 0x07A5, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x07A5, 0x0054, 0, VR::DT, VM::M1, "" }, { 0x07A5, 0x0056, 0, VR::CS, VM::M1, "" }, { 0x07A5, 0x0059, 0, VR::IS, VM::M1, "" }, { 0x07A5, 0x0062, 0, VR::LO, VM::M1, "" }, { 0x07A5, 0x0069, 0, VR::LO, VM::M1, "" }, { 0x07A5, 0x00AE, 0, VR::IS, VM::M1, "" }, { 0x07A5, 0x00C8, 0, VR::CS, VM::M1, "" }, { 0x5001, 0x0070, 0, VR::SQ, VM::M1, "" }, { 0x5001, 0x0071, 0, VR::SH, VM::M1, "" }, { 0x5001, 0x0080, 0, VR::SQ, VM::M1, "" }, { 0x5001, 0x0081, 0, VR::SH, VM::M1, "" }, { 0x5001, 0x0082, 0, VR::US, VM::M3, "" }, { 0x5001, 0x0083, 0, VR::FL, VM::M1TN, "" }, { 0x5001, 0x0084, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict079TagHashTable[] = { 258, 258, 259, 258, 258, 258, 258, 258, 258, 262, 265, 258, 258, 268, 258, 258, 258, 258, 273, 258, 276, 279, 258, 282, 285, 258, 258, 288, 291, 296, 301, 308, 313, 316, 319, 322, 258, 329, 258, 336, 258, 258, 339, 258, 342, 347, 350, 258, 258, 353, 258, 258, 258, 258, 356, 361, 258, 258, 258, 364, 367, 372, 377, 258, 380, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 383, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 386, 389, 392, 258, 258, 258, 397, 258, 400, 258, 258, 403, 408, 411, 258, 258, 414, 417, 420, 423, 426, 429, 258, 258, 432, 258, 258, 258, 258, 258, 258, 435, 258, 258, 258, 440, 443, 448, 451, 456, 258, 258, 461, 466, 469, 472, 258, 258, 475, 258, 258, 258, 478, 483, 258, 258, 488, 491, 258, 258, 494, 499, 502, 505, 510, 258, 513, 516, 519, 526, 531, 536, 539, 542, 547, 550, 553, 556, 559, 564, 258, 567, 572, 579, 586, 593, 596, 601, 258, 606, 609, 612, 615, 618, 621, 626, 629, 632, 635, 642, 647, 652, 657, 660, 665, 668, 673, 676, 258, 258, 679, 684, 687, 692, 695, 700, 705, 714, 719, 724, 731, 734, 745, 748, 751, 754, 757, 762, 769, 776, 779, 786, 791, 798, 803, 806, 813, 820, 827, 832, 837, 840, 843, 848, 853, 856, 861, 866, 871, 876, 881, 884, 889, 894, 901, 258, 906, 913, 918, 258, 925, 930, 258, 258, 258, 258, 0, 1, 0, 1, 1, 249, 174, 1, 36, 235, 2, 37, 236, 144, 0, 1, 225, 159, 1, 194, 159, 1, 224, 156, 1, 193, 152, 1, 223, 153, 1, 190, 148, 2, 148, 49, 192, 151, 2, 147, 48, 191, 150, 3, 136, 211, 222, 147, 256, 131, 2, 221, 146, 255, 130, 1, 254, 129, 1, 253, 128, 1, 220, 143, 3, 33, 194, 138, 214, 189, 140, 3, 34, 196, 137, 212, 257, 132, 1, 188, 136, 1, 186, 133, 2, 146, 33, 187, 135, 1, 145, 32, 1, 35, 207, 1, 219, 128, 2, 132, 203, 241, 250, 1, 242, 251, 1, 135, 206, 2, 134, 205, 149, 80, 2, 133, 204, 240, 245, 1, 239, 242, 1, 32, 160, 1, 238, 227, 1, 150, 112, 1, 151, 113, 2, 152, 114, 195, 208, 1, 250, 200, 1, 237, 204, 2, 131, 155, 236, 203, 1, 234, 200, 1, 235, 201, 1, 232, 196, 1, 233, 197, 1, 230, 194, 1, 231, 195, 1, 228, 192, 1, 229, 193, 1, 170, 61, 2, 169, 54, 209, 52, 1, 126, 112, 2, 28, 99, 127, 115, 1, 27, 98, 2, 26, 97, 129, 117, 2, 25, 96, 128, 116, 2, 29, 101, 168, 43, 1, 167, 42, 1, 31, 107, 1, 30, 106, 1, 130, 127, 2, 208, 35, 251, 112, 2, 207, 34, 252, 113, 1, 206, 31, 1, 166, 28, 2, 165, 25, 205, 27, 1, 164, 24, 1, 203, 21, 2, 163, 22, 202, 20, 1, 204, 23, 1, 162, 19, 1, 161, 18, 3, 22, 67, 160, 17, 201, 19, 2, 21, 66, 159, 16, 2, 20, 65, 82, 83, 1, 19, 64, 1, 43, 65, 2, 42, 64, 158, 12, 1, 200, 9, 1, 157, 10, 1, 156, 9, 1, 155, 8, 2, 154, 7, 198, 5, 1, 125, 92, 2, 199, 6, 243, 0, 3, 46, 87, 74, 71, 196, 1, 3, 45, 86, 73, 70, 153, 2, 3, 44, 85, 72, 69, 197, 3, 1, 71, 68, 2, 24, 81, 70, 67, 2, 23, 80, 69, 66, 1, 68, 64, 1, 81, 79, 1, 80, 78, 1, 79, 77, 1, 78, 76, 2, 77, 75, 185, 118, 1, 76, 74, 1, 75, 73, 1, 184, 117, 3, 40, 38, 64, 54, 123, 48, 2, 65, 55, 124, 49, 2, 8, 34, 182, 112, 2, 9, 35, 183, 113, 1, 62, 50, 2, 7, 33, 63, 51, 1, 61, 48, 2, 39, 33, 248, 105, 1, 10, 36, 1, 11, 37, 2, 216, 100, 247, 98, 1, 217, 101, 2, 66, 56, 218, 102, 1, 67, 57, 2, 58, 38, 97, 36, 2, 59, 39, 213, 97, 4, 14, 50, 41, 52, 112, 34, 214, 98, 2, 113, 35, 215, 99, 2, 12, 48, 212, 92, 3, 13, 49, 114, 37, 181, 95, 1, 115, 38, 5, 15, 55, 96, 35, 116, 39, 180, 93, 246, 89, 1, 117, 40, 1, 118, 41, 1, 179, 88, 1, 119, 43, 2, 120, 44, 178, 86, 3, 16, 57, 121, 45, 211, 85, 3, 17, 62, 60, 40, 122, 46, 1, 18, 63, 3, 90, 20, 98, 16, 245, 86, 2, 91, 21, 99, 17, 3, 92, 22, 177, 80, 244, 84, 2, 93, 23, 100, 19, 1, 101, 20, 3, 1, 1, 87, 17, 102, 21, 3, 3, 6, 88, 18, 103, 22, 3, 4, 7, 89, 19, 104, 23, 2, 105, 24, 176, 74, 2, 2, 5, 106, 25, 1, 107, 26, 1, 108, 27, 2, 94, 24, 109, 28, 2, 95, 25, 175, 71, 1, 110, 30, 2, 111, 31, 174, 69, 2, 86, 4, 172, 66, 2, 52, 7, 173, 67, 2, 50, 4, 171, 64, 2, 51, 5, 210, 67, 1, 48, 2, 2, 49, 3, 83, 1, 2, 84, 2, 142, 8, 3, 47, 1, 85, 3, 143, 9, 2, 5, 20, 57, 14, 3, 55, 12, 140, 4, 227, 187, 2, 56, 13, 141, 5, 3, 6, 24, 54, 10, 226, 185, 2, 38, 24, 53, 8, 1, 139, 1, }; const unsigned short Dict079KeyHashTable[] = { 258, 258, 258, 258, 259, 258, 262, 258, 258, 258, 265, 268, 258, 271, 258, 258, 274, 258, 277, 258, 258, 258, 258, 258, 258, 258, 258, 258, 280, 283, 286, 258, 291, 258, 258, 294, 258, 258, 258, 297, 258, 258, 300, 258, 258, 258, 258, 258, 258, 258, 305, 258, 258, 258, 258, 258, 258, 258, 310, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 313, 258, 258, 258, 258, 258, 316, 258, 258, 258, 258, 258, 319, 258, 258, 258, 258, 258, 324, 258, 258, 327, 258, 258, 258, 258, 258, 330, 258, 258, 258, 258, 333, 258, 258, 258, 336, 258, 339, 258, 258, 258, 258, 258, 258, 342, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 345, 258, 258, 258, 348, 258, 351, 354, 258, 258, 258, 258, 258, 357, 258, 258, 258, 258, 258, 258, 258, 258, 360, 258, 363, 258, 258, 258, 366, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 369, 258, 258, 258, 258, 258, 258, 258, 258, 372, 258, 258, 258, 375, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 378, 258, 258, 258, 258, 258, 795, 258, 258, 258, 258, 258, 258, 258, 258, 798, 258, 801, 804, 258, 258, 258, 258, 807, 810, 258, 813, 258, 258, 816, 258, 819, 258, 258, 258, 258, 258, 0, 1, 50, 61699, 1, 152, 47053, 1, 52, 19145, 1, 137, 301, 1, 44, 50352, 1, 48, 29194, 1, 54, 32875, 1, 139, 38777, 1, 133, 31238, 2, 63, 4547, 81, 11586, 1, 62, 34675, 1, 132, 29092, 1, 131, 45141, 2, 28, 33370, 45, 50198, 2, 47, 51759, 135, 10433, 1, 23, 39661, 1, 60, 21188, 1, 40, 46327, 2, 55, 57723, 151, 25110, 1, 59, 7172, 1, 0, 3965, 1, 49, 5609, 1, 150, 19747, 1, 8, 64168, 1, 19, 46396, 1, 136, 34973, 1, 15, 41732, 1, 58, 50857, 1, 149, 20940, 1, 148, 41175, 1, 46, 11628, 1, 138, 9839, 1, 140, 25037, 1, 7, 38979, 1, 147, 56786, 1, 145, 59647, 1, 134, 35622, 208, 2, 20, 3, 20, 4, 20, 5, 20, 6, 20, 10, 20, 11, 20, 12, 20, 13, 20, 14, 20, 16, 20, 17, 20, 18, 20, 20, 20, 21, 20, 22, 20, 24, 20, 25, 20, 27, 20, 29, 20, 30, 20, 31, 20, 32, 20, 33, 20, 34, 20, 35, 20, 36, 20, 37, 20, 38, 20, 39, 20, 41, 20, 42, 20, 43, 20, 57, 20, 61, 20, 64, 20, 65, 20, 66, 20, 67, 20, 68, 20, 69, 20, 70, 20, 71, 20, 72, 20, 73, 20, 74, 20, 75, 20, 76, 20, 77, 20, 78, 20, 79, 20, 80, 20, 82, 20, 83, 20, 84, 20, 85, 20, 86, 20, 87, 20, 88, 20, 89, 20, 90, 20, 91, 20, 92, 20, 93, 20, 94, 20, 95, 20, 96, 20, 97, 20, 98, 20, 99, 20, 100, 20, 101, 20, 102, 20, 103, 20, 104, 20, 105, 20, 106, 20, 107, 20, 108, 20, 109, 20, 110, 20, 111, 20, 112, 20, 113, 20, 114, 20, 115, 20, 116, 20, 117, 20, 118, 20, 119, 20, 120, 20, 121, 20, 122, 20, 123, 20, 124, 20, 125, 20, 126, 20, 127, 20, 128, 20, 129, 20, 130, 20, 142, 20, 143, 20, 153, 20, 154, 20, 155, 20, 156, 20, 157, 20, 158, 20, 159, 20, 160, 20, 161, 20, 162, 20, 163, 20, 164, 20, 165, 20, 166, 20, 167, 20, 168, 20, 169, 20, 170, 20, 171, 20, 172, 20, 173, 20, 174, 20, 175, 20, 176, 20, 177, 20, 178, 20, 179, 20, 180, 20, 181, 20, 182, 20, 183, 20, 184, 20, 185, 20, 186, 20, 187, 20, 188, 20, 189, 20, 190, 20, 191, 20, 192, 20, 193, 20, 194, 20, 195, 20, 196, 20, 197, 20, 198, 20, 199, 20, 200, 20, 201, 20, 202, 20, 203, 20, 204, 20, 205, 20, 206, 20, 207, 20, 208, 20, 209, 20, 210, 20, 211, 20, 212, 20, 213, 20, 214, 20, 215, 20, 216, 20, 217, 20, 218, 20, 219, 20, 220, 20, 221, 20, 222, 20, 223, 20, 224, 20, 225, 20, 226, 20, 227, 20, 228, 20, 229, 20, 230, 20, 231, 20, 232, 20, 233, 20, 234, 20, 235, 20, 236, 20, 237, 20, 238, 20, 239, 20, 240, 20, 241, 20, 242, 20, 243, 20, 244, 20, 245, 20, 246, 20, 247, 20, 248, 20, 249, 20, 250, 20, 251, 20, 252, 20, 253, 20, 254, 20, 255, 20, 256, 20, 257, 20, 1, 51, 12237, 1, 26, 56406, 1, 56, 2695, 1, 141, 23801, 1, 146, 27511, 1, 144, 40734, 1, 1, 14626, 1, 53, 30155, 1, 9, 62204, }; vtkDICOMDictionary::Dict Dict079Data = { "ELSCINT1", 258, 258, Dict079TagHashTable, Dict079KeyHashTable, Dict079Contents }; // ----- Brainlab-S9-History ----- const DictEntry Dict080Contents[] = { { 0x0009, 0x0021, 0, VR::UL, VM::M1, "" }, { 0x0009, 0x0024, 0, VR::UL, VM::M1, "" }, { 0x0009, 0x0030, 0, VR::SQ, VM::M1, "" }, { 0x0009, 0x0031, 0, VR::SQ, VM::M1, "" }, { 0x0009, 0x0032, 0, VR::SQ, VM::M1, "" }, { 0x0009, 0x0033, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict080TagHashTable[] = { 6, 6, 7, 10, 15, 20, 0, 1, 3, 49, 2, 1, 36, 2, 48, 2, 0, 33, 5, 51, 1, 4, 50, }; const unsigned short Dict080KeyHashTable[] = { 6, 6, 6, 6, 6, 7, 0, 6, 0, 896, 1, 896, 2, 896, 3, 896, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict080Data = { "Brainlab-S9-History", 6, 6, Dict080TagHashTable, Dict080KeyHashTable, Dict080Contents }; // ----- SIEMENS IMAGE SHADOW ATTRIBUTES ----- const DictEntry Dict081Contents[] = { { 0x0021, 0x0001, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::FD, VM::M1TN, "" }, { 0x0021, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0005, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x001a, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x001c, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x001f, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0022, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0024, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0025, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0027, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002a, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002b, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002c, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002d, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002e, 0, VR::UL, VM::M1, "" }, { 0x0021, 0x0033, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0034, 0, VR::FD, VM::M1, "" }, { 0x0021, 0x0035, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0037, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x003a, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x003b, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x003c, 0, VR::FD, VM::M1TN, "" }, { 0x0021, 0x003d, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x003f, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0041, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0042, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0043, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x0044, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0045, 0, VR::SL, VM::M1TN, "" }, { 0x0021, 0x0046, 0, VR::FD, VM::M1, "" }, { 0x0021, 0x0047, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0048, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0049, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x004b, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x004e, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x004f, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0051, 0, VR::UL, VM::M1, "" }, { 0x0021, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0053, 0, VR::FD, VM::M1, "" }, { 0x0021, 0x0054, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0056, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0058, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0059, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x005a, 0, VR::FD, VM::M1TN, "" }, { 0x0021, 0x005b, 0, VR::FD, VM::M1TN, "" }, { 0x0021, 0x005e, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict081TagHashTable[] = { 53, 56, 52, 61, 66, 69, 72, 77, 52, 84, 89, 96, 101, 106, 109, 112, 115, 118, 121, 126, 129, 132, 135, 52, 52, 52, 140, 143, 146, 149, 152, 52, 155, 52, 158, 161, 164, 167, 52, 170, 52, 52, 52, 52, 173, 176, 179, 182, 185, 188, 191, 194, 0, 1, 37, 72, 2, 9, 32, 38, 73, 2, 10, 34, 39, 75, 1, 12, 37, 1, 11, 36, 2, 14, 39, 40, 78, 3, 6, 26, 13, 38, 41, 79, 2, 7, 28, 42, 81, 3, 8, 31, 16, 43, 43, 82, 2, 15, 42, 44, 83, 2, 18, 45, 45, 84, 1, 17, 44, 1, 46, 86, 1, 19, 46, 1, 47, 88, 1, 48, 89, 2, 20, 51, 49, 90, 1, 50, 91, 1, 22, 53, 1, 21, 52, 2, 23, 55, 51, 94, 1, 25, 59, 1, 24, 58, 1, 27, 61, 1, 26, 60, 1, 28, 63, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 5, 6, 1, 29, 64, 1, 30, 65, 1, 31, 66, 1, 32, 67, 1, 33, 68, 1, 34, 69, 1, 35, 70, 1, 36, 71, }; const unsigned short Dict081KeyHashTable[] = { 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, 0, 103, 1, 103, 2, 103, 3, 103, 4, 103, 5, 103, 6, 103, 7, 103, 8, 103, 9, 103, 10, 103, 11, 103, 12, 103, 13, 103, 14, 103, 15, 103, 16, 103, 17, 103, 18, 103, 19, 103, 20, 103, 21, 103, 22, 103, 23, 103, 24, 103, 25, 103, 26, 103, 27, 103, 28, 103, 29, 103, 30, 103, 31, 103, 32, 103, 33, 103, 34, 103, 35, 103, 36, 103, 37, 103, 38, 103, 39, 103, 40, 103, 41, 103, 42, 103, 43, 103, 44, 103, 45, 103, 46, 103, 47, 103, 48, 103, 49, 103, 50, 103, 51, 103, }; vtkDICOMDictionary::Dict Dict081Data = { "SIEMENS IMAGE SHADOW ATTRIBUTES", 52, 52, Dict081TagHashTable, Dict081KeyHashTable, Dict081Contents }; // ----- Harmony R1.0 ----- const DictEntry Dict082Contents[] = { { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000b, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x000d, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x000e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0011, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0012, 0, VR::TM, VM::M1, "" }, { 0x0019, 0x0013, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0014, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0016, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x0017, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0019, 0, VR::US, VM::M1, "" }, { 0x0019, 0x001a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x001b, 0, VR::US, VM::M1, "" }, { 0x0019, 0x001c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x001d, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x001f, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0025, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x002a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002b, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x002d, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x002f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0033, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0035, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0036, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0037, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0038, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0039, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x003a, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x003b, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003d, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003f, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0041, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0043, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0045, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0047, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0049, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004b, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x004c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x004e, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x004f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0051, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0052, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0055, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0056, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0057, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0058, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0059, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005a, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005b, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005d, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005f, 0, VR::UI, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::UI, VM::M1, "" }, { 0x0019, 0x0063, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0065, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0066, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0067, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x006b, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0071, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0072, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0073, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0075, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0079, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x007a, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x007b, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x007c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007d, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007f, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict082TagHashTable[] = { 116, 121, 124, 127, 130, 133, 138, 141, 144, 149, 154, 159, 164, 169, 172, 175, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 229, 232, 235, 238, 241, 246, 251, 256, 261, 264, 267, 270, 273, 276, 279, 282, 115, 285, 288, 291, 115, 294, 297, 115, 300, 115, 115, 303, 306, 115, 309, 312, 315, 318, 321, 324, 327, 115, 330, 333, 336, 339, 115, 342, 345, 348, 351, 354, 357, 360, 363, 366, 115, 369, 372, 375, 378, 381, 384, 387, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, 423, 426, 429, 432, 435, 438, 115, 115, 441, 444, 447, 0, 2, 25, 25, 96, 107, 1, 24, 24, 1, 27, 27, 1, 26, 26, 1, 29, 29, 2, 28, 28, 87, 96, 1, 31, 31, 1, 30, 30, 2, 17, 17, 88, 99, 2, 16, 16, 89, 100, 2, 19, 19, 90, 101, 2, 18, 18, 91, 102, 2, 21, 21, 92, 103, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 9, 9, 1, 8, 8, 1, 11, 11, 1, 10, 10, 1, 13, 13, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 51, 57, 1, 50, 56, 1, 53, 59, 1, 52, 58, 1, 55, 61, 2, 54, 60, 114, 131, 2, 57, 63, 113, 130, 2, 56, 62, 112, 129, 2, 43, 49, 111, 128, 1, 42, 48, 1, 45, 51, 1, 44, 50, 1, 47, 53, 1, 46, 52, 1, 49, 55, 1, 48, 54, 1, 36, 41, 1, 38, 43, 1, 37, 42, 1, 39, 45, 1, 41, 47, 1, 40, 46, 1, 32, 32, 1, 34, 37, 1, 33, 36, 1, 35, 38, 1, 80, 88, 1, 81, 89, 1, 82, 90, 1, 83, 91, 1, 84, 92, 1, 85, 93, 1, 86, 95, 1, 73, 80, 1, 74, 81, 1, 75, 82, 1, 76, 84, 1, 77, 85, 1, 78, 86, 1, 79, 87, 1, 66, 72, 1, 67, 73, 1, 68, 74, 1, 69, 75, 1, 70, 76, 1, 71, 78, 1, 72, 79, 1, 58, 64, 1, 59, 65, 1, 60, 66, 1, 61, 67, 1, 62, 68, 1, 63, 69, 1, 64, 70, 1, 65, 71, 1, 103, 120, 1, 104, 121, 1, 105, 122, 1, 106, 123, 1, 107, 124, 1, 108, 125, 1, 109, 126, 1, 110, 127, 1, 97, 112, 1, 98, 113, 1, 99, 114, 1, 100, 115, 1, 101, 116, 1, 102, 117, 1, 93, 104, 1, 94, 105, 1, 95, 106, }; const unsigned short Dict082KeyHashTable[] = { 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0, 115, 0, 46, 1, 46, 2, 46, 3, 46, 4, 46, 5, 46, 6, 46, 7, 46, 8, 46, 9, 46, 10, 46, 11, 46, 12, 46, 13, 46, 14, 46, 15, 46, 16, 46, 17, 46, 18, 46, 19, 46, 20, 46, 21, 46, 22, 46, 23, 46, 24, 46, 25, 46, 26, 46, 27, 46, 28, 46, 29, 46, 30, 46, 31, 46, 32, 46, 33, 46, 34, 46, 35, 46, 36, 46, 37, 46, 38, 46, 39, 46, 40, 46, 41, 46, 42, 46, 43, 46, 44, 46, 45, 46, 46, 46, 47, 46, 48, 46, 49, 46, 50, 46, 51, 46, 52, 46, 53, 46, 54, 46, 55, 46, 56, 46, 57, 46, 58, 46, 59, 46, 60, 46, 61, 46, 62, 46, 63, 46, 64, 46, 65, 46, 66, 46, 67, 46, 68, 46, 69, 46, 70, 46, 71, 46, 72, 46, 73, 46, 74, 46, 75, 46, 76, 46, 77, 46, 78, 46, 79, 46, 80, 46, 81, 46, 82, 46, 83, 46, 84, 46, 85, 46, 86, 46, 87, 46, 88, 46, 89, 46, 90, 46, 91, 46, 92, 46, 93, 46, 94, 46, 95, 46, 96, 46, 97, 46, 98, 46, 99, 46, 100, 46, 101, 46, 102, 46, 103, 46, 104, 46, 105, 46, 106, 46, 107, 46, 108, 46, 109, 46, 110, 46, 111, 46, 112, 46, 113, 46, 114, 46, }; vtkDICOMDictionary::Dict Dict082Data = { "Harmony R1.0", 115, 115, Dict082TagHashTable, Dict082KeyHashTable, Dict082Contents }; // ----- FDMS 1.0 ----- const DictEntry Dict083Contents[] = { { 0x0009, 0x0004, 0, VR::SH, VM::M1, "ImageControlUnit" }, { 0x0009, 0x0005, 0, VR::OW, VM::M1, "ImageUID" }, { 0x0009, 0x0006, 0, VR::OW, VM::M1, "RouteImageUID" }, { 0x0009, 0x0008, 0, VR::UL, VM::M1, "ImageDisplayInformationVersionNumber" }, { 0x0009, 0x0009, 0, VR::UL, VM::M1, "PatientInformationVersionNumber" }, { 0x0009, 0x000C, 0, VR::OW, VM::M1, "FilmUID" }, { 0x0009, 0x0010, 0, VR::CS, VM::M1, "ExposureUnitTypeCode" }, { 0x0009, 0x0080, 0, VR::LO, VM::M1, "KanjiHospitalName" }, { 0x0009, 0x0090, 0, VR::ST, VM::M1, "DistributionCode" }, { 0x0009, 0x0092, 0, VR::SH, VM::M1, "KanjiDepartmentName" }, { 0x0009, 0x00F0, 0, VR::CS, VM::M1, "BlackeningProcessFlag" }, { 0x0009, 0x00F1, 0, VR::LO, VM::M1, "ProcessingInformationFlag" }, { 0x0019, 0x0015, 0, VR::LO, VM::M1, "KanjiBodyPartForExposure" }, { 0x0019, 0x0030, 0, VR::LO, VM::M1, "MenuCharacterString" }, { 0x0019, 0x0032, 0, VR::LO, VM::M1, "KanjiMenuName" }, { 0x0019, 0x0040, 0, VR::CS, VM::M1, "ImageProcessingType" }, { 0x0019, 0x0050, 0, VR::CS, VM::M1, "EDRMode" }, { 0x0019, 0x0060, 0, VR::SH, VM::M1, "RadiographersCode" }, { 0x0019, 0x0070, 0, VR::IS, VM::M1, "SplitExposureFormat" }, { 0x0019, 0x0071, 0, VR::IS, VM::M1, "NumberOfSplitExposureFrames" }, { 0x0019, 0x0080, 0, VR::IS, VM::M1, "ReadingPositionSpecification" }, { 0x0019, 0x0081, 0, VR::IS, VM::M1, "ReadingSensitivityCenter" }, { 0x0019, 0x0090, 0, VR::SH, VM::M1, "FilmAnnotationCharacterString1" }, { 0x0019, 0x0091, 0, VR::SH, VM::M1, "FilmAnnotationCharacterString2" }, { 0x0021, 0x0010, 0, VR::CS, VM::M1, "FCRImageID" }, { 0x0021, 0x0030, 0, VR::CS, VM::M1, "SetNumber" }, { 0x0021, 0x0040, 0, VR::IS, VM::M1, "ImageNumberInTheSet" }, { 0x0021, 0x0050, 0, VR::CS, VM::M1, "PairProcessingInformation" }, { 0x0021, 0x0070, 0, VR::IS, VM::M1, "FilmNumberWithinTheSeries" }, { 0x0021, 0x0080, 0, VR::CS, VM::M1, "EquipmentTypeSpecificInformation" }, { 0x0021, 0x0090, 0, VR::CS, VM::M1, "LUTNumber" }, { 0x0023, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x0023, 0x0020, 0, VR::SQ, VM::M1, "" }, { 0x0023, 0x0030, 0, VR::SQ, VM::M1, "" }, { 0x0025, 0x0010, 0, VR::US, VM::M1, "RelativeLightEmissionAmountSk" }, { 0x0025, 0x0011, 0, VR::US, VM::M1, "TermOfCorrectionForEachIPTypeSt" }, { 0x0025, 0x0012, 0, VR::US, VM::M1, "ReadingGainGp" }, { 0x0025, 0x0013, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0015, 0, VR::CS, VM::M1, "" }, { 0x0025, 0x0020, 0, VR::US, VM::M2, "" }, { 0x0025, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0031, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0033, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0034, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0041, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0043, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0050, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0051, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0053, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0060, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0061, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0062, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0063, 0, VR::CS, VM::M1, "" }, { 0x0025, 0x0070, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0071, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0073, 0, VR::US, VM::M6, "" }, { 0x0025, 0x0074, 0, VR::US, VM::M6, "" }, { 0x0025, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0081, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0083, 0, VR::US, VM::M6, "" }, { 0x0025, 0x0084, 0, VR::US, VM::M6, "" }, { 0x0025, 0x0090, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0091, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0092, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0093, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0094, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0095, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0096, 0, VR::CS, VM::M1, "" }, { 0x0025, 0x00a0, 0, VR::US, VM::M1, "" }, { 0x0025, 0x00a1, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x00a2, 0, VR::US, VM::M1, "" }, { 0x0025, 0x00a3, 0, VR::SS, VM::M1, "" }, { 0x0027, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0020, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0030, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0040, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0050, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0060, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0070, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x0080, 0, VR::SQ, VM::M1, "" }, { 0x0027, 0x00a0, 0, VR::IS, VM::M1, "" }, { 0x0027, 0x00a1, 0, VR::CS, VM::M2, "" }, { 0x0027, 0x00a2, 0, VR::CS, VM::M2, "" }, { 0x0027, 0x00a3, 0, VR::SS, VM::M1TN, "" }, { 0x0029, 0x0020, 0, VR::CS, VM::M1, "ImageScanningDirection" }, { 0x0029, 0x0025, 0, VR::CS, VM::M1, "ImageRotationReversalInformation" }, { 0x0029, 0x0030, 0, VR::CS, VM::M1, "ExtendedReadingSizeValue" }, { 0x0029, 0x0034, 0, VR::US, VM::M1, "MagReducRatio" }, { 0x0029, 0x0044, 0, VR::CS, VM::M1, "LineDensityCode" }, { 0x0029, 0x0050, 0, VR::CS, VM::M1, "DataCompressionCode" }, { 0x2011, 0x0000, 0, VR::CS, VM::M1, "TrimDensity" }, { 0x2011, 0x0001, 0, VR::IS, VM::M1, "TrimWidth" }, { 0x2011, 0x0002, 0, VR::CS, VM::M1, "ImageMagReducRatio" }, { 0x2011, 0x0010, 0, VR::CS, VM::M1, "ImageDisplayFormat" }, { 0x2011, 0x0011, 0, VR::CS, VM::M1, "ImagePositionSpecifyingFlag" }, { 0x2011, 0x0020, 0, VR::OW, VM::M1, "InterpolationAVRSSystemFormat" }, { 0x50F1, 0x0006, 0, VR::CS, VM::M1, "EnergySubtractionParameter" }, { 0x50F1, 0x0007, 0, VR::CS, VM::M1, "SubtractionRegistrationResult" }, { 0x50F1, 0x0008, 0, VR::CS, VM::M1, "EnergySubtractionParameter2" }, { 0x50F1, 0x0009, 0, VR::SL, VM::M1, "AfinConversionCoefficient" }, { 0x50F1, 0x000A, 0, VR::LO, VM::M1, "FNCParameters" }, { 0x50F1, 0x0010, 0, VR::CS, VM::M1, "FilmOutputFormat" }, { 0x50F1, 0x0020, 0, VR::CS, VM::M1, "ImageProcessingModificationFlag" }, }; const unsigned short Dict083TagHashTable[] = { 111, 114, 117, 120, 123, 126, 131, 134, 139, 144, 151, 110, 156, 163, 110, 166, 169, 172, 110, 179, 182, 187, 190, 199, 210, 215, 110, 110, 224, 227, 234, 237, 110, 110, 110, 110, 110, 110, 110, 110, 110, 240, 110, 243, 248, 251, 110, 110, 256, 259, 110, 262, 265, 268, 275, 280, 289, 292, 110, 110, 110, 110, 110, 110, 110, 110, 110, 295, 298, 303, 310, 319, 326, 331, 110, 110, 110, 110, 110, 110, 334, 110, 110, 110, 339, 342, 345, 352, 357, 360, 110, 110, 363, 110, 110, 110, 366, 110, 110, 110, 369, 372, 375, 380, 383, 386, 110, 110, 389, 110, 0, 1, 4, 9, 1, 3, 8, 1, 27, 80, 1, 32, 32, 1, 40, 33, 2, 5, 12, 39, 32, 1, 50, 80, 2, 51, 81, 80, 32, 2, 52, 82, 83, 80, 3, 53, 83, 91, 32, 102, 32, 2, 17, 96, 96, 80, 3, 1, 5, 12, 21, 92, 37, 1, 0, 4, 1, 2, 6, 1, 103, 6, 3, 25, 48, 45, 52, 104, 7, 1, 33, 48, 2, 42, 49, 107, 10, 1, 41, 48, 4, 44, 51, 78, 163, 88, 161, 105, 8, 5, 43, 50, 77, 162, 81, 48, 87, 160, 106, 9, 2, 76, 161, 90, 163, 4, 6, 16, 75, 160, 89, 162, 93, 48, 1, 23, 145, 3, 7, 128, 22, 144, 94, 52, 1, 10, 240, 1, 11, 241, 1, 13, 48, 2, 9, 146, 14, 50, 1, 21, 129, 2, 8, 144, 20, 128, 1, 38, 21, 1, 24, 16, 1, 31, 16, 1, 35, 17, 3, 29, 128, 34, 16, 67, 132, 2, 37, 19, 66, 131, 4, 36, 18, 65, 130, 79, 16, 86, 128, 1, 64, 129, 1, 63, 128, 1, 74, 150, 2, 54, 96, 73, 149, 3, 30, 144, 55, 97, 72, 148, 4, 56, 98, 71, 147, 84, 96, 101, 17, 3, 57, 99, 70, 146, 100, 16, 2, 16, 80, 69, 145, 1, 68, 144, 2, 28, 112, 62, 116, 1, 58, 112, 1, 59, 113, 3, 60, 114, 85, 112, 98, 1, 2, 61, 115, 97, 0, 1, 15, 64, 1, 99, 2, 1, 109, 32, 1, 26, 64, 1, 46, 64, 1, 47, 65, 2, 48, 66, 82, 64, 1, 49, 67, 1, 18, 112, 1, 19, 113, 2, 95, 68, 108, 16, }; const unsigned short Dict083KeyHashTable[] = { 110, 110, 111, 110, 110, 110, 110, 110, 110, 110, 114, 110, 110, 110, 110, 110, 110, 110, 117, 122, 125, 110, 110, 110, 128, 131, 110, 110, 136, 110, 139, 110, 110, 110, 110, 142, 147, 110, 110, 152, 110, 155, 110, 110, 158, 110, 110, 110, 110, 110, 161, 110, 110, 164, 167, 110, 110, 170, 173, 176, 110, 181, 186, 110, 110, 110, 110, 189, 194, 197, 110, 110, 110, 110, 200, 203, 208, 211, 110, 214, 110, 110, 217, 110, 110, 110, 220, 223, 228, 231, 234, 237, 110, 110, 240, 243, 110, 110, 110, 246, 110, 249, 110, 364, 110, 367, 370, 110, 110, 373, 0, 1, 94, 52563, 1, 19, 22169, 2, 10, 12907, 96, 20491, 1, 15, 46214, 1, 91, 44853, 1, 13, 45557, 2, 97, 16940, 102, 32473, 1, 1, 65505, 1, 105, 22735, 2, 21, 60220, 22, 35451, 2, 8, 22674, 23, 35451, 1, 100, 55072, 1, 26, 1946, 1, 103, 6863, 1, 24, 30041, 1, 5, 12779, 1, 95, 46159, 1, 16, 35002, 1, 107, 41181, 2, 3, 17828, 9, 54570, 2, 2, 42722, 98, 5518, 1, 27, 13229, 2, 0, 33013, 30, 39760, 1, 25, 30221, 1, 29, 12725, 1, 35, 18619, 2, 12, 65329, 18, 7571, 1, 11, 9021, 1, 7, 30003, 1, 6, 49857, 1, 101, 59357, 1, 93, 57311, 2, 17, 13494, 36, 41017, 1, 14, 19016, 1, 20, 30466, 1, 92, 62540, 1, 108, 48266, 1, 34, 57974, 1, 99, 41960, 1, 104, 58515, 57, 31, 48, 32, 48, 33, 48, 37, 48, 38, 48, 39, 48, 40, 48, 41, 48, 42, 48, 43, 48, 44, 48, 45, 48, 46, 48, 47, 48, 48, 48, 49, 48, 50, 48, 51, 48, 52, 48, 53, 48, 54, 48, 55, 48, 56, 48, 57, 48, 58, 48, 59, 48, 60, 48, 61, 48, 62, 48, 63, 48, 64, 48, 65, 48, 66, 48, 67, 48, 68, 48, 69, 48, 70, 48, 71, 48, 72, 48, 73, 48, 74, 48, 75, 48, 76, 48, 77, 48, 78, 48, 79, 48, 80, 48, 81, 48, 82, 48, 83, 48, 84, 48, 85, 48, 86, 48, 87, 48, 88, 48, 89, 48, 90, 48, 1, 109, 1569, 1, 28, 39994, 1, 106, 6441, 1, 4, 49943, }; vtkDICOMDictionary::Dict Dict083Data = { "FDMS 1.0", 110, 110, Dict083TagHashTable, Dict083KeyHashTable, Dict083Contents }; // ----- SIEMENS SYNGO SOP CLASS PACKING ----- const DictEntry Dict084Contents[] = { { 0x0031, 0x0010, 0, VR::SQ, VM::M1, "SOPClassPackingSequence" }, { 0x0031, 0x0020, 0, VR::CS, VM::M1, "PackingVersion" }, { 0x0031, 0x0021, 0, VR::CS, VM::M1, "PackingOriginator" }, { 0x0031, 0x0030, 0, VR::UI, VM::M1, "OriginalSOPClassUID" }, { 0x0031, 0x0031, 0, VR::UI, VM::M1, "OriginalStudyInstanceUID" }, { 0x0031, 0x0032, 0, VR::UI, VM::M1, "OriginalSeriesInstanceUID" }, { 0x0031, 0x0033, 0, VR::UI, VM::M1, "OriginalSOPInstanceUID" }, { 0x0031, 0x0034, 0, VR::UI, VM::M1, "OriginalTransferSyntaxUID" }, { 0x0031, 0x0040, 0, VR::AT, VM::M1TN, "AttributesToSetToZeroLength" }, { 0x0031, 0x0041, 0, VR::AT, VM::M1TN, "AttributesToRemove" }, { 0x0031, 0x0050, 0, VR::US, VM::M1, "OriginalRows" }, { 0x0031, 0x0051, 0, VR::US, VM::M1, "OriginalColumns" }, { 0x0031, 0x0058, 0, VR::CS, VM::M2TN, "OriginalImageType" }, { 0x0031, 0x0060, 0, VR::CS, VM::M1, "OriginalModality" }, { 0x0031, 0x0070, 0, VR::SQ, VM::M1, "SequenceOfOriginalStreamChunks" }, { 0x0031, 0x0071, 0, VR::AT, VM::M1, "StartTagOfAStreamChunk" }, { 0x0031, 0x0072, 0, VR::AT, VM::M1, "EndTagOfAStreamChunk" }, { 0x0031, 0x0073, 0, VR::CS, VM::M1, "StreamChunkIsAPayload" }, { 0x0031, 0x0080, 0, VR::OB, VM::M1, "StreamChunk" }, }; const unsigned short Dict084TagHashTable[] = { 20, 23, 28, 33, 36, 39, 19, 42, 45, 50, 55, 19, 19, 19, 58, 19, 61, 64, 69, 0, 1, 4, 49, 2, 3, 48, 10, 80, 2, 6, 51, 11, 81, 1, 5, 50, 1, 13, 96, 1, 7, 52, 1, 14, 112, 2, 15, 113, 18, 128, 2, 12, 88, 16, 114, 1, 17, 115, 1, 0, 16, 1, 2, 33, 2, 1, 32, 8, 64, 1, 9, 65, }; const unsigned short Dict084KeyHashTable[] = { 19, 20, 25, 19, 19, 28, 35, 19, 19, 19, 40, 43, 46, 19, 49, 52, 59, 19, 62, 0, 2, 6, 59670, 14, 16357, 1, 2, 62314, 3, 5, 38637, 12, 7390, 17, 38980, 2, 0, 9327, 7, 10390, 1, 16, 64819, 1, 10, 45918, 1, 8, 60124, 1, 18, 39252, 3, 4, 27513, 13, 61818, 15, 19865, 1, 11, 42793, 3, 1, 46226, 3, 56742, 9, 34825, }; vtkDICOMDictionary::Dict Dict084Data = { "SIEMENS SYNGO SOP CLASS PACKING", 19, 19, Dict084TagHashTable, Dict084KeyHashTable, Dict084Contents }; // ----- Sound Technologies ----- const DictEntry Dict085Contents[] = { { 0xf001, 0x0000, 0, VR::LO, VM::M1, "PatientSpecies" }, { 0xf001, 0x0001, 0, VR::LO, VM::M1, "PatientBreed" }, { 0xf001, 0x0002, 0, VR::LO, VM::M1, "PatientCategorySize" }, { 0xf001, 0x0003, 0, VR::CS, VM::M1, "PatientSexExtended" }, { 0xf001, 0x0004, 0, VR::LO, VM::M1, "ImageView" }, { 0xf001, 0x0005, 0, VR::LO, VM::M1, "AnatomyImaged" }, { 0xf001, 0x0006, 0, VR::LT, VM::M1, "ImageEnhancements" }, { 0xf001, 0x0007, 0, VR::LO, VM::M1, "DetectorSettings" }, { 0xf001, 0x0008, 0, VR::LO, VM::M1, "ApplicationVersion" }, { 0xf001, 0x0009, 0, VR::LO, VM::M1, "ImageLateralityExtended" }, { 0xf001, 0x000a, 0, VR::PN, VM::M1, "ClientName" }, { 0xf001, 0x000b, 0, VR::UI, VM::M1, "ReferenceStudyInstanceUID" }, { 0xf001, 0x000c, 0, VR::UI, VM::M1, "ReferenceStudyInstanceUID" }, { 0xf001, 0x000d, 0, VR::LO, VM::M1, "ExamRefID" }, { 0xf001, 0x000e, 0, VR::ST, VM::M1, "PhysicianOfRecordAddress" }, { 0xf001, 0x000f, 0, VR::SH, VM::M1, "PhysicianOfRecordPhoneNumbers" }, { 0xf001, 0x0010, 0, VR::LT, VM::M1, "ReasonForStudy" }, { 0xf001, 0x0011, 0, VR::LO, VM::M1, "Protocol" }, { 0xf001, 0x0012, 0, VR::LO, VM::M1, "CaptureInputType" }, { 0xf001, 0x0013, 0, VR::LT, VM::M1, "ExamComplaint" }, { 0xf001, 0x0014, 0, VR::LO, VM::M1, "ExamWebCode" }, { 0xf001, 0x0015, 0, VR::LO, VM::M1, "ExamCategory" }, { 0xf001, 0x0016, 0, VR::SH, VM::M1, "ExamDiagnosis" }, { 0xf001, 0x0017, 0, VR::PN, VM::M1, "ExamCreatedBy" }, { 0xf001, 0x0018, 0, VR::LO, VM::M1, "ExamCreatedByGroup" }, { 0xf001, 0x0019, 0, VR::DT, VM::M1, "ExamRequiredByDateTime" }, { 0xf001, 0x001a, 0, VR::LO, VM::M1, "CaptureType" }, { 0xf001, 0x001b, 0, VR::IS, VM::M1, "TelemedExamID" }, { 0xf001, 0x001c, 0, VR::LO, VM::M1, "ExamCreatedByGuid" }, { 0xf001, 0x001d, 0, VR::LO, VM::M1, "ClientNameGuid" }, { 0xf001, 0x001e, 0, VR::LO, VM::M1, "ReceptorBitsPerPixel" }, }; const unsigned short Dict085TagHashTable[] = { 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 101, 104, 107, 110, 31, 113, 118, 121, 0, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 9, 9, 1, 8, 8, 1, 11, 11, 1, 10, 10, 1, 13, 13, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 17, 17, 1, 16, 16, 1, 19, 19, 1, 18, 18, 1, 21, 21, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 25, 25, 1, 24, 24, 1, 27, 27, 1, 26, 26, 1, 29, 29, 1, 28, 28, 2, 1, 1, 30, 30, 1, 0, 0, 1, 3, 3, }; const unsigned short Dict085KeyHashTable[] = { 31, 31, 32, 31, 39, 42, 31, 45, 31, 48, 51, 60, 31, 63, 66, 71, 74, 77, 80, 83, 86, 31, 93, 98, 31, 101, 104, 31, 109, 112, 31, 0, 3, 11, 35518, 12, 35518, 25, 45257, 1, 13, 53002, 1, 20, 37660, 1, 27, 23946, 1, 2, 24342, 4, 6, 44393, 16, 62717, 26, 31215, 29, 38524, 1, 30, 26151, 1, 18, 2626, 2, 1, 56658, 23, 50859, 1, 4, 9292, 1, 17, 44729, 1, 14, 31626, 1, 8, 5875, 1, 9, 42527, 3, 3, 8249, 22, 38467, 28, 41544, 2, 15, 52607, 19, 25343, 1, 10, 31314, 1, 7, 27849, 2, 5, 56309, 24, 18954, 1, 0, 60758, 1, 21, 8879, }; vtkDICOMDictionary::Dict Dict085Data = { "Sound Technologies", 31, 31, Dict085TagHashTable, Dict085KeyHashTable, Dict085Contents }; // ----- PHILIPS XCT -Private ----- const DictEntry Dict086Contents[] = { { 0x7051, 0x0001, 0, VR::DS, VM::M1, "AttenuationThreshold" }, { 0x7051, 0x0002, 0, VR::DS, VM::M1, "DLPEstimate" }, }; const unsigned short Dict086TagHashTable[] = { 3, 6, 0, 1, 1, 2, 1, 0, 1, }; const unsigned short Dict086KeyHashTable[] = { 3, 6, 0, 1, 0, 53311, 1, 1, 62176, }; vtkDICOMDictionary::Dict Dict086Data = { "PHILIPS XCT -Private", 2, 2, Dict086TagHashTable, Dict086KeyHashTable, Dict086Contents }; // ----- Siemens: Thorax/Multix FD Image Stamp ----- const DictEntry Dict087Contents[] = { { 0x0023, 0x0000, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0001, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0003, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0004, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict087TagHashTable[] = { 6, 5, 9, 12, 15, 0, 1, 0, 0, 1, 3, 3, 1, 2, 2, 2, 1, 1, 4, 4, }; const unsigned short Dict087KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict087Data = { "Siemens: Thorax/Multix FD Image Stamp", 5, 5, Dict087TagHashTable, Dict087KeyHashTable, Dict087Contents }; // ----- GEMS_PARM_01 ----- const DictEntry Dict088Contents[] = { { 0x0043, 0x0001, 0, VR::SS, VM::M1, "BitmapOfPrescanOptions" }, { 0x0043, 0x0002, 0, VR::SS, VM::M1, "GradientOffsetInX" }, { 0x0043, 0x0003, 0, VR::SS, VM::M1, "GradientOffsetInY" }, { 0x0043, 0x0004, 0, VR::SS, VM::M1, "GradientOffsetInZ" }, { 0x0043, 0x0005, 0, VR::SS, VM::M1, "ImageIsOriginalOrUnoriginal" }, { 0x0043, 0x0006, 0, VR::SS, VM::M1, "NumberOfEPIShots" }, { 0x0043, 0x0007, 0, VR::SS, VM::M1, "ViewsPerSegment" }, { 0x0043, 0x0008, 0, VR::SS, VM::M1, "RespiratoryRateInBPM" }, { 0x0043, 0x0009, 0, VR::SS, VM::M1, "RespiratoryTriggerPoint" }, { 0x0043, 0x000a, 0, VR::SS, VM::M1, "TypeOfReceiverUsed" }, { 0x0043, 0x000b, 0, VR::DS, VM::M1, "PeakRateOfChangeOfGradientField" }, { 0x0043, 0x000c, 0, VR::DS, VM::M1, "LimitsInUnitsOfPercent" }, { 0x0043, 0x000d, 0, VR::DS, VM::M1, "PSDEstimatedLimit" }, { 0x0043, 0x000e, 0, VR::DS, VM::M1, "PSDEstimatedLimitInTeslaPerSecond" }, { 0x0043, 0x000f, 0, VR::DS, VM::M1, "SARAvgHead" }, { 0x0043, 0x0010, 0, VR::US, VM::M1, "WindowValue" }, { 0x0043, 0x0011, 0, VR::US, VM::M1, "TotalInputViews" }, { 0x0043, 0x0012, 0, VR::SS, VM::M3, "XrayChain" }, { 0x0043, 0x0013, 0, VR::SS, VM::M5, "ReconKernelParameters" }, { 0x0043, 0x0014, 0, VR::SS, VM::M3, "CalibrationParameters" }, { 0x0043, 0x0015, 0, VR::SS, VM::M3, "TotalOutputViews" }, { 0x0043, 0x0016, 0, VR::SS, VM::M5, "NumberOfOverranges" }, { 0x0043, 0x0017, 0, VR::DS, VM::M1, "IBHImageScaleFactors" }, { 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" }, { 0x0043, 0x0019, 0, VR::SS, VM::M1, "NumberOfBBHChainsToBlend" }, { 0x0043, 0x001a, 0, VR::SL, VM::M1, "StartingChannelNumber" }, { 0x0043, 0x001b, 0, VR::SS, VM::M1, "PPScanParameters" }, { 0x0043, 0x001c, 0, VR::SS, VM::M1, "GEImageIntegrity" }, { 0x0043, 0x001d, 0, VR::SS, VM::M1, "LevelValue" }, { 0x0043, 0x001e, 0, VR::DS, VM::M1, "DeltaStartTime" }, { 0x0043, 0x001f, 0, VR::SL, VM::M1, "MaxOverrangesInAView" }, { 0x0043, 0x0020, 0, VR::DS, VM::M1, "AvgOverrangesAllViews" }, { 0x0043, 0x0021, 0, VR::SS, VM::M1, "CorrectedAfterglowTerms" }, { 0x0043, 0x0025, 0, VR::SS, VM::M6, "ReferenceChannels" }, { 0x0043, 0x0026, 0, VR::US, VM::M6, "NoViewsRefChannelsBlocked" }, { 0x0043, 0x0027, 0, VR::SH, VM::M1, "ScanPitchRatio" }, { 0x0043, 0x0028, 0, VR::OB, VM::M1, "UniqueImageIdentifier" }, { 0x0043, 0x0029, 0, VR::OB, VM::M1, "HistogramTables" }, { 0x0043, 0x002a, 0, VR::OB, VM::M1, "UserDefinedData" }, { 0x0043, 0x002b, 0, VR::SS, VM::M4, "PrivateScanOptions" }, { 0x0043, 0x002c, 0, VR::SS, VM::M1, "EffectiveEchoSpacing" }, { 0x0043, 0x002d, 0, VR::SH, VM::M1, "FilterMode" }, { 0x0043, 0x002e, 0, VR::SH, VM::M1, "StringSlopField2" }, { 0x0043, 0x002f, 0, VR::SS, VM::M1, "ImageType" }, { 0x0043, 0x0030, 0, VR::SS, VM::M1, "VasCollapseFlag" }, { 0x0043, 0x0031, 0, VR::DS, VM::M2, "ReconCenterCoordinates" }, { 0x0043, 0x0032, 0, VR::SS, VM::M1, "VasFlags" }, { 0x0043, 0x0033, 0, VR::FL, VM::M1, "NegScanSpacing" }, { 0x0043, 0x0034, 0, VR::IS, VM::M1, "OffsetFrequency" }, { 0x0043, 0x0035, 0, VR::UL, VM::M1, "UserUsageTag" }, { 0x0043, 0x0036, 0, VR::UL, VM::M1, "UserFillMapMSW" }, { 0x0043, 0x0037, 0, VR::UL, VM::M1, "UserFillMapLSW" }, { 0x0043, 0x0038, 0, VR::FL, VM::M24, "User25ToUser48" }, { 0x0043, 0x0039, 0, VR::IS, VM::M4, "SlopInteger6ToSlopInteger9" }, { 0x0043, 0x0040, 0, VR::FL, VM::M4, "TriggerOnPosition" }, { 0x0043, 0x0041, 0, VR::FL, VM::M4, "DegreeOfRotation" }, { 0x0043, 0x0042, 0, VR::SL, VM::M4, "DASTriggerSource" }, { 0x0043, 0x0043, 0, VR::SL, VM::M4, "DASFpaGain" }, { 0x0043, 0x0044, 0, VR::SL, VM::M4, "DASOutputSource" }, { 0x0043, 0x0045, 0, VR::SL, VM::M4, "DASAdInput" }, { 0x0043, 0x0046, 0, VR::SL, VM::M4, "DASCalMode" }, { 0x0043, 0x0047, 0, VR::SL, VM::M4, "DASCalFrequency" }, { 0x0043, 0x0048, 0, VR::SL, VM::M4, "DASRegXm" }, { 0x0043, 0x0049, 0, VR::SL, VM::M4, "DASAutoZero" }, { 0x0043, 0x004a, 0, VR::SS, VM::M4, "StartingChannelOfView" }, { 0x0043, 0x004b, 0, VR::SL, VM::M4, "DASXmPattern" }, { 0x0043, 0x004c, 0, VR::SS, VM::M4, "TGGCTriggerMode" }, { 0x0043, 0x004d, 0, VR::FL, VM::M4, "StartScanToXrayOnDelay" }, { 0x0043, 0x004e, 0, VR::FL, VM::M4, "DurationOfXrayOn" }, { 0x0043, 0x0060, 0, VR::IS, VM::M8, "SlopInteger10ToSlopInteger17" }, { 0x0043, 0x0061, 0, VR::UI, VM::M1, "ScannerStudyEntityUID" }, { 0x0043, 0x0062, 0, VR::SH, VM::M1, "ScannerStudyID" }, { 0x0043, 0x0063, 0, VR::SH, VM::M1, "RawDataID" }, { 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" }, { 0x0043, 0x0065, 0, VR::US, VM::M1, "MotionCorrectionIndicator" }, { 0x0043, 0x0066, 0, VR::US, VM::M1, "HelicalCorrectionIndicator" }, { 0x0043, 0x0067, 0, VR::US, VM::M1, "IBOCorrectionIndicator" }, { 0x0043, 0x0068, 0, VR::US, VM::M1, "IXTCorrectionIndicator" }, { 0x0043, 0x0069, 0, VR::US, VM::M1, "QcalCorrectionIndicator" }, { 0x0043, 0x006a, 0, VR::US, VM::M1, "AVCorrectionIndicator" }, { 0x0043, 0x006b, 0, VR::US, VM::M1, "LMDKCorrectionIndicator" }, { 0x0043, 0x006c, 0, VR::IS, VM::M1, "DetectorRow" }, { 0x0043, 0x006d, 0, VR::US, VM::M1, "AreaSize" }, { 0x0043, 0x006e, 0, VR::SH, VM::M1, "AutoMAMode" }, { 0x0043, 0x006f, 0, VR::DS, VM::M3T4, "ScannerTableEntry" }, { 0x0043, 0x0070, 0, VR::LO, VM::M1, "ParadigmName" }, { 0x0043, 0x0071, 0, VR::ST, VM::M1, "ParadigmDescription" }, { 0x0043, 0x0072, 0, VR::UI, VM::M1, "ParadigmUID" }, { 0x0043, 0x0073, 0, VR::US, VM::M1, "ExperimentType" }, { 0x0043, 0x0074, 0, VR::US, VM::M1, "NumberOfRestVolumes" }, { 0x0043, 0x0075, 0, VR::US, VM::M1, "NumberOfActiveVolumes" }, { 0x0043, 0x0076, 0, VR::US, VM::M1, "NumberOfDummyScans" }, { 0x0043, 0x0077, 0, VR::SH, VM::M1, "ApplicationName" }, { 0x0043, 0x0078, 0, VR::SH, VM::M1, "ApplicationVersion" }, { 0x0043, 0x0079, 0, VR::US, VM::M1, "SlicesPerVolume" }, { 0x0043, 0x007a, 0, VR::US, VM::M1, "ExpectedTimePoints" }, { 0x0043, 0x007b, 0, VR::FL, VM::M1TN, "RegressorValues" }, { 0x0043, 0x007c, 0, VR::FL, VM::M1, "DelayAfterSliceGroup" }, { 0x0043, 0x007d, 0, VR::US, VM::M1, "ReconModeFlagWord" }, { 0x0043, 0x007e, 0, VR::LO, VM::M1TN, "PACCSpecificInformation" }, { 0x0043, 0x007f, 0, VR::DS, VM::M1TN, "Reserved" }, { 0x0043, 0x0080, 0, VR::LO, VM::M1TN, "CoilIDData" }, { 0x0043, 0x0081, 0, VR::LO, VM::M1, "GECoilName" }, { 0x0043, 0x0082, 0, VR::LO, VM::M1TN, "SystemConfigurationInformation" }, { 0x0043, 0x0083, 0, VR::DS, VM::M1T2, "AssetRFactors" }, { 0x0043, 0x0084, 0, VR::LO, VM::M5, "AdditionalAssetData" }, { 0x0043, 0x0085, 0, VR::UT, VM::M1, "DebugDataTextFormat" }, { 0x0043, 0x0086, 0, VR::OB, VM::M1, "DebugDataBinaryFormat" }, { 0x0043, 0x0087, 0, VR::UT, VM::M1, "Reserved" }, { 0x0043, 0x0088, 0, VR::UI, VM::M1, "PUREAcquisitionCalibrationSeriesUID" }, { 0x0043, 0x0089, 0, VR::LO, VM::M3, "GoverningBodyDBdtSARDefinition" }, { 0x0043, 0x008a, 0, VR::CS, VM::M1, "PrivateInPlanePhaseEncodingDirection" }, { 0x0043, 0x008b, 0, VR::OB, VM::M1, "FMRIBinaryDataBlock" }, { 0x0043, 0x008c, 0, VR::DS, VM::M1, "VoxelLocation" }, { 0x0043, 0x008d, 0, VR::DS, VM::M1TN, "SATBandLocations" }, { 0x0043, 0x008e, 0, VR::DS, VM::M3, "SpectroPrescanValues" }, { 0x0043, 0x008f, 0, VR::DS, VM::M3, "SpectroParameters" }, { 0x0043, 0x0090, 0, VR::LO, VM::M1TN, "SARDefinition" }, { 0x0043, 0x0091, 0, VR::DS, VM::M1TN, "SARValue" }, { 0x0043, 0x0092, 0, VR::LO, VM::M1, "ImageErrorText" }, { 0x0043, 0x0093, 0, VR::DS, VM::M1TN, "SpectroQuantitationValues" }, { 0x0043, 0x0094, 0, VR::DS, VM::M1TN, "SpectroRatioValues" }, { 0x0043, 0x0095, 0, VR::LO, VM::M1, "PrescanReuseString" }, { 0x0043, 0x0096, 0, VR::CS, VM::M1, "ContentQualification" }, { 0x0043, 0x0097, 0, VR::LO, VM::M8, "ImageFilteringParameters" }, { 0x0043, 0x0098, 0, VR::UI, VM::M1, "ASSETAcquisitionCalibrationSeriesUID" }, { 0x0043, 0x0099, 0, VR::LO, VM::M1TN, "ExtendedOptions" }, { 0x0043, 0x009a, 0, VR::IS, VM::M1, "RxStackIdentification" }, { 0x0043, 0x009b, 0, VR::DS, VM::M1, "NPWFactor" }, { 0x0043, 0x009c, 0, VR::OB, VM::M1, "ResearchTag1" }, { 0x0043, 0x009d, 0, VR::OB, VM::M1, "ResearchTag2" }, { 0x0043, 0x009e, 0, VR::OB, VM::M1, "ResearchTag3" }, { 0x0043, 0x009f, 0, VR::OB, VM::M1, "ResearchTag4" }, { 0x0043, 0x00a0, 0, VR::SQ, VM::M1, "SpectroscopyPixelSequence" }, { 0x0043, 0x00a1, 0, VR::SQ, VM::M1, "SpectroscopyDefaultDisplaySequence" }, { 0x0043, 0x00a2, 0, VR::DS, VM::M1TN, "MEFData" }, { 0x0043, 0x00a3, 0, VR::CS, VM::M1, "ASLContrastTechnique" }, { 0x0043, 0x00a4, 0, VR::LO, VM::M1, "DetailedTextForASLLabelingTechnique" }, { 0x0043, 0x00a5, 0, VR::IS, VM::M1, "DurationOfTheLabelOrControlPulse" }, { 0x0043, 0x00a6, 0, VR::DS, VM::M1, "OffsetFrequencyValueForFastB1Map" }, { 0x0043, 0x00a7, 0, VR::DS, VM::M1, "MotionEncodingFactor" }, { 0x0043, 0x00a8, 0, VR::DS, VM::M3, "DualDriveModeAndAmplitudeAttenuationAndPhaseOffset" }, { 0x0043, 0x00a9, 0, VR::LO, VM::M1TN, "CalibrationData3D" }, { 0x0043, 0x00aa, 0, VR::LO, VM::M1TN, "AdditionalFilteringParameters" }, { 0x0043, 0x00ab, 0, VR::DS, VM::M1TN, "SilenzData" }, { 0x0043, 0x00ac, 0, VR::DS, VM::M1TN, "QMAPDelayData" }, { 0x0043, 0x00ad, 0, VR::DS, VM::M1TN, "OtherRecoveryTimesValues" }, { 0x0043, 0x00ae, 0, VR::LO, VM::M1TN, "OtherRecoveryTimesLabels" }, { 0x0043, 0x00af, 0, VR::DS, VM::M1TN, "AdditionalEchoTimes" }, { 0x0043, 0x00b0, 0, VR::FL, VM::M1, "RescanTimeInAcquisition" }, { 0x0043, 0x00b1, 0, VR::SS, VM::M1, "ExcitationMode" }, { 0x0043, 0x00b2, 0, VR::DS, VM::M1TN, "AdvancedEddyCorrection" }, }; const unsigned short Dict088TagHashTable[] = { 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 152, 189, 192, 195, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 198, 201, 204, 207, 210, 213, 216, 219, 222, 227, 232, 237, 242, 247, 252, 257, 262, 267, 272, 277, 282, 287, 292, 297, 302, 307, 312, 317, 322, 327, 332, 337, 342, 347, 352, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, 465, 470, 475, 478, 481, 484, 487, 152, 152, 490, 493, 496, 499, 152, 502, 505, 508, 511, 514, 517, 520, 523, 526, 529, 532, 535, 538, 541, 544, 547, 550, 152, 152, 553, 556, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 1, 57, 67, 1, 56, 66, 1, 55, 65, 1, 54, 64, 1, 61, 71, 1, 60, 70, 1, 59, 69, 1, 58, 68, 1, 65, 75, 1, 64, 74, 1, 63, 73, 1, 62, 72, 1, 68, 78, 1, 67, 77, 1, 66, 76, 1, 72, 99, 1, 71, 98, 1, 70, 97, 1, 69, 96, 1, 76, 103, 1, 75, 102, 1, 74, 101, 1, 73, 100, 2, 80, 107, 101, 128, 2, 79, 106, 102, 129, 2, 78, 105, 103, 130, 2, 77, 104, 104, 131, 2, 84, 111, 105, 132, 2, 83, 110, 106, 133, 2, 82, 109, 107, 134, 2, 81, 108, 108, 135, 2, 88, 115, 109, 136, 2, 87, 114, 110, 137, 2, 86, 113, 111, 138, 2, 85, 112, 112, 139, 2, 92, 119, 113, 140, 2, 91, 118, 114, 141, 2, 90, 117, 115, 142, 2, 89, 116, 116, 143, 2, 96, 123, 117, 144, 2, 95, 122, 118, 145, 2, 94, 121, 119, 146, 2, 93, 120, 120, 147, 2, 100, 127, 121, 148, 2, 99, 126, 122, 149, 2, 98, 125, 123, 150, 2, 97, 124, 124, 151, 2, 1, 2, 125, 152, 2, 2, 3, 126, 153, 1, 127, 154, 2, 0, 1, 128, 155, 2, 5, 6, 129, 156, 2, 6, 7, 130, 157, 2, 3, 4, 131, 158, 2, 4, 5, 132, 159, 2, 9, 10, 133, 160, 2, 10, 11, 134, 161, 2, 7, 8, 135, 162, 2, 8, 9, 136, 163, 2, 13, 14, 137, 164, 2, 14, 15, 138, 165, 2, 11, 12, 139, 166, 2, 12, 13, 140, 167, 2, 17, 18, 141, 168, 2, 18, 19, 142, 169, 2, 15, 16, 143, 170, 2, 16, 17, 144, 171, 2, 21, 22, 145, 172, 2, 22, 23, 146, 173, 2, 19, 20, 147, 174, 2, 20, 21, 148, 175, 2, 25, 26, 149, 176, 2, 26, 27, 150, 177, 2, 23, 24, 151, 178, 1, 24, 25, 1, 29, 30, 1, 30, 31, 1, 27, 28, 1, 28, 29, 1, 31, 32, 1, 32, 33, 1, 34, 38, 1, 35, 39, 1, 33, 37, 1, 38, 42, 1, 39, 43, 1, 36, 40, 1, 37, 41, 1, 42, 46, 1, 43, 47, 1, 40, 44, 1, 41, 45, 1, 46, 50, 1, 47, 51, 1, 44, 48, 1, 45, 49, 1, 50, 54, 1, 51, 55, 1, 48, 52, 1, 49, 53, 1, 52, 56, 1, 53, 57, }; const unsigned short Dict088KeyHashTable[] = { 153, 156, 159, 152, 162, 165, 152, 152, 152, 168, 171, 152, 152, 174, 152, 152, 177, 182, 152, 152, 152, 185, 152, 188, 193, 198, 203, 206, 209, 152, 212, 217, 152, 220, 225, 152, 152, 230, 152, 233, 236, 241, 244, 249, 254, 259, 262, 265, 152, 270, 152, 275, 280, 152, 283, 286, 289, 152, 152, 152, 152, 152, 152, 152, 152, 292, 301, 304, 309, 152, 152, 312, 323, 152, 152, 152, 328, 152, 152, 331, 338, 341, 346, 351, 152, 152, 152, 356, 359, 362, 365, 368, 371, 378, 383, 386, 152, 152, 152, 389, 392, 395, 398, 152, 403, 406, 409, 412, 417, 152, 420, 425, 428, 435, 438, 443, 446, 451, 454, 152, 457, 462, 152, 467, 152, 152, 474, 481, 152, 486, 493, 500, 503, 506, 509, 152, 512, 515, 520, 152, 523, 526, 529, 532, 152, 537, 540, 152, 547, 152, 152, 550, 0, 1, 41, 562, 1, 68, 57836, 1, 43, 3695, 1, 107, 59394, 1, 24, 31247, 1, 83, 25323, 1, 90, 54884, 1, 145, 62678, 2, 20, 10757, 118, 3029, 1, 115, 25014, 1, 34, 61805, 2, 91, 64662, 129, 4775, 2, 65, 34907, 130, 4775, 2, 19, 63635, 131, 4775, 1, 132, 4775, 1, 25, 65017, 1, 44, 47208, 2, 26, 16624, 120, 19141, 1, 51, 60204, 2, 84, 22759, 139, 51144, 2, 5, 56726, 150, 43392, 1, 38, 57459, 1, 94, 2440, 2, 42, 45323, 105, 26818, 1, 137, 19203, 2, 73, 28701, 126, 29473, 2, 78, 49286, 85, 11368, 2, 17, 15744, 113, 29688, 1, 22, 44743, 1, 86, 45348, 2, 16, 47493, 127, 13600, 2, 79, 14576, 104, 43013, 2, 12, 65329, 54, 12893, 1, 138, 7625, 1, 32, 1468, 1, 0, 50757, 1, 50, 60211, 4, 18, 19578, 39, 62962, 96, 52374, 116, 64065, 1, 92, 18573, 2, 14, 60805, 147, 64275, 1, 75, 10555, 5, 61, 4945, 70, 108, 81, 16314, 98, 35734, 148, 44433, 2, 74, 24043, 111, 42537, 1, 122, 53052, 3, 109, 43130, 119, 62803, 134, 33765, 1, 103, 10261, 2, 128, 27943, 141, 65367, 2, 60, 64624, 64, 3459, 2, 23, 30658, 57, 23888, 1, 21, 1095, 1, 62, 7943, 1, 102, 33664, 1, 40, 756, 1, 125, 16115, 3, 29, 24026, 87, 31850, 144, 46197, 2, 100, 21079, 108, 21079, 1, 143, 30845, 1, 77, 19186, 1, 97, 49816, 1, 76, 46162, 1, 6, 9963, 2, 37, 11347, 72, 13786, 1, 88, 24836, 1, 82, 40110, 1, 36, 62661, 2, 67, 17420, 101, 51243, 1, 106, 56483, 2, 13, 19462, 55, 45735, 1, 11, 20245, 3, 33, 522, 124, 966, 146, 20009, 1, 123, 33769, 2, 30, 28195, 56, 53874, 1, 66, 46510, 2, 46, 11495, 121, 1532, 1, 49, 40456, 1, 142, 55859, 2, 45, 43788, 99, 36366, 2, 35, 32243, 136, 8748, 3, 7, 27634, 27, 49177, 95, 15927, 3, 48, 8664, 114, 44530, 133, 53066, 2, 53, 54030, 110, 52138, 3, 1, 60835, 52, 57633, 69, 8223, 3, 2, 60835, 9, 29212, 15, 63001, 1, 3, 60835, 1, 117, 35342, 1, 71, 23942, 1, 63, 48442, 1, 149, 52555, 2, 140, 54949, 151, 25386, 1, 4, 8407, 1, 89, 47156, 1, 112, 10790, 1, 31, 1301, 2, 58, 42098, 93, 11114, 1, 47, 40045, 3, 28, 15543, 59, 38656, 80, 18298, 1, 10, 47400, 2, 8, 8174, 135, 7544, }; vtkDICOMDictionary::Dict Dict088Data = { "GEMS_PARM_01", 152, 152, Dict088TagHashTable, Dict088KeyHashTable, Dict088Contents }; // ----- MedIns HP Extensions ----- const DictEntry Dict089Contents[] = { { 0x5473, 0x0003, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict089TagHashTable[] = { 2, 0, 1, 0, 3, }; const unsigned short Dict089KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict089Data = { "MedIns HP Extensions", 1, 1, Dict089TagHashTable, Dict089KeyHashTable, Dict089Contents }; // ----- SIEMENS CM VA0 ACQU ----- const DictEntry Dict090Contents[] = { { 0x0019, 0x0010, 0, VR::LO, VM::M1, "ParameterFileName" }, { 0x0019, 0x0011, 0, VR::LO, VM::M1, "SequenceFileName" }, { 0x0019, 0x0012, 0, VR::LO, VM::M1, "SequenceFileOwner" }, { 0x0019, 0x0013, 0, VR::LO, VM::M1, "SequenceDescription" }, { 0x0019, 0x0014, 0, VR::LO, VM::M1, "EPIFileName" }, }; const unsigned short Dict090TagHashTable[] = { 6, 9, 5, 12, 17, 0, 1, 3, 19, 1, 2, 18, 2, 1, 17, 4, 20, 1, 0, 16, }; const unsigned short Dict090KeyHashTable[] = { 5, 6, 9, 12, 5, 0, 1, 1, 34950, 1, 3, 6208, 3, 0, 13588, 2, 2254, 4, 33901, }; vtkDICOMDictionary::Dict Dict090Data = { "SIEMENS CM VA0 ACQU", 5, 5, Dict090TagHashTable, Dict090KeyHashTable, Dict090Contents }; // ----- PHILIPS MR/LAST ----- const DictEntry Dict091Contents[] = { { 0x0019, 0x0009, 0, VR::DS, VM::M1, "MainMagneticField" }, { 0x0019, 0x000e, 0, VR::IS, VM::M1, "FlowCompensation" }, { 0x0019, 0x00B7, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00E4, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00E5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::IS, VM::M1, "MinimumRRInterval" }, { 0x0019, 0x00b2, 0, VR::IS, VM::M1, "MaximumRRInterval" }, { 0x0019, 0x00b3, 0, VR::IS, VM::M1, "NumberOfRejections" }, { 0x0019, 0x00b4, 0, VR::IS, VM::M1TN, "NumberOfRRIntervals" }, { 0x0019, 0x00b5, 0, VR::IS, VM::M1, "ArrhythmiaRejection" }, { 0x0019, 0x00c0, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x00c6, 0, VR::IS, VM::M1, "CycledMultipleSlice" }, { 0x0019, 0x00ce, 0, VR::IS, VM::M1, "REST" }, { 0x0019, 0x00d5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00d6, 0, VR::IS, VM::M1, "FourierInterpolation" }, { 0x0019, 0x00d9, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x00e0, 0, VR::IS, VM::M1, "Prepulse" }, { 0x0019, 0x00e1, 0, VR::DS, VM::M1, "PrepulseDelay" }, { 0x0019, 0x00e2, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00e3, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00f0, 0, VR::LT, VM::M1, "WSProtocolString1" }, { 0x0019, 0x00f1, 0, VR::LT, VM::M1, "WSProtocolString2" }, { 0x0019, 0x00f2, 0, VR::LT, VM::M1, "WSProtocolString3" }, { 0x0019, 0x00f3, 0, VR::LT, VM::M1, "WSProtocolString4" }, { 0x0021, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0021, 0, VR::DS, VM::M1, "SliceGap" }, { 0x0021, 0x0022, 0, VR::DS, VM::M1, "StackRadialAngle" }, { 0x0027, 0x0000, 0, VR::US, VM::M1, "" }, { 0x0027, 0x0011, 0, VR::US, VM::M1TN, "" }, { 0x0027, 0x0012, 0, VR::DS, VM::M1TN, "" }, { 0x0027, 0x0013, 0, VR::DS, VM::M1TN, "" }, { 0x0027, 0x0014, 0, VR::DS, VM::M1TN, "" }, { 0x0027, 0x0015, 0, VR::DS, VM::M1TN, "" }, { 0x0027, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::DS, VM::M1, "FPMin" }, { 0x0029, 0x0020, 0, VR::DS, VM::M1, "FPMax" }, { 0x0029, 0x0030, 0, VR::DS, VM::M1, "ScaledMinimum" }, { 0x0029, 0x0040, 0, VR::DS, VM::M1, "ScaledMaximum" }, { 0x0029, 0x0050, 0, VR::DS, VM::M1, "WindowMinimum" }, { 0x0029, 0x0060, 0, VR::DS, VM::M1, "WindowMaximum" }, { 0x0029, 0x0061, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0062, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0070, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0071, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0072, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0080, 0, VR::IS, VM::M1, "ViewCenter" }, { 0x0029, 0x0081, 0, VR::IS, VM::M1, "ViewSize" }, { 0x0029, 0x0082, 0, VR::IS, VM::M1, "ViewZoom" }, { 0x0029, 0x0083, 0, VR::IS, VM::M1, "ViewTransform" }, { 0x0041, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0041, 0x0009, 0, VR::DS, VM::M1, "" }, { 0x6001, 0x0000, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict091TagHashTable[] = { 55, 60, 63, 66, 71, 54, 74, 79, 84, 89, 94, 54, 97, 102, 54, 54, 107, 112, 117, 122, 129, 54, 54, 132, 54, 135, 54, 54, 54, 54, 54, 54, 138, 141, 148, 153, 158, 54, 161, 164, 54, 54, 169, 54, 54, 172, 54, 54, 54, 175, 180, 187, 190, 193, 0, 2, 27, 33, 30, 17, 1, 26, 32, 1, 10, 192, 2, 28, 34, 36, 16, 1, 11, 198, 2, 7, 179, 50, 131, 2, 6, 178, 49, 130, 2, 5, 177, 48, 129, 2, 37, 32, 47, 128, 1, 2, 183, 2, 9, 181, 40, 80, 2, 8, 180, 53, 0, 2, 0, 9, 22, 242, 2, 23, 243, 51, 7, 2, 20, 240, 41, 96, 3, 21, 241, 42, 97, 52, 9, 1, 43, 98, 1, 1, 14, 1, 38, 48, 1, 18, 226, 3, 15, 217, 19, 227, 24, 0, 2, 16, 224, 44, 112, 2, 17, 225, 45, 113, 1, 46, 114, 1, 3, 228, 2, 4, 229, 29, 0, 1, 14, 214, 1, 13, 213, 2, 25, 16, 35, 22, 3, 12, 206, 34, 21, 39, 64, 1, 33, 20, 1, 32, 19, 1, 31, 18, }; const unsigned short Dict091KeyHashTable[] = { 55, 54, 58, 54, 54, 61, 54, 64, 67, 70, 73, 54, 76, 54, 54, 79, 82, 54, 54, 85, 54, 88, 54, 91, 54, 96, 54, 54, 54, 54, 54, 101, 54, 54, 54, 104, 54, 54, 54, 157, 162, 54, 54, 165, 54, 168, 54, 173, 54, 180, 54, 54, 54, 54, 0, 1, 6, 33714, 1, 0, 49390, 1, 9, 29434, 1, 20, 45939, 1, 21, 45939, 1, 22, 45939, 1, 23, 45939, 1, 50, 9704, 1, 49, 16257, 1, 17, 63598, 1, 48, 11484, 1, 28, 59495, 2, 14, 26811, 27, 54241, 2, 8, 6713, 47, 19180, 1, 36, 13232, 26, 2, 99, 3, 99, 4, 99, 10, 99, 13, 99, 15, 99, 18, 99, 19, 99, 24, 99, 25, 99, 26, 99, 29, 99, 30, 99, 31, 99, 32, 99, 33, 99, 34, 99, 35, 99, 42, 99, 43, 99, 44, 99, 45, 99, 46, 99, 51, 99, 52, 99, 53, 99, 2, 40, 61051, 41, 53390, 1, 5, 42083, 1, 16, 15327, 2, 1, 37456, 7, 22626, 3, 11, 54393, 12, 28174, 37, 13227, 2, 38, 14666, 39, 7005, }; vtkDICOMDictionary::Dict Dict091Data = { "PHILIPS MR/LAST", 54, 54, Dict091TagHashTable, Dict091KeyHashTable, Dict091Contents }; // ----- AEGIS_DICOM_2.00 ----- const DictEntry Dict092Contents[] = { { 0x0003, 0x0000, 0, VR::US, VM::M1TN, "" }, { 0x0005, 0x0000, 0, VR::US, VM::M1TN, "" }, { 0x0009, 0x0000, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0000, 0, VR::US, VM::M1TN, "" }, { 0x0029, 0x0000, 0, VR::US, VM::M1TN, "" }, { 0x1369, 0x0000, 0, VR::US, VM::M1TN, "" }, }; const unsigned short Dict092TagHashTable[] = { 6, 7, 6, 10, 15, 18, 0, 1, 3, 0, 2, 0, 0, 2, 0, 1, 5, 0, 2, 1, 0, 4, 0, }; const unsigned short Dict092KeyHashTable[] = { 6, 6, 6, 6, 6, 7, 0, 6, 0, 896, 1, 896, 2, 896, 3, 896, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict092Data = { "AEGIS_DICOM_2.00", 6, 6, Dict092TagHashTable, Dict092KeyHashTable, Dict092Contents }; // ----- MeVis eD: Absolute Temporal Positions ----- const DictEntry Dict093Contents[] = { { 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" }, { 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" }, { 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" }, { 0x0021, 0x0013, 0, VR::UN, VM::M1, "TimepointGradientDirections" }, { 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" }, }; const unsigned short Dict093TagHashTable[] = { 6, 9, 5, 14, 17, 0, 1, 3, 19, 2, 2, 18, 4, 113, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict093KeyHashTable[] = { 6, 5, 11, 14, 5, 0, 2, 0, 20911, 1, 25769, 1, 2, 4175, 2, 3, 13689, 4, 63720, }; vtkDICOMDictionary::Dict Dict093Data = { "MeVis eD: Absolute Temporal Positions", 5, 5, Dict093TagHashTable, Dict093KeyHashTable, Dict093Contents }; // ----- NQLeft ----- const DictEntry Dict094Contents[] = { { 0x0199, 0x0001, 0, VR::FL, VM::M1, "LeftCorticalWhiteMatter" }, { 0x0199, 0x0002, 0, VR::FL, VM::M1, "LeftCorticalGrayMatter" }, { 0x0199, 0x0003, 0, VR::FL, VM::M1, "Left3rdVentricle" }, { 0x0199, 0x0004, 0, VR::FL, VM::M1, "Left4thVentricle" }, { 0x0199, 0x0005, 0, VR::FL, VM::M1, "Left5thVentricle" }, { 0x0199, 0x0006, 0, VR::FL, VM::M1, "LeftLateralVentricle" }, { 0x0199, 0x0007, 0, VR::FL, VM::M1, "LeftInferiorLateralVentricle" }, { 0x0199, 0x0008, 0, VR::FL, VM::M1, "LeftInferiorCSF" }, { 0x0199, 0x0009, 0, VR::FL, VM::M1, "LeftCerebellarWhiteMatter" }, { 0x0199, 0x000a, 0, VR::FL, VM::M1, "LeftCerebellarGrayMatter" }, { 0x0199, 0x000b, 0, VR::FL, VM::M1, "LeftHippocampus" }, { 0x0199, 0x000c, 0, VR::FL, VM::M1, "LeftAmygdala" }, { 0x0199, 0x000d, 0, VR::FL, VM::M1, "LeftThalamus" }, { 0x0199, 0x000e, 0, VR::FL, VM::M1, "LeftCaudate" }, { 0x0199, 0x000f, 0, VR::FL, VM::M1, "LeftPutamen" }, { 0x0199, 0x0010, 0, VR::FL, VM::M1, "LeftPallidum" }, { 0x0199, 0x0011, 0, VR::FL, VM::M1, "LeftVentralDiencephalon" }, { 0x0199, 0x0012, 0, VR::FL, VM::M1, "LeftNucleusAccumbens" }, { 0x0199, 0x0013, 0, VR::FL, VM::M1, "LeftBrainStem" }, { 0x0199, 0x0014, 0, VR::FL, VM::M1, "LeftExteriorCSF" }, { 0x0199, 0x0015, 0, VR::FL, VM::M1, "LeftWMHypo" }, { 0x0199, 0x0016, 0, VR::FL, VM::M1, "LeftOther" }, { 0x0199, 0x0017, 0, VR::FL, VM::M1, "LeftCortexUnkown" }, { 0x0199, 0x0018, 0, VR::FL, VM::M1, "LeftCortexBankssts" }, { 0x0199, 0x0019, 0, VR::FL, VM::M1, "LeftCortexCaudalAnteriorCingulate" }, { 0x0199, 0x001a, 0, VR::FL, VM::M1, "LeftCortexCaudalMiddleFrontal" }, { 0x0199, 0x001b, 0, VR::FL, VM::M1, "LeftCortexCorpusCallosum" }, { 0x0199, 0x001c, 0, VR::FL, VM::M1, "LeftCortexCuneus" }, { 0x0199, 0x001d, 0, VR::FL, VM::M1, "LeftCortexEntorhinal" }, { 0x0199, 0x001e, 0, VR::FL, VM::M1, "LeftCortexFusiform" }, { 0x0199, 0x001f, 0, VR::FL, VM::M1, "LeftCortexInferiorParietal" }, { 0x0199, 0x0020, 0, VR::FL, VM::M1, "LeftCortexInferiorTemporal" }, { 0x0199, 0x0021, 0, VR::FL, VM::M1, "LeftCortexIsthmusCingulate" }, { 0x0199, 0x0022, 0, VR::FL, VM::M1, "LeftCortexLateralOccipital" }, { 0x0199, 0x0023, 0, VR::FL, VM::M1, "LeftCortexLateralOrbitoFrontal" }, { 0x0199, 0x0024, 0, VR::FL, VM::M1, "LeftCortexLingual" }, { 0x0199, 0x0025, 0, VR::FL, VM::M1, "LeftCortexMedialOrbitoFrontal" }, { 0x0199, 0x0026, 0, VR::FL, VM::M1, "LeftCortexMiddleTemporal" }, { 0x0199, 0x0027, 0, VR::FL, VM::M1, "LeftCortexParahippocampal" }, { 0x0199, 0x0028, 0, VR::FL, VM::M1, "LeftCortexParacentral" }, { 0x0199, 0x0029, 0, VR::FL, VM::M1, "LeftCortexParsOpercularis" }, { 0x0199, 0x002a, 0, VR::FL, VM::M1, "LeftCortexParsOrbitalis" }, { 0x0199, 0x002b, 0, VR::FL, VM::M1, "LeftCortexParsTriangularis" }, { 0x0199, 0x002c, 0, VR::FL, VM::M1, "LeftCortexPericalcarine" }, { 0x0199, 0x002d, 0, VR::FL, VM::M1, "LeftCortexPostcentral" }, { 0x0199, 0x002e, 0, VR::FL, VM::M1, "LeftCortexPosteriorCingulate" }, { 0x0199, 0x002f, 0, VR::FL, VM::M1, "LeftCortexPrecentral" }, { 0x0199, 0x0030, 0, VR::FL, VM::M1, "LeftCortexPrecuneus" }, { 0x0199, 0x0031, 0, VR::FL, VM::M1, "LeftCortexRostralAnteriorCingulate" }, { 0x0199, 0x0032, 0, VR::FL, VM::M1, "LeftCortexRostralMiddleFrontal" }, { 0x0199, 0x0033, 0, VR::FL, VM::M1, "LeftCortexSuperiorFrontal" }, { 0x0199, 0x0034, 0, VR::FL, VM::M1, "LeftCortexSuperiorParietal" }, { 0x0199, 0x0035, 0, VR::FL, VM::M1, "LeftCortexSuperiorTemporal" }, { 0x0199, 0x0036, 0, VR::FL, VM::M1, "LeftCortexSupramarginal" }, { 0x0199, 0x0037, 0, VR::FL, VM::M1, "LeftCortexFrontalPole" }, { 0x0199, 0x0038, 0, VR::FL, VM::M1, "LeftCortexTemporalPole" }, { 0x0199, 0x0039, 0, VR::FL, VM::M1, "LeftCortexTransvereTemporal" }, { 0x0199, 0x003a, 0, VR::FL, VM::M1, "LeftMeningie" }, }; const unsigned short Dict094TagHashTable[] = { 59, 62, 65, 68, 71, 74, 77, 80, 83, 58, 58, 58, 58, 58, 58, 86, 89, 92, 95, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 154, 159, 164, 169, 174, 179, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, 218, 221, 224, 0, 1, 8, 9, 1, 7, 8, 1, 6, 7, 1, 5, 6, 1, 4, 5, 1, 3, 4, 1, 2, 3, 1, 1, 2, 1, 0, 1, 1, 57, 58, 1, 56, 57, 1, 55, 56, 1, 54, 55, 1, 53, 54, 1, 52, 53, 1, 51, 52, 1, 50, 51, 1, 49, 50, 1, 48, 49, 1, 47, 48, 1, 46, 47, 1, 45, 46, 1, 44, 45, 1, 43, 44, 1, 42, 43, 1, 41, 42, 1, 40, 41, 1, 39, 40, 1, 38, 39, 1, 37, 38, 2, 30, 31, 36, 37, 2, 29, 30, 35, 36, 2, 28, 29, 34, 35, 2, 27, 28, 33, 34, 2, 26, 27, 32, 33, 2, 25, 26, 31, 32, 1, 24, 25, 1, 23, 24, 1, 22, 23, 1, 21, 22, 1, 20, 21, 1, 19, 20, 1, 18, 19, 1, 17, 18, 1, 16, 17, 1, 15, 16, 1, 14, 15, 1, 13, 14, 1, 12, 13, 1, 11, 12, 1, 10, 11, 1, 9, 10, }; const unsigned short Dict094KeyHashTable[] = { 59, 62, 65, 70, 58, 58, 73, 58, 58, 58, 58, 78, 58, 83, 90, 58, 93, 58, 58, 58, 98, 101, 110, 58, 58, 113, 118, 121, 124, 137, 140, 58, 58, 145, 148, 151, 154, 157, 58, 160, 165, 170, 58, 173, 58, 176, 179, 182, 58, 189, 192, 58, 195, 198, 201, 204, 207, 58, 0, 1, 32, 29219, 1, 26, 37936, 2, 25, 12509, 37, 359, 1, 31, 50906, 2, 20, 1827, 39, 56318, 2, 4, 42245, 5, 53591, 3, 1, 23122, 12, 53509, 49, 29994, 1, 33, 35442, 2, 14, 12481, 50, 23722, 1, 41, 54072, 4, 8, 15105, 10, 29066, 22, 23997, 28, 4346, 1, 7, 40322, 2, 24, 33479, 56, 377, 1, 16, 16966, 1, 55, 60667, 6, 15, 15086, 21, 27847, 42, 33410, 44, 64428, 45, 4974, 51, 49922, 1, 13, 27497, 2, 3, 33923, 23, 44328, 1, 30, 32146, 1, 19, 55030, 1, 53, 61500, 1, 48, 35668, 1, 0, 31945, 2, 35, 59641, 47, 8748, 2, 52, 7665, 57, 35730, 1, 18, 34590, 1, 2, 50817, 1, 46, 57780, 1, 40, 26071, 3, 9, 53085, 34, 35456, 43, 2500, 1, 6, 47123, 1, 36, 23674, 1, 17, 24238, 1, 54, 7127, 1, 29, 33569, 1, 38, 62048, 2, 11, 5100, 27, 16416, }; vtkDICOMDictionary::Dict Dict094Data = { "NQLeft", 58, 58, Dict094TagHashTable, Dict094KeyHashTable, Dict094Contents }; // ----- 3DHISTECH REGION MAPS ----- const DictEntry Dict095Contents[] = { { 0x0029, 0x0005, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0006, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict095TagHashTable[] = { 4, 3, 7, 0, 1, 2, 16, 2, 0, 5, 1, 6, }; const unsigned short Dict095KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict095Data = { "3DHISTECH REGION MAPS", 3, 3, Dict095TagHashTable, Dict095KeyHashTable, Dict095Contents }; // ----- iCAD PK Study ----- const DictEntry Dict096Contents[] = { { 0x3335, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0004, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0005, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000a, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000b, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000c, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000d, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000e, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x000f, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0013, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0014, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0018, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0019, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x001a, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x001b, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict096TagHashTable[] = { 29, 32, 35, 38, 41, 44, 47, 50, 53, 58, 63, 68, 28, 28, 28, 28, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100, 103, 106, 0, 1, 13, 13, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 2, 5, 5, 25, 25, 2, 4, 4, 24, 24, 2, 7, 7, 27, 27, 2, 6, 6, 26, 26, 1, 17, 17, 1, 16, 16, 1, 19, 19, 1, 18, 18, 1, 21, 21, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 9, 9, 1, 8, 8, 1, 11, 11, 1, 10, 10, }; const unsigned short Dict096KeyHashTable[] = { 28, 28, 28, 28, 28, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 28, 0, 192, 1, 192, 2, 192, 3, 192, 4, 192, 5, 192, 6, 192, 7, 192, 8, 192, 9, 192, 10, 192, 11, 192, 12, 192, 13, 192, 14, 192, 15, 192, 16, 192, 17, 192, 18, 192, 19, 192, 20, 192, 21, 192, 22, 192, 23, 192, 24, 192, 25, 192, 26, 192, 27, 192, }; vtkDICOMDictionary::Dict Dict096Data = { "iCAD PK Study", 28, 28, Dict096TagHashTable, Dict096KeyHashTable, Dict096Contents }; // ----- SPI-P-Private_ICS Release 1;3 ----- const DictEntry Dict097Contents[] = { { 0x0029, 0x0000, 0, VR::ST, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict097TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict097KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict097Data = { "SPI-P-Private_ICS Release 1;3", 2, 2, Dict097TagHashTable, Dict097KeyHashTable, Dict097Contents }; // ----- SPI-P-Private_ICS Release 1;2 ----- const DictEntry Dict098Contents[] = { { 0x0029, 0x0000, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0002, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0003, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0004, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0005, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x00a0, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x00a1, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00a2, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x00a3, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x00a5, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x00a6, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x00d9, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict098TagHashTable[] = { 15, 18, 23, 28, 14, 31, 14, 14, 14, 14, 34, 37, 42, 47, 0, 1, 3, 3, 2, 2, 2, 12, 166, 2, 5, 5, 11, 165, 1, 4, 4, 1, 13, 217, 1, 10, 163, 2, 6, 48, 9, 162, 2, 1, 1, 8, 161, 2, 0, 0, 7, 160, }; const unsigned short Dict098KeyHashTable[] = { 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 0, 384, 1, 384, 2, 384, 3, 384, 4, 384, 5, 384, 6, 384, 7, 384, 8, 384, 9, 384, 10, 384, 11, 384, 12, 384, 13, 384, }; vtkDICOMDictionary::Dict Dict098Data = { "SPI-P-Private_ICS Release 1;2", 14, 14, Dict098TagHashTable, Dict098KeyHashTable, Dict098Contents }; // ----- SPI-P-Private_ICS Release 1;1 ----- const DictEntry Dict099Contents[] = { { 0x0029, 0x0000, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0005, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x0006, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00c0, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x00c1, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00cb, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00cc, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00cd, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x00d0, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x00d1, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x00d2, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00d3, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00d4, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00d5, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00d6, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict099TagHashTable[] = { 18, 17, 17, 17, 21, 17, 17, 24, 27, 30, 35, 42, 45, 48, 55, 17, 60, 0, 1, 15, 213, 1, 7, 203, 1, 0, 0, 1, 4, 33, 2, 3, 32, 8, 204, 3, 1, 5, 9, 205, 12, 210, 1, 13, 211, 1, 10, 208, 3, 2, 6, 5, 192, 11, 209, 2, 6, 193, 16, 214, 1, 14, 212, }; const unsigned short Dict099KeyHashTable[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 17, 17, 17, 17, 0, 17, 0, 316, 1, 316, 2, 316, 3, 316, 4, 316, 5, 316, 6, 316, 7, 316, 8, 316, 9, 316, 10, 316, 11, 316, 12, 316, 13, 316, 14, 316, 15, 316, 16, 316, }; vtkDICOMDictionary::Dict Dict099Data = { "SPI-P-Private_ICS Release 1;1", 17, 17, Dict099TagHashTable, Dict099KeyHashTable, Dict099Contents }; // ----- SIEMENS CT VA0 GEN ----- const DictEntry Dict100Contents[] = { { 0x0019, 0x0010, 0, VR::DS, VM::M1, "SourceSideCollimatorAperture" }, { 0x0019, 0x0011, 0, VR::DS, VM::M1, "DetectorSideCollimatorAperture" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "ExposureTime" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "ExposureCurrent" }, { 0x0019, 0x0025, 0, VR::DS, VM::M1, "KVPGeneratorPowerCurrent" }, { 0x0019, 0x0026, 0, VR::DS, VM::M1, "GeneratorVoltage" }, { 0x0019, 0x0040, 0, VR::UL, VM::M1, "MasterControlMask" }, { 0x0019, 0x0042, 0, VR::US, VM::M5, "ProcessingMask" }, { 0x0019, 0x0044, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x0045, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x0062, 0, VR::IS, VM::M1, "NumberOfVirtuellChannels" }, { 0x0019, 0x0070, 0, VR::IS, VM::M1, "NumberOfReadings" }, { 0x0019, 0x0071, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::IS, VM::M1, "NumberOfProjections" }, { 0x0019, 0x0075, 0, VR::IS, VM::M1, "NumberOfBytes" }, { 0x0019, 0x0080, 0, VR::LO, VM::M1, "ReconstructionAlgorithmSet" }, { 0x0019, 0x0081, 0, VR::LO, VM::M1, "ReconstructionAlgorithmIndex" }, { 0x0019, 0x0082, 0, VR::LO, VM::M1, "RegenerationSoftwareVersion" }, { 0x0019, 0x0088, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::IS, VM::M1, "RotationAngle" }, { 0x0021, 0x0011, 0, VR::IS, VM::M1, "StartAngle" }, { 0x0021, 0x0020, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x0030, 0, VR::IS, VM::M1, "TopogramTubePosition" }, { 0x0021, 0x0032, 0, VR::DS, VM::M1, "LengthOfTopogram" }, { 0x0021, 0x0034, 0, VR::DS, VM::M1, "TopogramCorrectionFactor" }, { 0x0021, 0x0036, 0, VR::DS, VM::M1, "MaximumTablePosition" }, { 0x0021, 0x0040, 0, VR::IS, VM::M1, "TableMoveDirectionCode" }, { 0x0021, 0x0045, 0, VR::IS, VM::M1, "VOIStartRow" }, { 0x0021, 0x0046, 0, VR::IS, VM::M1, "VOIStopRow" }, { 0x0021, 0x0047, 0, VR::IS, VM::M1, "VOIStartColumn" }, { 0x0021, 0x0048, 0, VR::IS, VM::M1, "VOIStopColumn" }, { 0x0021, 0x0049, 0, VR::IS, VM::M1, "VOIStartSlice" }, { 0x0021, 0x004a, 0, VR::IS, VM::M1, "VOIStopSlice" }, { 0x0021, 0x0050, 0, VR::IS, VM::M1, "VectorStartRow" }, { 0x0021, 0x0051, 0, VR::IS, VM::M1, "VectorRowStep" }, { 0x0021, 0x0052, 0, VR::IS, VM::M1, "VectorStartColumn" }, { 0x0021, 0x0053, 0, VR::IS, VM::M1, "VectorColumnStep" }, { 0x0021, 0x0060, 0, VR::IS, VM::M1, "RangeTypeCode" }, { 0x0021, 0x0062, 0, VR::IS, VM::M1, "ReferenceTypeCode" }, { 0x0021, 0x0070, 0, VR::DS, VM::M3, "ObjectOrientation" }, { 0x0021, 0x0072, 0, VR::DS, VM::M3, "LightOrientation" }, { 0x0021, 0x0075, 0, VR::DS, VM::M1, "LightBrightness" }, { 0x0021, 0x0076, 0, VR::DS, VM::M1, "LightContrast" }, { 0x0021, 0x007a, 0, VR::IS, VM::M2, "OverlayThreshold" }, { 0x0021, 0x007b, 0, VR::IS, VM::M2, "SurfaceThreshold" }, { 0x0021, 0x007c, 0, VR::IS, VM::M2, "GreyScaleThreshold" }, { 0x0021, 0x00a0, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x00a2, 0, VR::CS, VM::M1, "" }, { 0x0021, 0x00a7, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict100TagHashTable[] = { 50, 55, 49, 58, 61, 64, 67, 74, 83, 92, 95, 98, 49, 49, 103, 108, 113, 116, 49, 123, 49, 126, 49, 129, 132, 49, 49, 49, 49, 49, 49, 135, 49, 140, 145, 49, 148, 151, 49, 154, 49, 157, 162, 165, 170, 49, 49, 173, 176, 0, 2, 18, 136, 19, 16, 1, 21, 32, 1, 27, 69, 1, 28, 70, 1, 29, 71, 3, 11, 112, 17, 130, 30, 72, 4, 3, 33, 12, 113, 16, 129, 31, 73, 4, 1, 17, 2, 32, 15, 128, 32, 74, 1, 0, 16, 1, 13, 116, 2, 4, 37, 14, 117, 2, 5, 38, 33, 80, 2, 34, 81, 37, 96, 1, 35, 82, 3, 22, 48, 36, 83, 38, 98, 1, 23, 50, 1, 24, 52, 1, 25, 54, 1, 10, 98, 2, 39, 112, 47, 162, 2, 40, 114, 46, 160, 1, 48, 167, 1, 41, 117, 1, 42, 118, 1, 6, 64, 2, 7, 66, 43, 122, 1, 44, 123, 2, 8, 68, 45, 124, 1, 9, 69, 1, 26, 64, 1, 20, 17, }; const unsigned short Dict100KeyHashTable[] = { 50, 49, 53, 56, 61, 64, 49, 49, 49, 69, 72, 49, 49, 49, 77, 80, 49, 49, 83, 88, 91, 96, 99, 102, 105, 110, 49, 49, 113, 49, 116, 49, 125, 49, 130, 49, 133, 138, 49, 49, 143, 49, 49, 49, 49, 164, 49, 49, 49, 0, 1, 43, 46804, 1, 15, 64152, 2, 5, 59211, 44, 25016, 1, 28, 35805, 2, 4, 51560, 17, 8276, 1, 31, 62024, 2, 30, 45005, 41, 60812, 1, 10, 53144, 1, 27, 28842, 2, 14, 16856, 20, 42216, 1, 6, 59835, 2, 23, 32641, 37, 63211, 1, 36, 14973, 1, 13, 50989, 1, 32, 53010, 2, 16, 18606, 45, 23145, 1, 7, 27525, 1, 2, 547, 4, 25, 49442, 35, 24950, 39, 41322, 40, 11003, 2, 3, 50995, 34, 30732, 1, 33, 48764, 2, 24, 27665, 38, 48797, 2, 1, 8557, 29, 37514, 10, 0, 6337, 8, 109, 9, 109, 12, 109, 18, 109, 21, 109, 26, 17496, 46, 109, 47, 109, 48, 109, 4, 11, 19155, 19, 11519, 22, 47014, 42, 29886, }; vtkDICOMDictionary::Dict Dict100Data = { "SIEMENS CT VA0 GEN", 49, 49, Dict100TagHashTable, Dict100KeyHashTable, Dict100Contents }; // ----- SPI-P-Private_ICS Release 1;5 ----- const DictEntry Dict101Contents[] = { { 0x0029, 0x0050, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0055, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict101TagHashTable[] = { 3, 6, 0, 1, 0, 80, 1, 1, 85, }; const unsigned short Dict101KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict101Data = { "SPI-P-Private_ICS Release 1;5", 2, 2, Dict101TagHashTable, Dict101KeyHashTable, Dict101Contents }; // ----- SPI-P-Private_ICS Release 1;4 ----- const DictEntry Dict102Contents[] = { { 0x0029, 0x00d6, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00d7, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00d8, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00d9, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00da, 0, VR::FL, VM::M1, "" }, { 0x0029, 0x00dc, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00dd, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x00e0, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict102TagHashTable[] = { 9, 8, 12, 17, 20, 23, 26, 29, 0, 1, 4, 218, 2, 2, 216, 7, 224, 1, 3, 217, 1, 0, 214, 1, 1, 215, 1, 5, 220, 1, 6, 221, }; const unsigned short Dict102KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict102Data = { "SPI-P-Private_ICS Release 1;4", 8, 8, Dict102TagHashTable, Dict102KeyHashTable, Dict102Contents }; // ----- SPI-P-GV-CT Release 1 ----- const DictEntry Dict103Contents[] = { { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0060, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0070, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0075, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x000a, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::TM, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0061, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0063, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0065, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a2, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0060, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0070, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0080, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0090, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x00a0, 0, VR::US, VM::M1, "" }, { 0x0021, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x00a2, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x00a3, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x00a4, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x00b0, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x00c0, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0031, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0032, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0033, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x00d0, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x00d1, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict103TagHashTable[] = { 57, 60, 69, 74, 56, 56, 56, 56, 79, 86, 56, 93, 98, 101, 56, 56, 106, 117, 126, 131, 56, 56, 56, 140, 143, 148, 153, 158, 56, 56, 56, 56, 167, 56, 56, 170, 56, 56, 56, 56, 173, 176, 179, 182, 56, 56, 56, 56, 187, 56, 56, 192, 56, 56, 56, 56, 0, 1, 35, 80, 4, 3, 48, 15, 32, 32, 32, 47, 16, 2, 31, 177, 46, 192, 2, 30, 176, 52, 128, 3, 7, 112, 17, 96, 36, 96, 3, 0, 0, 14, 16, 18, 97, 2, 19, 99, 39, 144, 1, 20, 100, 2, 8, 117, 21, 101, 5, 4, 64, 12, 9, 16, 80, 29, 163, 43, 163, 4, 11, 8, 28, 162, 33, 48, 42, 162, 2, 27, 161, 41, 161, 4, 13, 10, 26, 160, 40, 160, 53, 144, 1, 44, 164, 2, 37, 112, 49, 49, 2, 1, 16, 48, 48, 2, 51, 51, 54, 208, 4, 9, 128, 25, 144, 50, 50, 55, 209, 1, 5, 80, 1, 45, 176, 1, 34, 64, 1, 2, 32, 1, 24, 129, 2, 10, 144, 23, 128, 2, 6, 96, 22, 112, 1, 38, 128, }; const unsigned short Dict103KeyHashTable[] = { 56, 56, 56, 56, 56, 57, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 0, 96, 1, 96, 2, 96, 3, 96, 4, 96, 5, 96, 6, 96, 7, 96, 8, 96, 9, 96, 10, 96, 11, 96, 12, 96, 13, 96, 14, 96, 15, 96, 16, 96, 17, 96, 18, 96, 19, 96, 20, 96, 21, 96, 22, 96, 23, 96, 24, 96, 25, 96, 26, 96, 27, 96, 28, 96, 29, 96, 30, 96, 31, 96, 32, 96, 33, 96, 34, 96, 35, 96, 36, 96, 37, 96, 38, 96, 39, 96, 40, 96, 41, 96, 42, 96, 43, 96, 44, 96, 45, 96, 46, 96, 47, 96, 48, 96, 49, 96, 50, 96, 51, 96, 52, 96, 53, 96, 54, 96, 55, 96, }; vtkDICOMDictionary::Dict Dict103Data = { "SPI-P-GV-CT Release 1", 56, 56, Dict103TagHashTable, Dict103KeyHashTable, Dict103Contents }; // ----- GEMS_ADWSoft_DPO1 ----- const DictEntry Dict104Contents[] = { { 0x0039, 0x0095, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict104TagHashTable[] = { 2, 0, 1, 0, 149, }; const unsigned short Dict104KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict104Data = { "GEMS_ADWSoft_DPO1", 1, 1, Dict104TagHashTable, Dict104KeyHashTable, Dict104Contents }; // ----- PHILIPS MR R5.5/PART ----- const DictEntry Dict105Contents[] = { { 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" }, }; const unsigned short Dict105TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict105KeyHashTable[] = { 2, 0, 1, 0, 16313, }; vtkDICOMDictionary::Dict Dict105Data = { "PHILIPS MR R5.5/PART", 1, 1, Dict105TagHashTable, Dict105KeyHashTable, Dict105Contents }; // ----- iCAD PK ----- const DictEntry Dict106Contents[] = { { 0x3335, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0018, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x002a, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0034, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0035, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x003b, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0051, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0052, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0053, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0054, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0055, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0056, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0057, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0070, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0071, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0072, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0073, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0074, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0075, 0, VR::UN, VM::M1, "" }, { 0x3335, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0081, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0082, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0083, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0084, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0085, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0086, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0087, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0088, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0089, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008a, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008b, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008c, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008d, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008e, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x008f, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0091, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0092, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0093, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0094, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x0095, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a0, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a1, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a2, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a3, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a4, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a5, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a6, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a7, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a8, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00a9, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00aa, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00ab, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00ac, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00ad, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00ae, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00af, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00b0, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00b1, 0, VR::LO, VM::M1, "" }, { 0x3335, 0x00c0, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict106TagHashTable[] = { 66, 73, 80, 65, 65, 65, 83, 86, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 65, 65, 65, 65, 65, 65, 65, 135, 140, 145, 150, 157, 162, 167, 172, 177, 180, 183, 186, 189, 192, 195, 198, 201, 206, 209, 212, 215, 220, 223, 226, 229, 65, 232, 65, 65, 65, 65, 65, 65, 235, 238, 241, 0, 3, 7, 53, 21, 115, 63, 177, 3, 6, 52, 22, 116, 62, 176, 1, 23, 117, 1, 57, 171, 2, 5, 42, 56, 170, 1, 55, 169, 1, 54, 168, 1, 61, 175, 1, 60, 174, 1, 59, 173, 1, 58, 172, 1, 49, 163, 1, 48, 162, 1, 47, 161, 1, 46, 160, 1, 53, 167, 1, 52, 166, 1, 51, 165, 2, 4, 24, 50, 164, 2, 0, 16, 10, 80, 2, 11, 81, 43, 147, 2, 12, 82, 42, 146, 3, 1, 21, 13, 83, 41, 145, 2, 14, 84, 40, 144, 2, 3, 23, 15, 85, 2, 2, 22, 16, 86, 2, 17, 87, 45, 149, 1, 44, 148, 1, 35, 139, 1, 34, 138, 1, 33, 137, 1, 32, 136, 1, 39, 143, 1, 38, 142, 1, 37, 141, 2, 9, 64, 36, 140, 1, 27, 131, 1, 26, 130, 1, 25, 129, 2, 24, 128, 64, 192, 1, 31, 135, 1, 30, 134, 1, 29, 133, 1, 28, 132, 1, 8, 59, 1, 18, 112, 1, 19, 113, 1, 20, 114, }; const unsigned short Dict106KeyHashTable[] = { 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 65, 0, 82, 1, 82, 2, 82, 3, 82, 4, 82, 5, 82, 6, 82, 7, 82, 8, 82, 9, 82, 10, 82, 11, 82, 12, 82, 13, 82, 14, 82, 15, 82, 16, 82, 17, 82, 18, 82, 19, 82, 20, 82, 21, 82, 22, 82, 23, 82, 24, 82, 25, 82, 26, 82, 27, 82, 28, 82, 29, 82, 30, 82, 31, 82, 32, 82, 33, 82, 34, 82, 35, 82, 36, 82, 37, 82, 38, 82, 39, 82, 40, 82, 41, 82, 42, 82, 43, 82, 44, 82, 45, 82, 46, 82, 47, 82, 48, 82, 49, 82, 50, 82, 51, 82, 52, 82, 53, 82, 54, 82, 55, 82, 56, 82, 57, 82, 58, 82, 59, 82, 60, 82, 61, 82, 62, 82, 63, 82, 64, 82, }; vtkDICOMDictionary::Dict Dict106Data = { "iCAD PK", 65, 65, Dict106TagHashTable, Dict106KeyHashTable, Dict106Contents }; // ----- AGFA_ADC_Compact ----- const DictEntry Dict107Contents[] = { { 0x0019, 0x0030, 0, VR::ST, VM::M1, "SetOfDestinationTypes" }, { 0x0019, 0x0040, 0, VR::ST, VM::M1, "SetOfDestinationIds" }, { 0x0019, 0x0050, 0, VR::ST, VM::M1, "SetOfProcessingCodes" }, { 0x0019, 0x0060, 0, VR::US, VM::M1, "NumberOfSeriesInStudy" }, { 0x0019, 0x0061, 0, VR::US, VM::M1, "SessionNumber" }, { 0x0019, 0x0062, 0, VR::SH, VM::M1, "IDStationName" }, { 0x0019, 0x0070, 0, VR::US, VM::M1, "NumberOfImagesInSeries" }, { 0x0019, 0x0071, 0, VR::US, VM::M1, "BreakCondition" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "WaitOrHoldFlag" }, { 0x0019, 0x0073, 0, VR::US, VM::M1, "ScanResFlag" }, { 0x0019, 0x0074, 0, VR::SH, VM::M1, "OperationCode" }, { 0x0019, 0x0095, 0, VR::CS, VM::M1, "ImageQuality" }, }; const unsigned short Dict107TagHashTable[] = { 13, 20, 23, 12, 26, 29, 12, 12, 32, 35, 38, 43, 0, 3, 2, 80, 3, 96, 10, 116, 1, 4, 97, 1, 5, 98, 1, 1, 64, 1, 0, 48, 1, 6, 112, 1, 7, 113, 2, 8, 114, 11, 149, 1, 9, 115, }; const unsigned short Dict107KeyHashTable[] = { 13, 16, 21, 12, 12, 24, 31, 12, 34, 37, 40, 43, 0, 1, 8, 42909, 2, 7, 13980, 11, 11564, 1, 3, 34741, 3, 2, 8609, 5, 22700, 10, 44977, 1, 4, 3601, 1, 1, 30520, 1, 0, 24295, 1, 9, 47443, 1, 6, 23732, }; vtkDICOMDictionary::Dict Dict107Data = { "AGFA_ADC_Compact", 12, 12, Dict107TagHashTable, Dict107KeyHashTable, Dict107Contents }; // ----- SIEMENS SMS-AX ACQ 1.0 ----- const DictEntry Dict108Contents[] = { { 0x0021, 0x0000, 0, VR::US, VM::M1, "AcquisitionType" }, { 0x0021, 0x0001, 0, VR::US, VM::M1, "AcquisitionMode" }, { 0x0021, 0x0002, 0, VR::US, VM::M1, "FootswitchIndex" }, { 0x0021, 0x0003, 0, VR::US, VM::M1, "AcquisitionRoom" }, { 0x0021, 0x0004, 0, VR::SL, VM::M1, "CurrentTimeProduct" }, { 0x0021, 0x0005, 0, VR::SL, VM::M1, "ImagerReceptorDose" }, { 0x0021, 0x0006, 0, VR::SL, VM::M1, "SkinDosePercent" }, { 0x0021, 0x0007, 0, VR::SL, VM::M1, "SkinDoseAccumulation" }, { 0x0021, 0x0008, 0, VR::SL, VM::M1, "SkinDoseRate" }, { 0x0021, 0x0009, 0, VR::UL, VM::M1, "ImpacFilename" }, { 0x0021, 0x000A, 0, VR::UL, VM::M1, "CopperFilter" }, { 0x0021, 0x000B, 0, VR::US, VM::M1, "MeasuringField" }, { 0x0021, 0x000C, 0, VR::SS, VM::M3, "PostBlankingCircle" }, { 0x0021, 0x000D, 0, VR::SS, VM::M2T2N, "DynaAngles" }, { 0x0021, 0x000E, 0, VR::SS, VM::M1, "TotalSteps" }, { 0x0021, 0x000F, 0, VR::SL, VM::M4TN, "DynaXRayInfo" }, { 0x0021, 0x0010, 0, VR::US, VM::M1, "ModalityLUTInputGamma" }, { 0x0021, 0x0011, 0, VR::US, VM::M1, "ModalityLUTOutputGamma" }, { 0x0021, 0x0012, 0, VR::OB, VM::M1, "SHSTPAR" }, { 0x0021, 0x0013, 0, VR::US, VM::M1, "AcquisitionZoom" }, { 0x0021, 0x0014, 0, VR::SS, VM::M1, "DynaAngulationStep" }, { 0x0021, 0x0015, 0, VR::US, VM::M1, "DDOValue" }, { 0x0021, 0x0016, 0, VR::US, VM::M1, "DRSingleFlag" }, { 0x0021, 0x0017, 0, VR::SL, VM::M1, "SourcetoIsocenter" }, { 0x0021, 0x0018, 0, VR::US, VM::M1, "PressureData" }, { 0x0021, 0x0019, 0, VR::SL, VM::M1, "ECGIndexArray" }, { 0x0021, 0x001A, 0, VR::US, VM::M1, "FDFlag" }, { 0x0021, 0x001B, 0, VR::OB, VM::M1, "SHZOOM" }, { 0x0021, 0x001C, 0, VR::OB, VM::M1, "SHCOLPAR" }, { 0x0021, 0x001D, 0, VR::US, VM::M1, "KFactor" }, { 0x0021, 0x001E, 0, VR::US, VM::M8, "EVE" }, { 0x0021, 0x001F, 0, VR::SL, VM::M1, "TotalSceneTime" }, { 0x0021, 0x0020, 0, VR::US, VM::M1, "RestoreFlag" }, { 0x0021, 0x0021, 0, VR::US, VM::M1, "StandMovementFlag" }, { 0x0021, 0x0022, 0, VR::US, VM::M1, "FDRows" }, { 0x0021, 0x0023, 0, VR::US, VM::M1, "FDColumns" }, { 0x0021, 0x0024, 0, VR::US, VM::M1, "TableMovementFlag" }, { 0x0021, 0x0026, 0, VR::DS, VM::M1, "CrispyXPIFilterValue" }, { 0x0021, 0x0027, 0, VR::US, VM::M1, "ICStentFlag" }, { 0x0021, 0x0028, 0, VR::SQ, VM::M1, "GammaLUTSequence" }, { 0x0021, 0x0029, 0, VR::DS, VM::M1, "AcquisitionSceneTime" }, { 0x0021, 0x002A, 0, VR::IS, VM::M1, "ThreeDCardiacPhaseCenter" }, { 0x0021, 0x002B, 0, VR::IS, VM::M1, "ThreeDCardiacPhaseWidth" }, { 0x0021, 0x0030, 0, VR::OB, VM::M1, "OrganProgramInfo" }, { 0x0021, 0x003A, 0, VR::IS, VM::M1, "DDOKernelsize" }, { 0x0021, 0x003B, 0, VR::IS, VM::M1, "mAsModulation" }, { 0x0021, 0x003C, 0, VR::DT, VM::M1TN, "ThreeDRPeakReferenceTime" }, { 0x0021, 0x003D, 0, VR::SL, VM::M1TN, "ECGFrameTimeVector" }, { 0x0021, 0x003E, 0, VR::SL, VM::M1, "ECGStartTimeOfRun" }, { 0x0021, 0x0040, 0, VR::US, VM::M3, "GammaLUTDescriptor" }, { 0x0021, 0x0041, 0, VR::LO, VM::M1, "GammaLUTType" }, { 0x0021, 0x0042, 0, VR::US, VM::M1TN, "GammaLUTData" }, { 0x0021, 0x0043, 0, VR::US, VM::M1, "GlobalGain" }, { 0x0021, 0x0044, 0, VR::US, VM::M1, "GlobalOffset" }, { 0x0021, 0x0045, 0, VR::US, VM::M1, "DIPPMode" }, { 0x0021, 0x0046, 0, VR::US, VM::M1, "ArtisSystemType" }, { 0x0021, 0x0047, 0, VR::US, VM::M1, "ArtisTableType" }, { 0x0021, 0x0048, 0, VR::US, VM::M1, "ArtisTableTopType" }, { 0x0021, 0x0049, 0, VR::US, VM::M1, "WaterValue" }, { 0x0021, 0x0051, 0, VR::DS, VM::M1, "ThreeDPositionerPrimaryStartAngle" }, { 0x0021, 0x0052, 0, VR::DS, VM::M1, "ThreeDPositionerSecondaryStartAngle" }, { 0x0021, 0x0053, 0, VR::SS, VM::M3, "StandPosition" }, { 0x0021, 0x0054, 0, VR::SS, VM::M1, "RotationAngle" }, { 0x0021, 0x0055, 0, VR::US, VM::M1, "ImageRotation" }, { 0x0021, 0x0056, 0, VR::SS, VM::M3, "TableCoordinates" }, { 0x0021, 0x0057, 0, VR::SS, VM::M3, "IsocenterTablePosition" }, { 0x0021, 0x0058, 0, VR::DS, VM::M1, "TableObjectDistance" }, { 0x0021, 0x0059, 0, VR::FL, VM::M12TN, "CarmCoordinateSystem" }, { 0x0021, 0x005A, 0, VR::FL, VM::M6TN, "RobotAxes" }, { 0x0021, 0x005B, 0, VR::FL, VM::M12, "TableCoordinateSystem" }, { 0x0021, 0x005C, 0, VR::FL, VM::M12, "PatientCoordinateSystem" }, { 0x0021, 0x005D, 0, VR::SS, VM::M1TN, "Angulation" }, { 0x0021, 0x005E, 0, VR::SS, VM::M1TN, "Orbital" }, { 0x0021, 0x0061, 0, VR::SS, VM::M1, "LargeVolumeOverlap" }, { 0x0021, 0x0062, 0, VR::US, VM::M1, "ReconstructionPreset" }, { 0x0021, 0x0063, 0, VR::SS, VM::M1, "ThreeDStartAngle" }, { 0x0021, 0x0064, 0, VR::SL, VM::M1, "ThreeDPlannedAngle" }, { 0x0021, 0x0065, 0, VR::SL, VM::M1, "ThreeDRotationPlaneAlpha" }, { 0x0021, 0x0066, 0, VR::SL, VM::M1, "ThreeDRotationPlaneBeta" }, { 0x0021, 0x0067, 0, VR::SL, VM::M1, "ThreeDFirstImageAngle" }, { 0x0021, 0x0068, 0, VR::SS, VM::M1TN, "ThreeDTriggerAngle" }, { 0x0021, 0x0071, 0, VR::DS, VM::M1TN, "DetectorRotation" }, { 0x0021, 0x0072, 0, VR::SS, VM::M1TN, "PhysicalDetectorRotation" }, { 0x0021, 0x0081, 0, VR::SS, VM::M1, "TableTilt" }, { 0x0021, 0x0082, 0, VR::SS, VM::M1, "TableRotation" }, { 0x0021, 0x0083, 0, VR::SS, VM::M1, "TableCradleTilt" }, { 0x0021, 0x00A0, 0, VR::OB, VM::M1, "Crispy1Container" }, { 0x0021, 0x00A3, 0, VR::SQ, VM::M1, "ThreeDCardiacTriggerSequence" }, { 0x0021, 0x00A4, 0, VR::DT, VM::M1, "ThreeDFrameReferenceDateTime" }, { 0x0021, 0x00A5, 0, VR::FD, VM::M1, "ThreeDCardiacTriggerDelayTime" }, { 0x0021, 0x00A6, 0, VR::FD, VM::M1, "ThreeDRRIntervalTimeMeasured" }, }; const unsigned short Dict108TagHashTable[] = { 92, 95, 98, 101, 91, 104, 109, 114, 119, 124, 129, 134, 139, 142, 145, 91, 91, 148, 91, 91, 91, 91, 151, 154, 157, 160, 163, 168, 173, 178, 183, 186, 191, 196, 201, 206, 211, 214, 219, 222, 225, 230, 233, 238, 243, 248, 251, 254, 257, 260, 263, 266, 269, 272, 275, 278, 281, 284, 287, 290, 293, 296, 299, 302, 91, 305, 308, 311, 314, 317, 322, 327, 332, 91, 91, 91, 91, 91, 91, 91, 91, 335, 338, 91, 91, 91, 91, 91, 91, 91, 91, 0, 1, 33, 33, 1, 32, 32, 1, 35, 35, 1, 34, 34, 2, 36, 36, 49, 64, 2, 38, 39, 50, 65, 2, 37, 38, 51, 66, 2, 40, 41, 52, 67, 2, 39, 40, 53, 68, 2, 42, 43, 54, 69, 2, 41, 42, 55, 70, 1, 56, 71, 1, 57, 72, 1, 58, 73, 1, 43, 48, 1, 59, 81, 1, 60, 82, 1, 61, 83, 1, 62, 84, 2, 45, 59, 63, 85, 2, 44, 58, 64, 86, 2, 47, 61, 65, 87, 2, 46, 60, 66, 88, 1, 67, 89, 2, 48, 62, 68, 90, 2, 1, 1, 69, 91, 2, 0, 0, 70, 92, 2, 3, 3, 71, 93, 2, 2, 2, 72, 94, 1, 5, 5, 2, 4, 4, 87, 163, 1, 7, 7, 1, 6, 6, 2, 9, 9, 86, 160, 1, 8, 8, 2, 11, 11, 90, 166, 2, 10, 10, 89, 165, 2, 13, 13, 88, 164, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 17, 17, 1, 16, 16, 1, 19, 19, 1, 18, 18, 1, 21, 21, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 25, 25, 1, 24, 24, 1, 27, 27, 1, 26, 26, 1, 29, 29, 1, 28, 28, 1, 31, 31, 1, 30, 30, 1, 73, 97, 1, 74, 98, 1, 75, 99, 1, 76, 100, 2, 77, 101, 85, 131, 2, 78, 102, 84, 130, 2, 79, 103, 83, 129, 1, 80, 104, 1, 81, 113, 1, 82, 114, }; const unsigned short Dict108KeyHashTable[] = { 92, 95, 91, 98, 103, 91, 91, 106, 111, 91, 91, 91, 114, 91, 119, 122, 91, 91, 125, 128, 91, 133, 91, 136, 139, 91, 146, 149, 152, 91, 155, 158, 161, 91, 164, 167, 170, 91, 91, 91, 173, 180, 91, 183, 188, 191, 196, 201, 204, 213, 91, 91, 91, 91, 218, 91, 221, 224, 233, 236, 239, 242, 249, 252, 255, 260, 91, 263, 268, 273, 91, 91, 276, 281, 286, 291, 298, 301, 91, 91, 91, 304, 307, 310, 91, 91, 317, 322, 325, 91, 91, 0, 1, 44, 61096, 1, 73, 51808, 2, 13, 5400, 88, 39263, 1, 17, 41431, 2, 12, 16340, 50, 2600, 1, 18, 31046, 2, 46, 40274, 77, 35265, 1, 48, 1943, 1, 78, 22026, 1, 19, 17203, 2, 47, 25130, 52, 27142, 1, 82, 44181, 1, 55, 48232, 3, 1, 12065, 9, 25000, 62, 11244, 1, 40, 36803, 1, 11, 39099, 1, 75, 47246, 1, 64, 22814, 1, 58, 42354, 1, 23, 30495, 1, 63, 1506, 1, 36, 37821, 1, 32, 28557, 3, 34, 34934, 86, 50865, 89, 36790, 1, 68, 48041, 2, 6, 17041, 29, 10860, 1, 26, 30151, 2, 70, 51534, 87, 49240, 2, 5, 26849, 72, 11084, 1, 42, 58750, 4, 67, 14207, 71, 29189, 76, 36430, 84, 34327, 2, 15, 33808, 60, 29179, 1, 79, 8519, 1, 30, 28727, 4, 2, 11050, 25, 48534, 31, 3703, 35, 20789, 1, 4, 53338, 1, 80, 63475, 1, 37, 28149, 3, 0, 14953, 22, 38158, 69, 38951, 1, 51, 61531, 1, 27, 44498, 2, 28, 60947, 66, 42461, 1, 41, 43931, 2, 38, 18946, 39, 61225, 2, 33, 46400, 61, 8272, 1, 54, 60950, 2, 8, 235, 85, 26615, 2, 59, 43335, 83, 51283, 2, 24, 43786, 49, 18166, 3, 43, 17775, 45, 63317, 65, 37721, 1, 81, 25817, 1, 57, 29672, 1, 21, 6328, 1, 3, 14043, 3, 10, 12339, 56, 46541, 74, 48997, 2, 14, 23334, 53, 3461, 1, 16, 20347, 3, 7, 34902, 20, 23237, 90, 10165, }; vtkDICOMDictionary::Dict Dict108Data = { "SIEMENS SMS-AX ACQ 1.0", 91, 91, Dict108TagHashTable, Dict108KeyHashTable, Dict108Contents }; // ----- SPI-P-CTBE-Private Release 1 ----- const DictEntry Dict109Contents[] = { { 0x0021, 0x0000, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict109TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict109KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict109Data = { "SPI-P-CTBE-Private Release 1", 1, 1, Dict109TagHashTable, Dict109KeyHashTable, Dict109Contents }; // ----- SIEMENS SYNGO VOLUME ----- const DictEntry Dict110Contents[] = { { 0x0029, 0x0012, 0, VR::US, VM::M1, "Slices" }, { 0x0029, 0x0014, 0, VR::OB, VM::M1, "VolumeHistogram" }, { 0x0029, 0x0018, 0, VR::IS, VM::M1, "VolumeLevel" }, { 0x0029, 0x0030, 0, VR::DS, VM::M3, "VoxelSpacing" }, { 0x0029, 0x0032, 0, VR::DS, VM::M3, "VolumePositionPatient" }, { 0x0029, 0x0037, 0, VR::DS, VM::M9, "VolumeOrientationPatient" }, { 0x0029, 0x0040, 0, VR::CS, VM::M1, "ResamplingFlag" }, { 0x0029, 0x0042, 0, VR::CS, VM::M1, "NormalizationFlag" }, { 0x0029, 0x0044, 0, VR::SQ, VM::M1, "SubVolumeSequence" }, { 0x0029, 0x0046, 0, VR::UL, VM::M1, "HistogramNumberOfBins" }, { 0x0029, 0x0047, 0, VR::OB, VM::M1, "VolumeHistogramData" }, }; const unsigned short Dict110TagHashTable[] = { 12, 15, 11, 18, 21, 24, 31, 34, 37, 40, 11, 0, 1, 9, 70, 1, 10, 71, 1, 3, 48, 1, 0, 18, 3, 2, 24, 4, 50, 6, 64, 1, 1, 20, 1, 7, 66, 1, 5, 55, 1, 8, 68, }; const unsigned short Dict110KeyHashTable[] = { 11, 12, 15, 20, 23, 26, 29, 32, 11, 35, 40, 0, 1, 0, 4789, 2, 1, 59707, 5, 17396, 1, 10, 10630, 1, 6, 13799, 1, 9, 1256, 1, 2, 24621, 1, 4, 63232, 2, 3, 11885, 8, 14597, 1, 7, 30644, }; vtkDICOMDictionary::Dict Dict110Data = { "SIEMENS SYNGO VOLUME", 11, 11, Dict110TagHashTable, Dict110KeyHashTable, Dict110Contents }; // ----- Applicare/RadWorks/Version 6.0 ----- const DictEntry Dict111Contents[] = { { 0x4103, 0x0001, 0, VR::AT, VM::M1TN, "NonExistentTags" }, { 0x4103, 0x0002, 0, VR::UI, VM::M1TN, "NonExistentObjects" }, { 0x4105, 0x0001, 0, VR::CS, VM::M1, "AnnotationType" }, { 0x4105, 0x0002, 0, VR::LO, VM::M1, "AnnotationValue" }, { 0x4105, 0x0003, 0, VR::UI, VM::M1, "CutlineImageUID" }, { 0x4105, 0x0004, 0, VR::UI, VM::M1, "CutlineSetUID" }, { 0x4105, 0x0005, 0, VR::US, VM::M3, "AnnotationColor" }, { 0x4105, 0x0006, 0, VR::CS, VM::M1, "AnnotationLineStyle" }, { 0x4105, 0x0007, 0, VR::SH, VM::M1, "AnnotationLabel" }, { 0x4105, 0x0008, 0, VR::PN, VM::M1, "AnnotationCreator" }, { 0x4105, 0x0009, 0, VR::DA, VM::M1, "AnnotationCreationDate" }, { 0x4105, 0x000A, 0, VR::TM, VM::M1, "AnnotationCreationTime" }, { 0x4105, 0x000B, 0, VR::SQ, VM::M1, "AnnotationModificationSequence" }, { 0x4105, 0x000C, 0, VR::PN, VM::M1, "AnnotationModifier" }, { 0x4105, 0x000D, 0, VR::DA, VM::M1, "AnnotationModificationDate" }, { 0x4105, 0x000E, 0, VR::TM, VM::M1, "AnnotationModificationTime" }, { 0x4105, 0x0010, 0, VR::US, VM::M1, "" }, { 0x4107, 0x0001, 0, VR::SQ, VM::M1, "RequestedPaletteColorLUT" }, }; const unsigned short Dict111TagHashTable[] = { 18, 19, 18, 22, 25, 18, 28, 33, 36, 39, 44, 49, 52, 55, 58, 61, 64, 67, 0, 1, 15, 14, 1, 16, 16, 1, 2, 1, 2, 4, 3, 17, 1, 1, 3, 2, 1, 6, 5, 2, 1, 2, 5, 4, 2, 0, 1, 8, 7, 1, 7, 6, 1, 10, 9, 1, 9, 8, 1, 12, 11, 1, 11, 10, 1, 14, 13, 1, 13, 12, }; const unsigned short Dict111KeyHashTable[] = { 18, 19, 18, 22, 25, 28, 31, 36, 39, 42, 45, 50, 18, 55, 58, 18, 18, 63, 0, 1, 7, 42844, 1, 13, 28566, 1, 9, 57638, 1, 12, 13085, 2, 4, 46988, 17, 60458, 1, 10, 10374, 1, 14, 50294, 1, 0, 35853, 2, 1, 23234, 11, 42789, 2, 5, 16542, 15, 17173, 1, 3, 14984, 2, 2, 60586, 8, 10865, 2, 6, 36303, 16, 298, }; vtkDICOMDictionary::Dict Dict111Data = { "Applicare/RadWorks/Version 6.0", 18, 18, Dict111TagHashTable, Dict111KeyHashTable, Dict111Contents }; // ----- SIEMENS MED SP DXMG WH AWS 1 ----- const DictEntry Dict112Contents[] = { { 0x0019, 0x0001, 0, VR::UL, VM::M1TN, "AECCoordinates" }, { 0x0019, 0x0002, 0, VR::US, VM::M2, "AECCoordinatesSize" }, { 0x0019, 0x0010, 0, VR::ST, VM::M1, "DerivationDescription" }, { 0x0041, 0x0002, 0, VR::SH, VM::M1, "ReasonForTheRequestedProcedure" }, { 0x0051, 0x0010, 0, VR::DS, VM::M1, "" }, { 0x0051, 0x0020, 0, VR::DS, VM::M1TN, "" }, { 0x0051, 0x0021, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x0032, 0, VR::DS, VM::M3, "" }, { 0x0051, 0x0037, 0, VR::DS, VM::M6, "" }, { 0x0051, 0x0050, 0, VR::UI, VM::M1, "" }, { 0x0051, 0x0060, 0, VR::DS, VM::M1, "PrimaryPositionerScanArc" }, { 0x0051, 0x0061, 0, VR::DS, VM::M1, "SecondaryPositionerScanArc" }, { 0x0051, 0x0062, 0, VR::DS, VM::M1, "PrimaryPositionerScanStartAngle" }, { 0x0051, 0x0063, 0, VR::DS, VM::M1, "SecondaryPositionerScanStartAngle" }, { 0x0051, 0x0064, 0, VR::DS, VM::M1, "PrimaryPositionerIncrement" }, { 0x0051, 0x0065, 0, VR::DS, VM::M1, "SecondaryPositionerIncrement" }, { 0x0055, 0x0001, 0, VR::LO, VM::M1, "ProjectionViewDisplayString" }, }; const unsigned short Dict112TagHashTable[] = { 18, 23, 30, 17, 17, 17, 17, 33, 17, 36, 39, 44, 17, 47, 52, 55, 60, 0, 2, 12, 98, 16, 1, 3, 8, 55, 9, 80, 15, 101, 1, 14, 100, 1, 0, 1, 1, 2, 16, 2, 1, 2, 5, 32, 1, 6, 33, 2, 4, 16, 7, 50, 1, 11, 97, 2, 3, 2, 10, 96, 1, 13, 99, }; const unsigned short Dict112KeyHashTable[] = { 18, 17, 17, 23, 28, 31, 34, 17, 17, 37, 17, 52, 55, 17, 58, 17, 17, 0, 2, 10, 15952, 16, 58410, 2, 0, 61158, 12, 44268, 1, 14, 10998, 1, 15, 58921, 1, 11, 60366, 7, 2, 25125, 4, 316, 5, 316, 6, 316, 7, 316, 8, 316, 9, 316, 1, 1, 21865, 1, 13, 5911, 1, 3, 10882, }; vtkDICOMDictionary::Dict Dict112Data = { "SIEMENS MED SP DXMG WH AWS 1", 17, 17, Dict112TagHashTable, Dict112KeyHashTable, Dict112Contents }; // ----- SIEMENS MR PS 04 ----- const DictEntry Dict113Contents[] = { { 0x0021, 0x0001, 0, VR::FD, VM::M1TN, "" }, }; const unsigned short Dict113TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict113KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict113Data = { "SIEMENS MR PS 04", 1, 1, Dict113TagHashTable, Dict113KeyHashTable, Dict113Contents }; // ----- UCSF BIRP PRIVATE CREATOR 011710xx ----- const DictEntry Dict114Contents[] = { { 0x0117, 0x0010, 0, VR::SQ, VM::M1, "ParameterSequence" }, { 0x0117, 0x0012, 0, VR::CS, VM::M1, "ParameterType" }, { 0x0117, 0x0014, 0, VR::LO, VM::M1, "ParameterName" }, { 0x0117, 0x0016, 0, VR::LO, VM::M1, "ParameterDescription" }, { 0x0117, 0x0018, 0, VR::DS, VM::M1TN, "FloatingParameterValue" }, { 0x0117, 0x0019, 0, VR::IS, VM::M1TN, "IntegerParameterValue" }, { 0x0117, 0x001a, 0, VR::LO, VM::M1TN, "StringParameterValue" }, { 0x0117, 0x0020, 0, VR::SQ, VM::M1, "VOILPS" }, { 0x0117, 0x0022, 0, VR::SQ, VM::M1, "OMITRegionSequence" }, { 0x0117, 0x0024, 0, VR::SQ, VM::M1, "QCSequence" }, { 0x0117, 0x0030, 0, VR::IS, VM::M1, "TotalPhases" }, { 0x0117, 0x0031, 0, VR::DS, VM::M1, "AcquisitionDuration" }, { 0x0117, 0x0032, 0, VR::DS, VM::M1TN, "AcquisitionStartTimes" }, { 0x0117, 0x0033, 0, VR::TM, VM::M1, "InjectionTime" }, { 0x0117, 0x0034, 0, VR::DS, VM::M1TN, "EffectiveAcquisitionDelay" }, { 0x0117, 0x0035, 0, VR::IS, VM::M3, "SERTimingIndices" }, { 0x0117, 0x003a, 0, VR::LO, VM::M1, "TimingInformationMethod" }, { 0x0117, 0x003b, 0, VR::LT, VM::M1, "TimingInformationComments" }, { 0x0117, 0x0041, 0, VR::IS, VM::M1, "VOILPSROIFlag" }, { 0x0117, 0x0042, 0, VR::DS, VM::M3, "VOILPSCenter" }, { 0x0117, 0x0043, 0, VR::DS, VM::M3, "VOILPSHalfWidth" }, { 0x0117, 0x0044, 0, VR::DS, VM::M3, "VOILPSHalfHeight" }, { 0x0117, 0x0045, 0, VR::DS, VM::M3, "VOILPSHalfDepth" }, { 0x0117, 0x0046, 0, VR::CS, VM::M1, "VOILPSType" }, { 0x0117, 0x0050, 0, VR::US, VM::M1, "ProjectedROINumberOfPixels" }, { 0x0117, 0x0051, 0, VR::IS, VM::M1, "ProjectionAxis" }, { 0x0117, 0x0052, 0, VR::IS, VM::M1, "ProjectedROITransposeFlag" }, { 0x0117, 0x0053, 0, VR::US, VM::M3TN, "ProjectedROIXVertices" }, { 0x0117, 0x0054, 0, VR::US, VM::M3TN, "ProjectedROIYVertices" }, { 0x0117, 0x0055, 0, VR::US, VM::M2, "ProjectedROIZRange" }, { 0x0117, 0x0056, 0, VR::CS, VM::M1, "ProjectedROIType" }, { 0x0117, 0x0057, 0, VR::LO, VM::M1, "ProjectedROILabel" }, { 0x0117, 0x00a1, 0, VR::US, VM::M3, "VOIPixelStart" }, { 0x0117, 0x00a2, 0, VR::US, VM::M3, "VOIPixelEnd" }, { 0x0117, 0x00b0, 0, VR::SQ, VM::M1, "FTVResultsSequence" }, { 0x0117, 0x00b1, 0, VR::DS, VM::M1, "SERMinimum" }, { 0x0117, 0x00b2, 0, VR::DS, VM::M1, "SERMaximum" }, { 0x0117, 0x00b3, 0, VR::IS, VM::M1, "VoxelCount" }, { 0x0117, 0x00b4, 0, VR::DS, VM::M1, "Volume" }, { 0x0117, 0x00b5, 0, VR::LO, VM::M1, "Label" }, { 0x0117, 0x00c0, 0, VR::CS, VM::M1, "QCType" }, { 0x0117, 0x00c1, 0, VR::LO, VM::M1, "QCFactor" }, { 0x0117, 0x00c2, 0, VR::DS, VM::M1, "QCValue" }, { 0x0117, 0x00c3, 0, VR::CS, VM::M1, "QCMeaning" }, { 0x0117, 0x00c4, 0, VR::LT, VM::M1, "QCComment" }, { 0x0117, 0x00c5, 0, VR::CS, VM::M1, "ProtocolCompliance" }, { 0x0117, 0x00c6, 0, VR::LO, VM::M1TN, "ProtocolNonComplianceReasons" }, }; const unsigned short Dict114TagHashTable[] = { 48, 47, 47, 47, 47, 47, 51, 54, 59, 64, 69, 72, 75, 80, 85, 90, 47, 47, 47, 47, 47, 47, 93, 96, 99, 102, 105, 47, 108, 111, 114, 117, 120, 47, 47, 47, 47, 47, 123, 126, 129, 134, 141, 148, 155, 162, 169, 0, 1, 46, 198, 1, 13, 51, 2, 12, 50, 19, 66, 2, 11, 49, 20, 67, 2, 10, 48, 32, 161, 1, 18, 65, 1, 23, 70, 2, 15, 53, 33, 162, 2, 14, 52, 21, 68, 2, 17, 59, 22, 69, 1, 16, 58, 1, 1, 18, 1, 8, 34, 1, 0, 16, 1, 7, 32, 1, 3, 22, 1, 2, 20, 1, 9, 36, 1, 6, 26, 1, 5, 25, 1, 4, 24, 1, 26, 82, 1, 27, 83, 2, 24, 80, 35, 177, 3, 25, 81, 34, 176, 40, 192, 3, 30, 86, 37, 179, 41, 193, 3, 31, 87, 36, 178, 42, 194, 3, 28, 84, 39, 181, 43, 195, 3, 29, 85, 38, 180, 44, 196, 1, 45, 197, }; const unsigned short Dict114KeyHashTable[] = { 48, 57, 60, 47, 63, 72, 47, 47, 47, 47, 75, 78, 47, 47, 81, 88, 91, 47, 96, 101, 104, 47, 47, 107, 47, 47, 110, 115, 120, 123, 126, 129, 132, 135, 47, 47, 47, 140, 143, 47, 148, 151, 154, 157, 160, 163, 166, 0, 4, 2, 24265, 22, 29358, 26, 40760, 31, 1921, 1, 9, 33119, 1, 41, 29578, 4, 0, 40501, 10, 3463, 11, 47600, 44, 45272, 1, 34, 21973, 1, 35, 42511, 1, 29, 3973, 3, 13, 50983, 20, 52801, 32, 34651, 1, 4, 3512, 2, 3, 1062, 36, 56019, 2, 5, 55249, 27, 32198, 1, 18, 59485, 1, 28, 38391, 1, 30, 9318, 2, 14, 36972, 17, 35153, 2, 37, 38767, 38, 38366, 1, 45, 26314, 1, 46, 30709, 1, 12, 4064, 1, 43, 45623, 1, 7, 55166, 2, 19, 56926, 21, 15867, 1, 33, 17097, 2, 8, 63643, 24, 15620, 1, 6, 14254, 1, 15, 9443, 1, 1, 29410, 1, 25, 40340, 1, 23, 53000, 1, 40, 54962, 3, 16, 38682, 39, 64345, 42, 13592, }; vtkDICOMDictionary::Dict Dict114Data = { "UCSF BIRP PRIVATE CREATOR 011710xx", 47, 47, Dict114TagHashTable, Dict114KeyHashTable, Dict114Contents }; // ----- GEMS_Ultrasound_MovieGroup_001 ----- const DictEntry Dict115Contents[] = { { 0x7fe1, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0003, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x0008, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0018, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0020, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0024, 0, VR::SH, VM::M1, "" }, { 0x7fe1, 0x0026, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0032, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x0036, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0037, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x003a, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x003c, 0, VR::FD, VM::M1, "" }, { 0x7fe1, 0x0043, 0, VR::OB, VM::M1, "" }, { 0x7fe1, 0x0048, 0, VR::FD, VM::M1, "" }, { 0x7fe1, 0x0049, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x0051, 0, VR::FL, VM::M1, "" }, { 0x7fe1, 0x0052, 0, VR::FD, VM::M1, "" }, { 0x7fe1, 0x0053, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x0054, 0, VR::SL, VM::M1, "" }, { 0x7fe1, 0x0055, 0, VR::OB, VM::M1, "" }, { 0x7fe1, 0x0057, 0, VR::LT, VM::M1, "" }, { 0x7fe1, 0x0060, 0, VR::OB, VM::M1, "" }, { 0x7fe1, 0x0061, 0, VR::OW, VM::M1, "" }, { 0x7fe1, 0x0062, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0069, 0, VR::OW, VM::M1, "" }, { 0x7fe1, 0x0070, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0071, 0, VR::UL, VM::M1, "" }, { 0x7fe1, 0x0072, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0073, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0074, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0075, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0077, 0, VR::FD, VM::M1, "" }, { 0x7fe1, 0x0079, 0, VR::SL, VM::M1, "" }, { 0x7fe1, 0x0083, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0084, 0, VR::LO, VM::M1, "" }, { 0x7fe1, 0x0085, 0, VR::SQ, VM::M1, "" }, { 0x7fe1, 0x0086, 0, VR::SL, VM::M1, "" }, { 0x7fe1, 0x0087, 0, VR::FD, VM::M1, "" }, { 0x7fe1, 0x0088, 0, VR::FD, VM::M1, "" }, }; const unsigned short Dict115TagHashTable[] = { 43, 43, 44, 47, 52, 43, 57, 60, 43, 65, 43, 43, 68, 43, 43, 43, 43, 43, 73, 76, 79, 82, 85, 43, 88, 91, 96, 99, 102, 107, 112, 117, 122, 43, 125, 128, 133, 136, 141, 146, 149, 154, 157, 0, 1, 27, 98, 2, 12, 54, 26, 97, 2, 13, 55, 25, 96, 1, 18, 73, 2, 11, 50, 17, 72, 1, 10, 48, 2, 6, 24, 16, 67, 1, 5, 18, 1, 9, 38, 1, 4, 16, 1, 8, 36, 1, 36, 121, 1, 35, 119, 2, 7, 32, 42, 136, 1, 34, 117, 1, 33, 116, 2, 3, 8, 32, 115, 2, 31, 114, 38, 132, 2, 30, 113, 39, 133, 2, 29, 112, 40, 134, 1, 41, 135, 1, 1, 2, 2, 2, 3, 24, 87, 1, 37, 131, 2, 0, 1, 23, 85, 2, 22, 84, 28, 105, 1, 21, 83, 2, 15, 60, 20, 82, 1, 19, 81, 1, 14, 58, }; const unsigned short Dict115KeyHashTable[] = { 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 43, 0, 125, 1, 125, 2, 125, 3, 125, 4, 125, 5, 125, 6, 125, 7, 125, 8, 125, 9, 125, 10, 125, 11, 125, 12, 125, 13, 125, 14, 125, 15, 125, 16, 125, 17, 125, 18, 125, 19, 125, 20, 125, 21, 125, 22, 125, 23, 125, 24, 125, 25, 125, 26, 125, 27, 125, 28, 125, 29, 125, 30, 125, 31, 125, 32, 125, 33, 125, 34, 125, 35, 125, 36, 125, 37, 125, 38, 125, 39, 125, 40, 125, 41, 125, 42, 125, }; vtkDICOMDictionary::Dict Dict115Data = { "GEMS_Ultrasound_MovieGroup_001", 43, 43, Dict115TagHashTable, Dict115KeyHashTable, Dict115Contents }; // ----- CARESTREAM IMAGE INFORMATION ----- const DictEntry Dict116Contents[] = { { 0x0029, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0018, 0, VR::UT, VM::M1, "" }, { 0x0029, 0x0019, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x001a, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x001b, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict116TagHashTable[] = { 8, 13, 16, 7, 19, 7, 22, 0, 2, 1, 22, 3, 24, 1, 6, 27, 1, 5, 26, 1, 0, 21, 2, 2, 23, 4, 25, }; const unsigned short Dict116KeyHashTable[] = { 7, 7, 7, 7, 7, 8, 7, 0, 7, 0, 768, 1, 768, 2, 768, 3, 768, 4, 768, 5, 768, 6, 768, }; vtkDICOMDictionary::Dict Dict116Data = { "CARESTREAM IMAGE INFORMATION", 7, 7, Dict116TagHashTable, Dict116KeyHashTable, Dict116Contents }; // ----- GEMS_DL_STUDY_01 ----- const DictEntry Dict117Contents[] = { { 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" }, { 0x0015, 0x0081, 0, VR::DS, VM::M1, "StudyTotalDap" }, { 0x0015, 0x0082, 0, VR::DS, VM::M1, "FluoroDoseAreaProduct" }, { 0x0015, 0x0083, 0, VR::IS, VM::M1, "StudyFluoroTime" }, { 0x0015, 0x0084, 0, VR::DS, VM::M1, "CineDoseAreaProduct" }, { 0x0015, 0x0085, 0, VR::IS, VM::M1, "StudyRecordTime" }, { 0x0015, 0x0086, 0, VR::IS, VM::M1, "LastXANumber" }, { 0x0015, 0x0088, 0, VR::PN, VM::M1TN, "DefOperatorName" }, { 0x0015, 0x0089, 0, VR::PN, VM::M1TN, "DefPerformingPhysicianName" }, { 0x0015, 0x008A, 0, VR::CS, VM::M2, "DefPatientOrientation" }, { 0x0015, 0x008B, 0, VR::IS, VM::M1, "LastScNumber" }, { 0x0015, 0x008E, 0, VR::UI, VM::M1, "CommonSeriesInstanceUID" }, { 0x0015, 0x008F, 0, VR::IS, VM::M1, "StudyNumber" }, { 0x0015, 0x0092, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x0093, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x0094, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x0095, 0, VR::IS, VM::M1, "" }, { 0x0015, 0x0096, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x0097, 0, VR::IS, VM::M1, "" }, { 0x0015, 0x0098, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x0099, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x009a, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x009b, 0, VR::IS, VM::M1, "" }, { 0x0015, 0x009c, 0, VR::FL, VM::M1, "" }, { 0x0015, 0x009d, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict117TagHashTable[] = { 26, 29, 32, 35, 40, 43, 46, 51, 56, 61, 25, 25, 25, 64, 67, 70, 73, 76, 79, 25, 82, 85, 88, 91, 94, 0, 1, 1, 129, 1, 0, 128, 1, 12, 143, 2, 11, 142, 18, 151, 1, 17, 150, 1, 16, 149, 2, 10, 139, 15, 148, 2, 9, 138, 14, 147, 2, 8, 137, 13, 146, 1, 7, 136, 1, 24, 157, 1, 23, 156, 1, 22, 155, 1, 21, 154, 1, 20, 153, 1, 19, 152, 1, 6, 134, 1, 5, 133, 1, 4, 132, 1, 3, 131, 1, 2, 130, }; const unsigned short Dict117KeyHashTable[] = { 25, 25, 26, 25, 31, 36, 39, 25, 25, 25, 25, 25, 68, 25, 25, 25, 71, 76, 25, 79, 82, 25, 25, 25, 25, 0, 2, 0, 7999, 8, 10324, 2, 1, 41835, 4, 29773, 1, 12, 20594, 14, 5, 17430, 7, 64819, 13, 215, 14, 215, 15, 215, 16, 215, 17, 215, 18, 215, 19, 215, 20, 215, 21, 215, 22, 215, 23, 215, 24, 215, 1, 6, 5767, 2, 9, 26125, 11, 19872, 1, 10, 36991, 1, 2, 47198, 1, 3, 31344, }; vtkDICOMDictionary::Dict Dict117Data = { "GEMS_DL_STUDY_01", 25, 25, Dict117TagHashTable, Dict117KeyHashTable, Dict117Contents }; // ----- Silhouette VRS 3.0 ----- const DictEntry Dict118Contents[] = { { 0x0029, 0x0013, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0014, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0017, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0019, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001a, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001b, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001c, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001d, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001e, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0028, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0032, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0034, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0035, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0036, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict118TagHashTable[] = { 18, 21, 26, 17, 29, 17, 17, 32, 35, 17, 38, 43, 48, 17, 51, 58, 61, 0, 1, 5, 26, 2, 8, 29, 11, 40, 1, 7, 28, 1, 9, 30, 1, 0, 19, 1, 12, 48, 2, 1, 20, 13, 50, 2, 2, 23, 15, 53, 1, 14, 52, 3, 4, 25, 10, 39, 16, 54, 1, 3, 24, 1, 6, 27, }; const unsigned short Dict118KeyHashTable[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 17, 17, 17, 17, 0, 17, 0, 316, 1, 316, 2, 316, 3, 316, 4, 316, 5, 316, 6, 316, 7, 316, 8, 316, 9, 316, 10, 316, 11, 316, 12, 316, 13, 316, 14, 316, 15, 316, 16, 316, }; vtkDICOMDictionary::Dict Dict118Data = { "Silhouette VRS 3.0", 17, 17, Dict118TagHashTable, Dict118KeyHashTable, Dict118Contents }; // ----- GEMS_HELIOS_01 ----- const DictEntry Dict119Contents[] = { { 0x0045, 0x0001, 0, VR::SS, VM::M1, "NumberOfMacroRowsInDetector" }, { 0x0045, 0x0002, 0, VR::FL, VM::M1, "MacroWidthAtISOCenter" }, { 0x0045, 0x0003, 0, VR::SS, VM::M1, "DASType" }, { 0x0045, 0x0004, 0, VR::SS, VM::M1, "DASGain" }, { 0x0045, 0x0005, 0, VR::SS, VM::M1, "DASTemprature" }, { 0x0045, 0x0006, 0, VR::CS, VM::M1, "TableDirection" }, { 0x0045, 0x0007, 0, VR::FL, VM::M1, "ZSmoothingFactor" }, { 0x0045, 0x0008, 0, VR::SS, VM::M1, "ViewWeightingMode" }, { 0x0045, 0x0009, 0, VR::SS, VM::M1, "SigmaRowNumber" }, { 0x0045, 0x000A, 0, VR::FL, VM::M1, "MinimumDASValue" }, { 0x0045, 0x000B, 0, VR::FL, VM::M1, "MaximumOffsetValue" }, { 0x0045, 0x000C, 0, VR::SS, VM::M1, "NumberOfViewsShifted" }, { 0x0045, 0x000D, 0, VR::SS, VM::M1, "ZTrackingFlag" }, { 0x0045, 0x000E, 0, VR::FL, VM::M1, "MeanZError" }, { 0x0045, 0x000F, 0, VR::FL, VM::M1, "ZTrackingError" }, { 0x0045, 0x0010, 0, VR::SS, VM::M1, "StartView2A" }, { 0x0045, 0x0011, 0, VR::SS, VM::M1, "NumberOfViews2A" }, { 0x0045, 0x0012, 0, VR::SS, VM::M1, "StartView1A" }, { 0x0045, 0x0013, 0, VR::SS, VM::M1, "SigmaMode" }, { 0x0045, 0x0014, 0, VR::SS, VM::M1, "NumberOfViews1A" }, { 0x0045, 0x0015, 0, VR::SS, VM::M1, "StartView2B" }, { 0x0045, 0x0016, 0, VR::SS, VM::M1, "NumberViews2B" }, { 0x0045, 0x0017, 0, VR::SS, VM::M1, "StartView1B" }, { 0x0045, 0x0018, 0, VR::SS, VM::M1, "NumberOfViews1B" }, { 0x0045, 0x0021, 0, VR::SS, VM::M1, "IterboneFlag" }, { 0x0045, 0x0022, 0, VR::SS, VM::M1, "PeristalticFlag" }, { 0x0045, 0x0030, 0, VR::CS, VM::M1, "CardiacReconAlgorithm" }, { 0x0045, 0x0031, 0, VR::CS, VM::M1, "AvgHeartRateForImage" }, { 0x0045, 0x0032, 0, VR::FL, VM::M1, "TemporalResolution" }, { 0x0045, 0x0033, 0, VR::CS, VM::M1, "PctRpeakDelay" }, { 0x0045, 0x0034, 0, VR::CS, VM::M1, "" }, { 0x0045, 0x0036, 0, VR::CS, VM::M1, "EkgFullMaStartPhase" }, { 0x0045, 0x0037, 0, VR::CS, VM::M1, "EkgFullMaEndPhase" }, { 0x0045, 0x0038, 0, VR::CS, VM::M1, "EkgModulationMaxMa" }, { 0x0045, 0x0039, 0, VR::CS, VM::M1, "EkgModulationMinMa" }, { 0x0045, 0x003B, 0, VR::LO, VM::M1, "NoiseReductionImageFilterDesc" }, { 0x0045, 0x003F, 0, VR::IS, VM::M1, "RPeakTimeDelay" }, { 0x0045, 0x0044, 0, VR::IS, VM::M1, "ActualRPeakTimeDelay" }, { 0x0045, 0x0045, 0, VR::ST, VM::M1, "CardiacScanOptions" }, { 0x0045, 0x0050, 0, VR::FD, VM::M1, "TemporalCenterViewAngle" }, { 0x0045, 0x0051, 0, VR::FD, VM::M1, "ReconCenterViewAngle" }, { 0x0045, 0x0052, 0, VR::CS, VM::M1, "WideConeMasking" }, { 0x0045, 0x0053, 0, VR::FD, VM::M1, "WideConeCornerBlendingRadius" }, { 0x0045, 0x0054, 0, VR::FD, VM::M1, "WideConeCornerBlendingRadiusOffset" }, { 0x0045, 0x0055, 0, VR::CS, VM::M1, "InternalReconAlgorithm" }, { 0x0045, 0x0060, 0, VR::FL, VM::M1TN, "PatientCentering" }, { 0x0045, 0x0061, 0, VR::FL, VM::M1TN, "PatientAttenuation" }, { 0x0045, 0x0062, 0, VR::FL, VM::M1TN, "WaterEquivalentDiameter" }, { 0x0045, 0x0063, 0, VR::FL, VM::M1TN, "ProjectionMeasure" }, { 0x0045, 0x0064, 0, VR::FL, VM::M1TN, "OvalRatio" }, { 0x0045, 0x0065, 0, VR::FL, VM::M1TN, "EllipseOrientation" }, }; const unsigned short Dict119TagHashTable[] = { 52, 57, 51, 51, 51, 51, 51, 51, 51, 51, 60, 51, 63, 66, 71, 76, 81, 88, 93, 96, 99, 104, 111, 118, 125, 128, 133, 136, 139, 142, 145, 148, 151, 156, 161, 164, 167, 172, 175, 178, 51, 181, 51, 51, 51, 51, 51, 51, 51, 51, 184, 0, 2, 25, 34, 38, 69, 1, 37, 68, 1, 30, 52, 1, 31, 54, 2, 3, 4, 32, 55, 2, 4, 5, 26, 48, 2, 5, 6, 27, 49, 3, 6, 7, 28, 50, 44, 85, 2, 29, 51, 43, 84, 1, 0, 1, 1, 1, 2, 2, 2, 3, 40, 81, 3, 11, 12, 36, 63, 39, 80, 3, 12, 13, 33, 56, 42, 83, 3, 13, 14, 34, 57, 41, 82, 1, 14, 15, 2, 7, 8, 35, 59, 1, 8, 9, 1, 9, 10, 1, 10, 11, 1, 19, 20, 1, 20, 21, 1, 21, 22, 2, 22, 23, 50, 101, 2, 15, 16, 49, 100, 1, 16, 17, 1, 17, 18, 2, 18, 19, 46, 97, 1, 45, 96, 1, 48, 99, 1, 47, 98, 1, 23, 24, 1, 24, 33, }; const unsigned short Dict119KeyHashTable[] = { 52, 55, 51, 60, 63, 68, 71, 74, 51, 51, 79, 86, 51, 89, 92, 95, 98, 103, 108, 51, 51, 113, 116, 119, 51, 124, 131, 134, 51, 137, 51, 140, 51, 147, 51, 150, 153, 51, 51, 158, 161, 51, 166, 169, 174, 177, 51, 51, 180, 183, 186, 0, 1, 21, 3792, 2, 24, 22226, 32, 36524, 1, 12, 50323, 2, 3, 47048, 29, 20814, 1, 1, 20993, 1, 25, 4463, 2, 4, 60069, 43, 20989, 3, 33, 33398, 36, 13636, 40, 30295, 1, 26, 30149, 1, 9, 47891, 1, 6, 9720, 1, 18, 12388, 2, 2, 56725, 5, 32458, 2, 15, 64944, 42, 41330, 2, 7, 24995, 20, 64944, 1, 8, 25782, 1, 14, 39586, 2, 27, 19506, 48, 34639, 3, 35, 41093, 37, 22925, 50, 8098, 1, 30, 105, 1, 44, 9607, 1, 49, 60035, 3, 16, 32807, 41, 61354, 46, 11933, 1, 39, 11369, 1, 17, 64943, 2, 11, 16796, 22, 64943, 1, 38, 14482, 2, 28, 47159, 47, 37171, 1, 45, 54581, 2, 31, 14091, 34, 38821, 1, 10, 27897, 1, 13, 36271, 1, 0, 54171, 1, 19, 32806, 1, 23, 32806, }; vtkDICOMDictionary::Dict Dict119Data = { "GEMS_HELIOS_01", 51, 51, Dict119TagHashTable, Dict119KeyHashTable, Dict119Contents }; // ----- Kodak Image Information ----- const DictEntry Dict120Contents[] = { { 0x0029, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0018, 0, VR::UT, VM::M1, "" }, { 0x0029, 0x0019, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x001a, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict120TagHashTable[] = { 7, 12, 15, 18, 6, 6, 0, 2, 0, 21, 4, 25, 1, 3, 24, 1, 2, 23, 2, 1, 22, 5, 26, }; const unsigned short Dict120KeyHashTable[] = { 6, 6, 6, 6, 6, 7, 0, 6, 0, 896, 1, 896, 2, 896, 3, 896, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict120Data = { "Kodak Image Information", 6, 6, Dict120TagHashTable, Dict120KeyHashTable, Dict120Contents }; // ----- QUASAR_INTERNAL_USE ----- const DictEntry Dict121Contents[] = { { 0x0009, 0x0001, 0, VR::UL, VM::M1TN, "RateVector" }, { 0x0009, 0x0002, 0, VR::UL, VM::M1TN, "CountVector" }, { 0x0009, 0x0003, 0, VR::UL, VM::M1TN, "TimeVector" }, { 0x0009, 0x0007, 0, VR::UL, VM::M1TN, "AngleVector" }, { 0x0009, 0x0008, 0, VR::US, VM::M1, "CameraShape" }, { 0x0009, 0x0010, 0, VR::US, VM::M1, "WholeBodySpots" }, { 0x0009, 0x0011, 0, VR::US, VM::M1, "WorklistFlag" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0013, 0, VR::ST, VM::M1, "SequenceType" }, { 0x0009, 0x0014, 0, VR::ST, VM::M1, "SequenceName" }, { 0x0009, 0x0015, 0, VR::UL, VM::M1TN, "AverageRRTimeVector" }, { 0x0009, 0x0016, 0, VR::UL, VM::M1TN, "LowLimitVector" }, { 0x0009, 0x0017, 0, VR::UL, VM::M1TN, "HighLimitVector" }, { 0x0009, 0x0018, 0, VR::UL, VM::M1TN, "BeginIndexVector" }, { 0x0009, 0x0019, 0, VR::UL, VM::M1TN, "EndIndexVector" }, { 0x0009, 0x001a, 0, VR::UL, VM::M1TN, "RawTimeVector" }, { 0x0009, 0x001b, 0, VR::LO, VM::M1, "ImageTypeString" }, { 0x0009, 0x001d, 0, VR::US, VM::M1, "" }, { 0x0009, 0x001e, 0, VR::ST, VM::M1, "" }, { 0x0009, 0x0022, 0, VR::FL, VM::M1, "" }, { 0x0009, 0x0023, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0039, 0, VR::UI, VM::M1, "" }, { 0x0009, 0x0040, 0, VR::DA, VM::M1, "" }, { 0x0009, 0x0041, 0, VR::TM, VM::M1, "" }, { 0x0009, 0x0042, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0044, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0045, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0048, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x0037, 0x001b, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0060, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0070, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0071, 0, VR::FD, VM::M1, "" }, { 0x0037, 0x0072, 0, VR::SH, VM::M1, "" }, { 0x0037, 0x0073, 0, VR::FD, VM::M1, "" }, { 0x0037, 0x0078, 0, VR::FD, VM::M1, "" }, { 0x0037, 0x0090, 0, VR::IS, VM::M1, "" }, { 0x0037, 0x0092, 0, VR::DS, VM::M1, "" }, { 0x0041, 0x0001, 0, VR::UT, VM::M1, "" }, }; const unsigned short Dict121TagHashTable[] = { 43, 46, 51, 42, 42, 42, 56, 59, 62, 42, 65, 68, 42, 42, 71, 42, 74, 77, 80, 85, 88, 42, 91, 94, 99, 102, 105, 110, 115, 120, 125, 130, 135, 42, 138, 143, 146, 42, 42, 149, 42, 154, 0, 1, 20, 35, 2, 4, 8, 19, 34, 2, 29, 27, 33, 96, 1, 21, 57, 1, 30, 48, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 3, 7, 1, 14, 25, 1, 13, 24, 2, 16, 27, 32, 80, 1, 15, 26, 1, 17, 29, 1, 27, 72, 2, 18, 30, 41, 1, 1, 6, 17, 1, 5, 16, 2, 8, 19, 36, 114, 2, 7, 18, 37, 115, 2, 10, 21, 34, 112, 2, 9, 20, 35, 113, 2, 12, 23, 22, 64, 2, 11, 22, 23, 65, 1, 24, 66, 2, 25, 68, 31, 64, 1, 26, 69, 1, 38, 120, 2, 28, 16, 39, 144, 1, 40, 146, }; const unsigned short Dict121KeyHashTable[] = { 42, 43, 42, 42, 42, 46, 42, 99, 102, 107, 42, 42, 42, 42, 114, 119, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 124, 42, 42, 42, 42, 42, 127, 42, 130, 42, 133, 42, 42, 42, 136, 0, 1, 5, 37873, 26, 7, 128, 17, 128, 18, 128, 19, 128, 20, 128, 21, 128, 22, 128, 23, 128, 24, 128, 25, 128, 26, 128, 27, 128, 28, 128, 29, 128, 30, 128, 31, 128, 32, 128, 33, 128, 34, 128, 35, 128, 36, 128, 37, 128, 38, 128, 39, 128, 40, 128, 41, 128, 1, 2, 42192, 2, 0, 54918, 6, 48783, 3, 4, 8431, 13, 1582, 16, 59980, 2, 8, 13829, 10, 31596, 2, 1, 13077, 12, 23940, 1, 15, 22127, 1, 14, 45735, 1, 9, 8070, 1, 11, 5450, 1, 3, 63967, }; vtkDICOMDictionary::Dict Dict121Data = { "QUASAR_INTERNAL_USE", 42, 42, Dict121TagHashTable, Dict121KeyHashTable, Dict121Contents }; // ----- VEPRO BROKER 1.0 ----- const DictEntry Dict122Contents[] = { { 0x0057, 0x0010, 0, VR::SQ, VM::M1, "DataReplaceSequence" }, }; const unsigned short Dict122TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict122KeyHashTable[] = { 2, 0, 1, 0, 61012, }; vtkDICOMDictionary::Dict Dict122Data = { "VEPRO BROKER 1.0", 1, 1, Dict122TagHashTable, Dict122KeyHashTable, Dict122Contents }; // ----- SIEMENS CT VA0 COAD ----- const DictEntry Dict123Contents[] = { { 0x0019, 0x0010, 0, VR::IS, VM::M1, "DistanceSourceToSourceSideCollimator" }, { 0x0019, 0x0011, 0, VR::IS, VM::M1, "DistanceSourceToDetectorSideCollimator" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "NumberOfPossibleChannels" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "MeanChannelNumber" }, { 0x0019, 0x0022, 0, VR::DS, VM::M1, "DetectorSpacing" }, { 0x0019, 0x0023, 0, VR::DS, VM::M1, "DetectorCenter" }, { 0x0019, 0x0024, 0, VR::DS, VM::M1, "ReadingIntegrationTime" }, { 0x0019, 0x0050, 0, VR::DS, VM::M1, "DetectorAlignment" }, { 0x0019, 0x0052, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::DS, VM::M1, "FocusAlignment" }, { 0x0019, 0x0065, 0, VR::UL, VM::M1, "FocalSpotDeflectionAmplitude" }, { 0x0019, 0x0066, 0, VR::UL, VM::M1, "FocalSpotDeflectionPhase" }, { 0x0019, 0x0067, 0, VR::UL, VM::M1, "FocalSpotDeflectionOffset" }, { 0x0019, 0x0070, 0, VR::DS, VM::M1, "WaterScalingFactor" }, { 0x0019, 0x0071, 0, VR::DS, VM::M1, "InterpolationFactor" }, { 0x0019, 0x0080, 0, VR::CS, VM::M1, "PatientRegion" }, { 0x0019, 0x0082, 0, VR::CS, VM::M1, "PatientPhaseOfLife" }, { 0x0019, 0x0090, 0, VR::DS, VM::M1, "OsteoOffset" }, { 0x0019, 0x0092, 0, VR::DS, VM::M1, "OsteoRegressionLineSlope" }, { 0x0019, 0x0093, 0, VR::DS, VM::M1, "OsteoRegressionLineIntercept" }, { 0x0019, 0x0094, 0, VR::IS, VM::M1, "OsteoStandardizationCode" }, { 0x0019, 0x0096, 0, VR::IS, VM::M1, "OsteoPhantomNumber" }, { 0x0019, 0x00a0, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a2, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00a4, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a6, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x00a7, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x00a8, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x00a9, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00aa, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00ab, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00ac, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00ad, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00ae, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00af, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::DS, VM::M1, "FeedPerRotation" }, { 0x0019, 0x00bd, 0, VR::IS, VM::M1, "PulmoTriggerLevel" }, { 0x0019, 0x00be, 0, VR::DS, VM::M1, "ExpiratoricReserveVolume" }, { 0x0019, 0x00bf, 0, VR::DS, VM::M1, "VitalCapacity" }, { 0x0019, 0x00c0, 0, VR::DS, VM::M1, "PulmoWater" }, { 0x0019, 0x00c1, 0, VR::DS, VM::M1, "PulmoAir" }, { 0x0019, 0x00c2, 0, VR::DA, VM::M1, "PulmoDate" }, { 0x0019, 0x00c3, 0, VR::TM, VM::M1, "PulmoTime" }, { 0x0019, 0x00c4, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c5, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict123TagHashTable[] = { 49, 49, 49, 49, 49, 49, 50, 55, 60, 67, 72, 49, 75, 49, 49, 49, 49, 78, 81, 84, 87, 90, 93, 98, 103, 106, 109, 112, 119, 122, 127, 130, 133, 136, 139, 142, 145, 148, 151, 156, 161, 164, 169, 172, 177, 180, 49, 49, 49, 0, 2, 14, 112, 17, 130, 2, 3, 33, 15, 113, 3, 1, 17, 2, 32, 16, 128, 2, 0, 16, 5, 35, 1, 4, 34, 1, 6, 36, 1, 42, 191, 1, 41, 190, 1, 40, 189, 1, 45, 194, 1, 46, 195, 2, 10, 96, 43, 192, 2, 7, 80, 44, 193, 1, 39, 176, 1, 8, 82, 1, 47, 196, 3, 9, 84, 11, 101, 48, 197, 1, 12, 102, 2, 13, 103, 34, 171, 1, 33, 170, 1, 32, 169, 1, 31, 168, 1, 38, 175, 1, 37, 174, 1, 36, 173, 1, 35, 172, 1, 26, 163, 2, 20, 147, 25, 162, 2, 19, 146, 24, 161, 1, 23, 160, 2, 18, 144, 30, 167, 1, 29, 166, 2, 22, 150, 28, 165, 1, 27, 164, 1, 21, 148, }; const unsigned short Dict123KeyHashTable[] = { 49, 49, 50, 53, 49, 56, 59, 49, 49, 62, 49, 49, 49, 65, 49, 49, 68, 75, 49, 49, 80, 49, 83, 86, 91, 49, 49, 49, 94, 49, 49, 49, 49, 97, 49, 100, 49, 49, 49, 49, 103, 146, 49, 151, 156, 161, 166, 49, 49, 0, 1, 41, 81, 1, 0, 56701, 1, 12, 60201, 1, 17, 58490, 1, 11, 19033, 1, 5, 12227, 3, 10, 6420, 20, 2902, 44, 56382, 2, 7, 5117, 19, 21738, 1, 2, 64220, 1, 1, 43763, 2, 6, 63531, 13, 23757, 1, 46, 6105, 1, 16, 27938, 1, 15, 8699, 1, 43, 27634, 21, 8, 109, 9, 109, 23, 109, 24, 109, 25, 109, 26, 109, 27, 109, 28, 109, 29, 109, 30, 109, 31, 109, 32, 109, 33, 109, 34, 109, 35, 109, 36, 109, 37, 109, 38, 109, 39, 32136, 47, 109, 48, 109, 2, 14, 43759, 21, 25264, 2, 42, 26088, 45, 59733, 2, 3, 13788, 18, 16906, 2, 4, 42439, 22, 57762, 1, 40, 62864, }; vtkDICOMDictionary::Dict Dict123Data = { "SIEMENS CT VA0 COAD", 49, 49, Dict123TagHashTable, Dict123KeyHashTable, Dict123Contents }; // ----- PHILIPS MR ----- const DictEntry Dict124Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "SPIRelease" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict124TagHashTable[] = { 2, 3, 0, 2, 0, 16, 1, 18, }; const unsigned short Dict124KeyHashTable[] = { 3, 6, 0, 1, 0, 59817, 1, 1, 2690, }; vtkDICOMDictionary::Dict Dict124Data = { "PHILIPS MR", 2, 2, Dict124TagHashTable, Dict124KeyHashTable, Dict124Contents }; // ----- MeVis BreastCare ----- const DictEntry Dict125Contents[] = { { 0x0019, 0x0001, 0, VR::LO, VM::M1, "AnnotationVersion" }, { 0x0071, 0x0001, 0, VR::LO, VM::M1, "XMLFormattedTextValue" }, }; const unsigned short Dict125TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 1, }; const unsigned short Dict125KeyHashTable[] = { 3, 2, 0, 2, 0, 6835, 1, 62111, }; vtkDICOMDictionary::Dict Dict125Data = { "MeVis BreastCare", 2, 2, Dict125TagHashTable, Dict125KeyHashTable, Dict125Contents }; // ----- GEMS_MR_RAW_01 ----- const DictEntry Dict126Contents[] = { { 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" }, { 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" }, { 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" }, { 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" }, { 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" }, { 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" }, { 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" }, { 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" }, { 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" }, { 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" }, { 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" }, }; const unsigned short Dict126TagHashTable[] = { 12, 15, 11, 20, 23, 26, 29, 32, 35, 38, 41, 0, 1, 10, 4107, 2, 0, 4097, 9, 4106, 1, 2, 4099, 1, 1, 4098, 1, 4, 4101, 1, 3, 4100, 1, 6, 4103, 1, 5, 4102, 1, 8, 4105, 1, 7, 4104, }; const unsigned short Dict126KeyHashTable[] = { 11, 11, 11, 12, 15, 20, 25, 28, 31, 36, 39, 0, 1, 3, 23886, 2, 0, 7693, 9, 11838, 2, 5, 37924, 6, 11222, 1, 2, 46296, 1, 10, 11129, 2, 4, 38678, 8, 1958, 1, 7, 19522, 1, 1, 12326, }; vtkDICOMDictionary::Dict Dict126Data = { "GEMS_MR_RAW_01", 11, 11, Dict126TagHashTable, Dict126KeyHashTable, Dict126Contents }; // ----- VEPRO VIF 3.0 DATA ----- const DictEntry Dict127Contents[] = { { 0x0055, 0x0020, 0, VR::OB, VM::M1, "" }, { 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" }, { 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" }, }; const unsigned short Dict127TagHashTable[] = { 4, 7, 10, 0, 1, 2, 101, 1, 1, 48, 1, 0, 32, }; const unsigned short Dict127KeyHashTable[] = { 4, 3, 7, 0, 1, 2, 33635, 2, 0, 1793, 1, 56642, }; vtkDICOMDictionary::Dict Dict127Data = { "VEPRO VIF 3.0 DATA", 3, 3, Dict127TagHashTable, Dict127KeyHashTable, Dict127Contents }; // ----- MeVis eatDicom ----- const DictEntry Dict128Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "eatDicomVersion" }, { 0x0009, 0x0011, 0, VR::ST, VM::M1, "eatDicomOptions" }, }; const unsigned short Dict128TagHashTable[] = { 3, 6, 0, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict128KeyHashTable[] = { 2, 3, 0, 2, 0, 24984, 1, 21435, }; vtkDICOMDictionary::Dict Dict128Data = { "MeVis eatDicom", 2, 2, Dict128TagHashTable, Dict128KeyHashTable, Dict128Contents }; // ----- DIGISCAN IMAGE ----- const DictEntry Dict129Contents[] = { { 0x0029, 0x0031, 0, VR::US, VM::M1TN, "" }, { 0x0029, 0x0032, 0, VR::US, VM::M1TN, "" }, { 0x0029, 0x0033, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0034, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict129TagHashTable[] = { 5, 8, 11, 14, 0, 1, 0, 49, 1, 3, 52, 1, 2, 51, 1, 1, 50, }; const unsigned short Dict129KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict129Data = { "DIGISCAN IMAGE", 4, 4, Dict129TagHashTable, Dict129KeyHashTable, Dict129Contents }; // ----- MITRA OBJECT UTF8 ATTRIBUTES 1.0 ----- const DictEntry Dict130Contents[] = { { 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" }, { 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" }, { 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" }, { 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" }, { 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" }, { 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" }, { 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" }, { 0x0033, 0x0013, 0, VR::PN, VM::M1, "" }, { 0x0033, 0x0014, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0015, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0016, 0, VR::PN, VM::M1, "" }, { 0x0033, 0x0019, 0, VR::PN, VM::M1, "" }, }; const unsigned short Dict130TagHashTable[] = { 12, 13, 20, 23, 12, 28, 31, 34, 37, 40, 12, 43, 0, 3, 0, 2, 6, 14, 10, 22, 1, 9, 21, 2, 5, 12, 8, 20, 1, 2, 6, 1, 11, 25, 1, 1, 4, 1, 7, 19, 1, 4, 10, 1, 3, 8, }; const unsigned short Dict130KeyHashTable[] = { 13, 16, 19, 12, 12, 22, 33, 36, 39, 12, 12, 42, 0, 1, 4, 22592, 1, 6, 57109, 1, 5, 52851, 5, 7, 448, 8, 448, 9, 448, 10, 448, 11, 448, 1, 3, 2102, 1, 1, 45511, 1, 0, 33809, 1, 2, 23768, }; vtkDICOMDictionary::Dict Dict130Data = { "MITRA OBJECT UTF8 ATTRIBUTES 1.0", 12, 12, Dict130TagHashTable, Dict130KeyHashTable, Dict130Contents }; // ----- GEMS_Ultrasound_ExamGroup_001 ----- const DictEntry Dict131Contents[] = { { 0x6005, 0x0010, 0, VR::UT, VM::M1, "" }, { 0x6005, 0x0020, 0, VR::UT, VM::M1, "" }, }; const unsigned short Dict131TagHashTable[] = { 2, 3, 0, 2, 0, 16, 1, 32, }; const unsigned short Dict131KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict131Data = { "GEMS_Ultrasound_ExamGroup_001", 2, 2, Dict131TagHashTable, Dict131KeyHashTable, Dict131Contents }; // ----- VEPRO BROKER 1.0 DATA REPLACE ----- const DictEntry Dict132Contents[] = { { 0x0057, 0x0020, 0, VR::SQ, VM::M1, "OriginalDataSequence" }, { 0x0057, 0x0030, 0, VR::SQ, VM::M1, "ReplacedDataSequence" }, { 0x0057, 0x0040, 0, VR::DA, VM::M1, "DateOfDataReplacement" }, { 0x0057, 0x0041, 0, VR::TM, VM::M1, "TimeOfDataReplacement" }, { 0x0057, 0x0042, 0, VR::LO, VM::M1, "DicomReceiveNode" }, { 0x0057, 0x0043, 0, VR::LO, VM::M1, "ApplicationName" }, { 0x0057, 0x0044, 0, VR::LO, VM::M1, "ComputerName" }, }; const unsigned short Dict132TagHashTable[] = { 8, 11, 14, 7, 17, 20, 23, 0, 1, 4, 66, 1, 3, 65, 1, 2, 64, 1, 1, 48, 1, 6, 68, 2, 0, 32, 5, 67, }; const unsigned short Dict132KeyHashTable[] = { 8, 7, 11, 14, 17, 22, 25, 0, 1, 0, 58411, 1, 6, 30261, 1, 4, 44241, 2, 2, 5234, 3, 17497, 1, 1, 24725, 1, 5, 10092, }; vtkDICOMDictionary::Dict Dict132Data = { "VEPRO BROKER 1.0 DATA REPLACE", 7, 7, Dict132TagHashTable, Dict132KeyHashTable, Dict132Contents }; // ----- PHILIPS-MR-1 ----- const DictEntry Dict133Contents[] = { { 0x0019, 0x0011, 0, VR::IS, VM::M1, "ChemicalShiftNumber" }, { 0x0019, 0x0012, 0, VR::IS, VM::M1, "PhaseNumber" }, { 0x0021, 0x0001, 0, VR::IS, VM::M1, "ReconstructionNumber" }, { 0x0021, 0x0002, 0, VR::IS, VM::M1, "SliceNumber" }, }; const unsigned short Dict133TagHashTable[] = { 5, 4, 4, 10, 0, 2, 0, 17, 2, 1, 2, 1, 18, 3, 2, }; const unsigned short Dict133KeyHashTable[] = { 5, 4, 8, 13, 0, 1, 2, 1804, 2, 0, 57880, 3, 7303, 1, 1, 29943, }; vtkDICOMDictionary::Dict Dict133Data = { "PHILIPS-MR-1", 4, 4, Dict133TagHashTable, Dict133KeyHashTable, Dict133Contents }; // ----- MERGE TECHNOLOGIES, INC. ----- const DictEntry Dict134Contents[] = { { 0x0009, 0x0000, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict134TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict134KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict134Data = { "MERGE TECHNOLOGIES, INC.", 1, 1, Dict134TagHashTable, Dict134KeyHashTable, Dict134Contents }; // ----- SIEMENS DLR.01 ----- const DictEntry Dict135Contents[] = { { 0x0019, 0x0010, 0, VR::LO, VM::M1, "MeasurementMode" }, { 0x0019, 0x0011, 0, VR::LO, VM::M1, "ImageType" }, { 0x0019, 0x0015, 0, VR::LO, VM::M1, "SoftwareVersion" }, { 0x0019, 0x0020, 0, VR::LO, VM::M1, "MPMCode" }, { 0x0019, 0x0021, 0, VR::LO, VM::M1, "Latitude" }, { 0x0019, 0x0022, 0, VR::LO, VM::M1, "Sensitivity" }, { 0x0019, 0x0023, 0, VR::LO, VM::M1, "EDR" }, { 0x0019, 0x0024, 0, VR::LO, VM::M1, "LFix" }, { 0x0019, 0x0025, 0, VR::LO, VM::M1, "SFix" }, { 0x0019, 0x0026, 0, VR::LO, VM::M1, "PresetMode" }, { 0x0019, 0x0027, 0, VR::LO, VM::M1, "Region" }, { 0x0019, 0x0028, 0, VR::LO, VM::M1, "Subregion" }, { 0x0019, 0x0030, 0, VR::LO, VM::M1, "Orientation" }, { 0x0019, 0x0031, 0, VR::LO, VM::M1, "MarkOnFilm" }, { 0x0019, 0x0032, 0, VR::LO, VM::M1, "RotationOnDRC" }, { 0x0019, 0x0040, 0, VR::LO, VM::M1, "ReaderType" }, { 0x0019, 0x0041, 0, VR::LO, VM::M1, "SubModality" }, { 0x0019, 0x0042, 0, VR::LO, VM::M1, "ReaderSerialNumber" }, { 0x0019, 0x0050, 0, VR::LO, VM::M1, "CassetteScale" }, { 0x0019, 0x0051, 0, VR::LO, VM::M1, "CassetteMatrix" }, { 0x0019, 0x0052, 0, VR::LO, VM::M1, "CassetteSubmatrix" }, { 0x0019, 0x0053, 0, VR::LO, VM::M1, "Barcode" }, { 0x0019, 0x0060, 0, VR::LO, VM::M1, "ContrastType" }, { 0x0019, 0x0061, 0, VR::LO, VM::M1, "RotationAmount" }, { 0x0019, 0x0062, 0, VR::LO, VM::M1, "RotationCenter" }, { 0x0019, 0x0063, 0, VR::LO, VM::M1, "DensityShift" }, { 0x0019, 0x0064, 0, VR::US, VM::M1, "FrequencyRank" }, { 0x0019, 0x0065, 0, VR::LO, VM::M1, "FrequencyEnhancement" }, { 0x0019, 0x0066, 0, VR::LO, VM::M1, "FrequencyType" }, { 0x0019, 0x0067, 0, VR::LO, VM::M1, "KernelLength" }, { 0x0019, 0x0068, 0, VR::UL, VM::M1, "KernelMode" }, { 0x0019, 0x0069, 0, VR::UL, VM::M1, "ConvolutionMode" }, { 0x0019, 0x0070, 0, VR::LO, VM::M1, "PLASource" }, { 0x0019, 0x0071, 0, VR::LO, VM::M1, "PLADestination" }, { 0x0019, 0x0075, 0, VR::LO, VM::M1, "UIDOriginalImage" }, { 0x0019, 0x0076, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::LT, VM::M1, "ReaderHeader" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "PLAOfSecondaryDestination" }, { 0x0019, 0x00a0, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x0041, 0x0010, 0, VR::US, VM::M1, "NumberOfHardcopies" }, { 0x0041, 0x0020, 0, VR::LO, VM::M1, "FilmFormat" }, { 0x0041, 0x0030, 0, VR::LO, VM::M1, "FilmSize" }, { 0x0041, 0x0031, 0, VR::LO, VM::M1, "FullFilmFormat" }, }; const unsigned short Dict135TagHashTable[] = { 45, 48, 51, 44, 44, 54, 44, 57, 60, 65, 68, 71, 74, 79, 82, 85, 88, 93, 98, 101, 44, 104, 107, 110, 113, 118, 44, 44, 123, 126, 129, 132, 135, 138, 141, 144, 147, 152, 155, 158, 161, 164, 44, 167, 0, 1, 15, 64, 1, 16, 65, 1, 17, 66, 1, 11, 40, 1, 37, 144, 2, 1, 17, 41, 32, 1, 0, 16, 1, 39, 161, 1, 38, 160, 2, 2, 21, 4, 33, 1, 3, 32, 1, 6, 35, 1, 5, 34, 2, 8, 37, 32, 112, 2, 7, 36, 33, 113, 1, 10, 39, 1, 9, 38, 1, 34, 117, 1, 35, 118, 1, 36, 128, 2, 30, 104, 42, 48, 2, 31, 105, 43, 49, 1, 18, 80, 1, 19, 81, 1, 20, 82, 1, 21, 83, 1, 22, 96, 1, 23, 97, 1, 24, 98, 1, 25, 99, 2, 26, 100, 40, 16, 1, 27, 101, 1, 28, 102, 1, 29, 103, 1, 13, 49, 1, 12, 48, 1, 14, 50, }; const unsigned short Dict135KeyHashTable[] = { 44, 45, 44, 50, 55, 58, 44, 44, 44, 61, 44, 44, 44, 68, 81, 44, 88, 95, 98, 44, 103, 44, 106, 111, 44, 114, 117, 120, 123, 126, 44, 131, 136, 139, 44, 44, 142, 145, 150, 153, 44, 44, 44, 156, 0, 2, 4, 11280, 40, 54931, 2, 14, 58622, 30, 25862, 1, 33, 64368, 1, 23, 18891, 3, 13, 25001, 17, 26370, 37, 1802, 6, 9, 23948, 18, 31757, 35, 122, 38, 122, 39, 122, 43, 33893, 3, 15, 3585, 19, 28278, 24, 8438, 3, 5, 51952, 6, 5780, 29, 12298, 1, 21, 45827, 2, 16, 14432, 31, 31490, 1, 42, 40679, 2, 1, 48511, 2, 30736, 1, 32, 40781, 1, 27, 11731, 1, 41, 11453, 1, 25, 37270, 1, 7, 35677, 2, 10, 35721, 36, 25859, 2, 11, 19023, 34, 43688, 1, 0, 20604, 1, 22, 51631, 1, 20, 1261, 2, 12, 46009, 28, 6327, 1, 3, 36627, 1, 8, 41394, 1, 26, 4098, }; vtkDICOMDictionary::Dict Dict135Data = { "SIEMENS DLR.01", 44, 44, Dict135TagHashTable, Dict135KeyHashTable, Dict135Contents }; // ----- Agfa ADC NX ----- const DictEntry Dict136Contents[] = { { 0x0019, 0x0007, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::SQ, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00f0, 0, VR::LO, VM::M1, "UserDefinedField1" }, { 0x0019, 0x00f1, 0, VR::LO, VM::M1, "UserDefinedField2" }, { 0x0019, 0x00f2, 0, VR::LO, VM::M1, "UserDefinedField3" }, { 0x0019, 0x00f3, 0, VR::LO, VM::M1, "UserDefinedField4" }, { 0x0019, 0x00f4, 0, VR::LO, VM::M1, "UserDefinedField5" }, { 0x0019, 0x00f5, 0, VR::CS, VM::M1, "CassetteOrientation" }, { 0x0019, 0x00f6, 0, VR::DS, VM::M1, "PlateSensitivity" }, { 0x0019, 0x00f7, 0, VR::DS, VM::M1, "PlateErasability" }, { 0x0019, 0x00f8, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00fa, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00fc, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00fd, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00fe, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict136TagHashTable[] = { 18, 21, 17, 24, 17, 27, 17, 32, 17, 35, 38, 41, 44, 47, 52, 55, 60, 0, 1, 8, 244, 1, 9, 245, 1, 13, 250, 2, 2, 33, 12, 248, 1, 16, 254, 1, 14, 252, 1, 15, 253, 1, 6, 242, 1, 7, 243, 2, 0, 7, 4, 240, 1, 5, 241, 2, 3, 40, 10, 246, 2, 1, 9, 11, 247, }; const unsigned short Dict136KeyHashTable[] = { 18, 17, 17, 21, 17, 24, 17, 17, 17, 27, 17, 17, 17, 46, 49, 52, 57, 0, 1, 8, 58476, 1, 11, 50881, 1, 9, 49224, 9, 0, 316, 1, 316, 2, 316, 3, 316, 12, 316, 13, 316, 14, 316, 15, 316, 16, 316, 1, 4, 58475, 1, 5, 58475, 2, 6, 58475, 10, 41319, 1, 7, 58475, }; vtkDICOMDictionary::Dict Dict136Data = { "Agfa ADC NX", 17, 17, Dict136TagHashTable, Dict136KeyHashTable, Dict136Contents }; // ----- SIEMENS MR FOR 06 ----- const DictEntry Dict137Contents[] = { { 0x0021, 0x0001, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict137TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict137KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict137Data = { "SIEMENS MR FOR 06", 1, 1, Dict137TagHashTable, Dict137KeyHashTable, Dict137Contents }; // ----- Imaging Dynamics Company Ltd. ----- const DictEntry Dict138Contents[] = { { 0x4321, 0x0041, 0, VR::CS, VM::M1, "" }, { 0x4321, 0x0042, 0, VR::US, VM::M1, "" }, { 0x4321, 0x0064, 0, VR::LO, VM::M1, "PODMode" }, }; const unsigned short Dict138TagHashTable[] = { 4, 7, 10, 0, 1, 2, 100, 1, 0, 65, 1, 1, 66, }; const unsigned short Dict138KeyHashTable[] = { 3, 4, 7, 0, 1, 2, 38596, 2, 0, 1793, 1, 1793, }; vtkDICOMDictionary::Dict Dict138Data = { "Imaging Dynamics Company Ltd.", 3, 3, Dict138TagHashTable, Dict138KeyHashTable, Dict138Contents }; // ----- SIEMENS DFR.01 ORIGINAL ----- const DictEntry Dict139Contents[] = { { 0x0017, 0x0011, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0012, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0016, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0018, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0023, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0025, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0027, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x002a, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0030, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0033, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0037, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0041, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0043, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0045, 0, VR::DS, VM::M1, "" }, { 0x0017, 0x0046, 0, VR::DS, VM::M1, "" }, { 0x0017, 0x0047, 0, VR::SH, VM::M1, "" }, { 0x0017, 0x0048, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0049, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x004a, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0051, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0052, 0, VR::UL, VM::M1, "" }, { 0x0017, 0x0061, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0062, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0071, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0073, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0074, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0079, 0, VR::US, VM::M1, "" }, { 0x0017, 0x007a, 0, VR::US, VM::M1, "" }, { 0x0017, 0x007b, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x00a0, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x00c1, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x00c2, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict139TagHashTable[] = { 43, 44, 49, 52, 55, 58, 63, 70, 73, 78, 85, 88, 91, 43, 94, 97, 43, 102, 105, 43, 43, 43, 108, 111, 43, 114, 43, 43, 119, 43, 122, 43, 125, 128, 43, 43, 131, 134, 139, 144, 149, 152, 155, 0, 2, 4, 22, 20, 65, 1, 3, 21, 1, 2, 20, 1, 19, 56, 2, 1, 18, 12, 39, 3, 0, 17, 11, 38, 28, 74, 1, 10, 37, 2, 9, 36, 26, 72, 3, 8, 35, 27, 73, 40, 160, 1, 7, 34, 1, 6, 33, 1, 36, 116, 1, 34, 114, 2, 5, 24, 35, 115, 1, 33, 113, 1, 13, 42, 1, 38, 122, 1, 39, 123, 2, 30, 82, 37, 121, 1, 29, 81, 1, 32, 98, 1, 18, 55, 1, 31, 97, 1, 17, 51, 2, 16, 50, 24, 70, 2, 15, 49, 25, 71, 2, 14, 48, 22, 68, 1, 23, 69, 1, 41, 193, 2, 21, 67, 42, 194, }; const unsigned short Dict139KeyHashTable[] = { 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 43, 0, 125, 1, 125, 2, 125, 3, 125, 4, 125, 5, 125, 6, 125, 7, 125, 8, 125, 9, 125, 10, 125, 11, 125, 12, 125, 13, 125, 14, 125, 15, 125, 16, 125, 17, 125, 18, 125, 19, 125, 20, 125, 21, 125, 22, 125, 23, 125, 24, 125, 25, 125, 26, 125, 27, 125, 28, 125, 29, 125, 30, 125, 31, 125, 32, 125, 33, 125, 34, 125, 35, 125, 36, 125, 37, 125, 38, 125, 39, 125, 40, 125, 41, 125, 42, 125, }; vtkDICOMDictionary::Dict Dict139Data = { "SIEMENS DFR.01 ORIGINAL", 43, 43, Dict139TagHashTable, Dict139KeyHashTable, Dict139Contents }; // ----- NQHeader ----- const DictEntry Dict140Contents[] = { { 0x0099, 0x0001, 0, VR::UI, VM::M1, "Version" }, { 0x0099, 0x0002, 0, VR::UI, VM::M1, "AnalyzedSeriesUID" }, { 0x0099, 0x0003, 0, VR::LT, VM::M1, "License" }, { 0x0099, 0x0004, 0, VR::SS, VM::M1, "ReturnCode" }, { 0x0099, 0x0005, 0, VR::LT, VM::M1, "ReturnMessage" }, { 0x0099, 0x0010, 0, VR::FL, VM::M1, "MI" }, { 0x0099, 0x0020, 0, VR::SH, VM::M1, "Units" }, { 0x0099, 0x0021, 0, VR::FL, VM::M1, "ICV" }, }; const unsigned short Dict140TagHashTable[] = { 9, 12, 15, 20, 8, 8, 25, 28, 0, 1, 2, 3, 1, 1, 2, 2, 0, 1, 7, 33, 2, 5, 16, 6, 32, 1, 4, 5, 1, 3, 4, }; const unsigned short Dict140KeyHashTable[] = { 9, 8, 16, 21, 8, 8, 8, 26, 0, 3, 2, 513, 3, 36268, 6, 59479, 2, 1, 13509, 4, 12345, 2, 0, 6789, 5, 11919, 1, 7, 65100, }; vtkDICOMDictionary::Dict Dict140Data = { "NQHeader", 8, 8, Dict140TagHashTable, Dict140KeyHashTable, Dict140Contents }; // ----- SIEMENS CT APPL PRESENTATION ----- const DictEntry Dict141Contents[] = { { 0x0029, 0x0000, 0, VR::US, VM::M1, "TranslucentMode" }, { 0x0029, 0x0001, 0, VR::FD, VM::M1, "TranslucentWindowSize" }, { 0x0029, 0x0002, 0, VR::US, VM::M1, "PanoramicMode" }, { 0x0029, 0x0003, 0, VR::FD, VM::M1, "PanoramicInnerWidth" }, { 0x0029, 0x0004, 0, VR::US, VM::M1, "DisplayUnseenAreas" }, { 0x0029, 0x0005, 0, VR::US, VM::M4, "UnseenAreasColor" }, { 0x0029, 0x0006, 0, VR::US, VM::M1, "DisplayTaggedData" }, { 0x0029, 0x0007, 0, VR::US, VM::M4, "TaggedColor" }, { 0x0029, 0x0008, 0, VR::UL, VM::M1, "TaggedSampleThickness" }, { 0x0029, 0x0009, 0, VR::SL, VM::M1, "TaggedThreshold" }, { 0x0029, 0x0010, 0, VR::US, VM::M1, "KernelFilter" }, }; const unsigned short Dict141TagHashTable[] = { 12, 17, 20, 25, 11, 11, 11, 28, 31, 34, 37, 0, 2, 5, 5, 8, 8, 1, 4, 4, 2, 7, 7, 10, 16, 1, 6, 6, 1, 1, 1, 1, 0, 0, 1, 3, 3, 2, 2, 2, 9, 9, }; const unsigned short Dict141KeyHashTable[] = { 11, 12, 17, 11, 20, 11, 11, 11, 25, 34, 37, 0, 2, 6, 57280, 8, 4794, 1, 0, 40913, 2, 3, 15109, 10, 34552, 4, 1, 489, 2, 3604, 5, 30722, 7, 49656, 1, 4, 55748, 1, 9, 43036, }; vtkDICOMDictionary::Dict Dict141Data = { "SIEMENS CT APPL PRESENTATION", 11, 11, Dict141TagHashTable, Dict141KeyHashTable, Dict141Contents }; // ----- SIEMENS SYNGO PRINT SERVICE ----- const DictEntry Dict142Contents[] = { { 0x0029, 0x0010, 0, VR::IS, VM::M1, "SheetNumber" }, }; const unsigned short Dict142TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict142KeyHashTable[] = { 2, 0, 1, 0, 41639, }; vtkDICOMDictionary::Dict Dict142Data = { "SIEMENS SYNGO PRINT SERVICE", 1, 1, Dict142TagHashTable, Dict142KeyHashTable, Dict142Contents }; // ----- Siemens: Thorax/Multix FD Raw Image Settings ----- const DictEntry Dict143Contents[] = { { 0x0025, 0x0000, 0, VR::SS, VM::M1, "RawImageAmplification" }, { 0x0025, 0x0001, 0, VR::SS, VM::M1, "GammaLUT" }, { 0x0025, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0003, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0004, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0005, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0006, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0007, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0008, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x0009, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x000C, 0, VR::SS, VM::M1, "HarmonizationKernel" }, { 0x0025, 0x000D, 0, VR::FL, VM::M1, "HarmonizationGain" }, { 0x0025, 0x000E, 0, VR::SS, VM::M1, "EdgeEnhancementKernel" }, { 0x0025, 0x000F, 0, VR::FL, VM::M1, "EdgeEnhancementGain" }, { 0x0025, 0x000a, 0, VR::FL, VM::M1, "" }, { 0x0025, 0x000b, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0010, 0, VR::LT, VM::M1, "InternalValue" }, { 0x0025, 0x0011, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0012, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0013, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0014, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0015, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0016, 0, VR::SS, VM::M1, "" }, { 0x0025, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x0025, 0x0018, 0, VR::US, VM::M1, "AutoGain" }, { 0x0025, 0x0019, 0, VR::US, VM::M1, "OrthoSubsampling" }, { 0x0025, 0x001A, 0, VR::US, VM::M2, "ImageCropUpperLeft" }, { 0x0025, 0x001B, 0, VR::US, VM::M2, "ImageCropUpperRight" }, { 0x0025, 0x001C, 0, VR::US, VM::M2, "ImageCropLowerLeft" }, { 0x0025, 0x001D, 0, VR::US, VM::M2, "ImageCropLowerRight" }, { 0x0025, 0x0030, 0, VR::US, VM::M1, "ManualCropping" }, { 0x0025, 0x0031, 0, VR::SS, VM::M1, "GammaLUTParameter1" }, { 0x0025, 0x0032, 0, VR::DS, VM::M1, "GammaLUTParameter2" }, { 0x0025, 0x0033, 0, VR::SS, VM::M1, "GammaLUTParameter3" }, { 0x0025, 0x0034, 0, VR::SS, VM::M1, "GammaLUTParameter4" }, { 0x0025, 0x0035, 0, VR::LO, VM::M1, "GammaLUTName" }, { 0x0025, 0x0036, 0, VR::DS, VM::M1, "" }, { 0x0025, 0x0037, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict143TagHashTable[] = { 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 92, 97, 102, 107, 110, 113, 118, 123, 126, 38, 38, 38, 38, 38, 38, 129, 132, 135, 138, 141, 144, 0, 1, 3, 3, 1, 2, 2, 1, 11, 13, 1, 10, 12, 1, 13, 15, 1, 12, 14, 1, 9, 9, 1, 8, 8, 1, 15, 11, 1, 14, 10, 1, 21, 21, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 17, 17, 1, 16, 16, 2, 19, 19, 35, 53, 2, 18, 18, 34, 52, 2, 29, 29, 37, 55, 2, 28, 28, 36, 54, 1, 31, 49, 1, 30, 48, 2, 25, 25, 33, 51, 2, 24, 24, 32, 50, 1, 27, 27, 1, 26, 26, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict143KeyHashTable[] = { 38, 38, 38, 38, 38, 38, 38, 39, 38, 38, 38, 42, 45, 38, 48, 51, 38, 38, 54, 38, 38, 59, 38, 66, 38, 105, 38, 38, 38, 110, 113, 116, 119, 38, 122, 125, 38, 38, 0, 1, 1, 16521, 1, 29, 24356, 1, 25, 49271, 1, 0, 23126, 1, 16, 3080, 2, 27, 35950, 35, 1586, 3, 24, 51292, 26, 43589, 30, 27352, 19, 2, 141, 3, 141, 4, 141, 5, 141, 6, 141, 7, 141, 8, 141, 9, 141, 14, 141, 15, 141, 17, 141, 18, 141, 19, 141, 20, 141, 21, 141, 22, 141, 23, 141, 36, 141, 37, 141, 2, 11, 38621, 12, 52716, 1, 31, 16771, 1, 32, 16771, 1, 33, 16771, 1, 34, 16771, 1, 28, 19197, 2, 10, 26273, 13, 6170, }; vtkDICOMDictionary::Dict Dict143Data = { "Siemens: Thorax/Multix FD Raw Image Settings", 38, 38, Dict143TagHashTable, Dict143KeyHashTable, Dict143Contents }; // ----- SIEMENS CT VA0 ORI ----- const DictEntry Dict144Contents[] = { { 0x0009, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0030, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict144TagHashTable[] = { 2, 3, 0, 2, 0, 32, 1, 48, }; const unsigned short Dict144KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict144Data = { "SIEMENS CT VA0 ORI", 2, 2, Dict144TagHashTable, Dict144KeyHashTable, Dict144Contents }; // ----- Philips X-ray Imaging DD 001 ----- const DictEntry Dict145Contents[] = { { 0x2003, 0x0000, 0, VR::CS, VM::M1, "" }, { 0x2003, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x2003, 0x0002, 0, VR::FD, VM::M3, "" }, { 0x2003, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x2003, 0x0006, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0009, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x2003, 0x0011, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0012, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0013, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0014, 0, VR::FD, VM::M1, "" }, { 0x2003, 0x0015, 0, VR::FD, VM::M1, "" }, { 0x2003, 0x0016, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0017, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0018, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0019, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0022, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0024, 0, VR::FD, VM::M4, "" }, { 0x2003, 0x0025, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0026, 0, VR::SL, VM::M1, "" }, { 0x2003, 0x0027, 0, VR::SH, VM::M1, "" }, { 0x2003, 0x0028, 0, VR::SH, VM::M1, "" }, { 0x2003, 0x0029, 0, VR::FD, VM::M1, "" }, { 0x2003, 0x002a, 0, VR::LO, VM::M1, "" }, { 0x2003, 0x002b, 0, VR::FD, VM::M1, "" }, { 0x2003, 0x002c, 0, VR::SH, VM::M1, "" }, { 0x2003, 0x002d, 0, VR::SL, VM::M1TN, "" }, { 0x2003, 0x002e, 0, VR::SQ, VM::M1, "" }, { 0x2003, 0x0030, 0, VR::CS, VM::M1, "" }, { 0x2003, 0x0031, 0, VR::CS, VM::M1, "" }, { 0x2003, 0x0032, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict145TagHashTable[] = { 32, 37, 42, 45, 48, 31, 31, 51, 54, 31, 31, 31, 57, 60, 63, 68, 31, 71, 76, 79, 82, 85, 88, 93, 96, 31, 99, 102, 105, 110, 113, 0, 2, 6, 16, 29, 49, 2, 13, 23, 28, 48, 1, 12, 22, 1, 11, 21, 1, 10, 20, 1, 15, 25, 1, 14, 24, 1, 3, 3, 1, 2, 2, 2, 1, 1, 16, 34, 1, 0, 0, 2, 4, 6, 20, 39, 1, 19, 38, 1, 18, 37, 1, 17, 36, 1, 24, 43, 2, 5, 9, 23, 42, 1, 22, 41, 1, 21, 40, 1, 27, 46, 1, 26, 45, 2, 9, 19, 25, 44, 1, 8, 18, 2, 7, 17, 30, 50, }; const unsigned short Dict145KeyHashTable[] = { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 31, 0, 173, 1, 173, 2, 173, 3, 173, 4, 173, 5, 173, 6, 173, 7, 173, 8, 173, 9, 173, 10, 173, 11, 173, 12, 173, 13, 173, 14, 173, 15, 173, 16, 173, 17, 173, 18, 173, 19, 173, 20, 173, 21, 173, 22, 173, 23, 173, 24, 173, 25, 173, 26, 173, 27, 173, 28, 173, 29, 173, 30, 173, }; vtkDICOMDictionary::Dict Dict145Data = { "Philips X-ray Imaging DD 001", 31, 31, Dict145TagHashTable, Dict145KeyHashTable, Dict145Contents }; // ----- SIEMENS SMS-AX VIEW 1.0 ----- const DictEntry Dict146Contents[] = { { 0x0019, 0x0000, 0, VR::US, VM::M1, "ReviewMode" }, { 0x0019, 0x0001, 0, VR::US, VM::M1, "AnatomicalBackgroundPercent" }, { 0x0019, 0x0002, 0, VR::US, VM::M1, "NumberOfPhases" }, { 0x0019, 0x0003, 0, VR::US, VM::M1, "ApplyAnatomicalBackground" }, { 0x0019, 0x0004, 0, VR::SS, VM::M4T4N, "PixelShiftArray" }, { 0x0019, 0x0005, 0, VR::US, VM::M1, "Brightness" }, { 0x0019, 0x0006, 0, VR::US, VM::M1, "Contrast" }, { 0x0019, 0x0007, 0, VR::US, VM::M1, "EnabledShutters" }, { 0x0019, 0x0008, 0, VR::US, VM::M1, "NativeEdgeEnhancementPercentGain" }, { 0x0019, 0x0009, 0, VR::SS, VM::M1, "NativeEdgeEnhancementLUTIndex" }, { 0x0019, 0x000A, 0, VR::SS, VM::M1, "NativeEdgeEnhancementKernelSize" }, { 0x0019, 0x000B, 0, VR::US, VM::M1, "SubtractedEdgeEnhancementPercentGain" }, { 0x0019, 0x000C, 0, VR::SS, VM::M1, "SubtractedEdgeEnhancementLUTIndex" }, { 0x0019, 0x000D, 0, VR::SS, VM::M1, "SubtractedEdgeEnhancementKernelSize" }, { 0x0019, 0x000E, 0, VR::US, VM::M1, "FadePercent" }, { 0x0019, 0x000F, 0, VR::US, VM::M1, "FlippedBeforeLateralityApplied" }, { 0x0019, 0x0010, 0, VR::US, VM::M1, "ApplyFade" }, { 0x0019, 0x0011, 0, VR::US, VM::M1, "ReferenceImagesTakenFlag" }, { 0x0019, 0x0012, 0, VR::US, VM::M1, "Zoom" }, { 0x0019, 0x0013, 0, VR::SS, VM::M1, "PanX" }, { 0x0019, 0x0014, 0, VR::SS, VM::M1, "PanY" }, { 0x0019, 0x0015, 0, VR::SS, VM::M1, "NativeEdgeEnhancementAdvPercentGain" }, { 0x0019, 0x0016, 0, VR::SS, VM::M1, "SubtractedEdgeEnhancementAdvPercentGain" }, { 0x0019, 0x0017, 0, VR::US, VM::M1, "InvertFlag" }, { 0x0019, 0x001A, 0, VR::OB, VM::M1, "Quant1KOverlay" }, { 0x0019, 0x001B, 0, VR::US, VM::M1, "OriginalResolution" }, { 0x0019, 0x001C, 0, VR::DS, VM::M1, "AutoWindowCenter" }, { 0x0019, 0x001D, 0, VR::DS, VM::M1, "AutoWindowWidth" }, { 0x0019, 0x001E, 0, VR::IS, VM::M2, "AutoWindowCorrectValue" }, { 0x0019, 0x001F, 0, VR::DS, VM::M1, "SigmoidWindowParameter" }, { 0x0019, 0x0041, 0, VR::SL, VM::M2, "DispayedAreaTopLeftHandCorner" }, { 0x0019, 0x0042, 0, VR::SL, VM::M2, "DispayedAreaBottomRightHandCorner" }, }; const unsigned short Dict146TagHashTable[] = { 32, 32, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 107, 112, 115, 118, 121, 124, 0, 1, 25, 27, 1, 24, 26, 1, 27, 29, 1, 26, 28, 1, 29, 31, 1, 28, 30, 1, 17, 17, 1, 16, 16, 1, 19, 19, 1, 18, 18, 1, 21, 21, 1, 20, 20, 1, 23, 23, 1, 22, 22, 1, 9, 9, 1, 8, 8, 1, 11, 11, 1, 10, 10, 1, 13, 13, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 1, 1, 2, 0, 0, 30, 65, 2, 3, 3, 31, 66, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, }; const unsigned short Dict146KeyHashTable[] = { 32, 33, 32, 36, 39, 44, 47, 50, 53, 32, 56, 32, 61, 64, 67, 70, 32, 32, 73, 78, 83, 32, 86, 91, 32, 32, 32, 100, 103, 110, 113, 32, 0, 1, 11, 23830, 1, 10, 29837, 2, 3, 61601, 4, 54200, 1, 28, 58818, 1, 14, 25419, 1, 2, 23159, 1, 31, 601, 2, 18, 33412, 29, 37138, 1, 24, 45213, 1, 13, 59815, 1, 25, 29819, 1, 1, 3498, 2, 7, 31692, 21, 58846, 2, 6, 51386, 30, 25297, 1, 9, 5852, 2, 15, 33481, 27, 46874, 4, 8, 17585, 17, 40179, 23, 6823, 26, 18906, 1, 16, 64960, 3, 0, 37937, 19, 21703, 22, 65440, 1, 20, 21703, 2, 5, 20548, 12, 57634, }; vtkDICOMDictionary::Dict Dict146Data = { "SIEMENS SMS-AX VIEW 1.0", 32, 32, Dict146TagHashTable, Dict146KeyHashTable, Dict146Contents }; // ----- SPI-P-Private_CDS Release 1 ----- const DictEntry Dict147Contents[] = { { 0x0021, 0x0040, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0000, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict147TagHashTable[] = { 4, 3, 9, 0, 2, 0, 64, 2, 16, 1, 1, 0, }; const unsigned short Dict147KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict147Data = { "SPI-P-Private_CDS Release 1", 3, 3, Dict147TagHashTable, Dict147KeyHashTable, Dict147Contents }; // ----- astm.org/diconde/iod/NdeUsEquipment ----- const DictEntry Dict148Contents[] = { { 0x0009, 0x0002, 0, VR::SQ, VM::M1, "PulserEquipmentSequence" }, { 0x0009, 0x0004, 0, VR::CS, VM::M1, "PulserType" }, { 0x0009, 0x0006, 0, VR::LT, VM::M1, "PulserNotes" }, { 0x0009, 0x0008, 0, VR::SQ, VM::M1, "ReceiverEquipmentSequence" }, { 0x0009, 0x000A, 0, VR::CS, VM::M1, "AmplifierType" }, { 0x0009, 0x000C, 0, VR::LT, VM::M1, "ReceiverNotes" }, { 0x0009, 0x000E, 0, VR::SQ, VM::M1, "PreAmplifierEquipmentSequence" }, { 0x0009, 0x000F, 0, VR::LT, VM::M1, "PreAmplifierNotes" }, { 0x0009, 0x0010, 0, VR::SQ, VM::M1, "TransmitTransducerSequence" }, { 0x0009, 0x0011, 0, VR::SQ, VM::M1, "ReceiveTransducerSequence" }, { 0x0009, 0x0012, 0, VR::US, VM::M1, "NumberOfElements" }, { 0x0009, 0x0013, 0, VR::CS, VM::M1, "ElementShape" }, { 0x0009, 0x0014, 0, VR::DS, VM::M1, "ElementDimensionA" }, { 0x0009, 0x0015, 0, VR::DS, VM::M1, "ElementDimensionB" }, { 0x0009, 0x0016, 0, VR::DS, VM::M1, "ElementPitch" }, { 0x0009, 0x0017, 0, VR::DS, VM::M1, "MeasuredBeamDimensionA" }, { 0x0009, 0x0018, 0, VR::DS, VM::M1, "MeasuredBeamDimensionB" }, { 0x0009, 0x0019, 0, VR::DS, VM::M1, "LocationOfMeasuredBeamDiameter" }, { 0x0009, 0x001A, 0, VR::DS, VM::M1, "NominalFrequency" }, { 0x0009, 0x001B, 0, VR::DS, VM::M1, "MeasuredCenterFrequency" }, { 0x0009, 0x001C, 0, VR::DS, VM::M1, "MeasuredBandwidth" }, }; const unsigned short Dict148TagHashTable[] = { 22, 25, 21, 28, 33, 36, 41, 46, 51, 54, 57, 60, 21, 63, 21, 66, 69, 72, 75, 78, 21, 0, 1, 20, 28, 1, 3, 8, 2, 4, 10, 9, 17, 1, 8, 16, 2, 5, 12, 11, 19, 2, 7, 15, 10, 18, 2, 6, 14, 13, 21, 1, 12, 20, 1, 15, 23, 1, 14, 22, 1, 0, 2, 1, 1, 4, 1, 2, 6, 1, 17, 25, 1, 16, 24, 1, 19, 27, 1, 18, 26, }; const unsigned short Dict148KeyHashTable[] = { 21, 21, 22, 25, 21, 30, 35, 40, 21, 43, 48, 21, 55, 58, 21, 21, 21, 21, 61, 72, 21, 0, 1, 12, 26724, 2, 5, 26272, 13, 26724, 2, 4, 19311, 18, 19200, 2, 10, 63922, 20, 19842, 1, 8, 25012, 2, 7, 41841, 19, 23953, 3, 1, 9496, 2, 32547, 3, 62429, 1, 17, 25961, 1, 6, 62693, 5, 0, 29219, 9, 20866, 11, 49686, 14, 14017, 15, 51153, 1, 16, 51153, }; vtkDICOMDictionary::Dict Dict148Data = { "astm.org/diconde/iod/NdeUsEquipment", 21, 21, Dict148TagHashTable, Dict148KeyHashTable, Dict148Contents }; // ----- SIEMENS SYNGO TIME POINT SERVICE ----- const DictEntry Dict149Contents[] = { { 0x0029, 0x0001, 0, VR::LO, VM::M1, "TimePointID" }, { 0x0029, 0x0002, 0, VR::LO, VM::M1, "TimePointInformation" }, { 0x0029, 0x0050, 0, VR::SQ, VM::M1, "StudiesinTimePointSequence" }, }; const unsigned short Dict149TagHashTable[] = { 4, 7, 3, 0, 1, 2, 80, 2, 0, 1, 1, 2, }; const unsigned short Dict149KeyHashTable[] = { 3, 4, 7, 0, 1, 0, 17902, 2, 1, 4630, 2, 57039, }; vtkDICOMDictionary::Dict Dict149Data = { "SIEMENS SYNGO TIME POINT SERVICE", 3, 3, Dict149TagHashTable, Dict149KeyHashTable, Dict149Contents }; // ----- Silhouette Line V1.0 ----- const DictEntry Dict150Contents[] = { { 0x0029, 0x0011, 0, VR::IS, VM::M1, "LineName" }, { 0x0029, 0x0012, 0, VR::LT, VM::M1, "LineNameFont" }, { 0x0029, 0x0013, 0, VR::UL, VM::M1, "LineNameDisplay" }, { 0x0029, 0x0014, 0, VR::LT, VM::M1, "LineNormalColor" }, { 0x0029, 0x0015, 0, VR::UL, VM::M1, "LineType" }, { 0x0029, 0x0016, 0, VR::UL, VM::M1, "LineThickness" }, { 0x0029, 0x0017, 0, VR::UL, VM::M1, "LineStyle" }, { 0x0029, 0x0018, 0, VR::UL, VM::M1, "LineDashLength" }, { 0x0029, 0x0019, 0, VR::UL, VM::M1, "LineInteractivity" }, { 0x0029, 0x0020, 0, VR::LT, VM::M1, "LineMeasurementColor" }, { 0x0029, 0x0021, 0, VR::LT, VM::M1, "LineMeasurementFont" }, { 0x0029, 0x0022, 0, VR::UL, VM::M1, "LineMeasurementDashLength" }, { 0x0029, 0x0023, 0, VR::UL, VM::M1, "LinePointSpace" }, { 0x0029, 0x0024, 0, VR::FD, VM::M1, "LinePoints" }, { 0x0029, 0x0025, 0, VR::UL, VM::M1, "LineControlPointSize" }, { 0x0029, 0x0026, 0, VR::UL, VM::M1, "LineControlPointSpace" }, { 0x0029, 0x0027, 0, VR::FD, VM::M1, "LineControlPoints" }, { 0x0029, 0x0028, 0, VR::LT, VM::M1, "LineLabel" }, { 0x0029, 0x0029, 0, VR::UL, VM::M1, "LineDontSave" }, }; const unsigned short Dict150TagHashTable[] = { 20, 23, 28, 31, 34, 37, 40, 19, 43, 46, 49, 54, 59, 62, 65, 68, 19, 19, 71, 0, 1, 18, 41, 2, 2, 19, 17, 40, 1, 1, 18, 1, 4, 21, 1, 3, 20, 1, 6, 23, 1, 5, 22, 1, 10, 33, 1, 9, 32, 2, 8, 25, 12, 35, 2, 7, 24, 11, 34, 1, 14, 37, 1, 13, 36, 1, 16, 39, 1, 15, 38, 1, 0, 17, }; const unsigned short Dict150KeyHashTable[] = { 19, 20, 19, 19, 29, 32, 19, 19, 35, 40, 47, 50, 53, 19, 19, 60, 63, 66, 19, 0, 4, 8, 50265, 11, 56860, 14, 53126, 16, 22638, 1, 6, 35038, 1, 0, 37843, 2, 10, 58902, 15, 5844, 3, 7, 21090, 13, 29435, 18, 60056, 1, 9, 21432, 1, 4, 50572, 3, 3, 54323, 5, 3743, 12, 33869, 1, 1, 44530, 1, 2, 16316, 1, 17, 19604, }; vtkDICOMDictionary::Dict Dict150Data = { "Silhouette Line V1.0", 19, 19, Dict150TagHashTable, Dict150KeyHashTable, Dict150Contents }; // ----- BrainLAB_BeamProfile ----- const DictEntry Dict151Contents[] = { { 0x3411, 0x0001, 0, VR::SQ, VM::M1, "BeamProfileSequence" }, { 0x3411, 0x0002, 0, VR::IS, VM::M1, "BeamProfileNumber" }, { 0x3411, 0x0003, 0, VR::SQ, VM::M1, "BeamParameterSequence" }, { 0x3411, 0x0004, 0, VR::UT, VM::M1, "ParameterDescription" }, { 0x3411, 0x0005, 0, VR::OB, VM::M1, "ParameterData" }, { 0x3411, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamProfileNumber" }, }; const unsigned short Dict151TagHashTable[] = { 7, 10, 13, 16, 19, 22, 0, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 0, 1, 1, 5, 6, }; const unsigned short Dict151KeyHashTable[] = { 7, 12, 15, 6, 20, 6, 0, 2, 0, 57638, 3, 30167, 1, 5, 42433, 2, 2, 5395, 4, 42837, 1, 1, 52792, }; vtkDICOMDictionary::Dict Dict151Data = { "BrainLAB_BeamProfile", 6, 6, Dict151TagHashTable, Dict151KeyHashTable, Dict151Contents }; // ----- astm.org/diconde/iod/NdeDxCalibrationData ----- const DictEntry Dict152Contents[] = { { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" }, { 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" }, { 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" }, { 0x0009, 0x0070, 0, VR::OW, VM::M1, "AirCounts" }, { 0x0009, 0x0071, 0, VR::DS, VM::M1, "KVUsedInGainCalibration" }, { 0x0009, 0x0072, 0, VR::DS, VM::M1, "MAUsedInGainCalibration" }, { 0x0009, 0x0073, 0, VR::DS, VM::M1, "NumberOfFramesUsedForIntegration" }, { 0x0009, 0x0074, 0, VR::LO, VM::M1, "FilterMaterialUsedInGainCalibration" }, { 0x0009, 0x0075, 0, VR::DS, VM::M1, "FilterThicknessUsedInGainCalibration" }, { 0x0009, 0x0076, 0, VR::DA, VM::M1, "DateOfGainCalibration" }, { 0x0009, 0x0077, 0, VR::TM, VM::M1, "TimeOfGainCalibration" }, { 0x0009, 0x0080, 0, VR::OB, VM::M1, "BadPixelImage" }, { 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" }, }; const unsigned short Dict152TagHashTable[] = { 14, 13, 13, 17, 22, 25, 28, 31, 36, 39, 44, 13, 13, 0, 1, 2, 96, 2, 3, 112, 12, 153, 1, 4, 113, 1, 5, 114, 1, 6, 115, 2, 0, 64, 7, 116, 1, 8, 117, 2, 9, 118, 11, 128, 2, 1, 80, 10, 119, }; const unsigned short Dict152KeyHashTable[] = { 14, 19, 22, 13, 25, 30, 35, 13, 38, 43, 13, 13, 13, 0, 2, 7, 25645, 11, 50357, 1, 3, 29772, 1, 0, 24037, 2, 2, 48192, 5, 8278, 2, 6, 22008, 12, 56917, 1, 1, 56032, 2, 8, 9334, 10, 7464, 2, 4, 53052, 9, 5902, }; vtkDICOMDictionary::Dict Dict152Data = { "astm.org/diconde/iod/NdeDxCalibrationData", 13, 13, Dict152TagHashTable, Dict152KeyHashTable, Dict152Contents }; // ----- GEMS_XELPRV_01 ----- const DictEntry Dict153Contents[] = { { 0x0033, 0x0008, 0, VR::CS, VM::M1, "" }, { 0x0033, 0x0010, 0, VR::SL, VM::M1, "" }, { 0x0033, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x0016, 0, VR::UI, VM::M1, "" }, { 0x0033, 0x0017, 0, VR::DA, VM::M1, "" }, { 0x0033, 0x0018, 0, VR::TM, VM::M1, "" }, { 0x0033, 0x0019, 0, VR::UL, VM::M1, "" }, { 0x0033, 0x001a, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x001b, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x001c, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x001d, 0, VR::UL, VM::M1, "" }, { 0x0033, 0x001e, 0, VR::FD, VM::M1, "" }, { 0x0033, 0x001f, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0020, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0021, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0022, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0023, 0, VR::OB, VM::M1, "" }, { 0x0033, 0x0024, 0, VR::LT, VM::M1, "" }, { 0x0033, 0x0070, 0, VR::SQ, VM::M1, "" }, { 0x0033, 0x0071, 0, VR::UI, VM::M1, "" }, { 0x0033, 0x0072, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict153TagHashTable[] = { 22, 25, 30, 35, 40, 45, 21, 21, 21, 21, 21, 21, 21, 48, 51, 54, 57, 62, 67, 70, 75, 0, 1, 6, 25, 2, 5, 24, 20, 114, 2, 12, 31, 17, 36, 2, 11, 30, 18, 112, 2, 10, 29, 19, 113, 1, 9, 28, 1, 2, 17, 1, 1, 16, 1, 4, 23, 2, 3, 22, 16, 35, 2, 0, 8, 15, 34, 1, 14, 33, 2, 8, 27, 13, 32, 1, 7, 26, }; const unsigned short Dict153KeyHashTable[] = { 21, 21, 21, 21, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 21, 0, 256, 1, 256, 2, 256, 3, 256, 4, 256, 5, 256, 6, 256, 7, 256, 8, 256, 9, 256, 10, 256, 11, 256, 12, 256, 13, 256, 14, 256, 15, 256, 16, 256, 17, 256, 18, 256, 19, 256, 20, 256, }; vtkDICOMDictionary::Dict Dict153Data = { "GEMS_XELPRV_01", 21, 21, Dict153TagHashTable, Dict153KeyHashTable, Dict153Contents }; // ----- AgilityOverlay ----- const DictEntry Dict154Contents[] = { { 0x0071, 0x0001, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0002, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0003, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0005, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0006, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x0007, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0008, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0009, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x000a, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0010, 0, VR::FL, VM::M1, "" }, { 0x0071, 0x0011, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0012, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0013, 0, VR::US, VM::M1, "" }, { 0x0071, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0071, 0x0015, 0, VR::FD, VM::M1TN, "" }, { 0x0071, 0x0016, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0017, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0018, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0019, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x001b, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x001c, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x001d, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x0022, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x002c, 0, VR::ST, VM::M1, "" }, { 0x0071, 0x002d, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x002e, 0, VR::US, VM::M1, "" }, { 0x0071, 0x0050, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0051, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0052, 0, VR::LT, VM::M1, "" }, { 0x0071, 0x0053, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0054, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0055, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0056, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0057, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0059, 0, VR::FL, VM::M1, "" }, { 0x0071, 0x005a, 0, VR::FL, VM::M1, "" }, { 0x0071, 0x005b, 0, VR::FL, VM::M2, "" }, { 0x0071, 0x005c, 0, VR::FL, VM::M4, "" }, { 0x0071, 0x005d, 0, VR::CS, VM::M1, "" }, { 0x0071, 0x0060, 0, VR::FD, VM::M1, "" }, }; const unsigned short Dict154TagHashTable[] = { 41, 46, 49, 56, 59, 62, 40, 40, 40, 40, 40, 40, 65, 68, 71, 40, 74, 77, 82, 85, 88, 91, 94, 97, 100, 103, 40, 106, 109, 112, 40, 40, 115, 118, 123, 128, 133, 136, 141, 146, 0, 2, 6, 8, 34, 89, 1, 7, 9, 3, 8, 10, 22, 34, 36, 91, 1, 35, 90, 1, 38, 93, 1, 37, 92, 1, 23, 44, 1, 24, 45, 1, 25, 46, 1, 9, 16, 2, 10, 17, 39, 96, 1, 11, 18, 1, 12, 19, 1, 13, 20, 1, 14, 21, 1, 15, 22, 1, 16, 23, 1, 17, 24, 1, 18, 25, 1, 19, 27, 1, 20, 28, 1, 21, 29, 1, 27, 81, 2, 0, 1, 26, 80, 2, 1, 2, 29, 83, 2, 2, 3, 28, 82, 1, 31, 85, 2, 3, 5, 30, 84, 2, 4, 6, 33, 87, 2, 5, 7, 32, 86, }; const unsigned short Dict154KeyHashTable[] = { 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 0, 134, 1, 134, 2, 134, 3, 134, 4, 134, 5, 134, 6, 134, 7, 134, 8, 134, 9, 134, 10, 134, 11, 134, 12, 134, 13, 134, 14, 134, 15, 134, 16, 134, 17, 134, 18, 134, 19, 134, 20, 134, 21, 134, 22, 134, 23, 134, 24, 134, 25, 134, 26, 134, 27, 134, 28, 134, 29, 134, 30, 134, 31, 134, 32, 134, 33, 134, 34, 134, 35, 134, 36, 134, 37, 134, 38, 134, 39, 134, }; vtkDICOMDictionary::Dict Dict154Data = { "AgilityOverlay", 40, 40, Dict154TagHashTable, Dict154KeyHashTable, Dict154Contents }; // ----- VEPRO VIM 5.0 DATA ----- const DictEntry Dict155Contents[] = { { 0x0055, 0x0010, 0, VR::OB, VM::M1, "" }, { 0x0055, 0x0020, 0, VR::OB, VM::M1, "" }, { 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" }, { 0x0055, 0x0051, 0, VR::UI, VM::M1, "" }, { 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" }, }; const unsigned short Dict155TagHashTable[] = { 6, 9, 5, 12, 17, 0, 1, 2, 48, 1, 1, 32, 2, 0, 16, 4, 101, 1, 3, 81, }; const unsigned short Dict155KeyHashTable[] = { 6, 11, 5, 5, 5, 0, 2, 2, 60200, 4, 20181, 3, 0, 1076, 1, 1076, 3, 1076, }; vtkDICOMDictionary::Dict Dict155Data = { "VEPRO VIM 5.0 DATA", 5, 5, Dict155TagHashTable, Dict155KeyHashTable, Dict155Contents }; // ----- SIEMENS DICOM ----- const DictEntry Dict156Contents[] = { { 0x0009, 0x0010, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict156TagHashTable[] = { 2, 3, 0, 2, 0, 16, 1, 18, }; const unsigned short Dict156KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict156Data = { "SIEMENS DICOM", 2, 2, Dict156TagHashTable, Dict156KeyHashTable, Dict156Contents }; // ----- SIEMENS MED NM ----- const DictEntry Dict157Contents[] = { { 0x0009, 0x0080, 0, VR::ST, VM::M1, "" }, { 0x0011, 0x0010, 0, VR::ST, VM::M1, "" }, { 0x0017, 0x0000, 0, VR::ST, VM::M1, "" }, { 0x0017, 0x0020, 0, VR::ST, VM::M1, "" }, { 0x0017, 0x0070, 0, VR::ST, VM::M1, "" }, { 0x0017, 0x0080, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::SS, VM::M1, "" }, { 0x0019, 0x000F, 0, VR::SL, VM::M1TN, "SiemensICONDataType" }, { 0x0019, 0x0016, 0, VR::SS, VM::M1, "" }, { 0x0019, 0x0093, 0, VR::SL, VM::M2, "" }, { 0x0019, 0x00A5, 0, VR::SS, VM::M1TN, "NumberOfRepeatsPerPhase" }, { 0x0019, 0x00A6, 0, VR::SS, VM::M1TN, "CyclesPerRepeat" }, { 0x0019, 0x00A7, 0, VR::SL, VM::M1TN, "RepeatStartTime" }, { 0x0019, 0x00A8, 0, VR::SL, VM::M1TN, "RepeatStopTime" }, { 0x0019, 0x00A9, 0, VR::SL, VM::M1TN, "EffectiveRepeatTime" }, { 0x0019, 0x00AA, 0, VR::SS, VM::M1TN, "AcquiredCyclesPerRepeat" }, { 0x0019, 0x00a1, 0, VR::SS, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::SL, VM::M2, "" }, { 0x0019, 0x00c3, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x0000, 0, VR::OB, VM::M1, "ECATMainHeader" }, { 0x0021, 0x0001, 0, VR::OB, VM::M1, "ECATImageSubheader" }, { 0x0021, 0x0010, 0, VR::ST, VM::M1, "" }, { 0x0023, 0x0001, 0, VR::US, VM::M1, "DICOMReaderFlag" }, { 0x0029, 0x0008, 0, VR::CS, VM::M1, "ModalityImageHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "ModalityImageHeaderVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "ModalityImageHeaderInfo" }, { 0x0031, 0x0001, 0, VR::ST, VM::M1, "" }, { 0x0031, 0x000c, 0, VR::SS, VM::M1, "" }, { 0x0031, 0x000f, 0, VR::SL, VM::M1, "" }, { 0x0031, 0x0010, 0, VR::SL, VM::M1, "" }, { 0x0031, 0x0012, 0, VR::SS, VM::M1, "" }, { 0x0031, 0x0013, 0, VR::ST, VM::M1, "" }, { 0x0031, 0x0014, 0, VR::ST, VM::M1, "" }, { 0x0031, 0x0015, 0, VR::SL, VM::M1TN, "" }, { 0x0031, 0x0016, 0, VR::SL, VM::M1TN, "" }, { 0x0031, 0x0017, 0, VR::SS, VM::M1TN, "" }, { 0x0031, 0x0020, 0, VR::ST, VM::M1, "" }, { 0x0031, 0x0021, 0, VR::SS, VM::M1, "" }, { 0x0033, 0x0000, 0, VR::FL, VM::M1TN, "FloodCorrectionMatrixDetector1" }, { 0x0033, 0x0001, 0, VR::FL, VM::M1TN, "FloodCorrectionMatrixDetector2" }, { 0x0033, 0x0010, 0, VR::FL, VM::M1TN, "CORDataForDetector1" }, { 0x0033, 0x0011, 0, VR::FL, VM::M1TN, "CORDataForDetector2" }, { 0x0033, 0x0014, 0, VR::FL, VM::M1, "MHRDataForDetector1" }, { 0x0033, 0x0015, 0, VR::FL, VM::M1, "MHRDataForDetector2" }, { 0x0033, 0x0018, 0, VR::FL, VM::M1TN, "NCODataForDetector1" }, { 0x0033, 0x0019, 0, VR::FL, VM::M1TN, "NCODataForDetector2" }, { 0x0033, 0x001A, 0, VR::FL, VM::M1TN, "" }, { 0x0033, 0x0020, 0, VR::FL, VM::M1, "BedCorrectionAngle" }, { 0x0033, 0x0021, 0, VR::FL, VM::M1, "GantryCorrectionAngle" }, { 0x0033, 0x0022, 0, VR::SS, VM::M1TN, "BedUDCorrectionData" }, { 0x0033, 0x0023, 0, VR::SS, VM::M1TN, "GantryLRCorrectionData" }, { 0x0033, 0x0024, 0, VR::FL, VM::M1, "BackProjectionCorrectionAngleHead1" }, { 0x0033, 0x0025, 0, VR::FL, VM::M1, "BackProjectionCorrectionAngleHead2" }, { 0x0033, 0x0028, 0, VR::SL, VM::M1, "MHRCalibrations" }, { 0x0033, 0x0029, 0, VR::FL, VM::M1TN, "CrystalThickness" }, { 0x0033, 0x0030, 0, VR::LO, VM::M1, "PresetNameUsedForAcquisition" }, { 0x0033, 0x0031, 0, VR::FL, VM::M1, "CameraConfigAngle" }, { 0x0033, 0x0032, 0, VR::LO, VM::M1, "CrystalType" }, { 0x0033, 0x0033, 0, VR::SL, VM::M1, "CoinGantryStep" }, { 0x0033, 0x0034, 0, VR::FL, VM::M1, "WholebodyBedStep" }, { 0x0033, 0x0035, 0, VR::FL, VM::M1, "WeightFactorTableForCoincidenceAcquisitions" }, { 0x0033, 0x0036, 0, VR::FL, VM::M1, "CoincidenceWeightFactorTable" }, { 0x0033, 0x0037, 0, VR::SL, VM::M1, "StarburstFlagsAtImageAcqTime" }, { 0x0033, 0x0038, 0, VR::FL, VM::M1, "PixelScaleFactor" }, { 0x0035, 0x0000, 0, VR::LO, VM::M1, "SpecializedTomoType" }, { 0x0035, 0x0001, 0, VR::LO, VM::M1, "EnergyWindowType" }, { 0x0035, 0x0002, 0, VR::SS, VM::M1, "StartandEndRowIlluminatedByWindPosition" }, { 0x0035, 0x0003, 0, VR::LO, VM::M1, "BlankScanImageForProfile" }, { 0x0035, 0x0004, 0, VR::SS, VM::M1, "RepeatNumberOfTheOriginalDynamicSPECT" }, { 0x0035, 0x0005, 0, VR::SS, VM::M1, "PhaseNumberOfTheOriginalDynamicSPECT" }, { 0x0035, 0x0006, 0, VR::LO, VM::M1, "SiemensProfile2ImageSubtype" }, { 0x0037, 0x0000, 0, VR::OW, VM::M1, "FloodCorrectionMatrixDetector1" }, { 0x0037, 0x0080, 0, VR::OW, VM::M1, "FloodCorrectionMatrixDetector2" }, { 0x0039, 0x0000, 0, VR::LT, VM::M1, "ToshibaCBFActivityResults" }, { 0x0039, 0x0001, 0, VR::LT, VM::M1, "RelatedCTSeriesInstanceUID" }, { 0x0041, 0x0001, 0, VR::SL, VM::M1, "WholeBodyTomoPositionIndex" }, { 0x0041, 0x0002, 0, VR::SL, VM::M1, "WholeBodyTomoNumberOfPositions" }, { 0x0041, 0x0003, 0, VR::FL, VM::M1, "HorizontalTablePositionOfCTScan" }, { 0x0041, 0x0004, 0, VR::FL, VM::M1, "EffectiveEnergyOfCTScan" }, { 0x0041, 0x0005, 0, VR::FD, VM::M1TN, "LongLinearDriveInformationForDetector1" }, { 0x0041, 0x0006, 0, VR::FD, VM::M1TN, "LongLinearDriveInformationForDetector2" }, { 0x0041, 0x0007, 0, VR::FD, VM::M1TN, "TrunnionInformationForDetector1" }, { 0x0041, 0x0008, 0, VR::FD, VM::M1TN, "TrunnionInformationForDetector2" }, { 0x0041, 0x0009, 0, VR::FL, VM::M1, "BroadBeamFactor" }, { 0x0041, 0x000A, 0, VR::FD, VM::M1, "OriginalWholebodyPosition" }, { 0x0041, 0x000B, 0, VR::FD, VM::M1, "WholebodyScanRange" }, { 0x0041, 0x0010, 0, VR::FL, VM::M1T3, "EffectiveEmissionEnergy" }, { 0x0041, 0x0011, 0, VR::FL, VM::M1TN, "GatedFrameDuration" }, { 0x0041, 0x0030, 0, VR::ST, VM::M1, "" }, { 0x0041, 0x0032, 0, VR::ST, VM::M1, "" }, { 0x0043, 0x0001, 0, VR::FL, VM::M1TN, "DetectorViewAngle" }, { 0x0043, 0x0002, 0, VR::FD, VM::M1T16, "TransformationMatrix" }, { 0x0043, 0x0003, 0, VR::FL, VM::M1TN, "ViewDependentYShiftMHRForDetector1" }, { 0x0043, 0x0004, 0, VR::FL, VM::M1TN, "ViewDependentYShiftMHRForDetector2" }, { 0x0045, 0x0001, 0, VR::LO, VM::M1TN, "PlanarProcessingString" }, { 0x0055, 0x0004, 0, VR::SS, VM::M1, "PromptWindowWidth" }, { 0x0055, 0x0005, 0, VR::SS, VM::M1, "RandomWindowWidth" }, { 0x0055, 0x0020, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0022, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0024, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0030, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0032, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0034, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0040, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0042, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0044, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x004c, 0, VR::SL, VM::M1, "" }, { 0x0055, 0x004d, 0, VR::SL, VM::M1, "" }, { 0x0055, 0x0051, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0052, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x0053, 0, VR::ST, VM::M1, "" }, { 0x0055, 0x0055, 0, VR::SL, VM::M1, "" }, { 0x0055, 0x005c, 0, VR::ST, VM::M1, "" }, { 0x0055, 0x006d, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x007e, 0, VR::FL, VM::M2, "CollimatorThickness" }, { 0x0055, 0x007f, 0, VR::FL, VM::M2, "CollimatorAngularResolution" }, { 0x0055, 0x00C0, 0, VR::SS, VM::M1TN, "UsefulFieldOfView" }, { 0x0055, 0x00a8, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x00c2, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x00c3, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x00c4, 0, VR::SS, VM::M1, "" }, { 0x0055, 0x00d0, 0, VR::SS, VM::M1, "" }, { 0x0057, 0x0001, 0, VR::LO, VM::M1, "SyngoMIDICOMOriginalImageType" }, { 0x0057, 0x0002, 0, VR::FL, VM::M1, "DoseCalibrationFactor" }, { 0x0057, 0x0003, 0, VR::LO, VM::M1, "Units" }, { 0x0057, 0x0004, 0, VR::LO, VM::M1, "DecayCorrection" }, { 0x0057, 0x0005, 0, VR::SL, VM::M1TN, "RadionuclideHalfLife" }, { 0x0057, 0x0006, 0, VR::FL, VM::M1, "RescaleIntercept" }, { 0x0057, 0x0007, 0, VR::FL, VM::M1, "RescaleSlope" }, { 0x0057, 0x0008, 0, VR::FL, VM::M1, "FrameReferenceTime" }, { 0x0057, 0x0009, 0, VR::SL, VM::M1, "NumberofRadiopharmaceuticalInformationSequence" }, { 0x0057, 0x000A, 0, VR::FL, VM::M1, "DecayFactor" }, { 0x0057, 0x000B, 0, VR::LO, VM::M1, "CountsSource" }, { 0x0057, 0x000C, 0, VR::SL, VM::M1TN, "RadionuclidePositronFraction" }, { 0x0057, 0x000E, 0, VR::US, VM::M1TN, "TriggerTimeOfCTSlice" }, { 0x0061, 0x0001, 0, VR::FL, VM::M1TN, "XPrincipalRayOffset" }, { 0x0061, 0x0005, 0, VR::FL, VM::M1TN, "YPrincipalRayOffset" }, { 0x0061, 0x0009, 0, VR::FL, VM::M1TN, "XPrincipalRayAngle" }, { 0x0061, 0x000A, 0, VR::FL, VM::M1TN, "YPrincipalRayAngle" }, { 0x0061, 0x000B, 0, VR::FL, VM::M1TN, "XShortFocalLength" }, { 0x0061, 0x000C, 0, VR::FL, VM::M1TN, "YShortFocalLength" }, { 0x0061, 0x000D, 0, VR::FL, VM::M1TN, "XLongFocalLength" }, { 0x0061, 0x000E, 0, VR::FL, VM::M1TN, "YLongFocalLength" }, { 0x0061, 0x000F, 0, VR::FL, VM::M1TN, "XFocalScaling" }, { 0x0061, 0x0010, 0, VR::FL, VM::M1TN, "YFocalScaling" }, { 0x0061, 0x0011, 0, VR::FL, VM::M1TN, "XMotionCorrectionShift" }, { 0x0061, 0x0015, 0, VR::FL, VM::M1TN, "YMotionCorrectionShift" }, { 0x0061, 0x0019, 0, VR::FL, VM::M1, "XHeartCenter" }, { 0x0061, 0x001A, 0, VR::FL, VM::M1, "YHeartCenter" }, { 0x0061, 0x001B, 0, VR::FL, VM::M1, "ZHeartCenter" }, { 0x0061, 0x001C, 0, VR::LO, VM::M1, "ImagePixelContentType" }, { 0x0061, 0x001D, 0, VR::SS, VM::M1, "AutoSaveCorrectedSeries" }, { 0x0061, 0x001E, 0, VR::LT, VM::M1, "DistortedSeriesInstanceUID" }, { 0x0061, 0x0021, 0, VR::SS, VM::M1TN, "ReconRange" }, { 0x0061, 0x0022, 0, VR::LO, VM::M1, "ReconOrientation" }, { 0x0061, 0x0023, 0, VR::FL, VM::M1TN, "ReconSelectedAngularRange" }, { 0x0061, 0x0024, 0, VR::FL, VM::M1, "ReconTransverseAngle" }, { 0x0061, 0x0025, 0, VR::FL, VM::M1, "ReconSagittalAngle" }, { 0x0061, 0x0026, 0, VR::FL, VM::M1, "ReconXMaskSize" }, { 0x0061, 0x0027, 0, VR::FL, VM::M1, "ReconYMaskSize" }, { 0x0061, 0x0028, 0, VR::FL, VM::M1, "ReconXImageCenter" }, { 0x0061, 0x0029, 0, VR::FL, VM::M1, "ReconYImageCenter" }, { 0x0061, 0x002A, 0, VR::FL, VM::M1, "ReconZImageCenter" }, { 0x0061, 0x002B, 0, VR::FL, VM::M1, "ReconXZoom" }, { 0x0061, 0x002C, 0, VR::FL, VM::M1, "ReconYZoom" }, { 0x0061, 0x002D, 0, VR::FL, VM::M1, "ReconThreshold" }, { 0x0061, 0x002E, 0, VR::FL, VM::M1, "ReconOutputPixelSize" }, { 0x0061, 0x002F, 0, VR::LO, VM::M1TN, "ScatterEstimationMethod" }, { 0x0061, 0x0030, 0, VR::LO, VM::M1TN, "ScatterEstimationMethodMode" }, { 0x0061, 0x0031, 0, VR::FL, VM::M1TN, "ScatterEstimationLowerWindowWeights" }, { 0x0061, 0x0032, 0, VR::FL, VM::M1TN, "ScatterEstimationUpperWindowWeights" }, { 0x0061, 0x0033, 0, VR::LO, VM::M1TN, "ScatterEstimationWindowMode" }, { 0x0061, 0x0034, 0, VR::LO, VM::M1TN, "ScatterEstimationFilter" }, { 0x0061, 0x0035, 0, VR::LO, VM::M1, "ReconRawTomoInputUID" }, { 0x0061, 0x0036, 0, VR::LO, VM::M1, "ReconCTInputUID" }, { 0x0061, 0x0037, 0, VR::FL, VM::M1, "ReconZMaskSize" }, { 0x0061, 0x0038, 0, VR::FL, VM::M1, "ReconXMaskCenter" }, { 0x0061, 0x0039, 0, VR::FL, VM::M1, "ReconYMaskCenter" }, { 0x0061, 0x003A, 0, VR::FL, VM::M1, "ReconZMaskCenter" }, { 0x0061, 0x0051, 0, VR::LT, VM::M1, "RawTomoSeriesUID" }, { 0x0061, 0x0052, 0, VR::LT, VM::M1, "LowResCTSeriesUID" }, { 0x0061, 0x0053, 0, VR::LT, VM::M1, "HighResCTSeriesUID" }, { 0x7FE3, 0x0014, 0, VR::OW, VM::M1, "MinimumPixelInFrame" }, { 0x7FE3, 0x0015, 0, VR::OW, VM::M1, "MaximumPixelInFrame" }, { 0x7FE3, 0x0029, 0, VR::OW, VM::M1, "NumberOfRWavesInFrame" }, { 0x7fe3, 0x0016, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x001b, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x001c, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x001e, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x0026, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x0027, 0, VR::OW, VM::M1, "" }, { 0x7fe3, 0x0028, 0, VR::OW, VM::M1, "" }, }; const unsigned short Dict157TagHashTable[] = { 193, 200, 205, 210, 213, 218, 221, 226, 233, 236, 241, 244, 192, 192, 192, 247, 250, 255, 264, 267, 192, 270, 273, 278, 285, 288, 293, 296, 192, 192, 192, 192, 299, 304, 311, 318, 323, 326, 329, 334, 192, 339, 342, 347, 192, 192, 192, 192, 352, 359, 364, 369, 376, 381, 386, 389, 396, 401, 406, 409, 192, 412, 415, 192, 420, 423, 430, 435, 442, 447, 454, 461, 466, 471, 476, 481, 486, 489, 492, 495, 498, 507, 516, 521, 526, 531, 536, 539, 544, 549, 552, 192, 557, 560, 563, 566, 569, 572, 192, 192, 575, 578, 581, 192, 192, 586, 589, 592, 595, 598, 601, 604, 607, 614, 617, 192, 620, 623, 626, 192, 192, 629, 632, 635, 638, 641, 644, 192, 192, 192, 192, 192, 192, 192, 192, 647, 650, 192, 192, 653, 192, 192, 192, 192, 192, 192, 192, 656, 659, 662, 192, 667, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 670, 673, 676, 192, 679, 192, 192, 682, 192, 685, 192, 688, 691, 694, 192, 0, 3, 58, 51, 111, 85, 187, 28, 2, 1, 16, 57, 50, 2, 56, 49, 188, 30, 1, 55, 48, 2, 62, 55, 108, 81, 1, 61, 54, 2, 60, 53, 110, 83, 3, 59, 52, 109, 82, 186, 27, 1, 182, 20, 2, 112, 92, 183, 21, 1, 185, 22, 1, 63, 56, 1, 8, 22, 2, 37, 33, 50, 35, 4, 6, 8, 36, 32, 49, 34, 105, 68, 1, 48, 33, 1, 47, 32, 1, 103, 64, 2, 7, 15, 52, 37, 3, 2, 0, 51, 36, 104, 66, 1, 107, 77, 2, 18, 195, 106, 76, 1, 54, 41, 1, 53, 40, 2, 20, 1, 24, 9, 3, 19, 0, 23, 8, 29, 16, 3, 22, 1, 31, 19, 41, 17, 2, 30, 18, 40, 16, 1, 33, 21, 1, 32, 20, 2, 35, 23, 43, 21, 2, 34, 22, 42, 20, 1, 46, 26, 2, 45, 25, 115, 127, 2, 44, 24, 114, 126, 3, 26, 1, 69, 5, 179, 81, 2, 21, 16, 68, 4, 2, 39, 1, 181, 83, 3, 38, 0, 70, 6, 180, 82, 2, 65, 1, 191, 40, 2, 64, 0, 184, 41, 1, 67, 3, 3, 3, 32, 66, 2, 71, 0, 2, 74, 1, 113, 109, 2, 25, 16, 73, 0, 1, 189, 38, 1, 190, 39, 1, 27, 12, 2, 28, 15, 117, 168, 1, 91, 2, 3, 75, 1, 92, 3, 153, 33, 2, 76, 2, 154, 34, 3, 77, 3, 90, 1, 155, 35, 2, 78, 4, 156, 36, 3, 79, 5, 94, 1, 157, 37, 3, 80, 6, 93, 4, 158, 38, 2, 81, 7, 159, 39, 2, 82, 8, 160, 40, 2, 83, 9, 161, 41, 2, 84, 10, 162, 42, 2, 85, 11, 163, 43, 1, 164, 44, 1, 165, 45, 1, 166, 46, 1, 167, 47, 4, 86, 16, 95, 4, 127, 6, 168, 48, 4, 87, 17, 96, 5, 128, 7, 169, 49, 2, 125, 4, 170, 50, 2, 126, 5, 171, 51, 2, 123, 2, 172, 52, 2, 124, 3, 173, 53, 1, 174, 54, 2, 122, 1, 175, 55, 2, 134, 14, 176, 56, 1, 177, 57, 2, 133, 12, 178, 58, 1, 131, 10, 1, 132, 11, 1, 129, 8, 1, 130, 9, 1, 102, 52, 1, 135, 1, 1, 100, 48, 1, 136, 5, 2, 4, 112, 101, 50, 1, 137, 9, 1, 138, 10, 1, 139, 11, 1, 140, 12, 1, 141, 13, 1, 142, 14, 1, 143, 15, 3, 88, 48, 99, 36, 144, 16, 1, 145, 17, 1, 89, 50, 1, 97, 32, 1, 146, 21, 1, 98, 34, 1, 147, 25, 1, 148, 26, 1, 149, 27, 1, 150, 28, 1, 151, 29, 1, 152, 30, 1, 121, 208, 1, 9, 147, 1, 0, 128, 1, 120, 196, 1, 119, 195, 2, 5, 128, 118, 194, 1, 116, 192, 1, 15, 170, 1, 14, 169, 1, 13, 168, 1, 72, 128, 1, 17, 163, 1, 16, 161, 1, 12, 167, 1, 11, 166, 1, 10, 165, }; const unsigned short Dict157KeyHashTable[] = { 193, 192, 192, 196, 192, 199, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 316, 321, 328, 335, 340, 345, 348, 351, 354, 192, 363, 366, 192, 192, 192, 192, 369, 192, 374, 377, 380, 192, 383, 192, 388, 391, 192, 192, 192, 394, 399, 192, 404, 411, 192, 192, 192, 192, 416, 192, 421, 424, 427, 192, 432, 437, 442, 192, 192, 445, 448, 451, 192, 454, 457, 192, 460, 192, 192, 192, 463, 192, 192, 466, 192, 469, 472, 192, 192, 192, 192, 477, 482, 485, 192, 192, 192, 488, 491, 192, 494, 497, 500, 192, 503, 192, 192, 506, 509, 514, 517, 192, 520, 523, 526, 192, 529, 192, 532, 539, 192, 192, 192, 544, 549, 554, 557, 560, 192, 563, 572, 192, 192, 192, 575, 192, 192, 192, 578, 581, 586, 589, 592, 192, 192, 192, 192, 595, 192, 598, 192, 192, 603, 192, 608, 192, 192, 611, 616, 192, 619, 622, 192, 192, 192, 192, 192, 625, 192, 192, 628, 192, 192, 635, 638, 641, 192, 192, 192, 644, 192, 192, 192, 647, 650, 653, 658, 192, 661, 192, 664, 667, 192, 192, 192, 0, 1, 25, 14993, 1, 12, 58950, 58, 0, 28, 1, 28, 2, 28, 3, 28, 4, 28, 5, 28, 6, 28, 8, 28, 9, 28, 16, 28, 17, 28, 18, 28, 21, 28, 26, 28, 27, 28, 28, 28, 29, 28, 30, 28, 31, 28, 32, 28, 33, 28, 34, 28, 35, 28, 36, 28, 37, 28, 46, 28, 88, 28, 89, 28, 97, 28, 98, 28, 99, 28, 100, 28, 101, 28, 102, 28, 103, 28, 104, 28, 105, 28, 106, 28, 107, 28, 108, 28, 109, 28, 110, 28, 111, 28, 112, 28, 113, 28, 117, 28, 118, 28, 119, 28, 120, 28, 121, 28, 174, 56675, 185, 28, 186, 28, 187, 28, 188, 28, 189, 28, 190, 28, 191, 28, 2, 38, 54036, 71, 54036, 3, 39, 54036, 72, 54036, 147, 5409, 3, 54, 10752, 138, 32469, 181, 51606, 2, 139, 4698, 149, 40474, 2, 51, 4629, 140, 35378, 1, 52, 4629, 1, 173, 10040, 1, 62, 21072, 4, 59, 65067, 152, 9160, 161, 32838, 167, 9983, 1, 13, 36349, 1, 155, 31856, 2, 90, 58185, 176, 34768, 1, 178, 54366, 1, 144, 37966, 1, 180, 9437, 2, 114, 17382, 183, 52821, 1, 57, 95, 1, 146, 16448, 2, 63, 54838, 69, 53826, 2, 10, 51229, 66, 18878, 3, 44, 13434, 78, 1582, 91, 4183, 2, 45, 13434, 137, 24914, 2, 76, 47445, 170, 59721, 1, 48, 36676, 1, 164, 61385, 2, 87, 36776, 158, 18758, 2, 175, 38174, 184, 46722, 2, 15, 8785, 68, 45776, 1, 58, 20684, 1, 79, 63217, 1, 80, 63217, 1, 134, 11980, 1, 14, 35347, 1, 53, 3303, 1, 145, 23175, 1, 116, 5085, 1, 156, 2686, 1, 127, 11533, 2, 126, 45049, 136, 8918, 2, 20, 18643, 42, 3165, 1, 43, 3165, 1, 55, 1696, 1, 96, 44837, 1, 95, 57055, 1, 83, 40842, 1, 177, 876, 1, 143, 49217, 1, 182, 46758, 1, 154, 58221, 2, 65, 34845, 165, 3013, 1, 131, 14311, 1, 60, 61443, 1, 67, 58135, 1, 129, 9264, 1, 47, 48086, 1, 122, 41342, 3, 64, 63470, 148, 22941, 151, 34219, 2, 141, 30734, 169, 654, 2, 124, 65283, 160, 15305, 2, 73, 47986, 163, 55208, 1, 162, 50370, 1, 49, 32647, 1, 84, 36379, 4, 7, 25365, 22, 46161, 168, 31192, 172, 48239, 1, 74, 32913, 1, 125, 49344, 1, 92, 2347, 2, 61, 2196, 93, 2347, 1, 153, 19451, 1, 166, 7134, 1, 56, 40369, 1, 11, 34855, 2, 132, 46535, 135, 21752, 2, 142, 48875, 171, 30958, 1, 123, 25681, 2, 24, 38743, 81, 24829, 1, 82, 24829, 1, 77, 40164, 1, 75, 44768, 1, 85, 25630, 3, 86, 10561, 128, 161, 150, 23394, 1, 50, 30779, 1, 70, 34961, 1, 133, 40899, 1, 19, 61462, 1, 130, 30582, 1, 40, 9629, 2, 23, 17115, 41, 9629, 1, 94, 64070, 1, 115, 14090, 1, 179, 49914, 2, 157, 2892, 159, 39388, }; vtkDICOMDictionary::Dict Dict157Data = { "SIEMENS MED NM", 192, 192, Dict157TagHashTable, Dict157KeyHashTable, Dict157Contents }; // ----- SPI-P-XSB-DCI Release 1 ----- const DictEntry Dict158Contents[] = { { 0x0019, 0x0010, 0, VR::LT, VM::M1, "VideoBeamBoost" }, { 0x0019, 0x0011, 0, VR::US, VM::M1, "ChannelGeneratingVideoSync" }, { 0x0019, 0x0012, 0, VR::US, VM::M1, "VideoGain" }, { 0x0019, 0x0013, 0, VR::US, VM::M1, "VideoOffset" }, { 0x0019, 0x0020, 0, VR::DS, VM::M1, "RTDDataCompressionFactor" }, }; const unsigned short Dict158TagHashTable[] = { 6, 9, 12, 15, 18, 0, 1, 3, 19, 1, 2, 18, 1, 4, 32, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict158KeyHashTable[] = { 5, 5, 5, 6, 13, 0, 3, 1, 23927, 2, 49848, 3, 24448, 2, 0, 35076, 4, 22366, }; vtkDICOMDictionary::Dict Dict158Data = { "SPI-P-XSB-DCI Release 1", 5, 5, Dict158TagHashTable, Dict158KeyHashTable, Dict158Contents }; // ----- GEMS_AWSOFT_CD1 ----- const DictEntry Dict159Contents[] = { { 0x0039, 0x0065, 0, VR::UI, VM::M1, "ReferenceToStudyUID" }, { 0x0039, 0x0070, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" }, { 0x0039, 0x0075, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" }, { 0x0039, 0x0080, 0, VR::IS, VM::M1, "DPONumber" }, { 0x0039, 0x0085, 0, VR::DA, VM::M1, "DPODate" }, { 0x0039, 0x0090, 0, VR::TM, VM::M1, "DPOTime" }, { 0x0039, 0x0095, 0, VR::LO, VM::M1, "DPOInvocationString" }, { 0x0039, 0x00AA, 0, VR::CS, VM::M1, "DPOType" }, { 0x0039, 0x00FF, 0, VR::OB, VM::M1, "DPOData" }, }; const unsigned short Dict159TagHashTable[] = { 10, 15, 9, 20, 9, 25, 9, 28, 31, 0, 2, 1, 112, 5, 144, 2, 4, 133, 7, 170, 2, 0, 101, 6, 149, 1, 2, 117, 1, 3, 128, 1, 8, 255, }; const unsigned short Dict159KeyHashTable[] = { 9, 10, 13, 16, 19, 26, 29, 9, 32, 0, 1, 4, 7069, 1, 2, 61095, 1, 1, 56857, 3, 5, 6363, 6, 21677, 7, 8310, 1, 0, 25477, 1, 8, 7068, 1, 3, 20833, }; vtkDICOMDictionary::Dict Dict159Data = { "GEMS_AWSOFT_CD1", 9, 9, Dict159TagHashTable, Dict159KeyHashTable, Dict159Contents }; // ----- GEMS_SEND_02 ----- const DictEntry Dict160Contents[] = { { 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" }, { 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" }, { 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" }, { 0x0045, 0x0065, 0, VR::IS, VM::M1, "RequestedDetectorEntranceDose" }, { 0x0045, 0x0067, 0, VR::DS, VM::M3, "VOILUTAssymmetryParameterBeta" }, { 0x0045, 0x0069, 0, VR::IS, VM::M1, "CollimatorRotation" }, { 0x0045, 0x0072, 0, VR::IS, VM::M1, "CollimatorWidth" }, { 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" }, }; const unsigned short Dict160TagHashTable[] = { 9, 8, 14, 8, 17, 8, 20, 25, 0, 2, 0, 85, 3, 101, 1, 4, 103, 1, 5, 105, 2, 2, 99, 7, 115, 2, 1, 98, 6, 114, }; const unsigned short Dict160KeyHashTable[] = { 8, 8, 8, 9, 16, 23, 8, 26, 0, 3, 4, 5352, 5, 13265, 6, 22843, 3, 2, 29079, 3, 16921, 7, 6426, 1, 1, 25135, 1, 0, 59138, }; vtkDICOMDictionary::Dict Dict160Data = { "GEMS_SEND_02", 8, 8, Dict160TagHashTable, Dict160KeyHashTable, Dict160Contents }; // ----- Philips Imaging DD 001 ----- const DictEntry Dict161Contents[] = { { 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" }, { 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" }, { 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" }, { 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" }, { 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" }, { 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" }, { 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" }, { 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" }, { 0x2001, 0x0009, 0, VR::FL, VM::M1, "ImagePrepulseDelay" }, { 0x2001, 0x000a, 0, VR::IS, VM::M1, "SliceNumber" }, { 0x2001, 0x000b, 0, VR::CS, VM::M1, "SliceOrientation" }, { 0x2001, 0x000c, 0, VR::CS, VM::M1, "ArrhythmiaRejection" }, { 0x2001, 0x000e, 0, VR::CS, VM::M1, "CardiacCycled" }, { 0x2001, 0x000f, 0, VR::SS, VM::M1, "CardiacGateWidth" }, { 0x2001, 0x0010, 0, VR::CS, VM::M1, "CardiacSync" }, { 0x2001, 0x0011, 0, VR::FL, VM::M1, "DiffusionEchoTime" }, { 0x2001, 0x0012, 0, VR::CS, VM::M1, "DynamicSeries" }, { 0x2001, 0x0013, 0, VR::SL, VM::M1, "EPIFactor" }, { 0x2001, 0x0014, 0, VR::SL, VM::M1, "NumberOfEchoes" }, { 0x2001, 0x0015, 0, VR::SS, VM::M1, "NumberOfLocations" }, { 0x2001, 0x0016, 0, VR::SS, VM::M1, "NumberOfPCDirections" }, { 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhases" }, { 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlices" }, { 0x2001, 0x0019, 0, VR::CS, VM::M1, "PartialMatrixScanned" }, { 0x2001, 0x001a, 0, VR::FL, VM::M3, "PCVelocity" }, { 0x2001, 0x001b, 0, VR::FL, VM::M1, "PrepulseDelay" }, { 0x2001, 0x001c, 0, VR::CS, VM::M1, "PrepulseType" }, { 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumber" }, { 0x2001, 0x001e, 0, VR::CS, VM::M1, "ReformatAccuracy" }, { 0x2001, 0x001f, 0, VR::CS, VM::M1, "RespirationSync" }, { 0x2001, 0x0020, 0, VR::LO, VM::M1, "ScanningTechnique" }, { 0x2001, 0x0021, 0, VR::CS, VM::M1, "SPIR" }, { 0x2001, 0x0022, 0, VR::FL, VM::M1, "WaterFatShift" }, { 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" }, { 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" }, { 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" }, { 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" }, { 0x2001, 0x0029, 0, VR::FL, VM::M1, "" }, { 0x2001, 0x002b, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" }, { 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" }, { 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" }, { 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" }, { 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" }, { 0x2001, 0x0039, 0, VR::FL, VM::M1, "" }, { 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" }, { 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" }, { 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" }, { 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" }, { 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" }, { 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" }, { 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" }, { 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" }, { 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" }, { 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" }, { 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" }, { 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" }, { 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" }, { 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" }, { 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" }, { 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" }, { 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" }, { 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" }, { 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" }, { 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" }, { 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" }, { 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" }, { 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" }, { 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" }, { 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" }, { 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" }, { 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" }, { 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" }, { 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" }, { 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" }, { 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" }, { 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" }, { 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" }, { 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" }, { 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" }, { 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" }, { 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" }, { 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" }, { 0x2001, 0x0074, 0, VR::DS, VM::M1, "" }, { 0x2001, 0x0075, 0, VR::DS, VM::M1, "" }, { 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" }, { 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" }, { 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" }, { 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" }, { 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" }, { 0x2001, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x2001, 0x0081, 0, VR::IS, VM::M1, "NumberOfDynamicScans" }, { 0x2001, 0x0082, 0, VR::IS, VM::M1, "EchoTrainLength" }, { 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" }, { 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" }, { 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" }, { 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" }, { 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" }, { 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" }, { 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" }, { 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" }, { 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" }, { 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" }, { 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" }, { 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" }, { 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" }, { 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" }, { 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" }, { 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" }, { 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" }, { 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" }, { 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" }, { 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" }, { 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" }, { 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" }, { 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" }, { 0x2001, 0x00da, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x00f1, 0, VR::FL, VM::M6, "ProspectiveMotionCorrection" }, { 0x2001, 0x00f2, 0, VR::FL, VM::M6, "RetrospectiveMotionCorrection" }, }; const unsigned short Dict161TagHashTable[] = { 122, 125, 128, 133, 138, 141, 144, 147, 150, 121, 153, 156, 121, 159, 121, 162, 121, 121, 121, 121, 121, 165, 168, 171, 121, 121, 174, 177, 121, 121, 121, 180, 121, 185, 121, 121, 121, 121, 188, 193, 196, 199, 202, 207, 121, 121, 210, 213, 216, 219, 121, 222, 225, 230, 233, 236, 239, 242, 121, 245, 121, 248, 121, 121, 251, 254, 257, 260, 263, 266, 269, 272, 275, 121, 278, 281, 284, 289, 292, 295, 298, 301, 121, 121, 304, 307, 312, 315, 320, 325, 330, 335, 338, 343, 348, 355, 362, 367, 370, 373, 376, 379, 384, 389, 394, 397, 400, 403, 406, 409, 414, 419, 422, 425, 430, 433, 436, 441, 446, 449, 454, 0, 1, 26, 28, 1, 29, 31, 2, 28, 30, 114, 165, 2, 31, 33, 113, 164, 1, 30, 32, 1, 33, 35, 1, 32, 34, 1, 35, 37, 1, 34, 36, 1, 36, 38, 1, 37, 41, 1, 38, 43, 1, 39, 45, 1, 41, 51, 1, 40, 50, 1, 42, 53, 1, 43, 54, 1, 44, 57, 2, 45, 61, 115, 193, 1, 46, 63, 2, 47, 67, 116, 200, 1, 48, 68, 1, 49, 69, 1, 50, 70, 2, 51, 71, 117, 204, 1, 52, 72, 1, 53, 75, 1, 54, 76, 1, 55, 77, 1, 56, 78, 1, 57, 80, 2, 58, 81, 118, 218, 1, 59, 82, 1, 60, 83, 1, 61, 84, 1, 62, 85, 1, 63, 86, 1, 64, 88, 1, 65, 90, 1, 66, 93, 1, 67, 94, 1, 68, 95, 1, 69, 96, 1, 70, 97, 1, 71, 98, 1, 72, 99, 1, 73, 100, 1, 74, 101, 1, 75, 103, 1, 76, 104, 2, 77, 105, 120, 242, 1, 78, 106, 1, 79, 107, 1, 119, 241, 1, 80, 109, 1, 81, 110, 1, 82, 113, 2, 83, 114, 94, 131, 1, 93, 130, 2, 84, 116, 92, 129, 2, 85, 117, 91, 128, 2, 86, 118, 98, 135, 2, 87, 119, 97, 134, 1, 96, 133, 2, 0, 1, 95, 132, 2, 88, 122, 102, 139, 3, 2, 3, 89, 123, 101, 138, 3, 1, 2, 90, 124, 100, 137, 2, 4, 5, 99, 136, 1, 3, 4, 1, 6, 7, 1, 5, 6, 1, 8, 9, 2, 7, 8, 106, 147, 2, 10, 11, 105, 146, 2, 9, 10, 104, 145, 1, 103, 144, 1, 11, 12, 1, 13, 15, 1, 12, 14, 1, 15, 17, 2, 14, 16, 108, 155, 2, 17, 19, 107, 154, 1, 16, 18, 1, 19, 21, 2, 18, 20, 110, 159, 1, 21, 23, 1, 20, 22, 2, 23, 25, 109, 156, 2, 22, 24, 112, 163, 1, 25, 27, 2, 24, 26, 111, 161, 1, 27, 29, }; const unsigned short Dict161KeyHashTable[] = { 121, 121, 121, 121, 121, 122, 125, 132, 137, 121, 121, 140, 143, 146, 149, 154, 159, 162, 165, 168, 121, 121, 121, 121, 171, 121, 174, 177, 121, 121, 121, 182, 185, 121, 188, 121, 191, 196, 121, 201, 206, 211, 121, 121, 214, 217, 121, 121, 222, 225, 234, 237, 244, 247, 121, 121, 252, 255, 274, 277, 121, 282, 285, 121, 290, 295, 121, 121, 300, 303, 306, 121, 309, 312, 315, 320, 325, 328, 331, 334, 339, 121, 344, 349, 352, 121, 121, 355, 358, 365, 368, 371, 121, 378, 121, 381, 386, 389, 392, 395, 400, 121, 403, 406, 411, 121, 414, 121, 121, 419, 422, 425, 428, 431, 121, 121, 434, 437, 121, 121, 440, 0, 1, 36, 38495, 3, 67, 48876, 74, 48231, 96, 36938, 2, 61, 25073, 101, 3610, 1, 93, 6268, 1, 80, 29542, 1, 31, 33007, 1, 102, 40571, 2, 90, 37603, 97, 26027, 2, 14, 26570, 15, 60995, 1, 54, 13865, 1, 4, 53828, 1, 19, 11781, 1, 94, 40256, 1, 40, 35759, 1, 99, 1999, 2, 60, 13301, 83, 37303, 1, 58, 23725, 1, 25, 48964, 1, 20, 49480, 2, 21, 53787, 22, 16946, 2, 8, 27410, 24, 56946, 2, 41, 26630, 49, 18458, 2, 33, 44007, 116, 10747, 1, 104, 51872, 1, 62, 9966, 2, 29, 53677, 32, 47156, 1, 34, 44458, 4, 16, 35172, 65, 11534, 109, 63093, 113, 14616, 1, 23, 3673, 3, 5, 25859, 68, 30409, 82, 4893, 1, 103, 33584, 2, 6, 63622, 50, 37311, 1, 9, 50070, 9, 37, 44, 38, 44, 44, 44, 79, 44, 84, 44, 85, 44, 91, 44, 107, 44, 118, 44, 1, 105, 30749, 2, 27, 28765, 66, 14024, 1, 11, 52132, 2, 30, 26222, 73, 33790, 2, 46, 59320, 63, 54477, 2, 87, 4861, 89, 11334, 1, 57, 52379, 1, 119, 31474, 1, 3, 9247, 1, 71, 61982, 1, 98, 55314, 2, 39, 23185, 72, 46193, 2, 17, 16527, 78, 61047, 1, 92, 18740, 1, 43, 15568, 1, 51, 7525, 2, 42, 19885, 110, 49529, 2, 1, 40729, 77, 22250, 2, 28, 5198, 75, 40916, 1, 7, 34028, 1, 10, 8309, 1, 53, 62351, 3, 45, 45029, 55, 23907, 111, 57702, 1, 108, 40875, 1, 56, 46044, 3, 70, 14852, 76, 61743, 115, 61743, 1, 0, 10108, 2, 18, 28627, 86, 38226, 1, 59, 37023, 1, 13, 13356, 1, 64, 29103, 2, 95, 10750, 100, 40071, 1, 48, 45173, 1, 26, 6137, 2, 106, 60724, 117, 9487, 1, 12, 7832, 2, 2, 35067, 120, 64248, 1, 112, 34383, 1, 81, 25668, 1, 88, 59755, 1, 47, 26328, 1, 69, 27443, 1, 35, 317, 1, 114, 37450, 1, 52, 45035, }; vtkDICOMDictionary::Dict Dict161Data = { "Philips Imaging DD 001", 121, 121, Dict161TagHashTable, Dict161KeyHashTable, Dict161Contents }; // ----- PRIVATE_CODE_STRING_1003 ----- const DictEntry Dict162Contents[] = { { 0x1003, 0x0001, 0, VR::UN, VM::M1, "NumberOfProbes" }, { 0x1003, 0x0010, 0, VR::UN, VM::M1, "USProbeSequence" }, { 0x1003, 0x0011, 0, VR::UN, VM::M1, "Identifier" }, { 0x1003, 0x0012, 0, VR::UN, VM::M1, "ProbeName" }, { 0x1003, 0x0013, 0, VR::UN, VM::M1, "Depth" }, { 0x1003, 0x0014, 0, VR::UN, VM::M1, "Frequency" }, { 0x1003, 0x0015, 0, VR::UN, VM::M1, "Gain" }, { 0x1003, 0x0016, 0, VR::UN, VM::M1, "Power" }, { 0x1003, 0x0017, 0, VR::UN, VM::M1, "DynamicRange" }, { 0x1003, 0x0018, 0, VR::UN, VM::M1, "FrameAveraging" }, { 0x1003, 0x0019, 0, VR::UN, VM::M1, "FieldOfView" }, { 0x1003, 0x0020, 0, VR::UN, VM::M1, "TGC" }, { 0x1003, 0x002A, 0, VR::UN, VM::M1, "NumberOfFocusSets" }, { 0x1003, 0x002B, 0, VR::UN, VM::M1, "CurrentFocusSet" }, { 0x1003, 0x002C, 0, VR::UN, VM::M1, "ImageEnhancementFilterIndex" }, { 0x1003, 0x002D, 0, VR::UN, VM::M1, "RejectionFilterLow" }, { 0x1003, 0x002E, 0, VR::UN, VM::M1, "RejectionFilterHigh" }, { 0x1003, 0x002F, 0, VR::UN, VM::M1, "Brightness" }, { 0x1003, 0x0030, 0, VR::UN, VM::M1, "Contrast" }, { 0x1003, 0x0031, 0, VR::UN, VM::M1, "Gamma" }, { 0x1003, 0x0032, 0, VR::UN, VM::M1, "SpeckleEnabled" }, { 0x1003, 0x0033, 0, VR::UN, VM::M1, "SpeckleLevel" }, { 0x1003, 0x0040, 0, VR::UN, VM::M1, "FocusSetSequence" }, { 0x1003, 0x0041, 0, VR::UN, VM::M1, "Identifier" }, { 0x1003, 0x0042, 0, VR::UN, VM::M1, "NumberOfFocusZone" }, { 0x1003, 0x0043, 0, VR::UN, VM::M1, "Focus" }, }; const unsigned short Dict162TagHashTable[] = { 27, 30, 33, 26, 26, 26, 26, 26, 26, 36, 26, 26, 26, 26, 39, 44, 49, 54, 59, 64, 69, 74, 79, 84, 89, 92, 0, 1, 10, 25, 1, 9, 24, 1, 0, 1, 1, 11, 32, 2, 13, 43, 24, 66, 2, 12, 42, 25, 67, 2, 4, 19, 22, 64, 2, 3, 18, 23, 65, 2, 2, 17, 17, 47, 2, 1, 16, 16, 46, 2, 8, 23, 15, 45, 2, 7, 22, 14, 44, 2, 6, 21, 21, 51, 2, 5, 20, 20, 50, 1, 19, 49, 1, 18, 48, }; const unsigned short Dict162KeyHashTable[] = { 27, 26, 34, 26, 39, 42, 47, 50, 26, 26, 55, 26, 64, 67, 70, 26, 26, 26, 26, 26, 73, 76, 79, 84, 89, 26, 0, 3, 2, 62212, 7, 54333, 23, 62212, 2, 1, 45350, 13, 48157, 1, 9, 3088, 2, 20, 32205, 25, 56144, 1, 14, 30943, 2, 8, 16664, 18, 2750, 4, 0, 14266, 4, 17176, 16, 5098, 17, 55538, 1, 12, 40215, 1, 24, 50301, 1, 21, 9095, 1, 6, 4184, 1, 11, 35619, 2, 19, 17277, 22, 64610, 2, 5, 24208, 10, 43477, 2, 3, 41983, 15, 50436, }; vtkDICOMDictionary::Dict Dict162Data = { "PRIVATE_CODE_STRING_1003", 26, 26, Dict162TagHashTable, Dict162KeyHashTable, Dict162Contents }; // ----- Applicare/Workflow/Version 1.0 ----- const DictEntry Dict163Contents[] = { { 0x3113, 0x0001, 0, VR::CS, VM::M1, "OrderControl" }, { 0x3113, 0x0010, 0, VR::SH, VM::M1, "ScheduledActionItemCodeValue" }, { 0x3113, 0x0011, 0, VR::SH, VM::M1, "ScheduledActionItemCodingSchemeDesignator" }, { 0x3113, 0x0012, 0, VR::LO, VM::M1, "ScheduledActionItemCodeMeaning" }, { 0x3113, 0x0015, 0, VR::SH, VM::M1, "RequestedActionItemCodeValue" }, { 0x3113, 0x0016, 0, VR::SH, VM::M1, "RequestedActionItemCodingSchemeDesignator" }, { 0x3113, 0x0017, 0, VR::LO, VM::M1, "RequestedActionItemCodeMeaning" }, { 0x3113, 0x0020, 0, VR::SH, VM::M1, "PerformedActionItemCodeValue" }, { 0x3113, 0x0021, 0, VR::SH, VM::M1, "PerformedActionItemCodingSchemeDesignator" }, { 0x3113, 0x0022, 0, VR::LO, VM::M1, "PerformedActionItemCodeMeaning" }, { 0x3113, 0x0025, 0, VR::SH, VM::M1, "PerformedProcedureCodeValue" }, { 0x3113, 0x0026, 0, VR::SH, VM::M1, "PerformedProcedureCodingSchemeDesignator" }, { 0x3113, 0x0027, 0, VR::LO, VM::M1, "PerformedProcedureCodeMeaning" }, { 0x3113, 0x0030, 0, VR::UI, VM::M1, "ReferencedImageSOPClassUID" }, { 0x3113, 0x0031, 0, VR::UI, VM::M1, "ReferencedImageSOPInstanceUID" }, { 0x3113, 0x00E0, 0, VR::CS, VM::M1, "LockedByHostname" }, { 0x3113, 0x00E1, 0, VR::CS, VM::M1, "LockedByUser" }, { 0x3113, 0x00E2, 0, VR::CS, VM::M1, "KfEditLockUser" }, }; const unsigned short Dict163TagHashTable[] = { 18, 18, 18, 18, 19, 22, 25, 18, 18, 28, 31, 36, 41, 46, 49, 54, 59, 64, 0, 1, 12, 39, 1, 11, 38, 1, 10, 37, 1, 9, 34, 2, 6, 23, 8, 33, 2, 5, 22, 7, 32, 2, 4, 21, 14, 49, 1, 13, 48, 2, 0, 1, 15, 224, 2, 3, 18, 16, 225, 2, 2, 17, 17, 226, 1, 1, 16, }; const unsigned short Dict163KeyHashTable[] = { 19, 22, 25, 18, 18, 30, 33, 18, 36, 18, 39, 18, 18, 42, 51, 56, 61, 18, 0, 1, 10, 48685, 1, 11, 15677, 2, 0, 7200, 2, 39829, 1, 13, 34048, 1, 14, 13591, 1, 9, 20836, 1, 6, 59642, 4, 1, 53215, 8, 21049, 15, 60498, 16, 57474, 2, 4, 32191, 7, 6064, 2, 3, 24399, 5, 19055, 2, 12, 20206, 17, 41562, }; vtkDICOMDictionary::Dict Dict163Data = { "Applicare/Workflow/Version 1.0", 18, 18, Dict163TagHashTable, Dict163KeyHashTable, Dict163Contents }; // ----- PRIVATE_CODE_STRING_1001 ----- const DictEntry Dict164Contents[] = { { 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" }, { 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" }, { 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" }, { 0x1001, 0x00A3, 0, VR::FD, VM::M3, "Marker3DPosition" }, { 0x1001, 0x00B0, 0, VR::SL, VM::M1, "DistanceUnit" }, { 0x1001, 0x00B1, 0, VR::SL, VM::M1, "DoseUnit" }, { 0x1001, 0x00B2, 0, VR::SL, VM::M1, "NormalisationMode" }, { 0x1001, 0x00B3, 0, VR::FD, VM::M1, "NormalisationFactor" }, { 0x1001, 0x00B4, 0, VR::FD, VM::M1, "FValue" }, { 0x1001, 0x00B5, 0, VR::FD, VM::M1, "PrescribedDose" }, { 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" }, { 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" }, { 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" }, { 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" }, { 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" }, { 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" }, { 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" }, { 0x1001, 0x00BD, 0, VR::FD, VM::M3, "DoseGridCorner2" }, { 0x1001, 0x00BE, 0, VR::FD, VM::M1, "PatientDataConversion" }, { 0x1001, 0x00BF, 0, VR::FD, VM::M1, "VolumeDataConversion" }, { 0x1001, 0x00C0, 0, VR::FD, VM::M3, "VolumeDataVector" }, { 0x1001, 0x00C1, 0, VR::SL, VM::M1, "OptimizationMethod" }, { 0x1001, 0x00C2, 0, VR::SL, VM::M1, "DisplayMethod" }, { 0x1001, 0x00C3, 0, VR::SQ, VM::M1, "VOIBasedOptimizationSettingsSequence" }, { 0x1001, 0x00C5, 0, VR::SL, VM::M1, "VOINumber" }, { 0x1001, 0x00C6, 0, VR::LO, VM::M1, "VOIName" }, { 0x1001, 0x00C7, 0, VR::SL, VM::M1, "VOIType" }, { 0x1001, 0x00C8, 0, VR::SL, VM::M1, "VOIClass" }, { 0x1001, 0x00C9, 0, VR::SL, VM::M1, "VOIPriority" }, { 0x1001, 0x00CA, 0, VR::SL, VM::M1, "NoOfPoints" }, { 0x1001, 0x00CB, 0, VR::FD, VM::M1, "PercentOnSurface" }, { 0x1001, 0x00CC, 0, VR::FD, VM::M1, "SurfaceMargin" }, { 0x1001, 0x00CD, 0, VR::SL, VM::M1, "Selected" }, { 0x1001, 0x00CE, 0, VR::FD, VM::M1, "DoseLimit" }, { 0x1001, 0x00CF, 0, VR::FD, VM::M1, "ImportanceFactor" }, { 0x1001, 0x00D0, 0, VR::FD, VM::M1, "ImportanceFactorFrom" }, { 0x1001, 0x00D1, 0, VR::FD, VM::M1, "ImportanceFactorTo" }, { 0x1001, 0x00D2, 0, VR::FD, VM::M1, "Focus" }, { 0x1001, 0x00D3, 0, VR::SL, VM::M1, "SurfaceSamplingMethod" }, { 0x1001, 0x00D4, 0, VR::FD, VM::M1, "NumberOfSamplingPointsPerccm" }, { 0x1001, 0x00D5, 0, VR::SL, VM::M1, "ConvergenceAccuracy" }, { 0x1001, 0x00D6, 0, VR::SL, VM::M1, "MaxNoOfConvergenceIterations" }, { 0x1001, 0x00D7, 0, VR::FD, VM::M1, "WeightSmoothing" }, { 0x1001, 0x00D8, 0, VR::SL, VM::M1, "StepsPerImportanceFactor" }, { 0x1001, 0x00D9, 0, VR::FD, VM::M1, "ConstraintsPTVDmax" }, { 0x1001, 0x00DA, 0, VR::FD, VM::M1, "ConstraintsNTDmax" }, { 0x1001, 0x00DB, 0, VR::SL, VM::M1, "AlgorithmicPopulationSize" }, { 0x1001, 0x00DC, 0, VR::SL, VM::M1, "AlgorithmicGenerations" }, { 0x1001, 0x00DD, 0, VR::SL, VM::M1, "AlgorithmicInitializations" }, { 0x1001, 0x00DE, 0, VR::SL, VM::M1, "MinNoOfSDP" }, { 0x1001, 0x00DF, 0, VR::SL, VM::M1, "DepthMethod" }, { 0x1001, 0x00E0, 0, VR::SL, VM::M1, "DepthDefinedOn" }, { 0x1001, 0x00E1, 0, VR::FD, VM::M1, "Depth" }, { 0x1001, 0x00E2, 0, VR::SQ, VM::M1, "VOIBasedPlacementSettingsSequence" }, { 0x1001, 0x00E7, 0, VR::SL, VM::M1, "VOISelected" }, { 0x1001, 0x00E8, 0, VR::FD, VM::M1, "Margin" }, { 0x1001, 0x00E9, 0, VR::SL, VM::M1, "SelectionMethod" }, { 0x1001, 0x00EA, 0, VR::FD, VM::M1, "SelectionDistance" }, { 0x1001, 0x00EB, 0, VR::FD, VM::M1, "WBTOnContourSpacing" }, { 0x1001, 0x00EC, 0, VR::FD, VM::M1, "WBTUrethraMargin" }, { 0x1001, 0x00ED, 0, VR::FD, VM::M1, "WBTSearchingRadiusPTV" }, { 0x1001, 0x00EE, 0, VR::FD, VM::M1, "WBTSearchingRadiusOAR" }, { 0x1001, 0x00EF, 0, VR::FD, VM::M3, "WBTStartingPoint" }, { 0x1001, 0x00F0, 0, VR::FD, VM::M4, "WBTSurface" }, { 0x1001, 0x00F1, 0, VR::FD, VM::M4, "WBTNoOfInteriorCatheters" }, { 0x1001, 0x00F2, 0, VR::FD, VM::M4, "WBTRelativeRadius" }, { 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" }, { 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" }, { 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" }, { 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" }, { 0x1001, 0x00A3, 0, VR::FD, VM::M3, "Marker3DPosition" }, { 0x1001, 0x00B0, 0, VR::SL, VM::M1, "DistanceUnit" }, { 0x1001, 0x00B1, 0, VR::SL, VM::M1, "DoseUnit" }, { 0x1001, 0x00B2, 0, VR::SL, VM::M1, "NormalisationMode" }, { 0x1001, 0x00B3, 0, VR::FD, VM::M1, "NormalisationFactor" }, { 0x1001, 0x00B4, 0, VR::FD, VM::M1, "FValue" }, { 0x1001, 0x00B5, 0, VR::FD, VM::M1, "PrescribedDose" }, { 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" }, { 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" }, { 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" }, { 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" }, { 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" }, { 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" }, { 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" }, { 0x1001, 0x00BD, 0, VR::FD, VM::M3, "DoseGridCorner2" }, { 0x1001, 0x00BE, 0, VR::FD, VM::M1, "PatientDataConversion" }, { 0x1001, 0x00BF, 0, VR::FD, VM::M1, "VolumeDataConversion" }, { 0x1001, 0x00C0, 0, VR::FD, VM::M3, "VolumeDataVector" }, { 0x1001, 0x00C1, 0, VR::SL, VM::M1, "OptimizationMethod" }, { 0x1001, 0x00C2, 0, VR::SL, VM::M1, "DisplayMethod" }, { 0x1001, 0x00C3, 0, VR::SQ, VM::M1, "VOIBasedOptimizationSettingsSequence" }, { 0x1001, 0x00C5, 0, VR::SL, VM::M1, "VOINumber" }, { 0x1001, 0x00C6, 0, VR::LO, VM::M1, "VOIName" }, { 0x1001, 0x00C7, 0, VR::SL, VM::M1, "VOIType" }, { 0x1001, 0x00C8, 0, VR::SL, VM::M1, "VOIClass" }, { 0x1001, 0x00C9, 0, VR::SL, VM::M1, "VOIPriority" }, { 0x1001, 0x00CA, 0, VR::SL, VM::M1, "NoOfPoints" }, { 0x1001, 0x00CB, 0, VR::FD, VM::M1, "PercentOnSurface" }, { 0x1001, 0x00CC, 0, VR::FD, VM::M1, "SurfaceMargin" }, { 0x1001, 0x00CD, 0, VR::SL, VM::M1, "Selected" }, { 0x1001, 0x00CE, 0, VR::FD, VM::M1, "DoseLimit" }, { 0x1001, 0x00CF, 0, VR::FD, VM::M1, "ImportanceFactor" }, { 0x1001, 0x00D0, 0, VR::FD, VM::M1, "ImportanceFactorFrom" }, { 0x1001, 0x00D1, 0, VR::FD, VM::M1, "ImportanceFactorTo" }, { 0x1001, 0x00D2, 0, VR::FD, VM::M1, "Focus" }, { 0x1001, 0x00D3, 0, VR::SL, VM::M1, "SurfaceSamplingMethod" }, { 0x1001, 0x00D4, 0, VR::FD, VM::M1, "NumberOfSamplingPointsPerccm" }, { 0x1001, 0x00D5, 0, VR::SL, VM::M1, "ConvergenceAccuracy" }, { 0x1001, 0x00D6, 0, VR::SL, VM::M1, "MaxNoOfConvergenceIterations" }, { 0x1001, 0x00D7, 0, VR::FD, VM::M1, "WeightSmoothing" }, { 0x1001, 0x00D8, 0, VR::SL, VM::M1, "StepsPerImportanceFactor" }, { 0x1001, 0x00D9, 0, VR::FD, VM::M1, "ConstraintsPTVDmax" }, { 0x1001, 0x00DA, 0, VR::FD, VM::M1, "ConstraintsNTDmax" }, { 0x1001, 0x00DB, 0, VR::SL, VM::M1, "AlgorithmicPopulationSize" }, { 0x1001, 0x00DC, 0, VR::SL, VM::M1, "AlgorithmicGenerations" }, { 0x1001, 0x00DD, 0, VR::SL, VM::M1, "AlgorithmicInitializations" }, { 0x1001, 0x00DE, 0, VR::SL, VM::M1, "MinNoOfSDP" }, { 0x1001, 0x00DF, 0, VR::SL, VM::M1, "DepthMethod" }, { 0x1001, 0x00E0, 0, VR::SL, VM::M1, "DepthDefinedOn" }, { 0x1001, 0x00E1, 0, VR::FD, VM::M1, "Depth" }, { 0x1001, 0x00E2, 0, VR::SQ, VM::M1, "VOIBasedPlacementSettingsSequence" }, { 0x1001, 0x00E7, 0, VR::SL, VM::M1, "VOISelected" }, { 0x1001, 0x00E8, 0, VR::FD, VM::M1, "Margin" }, { 0x1001, 0x00E9, 0, VR::SL, VM::M1, "SelectionMethod" }, { 0x1001, 0x00EA, 0, VR::FD, VM::M1, "SelectionDistance" }, { 0x1001, 0x00EB, 0, VR::FD, VM::M1, "WBTOnContourSpacing" }, { 0x1001, 0x00EC, 0, VR::FD, VM::M1, "WBTUrethraMargin" }, { 0x1001, 0x00ED, 0, VR::FD, VM::M1, "WBTSearchingRadiusPTV" }, { 0x1001, 0x00EE, 0, VR::FD, VM::M1, "WBTSearchingRadiusOAR" }, { 0x1001, 0x00EF, 0, VR::FD, VM::M3, "WBTStartingPoint" }, { 0x1001, 0x00F0, 0, VR::FD, VM::M4, "WBTSurface" }, { 0x1001, 0x00F1, 0, VR::FD, VM::M4, "WBTNoOfInteriorCatheters" }, { 0x1001, 0x00F2, 0, VR::FD, VM::M4, "WBTRelativeRadius" }, { 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" }, }; const unsigned short Dict164TagHashTable[] = { 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 140, 145, 150, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 134, 134, 134, 134, 134, 134, 235, 240, 245, 250, 255, 260, 134, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 134, 395, 400, 134, 405, 134, 134, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, 465, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 2, 3, 163, 70, 163, 2, 2, 162, 69, 162, 2, 1, 161, 68, 161, 2, 0, 160, 67, 160, 2, 7, 179, 74, 179, 2, 6, 178, 73, 178, 2, 5, 177, 72, 177, 2, 4, 176, 71, 176, 2, 11, 183, 78, 183, 2, 10, 182, 77, 182, 2, 9, 181, 76, 181, 2, 8, 180, 75, 180, 2, 15, 187, 82, 187, 2, 14, 186, 81, 186, 2, 13, 185, 80, 185, 2, 12, 184, 79, 184, 2, 19, 191, 86, 191, 2, 18, 190, 85, 190, 2, 17, 189, 84, 189, 2, 16, 188, 83, 188, 2, 22, 194, 89, 194, 2, 23, 195, 90, 195, 2, 20, 192, 87, 192, 2, 21, 193, 88, 193, 2, 25, 198, 92, 198, 2, 26, 199, 93, 199, 2, 24, 197, 91, 197, 2, 29, 202, 96, 202, 2, 30, 203, 97, 203, 2, 27, 200, 94, 200, 2, 28, 201, 95, 201, 2, 33, 206, 100, 206, 2, 34, 207, 101, 207, 2, 31, 204, 98, 204, 2, 32, 205, 99, 205, 2, 37, 210, 104, 210, 2, 38, 211, 105, 211, 2, 35, 208, 102, 208, 2, 36, 209, 103, 209, 2, 41, 214, 108, 214, 2, 42, 215, 109, 215, 2, 39, 212, 106, 212, 2, 40, 213, 107, 213, 2, 45, 218, 112, 218, 2, 46, 219, 113, 219, 2, 43, 216, 110, 216, 2, 44, 217, 111, 217, 2, 49, 222, 116, 222, 2, 50, 223, 117, 223, 2, 47, 220, 114, 220, 2, 48, 221, 115, 221, 2, 53, 226, 120, 226, 2, 51, 224, 118, 224, 2, 52, 225, 119, 225, 2, 54, 231, 121, 231, 2, 57, 234, 124, 234, 2, 58, 235, 125, 235, 2, 55, 232, 122, 232, 2, 56, 233, 123, 233, 2, 61, 238, 128, 238, 2, 62, 239, 129, 239, 2, 59, 236, 126, 236, 2, 60, 237, 127, 237, 2, 65, 242, 132, 242, 2, 66, 243, 133, 243, 2, 63, 240, 130, 240, 2, 64, 241, 131, 241, }; const unsigned short Dict164KeyHashTable[] = { 135, 134, 134, 144, 134, 153, 134, 134, 134, 134, 158, 163, 172, 134, 134, 177, 134, 134, 134, 134, 134, 134, 182, 134, 134, 134, 134, 191, 196, 134, 201, 134, 134, 134, 134, 134, 206, 134, 211, 134, 134, 134, 216, 221, 134, 226, 231, 134, 134, 134, 236, 241, 246, 134, 251, 260, 134, 265, 270, 134, 134, 275, 284, 289, 294, 134, 134, 134, 299, 134, 134, 134, 308, 317, 322, 134, 327, 134, 332, 134, 341, 134, 346, 134, 355, 134, 134, 134, 134, 360, 365, 370, 379, 384, 134, 134, 134, 134, 134, 389, 134, 394, 399, 134, 404, 134, 134, 409, 134, 134, 134, 134, 414, 134, 134, 134, 134, 134, 423, 134, 134, 134, 134, 428, 433, 134, 134, 438, 134, 447, 452, 134, 134, 134, 0, 4, 32, 29517, 34, 27673, 99, 29517, 101, 27673, 4, 33, 12178, 48, 19016, 100, 12178, 115, 19016, 2, 50, 22521, 117, 22521, 2, 51, 39354, 118, 39354, 4, 45, 9765, 47, 51282, 112, 9765, 114, 51282, 2, 52, 58109, 119, 58109, 2, 1, 61919, 68, 61919, 4, 10, 38836, 12, 21930, 77, 38836, 79, 21930, 2, 40, 37094, 107, 37094, 2, 0, 42166, 67, 42166, 2, 30, 45765, 97, 45765, 2, 6, 22529, 73, 22529, 2, 4, 24919, 71, 24919, 2, 16, 50049, 83, 50049, 2, 17, 50049, 84, 50049, 2, 26, 51196, 93, 51196, 2, 8, 687, 75, 687, 2, 14, 44529, 81, 44529, 2, 19, 18423, 86, 18423, 2, 31, 9060, 98, 9060, 4, 38, 51310, 56, 54905, 105, 51310, 123, 54905, 2, 53, 36853, 120, 36853, 2, 28, 12650, 95, 12650, 2, 25, 49391, 92, 49391, 4, 3, 8889, 36, 2074, 70, 8889, 103, 2074, 2, 11, 41647, 78, 41647, 2, 27, 61351, 94, 61351, 2, 57, 53961, 124, 53961, 4, 29, 35592, 62, 39894, 96, 35592, 129, 39894, 4, 58, 63625, 66, 4854, 125, 63625, 133, 4854, 2, 23, 3839, 90, 3839, 2, 7, 47535, 74, 47535, 2, 65, 60343, 132, 60343, 4, 13, 11749, 24, 33037, 80, 11749, 91, 33037, 2, 43, 10858, 110, 10858, 4, 46, 12402, 60, 56425, 113, 12402, 127, 56425, 2, 41, 33215, 108, 33215, 2, 9, 55407, 76, 55407, 2, 18, 24544, 85, 24544, 4, 15, 18387, 64, 26084, 82, 18387, 131, 26084, 2, 22, 11936, 89, 11936, 2, 39, 4916, 106, 4916, 2, 21, 2119, 88, 2119, 2, 44, 31690, 111, 31690, 2, 5, 43815, 72, 43815, 2, 61, 56412, 128, 56412, 2, 42, 5999, 109, 5999, 4, 35, 54543, 54, 32642, 102, 54543, 121, 32642, 2, 49, 36866, 116, 36866, 2, 55, 49788, 122, 49788, 2, 2, 45710, 69, 45710, 4, 37, 12849, 59, 46018, 104, 12849, 126, 46018, 2, 63, 10735, 130, 10735, 2, 20, 51436, 87, 51436, }; vtkDICOMDictionary::Dict Dict164Data = { "PRIVATE_CODE_STRING_1001", 134, 134, Dict164TagHashTable, Dict164KeyHashTable, Dict164Contents }; // ----- SIEMENS MR EXTRACTED CSA HEADER ----- const DictEntry Dict165Contents[] = { { 0x0025, 0x0001, 0, VR::SQ, VM::M1, "ExtractedMRHeaderInformationSequence" }, { 0x0025, 0x0002, 0, VR::LO, VM::M1, "ExtractedMRHeaderCreatorIdentificationCode" }, { 0x0025, 0x0003, 0, VR::AT, VM::M1, "ExtractedMRHeaderTag" }, }; const unsigned short Dict165TagHashTable[] = { 4, 3, 9, 0, 2, 0, 1, 1, 2, 1, 2, 3, }; const unsigned short Dict165KeyHashTable[] = { 4, 7, 3, 0, 1, 2, 9615, 2, 0, 12741, 1, 45335, }; vtkDICOMDictionary::Dict Dict165Data = { "SIEMENS MR EXTRACTED CSA HEADER", 3, 3, Dict165TagHashTable, Dict165KeyHashTable, Dict165Contents }; // ----- KRETZ_US ----- const DictEntry Dict166Contents[] = { { 0x7fe1, 0x0001, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict166TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict166KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict166Data = { "KRETZ_US", 1, 1, Dict166TagHashTable, Dict166KeyHashTable, Dict166Contents }; // ----- GEIIS PACS ----- const DictEntry Dict167Contents[] = { { 0x0903, 0x0010, 0, VR::US, VM::M1, "RejectImageFlag" }, { 0x0903, 0x0011, 0, VR::US, VM::M1, "SignificantFlag" }, { 0x0903, 0x0012, 0, VR::US, VM::M1, "ConfidentialFlag" }, { 0x0903, 0x0020, 0, VR::CS, VM::M1, "" }, { 0x0907, 0x0021, 0, VR::US, VM::M1, "PrefetchAlgorithm" }, { 0x0907, 0x0022, 0, VR::US, VM::M1, "LimitRecentStudies" }, { 0x0907, 0x0023, 0, VR::US, VM::M1, "LimitOldestStudies" }, { 0x0907, 0x0024, 0, VR::US, VM::M1, "LimitRecentMonths" }, { 0x0907, 0x0031, 0, VR::UI, VM::M1TN, "ExcludeStudyUIDs" }, }; const unsigned short Dict167TagHashTable[] = { 10, 17, 22, 9, 9, 9, 9, 25, 30, 0, 3, 1, 17, 6, 35, 8, 49, 2, 0, 16, 5, 34, 1, 4, 33, 2, 3, 32, 7, 36, 1, 2, 18, }; const unsigned short Dict167KeyHashTable[] = { 10, 9, 9, 13, 9, 16, 19, 22, 29, 0, 1, 8, 17205, 1, 4, 31146, 1, 0, 35306, 1, 5, 48128, 3, 1, 7407, 6, 21601, 7, 57919, 2, 2, 34991, 3, 597, }; vtkDICOMDictionary::Dict Dict167Data = { "GEIIS PACS", 9, 9, Dict167TagHashTable, Dict167KeyHashTable, Dict167Contents }; // ----- PRIVATE_CODE_STRING_0021 ----- const DictEntry Dict168Contents[] = { { 0x0021, 0x0070, 0, VR::FD, VM::M1, "DistanceBasePlaneToTemplate" }, { 0x0021, 0x0071, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" }, { 0x0021, 0x0072, 0, VR::FD, VM::M16, "PatientToWorldMatrix" }, { 0x0021, 0x0073, 0, VR::SL, VM::M1, "BasePlane" }, { 0x0021, 0x0074, 0, VR::SL, VM::M1, "ReferencePlane" }, { 0x0021, 0x0075, 0, VR::SL, VM::M1, "ApexPlane" }, { 0x0021, 0x0076, 0, VR::FD, VM::M1, "BasePlaneOffset" }, }; const unsigned short Dict168TagHashTable[] = { 8, 11, 14, 17, 20, 23, 26, 0, 1, 4, 116, 1, 5, 117, 1, 6, 118, 1, 0, 112, 1, 1, 113, 1, 2, 114, 1, 3, 115, }; const unsigned short Dict168KeyHashTable[] = { 8, 11, 14, 17, 7, 20, 25, 0, 1, 3, 20656, 1, 2, 38847, 1, 4, 15502, 1, 6, 44588, 2, 0, 47747, 1, 60787, 1, 5, 64891, }; vtkDICOMDictionary::Dict Dict168Data = { "PRIVATE_CODE_STRING_0021", 7, 7, Dict168TagHashTable, Dict168KeyHashTable, Dict168Contents }; // ----- SIEMENS CT VA0 IDE ----- const DictEntry Dict169Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0030, 0, VR::CS, VM::M1, "" }, { 0x0009, 0x0031, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0032, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0034, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0042, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0050, 0, VR::DA, VM::M1, "" }, { 0x0009, 0x0051, 0, VR::TM, VM::M1, "" }, }; const unsigned short Dict169TagHashTable[] = { 10, 9, 13, 18, 9, 21, 9, 24, 31, 0, 1, 5, 64, 2, 2, 49, 6, 66, 1, 1, 48, 1, 3, 50, 3, 0, 16, 4, 52, 7, 80, 1, 8, 81, }; const unsigned short Dict169KeyHashTable[] = { 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 9, 0, 597, 1, 597, 2, 597, 3, 597, 4, 597, 5, 597, 6, 597, 7, 597, 8, 597, }; vtkDICOMDictionary::Dict Dict169Data = { "SIEMENS CT VA0 IDE", 9, 9, Dict169TagHashTable, Dict169KeyHashTable, Dict169Contents }; // ----- SCHICK TECHNOLOGIES - Note List Creator ID ----- const DictEntry Dict170Contents[] = { { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict170TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict170KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict170Data = { "SCHICK TECHNOLOGIES - Note List Creator ID", 2, 2, Dict170TagHashTable, Dict170KeyHashTable, Dict170Contents }; // ----- Mortara_Inc ----- const DictEntry Dict171Contents[] = { { 0x1455, 0x0000, 0, VR::OW, VM::M1, "ELIInterpretationVector" }, { 0x1455, 0x0001, 0, VR::UN, VM::M1, "CustomID" }, { 0x1455, 0x0002, 0, VR::UT, VM::M1, "Race" }, { 0x1455, 0x0003, 0, VR::UT, VM::M1, "SocialSecurityNumber" }, { 0x1455, 0x0004, 0, VR::UT, VM::M1, "AttendingPhysician" }, { 0x1455, 0x0005, 0, VR::UT, VM::M1, "ProceduralDiagnosis" }, { 0x1455, 0x0006, 0, VR::UT, VM::M1, "Note1" }, { 0x1455, 0x0007, 0, VR::UT, VM::M1, "Note2" }, { 0x1455, 0x0008, 0, VR::LO, VM::M1, "OrderRequestNumber" }, { 0x1455, 0x0010, 0, VR::LO, VM::M1, "ManufacturerName" }, }; const unsigned short Dict171TagHashTable[] = { 11, 16, 19, 24, 27, 30, 33, 36, 10, 10, 0, 2, 4, 4, 9, 16, 1, 5, 5, 2, 6, 6, 8, 8, 1, 7, 7, 1, 0, 0, 1, 1, 1, 1, 2, 2, 1, 3, 3, }; const unsigned short Dict171KeyHashTable[] = { 11, 16, 10, 23, 28, 10, 10, 10, 10, 31, 0, 2, 2, 24176, 6, 8606, 3, 4, 51201, 7, 8606, 9, 49301, 2, 1, 44833, 8, 41000, 1, 0, 15367, 2, 3, 19436, 5, 48235, }; vtkDICOMDictionary::Dict Dict171Data = { "Mortara_Inc", 10, 10, Dict171TagHashTable, Dict171KeyHashTable, Dict171Contents }; // ----- SMIL_PB79 ----- const DictEntry Dict172Contents[] = { { 0x0079, 0x0000, 0, VR::LO, VM::M1, "Analgesia" }, { 0x0079, 0x0001, 0, VR::LO, VM::M1, "Anesthesia" }, { 0x0079, 0x0002, 0, VR::IS, VM::M1, "BedMotion" }, { 0x0079, 0x0003, 0, VR::LO, VM::M1, "FoodAccess" }, { 0x0079, 0x0004, 0, VR::DS, VM::M1, "HistogramVersion" }, { 0x0079, 0x0006, 0, VR::DS, VM::M1, "InjectionDecayCorrection" }, { 0x0079, 0x0007, 0, VR::LO, VM::M1, "Isotope" }, { 0x0079, 0x0008, 0, VR::LO, VM::M1, "OtherDrugs" }, { 0x0079, 0x0009, 0, VR::IS, VM::M1, "RebinningType" }, { 0x0079, 0x000A, 0, VR::DS, VM::M1, "RebinningVersion" }, { 0x0079, 0x000B, 0, VR::IS, VM::M1, "Reconstruction" }, { 0x0079, 0x000C, 0, VR::DS, VM::M1, "ReconstructionVersion" }, { 0x0079, 0x000D, 0, VR::LO, VM::M1, "InjectedCompound" }, { 0x0079, 0x000E, 0, VR::LO, VM::M1, "StudyModel" }, { 0x0079, 0x000F, 0, VR::LO, VM::M1, "SubjectGenus" }, { 0x0079, 0x0010, 0, VR::LO, VM::M1, "SubjectPhenotype" }, { 0x0079, 0x0011, 0, VR::DS, VM::M1, "Version" }, { 0x0079, 0x0012, 0, VR::LO, VM::M1, "WaterAccess" }, { 0x0079, 0x0013, 0, VR::DS, VM::M1, "XOffset" }, { 0x0079, 0x0014, 0, VR::DS, VM::M1, "YOffset" }, { 0x0079, 0x0015, 0, VR::DS, VM::M1, "Zoom" }, { 0x0079, 0x0017, 0, VR::IS, VM::M1, "SubjectOrientation" }, }; const unsigned short Dict172TagHashTable[] = { 22, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 22, 65, 70, 75, 78, 81, 84, 0, 1, 21, 23, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10, 11, 1, 11, 12, 1, 12, 13, 1, 13, 14, 1, 14, 15, 1, 0, 0, 1, 1, 1, 1, 2, 2, 1, 3, 3, 1, 4, 4, 2, 5, 6, 15, 16, 2, 6, 7, 16, 17, 1, 17, 18, 1, 18, 19, 1, 19, 20, 1, 20, 21, }; const unsigned short Dict172KeyHashTable[] = { 23, 22, 22, 28, 35, 42, 45, 48, 22, 51, 22, 22, 22, 54, 57, 60, 63, 66, 69, 72, 77, 80, 0, 2, 1, 9743, 2, 22793, 3, 3, 19082, 4, 3201, 13, 6882, 3, 0, 30009, 5, 10291, 18, 58672, 1, 11, 62140, 1, 20, 30726, 1, 8, 22410, 1, 9, 2509, 1, 16, 44173, 1, 17, 42994, 1, 19, 41505, 1, 6, 24804, 1, 21, 52024, 1, 7, 4247, 2, 10, 5902, 14, 18438, 1, 12, 43658, 1, 15, 9402, }; vtkDICOMDictionary::Dict Dict172Data = { "SMIL_PB79", 22, 22, Dict172TagHashTable, Dict172KeyHashTable, Dict172Contents }; // ----- SIEMENS IKM CKS LUNGCAD BMK ----- const DictEntry Dict173Contents[] = { { 0x0029, 0x0001, 0, VR::UT, VM::M1, "" }, }; const unsigned short Dict173TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict173KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict173Data = { "SIEMENS IKM CKS LUNGCAD BMK", 1, 1, Dict173TagHashTable, Dict173KeyHashTable, Dict173Contents }; // ----- APEX_PRIVATE ----- const DictEntry Dict174Contents[] = { { 0x0027, 0x0011, 0, VR::DS, VM::M1, "BedPosition" }, }; const unsigned short Dict174TagHashTable[] = { 2, 0, 1, 0, 17, }; const unsigned short Dict174KeyHashTable[] = { 2, 0, 1, 0, 32165, }; vtkDICOMDictionary::Dict Dict174Data = { "APEX_PRIVATE", 1, 1, Dict174TagHashTable, Dict174KeyHashTable, Dict174Contents }; // ----- PRIVATE_CODE_STRING_0019 ----- const DictEntry Dict175Contents[] = { { 0x0019, 0x0000, 0, VR::FD, VM::M1, "Calibration" }, { 0x0019, 0x0001, 0, VR::FD, VM::M1, "DepthConversion" }, { 0x0019, 0x0002, 0, VR::FD, VM::M1, "Stepsize" }, { 0x0019, 0x0003, 0, VR::SL, VM::M1TN, "Warning" }, { 0x0019, 0x0004, 0, VR::ST, VM::M1, "DataID" }, }; const unsigned short Dict175TagHashTable[] = { 6, 9, 12, 5, 15, 0, 1, 0, 0, 1, 3, 3, 1, 2, 2, 2, 1, 1, 4, 4, }; const unsigned short Dict175KeyHashTable[] = { 5, 6, 9, 5, 12, 0, 1, 3, 61458, 1, 1, 32134, 3, 0, 16277, 2, 5976, 4, 30856, }; vtkDICOMDictionary::Dict Dict175Data = { "PRIVATE_CODE_STRING_0019", 5, 5, Dict175TagHashTable, Dict175KeyHashTable, Dict175Contents }; // ----- GEMS_IMAG_01 ----- const DictEntry Dict176Contents[] = { { 0x0027, 0x0006, 0, VR::SL, VM::M1, "ImageArchiveFlag" }, { 0x0027, 0x0010, 0, VR::SS, VM::M1, "ScoutType" }, { 0x0027, 0x001c, 0, VR::SL, VM::M1, "VmaMamp" }, { 0x0027, 0x001d, 0, VR::SS, VM::M1, "VmaPhase" }, { 0x0027, 0x001e, 0, VR::SL, VM::M1, "VmaMod" }, { 0x0027, 0x001f, 0, VR::SL, VM::M1, "VmaClipOrNoiseIndexBy10" }, { 0x0027, 0x0020, 0, VR::SS, VM::M1, "SmartScanOnOffFlag" }, { 0x0027, 0x0030, 0, VR::SH, VM::M1, "ForeignImageRevision" }, { 0x0027, 0x0031, 0, VR::SS, VM::M1, "ImagingMode" }, { 0x0027, 0x0032, 0, VR::SS, VM::M1, "PulseSequence" }, { 0x0027, 0x0033, 0, VR::UL, VM::M1, "ImagingOptions" }, { 0x0027, 0x0035, 0, VR::SS, VM::M1, "PlaneType" }, { 0x0027, 0x0036, 0, VR::SL, VM::M1, "ObliquePlane" }, { 0x0027, 0x0040, 0, VR::SH, VM::M1, "RASLetterOfImageLocation" }, { 0x0027, 0x0041, 0, VR::FL, VM::M1, "ImageLocation" }, { 0x0027, 0x0042, 0, VR::FL, VM::M1, "CenterRCoordOfPlaneImage" }, { 0x0027, 0x0043, 0, VR::FL, VM::M1, "CenterACoordOfPlaneImage" }, { 0x0027, 0x0044, 0, VR::FL, VM::M1, "CenterSCoordOfPlaneImage" }, { 0x0027, 0x0045, 0, VR::FL, VM::M1, "NormalRCoord" }, { 0x0027, 0x0046, 0, VR::FL, VM::M1, "NormalACoord" }, { 0x0027, 0x0047, 0, VR::FL, VM::M1, "NormalSCoord" }, { 0x0027, 0x0048, 0, VR::FL, VM::M1, "RCoordOfTopRightCorner" }, { 0x0027, 0x0049, 0, VR::FL, VM::M1, "ACoordOfTopRightCorner" }, { 0x0027, 0x004a, 0, VR::FL, VM::M1, "SCoordOfTopRightCorner" }, { 0x0027, 0x004b, 0, VR::FL, VM::M1, "RCoordOfBottomRightCorner" }, { 0x0027, 0x004c, 0, VR::FL, VM::M1, "ACoordOfBottomRightCorner" }, { 0x0027, 0x004d, 0, VR::FL, VM::M1, "SCoordOfBottomRightCorner" }, { 0x0027, 0x0050, 0, VR::FL, VM::M1, "TableStartLocation" }, { 0x0027, 0x0051, 0, VR::FL, VM::M1, "TableEndLocation" }, { 0x0027, 0x0052, 0, VR::SH, VM::M1, "RASLetterForSideOfImage" }, { 0x0027, 0x0053, 0, VR::SH, VM::M1, "RASLetterForAnteriorPosterior" }, { 0x0027, 0x0054, 0, VR::SH, VM::M1, "RASLetterForScoutStartLoc" }, { 0x0027, 0x0055, 0, VR::SH, VM::M1, "RASLetterForScoutEndLoc" }, { 0x0027, 0x0060, 0, VR::FL, VM::M1, "ImageDimensionX" }, { 0x0027, 0x0061, 0, VR::FL, VM::M1, "ImageDimensionY" }, { 0x0027, 0x0062, 0, VR::FL, VM::M1, "NumberOfExcitations" }, }; const unsigned short Dict176TagHashTable[] = { 37, 40, 43, 46, 36, 36, 49, 52, 57, 60, 63, 66, 36, 36, 36, 36, 36, 69, 72, 75, 78, 83, 88, 93, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 133, 0, 1, 23, 74, 1, 24, 75, 1, 21, 72, 1, 22, 73, 1, 31, 84, 2, 6, 32, 32, 85, 1, 29, 82, 1, 30, 83, 1, 27, 80, 1, 28, 81, 1, 12, 54, 1, 11, 53, 1, 1, 16, 2, 5, 31, 10, 51, 2, 4, 30, 9, 50, 2, 3, 29, 8, 49, 2, 2, 28, 7, 48, 1, 19, 70, 1, 20, 71, 1, 17, 68, 1, 18, 69, 1, 15, 66, 1, 16, 67, 1, 13, 64, 1, 14, 65, 1, 35, 98, 1, 0, 6, 2, 25, 76, 33, 96, 2, 26, 77, 34, 97, }; const unsigned short Dict176KeyHashTable[] = { 36, 37, 36, 42, 47, 50, 53, 36, 60, 63, 68, 71, 76, 36, 81, 36, 84, 87, 90, 36, 93, 98, 36, 36, 103, 36, 36, 106, 109, 36, 112, 36, 117, 120, 123, 126, 0, 2, 14, 736, 28, 8607, 2, 11, 47221, 18, 3717, 1, 2, 10012, 1, 32, 22584, 3, 16, 57056, 25, 978, 35, 56162, 1, 31, 42965, 2, 4, 53936, 7, 11350, 1, 23, 10253, 2, 6, 64566, 15, 50259, 2, 20, 42235, 26, 55293, 1, 12, 50710, 1, 0, 43517, 1, 10, 1095, 1, 3, 49922, 2, 5, 20660, 13, 64966, 2, 21, 9722, 30, 25366, 1, 22, 37109, 1, 24, 32857, 1, 17, 25015, 2, 8, 63866, 19, 4266, 1, 27, 15573, 1, 1, 53973, 1, 33, 5761, 3, 9, 6569, 29, 16095, 34, 5761, }; vtkDICOMDictionary::Dict Dict176Data = { "GEMS_IMAG_01", 36, 36, Dict176TagHashTable, Dict176KeyHashTable, Dict176Contents }; // ----- Silhouette ROI V1.0 ----- const DictEntry Dict177Contents[] = { { 0x0029, 0x0011, 0, VR::IS, VM::M1, "ROIName" }, { 0x0029, 0x0012, 0, VR::LT, VM::M1, "ROINameFont" }, { 0x0029, 0x0013, 0, VR::LT, VM::M1, "ROINormalColor" }, { 0x0029, 0x0014, 0, VR::UL, VM::M1, "ROIFillPattern" }, { 0x0029, 0x0015, 0, VR::UL, VM::M1, "ROIBpSeg" }, { 0x0029, 0x0016, 0, VR::UN, VM::M1, "ROIBpSegPairs" }, { 0x0029, 0x0017, 0, VR::UL, VM::M1, "ROISeedSpace" }, { 0x0029, 0x0018, 0, VR::UN, VM::M1, "ROISeeds" }, { 0x0029, 0x0019, 0, VR::UL, VM::M1, "ROILineThickness" }, { 0x0029, 0x0020, 0, VR::UL, VM::M1, "ROILineStyle" }, { 0x0029, 0x0021, 0, VR::UL, VM::M1, "ROILineDashLength" }, { 0x0029, 0x0022, 0, VR::UL, VM::M1, "ROIInteractivity" }, { 0x0029, 0x0023, 0, VR::UL, VM::M1, "ROINamePosition" }, { 0x0029, 0x0024, 0, VR::UL, VM::M1, "ROINameDisplay" }, { 0x0029, 0x0025, 0, VR::LT, VM::M1, "ROILabel" }, { 0x0029, 0x0026, 0, VR::UL, VM::M1, "ROIShape" }, { 0x0029, 0x0027, 0, VR::FD, VM::M1, "ROIShapeTilt" }, { 0x0029, 0x0028, 0, VR::UL, VM::M1, "ROIShapePointsCount" }, { 0x0029, 0x0029, 0, VR::UL, VM::M1, "ROIShapePointsSpace" }, { 0x0029, 0x0030, 0, VR::FD, VM::M1, "ROIShapePoints" }, { 0x0029, 0x0031, 0, VR::UL, VM::M1, "ROIShapeControlPointsCount" }, { 0x0029, 0x0032, 0, VR::UL, VM::M1, "ROIShapeControlPointsSpace" }, { 0x0029, 0x0033, 0, VR::FD, VM::M1, "ROIShapeControlPoints" }, { 0x0029, 0x0034, 0, VR::UL, VM::M1, "ROIDontSave" }, }; const unsigned short Dict177TagHashTable[] = { 25, 32, 39, 42, 24, 45, 24, 24, 48, 53, 56, 61, 66, 71, 76, 81, 24, 24, 24, 24, 24, 24, 24, 24, 0, 3, 8, 25, 18, 41, 20, 49, 3, 7, 24, 17, 40, 19, 48, 1, 22, 51, 1, 21, 50, 1, 23, 52, 2, 0, 17, 10, 33, 1, 9, 32, 2, 2, 19, 12, 35, 2, 1, 18, 11, 34, 2, 4, 21, 14, 37, 2, 3, 20, 13, 36, 2, 6, 23, 16, 39, 2, 5, 22, 15, 38, }; const unsigned short Dict177KeyHashTable[] = { 25, 24, 30, 33, 36, 39, 42, 45, 48, 24, 24, 51, 24, 54, 57, 24, 62, 65, 24, 70, 73, 76, 79, 82, 0, 2, 0, 32878, 4, 10856, 1, 21, 19995, 1, 7, 48796, 1, 3, 6538, 1, 12, 51700, 1, 13, 36548, 1, 2, 47522, 1, 9, 61748, 1, 8, 26445, 1, 19, 6630, 2, 11, 12570, 17, 53929, 1, 15, 53122, 2, 10, 18815, 18, 58685, 1, 23, 4052, 1, 6, 28631, 1, 16, 31243, 1, 22, 51943, 4, 1, 46374, 5, 12891, 14, 24457, 20, 15238, }; vtkDICOMDictionary::Dict Dict177Data = { "Silhouette ROI V1.0", 24, 24, Dict177TagHashTable, Dict177KeyHashTable, Dict177Contents }; // ----- DZDICOM 4.3.0 ----- const DictEntry Dict178Contents[] = { { 0x0009, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x0009, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0005, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0008, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0013, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0014, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0017, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0070, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0071, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0072, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0074, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x007a, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x00a1, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x00a2, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x00f1, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x00f7, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x00f9, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict178TagHashTable[] = { 25, 26, 33, 36, 41, 44, 47, 25, 50, 25, 53, 56, 59, 62, 65, 70, 25, 25, 73, 76, 79, 84, 87, 25, 90, 0, 3, 7, 8, 10, 19, 22, 241, 1, 9, 18, 2, 12, 21, 23, 247, 1, 11, 20, 1, 14, 23, 1, 13, 22, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 2, 6, 7, 19, 122, 1, 5, 6, 1, 24, 249, 1, 21, 162, 2, 15, 112, 20, 161, 1, 16, 113, 1, 17, 114, 2, 8, 17, 18, 116, }; const unsigned short Dict178KeyHashTable[] = { 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 215, 1, 215, 2, 215, 3, 215, 4, 215, 5, 215, 6, 215, 7, 215, 8, 215, 9, 215, 10, 215, 11, 215, 12, 215, 13, 215, 14, 215, 15, 215, 16, 215, 17, 215, 18, 215, 19, 215, 20, 215, 21, 215, 22, 215, 23, 215, 24, 215, }; vtkDICOMDictionary::Dict Dict178Data = { "DZDICOM 4.3.0", 25, 25, Dict178TagHashTable, Dict178KeyHashTable, Dict178Contents }; // ----- SIEMENS SERIES SHADOW ATTRIBUTES ----- const DictEntry Dict179Contents[] = { { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0003, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0005, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0008, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x000a, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x000c, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x000d, 0, VR::US, VM::M1, "" }, { 0x0021, 0x000f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0012, 0, VR::FD, VM::M1, "" }, { 0x0021, 0x0013, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0014, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0016, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0017, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0018, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0019, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x001a, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x001b, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x001c, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x001d, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x001f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0022, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0023, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0025, 0, VR::SL, VM::M1TN, "" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0021, 0x002a, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x002b, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x002c, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x002d, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x002e, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x002f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0031, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0032, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0033, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0034, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0035, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0036, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0038, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x003b, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict179TagHashTable[] = { 47, 48, 51, 56, 61, 47, 66, 71, 76, 79, 82, 87, 92, 97, 102, 107, 112, 115, 118, 121, 124, 127, 47, 130, 47, 133, 136, 47, 47, 47, 47, 47, 139, 47, 142, 145, 148, 151, 154, 157, 160, 163, 47, 166, 169, 172, 175, 0, 1, 14, 17, 2, 13, 16, 28, 35, 2, 16, 19, 27, 34, 2, 15, 18, 29, 37, 2, 17, 20, 31, 39, 2, 19, 23, 30, 38, 1, 18, 22, 1, 21, 25, 2, 20, 24, 33, 43, 2, 23, 27, 32, 42, 2, 22, 26, 35, 45, 2, 25, 29, 34, 44, 2, 24, 28, 37, 47, 2, 26, 31, 36, 46, 1, 39, 49, 1, 38, 48, 1, 41, 51, 1, 40, 50, 1, 43, 53, 1, 42, 52, 1, 44, 54, 1, 45, 56, 1, 46, 59, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 1, 5, 6, 1, 8, 9, 1, 7, 8, 1, 9, 10, 1, 11, 13, 1, 10, 12, 1, 12, 15, }; const unsigned short Dict179KeyHashTable[] = { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 114, 1, 114, 2, 114, 3, 114, 4, 114, 5, 114, 6, 114, 7, 114, 8, 114, 9, 114, 10, 114, 11, 114, 12, 114, 13, 114, 14, 114, 15, 114, 16, 114, 17, 114, 18, 114, 19, 114, 20, 114, 21, 114, 22, 114, 23, 114, 24, 114, 25, 114, 26, 114, 27, 114, 28, 114, 29, 114, 30, 114, 31, 114, 32, 114, 33, 114, 34, 114, 35, 114, 36, 114, 37, 114, 38, 114, 39, 114, 40, 114, 41, 114, 42, 114, 43, 114, 44, 114, 45, 114, 46, 114, }; vtkDICOMDictionary::Dict Dict179Data = { "SIEMENS SERIES SHADOW ATTRIBUTES", 47, 47, Dict179TagHashTable, Dict179KeyHashTable, Dict179Contents }; // ----- DL_INTERNAL_USE ----- const DictEntry Dict180Contents[] = { { 0x0015, 0x008f, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict180TagHashTable[] = { 2, 0, 1, 0, 143, }; const unsigned short Dict180KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict180Data = { "DL_INTERNAL_USE", 1, 1, Dict180TagHashTable, Dict180KeyHashTable, Dict180Contents }; // ----- HOLOGIC, Inc. ----- const DictEntry Dict181Contents[] = { { 0x0019, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::LO, VM::M1, "PaddleID" }, { 0x0019, 0x0007, 0, VR::SH, VM::M1, "PaddlePosition" }, { 0x0019, 0x0008, 0, VR::LO, VM::M1, "CollimationSize" }, { 0x0019, 0x0016, 0, VR::DS, VM::M1, "PaddleAngle" }, { 0x0019, 0x0025, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::LO, VM::M1, "PaddleIDDescription" }, { 0x0019, 0x0027, 0, VR::SH, VM::M1, "PaddlePositionDescription" }, { 0x0019, 0x0028, 0, VR::LO, VM::M1, "CollimationSizeDescription" }, { 0x0019, 0x0029, 0, VR::LO, VM::M1, "AECUserDensityScaleFactorDescription" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "AECUserDensityScaleFactor" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "AECSystemDensityScaleFactor" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "AECCalculatedmAs" }, { 0x0019, 0x0033, 0, VR::US, VM::M1, "AECAutoPixel1" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "AECAutoPixel2" }, { 0x0019, 0x0035, 0, VR::US, VM::M1, "AECSensor" }, { 0x0019, 0x0037, 0, VR::LO, VM::M1, "NPTMode" }, { 0x0019, 0x0040, 0, VR::DS, VM::M1, "SkinEdge" }, { 0x0019, 0x0041, 0, VR::DS, VM::M1, "ExposureIndex" }, { 0x0019, 0x0042, 0, VR::IS, VM::M1, "ExposureIndexTarget" }, { 0x0019, 0x0043, 0, VR::DS, VM::M1, "ShortIndexRatio" }, { 0x0019, 0x0044, 0, VR::DS, VM::M1, "ScoutkVp" }, { 0x0019, 0x0045, 0, VR::IS, VM::M1, "ScoutmA" }, { 0x0019, 0x0046, 0, VR::IS, VM::M1, "ScoutmAs" }, { 0x0019, 0x0050, 0, VR::DS, VM::M1, "DisplayMinimumOD" }, { 0x0019, 0x0051, 0, VR::DS, VM::M1, "DispalyMaximumOD" }, { 0x0019, 0x0052, 0, VR::IS, VM::M1, "DisplayMinimumNits" }, { 0x0019, 0x0053, 0, VR::IS, VM::M1, "DisplayMaximumNits" }, { 0x0019, 0x0060, 0, VR::LT, VM::M1, "GeometryCalibration" }, { 0x0019, 0x0061, 0, VR::OB, VM::M1, "ThreeDIPParameters" }, { 0x0019, 0x0062, 0, VR::LT, VM::M1, "TwoDIPParameters" }, { 0x0019, 0x0070, 0, VR::LO, VM::M1, "FrameOfReferenceID" }, { 0x0019, 0x0071, 0, VR::CS, VM::M1, "PairedPosition" }, { 0x0019, 0x0080, 0, VR::SH, VM::M1, "DetectorImageOffset" }, { 0x0019, 0x0085, 0, VR::SH, VM::M1, "ImageSource" }, { 0x0019, 0x0087, 0, VR::LO, VM::M1, "MarkerText" }, { 0x0019, 0x0088, 0, VR::LO, VM::M1, "MarkerTechInitials" }, { 0x0019, 0x0089, 0, VR::DS, VM::M2, "MarkerLocation" }, { 0x0019, 0x008A, 0, VR::SQ, VM::M2, "MarkerSequence" }, { 0x0019, 0x0090, 0, VR::DS, VM::M1, "ConventionalTomoAngle" }, { 0x0019, 0x0097, 0, VR::SH, VM::M1, "MarkersBurnedIntoImage" }, { 0x0019, 0x0098, 0, VR::LO, VM::M1, "GridLineCorrection" }, { 0x7e01, 0x0001, 0, VR::LO, VM::M1, "CodecVersion" }, { 0x7e01, 0x0002, 0, VR::SH, VM::M1, "CodecContentType" }, { 0x7e01, 0x0010, 0, VR::SQ, VM::M1, "HighResolutionDataSeqence" }, { 0x7e01, 0x0011, 0, VR::SQ, VM::M1, "LowResolutionDataSeqence" }, { 0x7e01, 0x0012, 0, VR::OB, VM::M1, "CodecContent" }, { 0x7f01, 0x0001, 0, VR::LO, VM::M1, "CodecVersion" }, { 0x7f01, 0x0002, 0, VR::SH, VM::M1, "CodecContentType" }, { 0x7f01, 0x0010, 0, VR::SQ, VM::M1, "HighResolutionDataSeqence" }, { 0x7f01, 0x0011, 0, VR::SQ, VM::M1, "LowResolutionDataSeqence" }, { 0x7f01, 0x0012, 0, VR::OB, VM::M1, "CodecContent" }, }; const unsigned short Dict181TagHashTable[] = { 55, 55, 55, 56, 55, 59, 62, 65, 68, 55, 71, 74, 77, 55, 55, 80, 55, 83, 88, 91, 96, 101, 104, 55, 107, 55, 110, 113, 55, 116, 121, 126, 55, 129, 132, 135, 142, 147, 152, 157, 160, 163, 166, 171, 176, 179, 186, 55, 191, 196, 201, 55, 55, 55, 55, 0, 1, 50, 1, 1, 8, 37, 1, 51, 2, 1, 10, 39, 1, 9, 38, 1, 31, 96, 1, 32, 97, 1, 33, 98, 1, 7, 22, 2, 6, 8, 27, 80, 1, 28, 81, 2, 29, 82, 48, 17, 2, 30, 83, 47, 16, 1, 44, 152, 1, 49, 18, 1, 0, 1, 1, 2, 3, 1, 1, 2, 2, 3, 4, 42, 144, 2, 5, 7, 43, 151, 1, 4, 6, 1, 20, 64, 1, 21, 65, 3, 22, 66, 41, 138, 45, 1, 2, 23, 67, 40, 137, 2, 24, 68, 39, 136, 2, 25, 69, 46, 2, 1, 26, 70, 1, 14, 49, 1, 13, 48, 2, 16, 51, 53, 17, 2, 15, 50, 52, 16, 1, 18, 53, 3, 17, 52, 36, 128, 54, 18, 2, 19, 55, 38, 135, 2, 12, 41, 37, 133, 2, 11, 40, 34, 112, 1, 35, 113, }; const unsigned short Dict181KeyHashTable[] = { 56, 55, 55, 55, 55, 63, 70, 55, 55, 55, 55, 55, 75, 55, 84, 55, 55, 87, 55, 92, 95, 55, 98, 103, 55, 55, 106, 109, 120, 123, 126, 129, 134, 55, 55, 137, 55, 144, 55, 147, 55, 55, 55, 55, 55, 55, 156, 167, 170, 55, 175, 178, 183, 55, 190, 0, 3, 6, 23965, 10, 4888, 34, 63399, 3, 44, 43178, 48, 23676, 53, 23676, 2, 20, 57727, 29, 53065, 4, 13, 8408, 22, 19045, 47, 65357, 52, 65357, 1, 42, 28763, 2, 4, 7405, 41, 1449, 1, 36, 39578, 1, 43, 49173, 2, 27, 48620, 31, 48917, 1, 19, 64323, 1, 9, 8010, 5, 5, 43199, 12, 9483, 25, 30730, 37, 17394, 38, 27735, 1, 11, 8533, 1, 24, 8401, 1, 35, 56695, 2, 45, 23366, 50, 23366, 1, 26, 8428, 3, 18, 62723, 49, 54557, 54, 54557, 1, 40, 35485, 4, 7, 21065, 15, 31542, 21, 59639, 28, 50403, 5, 0, 97, 1, 97, 2, 97, 3, 97, 8, 97, 1, 33, 21479, 2, 46, 31472, 51, 31472, 1, 16, 21368, 2, 17, 21368, 30, 63644, 3, 14, 43306, 23, 57384, 32, 5174, 1, 39, 35678, }; vtkDICOMDictionary::Dict Dict181Data = { "HOLOGIC, Inc.", 55, 55, Dict181TagHashTable, Dict181KeyHashTable, Dict181Contents }; // ----- AMI StudyExtensions_01 ----- const DictEntry Dict182Contents[] = { { 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" }, }; const unsigned short Dict182TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict182KeyHashTable[] = { 2, 0, 1, 0, 5022, }; vtkDICOMDictionary::Dict Dict182Data = { "AMI StudyExtensions_01", 1, 1, Dict182TagHashTable, Dict182KeyHashTable, Dict182Contents }; // ----- SPI-P-Private-DCI Release 1 ----- const DictEntry Dict183Contents[] = { { 0x0019, 0x0010, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsAllocated" }, { 0x0019, 0x0011, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsStored" }, { 0x0019, 0x0012, 0, VR::UN, VM::M1, "ECGTimeMapDataHighBit" }, { 0x0019, 0x0013, 0, VR::UN, VM::M1, "ECGTimeMapDataRepresentation" }, { 0x0019, 0x0014, 0, VR::UN, VM::M1, "ECGTimeMapDataSmallestDataValue" }, { 0x0019, 0x0015, 0, VR::UN, VM::M1, "ECGTimeMapDataLargestDataValue" }, { 0x0019, 0x0016, 0, VR::UN, VM::M1, "ECGTimeMapDataNumberOfDataValues" }, { 0x0019, 0x0017, 0, VR::UN, VM::M1, "ECGTimeMapData" }, }; const unsigned short Dict183TagHashTable[] = { 9, 12, 15, 18, 21, 24, 27, 30, 0, 1, 1, 17, 1, 0, 16, 1, 3, 19, 1, 2, 18, 1, 5, 21, 1, 4, 20, 1, 7, 23, 1, 6, 22, }; const unsigned short Dict183KeyHashTable[] = { 8, 8, 9, 12, 17, 8, 20, 27, 0, 1, 2, 29379, 2, 6, 7908, 7, 35587, 1, 5, 27872, 3, 0, 64646, 1, 8751, 3, 48465, 1, 4, 9486, }; vtkDICOMDictionary::Dict Dict183Data = { "SPI-P-Private-DCI Release 1", 8, 8, Dict183TagHashTable, Dict183KeyHashTable, Dict183Contents }; // ----- GEMS_FALCON_03 ----- const DictEntry Dict184Contents[] = { { 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" }, { 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" }, { 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" }, { 0x0045, 0x0065, 0, VR::IS, VM::M1, "RequestedDetectorEntranceDose" }, { 0x0045, 0x0067, 0, VR::DS, VM::M3, "VOILUTAssymmetryParameterBeta" }, { 0x0045, 0x0069, 0, VR::IS, VM::M1, "CollimatorRotation" }, { 0x0045, 0x0072, 0, VR::IS, VM::M1, "CollimatorWidth" }, { 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" }, }; const unsigned short Dict184TagHashTable[] = { 9, 8, 14, 8, 17, 8, 20, 25, 0, 2, 0, 85, 3, 101, 1, 4, 103, 1, 5, 105, 2, 2, 99, 7, 115, 2, 1, 98, 6, 114, }; const unsigned short Dict184KeyHashTable[] = { 8, 8, 8, 9, 16, 23, 8, 26, 0, 3, 4, 5352, 5, 13265, 6, 22843, 3, 2, 29079, 3, 16921, 7, 6426, 1, 1, 25135, 1, 0, 59138, }; vtkDICOMDictionary::Dict Dict184Data = { "GEMS_FALCON_03", 8, 8, Dict184TagHashTable, Dict184KeyHashTable, Dict184Contents }; // ----- SIEMENS CM VA0 CMS ----- const DictEntry Dict185Contents[] = { { 0x0009, 0x0000, 0, VR::DS, VM::M1, "NumberOfMeasurements" }, { 0x0009, 0x0010, 0, VR::CS, VM::M1, "StorageMode" }, { 0x0009, 0x0012, 0, VR::UL, VM::M1, "EvaluationMaskImage" }, { 0x0009, 0x0026, 0, VR::DA, VM::M1, "LastMoveDate" }, { 0x0009, 0x0027, 0, VR::TM, VM::M1, "LastMoveTime" }, { 0x0011, 0x000a, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0010, 0, VR::DA, VM::M1, "RegistrationDate" }, { 0x0011, 0x0011, 0, VR::TM, VM::M1, "RegistrationTime" }, { 0x0011, 0x0022, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0023, 0, VR::DS, VM::M1, "UsedPatientWeight" }, { 0x0011, 0x0040, 0, VR::IS, VM::M1, "OrganCode" }, { 0x0013, 0x0000, 0, VR::PN, VM::M1, "ModifyingPhysician" }, { 0x0013, 0x0010, 0, VR::DA, VM::M1, "ModificationDate" }, { 0x0013, 0x0012, 0, VR::TM, VM::M1, "ModificationTime" }, { 0x0013, 0x0020, 0, VR::PN, VM::M1, "PatientName" }, { 0x0013, 0x0022, 0, VR::LO, VM::M1, "PatientId" }, { 0x0013, 0x0030, 0, VR::DA, VM::M1, "PatientBirthdate" }, { 0x0013, 0x0031, 0, VR::DS, VM::M1, "PatientWeight" }, { 0x0013, 0x0032, 0, VR::LO, VM::M1, "PatientsMaidenName" }, { 0x0013, 0x0033, 0, VR::LO, VM::M1, "ReferringPhysician" }, { 0x0013, 0x0034, 0, VR::LO, VM::M1, "AdmittingDiagnosis" }, { 0x0013, 0x0035, 0, VR::LO, VM::M1, "PatientSex" }, { 0x0013, 0x0040, 0, VR::LO, VM::M1, "ProcedureDescription" }, { 0x0013, 0x0042, 0, VR::LO, VM::M1, "PatientRestDirection" }, { 0x0013, 0x0044, 0, VR::LO, VM::M1, "PatientPosition" }, { 0x0013, 0x0046, 0, VR::LO, VM::M1, "ViewDirection" }, { 0x0013, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0051, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0052, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0053, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0054, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0055, 0, VR::LO, VM::M1, "" }, { 0x0013, 0x0056, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::IS, VM::M1, "NetFrequency" }, { 0x0019, 0x0020, 0, VR::CS, VM::M1, "MeasurementMode" }, { 0x0019, 0x0030, 0, VR::CS, VM::M1, "CalculationMode" }, { 0x0019, 0x0050, 0, VR::IS, VM::M1, "NoiseLevel" }, { 0x0019, 0x0060, 0, VR::IS, VM::M1, "NumberOfDataBytes" }, { 0x0019, 0x0070, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::DS, VM::M2, "FoV" }, { 0x0021, 0x0022, 0, VR::DS, VM::M1, "ImageMagnificationFactor" }, { 0x0021, 0x0024, 0, VR::DS, VM::M2, "ImageScrollOffset" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1, "ImagePixelOffset" }, { 0x0021, 0x0030, 0, VR::CS, VM::M1, "ViewDirection" }, { 0x0021, 0x0032, 0, VR::CS, VM::M1, "PatientRestDirection" }, { 0x0021, 0x0060, 0, VR::DS, VM::M3, "ImagePosition" }, { 0x0021, 0x0061, 0, VR::DS, VM::M3, "ImageNormal" }, { 0x0021, 0x0063, 0, VR::DS, VM::M1, "ImageDistance" }, { 0x0021, 0x0065, 0, VR::US, VM::M1, "ImagePositioningHistoryMask" }, { 0x0021, 0x006a, 0, VR::DS, VM::M3, "ImageRow" }, { 0x0021, 0x006b, 0, VR::DS, VM::M3, "ImageColumn" }, { 0x0021, 0x0070, 0, VR::CS, VM::M3, "PatientOrientationSet1" }, { 0x0021, 0x0071, 0, VR::CS, VM::M3, "PatientOrientationSet2" }, { 0x0021, 0x0080, 0, VR::LO, VM::M1, "StudyName" }, { 0x0021, 0x0082, 0, VR::SH, VM::M3, "StudyType" }, { 0x0029, 0x0010, 0, VR::CS, VM::M1, "WindowStyle" }, { 0x0029, 0x0011, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0013, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::CS, VM::M3, "PixelQualityCode" }, { 0x0029, 0x0022, 0, VR::IS, VM::M3, "PixelQualityValue" }, { 0x0029, 0x0050, 0, VR::CS, VM::M1, "ArchiveCode" }, { 0x0029, 0x0051, 0, VR::CS, VM::M1, "ExposureCode" }, { 0x0029, 0x0052, 0, VR::IS, VM::M1, "SortCode" }, { 0x0029, 0x0053, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0060, 0, VR::LO, VM::M1, "Splash" }, { 0x0051, 0x0010, 0, VR::LO, VM::M1TN, "ImageText" }, { 0x6021, 0x0000, 0, VR::LO, VM::M1, "ImageGraphicsFormatCode" }, { 0x6021, 0x0010, 0, VR::LO, VM::M1, "ImageGraphics" }, { 0x7fe1, 0x0000, 0, VR::OB, VM::M1TN, "BinaryData" }, }; const unsigned short Dict185TagHashTable[] = { 71, 76, 85, 90, 97, 100, 70, 105, 70, 108, 115, 122, 127, 70, 130, 133, 136, 141, 70, 144, 70, 151, 70, 154, 70, 157, 70, 160, 70, 70, 70, 70, 165, 168, 171, 176, 70, 70, 179, 182, 70, 185, 70, 70, 70, 70, 188, 191, 70, 194, 197, 204, 211, 214, 70, 70, 217, 220, 225, 70, 70, 70, 70, 70, 228, 235, 240, 243, 248, 251, 0, 2, 7, 17, 30, 84, 4, 6, 16, 13, 18, 31, 85, 40, 32, 2, 36, 80, 65, 96, 3, 12, 16, 41, 34, 67, 0, 1, 50, 106, 2, 42, 36, 51, 107, 1, 43, 38, 3, 0, 0, 33, 16, 59, 32, 3, 10, 64, 23, 66, 52, 112, 2, 53, 113, 60, 34, 1, 22, 64, 1, 25, 70, 1, 39, 128, 2, 24, 68, 69, 0, 1, 44, 48, 3, 11, 0, 45, 50, 68, 16, 1, 55, 130, 1, 54, 128, 1, 1, 16, 2, 2, 18, 5, 10, 1, 19, 51, 1, 18, 50, 2, 17, 49, 38, 112, 1, 16, 48, 1, 21, 53, 1, 20, 52, 1, 35, 48, 1, 4, 39, 1, 3, 38, 1, 15, 34, 3, 9, 35, 37, 96, 61, 80, 3, 8, 34, 14, 32, 62, 81, 1, 63, 82, 1, 64, 83, 1, 57, 17, 2, 34, 32, 56, 16, 1, 58, 19, 3, 28, 82, 46, 96, 66, 16, 2, 29, 83, 47, 97, 1, 26, 80, 2, 27, 81, 48, 99, 1, 32, 86, 1, 49, 101, }; const unsigned short Dict185KeyHashTable[] = { 71, 70, 76, 79, 86, 70, 89, 92, 70, 70, 70, 70, 70, 95, 106, 113, 70, 116, 70, 119, 122, 70, 70, 125, 70, 128, 131, 70, 134, 70, 139, 144, 70, 147, 70, 70, 70, 150, 153, 156, 159, 162, 70, 70, 70, 167, 170, 173, 70, 70, 70, 176, 181, 184, 187, 190, 193, 196, 199, 202, 207, 210, 70, 239, 244, 70, 247, 250, 70, 70, 0, 2, 17, 48443, 69, 47526, 1, 41, 24629, 3, 16, 7293, 36, 7860, 47, 26285, 1, 13, 19441, 1, 40, 11159, 1, 35, 63107, 5, 7, 30827, 23, 4178, 45, 4178, 54, 12451, 59, 24677, 3, 21, 24362, 22, 33958, 33, 40776, 1, 10, 11436, 1, 4, 49805, 1, 43, 7941, 1, 55, 15906, 1, 48, 34026, 1, 1, 241, 1, 37, 47447, 2, 34, 41038, 51, 33871, 2, 18, 64485, 63, 46327, 1, 62, 31066, 1, 68, 37908, 1, 19, 53538, 1, 42, 22564, 1, 66, 62017, 1, 65, 43820, 2, 11, 64903, 60, 33798, 1, 15, 15599, 1, 2, 8117, 1, 46, 17821, 2, 12, 11105, 52, 35928, 1, 53, 35928, 1, 14, 56081, 1, 0, 56369, 1, 49, 3883, 1, 50, 37372, 1, 20, 38829, 1, 61, 58572, 2, 24, 48302, 67, 49195, 1, 6, 22491, 14, 5, 76, 8, 76, 26, 76, 27, 76, 28, 76, 29, 76, 30, 76, 31, 76, 32, 76, 38, 76, 39, 76, 57, 76, 58, 76, 64, 76, 2, 25, 60011, 44, 60011, 1, 3, 41469, 1, 56, 62226, 1, 9, 24952, }; vtkDICOMDictionary::Dict Dict185Data = { "SIEMENS CM VA0 CMS", 70, 70, Dict185TagHashTable, Dict185KeyHashTable, Dict185Contents }; // ----- PHILIPS MR/PART 7 ----- const DictEntry Dict186Contents[] = { { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict186TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict186KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict186Data = { "PHILIPS MR/PART 7", 1, 1, Dict186TagHashTable, Dict186KeyHashTable, Dict186Contents }; // ----- PHILIPS MR/PART 6 ----- const DictEntry Dict187Contents[] = { { 0x0019, 0x0010, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict187TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict187KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict187Data = { "PHILIPS MR/PART 6", 1, 1, Dict187TagHashTable, Dict187KeyHashTable, Dict187Contents }; // ----- PHILIPS MR/PART ----- const DictEntry Dict188Contents[] = { { 0x0019, 0x0000, 0, VR::IS, VM::M1, "NumberOfStacks" }, { 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "StackType" }, { 0x0019, 0x0002, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::DS, VM::M1, "CCAngulation" }, { 0x0019, 0x0006, 0, VR::DS, VM::M1, "APAngulation" }, { 0x0019, 0x0007, 0, VR::DS, VM::M1, "LRAngulation" }, { 0x0019, 0x0008, 0, VR::IS, VM::M1, "PatientPosition" }, { 0x0019, 0x0009, 0, VR::IS, VM::M1, "PatientOrientation" }, { 0x0019, 0x000a, 0, VR::IS, VM::M1, "SliceOrientation" }, { 0x0019, 0x000b, 0, VR::DS, VM::M1, "LROffcenter" }, { 0x0019, 0x000c, 0, VR::DS, VM::M1, "CCOffcenter" }, { 0x0019, 0x000d, 0, VR::DS, VM::M1, "APOffcenter" }, { 0x0019, 0x000e, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000f, 0, VR::IS, VM::M1, "NumberOfSlices" }, { 0x0019, 0x0010, 0, VR::DS, VM::M1, "SliceFactor" }, { 0x0019, 0x0011, 0, VR::DS, VM::M1TN, "EchoTimes" }, { 0x0019, 0x0014, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::IS, VM::M1, "DynamicStudy" }, { 0x0019, 0x0018, 0, VR::DS, VM::M1, "HeartbeatInterval" }, { 0x0019, 0x0019, 0, VR::DS, VM::M1, "RepetitionTimeFFE" }, { 0x0019, 0x001a, 0, VR::DS, VM::M1, "FFEFlipAngle" }, { 0x0019, 0x001b, 0, VR::IS, VM::M1, "NumberOfScans" }, { 0x0019, 0x001c, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x001d, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::DS, VM::M1, "DynamicScanTimeBegin" }, { 0x0019, 0x0023, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0024, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0025, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0026, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0027, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0028, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0030, 0, VR::LO, VM::M1TN, "" }, { 0x0019, 0x0031, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0045, 0, VR::IS, VM::M1, "ReconstructionResolution" }, { 0x0019, 0x0050, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0051, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0052, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0053, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0055, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0056, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0057, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0058, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0059, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0061, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0062, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0063, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::DS, VM::M1, "RepetitionTimeSE" }, { 0x0019, 0x0065, 0, VR::DS, VM::M1, "RepetitionTimeIR" }, { 0x0019, 0x0066, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0067, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::IS, VM::M1, "NumberOfPhases" }, { 0x0019, 0x006a, 0, VR::IS, VM::M1, "CardiacFrequency" }, { 0x0019, 0x006b, 0, VR::DS, VM::M1, "InversionDelay" }, { 0x0019, 0x006c, 0, VR::DS, VM::M1, "GateDelay" }, { 0x0019, 0x006d, 0, VR::DS, VM::M1, "GateWidth" }, { 0x0019, 0x006e, 0, VR::DS, VM::M1, "TriggerDelayTime" }, { 0x0019, 0x0070, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x0080, 0, VR::IS, VM::M1, "NumberOfChemicalShifts" }, { 0x0019, 0x0081, 0, VR::DS, VM::M1, "ChemicalShift" }, { 0x0019, 0x0084, 0, VR::IS, VM::M1, "NumberOfRows" }, { 0x0019, 0x0085, 0, VR::IS, VM::M1, "NumberOfSamples" }, { 0x0019, 0x008A, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x008B, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x008C, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x008D, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x008E, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x008F, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0094, 0, VR::LO, VM::M1, "MagnetizationTransferContrast" }, { 0x0019, 0x0095, 0, VR::LO, VM::M1, "SpectralPresaturationWithInversionRecovery" }, { 0x0019, 0x0096, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0097, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00B4, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00B5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00B6, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00D1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00D3, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00F0, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00F6, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00F7, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00F8, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00F9, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00FA, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00FB, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00FC, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a4, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x00c0, 0, VR::DS, VM::M1, "TriggerDelayTimes" }, { 0x0019, 0x00c8, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00c9, 0, VR::IS, VM::M1, "FoldoverDirectionTransverse" }, { 0x0019, 0x00ca, 0, VR::IS, VM::M1, "FoldoverDirectionSagittal" }, { 0x0019, 0x00cb, 0, VR::IS, VM::M1, "FoldoverDirectionCoronal" }, { 0x0019, 0x00cc, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00cd, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00ce, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00cf, 0, VR::IS, VM::M1, "NumberOfEchoes" }, { 0x0019, 0x00d0, 0, VR::IS, VM::M1, "ScanResolution" }, { 0x0019, 0x00d2, 0, VR::LO, VM::M2, "WaterFatShift" }, { 0x0019, 0x00d4, 0, VR::IS, VM::M1, "ArtifactReduction" }, { 0x0019, 0x00d5, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00d6, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00d7, 0, VR::DS, VM::M1, "ScanPercentage" }, { 0x0019, 0x00d8, 0, VR::IS, VM::M1, "Halfscan" }, { 0x0019, 0x00d9, 0, VR::IS, VM::M1, "EPIFactor" }, { 0x0019, 0x00da, 0, VR::IS, VM::M1, "TurboFactor" }, { 0x0019, 0x00db, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00e0, 0, VR::IS, VM::M1, "PrepulseType" }, { 0x0019, 0x00e1, 0, VR::DS, VM::M1, "PrepulseDelay" }, { 0x0019, 0x00e3, 0, VR::DS, VM::M1, "PhaseContrastVelocity" }, { 0x0019, 0x00fc, 0, VR::IS, VM::M1, "ResonanceFrequency" }, { 0x0021, 0x0000, 0, VR::DA, VM::M1, "SeriesDate" }, { 0x0021, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0009, 0, VR::CS, VM::M1, "" }, { 0x0021, 0x000a, 0, VR::CS, VM::M1, "" }, { 0x0021, 0x000f, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::TM, VM::M1, "ScanTime" }, { 0x0021, 0x0013, 0, VR::CS, VM::M1, "" }, { 0x0021, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0020, 0, VR::IS, VM::M1, "SliceNumber" }, { 0x0021, 0x0021, 0, VR::IS, VM::M1, "SliceGap" }, { 0x0021, 0x0030, 0, VR::IS, VM::M1, "EchoNumber" }, { 0x0021, 0x0031, 0, VR::DS, VM::M1, "PatientReferenceID" }, { 0x0021, 0x0035, 0, VR::IS, VM::M1, "ChemicalShiftNumber" }, { 0x0021, 0x0040, 0, VR::IS, VM::M1, "PhaseNumber" }, { 0x0021, 0x0050, 0, VR::IS, VM::M1, "DynamicScanNumber" }, { 0x0021, 0x0060, 0, VR::IS, VM::M1, "NumberOfRowsInObject" }, { 0x0021, 0x0061, 0, VR::IS, VM::M1TN, "RowNumber" }, { 0x0021, 0x0062, 0, VR::IS, VM::M1TN, "" }, { 0x0029, 0x0000, 0, VR::DS, VM::M2, "" }, { 0x0029, 0x0004, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0031, 0, VR::DS, VM::M2, "" }, { 0x0029, 0x0032, 0, VR::DS, VM::M2, "" }, { 0x0029, 0x0050, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0051, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0052, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0053, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x00c3, 0, VR::IS, VM::M1, "ScanResolution" }, { 0x0029, 0x00c4, 0, VR::IS, VM::M1, "FieldOfView" }, { 0x0029, 0x00d5, 0, VR::LT, VM::M1, "SliceThickness" }, }; const unsigned short Dict188TagHashTable[] = { 152, 159, 164, 167, 172, 177, 151, 180, 185, 190, 151, 151, 195, 198, 151, 151, 201, 206, 211, 214, 217, 222, 225, 230, 235, 242, 245, 248, 253, 151, 256, 259, 151, 262, 151, 267, 270, 151, 151, 273, 276, 283, 292, 295, 300, 303, 306, 151, 309, 312, 319, 324, 327, 332, 335, 338, 341, 348, 353, 358, 363, 368, 373, 378, 383, 390, 395, 398, 151, 151, 151, 151, 401, 404, 409, 414, 419, 424, 427, 430, 151, 151, 437, 440, 151, 443, 446, 449, 452, 151, 151, 151, 151, 455, 151, 151, 458, 151, 461, 464, 467, 151, 151, 151, 470, 151, 151, 151, 151, 151, 151, 151, 475, 478, 481, 484, 487, 490, 493, 151, 496, 501, 506, 511, 516, 519, 522, 525, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 528, 531, 534, 537, 540, 543, 151, 151, 546, 549, 552, 0, 3, 20, 25, 70, 140, 128, 33, 2, 19, 24, 127, 32, 1, 22, 27, 2, 21, 26, 65, 129, 2, 24, 29, 64, 128, 1, 23, 28, 2, 25, 30, 67, 133, 2, 16, 17, 66, 132, 2, 15, 16, 141, 32, 1, 18, 21, 1, 17, 20, 2, 8, 9, 130, 49, 2, 7, 8, 129, 48, 1, 10, 11, 1, 9, 10, 2, 12, 13, 131, 53, 1, 11, 12, 2, 14, 15, 80, 182, 2, 13, 14, 79, 181, 3, 1, 1, 78, 180, 142, 49, 1, 0, 0, 1, 3, 3, 2, 2, 2, 143, 50, 1, 4, 5, 1, 6, 7, 1, 5, 6, 2, 93, 163, 118, 0, 1, 92, 161, 1, 91, 160, 1, 119, 6, 3, 36, 49, 94, 164, 121, 9, 4, 35, 48, 112, 218, 120, 8, 137, 0, 1, 113, 219, 2, 110, 216, 122, 10, 1, 111, 217, 1, 138, 4, 1, 123, 15, 1, 34, 41, 3, 33, 40, 105, 210, 124, 16, 2, 82, 211, 125, 19, 1, 104, 208, 2, 81, 209, 126, 21, 1, 108, 214, 1, 109, 215, 1, 106, 212, 3, 26, 33, 107, 213, 140, 17, 2, 98, 202, 139, 16, 2, 28, 35, 99, 203, 2, 27, 34, 96, 200, 2, 30, 37, 97, 201, 2, 29, 36, 102, 206, 2, 32, 39, 103, 207, 2, 31, 38, 100, 204, 3, 47, 88, 101, 205, 134, 96, 2, 48, 89, 135, 97, 1, 136, 98, 1, 95, 192, 1, 39, 80, 2, 40, 81, 88, 250, 2, 41, 82, 89, 251, 2, 42, 83, 86, 248, 2, 43, 84, 87, 249, 1, 44, 85, 1, 45, 86, 3, 46, 87, 90, 252, 117, 252, 1, 148, 195, 1, 83, 240, 1, 84, 246, 1, 85, 247, 1, 149, 196, 1, 37, 64, 1, 38, 69, 1, 132, 64, 1, 116, 227, 1, 114, 224, 1, 115, 225, 2, 63, 112, 150, 213, 1, 133, 80, 1, 57, 105, 1, 58, 106, 1, 59, 107, 1, 60, 108, 1, 61, 109, 1, 62, 110, 2, 49, 96, 144, 80, 2, 50, 97, 145, 81, 2, 51, 98, 146, 82, 2, 52, 99, 147, 83, 1, 53, 100, 1, 54, 101, 1, 55, 102, 1, 56, 103, 1, 77, 151, 1, 76, 150, 1, 75, 149, 1, 74, 148, 1, 69, 139, 1, 68, 138, 1, 73, 143, 1, 72, 142, 1, 71, 141, }; const unsigned short Dict188KeyHashTable[] = { 151, 152, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 155, 151, 151, 151, 151, 160, 151, 163, 151, 166, 151, 151, 169, 172, 175, 151, 178, 151, 181, 151, 184, 189, 151, 151, 151, 151, 151, 151, 151, 192, 151, 151, 151, 151, 151, 151, 151, 195, 151, 151, 198, 151, 151, 201, 204, 207, 151, 151, 151, 151, 151, 210, 151, 151, 151, 215, 151, 218, 151, 151, 151, 221, 224, 151, 229, 151, 151, 236, 151, 151, 239, 151, 151, 151, 244, 151, 247, 250, 151, 423, 151, 151, 151, 151, 426, 151, 151, 151, 151, 151, 435, 440, 443, 446, 449, 151, 151, 151, 151, 452, 457, 151, 151, 151, 151, 460, 151, 151, 151, 463, 466, 151, 469, 151, 151, 151, 474, 477, 482, 151, 485, 151, 151, 151, 490, 495, 498, 501, 151, 151, 151, 151, 0, 1, 18, 49582, 2, 67, 44003, 134, 46911, 1, 19, 2734, 1, 1, 757, 1, 57, 46573, 1, 11, 19000, 1, 149, 38735, 1, 20, 38545, 1, 14, 5333, 1, 74, 44603, 2, 66, 14897, 127, 58785, 1, 95, 54958, 1, 111, 24094, 1, 114, 36601, 1, 15, 54287, 1, 38, 42443, 1, 112, 25783, 1, 4, 60459, 2, 64, 47964, 65, 42821, 1, 10, 57139, 1, 128, 16359, 1, 110, 12083, 2, 116, 36718, 150, 62416, 3, 7, 38884, 97, 27911, 105, 4802, 1, 62, 39687, 2, 9, 1016, 117, 48580, 1, 60, 65032, 1, 98, 38247, 86, 2, 35, 3, 35, 13, 35, 17, 35, 23, 35, 24, 35, 25, 35, 26, 35, 28, 35, 29, 35, 30, 35, 31, 35, 32, 35, 33, 35, 34, 35, 35, 35, 36, 35, 37, 35, 39, 35, 40, 35, 41, 35, 42, 35, 43, 35, 44, 35, 45, 35, 46, 35, 47, 35, 48, 35, 49, 35, 50, 35, 51, 35, 52, 35, 55, 35, 56, 35, 63, 35, 68, 35, 69, 35, 70, 35, 71, 35, 72, 35, 73, 35, 76, 35, 77, 35, 78, 35, 79, 35, 80, 35, 81, 35, 82, 35, 83, 35, 84, 35, 85, 35, 86, 35, 87, 35, 88, 35, 89, 35, 90, 35, 91, 35, 92, 35, 93, 35, 94, 35, 96, 35, 100, 35, 101, 35, 102, 35, 107, 35, 108, 35, 113, 35, 119, 35, 120, 35, 121, 35, 122, 35, 123, 35, 125, 35, 126, 35, 136, 35, 137, 35, 138, 35, 139, 35, 140, 35, 141, 35, 142, 35, 143, 35, 144, 35, 145, 35, 146, 35, 147, 35, 1, 27, 54183, 4, 59, 57414, 104, 43137, 124, 24126, 148, 43137, 2, 118, 39591, 135, 8815, 1, 22, 15995, 1, 75, 33723, 1, 103, 42470, 1, 58, 28443, 2, 61, 18544, 109, 58878, 1, 8, 56009, 1, 54, 29050, 1, 0, 724, 1, 16, 36067, 2, 99, 16766, 115, 26215, 1, 5, 8583, 2, 6, 10939, 129, 57091, 1, 132, 56346, 2, 12, 11601, 53, 29052, 2, 130, 52465, 131, 24101, 1, 21, 61928, 1, 106, 7113, 1, 133, 5770, }; vtkDICOMDictionary::Dict Dict188Data = { "PHILIPS MR/PART", 151, 151, Dict188TagHashTable, Dict188KeyHashTable, Dict188Contents }; // ----- GEMS_DL_IMG_01 ----- const DictEntry Dict189Contents[] = { { 0x0019, 0x000B, 0, VR::DS, VM::M1T2, "FOVDimensionDouble" }, { 0x0019, 0x002B, 0, VR::FL, VM::M1, "DistanceToTableTop" }, { 0x0019, 0x0030, 0, VR::LO, VM::M1, "ImageFileName" }, { 0x0019, 0x0031, 0, VR::IS, VM::M1, "DefaultSpatialFilterFamily" }, { 0x0019, 0x0032, 0, VR::IS, VM::M1, "DefaultSpatialFilterStrength" }, { 0x0019, 0x0033, 0, VR::DS, VM::M1, "MinSaturationDose" }, { 0x0019, 0x0034, 0, VR::DS, VM::M1, "DetectorGain" }, { 0x0019, 0x0035, 0, VR::DS, VM::M1, "PatientDoseLimit" }, { 0x0019, 0x0036, 0, VR::DS, VM::M1, "PreprocImageRateMax" }, { 0x0019, 0x0037, 0, VR::CS, VM::M1, "SensorRoiShape" }, { 0x0019, 0x0038, 0, VR::DS, VM::M1, "SensorRoixPosition" }, { 0x0019, 0x0039, 0, VR::DS, VM::M1, "SensorRoiyPosition" }, { 0x0019, 0x003A, 0, VR::DS, VM::M1, "SensorRoixSize" }, { 0x0019, 0x003B, 0, VR::DS, VM::M1, "SensorRoiySize" }, { 0x0019, 0x003D, 0, VR::DS, VM::M1, "NoiseSensitivity" }, { 0x0019, 0x003E, 0, VR::DS, VM::M1, "SharpSensitivity" }, { 0x0019, 0x003F, 0, VR::DS, VM::M1, "ContrastSensitivity" }, { 0x0019, 0x0040, 0, VR::DS, VM::M1, "LagSensitivity" }, { 0x0019, 0x0041, 0, VR::CS, VM::M1, "Tube" }, { 0x0019, 0x0042, 0, VR::US, VM::M1, "DetectorSizeRows" }, { 0x0019, 0x0043, 0, VR::US, VM::M1, "DetectorSizeColumns" }, { 0x0019, 0x0044, 0, VR::DS, VM::M1, "MinObjectSize" }, { 0x0019, 0x0045, 0, VR::DS, VM::M1, "MaxObjectSize" }, { 0x0019, 0x0046, 0, VR::DS, VM::M1, "MaxObjectSpeed" }, { 0x0019, 0x0047, 0, VR::CS, VM::M1, "ObjectBackMotion" }, { 0x0019, 0x0048, 0, VR::UL, VM::M1, "ExposureTrajectoryFamily" }, { 0x0019, 0x0049, 0, VR::DS, VM::M1, "WindowTimeDuration" }, { 0x0019, 0x004A, 0, VR::CS, VM::M1, "PositionerAngleDisplayMode" }, { 0x0019, 0x004B, 0, VR::IS, VM::M2, "DetectorOrigin" }, { 0x0019, 0x004C, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x004E, 0, VR::DS, VM::M2, "DefaultBrightnessContrast" }, { 0x0019, 0x004F, 0, VR::DS, VM::M2, "UserBrightnessContrast" }, { 0x0019, 0x0050, 0, VR::IS, VM::M1, "SourceSeriesNumber" }, { 0x0019, 0x0051, 0, VR::IS, VM::M1, "SourceImageNumber" }, { 0x0019, 0x0052, 0, VR::IS, VM::M1, "SourceFrameNumber" }, { 0x0019, 0x0053, 0, VR::UI, VM::M1, "SourceSeriesItemId" }, { 0x0019, 0x0054, 0, VR::UI, VM::M1, "SourceImageItemId" }, { 0x0019, 0x0055, 0, VR::UI, VM::M1, "SourceFrameItemId" }, { 0x0019, 0x0060, 0, VR::US, VM::M1, "NumberOfPointsBeforeAcquisition" }, { 0x0019, 0x0061, 0, VR::OW, VM::M1, "CurveDataBeforeAcquisition" }, { 0x0019, 0x0062, 0, VR::US, VM::M1, "NumberOfPointsTrigger" }, { 0x0019, 0x0063, 0, VR::OW, VM::M1, "CurveDataTrigger" }, { 0x0019, 0x0064, 0, VR::SH, VM::M1, "ECGSynchronization" }, { 0x0019, 0x0065, 0, VR::SH, VM::M1, "ECGDelayMode" }, { 0x0019, 0x0066, 0, VR::IS, VM::M1TN, "ECGDelayVector" }, { 0x0019, 0x0067, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x007A, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x007B, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x007C, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::DS, VM::M1, "ImageDose" }, { 0x0019, 0x0081, 0, VR::US, VM::M1, "CalibrationFrame" }, { 0x0019, 0x0082, 0, VR::CS, VM::M1, "CalibrationObject" }, { 0x0019, 0x0083, 0, VR::DS, VM::M1, "CalibrationObjectSize" }, { 0x0019, 0x0084, 0, VR::FL, VM::M1, "CalibrationFactor" }, { 0x0019, 0x0085, 0, VR::DA, VM::M1, "CalibrationDate" }, { 0x0019, 0x0086, 0, VR::TM, VM::M1, "CalibrationTime" }, { 0x0019, 0x0087, 0, VR::US, VM::M1, "CalibrationAccuracy" }, { 0x0019, 0x0088, 0, VR::CS, VM::M1, "CalibrationExtended" }, { 0x0019, 0x0089, 0, VR::US, VM::M1, "CalibrationImageOriginal" }, { 0x0019, 0x008A, 0, VR::US, VM::M1, "CalibrationFrameOriginal" }, { 0x0019, 0x008B, 0, VR::US, VM::M1, "CalibrationNbPointsUif" }, { 0x0019, 0x008C, 0, VR::US, VM::M1TN, "CalibrationPointsRow" }, { 0x0019, 0x008D, 0, VR::US, VM::M1TN, "CalibrationPointsColumn" }, { 0x0019, 0x008E, 0, VR::FL, VM::M1, "CalibrationMagnificationRatio" }, { 0x0019, 0x008F, 0, VR::LO, VM::M1, "CalibrationSoftwareVersion" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "ExtendedCalibrationSoftwareVersion" }, { 0x0019, 0x0091, 0, VR::IS, VM::M1, "CalibrationReturnCode" }, { 0x0019, 0x0092, 0, VR::DS, VM::M1, "DetectorRotationAngle" }, { 0x0019, 0x0093, 0, VR::CS, VM::M1, "SpatialChange" }, { 0x0019, 0x0094, 0, VR::CS, VM::M1, "InconsistentFlag" }, { 0x0019, 0x0095, 0, VR::CS, VM::M2, "HorizontalAndVerticalImageFlip" }, { 0x0019, 0x0096, 0, VR::CS, VM::M1, "InternalLabelImage" }, { 0x0019, 0x0097, 0, VR::DS, VM::M1TN, "Angle1Increment" }, { 0x0019, 0x0098, 0, VR::DS, VM::M1TN, "Angle2Increment" }, { 0x0019, 0x0099, 0, VR::DS, VM::M1TN, "Angle3Increment" }, { 0x0019, 0x009B, 0, VR::CS, VM::M1, "Grid" }, { 0x0019, 0x009C, 0, VR::FL, VM::M1, "DefaultMaskPixelShift" }, { 0x0019, 0x009D, 0, VR::CS, VM::M1, "ApplicableReviewMode" }, { 0x0019, 0x009E, 0, VR::DS, VM::M1TN, "LogLUTControlPoints" }, { 0x0019, 0x009F, 0, VR::DS, VM::M1TN, "ExpLUTSUBControlPoints" }, { 0x0019, 0x009a, 0, VR::DS, VM::M1TN, "SensorFeedback" }, { 0x0019, 0x00A0, 0, VR::DS, VM::M1, "ABDValue" }, { 0x0019, 0x00A1, 0, VR::DS, VM::M1, "SubtractionWindowCenter" }, { 0x0019, 0x00A2, 0, VR::DS, VM::M1, "SubtractionWindowWidth" }, { 0x0019, 0x00A3, 0, VR::DS, VM::M1, "ImageRotation" }, { 0x0019, 0x00A4, 0, VR::CS, VM::M1, "AutoInjectionEnabled" }, { 0x0019, 0x00A5, 0, VR::CS, VM::M1, "InjectionPhase" }, { 0x0019, 0x00A6, 0, VR::DS, VM::M1, "InjectionDelay" }, { 0x0019, 0x00A7, 0, VR::IS, VM::M1, "ReferenceInjectionFrameNumber" }, { 0x0019, 0x00A8, 0, VR::DS, VM::M1, "InjectionDuration" }, { 0x0019, 0x00A9, 0, VR::DS, VM::M1TN, "EPT" }, { 0x0019, 0x00AA, 0, VR::CS, VM::M1, "CanDownscan512" }, { 0x0019, 0x00AB, 0, VR::IS, VM::M1, "CurrentSpatialFilterStrength" }, { 0x0019, 0x00AC, 0, VR::DS, VM::M1, "BrightnessSensitivity" }, { 0x0019, 0x00AD, 0, VR::DS, VM::M1TN, "ExpLUTNOSUBControlPoints" }, { 0x0019, 0x00AF, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x00b0, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x00b1, 0, VR::LO, VM::M1, "AcquisitionModeDescription" }, { 0x0019, 0x00b2, 0, VR::LO, VM::M1, "AcquisitionModeDescriptionLabel" }, { 0x0019, 0x00b3, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00b8, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x00ba, 0, VR::CS, VM::M1, "AcquisitionRegion" }, { 0x0019, 0x00bb, 0, VR::CS, VM::M1, "AcquisitionSUBMode" }, { 0x0019, 0x00bc, 0, VR::FL, VM::M1, "TableCradleAngle" }, { 0x0019, 0x00bd, 0, VR::CS, VM::M1TN, "TableRotationStatusVector" }, { 0x0019, 0x00be, 0, VR::FL, VM::M1TN, "SourceToImageDistancePerFrameVector" }, { 0x0019, 0x00c2, 0, VR::DS, VM::M1TN, "" }, { 0x0019, 0x00c3, 0, VR::FL, VM::M1TN, "TableRotationAngleIncrement" }, { 0x0019, 0x00c4, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00c7, 0, VR::CS, VM::M1, "PatientPositionPerImage" }, { 0x0019, 0x00d7, 0, VR::FL, VM::M1TN, "TableXPositionToIsocenterIncrement" }, { 0x0019, 0x00d8, 0, VR::FL, VM::M1TN, "TableYPositionToIsocenterIncrement" }, { 0x0019, 0x00d9, 0, VR::FL, VM::M1TN, "TableZPositionToIsocenterIncrement" }, { 0x0019, 0x00da, 0, VR::FL, VM::M1TN, "TableHeadTiltAngleIncrement" }, { 0x0019, 0x00dc, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00dd, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00de, 0, VR::CS, VM::M1, "AcquisitionPlane" }, { 0x0019, 0x00e0, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x00e9, 0, VR::FL, VM::M1TN, "SourceToDetectorDistancePerFrameVector" }, { 0x0019, 0x00ea, 0, VR::FL, VM::M1, "TableRotationAngle" }, { 0x0019, 0x00eb, 0, VR::FL, VM::M1, "TableXPositionToIsocenter" }, { 0x0019, 0x00ec, 0, VR::FL, VM::M1, "TableYPositionToIsocenter" }, { 0x0019, 0x00ed, 0, VR::FL, VM::M1, "TableZPositionToIsocenter" }, { 0x0019, 0x00ee, 0, VR::FL, VM::M1, "TableHeadTiltAngle" }, { 0x0019, 0x00ef, 0, VR::FL, VM::M1, "" }, }; const unsigned short Dict189TagHashTable[] = { 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 231, 236, 241, 244, 127, 249, 254, 259, 264, 269, 274, 279, 284, 287, 290, 127, 293, 296, 301, 304, 307, 127, 310, 313, 316, 319, 322, 325, 328, 331, 334, 337, 340, 127, 343, 346, 349, 127, 352, 355, 360, 363, 366, 369, 372, 375, 127, 378, 381, 384, 387, 390, 127, 393, 396, 399, 402, 407, 412, 415, 418, 421, 426, 127, 127, 431, 434, 437, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 440, 443, 448, 127, 451, 454, 457, 460, 463, 468, 471, 474, 479, 482, 485, 0, 1, 45, 103, 1, 77, 155, 1, 82, 154, 1, 76, 153, 1, 75, 152, 1, 81, 159, 1, 80, 158, 1, 79, 157, 1, 78, 156, 1, 70, 147, 1, 69, 146, 1, 68, 145, 1, 67, 144, 1, 74, 151, 1, 73, 150, 1, 72, 149, 1, 71, 148, 1, 62, 139, 2, 0, 11, 61, 138, 1, 60, 137, 1, 59, 136, 1, 66, 143, 1, 65, 142, 1, 64, 141, 1, 63, 140, 1, 54, 131, 1, 53, 130, 1, 52, 129, 1, 51, 128, 1, 58, 135, 1, 57, 134, 1, 56, 133, 2, 11, 57, 55, 132, 2, 10, 56, 104, 187, 2, 13, 59, 103, 186, 1, 12, 58, 2, 14, 61, 102, 184, 2, 16, 63, 107, 190, 2, 15, 62, 106, 189, 2, 3, 49, 105, 188, 2, 2, 48, 101, 179, 2, 5, 51, 100, 178, 2, 4, 50, 99, 177, 2, 7, 53, 98, 176, 1, 6, 52, 1, 9, 55, 1, 8, 54, 1, 94, 171, 2, 1, 43, 93, 170, 1, 92, 169, 1, 91, 168, 1, 97, 175, 1, 96, 173, 1, 95, 172, 1, 86, 163, 1, 85, 162, 1, 84, 161, 1, 83, 160, 1, 90, 167, 1, 89, 166, 1, 88, 165, 1, 87, 164, 1, 115, 218, 1, 113, 216, 1, 114, 217, 1, 118, 222, 1, 116, 220, 2, 32, 80, 117, 221, 1, 33, 81, 1, 34, 82, 1, 35, 83, 1, 36, 84, 1, 37, 85, 1, 112, 215, 1, 25, 72, 1, 26, 73, 1, 27, 74, 1, 28, 75, 1, 29, 76, 1, 30, 78, 1, 31, 79, 1, 17, 64, 2, 18, 65, 108, 194, 2, 19, 66, 109, 195, 1, 20, 67, 1, 21, 68, 1, 22, 69, 2, 23, 70, 111, 199, 2, 24, 71, 110, 196, 1, 48, 122, 1, 49, 123, 1, 50, 124, 1, 46, 104, 2, 47, 105, 121, 234, 1, 122, 235, 1, 120, 233, 1, 125, 238, 1, 126, 239, 1, 123, 236, 2, 38, 96, 124, 237, 1, 39, 97, 1, 40, 98, 2, 41, 99, 119, 224, 1, 42, 100, 1, 43, 101, 1, 44, 102, }; const unsigned short Dict189KeyHashTable[] = { 128, 127, 131, 134, 139, 127, 127, 127, 142, 145, 127, 127, 127, 148, 155, 160, 165, 168, 127, 173, 176, 181, 127, 184, 127, 187, 190, 195, 200, 127, 203, 206, 127, 209, 212, 219, 226, 231, 234, 127, 237, 127, 240, 245, 127, 248, 127, 255, 127, 290, 295, 127, 127, 127, 127, 127, 298, 301, 127, 304, 127, 307, 312, 127, 315, 320, 323, 328, 331, 334, 337, 127, 342, 345, 348, 351, 354, 127, 127, 357, 362, 365, 127, 370, 373, 378, 381, 384, 127, 387, 127, 390, 127, 127, 393, 396, 127, 401, 127, 127, 127, 406, 409, 127, 127, 412, 417, 127, 420, 425, 127, 428, 433, 436, 127, 127, 127, 443, 446, 127, 449, 452, 127, 127, 127, 127, 457, 0, 1, 52, 22632, 1, 28, 34747, 2, 1, 4437, 16, 48037, 1, 109, 60635, 1, 90, 27485, 1, 53, 24773, 3, 17, 31145, 43, 30629, 107, 46273, 2, 32, 868, 89, 21079, 2, 6, 40977, 22, 13330, 1, 25, 26631, 2, 4, 58500, 23, 27838, 1, 34, 46473, 2, 5, 9622, 125, 13585, 1, 94, 56010, 1, 3, 48247, 1, 54, 63258, 2, 26, 41096, 57, 38334, 2, 19, 56790, 62, 22173, 1, 74, 45818, 1, 38, 57154, 1, 67, 18864, 1, 122, 50168, 3, 87, 22166, 106, 45870, 124, 50871, 3, 9, 51625, 31, 14616, 51, 38512, 2, 20, 34633, 95, 27227, 1, 64, 55021, 1, 85, 36891, 1, 24, 32645, 2, 63, 6088, 75, 55399, 1, 70, 38706, 3, 2, 60804, 91, 3711, 115, 5893, 17, 29, 42, 45, 42, 46, 42, 47, 42, 48, 42, 49, 42, 50, 42, 97, 42, 98, 42, 101, 42, 102, 42, 108, 42, 110, 42, 116, 42, 117, 42, 119, 42, 126, 42, 2, 77, 486, 81, 59266, 1, 42, 52588, 1, 76, 64980, 1, 27, 6758, 1, 72, 10481, 2, 61, 43696, 65, 37464, 1, 21, 30275, 2, 41, 36008, 113, 16945, 1, 86, 36169, 2, 14, 12628, 15, 26516, 1, 66, 58373, 1, 58, 10572, 1, 96, 63737, 2, 30, 51253, 114, 55606, 1, 111, 15983, 1, 44, 6675, 1, 112, 45884, 1, 93, 12575, 1, 36, 31607, 2, 40, 38171, 104, 48626, 1, 92, 15938, 2, 0, 63936, 13, 7380, 1, 121, 15471, 2, 79, 32651, 80, 59450, 1, 60, 26608, 1, 12, 63578, 1, 99, 57824, 1, 7, 33941, 1, 39, 36891, 1, 88, 2821, 2, 55, 58259, 68, 62359, 2, 59, 61315, 73, 25884, 1, 84, 16569, 1, 120, 14435, 2, 118, 20875, 123, 18783, 1, 35, 21453, 2, 69, 30134, 83, 36675, 1, 103, 53595, 2, 33, 11021, 37, 1522, 1, 82, 21356, 3, 18, 4188, 71, 44337, 105, 15186, 1, 8, 19200, 1, 56, 33739, 1, 100, 35521, 2, 10, 8739, 11, 61602, 1, 78, 46024, }; vtkDICOMDictionary::Dict Dict189Data = { "GEMS_DL_IMG_01", 127, 127, Dict189TagHashTable, Dict189KeyHashTable, Dict189Contents }; // ----- ESOFT_DICOM_ECAT_OWNERCODE ----- const DictEntry Dict190Contents[] = { { 0x0015, 0x0000, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict190TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict190KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict190Data = { "ESOFT_DICOM_ECAT_OWNERCODE", 1, 1, Dict190TagHashTable, Dict190KeyHashTable, Dict190Contents }; // ----- KINETDX_GRAPHICS ----- const DictEntry Dict191Contents[] = { { 0x0021, 0x00a4, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict191TagHashTable[] = { 2, 0, 1, 0, 164, }; const unsigned short Dict191KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict191Data = { "KINETDX_GRAPHICS", 1, 1, Dict191TagHashTable, Dict191KeyHashTable, Dict191Contents }; // ----- GEMS_SENOCRYSTAL_V1 ----- const DictEntry Dict192Contents[] = { { 0x0055, 0x0000, 0, VR::CS, VM::M1, "ClinicalView" }, { 0x0055, 0x0001, 0, VR::IS, VM::M1, "ExposureDose" }, { 0x0055, 0x0002, 0, VR::IS, VM::M1, "ImplantDisplacement" }, { 0x0055, 0x0003, 0, VR::IS, VM::M1, "PaddleType" }, { 0x0055, 0x0004, 0, VR::IS, VM::M1, "ProcessingType" }, { 0x0055, 0x0005, 0, VR::IS, VM::M1, "WindowingType" }, { 0x0055, 0x0006, 0, VR::IS, VM::M1, "Saturation" }, { 0x0055, 0x0007, 0, VR::IS, VM::M1, "Clip" }, }; const unsigned short Dict192TagHashTable[] = { 9, 12, 15, 18, 21, 24, 27, 30, 0, 1, 4, 4, 1, 5, 5, 1, 6, 6, 1, 7, 7, 1, 0, 0, 1, 1, 1, 1, 2, 2, 1, 3, 3, }; const unsigned short Dict192KeyHashTable[] = { 8, 9, 8, 12, 17, 20, 8, 25, 0, 1, 3, 15310, 2, 1, 30625, 2, 4578, 1, 4, 6684, 2, 5, 6183, 7, 29897, 2, 0, 34827, 6, 38989, }; vtkDICOMDictionary::Dict Dict192Data = { "GEMS_SENOCRYSTAL_V1", 8, 8, Dict192TagHashTable, Dict192KeyHashTable, Dict192Contents }; // ----- GEMS_PETD_01 ----- const DictEntry Dict193Contents[] = { { 0x0009, 0x0001, 0, VR::LO, VM::M2, "ImplementationVersionName" }, { 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientID" }, { 0x0009, 0x0003, 0, VR::SH, VM::M1, "PatientCompatibleVersion" }, { 0x0009, 0x0004, 0, VR::SH, VM::M1, "PatientSoftwareVersion" }, { 0x0009, 0x0005, 0, VR::DT, VM::M1, "PatientDateTime" }, { 0x0009, 0x0006, 0, VR::SL, VM::M1, "PatientType" }, { 0x0009, 0x0007, 0, VR::UI, VM::M1, "ExamID" }, { 0x0009, 0x0008, 0, VR::SH, VM::M1, "ExamCompatibleVersion" }, { 0x0009, 0x0009, 0, VR::SH, VM::M1, "ExamSoftwareVersion" }, { 0x0009, 0x000a, 0, VR::UI, VM::M1, "ScanID" }, { 0x0009, 0x000b, 0, VR::SH, VM::M1, "ScanCompatibleVersion" }, { 0x0009, 0x000c, 0, VR::SH, VM::M1, "ScanSoftwareVersion" }, { 0x0009, 0x000d, 0, VR::DT, VM::M1, "ScanDateTime" }, { 0x0009, 0x000e, 0, VR::DT, VM::M1, "ScanReady" }, { 0x0009, 0x000f, 0, VR::ST, VM::M1, "ScanDescription" }, { 0x0009, 0x0010, 0, VR::LO, VM::M1, "HospitalName" }, { 0x0009, 0x0011, 0, VR::LO, VM::M1, "ScannerDescription" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "Manufacturer" }, { 0x0009, 0x0013, 0, VR::UI, VM::M1, "FORIdentifier" }, { 0x0009, 0x0014, 0, VR::LO, VM::M1, "LandmarkName" }, { 0x0009, 0x0015, 0, VR::SH, VM::M1, "LandmarkAbbrev" }, { 0x0009, 0x0016, 0, VR::SL, VM::M1, "PatientPosition" }, { 0x0009, 0x0017, 0, VR::SL, VM::M1, "ScanPerspective" }, { 0x0009, 0x0018, 0, VR::SL, VM::M1, "ScanType" }, { 0x0009, 0x0019, 0, VR::SL, VM::M1, "ScanMode" }, { 0x0009, 0x001a, 0, VR::SL, VM::M1, "StartCondition" }, { 0x0009, 0x001b, 0, VR::SL, VM::M1, "StartConditionData" }, { 0x0009, 0x001c, 0, VR::SL, VM::M1, "SelStopCondition" }, { 0x0009, 0x001d, 0, VR::SL, VM::M1, "SelStopConditionData" }, { 0x0009, 0x001e, 0, VR::SL, VM::M1, "CollectDeadtime" }, { 0x0009, 0x001f, 0, VR::SL, VM::M1, "CollectSingles" }, { 0x0009, 0x0020, 0, VR::SL, VM::M1, "CollectCountRate" }, { 0x0009, 0x0021, 0, VR::SL, VM::M1, "CountRatePeriod" }, { 0x0009, 0x0022, 0, VR::SL, VM::M1, "DelayedEvents" }, { 0x0009, 0x0023, 0, VR::SL, VM::M1, "DelayedBias" }, { 0x0009, 0x0024, 0, VR::SL, VM::M1, "WordSize" }, { 0x0009, 0x0025, 0, VR::SL, VM::M1, "AxialAcceptance" }, { 0x0009, 0x0026, 0, VR::SL, VM::M1, "AxialAngle3D" }, { 0x0009, 0x0027, 0, VR::SL, VM::M1, "ThetaCompression" }, { 0x0009, 0x0028, 0, VR::SL, VM::M1, "AxialCompression" }, { 0x0009, 0x0029, 0, VR::FL, VM::M1, "GantryTiltAngle" }, { 0x0009, 0x002a, 0, VR::SL, VM::M1, "Collimation" }, { 0x0009, 0x002b, 0, VR::SL, VM::M1, "ScanFOV" }, { 0x0009, 0x002c, 0, VR::SL, VM::M1, "AxialFOV" }, { 0x0009, 0x002d, 0, VR::SL, VM::M1, "EventSeparation" }, { 0x0009, 0x002e, 0, VR::SL, VM::M1, "MaskWidth" }, { 0x0009, 0x002f, 0, VR::SL, VM::M1, "BinningMode" }, { 0x0009, 0x0030, 0, VR::SL, VM::M1, "TrigRejMethod" }, { 0x0009, 0x0031, 0, VR::SL, VM::M1, "NumberForReject" }, { 0x0009, 0x0032, 0, VR::SL, VM::M1, "LowerRejectLimit" }, { 0x0009, 0x0033, 0, VR::SL, VM::M1, "UpperRejectLimit" }, { 0x0009, 0x0034, 0, VR::SL, VM::M1, "TriggersAcquired" }, { 0x0009, 0x0035, 0, VR::SL, VM::M1, "TriggersRejected" }, { 0x0009, 0x0036, 0, VR::LO, VM::M1, "TracerName" }, { 0x0009, 0x0037, 0, VR::LO, VM::M1, "BatchDescription" }, { 0x0009, 0x0038, 0, VR::FL, VM::M1, "TracerActivity" }, { 0x0009, 0x0039, 0, VR::DT, VM::M1, "MeasuredDateTime" }, { 0x0009, 0x003a, 0, VR::FL, VM::M1, "PreInjVolume" }, { 0x0009, 0x003b, 0, VR::DT, VM::M1, "AdministeredDateTime" }, { 0x0009, 0x003c, 0, VR::FL, VM::M1, "PostInjectedActivity" }, { 0x0009, 0x003d, 0, VR::DT, VM::M1, "PostInjectedDateTime" }, { 0x0009, 0x003e, 0, VR::SH, VM::M1, "RadioNuclideName" }, { 0x0009, 0x003f, 0, VR::FL, VM::M1, "HalfLife" }, { 0x0009, 0x0040, 0, VR::FL, VM::M1, "PositronFraction" }, { 0x0009, 0x0041, 0, VR::SL, VM::M1, "Source1Holder" }, { 0x0009, 0x0042, 0, VR::FL, VM::M1, "Source1Activity" }, { 0x0009, 0x0043, 0, VR::DT, VM::M1, "Source1MeasDT" }, { 0x0009, 0x0044, 0, VR::SH, VM::M1, "Source1RadioNuclide" }, { 0x0009, 0x0045, 0, VR::FL, VM::M1, "Source1HalfLife" }, { 0x0009, 0x0046, 0, VR::SL, VM::M1, "Source2Holder" }, { 0x0009, 0x0047, 0, VR::FL, VM::M1, "Source2Activity" }, { 0x0009, 0x0048, 0, VR::DT, VM::M1, "Source2MeasDT" }, { 0x0009, 0x0049, 0, VR::SH, VM::M1, "Source2RadioNuclide" }, { 0x0009, 0x004a, 0, VR::FL, VM::M1, "Source2HalfLife" }, { 0x0009, 0x004b, 0, VR::SL, VM::M1, "SourceSpeed" }, { 0x0009, 0x004c, 0, VR::FL, VM::M1, "SourceLocation" }, { 0x0009, 0x004d, 0, VR::SL, VM::M1, "EmissionPresent" }, { 0x0009, 0x004e, 0, VR::SL, VM::M1, "LowerAxialAcc" }, { 0x0009, 0x004f, 0, VR::SL, VM::M1, "UpperAxialAcc" }, { 0x0009, 0x0050, 0, VR::SL, VM::M1, "LowerCoincLimit" }, { 0x0009, 0x0051, 0, VR::SL, VM::M1, "UpperCoincLimit" }, { 0x0009, 0x0052, 0, VR::SL, VM::M1, "CoincDelayOffset" }, { 0x0009, 0x0053, 0, VR::SL, VM::M1, "CoincOutputMode" }, { 0x0009, 0x0054, 0, VR::SL, VM::M1, "UpperEnergyLimit" }, { 0x0009, 0x0055, 0, VR::SL, VM::M1, "LowerEnergyLimit" }, { 0x0009, 0x0056, 0, VR::UI, VM::M1, "NormalCalID" }, { 0x0009, 0x0057, 0, VR::UI, VM::M1, "Normal2DCalID" }, { 0x0009, 0x0058, 0, VR::UI, VM::M1, "BlankCalID" }, { 0x0009, 0x0059, 0, VR::UI, VM::M1, "WCCalID" }, { 0x0009, 0x005a, 0, VR::SL, VM::M1, "Derived" }, { 0x0009, 0x005b, 0, VR::LO, VM::M1, "ContrastAgent" }, { 0x0009, 0x005c, 0, VR::UI, VM::M1, "frame_id" }, { 0x0009, 0x005d, 0, VR::UI, VM::M1, "scan_id" }, { 0x0009, 0x005e, 0, VR::UI, VM::M1, "exam_id" }, { 0x0009, 0x005f, 0, VR::LO, VM::M1, "patient_id" }, { 0x0009, 0x0060, 0, VR::SH, VM::M1, "compatible_version" }, { 0x0009, 0x0061, 0, VR::SH, VM::M1, "software_version" }, { 0x0009, 0x0062, 0, VR::ST, VM::M1, "where_is_frame" }, { 0x0009, 0x0063, 0, VR::SL, VM::M1, "frame_size" }, { 0x0009, 0x0064, 0, VR::SL, VM::M1, "file_exists" }, { 0x0009, 0x0065, 0, VR::SL, VM::M1, "patient_entry" }, { 0x0009, 0x0066, 0, VR::FL, VM::M1, "table_height" }, { 0x0009, 0x0067, 0, VR::FL, VM::M1, "table_z_position" }, { 0x0009, 0x0068, 0, VR::DT, VM::M1, "landmark_datetime" }, { 0x0009, 0x0069, 0, VR::SL, VM::M1, "slice_count" }, { 0x0009, 0x006a, 0, VR::FL, VM::M1, "start_location" }, { 0x0009, 0x006b, 0, VR::SL, VM::M1, "acq_delay" }, { 0x0009, 0x006c, 0, VR::DT, VM::M1, "acq_start" }, { 0x0009, 0x006d, 0, VR::SL, VM::M1, "acq_duration" }, { 0x0009, 0x006e, 0, VR::SL, VM::M1, "acq_bin_dur" }, { 0x0009, 0x006f, 0, VR::SL, VM::M1, "acq_bin_start" }, { 0x0009, 0x0070, 0, VR::SL, VM::M1, "actual_stop_cond" }, { 0x0009, 0x0071, 0, VR::FD, VM::M1, "total_prompts" }, { 0x0009, 0x0072, 0, VR::FD, VM::M1, "total_delays" }, { 0x0009, 0x0073, 0, VR::SL, VM::M1, "frame_valid" }, { 0x0009, 0x0074, 0, VR::SL, VM::M1, "validity_info" }, { 0x0009, 0x0075, 0, VR::SL, VM::M1, "archived" }, { 0x0009, 0x0076, 0, VR::SL, VM::M1, "compression" }, { 0x0009, 0x0077, 0, VR::SL, VM::M1, "uncompressed_size" }, { 0x0009, 0x0078, 0, VR::SL, VM::M1, "accum_bin_dur" }, { 0x0009, 0x0079, 0, VR::SH, VM::M1, "ImageSetCompatibleVersion" }, { 0x0009, 0x007a, 0, VR::SH, VM::M1, "ImageSetSoftwareVersion" }, { 0x0009, 0x007b, 0, VR::DT, VM::M1, "ImageSetDateTime" }, { 0x0009, 0x007c, 0, VR::SL, VM::M1, "ImageSetSource" }, { 0x0009, 0x007d, 0, VR::SL, VM::M1, "ImageSetContents" }, { 0x0009, 0x007e, 0, VR::SL, VM::M1, "ImageSetType" }, { 0x0009, 0x007f, 0, VR::DS, VM::M1, "ImageSetReference" }, { 0x0009, 0x0080, 0, VR::SL, VM::M1, "MultiPatient" }, { 0x0009, 0x0081, 0, VR::SL, VM::M1, "NumberOfNormals" }, { 0x0009, 0x0082, 0, VR::UI, VM::M1, "ColorMapID" }, { 0x0009, 0x0083, 0, VR::SL, VM::M1, "WindowLevelType" }, { 0x0009, 0x0084, 0, VR::FL, VM::M1, "Rotate" }, { 0x0009, 0x0085, 0, VR::SL, VM::M1, "Flip" }, { 0x0009, 0x0086, 0, VR::FL, VM::M1, "Zoom" }, { 0x0009, 0x0087, 0, VR::SL, VM::M1, "PanX" }, { 0x0009, 0x0088, 0, VR::SL, VM::M1, "PanY" }, { 0x0009, 0x0089, 0, VR::FL, VM::M1, "WindowLevelMin" }, { 0x0009, 0x008a, 0, VR::FL, VM::M1, "WindowLevelMax" }, { 0x0009, 0x008b, 0, VR::SL, VM::M1, "ReconMethod" }, { 0x0009, 0x008c, 0, VR::SL, VM::M1, "Attenuation" }, { 0x0009, 0x008d, 0, VR::FL, VM::M1, "AttenuationCoefficient" }, { 0x0009, 0x008e, 0, VR::SL, VM::M1, "BPFilter" }, { 0x0009, 0x008f, 0, VR::FL, VM::M1, "BPFilterCutoff" }, { 0x0009, 0x0090, 0, VR::SL, VM::M1, "BPFilterOrder" }, { 0x0009, 0x0091, 0, VR::FL, VM::M1, "BPFilterCenterI" }, { 0x0009, 0x0092, 0, VR::FL, VM::M1, "BPFilterCenterP" }, { 0x0009, 0x0093, 0, VR::SL, VM::M1, "AttenSmooth" }, { 0x0009, 0x0094, 0, VR::SL, VM::M1, "AttenSmoothParam" }, { 0x0009, 0x0095, 0, VR::SL, VM::M1, "AngleSmoothParam" }, { 0x0009, 0x0096, 0, VR::UI, VM::M1, "WellCounterCalID" }, { 0x0009, 0x0097, 0, VR::UI, VM::M1, "TransScanID" }, { 0x0009, 0x0098, 0, VR::UI, VM::M1, "NormCalID" }, { 0x0009, 0x0099, 0, VR::UI, VM::M1, "BlnkCalID" }, { 0x0009, 0x009a, 0, VR::FL, VM::M1, "CACEdgeThreshold" }, { 0x0009, 0x009b, 0, VR::FL, VM::M1, "CACSkullOffset" }, { 0x0009, 0x009c, 0, VR::UI, VM::M1, "EmissSubID" }, { 0x0009, 0x009d, 0, VR::SS, VM::M1, "RadialFilter3D" }, { 0x0009, 0x009e, 0, VR::FL, VM::M1, "RadialCutoff3D" }, { 0x0009, 0x009f, 0, VR::SL, VM::M1, "AxialFilter3D" }, { 0x0009, 0x00a0, 0, VR::FL, VM::M1, "AxialCutoff3D" }, { 0x0009, 0x00a1, 0, VR::FL, VM::M1, "AxialStart" }, { 0x0009, 0x00a2, 0, VR::FL, VM::M1, "AxialSpacing" }, { 0x0009, 0x00a3, 0, VR::SL, VM::M1, "AxialAnglesUsed" }, { 0x0009, 0x00a4, 0, VR::SH, VM::M1, "compatible_version" }, { 0x0009, 0x00a5, 0, VR::SH, VM::M1, "software_version" }, { 0x0009, 0x00a6, 0, VR::SL, VM::M1, "slice_number" }, { 0x0009, 0x00a7, 0, VR::FL, VM::M1, "total_counts" }, { 0x0009, 0x00a8, 0, VR::OB, VM::M1, "other_atts" }, { 0x0009, 0x00a9, 0, VR::SL, VM::M1, "other_atts_size" }, { 0x0009, 0x00aa, 0, VR::SL, VM::M1, "archived" }, { 0x0009, 0x00ab, 0, VR::FL, VM::M1, "bp_center_x" }, { 0x0009, 0x00ac, 0, VR::FL, VM::M1, "bp_center_y" }, { 0x0009, 0x00ad, 0, VR::UI, VM::M1, "trans_frame_id" }, { 0x0009, 0x00ae, 0, VR::UI, VM::M1, "tpluse_frame_id" }, { 0x0009, 0x00b1, 0, VR::FL, VM::M1, "profile_spacing" }, { 0x0009, 0x00b2, 0, VR::SS, VM::M1, "IRNumIterations" }, { 0x0009, 0x00b3, 0, VR::SS, VM::M1, "IRNumSubsets" }, { 0x0009, 0x00b4, 0, VR::FL, VM::M1, "IRReconFOV" }, { 0x0009, 0x00b5, 0, VR::SS, VM::M1, "IRCorrModel" }, { 0x0009, 0x00b6, 0, VR::SS, VM::M1, "IRLoopFilter" }, { 0x0009, 0x00b7, 0, VR::FL, VM::M1, "IRPreFiltParam" }, { 0x0009, 0x00b8, 0, VR::FL, VM::M1, "IRLoopFiltParam" }, { 0x0009, 0x00b9, 0, VR::FL, VM::M1, "ResponseFiltParam" }, { 0x0009, 0x00ba, 0, VR::SS, VM::M1, "PostFilter" }, { 0x0009, 0x00bb, 0, VR::FL, VM::M1, "PostFilterParam" }, { 0x0009, 0x00bc, 0, VR::SS, VM::M1, "IRRegularize" }, { 0x0009, 0x00bd, 0, VR::FL, VM::M1, "IRRegularizeParam" }, { 0x0009, 0x00be, 0, VR::SS, VM::M1, "ACBPFilter" }, { 0x0009, 0x00bf, 0, VR::FL, VM::M1, "ACBPFiltCutoff" }, { 0x0009, 0x00c0, 0, VR::SL, VM::M1, "ACBPFiltOrder" }, { 0x0009, 0x00c1, 0, VR::SS, VM::M1, "ACImgSmooth" }, { 0x0009, 0x00c2, 0, VR::FL, VM::M1, "ACImgSmoothParm" }, { 0x0009, 0x00c3, 0, VR::SL, VM::M1, "ScatterMethod" }, { 0x0009, 0x00c4, 0, VR::SS, VM::M1, "ScatterNumIter" }, { 0x0009, 0x00c5, 0, VR::FL, VM::M1, "ScatterParm" }, { 0x0009, 0x00c6, 0, VR::FL, VM::M1, "seg_qc_parm" }, { 0x0009, 0x00c7, 0, VR::SL, VM::M1, "overlap" }, { 0x0009, 0x00c8, 0, VR::UI, VM::M1, "ovlp_frm_id" }, { 0x0009, 0x00c9, 0, VR::UI, VM::M1, "ovlp_trans_frm_id" }, { 0x0009, 0x00ca, 0, VR::UI, VM::M1, "ovlp_tpulse_frm_id" }, { 0x0009, 0x00cb, 0, VR::FL, VM::M1, "vqc_x_axis_trans" }, { 0x0009, 0x00cc, 0, VR::FL, VM::M1, "vqc_x_axis_tilt" }, { 0x0009, 0x00cd, 0, VR::FL, VM::M1, "vqc_y_axis_trans" }, { 0x0009, 0x00ce, 0, VR::FL, VM::M1, "vqc_y_axis_swivel" }, { 0x0009, 0x00cf, 0, VR::FL, VM::M1, "vqc_z_axis_trans" }, { 0x0009, 0x00d0, 0, VR::FL, VM::M1, "vqc_z_axis_roll" }, { 0x0009, 0x00d1, 0, VR::LO, VM::M1, "ctac_conv_scale" }, { 0x0009, 0x00d2, 0, VR::UI, VM::M1, "image_set_id" }, { 0x0009, 0x00d3, 0, VR::SL, VM::M1, "contrast_route" }, { 0x0009, 0x00d4, 0, VR::LO, VM::M1, "ctac_conv_scale" }, { 0x0009, 0x00d5, 0, VR::FL, VM::M1, "loop_filter_parm" }, { 0x0009, 0x00d6, 0, VR::FL, VM::M1, "image_one_loc" }, { 0x0009, 0x00d7, 0, VR::FL, VM::M1, "image_index_loc" }, { 0x0009, 0x00d8, 0, VR::SL, VM::M1, "frame_number" }, { 0x0009, 0x00d9, 0, VR::SL, VM::M1, "list_file_exists" }, { 0x0009, 0x00da, 0, VR::ST, VM::M1, "where_is_list_frame" }, { 0x0009, 0x00db, 0, VR::SL, VM::M1, "ir_z_filter_flag" }, { 0x0009, 0x00dc, 0, VR::FL, VM::M1, "ir_z_filter_ratio" }, { 0x0009, 0x00dd, 0, VR::US, VM::M1, "num_of_rr_interval" }, { 0x0009, 0x00de, 0, VR::US, VM::M1, "num_of_time_slots" }, { 0x0009, 0x00df, 0, VR::US, VM::M1, "num_of_slices" }, { 0x0009, 0x00e0, 0, VR::US, VM::M1, "num_of_time_slices" }, { 0x0009, 0x00e1, 0, VR::SL, VM::M1, "unlisted_scan" }, { 0x0009, 0x00e2, 0, VR::SL, VM::M1, "rest_stress" }, { 0x0009, 0x00e3, 0, VR::FL, VM::M1, "phase_percentage" }, { 0x0009, 0x00e4, 0, VR::ST, VM::M1, "" }, { 0x0009, 0x00e5, 0, VR::FL, VM::M1, "left_shift" }, { 0x0009, 0x00e6, 0, VR::FL, VM::M1, "posterior_shift" }, { 0x0009, 0x00e7, 0, VR::FL, VM::M1, "superior_shift" }, { 0x0009, 0x00e8, 0, VR::SL, VM::M1, "acq_bin_num" }, { 0x0009, 0x00e9, 0, VR::FL, VM::M1, "acq_bin_dur_percent" }, { 0x0009, 0x00ea, 0, VR::SL, VM::M1, "" }, { 0x0009, 0x00eb, 0, VR::FL, VM::M1, "" }, { 0x0009, 0x00ec, 0, VR::SL, VM::M1, "" }, { 0x0011, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x0011, 0x0018, 0, VR::OB, VM::M1, "" }, { 0x0013, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x0017, 0x0001, 0, VR::UI, VM::M1, "correction_cal_id" }, { 0x0017, 0x0002, 0, VR::SH, VM::M1, "compatible_version" }, { 0x0017, 0x0003, 0, VR::SH, VM::M1, "software_version" }, { 0x0017, 0x0004, 0, VR::DT, VM::M1, "cal_datetime" }, { 0x0017, 0x0005, 0, VR::LO, VM::M1, "cal_description" }, { 0x0017, 0x0006, 0, VR::SL, VM::M1, "cal_type" }, { 0x0017, 0x0007, 0, VR::ST, VM::M1, "where_is_corr" }, { 0x0017, 0x0008, 0, VR::SL, VM::M1, "corr_file_size" }, { 0x0017, 0x0009, 0, VR::LO, VM::M1, "scan_id" }, { 0x0017, 0x000a, 0, VR::DT, VM::M1, "scan_datetime" }, { 0x0017, 0x000b, 0, VR::LO, VM::M1, "norm_2d_cal_id" }, { 0x0017, 0x000c, 0, VR::SH, VM::M1, "hosp_identifier" }, { 0x0017, 0x000d, 0, VR::SL, VM::M1, "archived" }, { 0x0019, 0x0001, 0, VR::UI, VM::M1, "wc_cal_id" }, { 0x0019, 0x0002, 0, VR::SH, VM::M1, "compatible_version" }, { 0x0019, 0x0003, 0, VR::SH, VM::M1, "software_version" }, { 0x0019, 0x0004, 0, VR::DT, VM::M1, "cal_datetime" }, { 0x0019, 0x0005, 0, VR::SL, VM::M1, "cal_type" }, { 0x0019, 0x0006, 0, VR::LO, VM::M1, "cal_description" }, { 0x0019, 0x0007, 0, VR::LO, VM::M1, "cal_hardware" }, { 0x0019, 0x0008, 0, VR::OB, VM::M1, "coefficients" }, { 0x0019, 0x0009, 0, VR::FL, VM::M1, "activity_factor_hr" }, { 0x0019, 0x000a, 0, VR::FL, VM::M1, "activity_factor_hs" }, { 0x0019, 0x000b, 0, VR::FL, VM::M1, "activity_factor_3d" }, { 0x0019, 0x000c, 0, VR::LO, VM::M1, "scan_id" }, { 0x0019, 0x000d, 0, VR::DT, VM::M1, "scan_datetime" }, { 0x0019, 0x000e, 0, VR::SH, VM::M1, "hosp_identifier" }, { 0x0019, 0x000f, 0, VR::FL, VM::M1, "meas_activity" }, { 0x0019, 0x0010, 0, VR::DT, VM::M1, "meas_datetime" }, { 0x0019, 0x0011, 0, VR::SL, VM::M1, "axial_filter_3d" }, { 0x0019, 0x0012, 0, VR::FL, VM::M1, "axial_cutoff_3d" }, { 0x0019, 0x0013, 0, VR::SL, VM::M1, "default_flag" }, { 0x0019, 0x0014, 0, VR::SL, VM::M1, "archived" }, { 0x0019, 0x0015, 0, VR::SL, VM::M1, "wc_cal_rec_method" }, { 0x0019, 0x0016, 0, VR::SL, VM::M1, "activity_factor_2d" }, { 0x0019, 0x0017, 0, VR::SL, VM::M1, "isotope" }, { 0x0021, 0x0001, 0, VR::US, VM::M1, "raw_data_type" }, { 0x0021, 0x0002, 0, VR::UL, VM::M1, "raw_data_size" }, { 0x0023, 0x0001, 0, VR::OB, VM::M1, "raw_data_blob" }, { 0x5001, 0x0001, 0, VR::UI, VM::M1, "CurveID" }, { 0x5001, 0x0002, 0, VR::SH, VM::M1, "CurveCompatibleVersion" }, { 0x5001, 0x0003, 0, VR::SH, VM::M1, "CurveSoftwareVersion" }, { 0x5001, 0x0004, 0, VR::SL, VM::M1, "StatisticsType" }, { 0x5001, 0x0005, 0, VR::LT, VM::M1, "HowDerived" }, { 0x5001, 0x0006, 0, VR::SL, VM::M1, "HowDerivedSize" }, { 0x5001, 0x0007, 0, VR::SL, VM::M1, "MultiPatient" }, { 0x5001, 0x0008, 0, VR::SL, VM::M1, "Deadtime" }, { 0x5003, 0x0001, 0, VR::SQ, VM::M1, "GraphSequence" }, { 0x5003, 0x0002, 0, VR::UI, VM::M1, "GraphID" }, { 0x5003, 0x0003, 0, VR::SH, VM::M1, "GraphCompatibleVersion" }, { 0x5003, 0x0004, 0, VR::SH, VM::M1, "GraphSoftwareVersion" }, { 0x5003, 0x0005, 0, VR::LO, VM::M1, "Title" }, { 0x5003, 0x0006, 0, VR::DT, VM::M1, "GraphDateTime" }, { 0x5003, 0x0007, 0, VR::ST, VM::M1, "GraphDescription" }, { 0x5003, 0x0008, 0, VR::LO, VM::M1, "TitleFontName" }, { 0x5003, 0x0009, 0, VR::SH, VM::M1, "TitleFontSize" }, { 0x5003, 0x000a, 0, VR::LO, VM::M1, "Footer" }, { 0x5003, 0x000b, 0, VR::SH, VM::M1, "FooterFontSize" }, { 0x5003, 0x000c, 0, VR::LO, VM::M1, "ForegroundColor" }, { 0x5003, 0x000d, 0, VR::LO, VM::M1, "BackgroundColor" }, { 0x5003, 0x000e, 0, VR::SL, VM::M1, "GraphBorder" }, { 0x5003, 0x000f, 0, VR::SL, VM::M1, "GraphWidth" }, { 0x5003, 0x0010, 0, VR::SL, VM::M1, "GraphHeight" }, { 0x5003, 0x0011, 0, VR::SL, VM::M1, "Grid" }, { 0x5003, 0x0012, 0, VR::LO, VM::M1, "LabelFontName" }, { 0x5003, 0x0013, 0, VR::SH, VM::M1, "LabelFontSize" }, { 0x5003, 0x0014, 0, VR::LO, VM::M1, "AxesColor" }, { 0x5003, 0x0015, 0, VR::LO, VM::M1, "XAxisLabel" }, { 0x5003, 0x0016, 0, VR::SL, VM::M1, "XAxisUnits" }, { 0x5003, 0x0017, 0, VR::FL, VM::M1, "XMajorTics" }, { 0x5003, 0x0018, 0, VR::FL, VM::M1, "XAxisMin" }, { 0x5003, 0x0019, 0, VR::FL, VM::M1, "XAxisMax" }, { 0x5003, 0x001a, 0, VR::LO, VM::M1, "YAxisLabel" }, { 0x5003, 0x001b, 0, VR::SL, VM::M1, "YAxisUnits" }, { 0x5003, 0x001c, 0, VR::FL, VM::M1, "YMajorTics" }, { 0x5003, 0x001d, 0, VR::FL, VM::M1, "YAxisMin" }, { 0x5003, 0x001e, 0, VR::FL, VM::M1, "YAxisMax" }, { 0x5003, 0x001f, 0, VR::LO, VM::M1, "LegendFontName" }, { 0x5003, 0x0020, 0, VR::SH, VM::M1, "LegendFontSize" }, { 0x5003, 0x0021, 0, VR::SL, VM::M1, "LegendLocationX" }, { 0x5003, 0x0022, 0, VR::SL, VM::M1, "LegendLocationY" }, { 0x5003, 0x0023, 0, VR::SL, VM::M1, "LegendWidth" }, { 0x5003, 0x0024, 0, VR::SL, VM::M1, "LegendHeight" }, { 0x5003, 0x0025, 0, VR::SL, VM::M1, "LegendBorder" }, { 0x5003, 0x0026, 0, VR::SL, VM::M1, "MultiPatient" }, { 0x5005, 0x0001, 0, VR::SQ, VM::M1, "CurvePresentationSequence" }, { 0x5005, 0x0002, 0, VR::UI, VM::M1, "CurvePresentationID" }, { 0x5005, 0x0003, 0, VR::UI, VM::M1, "GraphID" }, { 0x5005, 0x0004, 0, VR::UI, VM::M1, "CurveID" }, { 0x5005, 0x0005, 0, VR::SH, VM::M1, "CurvePresentationCompatibleVersion" }, { 0x5005, 0x0006, 0, VR::SH, VM::M1, "CurvePresentationSoftwareVersion" }, { 0x5005, 0x0007, 0, VR::LO, VM::M1, "CurveLabel" }, { 0x5005, 0x0008, 0, VR::LO, VM::M1, "Color" }, { 0x5005, 0x0009, 0, VR::SL, VM::M1, "LineType" }, { 0x5005, 0x000a, 0, VR::SL, VM::M1, "LineWidth" }, { 0x5005, 0x000b, 0, VR::SL, VM::M1, "PointSymbol" }, { 0x5005, 0x000c, 0, VR::SL, VM::M1, "PointSymbolDim" }, { 0x5005, 0x000d, 0, VR::LO, VM::M1, "PointColor" }, }; const unsigned short Dict193TagHashTable[] = { 336, 339, 342, 345, 348, 351, 354, 357, 360, 365, 370, 375, 380, 385, 390, 395, 400, 409, 416, 425, 432, 439, 446, 453, 458, 463, 466, 473, 480, 487, 494, 507, 518, 529, 536, 547, 556, 565, 574, 581, 590, 595, 600, 607, 614, 621, 628, 633, 638, 643, 648, 653, 658, 663, 668, 673, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 731, 736, 741, 746, 749, 752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, 875, 878, 881, 884, 887, 890, 893, 896, 899, 902, 905, 908, 911, 914, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 947, 950, 953, 956, 959, 962, 965, 968, 971, 974, 977, 980, 983, 986, 989, 992, 995, 998, 1001, 1004, 1007, 1010, 1013, 1016, 1019, 1022, 1025, 335, 1028, 1031, 1034, 1037, 1040, 1043, 1046, 1049, 1052, 1055, 1058, 1061, 1064, 1067, 1070, 1073, 1076, 1079, 1082, 1085, 1088, 1091, 335, 1094, 1097, 1100, 1103, 1106, 1109, 1112, 1115, 1118, 1121, 1124, 1127, 1130, 1133, 1136, 1139, 1142, 1145, 1148, 1151, 1154, 1157, 1160, 1163, 1166, 1169, 1172, 1175, 1178, 1181, 1184, 1187, 1190, 1193, 1196, 1199, 1202, 1205, 1208, 1211, 335, 335, 1214, 335, 1217, 1220, 1223, 1226, 1229, 1232, 1235, 1238, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 0, 1, 8, 9, 1, 7, 8, 1, 10, 11, 1, 9, 10, 1, 12, 13, 1, 11, 12, 1, 14, 15, 1, 13, 14, 2, 0, 1, 266, 17, 2, 235, 24, 265, 16, 2, 2, 3, 268, 19, 2, 1, 2, 267, 18, 2, 4, 5, 270, 21, 2, 3, 4, 269, 20, 2, 6, 7, 272, 23, 2, 5, 6, 271, 22, 4, 24, 25, 234, 1, 243, 7, 258, 9, 3, 23, 24, 242, 6, 257, 8, 4, 26, 27, 236, 1, 241, 5, 260, 11, 3, 25, 26, 240, 4, 259, 10, 3, 28, 29, 239, 3, 262, 13, 3, 27, 28, 238, 2, 261, 12, 3, 30, 31, 237, 1, 264, 15, 2, 29, 30, 263, 14, 2, 16, 17, 250, 1, 1, 15, 16, 3, 18, 19, 249, 13, 252, 3, 3, 17, 18, 248, 12, 251, 2, 3, 20, 21, 247, 11, 254, 5, 3, 19, 20, 246, 10, 253, 4, 6, 22, 23, 245, 9, 256, 7, 276, 1, 286, 3, 326, 5, 5, 21, 22, 244, 8, 255, 6, 285, 2, 325, 4, 5, 40, 41, 273, 1, 278, 3, 284, 1, 328, 7, 3, 39, 40, 277, 2, 327, 6, 5, 42, 43, 275, 1, 280, 5, 290, 7, 322, 1, 4, 41, 42, 274, 2, 279, 4, 289, 6, 4, 44, 45, 282, 7, 288, 5, 324, 3, 4, 43, 44, 281, 6, 287, 4, 323, 2, 3, 46, 47, 294, 11, 334, 13, 4, 45, 46, 283, 8, 293, 10, 333, 12, 2, 32, 33, 292, 9, 2, 31, 32, 291, 8, 3, 34, 35, 298, 15, 330, 9, 3, 33, 34, 297, 14, 329, 8, 3, 36, 37, 296, 13, 332, 11, 3, 35, 36, 295, 12, 331, 10, 2, 38, 39, 302, 19, 2, 37, 38, 301, 18, 2, 56, 57, 300, 17, 2, 55, 56, 299, 16, 2, 58, 59, 306, 23, 2, 57, 58, 305, 22, 2, 60, 61, 304, 21, 2, 59, 60, 303, 20, 2, 62, 63, 310, 27, 2, 61, 62, 309, 26, 2, 48, 49, 308, 25, 2, 47, 48, 307, 24, 2, 50, 51, 314, 31, 2, 49, 50, 313, 30, 2, 52, 53, 312, 29, 2, 51, 52, 311, 28, 2, 54, 55, 318, 35, 2, 53, 54, 317, 34, 2, 71, 72, 316, 33, 2, 72, 73, 315, 32, 1, 73, 74, 2, 74, 75, 321, 38, 2, 75, 76, 320, 37, 2, 76, 77, 319, 36, 1, 77, 78, 1, 78, 79, 1, 63, 64, 1, 64, 65, 1, 65, 66, 1, 66, 67, 1, 67, 68, 1, 68, 69, 1, 69, 70, 1, 70, 71, 1, 87, 88, 1, 88, 89, 1, 89, 90, 1, 90, 91, 1, 91, 92, 1, 92, 93, 1, 93, 94, 1, 94, 95, 1, 79, 80, 1, 80, 81, 1, 81, 82, 1, 82, 83, 1, 83, 84, 1, 84, 85, 1, 85, 86, 1, 86, 87, 1, 103, 104, 1, 104, 105, 1, 105, 106, 1, 106, 107, 1, 107, 108, 1, 108, 109, 1, 109, 110, 1, 110, 111, 1, 95, 96, 1, 96, 97, 1, 97, 98, 1, 98, 99, 1, 99, 100, 1, 100, 101, 1, 101, 102, 1, 102, 103, 1, 119, 120, 1, 120, 121, 1, 121, 122, 1, 122, 123, 1, 123, 124, 1, 124, 125, 1, 125, 126, 1, 126, 127, 1, 111, 112, 1, 112, 113, 1, 113, 114, 1, 114, 115, 1, 115, 116, 1, 116, 117, 1, 117, 118, 1, 118, 119, 1, 138, 139, 1, 137, 138, 1, 136, 137, 1, 135, 136, 1, 142, 143, 1, 141, 142, 1, 140, 141, 1, 139, 140, 1, 130, 131, 1, 129, 130, 1, 128, 129, 1, 127, 128, 1, 134, 135, 1, 133, 134, 1, 132, 133, 1, 131, 132, 1, 154, 155, 1, 153, 154, 1, 152, 153, 1, 151, 152, 1, 158, 159, 1, 157, 158, 1, 156, 157, 1, 155, 156, 1, 146, 147, 1, 145, 146, 1, 144, 145, 1, 143, 144, 1, 150, 151, 1, 149, 150, 1, 148, 149, 1, 147, 148, 1, 170, 171, 1, 169, 170, 1, 168, 169, 1, 167, 168, 1, 173, 174, 1, 172, 173, 1, 171, 172, 1, 162, 163, 1, 161, 162, 1, 160, 161, 1, 159, 160, 1, 166, 167, 1, 165, 166, 1, 164, 165, 1, 163, 164, 1, 184, 187, 1, 183, 186, 1, 182, 185, 1, 181, 184, 1, 188, 191, 1, 187, 190, 1, 186, 189, 1, 185, 188, 1, 176, 179, 1, 175, 178, 1, 174, 177, 1, 180, 183, 1, 179, 182, 1, 178, 181, 1, 177, 180, 1, 199, 202, 1, 200, 203, 1, 197, 200, 1, 198, 201, 1, 203, 206, 1, 204, 207, 1, 201, 204, 1, 202, 205, 1, 191, 194, 1, 192, 195, 1, 189, 192, 1, 190, 193, 1, 195, 198, 1, 196, 199, 1, 193, 196, 1, 194, 197, 1, 215, 218, 1, 216, 219, 1, 213, 216, 1, 214, 217, 1, 219, 222, 1, 220, 223, 1, 217, 220, 1, 218, 221, 1, 207, 210, 1, 208, 211, 1, 205, 208, 1, 206, 209, 1, 211, 214, 1, 212, 215, 1, 209, 212, 1, 210, 213, 1, 231, 234, 1, 232, 235, 1, 229, 232, 1, 230, 233, 1, 233, 236, 1, 223, 226, 1, 224, 227, 1, 221, 224, 1, 222, 225, 1, 227, 230, 1, 228, 231, 1, 225, 228, 1, 226, 229, }; const unsigned short Dict193KeyHashTable[] = { 336, 341, 344, 347, 335, 335, 352, 355, 360, 363, 376, 335, 335, 335, 379, 386, 391, 335, 335, 335, 394, 399, 335, 414, 417, 335, 335, 420, 423, 426, 429, 432, 335, 437, 442, 445, 448, 451, 335, 335, 456, 459, 335, 335, 335, 335, 335, 466, 469, 476, 479, 482, 335, 485, 488, 491, 494, 499, 335, 335, 335, 335, 502, 335, 335, 335, 507, 510, 517, 335, 522, 527, 530, 335, 533, 335, 538, 541, 335, 335, 335, 335, 335, 544, 547, 550, 553, 558, 565, 335, 570, 575, 580, 583, 592, 595, 598, 603, 335, 606, 609, 612, 335, 615, 620, 623, 335, 335, 630, 633, 636, 335, 639, 335, 335, 644, 335, 335, 335, 647, 654, 335, 659, 664, 673, 676, 335, 335, 679, 682, 335, 687, 692, 335, 695, 335, 335, 700, 335, 335, 703, 710, 335, 717, 335, 722, 335, 335, 725, 728, 731, 335, 734, 335, 335, 335, 739, 742, 335, 745, 748, 751, 335, 758, 335, 335, 335, 761, 335, 768, 773, 778, 335, 785, 788, 793, 335, 796, 799, 806, 809, 816, 825, 830, 833, 836, 335, 839, 850, 335, 853, 856, 861, 864, 335, 335, 335, 867, 870, 873, 876, 335, 879, 335, 335, 884, 887, 894, 901, 906, 909, 335, 914, 335, 919, 924, 335, 335, 335, 335, 335, 335, 335, 335, 929, 932, 935, 938, 941, 335, 944, 947, 335, 335, 950, 955, 960, 335, 963, 966, 969, 335, 335, 972, 979, 982, 989, 992, 997, 1000, 335, 1003, 1008, 1011, 335, 1016, 1019, 335, 1022, 335, 335, 1025, 335, 1028, 335, 1031, 335, 1034, 335, 1037, 1040, 1043, 1048, 335, 1051, 335, 1056, 1059, 1062, 1065, 1068, 335, 335, 1071, 1074, 335, 1077, 335, 1082, 335, 1085, 1088, 1091, 1096, 335, 1099, 1104, 335, 1109, 1120, 1125, 1128, 1131, 1134, 1137, 1140, 335, 1145, 1148, 335, 335, 335, 1151, 335, 335, 1154, 1157, 1162, 335, 1167, 1170, 1173, 1182, 1185, 1190, 1195, 1200, 335, 335, 1203, 1206, 335, 1209, 335, 1212, 0, 2, 93, 62468, 281, 51583, 1, 290, 52262, 1, 71, 53788, 2, 204, 38912, 331, 20182, 1, 182, 29970, 2, 143, 27982, 186, 19996, 1, 62, 42952, 6, 116, 47198, 169, 47198, 249, 47198, 269, 47198, 280, 62467, 291, 41130, 1, 68, 49288, 3, 8, 36509, 130, 37127, 184, 25068, 2, 101, 7050, 223, 25, 1, 38, 42355, 2, 55, 7569, 229, 52995, 7, 225, 16, 231, 16, 232, 16, 233, 16, 234, 16, 235, 16, 236, 16, 1, 174, 37325, 1, 160, 16118, 1, 30, 45323, 1, 195, 30838, 1, 212, 20209, 1, 310, 54040, 2, 149, 4473, 230, 43235, 2, 177, 59759, 320, 65439, 1, 197, 14892, 1, 183, 1906, 1, 63, 5627, 2, 248, 2564, 263, 2564, 1, 188, 50183, 3, 120, 32191, 142, 65045, 218, 8777, 1, 124, 5213, 3, 11, 32389, 267, 36160, 300, 10357, 1, 0, 52623, 1, 12, 62443, 1, 102, 43177, 1, 94, 44479, 1, 268, 45699, 1, 220, 10828, 2, 90, 38358, 167, 20310, 1, 189, 17667, 2, 125, 62792, 308, 27462, 1, 161, 46841, 3, 147, 41575, 181, 50745, 302, 33900, 2, 56, 2268, 215, 44964, 2, 86, 65525, 115, 47504, 1, 111, 35424, 1, 25, 49326, 2, 27, 42292, 98, 59968, 1, 133, 12386, 1, 295, 64014, 1, 81, 56044, 1, 213, 476, 1, 89, 5533, 2, 170, 23432, 333, 2887, 3, 79, 38846, 171, 23432, 326, 49947, 2, 3, 3581, 104, 55851, 2, 60, 45340, 334, 59116, 2, 82, 44660, 314, 60639, 1, 107, 36165, 4, 61, 20164, 127, 55800, 282, 55800, 321, 55800, 1, 191, 6702, 1, 33, 19133, 2, 17, 52878, 75, 7009, 1, 131, 24637, 1, 39, 35949, 1, 112, 33239, 1, 45, 62228, 2, 49, 14509, 126, 42180, 1, 22, 35828, 3, 9, 31442, 106, 47025, 299, 60009, 1, 13, 64925, 1, 272, 31285, 1, 100, 51091, 2, 16, 36141, 129, 58993, 1, 78, 24268, 3, 28, 50839, 128, 43640, 279, 20149, 2, 47, 53483, 166, 4692, 2, 159, 39848, 180, 323, 4, 96, 64454, 164, 64454, 239, 64454, 252, 64454, 1, 277, 18860, 1, 141, 51552, 1, 121, 41195, 2, 24, 52594, 139, 53040, 2, 246, 18653, 262, 18653, 1, 4, 48813, 2, 132, 10230, 237, 4718, 1, 146, 55214, 3, 6, 43135, 289, 54216, 293, 64088, 3, 29, 52437, 168, 17057, 257, 4406, 2, 152, 41670, 201, 36905, 1, 67, 54087, 1, 190, 54868, 1, 318, 29521, 1, 119, 1926, 2, 172, 44101, 329, 60084, 1, 319, 9119, 1, 327, 43878, 1, 14, 417, 1, 270, 9545, 3, 157, 42977, 242, 16539, 254, 16539, 1, 208, 19778, 3, 105, 49596, 243, 17383, 275, 1265, 2, 7, 44291, 70, 16948, 2, 114, 29435, 274, 3080, 3, 36, 63504, 219, 21408, 250, 45345, 1, 48, 15787, 2, 108, 52223, 271, 37849, 1, 64, 17738, 1, 154, 28291, 3, 34, 28918, 173, 23898, 304, 14976, 1, 73, 50352, 3, 153, 45222, 285, 12720, 324, 12720, 4, 91, 40105, 276, 52510, 301, 33336, 325, 52510, 2, 175, 59140, 288, 54111, 1, 26, 14579, 1, 44, 30699, 1, 43, 16666, 5, 95, 40321, 163, 40321, 207, 50940, 238, 40321, 251, 40321, 1, 113, 19570, 1, 109, 52962, 2, 42, 29898, 87, 33285, 1, 244, 30028, 1, 192, 8117, 1, 211, 50287, 1, 85, 30027, 1, 140, 16647, 1, 19, 48536, 2, 165, 33853, 216, 59331, 1, 185, 31043, 3, 122, 54045, 240, 2813, 253, 2813, 3, 136, 24054, 260, 37849, 316, 44618, 2, 266, 36497, 317, 44618, 1, 221, 4056, 2, 5, 26134, 51, 60632, 2, 72, 31401, 110, 2533, 2, 66, 41025, 193, 36487, 2, 241, 8047, 255, 8047, 1, 198, 54995, 1, 150, 13922, 1, 31, 32642, 1, 224, 208, 1, 15, 62458, 1, 292, 41693, 1, 205, 49507, 2, 37, 52088, 99, 57670, 2, 210, 8408, 309, 20760, 1, 2, 14764, 1, 264, 24679, 1, 228, 27156, 1, 158, 22927, 3, 57, 22158, 123, 8622, 312, 21756, 1, 187, 37859, 3, 156, 1798, 206, 62281, 209, 62281, 1, 332, 13089, 2, 20, 15414, 151, 1577, 1, 179, 46712, 1, 286, 38844, 2, 83, 39633, 330, 11084, 1, 256, 46522, 2, 138, 50176, 287, 62309, 1, 176, 53094, 1, 217, 57092, 1, 194, 50855, 1, 178, 42046, 1, 303, 62674, 1, 306, 7424, 1, 18, 59004, 1, 296, 18777, 1, 247, 23885, 2, 134, 11267, 273, 3238, 1, 135, 11267, 2, 41, 14386, 148, 4107, 1, 52, 48642, 1, 144, 59630, 1, 77, 30578, 1, 328, 57021, 1, 10, 6344, 1, 118, 30212, 1, 145, 59630, 2, 117, 40887, 283, 1404, 1, 137, 24053, 1, 294, 31004, 1, 74, 35708, 2, 54, 4873, 200, 26835, 1, 265, 57454, 2, 32, 13482, 258, 37854, 2, 222, 22439, 259, 37854, 5, 69, 30500, 76, 11565, 199, 9528, 202, 53512, 227, 12625, 2, 59, 15997, 203, 60391, 1, 214, 65213, 1, 65, 57161, 1, 58, 30003, 1, 322, 15952, 1, 80, 48788, 2, 40, 51043, 155, 7380, 1, 278, 22712, 1, 305, 48255, 1, 315, 61202, 1, 53, 61300, 2, 226, 29919, 307, 27462, 2, 284, 23869, 297, 50792, 1, 97, 42842, 1, 196, 63522, 4, 35, 39509, 92, 35771, 245, 35771, 261, 35771, 1, 311, 13208, 2, 1, 25756, 103, 52456, 2, 298, 60413, 313, 21755, 2, 88, 29017, 323, 11858, 1, 50, 41737, 1, 84, 53682, 1, 46, 3211, 1, 162, 7261, 2, 21, 55087, 23, 53378, }; vtkDICOMDictionary::Dict Dict193Data = { "GEMS_PETD_01", 335, 335, Dict193TagHashTable, Dict193KeyHashTable, Dict193Contents }; // ----- ISI ----- const DictEntry Dict194Contents[] = { { 0x0009, 0x0001, 0, VR::UN, VM::M1, "SIENETGeneralPurposeIMGEF" }, }; const unsigned short Dict194TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict194KeyHashTable[] = { 2, 0, 1, 0, 1153, }; vtkDICOMDictionary::Dict Dict194Data = { "ISI", 1, 1, Dict194TagHashTable, Dict194KeyHashTable, Dict194Contents }; // ----- GEMS_DRS_1 ----- const DictEntry Dict195Contents[] = { { 0x0037, 0x0010, 0, VR::LO, VM::M1, "ReferringDepartment" }, { 0x0037, 0x0020, 0, VR::US, VM::M1, "ScreenNumber" }, { 0x0037, 0x0040, 0, VR::SH, VM::M1, "LeftOrientation" }, { 0x0037, 0x0042, 0, VR::SH, VM::M1, "RightOrientation" }, { 0x0037, 0x0050, 0, VR::CS, VM::M1, "Inversion" }, { 0x0037, 0x0060, 0, VR::US, VM::M1, "DSA" }, }; const unsigned short Dict195TagHashTable[] = { 7, 6, 10, 15, 18, 21, 0, 1, 4, 80, 2, 3, 66, 5, 96, 1, 0, 16, 1, 2, 64, 1, 1, 32, }; const unsigned short Dict195KeyHashTable[] = { 7, 10, 6, 13, 16, 21, 0, 1, 1, 59757, 1, 3, 23101, 1, 0, 49695, 2, 2, 62532, 4, 11413, 1, 5, 64132, }; vtkDICOMDictionary::Dict Dict195Data = { "GEMS_DRS_1", 6, 6, Dict195TagHashTable, Dict195KeyHashTable, Dict195Contents }; // ----- RamSoft Race Identifier ----- const DictEntry Dict196Contents[] = { { 0x3129, 0x0010, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict196TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict196KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict196Data = { "RamSoft Race Identifier", 1, 1, Dict196TagHashTable, Dict196KeyHashTable, Dict196Contents }; // ----- TOSHIBA MDW NON-IMAGE ----- const DictEntry Dict197Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "NonImageHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "NonImageHeaderVersion" }, { 0x0029, 0x0020, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict197TagHashTable[] = { 4, 3, 9, 0, 2, 0, 8, 2, 32, 1, 1, 9, }; const unsigned short Dict197KeyHashTable[] = { 3, 4, 7, 0, 1, 0, 30143, 2, 1, 59488, 2, 1793, }; vtkDICOMDictionary::Dict Dict197Data = { "TOSHIBA MDW NON-IMAGE", 3, 3, Dict197TagHashTable, Dict197KeyHashTable, Dict197Contents }; // ----- SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES ----- const DictEntry Dict198Contents[] = { { 0x0039, 0x0001, 0, VR::UT, VM::M1, "ExternalAttributes" }, }; const unsigned short Dict198TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict198KeyHashTable[] = { 2, 0, 1, 0, 18287, }; vtkDICOMDictionary::Dict Dict198Data = { "SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES", 1, 1, Dict198TagHashTable, Dict198KeyHashTable, Dict198Contents }; // ----- DR Systems, Inc. ----- const DictEntry Dict199Contents[] = { { 0x4453, 0x0001, 0, VR::LO, VM::M1, "ExamID" }, { 0x4453, 0x0002, 0, VR::LO, VM::M1, "ImageType" }, { 0x4453, 0x0004, 0, VR::LO, VM::M1, "FileType" }, { 0x4453, 0x0005, 0, VR::LO, VM::M1, "FileSuffix" }, { 0x4453, 0x000A, 0, VR::LO, VM::M1, "AnnotationType" }, { 0x4453, 0x000C, 0, VR::SQ, VM::M1, "OriginalInstanceUIDSequence" }, }; const unsigned short Dict199TagHashTable[] = { 7, 12, 6, 6, 15, 20, 0, 2, 4, 10, 5, 12, 1, 0, 1, 2, 1, 2, 2, 4, 1, 3, 5, }; const unsigned short Dict199KeyHashTable[] = { 7, 14, 19, 6, 6, 6, 0, 3, 1, 28071, 3, 29887, 5, 30295, 2, 0, 16330, 2, 14801, 1, 4, 50688, }; vtkDICOMDictionary::Dict Dict199Data = { "DR Systems, Inc.", 6, 6, Dict199TagHashTable, Dict199KeyHashTable, Dict199Contents }; // ----- SCHICK TECHNOLOGIES - Change Item Creator ID ----- const DictEntry Dict200Contents[] = { { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0003, 0, VR::DT, VM::M1, "" }, { 0x0021, 0x0004, 0, VR::PN, VM::M1, "" }, { 0x0021, 0x0005, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict200TagHashTable[] = { 6, 9, 12, 5, 17, 0, 1, 1, 2, 1, 4, 5, 2, 0, 1, 3, 4, 1, 2, 3, }; const unsigned short Dict200KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict200Data = { "SCHICK TECHNOLOGIES - Change Item Creator ID", 5, 5, Dict200TagHashTable, Dict200KeyHashTable, Dict200Contents }; // ----- SIEMENS AX INSPACE_EP ----- const DictEntry Dict201Contents[] = { { 0x0009, 0x0050, 0, VR::UI, VM::M1, "" }, { 0x0009, 0x0051, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict201TagHashTable[] = { 3, 6, 0, 1, 0, 80, 1, 1, 81, }; const unsigned short Dict201KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict201Data = { "SIEMENS AX INSPACE_EP", 2, 2, Dict201TagHashTable, Dict201KeyHashTable, Dict201Contents }; // ----- AGFA-AG_HPState ----- const DictEntry Dict202Contents[] = { { 0x0011, 0x0011, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::SQ, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x00a2, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::FL, VM::M1, "" }, { 0x0019, 0x00a4, 0, VR::FL, VM::M1, "" }, { 0x0071, 0x0018, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x0019, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x001a, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x001c, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x001e, 0, VR::SQ, VM::M1, "" }, { 0x0071, 0x0020, 0, VR::FL, VM::M1TN, "" }, { 0x0071, 0x0021, 0, VR::FD, VM::M1TN, "" }, { 0x0071, 0x0022, 0, VR::FD, VM::M1TN, "" }, { 0x0071, 0x0023, 0, VR::FD, VM::M1TN, "" }, { 0x0071, 0x0024, 0, VR::FD, VM::M1, "" }, { 0x0071, 0x002b, 0, VR::FD, VM::M1TN, "" }, { 0x0071, 0x002c, 0, VR::FD, VM::M3, "" }, { 0x0071, 0x002d, 0, VR::FD, VM::M1, "" }, { 0x0073, 0x0023, 0, VR::SH, VM::M1, "" }, { 0x0073, 0x0024, 0, VR::SQ, VM::M1, "" }, { 0x0073, 0x0028, 0, VR::SQ, VM::M1, "" }, { 0x0073, 0x0080, 0, VR::FL, VM::M1, "" }, { 0x0075, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0087, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0087, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0087, 0x0003, 0, VR::SL, VM::M2, "" }, { 0x0087, 0x0004, 0, VR::SL, VM::M2, "" }, { 0x0087, 0x0005, 0, VR::FD, VM::M2, "" }, { 0x0087, 0x0006, 0, VR::FD, VM::M2, "" }, { 0x0087, 0x0007, 0, VR::FD, VM::M2, "" }, { 0x0087, 0x0008, 0, VR::FD, VM::M2, "" }, }; const unsigned short Dict202TagHashTable[] = { 33, 38, 41, 44, 47, 32, 52, 55, 58, 61, 64, 32, 67, 70, 73, 32, 76, 81, 86, 89, 92, 32, 95, 32, 98, 101, 104, 109, 114, 117, 32, 120, 0, 2, 0, 17, 28, 5, 1, 27, 4, 1, 30, 7, 1, 29, 6, 2, 23, 16, 24, 1, 1, 26, 3, 1, 25, 2, 1, 6, 24, 1, 7, 25, 1, 8, 26, 1, 9, 28, 1, 31, 8, 1, 10, 30, 2, 11, 32, 22, 128, 2, 12, 33, 19, 35, 1, 13, 34, 1, 14, 35, 1, 15, 36, 1, 20, 36, 1, 4, 163, 1, 3, 162, 2, 2, 161, 21, 40, 2, 1, 160, 16, 43, 1, 17, 44, 1, 18, 45, 1, 5, 164, }; const unsigned short Dict202KeyHashTable[] = { 32, 32, 32, 32, 32, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 32, 0, 168, 1, 168, 2, 168, 3, 168, 4, 168, 5, 168, 6, 168, 7, 168, 8, 168, 9, 168, 10, 168, 11, 168, 12, 168, 13, 168, 14, 168, 15, 168, 16, 168, 17, 168, 18, 168, 19, 168, 20, 168, 21, 168, 22, 168, 23, 168, 24, 168, 25, 168, 26, 168, 27, 168, 28, 168, 29, 168, 30, 168, 31, 168, }; vtkDICOMDictionary::Dict Dict202Data = { "AGFA-AG_HPState", 32, 32, Dict202TagHashTable, Dict202KeyHashTable, Dict202Contents }; // ----- SPI-P-Private_ICS Release 1 ----- const DictEntry Dict203Contents[] = { { 0x0019, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x000d, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x000e, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x000f, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0012, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x001b, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x001c, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x001d, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x001e, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x004c, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x004d, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x004e, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x004f, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0050, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0051, 0, VR::FD, VM::M1, "" }, { 0x0029, 0x0067, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0068, 0, VR::US, VM::M1, "" }, { 0x0029, 0x006A, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x006B, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0072, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0091, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict203TagHashTable[] = { 26, 31, 34, 39, 44, 47, 25, 50, 53, 56, 25, 61, 25, 66, 69, 74, 79, 84, 25, 25, 87, 90, 25, 25, 25, 0, 2, 7, 27, 13, 76, 1, 14, 77, 2, 9, 29, 15, 78, 2, 8, 28, 16, 79, 1, 19, 103, 1, 10, 30, 1, 5, 16, 1, 12, 33, 2, 6, 18, 11, 32, 2, 2, 13, 24, 145, 1, 4, 15, 2, 3, 14, 20, 104, 2, 1, 49, 23, 114, 2, 0, 48, 21, 106, 1, 22, 107, 1, 17, 80, 1, 18, 81, }; const unsigned short Dict203KeyHashTable[] = { 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 215, 1, 215, 2, 215, 3, 215, 4, 215, 5, 215, 6, 215, 7, 215, 8, 215, 9, 215, 10, 215, 11, 215, 12, 215, 13, 215, 14, 215, 15, 215, 16, 215, 17, 215, 18, 215, 19, 215, 20, 215, 21, 215, 22, 215, 23, 215, 24, 215, }; vtkDICOMDictionary::Dict Dict203Data = { "SPI-P-Private_ICS Release 1", 25, 25, Dict203TagHashTable, Dict203KeyHashTable, Dict203Contents }; // ----- RadWorksTBR ----- const DictEntry Dict204Contents[] = { { 0x3111, 0x0002, 0, VR::CS, VM::M1, "CompressionType" }, { 0x3111, 0x00FF, 0, VR::SQ, VM::M1, "QueryResult" }, }; const unsigned short Dict204TagHashTable[] = { 2, 3, 0, 2, 0, 2, 1, 255, }; const unsigned short Dict204KeyHashTable[] = { 3, 6, 0, 1, 1, 42557, 1, 0, 44844, }; vtkDICOMDictionary::Dict Dict204Data = { "RadWorksTBR", 2, 2, Dict204TagHashTable, Dict204KeyHashTable, Dict204Contents }; // ----- SIEMENS SYNGO REGISTRATION ----- const DictEntry Dict205Contents[] = { { 0x0071, 0x0020, 0, VR::SQ, VM::M1, "RegisteredImageSequence" }, { 0x0071, 0x0021, 0, VR::CS, VM::M1, "RegistrationIsValidatedFlag" }, }; const unsigned short Dict205TagHashTable[] = { 3, 6, 0, 1, 0, 32, 1, 1, 33, }; const unsigned short Dict205KeyHashTable[] = { 3, 6, 0, 1, 1, 65362, 1, 0, 53639, }; vtkDICOMDictionary::Dict Dict205Data = { "SIEMENS SYNGO REGISTRATION", 2, 2, Dict205TagHashTable, Dict205KeyHashTable, Dict205Contents }; // ----- AMI Sequence AnnotElements_01 ----- const DictEntry Dict206Contents[] = { { 0x3105, 0x0010, 0, VR::DS, VM::M1TN, "AnnotationElementPosition" }, { 0x3105, 0x0020, 0, VR::LT, VM::M1, "AnnotationElementText" }, }; const unsigned short Dict206TagHashTable[] = { 2, 3, 0, 2, 0, 16, 1, 32, }; const unsigned short Dict206KeyHashTable[] = { 2, 3, 0, 2, 0, 22223, 1, 63671, }; vtkDICOMDictionary::Dict Dict206Data = { "AMI Sequence AnnotElements_01", 2, 2, Dict206TagHashTable, Dict206KeyHashTable, Dict206Contents }; // ----- AMI ImageTransform_01 ----- const DictEntry Dict207Contents[] = { { 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" }, { 0x3107, 0x0020, 0, VR::DS, VM::M1, "CenterOffset" }, { 0x3107, 0x0030, 0, VR::DS, VM::M1, "Magnification" }, { 0x3107, 0x0040, 0, VR::CS, VM::M1, "MagnificationType" }, { 0x3107, 0x0050, 0, VR::DS, VM::M1, "DisplayedArea" }, { 0x3107, 0x0060, 0, VR::DS, VM::M1, "CalibrationFactor" }, }; const unsigned short Dict207TagHashTable[] = { 7, 10, 13, 16, 19, 22, 0, 1, 4, 80, 1, 2, 48, 1, 3, 64, 1, 1, 32, 1, 5, 96, 1, 0, 16, }; const unsigned short Dict207KeyHashTable[] = { 7, 12, 17, 6, 6, 20, 0, 2, 3, 18224, 5, 9826, 2, 0, 2792, 1, 49378, 1, 2, 47562, 1, 4, 25284, }; vtkDICOMDictionary::Dict Dict207Data = { "AMI ImageTransform_01", 6, 6, Dict207TagHashTable, Dict207KeyHashTable, Dict207Contents }; // ----- SECTRA_ImageInfo_01 ----- const DictEntry Dict208Contents[] = { { 0x0029, 0x0001, 0, VR::OB, VM::M1, "ImageInfo" }, { 0x0029, 0x0002, 0, VR::CS, VM::M1, "Marking" }, { 0x0029, 0x0003, 0, VR::LO, VM::M1, "NoDecompression" }, { 0x0029, 0x0004, 0, VR::OB, VM::M1, "ImageInfoNew" }, }; const unsigned short Dict208TagHashTable[] = { 5, 8, 11, 14, 0, 1, 0, 1, 1, 3, 4, 1, 2, 3, 1, 1, 2, }; const unsigned short Dict208KeyHashTable[] = { 5, 8, 11, 4, 0, 1, 0, 38509, 1, 2, 36303, 2, 1, 60139, 3, 61855, }; vtkDICOMDictionary::Dict Dict208Data = { "SECTRA_ImageInfo_01", 4, 4, Dict208TagHashTable, Dict208KeyHashTable, Dict208Contents }; // ----- HMC - CT - ID ----- const DictEntry Dict209Contents[] = { { 0x0009, 0x0000, 0, VR::OB, VM::M1, "ImageIDInformationPatientNameID" }, { 0x0009, 0x0001, 0, VR::OB, VM::M1, "ImageIDInformationPatientComment" }, }; const unsigned short Dict209TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict209KeyHashTable[] = { 3, 6, 0, 1, 0, 17343, 1, 1, 63969, }; vtkDICOMDictionary::Dict Dict209Data = { "HMC - CT - ID", 2, 2, Dict209TagHashTable, Dict209KeyHashTable, Dict209Contents }; // ----- VEPRO DICOM RECEIVE DATA 1.0 ----- const DictEntry Dict210Contents[] = { { 0x0059, 0x0040, 0, VR::DA, VM::M1, "ReceiveDate" }, { 0x0059, 0x0041, 0, VR::TM, VM::M1, "ReceiveTime" }, { 0x0059, 0x0042, 0, VR::ST, VM::M1, "ReceiveNode" }, { 0x0059, 0x0043, 0, VR::ST, VM::M1, "ReceiveApplication" }, { 0x0059, 0x0050, 0, VR::ST, VM::M1, "ReceiveLocalComputer" }, { 0x0059, 0x0051, 0, VR::ST, VM::M1, "ReceiveLocalAETitle" }, { 0x0059, 0x0060, 0, VR::ST, VM::M1, "ReceiveRemoteComputer" }, { 0x0059, 0x0061, 0, VR::ST, VM::M1, "ReceiveRemoteAETitle" }, { 0x0059, 0x0070, 0, VR::UI, VM::M1, "ReceiveOriginalTransferSyntax" }, }; const unsigned short Dict210TagHashTable[] = { 10, 9, 15, 18, 9, 21, 24, 27, 30, 0, 2, 2, 66, 4, 80, 1, 7, 97, 1, 6, 96, 1, 8, 112, 1, 1, 65, 1, 0, 64, 2, 3, 67, 5, 81, }; const unsigned short Dict210KeyHashTable[] = { 10, 13, 16, 21, 9, 26, 29, 9, 32, 0, 1, 5, 34915, 1, 4, 8601, 2, 1, 28845, 2, 5580, 2, 7, 51377, 8, 62294, 1, 3, 16927, 1, 6, 42133, 1, 0, 29550, }; vtkDICOMDictionary::Dict Dict210Data = { "VEPRO DICOM RECEIVE DATA 1.0", 9, 9, Dict210TagHashTable, Dict210KeyHashTable, Dict210Contents }; // ----- ADAC_IMG ----- const DictEntry Dict211Contents[] = { { 0x0019, 0x0002, 0, VR::IS, VM::M1, "ADACPegasysFileSize" }, { 0x0019, 0x0021, 0, VR::US, VM::M1, "NumberOfADACHeaders" }, { 0x0019, 0x0041, 0, VR::IS, VM::M1TN, "ADACHeaderImageSize" }, { 0x0019, 0x0061, 0, VR::OB, VM::M1, "ADACPegasysHeaders" }, }; const unsigned short Dict211TagHashTable[] = { 5, 8, 4, 13, 0, 1, 1, 33, 2, 2, 65, 3, 97, 1, 0, 2, }; const unsigned short Dict211KeyHashTable[] = { 5, 8, 13, 4, 0, 1, 1, 22938, 2, 0, 7665, 2, 36501, 1, 3, 58761, }; vtkDICOMDictionary::Dict Dict211Data = { "ADAC_IMG", 4, 4, Dict211TagHashTable, Dict211KeyHashTable, Dict211Contents }; // ----- SIEMENS MEDCOM HEADER2 ----- const DictEntry Dict212Contents[] = { { 0x0029, 0x0060, 0, VR::LO, VM::M1, "SeriesWorkFlowStatus" }, }; const unsigned short Dict212TagHashTable[] = { 2, 0, 1, 0, 96, }; const unsigned short Dict212KeyHashTable[] = { 2, 0, 1, 0, 26191, }; vtkDICOMDictionary::Dict Dict212Data = { "SIEMENS MEDCOM HEADER2", 1, 1, Dict212TagHashTable, Dict212KeyHashTable, Dict212Contents }; // ----- Philips MR Imaging DD 002 ----- const DictEntry Dict213Contents[] = { { 0x2005, 0x0015, 0, VR::LO, VM::M1, "UserName" }, { 0x2005, 0x0016, 0, VR::LO, VM::M1, "PassWord" }, { 0x2005, 0x0017, 0, VR::LO, VM::M1, "ServerName" }, { 0x2005, 0x0018, 0, VR::LO, VM::M1, "DataBaseName" }, { 0x2005, 0x0019, 0, VR::LO, VM::M1, "RootName" }, { 0x2005, 0x0020, 0, VR::LO, VM::M1, "DMIApplicationName" }, { 0x2005, 0x002D, 0, VR::LO, VM::M1, "RootId" }, { 0x2005, 0x0032, 0, VR::SQ, VM::M1, "BlobDataObjectArray" }, { 0x2005, 0x0034, 0, VR::LT, VM::M1, "SeriesTransactionUID" }, { 0x2005, 0x0035, 0, VR::IS, VM::M1, "ParentID" }, { 0x2005, 0x0036, 0, VR::LO, VM::M1, "ParentType" }, { 0x2005, 0x0037, 0, VR::LO, VM::M1, "BlobName" }, { 0x2005, 0x0038, 0, VR::LO, VM::M1, "ApplicationName" }, { 0x2005, 0x0039, 0, VR::LO, VM::M1, "TypeName" }, { 0x2005, 0x0040, 0, VR::LO, VM::M1, "VersionStr" }, { 0x2005, 0x0041, 0, VR::LO, VM::M1, "CommentStr" }, { 0x2005, 0x0042, 0, VR::CS, VM::M1, "BlobInFile" }, { 0x2005, 0x0043, 0, VR::SL, VM::M1, "ActualBlobSize" }, { 0x2005, 0x0044, 0, VR::OW, VM::M1, "BlobData" }, { 0x2005, 0x0045, 0, VR::LO, VM::M1, "BlobFilename" }, { 0x2005, 0x0046, 0, VR::SL, VM::M1, "BlobOffset" }, { 0x2005, 0x0047, 0, VR::CS, VM::M1, "BlobFlag" }, { 0x2005, 0x0099, 0, VR::UL, VM::M1, "NumberOfRequestExcerpts" }, }; const unsigned short Dict213TagHashTable[] = { 24, 23, 23, 27, 23, 23, 23, 23, 30, 35, 38, 41, 46, 51, 56, 59, 62, 65, 68, 71, 76, 79, 82, 0, 1, 3, 24, 1, 7, 50, 2, 5, 32, 13, 57, 1, 12, 56, 1, 0, 21, 2, 6, 45, 22, 153, 2, 2, 23, 18, 68, 2, 1, 22, 19, 69, 1, 20, 70, 1, 21, 71, 1, 14, 64, 1, 15, 65, 1, 16, 66, 2, 9, 53, 17, 67, 1, 8, 52, 1, 11, 55, 2, 4, 25, 10, 54, }; const unsigned short Dict213KeyHashTable[] = { 24, 29, 23, 23, 36, 39, 44, 23, 47, 50, 53, 60, 63, 23, 23, 23, 66, 23, 69, 23, 72, 75, 82, 0, 2, 3, 54397, 18, 64850, 3, 4, 54079, 14, 52277, 20, 13446, 1, 8, 18028, 2, 12, 42963, 22, 55251, 1, 9, 42394, 1, 15, 56895, 1, 10, 9976, 3, 2, 39013, 5, 20102, 17, 36841, 1, 16, 22288, 1, 1, 4852, 1, 6, 44138, 1, 21, 2932, 1, 19, 38231, 3, 0, 10384, 7, 7545, 11, 14928, 1, 13, 16350, }; vtkDICOMDictionary::Dict Dict213Data = { "Philips MR Imaging DD 002", 23, 23, Dict213TagHashTable, Dict213KeyHashTable, Dict213Contents }; // ----- SIEMENS CSA HEADER ----- const DictEntry Dict214Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSAImageHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSAImageHeaderVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSAImageHeaderInfo" }, { 0x0029, 0x0018, 0, VR::CS, VM::M1, "CSASeriesHeaderType" }, { 0x0029, 0x0019, 0, VR::LO, VM::M1, "CSASeriesHeaderVersion" }, { 0x0029, 0x0020, 0, VR::OB, VM::M1, "CSASeriesHeaderInfo" }, }; const unsigned short Dict214TagHashTable[] = { 7, 10, 13, 16, 6, 6, 0, 1, 4, 25, 1, 3, 24, 1, 1, 9, 3, 0, 8, 2, 16, 5, 32, }; const unsigned short Dict214KeyHashTable[] = { 7, 6, 12, 6, 15, 6, 0, 2, 0, 16775, 5, 1386, 1, 3, 3784, 3, 1, 53655, 2, 14376, 4, 20995, }; vtkDICOMDictionary::Dict Dict214Data = { "SIEMENS CSA HEADER", 6, 6, Dict214TagHashTable, Dict214KeyHashTable, Dict214Contents }; // ----- MEDISO-1 ----- const DictEntry Dict215Contents[] = { { 0x0009, 0x0030, 0, VR::DT, VM::M1, "" }, { 0x0009, 0x0036, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00c0, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00c1, 0, VR::OB, VM::M1, "" }, { 0x0009, 0x00c4, 0, VR::OB, VM::M1, "" }, { 0x0009, 0x00d2, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x00d5, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x00dc, 0, VR::SQ, VM::M1, "" }, { 0x0009, 0x00de, 0, VR::UL, VM::M1, "" }, { 0x0009, 0x00df, 0, VR::UL, VM::M1, "" }, { 0x0009, 0x00e0, 0, VR::US, VM::M1, "" }, { 0x0009, 0x00e1, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00e6, 0, VR::OB, VM::M1, "" }, { 0x0009, 0x00e9, 0, VR::UI, VM::M1TN, "" }, { 0x0009, 0x00ee, 0, VR::DT, VM::M1, "" }, { 0x0009, 0x00ef, 0, VR::DT, VM::M1, "" }, { 0x0009, 0x00f0, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00f1, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00f2, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00f3, 0, VR::FD, VM::M1, "" }, { 0x0009, 0x00fa, 0, VR::ST, VM::M1, "" }, { 0x0009, 0x00fb, 0, VR::US, VM::M1, "" }, { 0x0011, 0x0006, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict215TagHashTable[] = { 24, 23, 23, 23, 27, 30, 35, 40, 23, 43, 46, 49, 23, 23, 23, 23, 54, 57, 60, 65, 70, 75, 80, 0, 1, 22, 6, 1, 10, 224, 2, 8, 222, 11, 225, 2, 9, 223, 12, 230, 1, 7, 220, 1, 5, 210, 1, 20, 250, 2, 0, 48, 21, 251, 1, 6, 213, 1, 1, 54, 2, 2, 192, 18, 242, 2, 3, 193, 19, 243, 2, 13, 233, 16, 240, 2, 14, 238, 17, 241, 2, 4, 196, 15, 239, }; const unsigned short Dict215KeyHashTable[] = { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 0, 23, 0, 233, 1, 233, 2, 233, 3, 233, 4, 233, 5, 233, 6, 233, 7, 233, 8, 233, 9, 233, 10, 233, 11, 233, 12, 233, 13, 233, 14, 233, 15, 233, 16, 233, 17, 233, 18, 233, 19, 233, 20, 233, 21, 233, 22, 233, }; vtkDICOMDictionary::Dict Dict215Data = { "MEDISO-1", 23, 23, Dict215TagHashTable, Dict215KeyHashTable, Dict215Contents }; // ----- MeVis eD: Geometry Information ----- const DictEntry Dict216Contents[] = { { 0x0021, 0x0010, 0, VR::UN, VM::M1, "GeometryScannerOrigin" }, }; const unsigned short Dict216TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict216KeyHashTable[] = { 2, 0, 1, 0, 24355, }; vtkDICOMDictionary::Dict Dict216Data = { "MeVis eD: Geometry Information", 1, 1, Dict216TagHashTable, Dict216KeyHashTable, Dict216Contents }; // ----- SIEMENS SYNGO 3D FUSION MATRIX ----- const DictEntry Dict217Contents[] = { { 0x0029, 0x0008, 0, VR::UI, VM::M1, "ObjectSeriesInstanceUID" }, { 0x0029, 0x0009, 0, VR::UI, VM::M1, "ModelSeriesInstanceUID" }, { 0x0029, 0x0010, 0, VR::UI, VM::M1, "MatrixReferencedSeriesInstanceUID" }, }; const unsigned short Dict217TagHashTable[] = { 4, 3, 9, 0, 2, 0, 8, 2, 16, 1, 1, 9, }; const unsigned short Dict217KeyHashTable[] = { 4, 9, 3, 0, 2, 1, 51112, 2, 20485, 1, 0, 40511, }; vtkDICOMDictionary::Dict Dict217Data = { "SIEMENS SYNGO 3D FUSION MATRIX", 3, 3, Dict217TagHashTable, Dict217KeyHashTable, Dict217Contents }; // ----- GEMS_3D_INTVL_01 ----- const DictEntry Dict218Contents[] = { { 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" }, { 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" }, { 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" }, { 0x0023, 0x0004, 0, VR::FL, VM::M1, "MarkerSize" }, { 0x0023, 0x0005, 0, VR::US, VM::M3, "MarkerColorCIELabValue" }, { 0x0023, 0x0006, 0, VR::LO, VM::M1, "MarkerLabel" }, { 0x0023, 0x0007, 0, VR::CS, VM::M1, "MarkerVisibleState" }, { 0x0023, 0x0008, 0, VR::LO, VM::M1, "MarkerDescription" }, { 0x0023, 0x0010, 0, VR::SQ, VM::M1, "MarkerPointsSequence" }, { 0x0023, 0x0011, 0, VR::SH, VM::M1, "MarkerPointID" }, { 0x0023, 0x0012, 0, VR::FL, VM::M3, "MarkerPointPosition" }, { 0x0023, 0x0013, 0, VR::FL, VM::M1, "MarkerPointSize" }, { 0x0023, 0x0014, 0, VR::US, VM::M3, "MarkerPointColorCIELabValue" }, { 0x0023, 0x0016, 0, VR::CS, VM::M1, "MarkerPointVisibleState" }, { 0x0023, 0x0017, 0, VR::IS, VM::M1, "MarkerPointOrder" }, { 0x0023, 0x0018, 0, VR::FL, VM::M3, "VolumeManualRegistration" }, { 0x0023, 0x0020, 0, VR::IS, VM::M1TN, "VolumesThreshold" }, { 0x0023, 0x0025, 0, VR::CS, VM::M1, "CutPlaneActivationFlag" }, { 0x0023, 0x0026, 0, VR::IS, VM::M1, "CutPlanePositionValue" }, { 0x0023, 0x0027, 0, VR::FL, VM::M3, "CutPlaneNormalValue" }, { 0x0023, 0x0028, 0, VR::FL, VM::M1, "VolumeScalingFactor" }, { 0x0023, 0x0029, 0, VR::FL, VM::M1, "ROIToTableTopDistance" }, { 0x0023, 0x0030, 0, VR::IS, VM::M1TN, "DRRThreshold" }, { 0x0023, 0x0031, 0, VR::FL, VM::M3, "VolumeTablePosition" }, { 0x0023, 0x0032, 0, VR::IS, VM::M1, "RenderingMode" }, { 0x0023, 0x0033, 0, VR::IS, VM::M1, "ThreeDObjectOpacity" }, { 0x0023, 0x0034, 0, VR::IS, VM::M1, "InvertImage" }, { 0x0023, 0x0035, 0, VR::IS, VM::M1, "EnhanceFull" }, { 0x0023, 0x0036, 0, VR::FL, VM::M1, "Zoom" }, { 0x0023, 0x0037, 0, VR::IS, VM::M2, "Roam" }, { 0x0023, 0x0038, 0, VR::IS, VM::M1, "WindowLevel" }, { 0x0023, 0x0039, 0, VR::IS, VM::M1, "WindowWidth" }, { 0x0023, 0x0040, 0, VR::CS, VM::M1, "BMCSetting" }, { 0x0023, 0x0041, 0, VR::CS, VM::M1, "BackViewSetting" }, { 0x0023, 0x0042, 0, VR::CS, VM::M1TN, "SubVolumeVisibility" }, { 0x0023, 0x0043, 0, VR::CS, VM::M1, "ThreeDLandmarksVisibility" }, { 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" }, { 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" }, { 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" }, { 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" }, { 0x0023, 0x0004, 0, VR::FL, VM::M1, "MarkerSize" }, { 0x0023, 0x0005, 0, VR::US, VM::M3, "MarkerColorCIELabValue" }, { 0x0023, 0x0006, 0, VR::LO, VM::M1, "MarkerLabel" }, { 0x0023, 0x0007, 0, VR::CS, VM::M1, "MarkerVisibleState" }, { 0x0023, 0x0008, 0, VR::LO, VM::M1, "MarkerDescription" }, { 0x0023, 0x0010, 0, VR::SQ, VM::M1, "MarkerPointsSequence" }, { 0x0023, 0x0011, 0, VR::SH, VM::M1, "MarkerPointID" }, { 0x0023, 0x0012, 0, VR::FL, VM::M3, "MarkerPointPosition" }, { 0x0023, 0x0013, 0, VR::FL, VM::M1, "MarkerPointSize" }, { 0x0023, 0x0014, 0, VR::US, VM::M3, "MarkerPointColorCIELabValue" }, { 0x0023, 0x0016, 0, VR::CS, VM::M1, "MarkerPointVisibleState" }, { 0x0023, 0x0017, 0, VR::IS, VM::M1, "MarkerPointOrder" }, { 0x0023, 0x0018, 0, VR::FL, VM::M3, "VolumeManualRegistration" }, { 0x0023, 0x0020, 0, VR::IS, VM::M1TN, "VolumesThreshold" }, { 0x0023, 0x0025, 0, VR::CS, VM::M1, "CutPlaneActivationFlag" }, { 0x0023, 0x0026, 0, VR::IS, VM::M1, "CutPlanePositionValue" }, { 0x0023, 0x0027, 0, VR::FL, VM::M3, "CutPlaneNormalValue" }, { 0x0023, 0x0028, 0, VR::FL, VM::M1, "VolumeScalingFactor" }, { 0x0023, 0x0029, 0, VR::FL, VM::M1, "ROIToTableTopDistance" }, { 0x0023, 0x0030, 0, VR::IS, VM::M1TN, "DRRThreshold" }, { 0x0023, 0x0031, 0, VR::FL, VM::M3, "VolumeTablePosition" }, { 0x0023, 0x0032, 0, VR::IS, VM::M1, "RenderingMode" }, { 0x0023, 0x0033, 0, VR::IS, VM::M1, "ThreeDObjectOpacity" }, { 0x0023, 0x0034, 0, VR::IS, VM::M1, "InvertImage" }, { 0x0023, 0x0035, 0, VR::IS, VM::M1, "EnhanceFull" }, { 0x0023, 0x0036, 0, VR::FL, VM::M1, "Zoom" }, { 0x0023, 0x0037, 0, VR::IS, VM::M2, "Roam" }, { 0x0023, 0x0038, 0, VR::IS, VM::M1, "WindowLevel" }, { 0x0023, 0x0039, 0, VR::IS, VM::M1, "WindowWidth" }, { 0x0023, 0x0040, 0, VR::CS, VM::M1, "BMCSetting" }, { 0x0023, 0x0041, 0, VR::CS, VM::M1, "BackViewSetting" }, { 0x0023, 0x0042, 0, VR::CS, VM::M1TN, "SubVolumeVisibility" }, { 0x0023, 0x0043, 0, VR::CS, VM::M1, "ThreeDLandmarksVisibility" }, { 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" }, }; const unsigned short Dict218TagHashTable[] = { 74, 74, 74, 75, 80, 85, 90, 74, 74, 74, 95, 100, 74, 74, 74, 74, 105, 110, 115, 120, 125, 130, 135, 144, 153, 158, 163, 168, 173, 74, 74, 74, 178, 183, 188, 74, 193, 198, 203, 208, 74, 74, 74, 213, 74, 74, 74, 74, 218, 223, 228, 233, 238, 243, 74, 248, 74, 74, 74, 253, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 2, 16, 32, 53, 32, 2, 19, 39, 56, 39, 2, 18, 38, 55, 38, 2, 17, 37, 54, 37, 2, 21, 41, 58, 41, 2, 20, 40, 57, 40, 2, 25, 51, 62, 51, 2, 24, 50, 61, 50, 2, 23, 49, 60, 49, 2, 22, 48, 59, 48, 2, 29, 55, 66, 55, 2, 28, 54, 65, 54, 4, 27, 53, 34, 66, 64, 53, 71, 66, 4, 26, 52, 35, 67, 63, 52, 72, 67, 2, 32, 64, 69, 64, 2, 33, 65, 70, 65, 2, 31, 57, 68, 57, 2, 30, 56, 67, 56, 2, 36, 68, 73, 68, 2, 2, 3, 39, 3, 2, 1, 2, 38, 2, 2, 0, 1, 37, 1, 2, 6, 7, 43, 7, 2, 5, 6, 42, 6, 2, 4, 5, 41, 5, 2, 3, 4, 40, 4, 2, 7, 8, 44, 8, 2, 11, 19, 48, 19, 2, 10, 18, 47, 18, 2, 9, 17, 46, 17, 2, 8, 16, 45, 16, 2, 14, 23, 51, 23, 2, 13, 22, 50, 22, 2, 12, 20, 49, 20, 2, 15, 24, 52, 24, }; const unsigned short Dict218KeyHashTable[] = { 74, 75, 80, 85, 74, 90, 74, 99, 74, 74, 104, 74, 109, 114, 119, 74, 74, 74, 74, 124, 129, 74, 134, 74, 147, 74, 74, 156, 161, 74, 74, 166, 74, 74, 74, 74, 74, 74, 74, 171, 74, 74, 176, 185, 74, 190, 74, 74, 74, 74, 74, 74, 195, 200, 74, 205, 74, 74, 74, 210, 74, 219, 74, 74, 224, 74, 229, 234, 74, 74, 243, 74, 74, 74, 0, 2, 2, 55444, 39, 55444, 2, 10, 25626, 47, 25626, 2, 33, 58654, 70, 58654, 4, 20, 47084, 30, 27912, 57, 47084, 67, 27912, 2, 4, 4998, 41, 4998, 2, 1, 64641, 38, 64641, 2, 15, 16673, 52, 16673, 2, 36, 43602, 73, 43602, 2, 35, 15724, 72, 15724, 2, 18, 47840, 55, 47840, 2, 11, 36188, 48, 36188, 6, 0, 17643, 9, 62228, 21, 24109, 37, 17643, 46, 62228, 58, 24109, 4, 22, 26301, 26, 44980, 59, 26301, 63, 44980, 2, 12, 41253, 49, 41253, 2, 3, 54727, 40, 54727, 2, 25, 13749, 62, 13749, 2, 14, 34215, 51, 34215, 4, 24, 18179, 29, 56609, 61, 18179, 66, 56609, 2, 17, 45133, 54, 45133, 2, 34, 22717, 71, 22717, 2, 27, 33151, 64, 33151, 2, 5, 49413, 42, 49413, 2, 8, 46823, 45, 46823, 4, 7, 52552, 32, 34745, 44, 52552, 69, 34745, 2, 16, 52704, 53, 52704, 2, 23, 52617, 60, 52617, 2, 28, 60500, 65, 60500, 4, 19, 53210, 31, 9273, 56, 53210, 68, 9273, 4, 6, 58072, 13, 31929, 43, 58072, 50, 31929, }; vtkDICOMDictionary::Dict Dict218Data = { "GEMS_3D_INTVL_01", 74, 74, Dict218TagHashTable, Dict218KeyHashTable, Dict218Contents }; // ----- Philips Imaging DD 002 ----- const DictEntry Dict219Contents[] = { { 0x2001, 0x0001, 0, VR::US, VM::M1, "" }, { 0x2001, 0x0002, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0013, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0014, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0015, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0016, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0017, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0018, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x0019, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001a, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001b, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001c, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001d, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001e, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x001f, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0020, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0021, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0022, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0023, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0024, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0025, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0026, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0027, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0028, 0, VR::US, VM::M1, "" }, { 0x2001, 0x0029, 0, VR::US, VM::M1, "" }, { 0x2001, 0x002a, 0, VR::US, VM::M1, "" }, { 0x2001, 0x002b, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x002c, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x002d, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x002e, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x002f, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0030, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0031, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0032, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0033, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0034, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0035, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0036, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0037, 0, VR::FD, VM::M1, "" }, { 0x2001, 0x0039, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x003a, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x003b, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x003c, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x003d, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x003e, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x003f, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0040, 0, VR::SS, VM::M1, "" }, { 0x2001, 0x0072, 0, VR::FL, VM::M2, "" }, { 0x2001, 0x0073, 0, VR::FL, VM::M2, "" }, }; const unsigned short Dict219TagHashTable[] = { 50, 53, 56, 59, 62, 65, 68, 71, 74, 49, 77, 80, 83, 86, 89, 92, 95, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 169, 172, 175, 180, 183, 186, 189, 49, 192, 0, 1, 40, 58, 1, 43, 61, 1, 42, 60, 1, 45, 63, 1, 44, 62, 1, 46, 64, 1, 47, 114, 1, 48, 115, 1, 2, 19, 1, 4, 21, 1, 3, 20, 1, 6, 23, 1, 5, 22, 1, 8, 25, 1, 7, 24, 1, 10, 27, 1, 9, 26, 1, 12, 29, 1, 11, 28, 1, 14, 31, 1, 13, 30, 1, 16, 33, 1, 15, 32, 1, 18, 35, 1, 17, 34, 1, 20, 37, 1, 19, 36, 1, 22, 39, 1, 21, 38, 1, 24, 41, 1, 23, 40, 1, 26, 43, 1, 25, 42, 1, 28, 45, 1, 27, 44, 1, 30, 47, 1, 29, 46, 1, 32, 49, 2, 0, 1, 31, 48, 1, 34, 51, 1, 33, 50, 2, 1, 2, 36, 53, 1, 35, 52, 1, 38, 55, 1, 37, 54, 1, 39, 57, 1, 41, 59, }; const unsigned short Dict219KeyHashTable[] = { 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 0, 109, 1, 109, 2, 109, 3, 109, 4, 109, 5, 109, 6, 109, 7, 109, 8, 109, 9, 109, 10, 109, 11, 109, 12, 109, 13, 109, 14, 109, 15, 109, 16, 109, 17, 109, 18, 109, 19, 109, 20, 109, 21, 109, 22, 109, 23, 109, 24, 109, 25, 109, 26, 109, 27, 109, 28, 109, 29, 109, 30, 109, 31, 109, 32, 109, 33, 109, 34, 109, 35, 109, 36, 109, 37, 109, 38, 109, 39, 109, 40, 109, 41, 109, 42, 109, 43, 109, 44, 109, 45, 109, 46, 109, 47, 109, 48, 109, }; vtkDICOMDictionary::Dict Dict219Data = { "Philips Imaging DD 002", 49, 49, Dict219TagHashTable, Dict219KeyHashTable, Dict219Contents }; // ----- KONICA1.0 ----- const DictEntry Dict220Contents[] = { { 0x0031, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0001, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0005, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0009, 0, VR::US, VM::M1, "" }, { 0x0031, 0x000a, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x000b, 0, VR::US, VM::M1, "" }, { 0x0031, 0x000c, 0, VR::US, VM::M1, "" }, { 0x0031, 0x000d, 0, VR::US, VM::M1, "" }, { 0x0031, 0x000e, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0011, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0012, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0013, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0016, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0017, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0018, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0019, 0, VR::US, VM::M1, "" }, { 0x0031, 0x001a, 0, VR::US, VM::M1, "" }, { 0x0031, 0x001b, 0, VR::US, VM::M1, "" }, { 0x0031, 0x001c, 0, VR::US, VM::M1, "" }, { 0x0031, 0x001d, 0, VR::US, VM::M1, "" }, { 0x0031, 0x001e, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0020, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0021, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0022, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0023, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0024, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0025, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0026, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0027, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0028, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0029, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002a, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002b, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002c, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002d, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002e, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x002f, 0, VR::SQ, VM::M1, "" }, { 0x0031, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0033, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0034, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0035, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0036, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0037, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0039, 0, VR::US, VM::M1, "" }, { 0x0031, 0x003a, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x003b, 0, VR::US, VM::M1, "" }, { 0x0031, 0x003c, 0, VR::US, VM::M1, "" }, { 0x0031, 0x003d, 0, VR::US, VM::M1, "" }, { 0x0031, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0031, 0x003f, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0041, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0045, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0047, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0048, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0049, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x004a, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x004b, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x004c, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x004d, 0, VR::US, VM::M1, "" }, { 0x0031, 0x004e, 0, VR::US, VM::M1, "" }, { 0x0031, 0x004f, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0050, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0051, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0053, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0054, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0055, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0056, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0057, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0058, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0059, 0, VR::US, VM::M1, "" }, { 0x0031, 0x005a, 0, VR::US, VM::M1, "" }, { 0x0031, 0x005b, 0, VR::US, VM::M1, "" }, { 0x0031, 0x005c, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0062, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0063, 0, VR::US, VM::M3, "" }, { 0x0031, 0x006b, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0070, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0071, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0073, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0074, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0075, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0077, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0078, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0079, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007a, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007b, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007c, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007d, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007e, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x007f, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0080, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0081, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0082, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0083, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0084, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0085, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0086, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0087, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0088, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0089, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x008a, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x008b, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x008c, 0, VR::US, VM::M1, "" }, { 0x0031, 0x008d, 0, VR::US, VM::M1, "" }, { 0x0031, 0x008e, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x008f, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0090, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0091, 0, VR::US, VM::M1, "" }, { 0x0031, 0x0092, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0093, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0094, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x0095, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00a1, 0, VR::IS, VM::M2, "" }, { 0x0031, 0x00a2, 0, VR::IS, VM::M1, "" }, { 0x0031, 0x00a5, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00a6, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00a7, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00a8, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00aa, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00ab, 0, VR::DA, VM::M1, "" }, { 0x0031, 0x00ac, 0, VR::TM, VM::M1, "" }, { 0x0031, 0x00ad, 0, VR::DA, VM::M1, "" }, { 0x0031, 0x00ae, 0, VR::TM, VM::M1, "" }, { 0x0031, 0x00b0, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b1, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b2, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b3, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b4, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b5, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b6, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00b7, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00b8, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x00b9, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x00ba, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00bc, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00be, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00bf, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00c0, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c1, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c2, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c3, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c4, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c5, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c6, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c7, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c8, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00c9, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00ca, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00cb, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00cc, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00cd, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00ce, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00cf, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00d0, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d1, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d2, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d3, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d4, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00d5, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d6, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00d7, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00d8, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00d9, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x00da, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00db, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00dc, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00dd, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00de, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00df, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00e0, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00e1, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00e2, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00e3, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00e4, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00e5, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00e6, 0, VR::UN, VM::M1, "" }, { 0x0031, 0x00f0, 0, VR::US, VM::M1, "" }, { 0x0031, 0x00ff, 0, VR::SQ, VM::M1, "PrivateDataSequence" }, }; const unsigned short Dict220TagHashTable[] = { 193, 196, 199, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 239, 242, 245, 250, 255, 260, 265, 270, 273, 278, 283, 286, 289, 292, 295, 298, 301, 304, 307, 312, 317, 322, 327, 332, 337, 342, 347, 352, 357, 362, 367, 372, 377, 380, 385, 390, 395, 398, 401, 406, 409, 412, 417, 422, 427, 432, 437, 442, 447, 450, 455, 458, 461, 464, 467, 470, 192, 473, 476, 479, 482, 485, 488, 491, 494, 497, 192, 192, 500, 503, 192, 192, 192, 192, 192, 192, 192, 506, 192, 192, 192, 192, 509, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 192, 192, 192, 548, 551, 554, 192, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 590, 593, 596, 599, 602, 605, 608, 611, 614, 192, 617, 620, 623, 626, 629, 192, 632, 192, 635, 638, 192, 641, 644, 647, 192, 650, 653, 192, 656, 192, 659, 662, 665, 668, 671, 674, 677, 192, 192, 680, 683, 192, 192, 192, 192, 192, 192, 192, 192, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, 731, 0, 1, 43, 49, 1, 42, 48, 2, 45, 51, 190, 240, 1, 44, 50, 1, 47, 53, 1, 46, 52, 1, 49, 55, 1, 48, 54, 1, 51, 57, 1, 50, 56, 1, 53, 59, 1, 52, 58, 1, 55, 61, 2, 54, 60, 191, 255, 1, 57, 63, 1, 56, 62, 2, 27, 33, 185, 226, 2, 26, 32, 186, 227, 2, 29, 35, 183, 224, 2, 28, 34, 184, 225, 2, 31, 37, 189, 230, 1, 30, 36, 2, 33, 39, 187, 228, 2, 32, 38, 188, 229, 1, 35, 41, 1, 34, 40, 1, 37, 43, 1, 36, 42, 1, 39, 45, 1, 38, 44, 1, 41, 47, 1, 40, 46, 2, 12, 17, 169, 210, 2, 11, 16, 170, 211, 2, 14, 19, 167, 208, 2, 13, 18, 168, 209, 2, 16, 21, 173, 214, 2, 15, 20, 174, 215, 2, 18, 23, 171, 212, 2, 17, 22, 172, 213, 2, 20, 25, 177, 218, 2, 19, 24, 178, 219, 2, 22, 27, 175, 216, 2, 21, 26, 176, 217, 2, 24, 29, 181, 222, 2, 23, 28, 182, 223, 1, 179, 220, 2, 25, 30, 180, 221, 2, 1, 1, 153, 194, 2, 0, 0, 154, 195, 1, 151, 192, 1, 152, 193, 2, 2, 5, 157, 198, 1, 158, 199, 1, 155, 196, 2, 3, 6, 156, 197, 2, 5, 9, 161, 202, 2, 4, 8, 162, 203, 2, 7, 11, 159, 200, 2, 6, 10, 160, 201, 2, 9, 13, 165, 206, 2, 8, 12, 166, 207, 1, 163, 204, 2, 10, 14, 164, 205, 1, 89, 112, 1, 90, 113, 1, 91, 114, 1, 92, 115, 1, 93, 116, 1, 94, 117, 1, 95, 119, 1, 96, 120, 1, 97, 121, 1, 98, 122, 1, 99, 123, 1, 100, 124, 1, 101, 125, 1, 102, 126, 1, 103, 127, 1, 86, 98, 1, 87, 99, 1, 88, 107, 1, 73, 80, 1, 74, 81, 1, 75, 82, 1, 76, 83, 1, 77, 84, 1, 78, 85, 1, 79, 86, 1, 80, 87, 1, 81, 88, 1, 82, 89, 1, 83, 90, 1, 84, 91, 1, 85, 92, 1, 58, 64, 1, 59, 65, 1, 60, 66, 1, 61, 68, 1, 62, 69, 1, 63, 70, 1, 64, 71, 1, 65, 72, 1, 66, 73, 1, 67, 74, 1, 68, 75, 1, 69, 76, 1, 70, 77, 1, 71, 78, 1, 72, 79, 1, 140, 179, 1, 139, 178, 1, 138, 177, 1, 137, 176, 1, 144, 183, 1, 143, 182, 1, 142, 181, 1, 141, 180, 1, 147, 186, 1, 146, 185, 1, 145, 184, 1, 150, 191, 1, 149, 190, 1, 148, 188, 1, 127, 162, 1, 126, 161, 1, 130, 167, 1, 129, 166, 1, 128, 165, 1, 133, 171, 1, 132, 170, 1, 131, 168, 1, 136, 174, 1, 135, 173, 1, 134, 172, 1, 123, 147, 1, 122, 146, 1, 121, 145, 1, 120, 144, 1, 125, 149, 1, 124, 148, 1, 107, 131, 1, 106, 130, 1, 105, 129, 1, 104, 128, 1, 111, 135, 1, 110, 134, 1, 109, 133, 1, 108, 132, 1, 115, 139, 1, 114, 138, 1, 113, 137, 1, 112, 136, 1, 119, 143, 1, 118, 142, 1, 117, 141, 1, 116, 140, }; const unsigned short Dict220KeyHashTable[] = { 192, 192, 192, 192, 192, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 576, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 191, 0, 28, 1, 28, 2, 28, 3, 28, 4, 28, 5, 28, 6, 28, 7, 28, 8, 28, 9, 28, 10, 28, 11, 28, 12, 28, 13, 28, 14, 28, 15, 28, 16, 28, 17, 28, 18, 28, 19, 28, 20, 28, 21, 28, 22, 28, 23, 28, 24, 28, 25, 28, 26, 28, 27, 28, 28, 28, 29, 28, 30, 28, 31, 28, 32, 28, 33, 28, 34, 28, 35, 28, 36, 28, 37, 28, 38, 28, 39, 28, 40, 28, 41, 28, 42, 28, 43, 28, 44, 28, 45, 28, 46, 28, 47, 28, 48, 28, 49, 28, 50, 28, 51, 28, 52, 28, 53, 28, 54, 28, 55, 28, 56, 28, 57, 28, 58, 28, 59, 28, 60, 28, 61, 28, 62, 28, 63, 28, 64, 28, 65, 28, 66, 28, 67, 28, 68, 28, 69, 28, 70, 28, 71, 28, 72, 28, 73, 28, 74, 28, 75, 28, 76, 28, 77, 28, 78, 28, 79, 28, 80, 28, 81, 28, 82, 28, 83, 28, 84, 28, 85, 28, 86, 28, 87, 28, 88, 28, 89, 28, 90, 28, 91, 28, 92, 28, 93, 28, 94, 28, 95, 28, 96, 28, 97, 28, 98, 28, 99, 28, 100, 28, 101, 28, 102, 28, 103, 28, 104, 28, 105, 28, 106, 28, 107, 28, 108, 28, 109, 28, 110, 28, 111, 28, 112, 28, 113, 28, 114, 28, 115, 28, 116, 28, 117, 28, 118, 28, 119, 28, 120, 28, 121, 28, 122, 28, 123, 28, 124, 28, 125, 28, 126, 28, 127, 28, 128, 28, 129, 28, 130, 28, 131, 28, 132, 28, 133, 28, 134, 28, 135, 28, 136, 28, 137, 28, 138, 28, 139, 28, 140, 28, 141, 28, 142, 28, 143, 28, 144, 28, 145, 28, 146, 28, 147, 28, 148, 28, 149, 28, 150, 28, 151, 28, 152, 28, 153, 28, 154, 28, 155, 28, 156, 28, 157, 28, 158, 28, 159, 28, 160, 28, 161, 28, 162, 28, 163, 28, 164, 28, 165, 28, 166, 28, 167, 28, 168, 28, 169, 28, 170, 28, 171, 28, 172, 28, 173, 28, 174, 28, 175, 28, 176, 28, 177, 28, 178, 28, 179, 28, 180, 28, 181, 28, 182, 28, 183, 28, 184, 28, 185, 28, 186, 28, 187, 28, 188, 28, 189, 28, 190, 28, 1, 191, 5825, }; vtkDICOMDictionary::Dict Dict220Data = { "KONICA1.0", 192, 192, Dict220TagHashTable, Dict220KeyHashTable, Dict220Contents }; // ----- Applicare/Centricity Radiology Web/Version 1.0 ----- const DictEntry Dict221Contents[] = { { 0x4109, 0x0001, 0, VR::SH, VM::M1, "MammographyLaterality" }, { 0x4109, 0x0002, 0, VR::SH, VM::M1, "MammographyViewName" }, { 0x4109, 0x0003, 0, VR::SH, VM::M1, "MammographyViewModifier" }, }; const unsigned short Dict221TagHashTable[] = { 4, 7, 3, 0, 1, 2, 3, 2, 0, 1, 1, 2, }; const unsigned short Dict221KeyHashTable[] = { 4, 9, 3, 0, 2, 1, 5633, 2, 59419, 1, 0, 24043, }; vtkDICOMDictionary::Dict Dict221Data = { "Applicare/Centricity Radiology Web/Version 1.0", 3, 3, Dict221TagHashTable, Dict221KeyHashTable, Dict221Contents }; // ----- SIEMENS Ultrasound S2000 ----- const DictEntry Dict222Contents[] = { { 0x0021, 0x0000, 0, VR::US, VM::M1, "NipplePosition" }, { 0x0021, 0x0001, 0, VR::US, VM::M1, "ABVSClipDerivedFromVolume" }, }; const unsigned short Dict222TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict222KeyHashTable[] = { 3, 2, 0, 2, 0, 64705, 1, 21012, }; vtkDICOMDictionary::Dict Dict222Data = { "SIEMENS Ultrasound S2000", 2, 2, Dict222TagHashTable, Dict222KeyHashTable, Dict222Contents }; // ----- 1.2.840.113708.794.1.1.2.0 ----- const DictEntry Dict223Contents[] = { { 0x0087, 0x0010, 0, VR::CS, VM::M1, "MediaType" }, { 0x0087, 0x0020, 0, VR::CS, VM::M1, "MediaLocation" }, { 0x0087, 0x0030, 0, VR::ST, VM::M1, "StorageFileID" }, { 0x0087, 0x0040, 0, VR::DS, VM::M1, "StudyOrImageSizeInMB" }, { 0x0087, 0x0050, 0, VR::IS, VM::M1, "EstimatedRetrieveTime" }, }; const unsigned short Dict223TagHashTable[] = { 6, 9, 14, 5, 17, 0, 1, 1, 32, 2, 2, 48, 3, 64, 1, 4, 80, 1, 0, 16, }; const unsigned short Dict223KeyHashTable[] = { 6, 5, 13, 5, 5, 0, 3, 0, 43643, 1, 27878, 4, 54482, 2, 2, 32513, 3, 1965, }; vtkDICOMDictionary::Dict Dict223Data = { "1.2.840.113708.794.1.1.2.0", 5, 5, Dict223TagHashTable, Dict223KeyHashTable, Dict223Contents }; // ----- TOSHIBA MDW HEADER ----- const DictEntry Dict224Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "ImageHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "ImageHeaderVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "ImageHeaderInfo" }, { 0x0029, 0x0018, 0, VR::CS, VM::M1, "SeriesHeaderType" }, { 0x0029, 0x0019, 0, VR::LO, VM::M1, "SeriesHeaderVersion" }, { 0x0029, 0x0020, 0, VR::OB, VM::M1, "SeriesHeaderInfo" }, }; const unsigned short Dict224TagHashTable[] = { 7, 10, 13, 16, 6, 6, 0, 1, 4, 25, 1, 3, 24, 1, 1, 9, 3, 0, 8, 2, 16, 5, 32, }; const unsigned short Dict224KeyHashTable[] = { 6, 7, 6, 10, 6, 15, 0, 1, 2, 58538, 2, 0, 60936, 5, 16923, 3, 1, 43859, 3, 19321, 4, 3567, }; vtkDICOMDictionary::Dict Dict224Data = { "TOSHIBA MDW HEADER", 6, 6, Dict224TagHashTable, Dict224KeyHashTable, Dict224Contents }; // ----- GEMS_IQTB_IDEN_47 ----- const DictEntry Dict225Contents[] = { { 0x0047, 0x0002, 0, VR::UL, VM::M1, "" }, }; const unsigned short Dict225TagHashTable[] = { 2, 0, 1, 0, 2, }; const unsigned short Dict225KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict225Data = { "GEMS_IQTB_IDEN_47", 1, 1, Dict225TagHashTable, Dict225KeyHashTable, Dict225Contents }; // ----- GEMS_ACQU_01 ----- const DictEntry Dict226Contents[] = { { 0x0009, 0x0024, 0, VR::DS, VM::M1, "" }, { 0x0009, 0x0025, 0, VR::US, VM::M1, "" }, { 0x0009, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0009, 0x003f, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0043, 0, VR::US, VM::M1, "" }, { 0x0009, 0x00f8, 0, VR::US, VM::M1, "" }, { 0x0009, 0x00fb, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::SL, VM::M1, "NumberOfCellsInDetector" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "CellNumberAtTheta" }, { 0x0019, 0x0004, 0, VR::DS, VM::M1, "CellSpacing" }, { 0x0019, 0x0005, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x000e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000f, 0, VR::DS, VM::M1, "HorizontalFrameOfReference" }, { 0x0019, 0x0011, 0, VR::SS, VM::M1, "SeriesContrast" }, { 0x0019, 0x0012, 0, VR::SS, VM::M1, "LastPseq" }, { 0x0019, 0x0013, 0, VR::SS, VM::M1, "StartNumberForBaseline" }, { 0x0019, 0x0014, 0, VR::SS, VM::M1, "EndNumberForBaseline" }, { 0x0019, 0x0015, 0, VR::SS, VM::M1, "StartNumberForEnhancedScans" }, { 0x0019, 0x0016, 0, VR::SS, VM::M1, "EndNumberForEnhancedScans" }, { 0x0019, 0x0017, 0, VR::SS, VM::M1, "SeriesPlane" }, { 0x0019, 0x0018, 0, VR::LO, VM::M1, "FirstScanRAS" }, { 0x0019, 0x0019, 0, VR::DS, VM::M1, "FirstScanLocation" }, { 0x0019, 0x001a, 0, VR::LO, VM::M1, "LastScanRAS" }, { 0x0019, 0x001b, 0, VR::DS, VM::M1, "LastScanLocation" }, { 0x0019, 0x001e, 0, VR::DS, VM::M1, "DisplayFieldOfView" }, { 0x0019, 0x0020, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0023, 0, VR::DS, VM::M1, "TableSpeed" }, { 0x0019, 0x0024, 0, VR::DS, VM::M1, "MidScanTime" }, { 0x0019, 0x0025, 0, VR::SS, VM::M1, "MidScanFlag" }, { 0x0019, 0x0026, 0, VR::SL, VM::M1, "TubeAzimuth" }, { 0x0019, 0x0027, 0, VR::DS, VM::M1, "RotationSpeed" }, { 0x0019, 0x002a, 0, VR::DS, VM::M1, "XrayOnPosition" }, { 0x0019, 0x002b, 0, VR::DS, VM::M1, "XrayOffPosition" }, { 0x0019, 0x002c, 0, VR::SL, VM::M1, "NumberOfTriggers" }, { 0x0019, 0x002d, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::DS, VM::M1, "AngleOfFirstView" }, { 0x0019, 0x002f, 0, VR::DS, VM::M1, "TriggerFrequency" }, { 0x0019, 0x0039, 0, VR::SS, VM::M1, "ScanFOVType" }, { 0x0019, 0x003a, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x003b, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x003c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x003e, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x003f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::SS, VM::M1, "StatReconFlag" }, { 0x0019, 0x0041, 0, VR::SS, VM::M1, "ComputeType" }, { 0x0019, 0x0042, 0, VR::SS, VM::M1, "SegmentNumber" }, { 0x0019, 0x0043, 0, VR::SS, VM::M1, "TotalSegmentsRequired" }, { 0x0019, 0x0044, 0, VR::DS, VM::M1, "InterscanDelay" }, { 0x0019, 0x0047, 0, VR::SS, VM::M1, "ViewCompressionFactor" }, { 0x0019, 0x0048, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0049, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004a, 0, VR::SS, VM::M1, "TotalNumberOfRefChannels" }, { 0x0019, 0x004b, 0, VR::SL, VM::M1, "DataSizeForScanData" }, { 0x0019, 0x0052, 0, VR::SS, VM::M1, "ReconPostProcessingFlag" }, { 0x0019, 0x0054, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0057, 0, VR::SS, VM::M1, "CTWaterNumber" }, { 0x0019, 0x0058, 0, VR::SS, VM::M1, "CTBoneNumber" }, { 0x0019, 0x005a, 0, VR::FL, VM::M1, "AcquisitionDuration" }, { 0x0019, 0x005d, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005e, 0, VR::SL, VM::M1, "NumberOfChannels1To512" }, { 0x0019, 0x005f, 0, VR::SL, VM::M1, "IncrementBetweenChannels" }, { 0x0019, 0x0060, 0, VR::SL, VM::M1, "StartingView" }, { 0x0019, 0x0061, 0, VR::SL, VM::M1, "NumberOfViews" }, { 0x0019, 0x0062, 0, VR::SL, VM::M1, "IncrementBetweenViews" }, { 0x0019, 0x006a, 0, VR::SS, VM::M1, "DependantOnNumberOfViewsProcessed" }, { 0x0019, 0x006b, 0, VR::SS, VM::M1, "FieldOfViewInDetectorCells" }, { 0x0019, 0x0070, 0, VR::SS, VM::M1, "ValueOfBackProjectionButton" }, { 0x0019, 0x0071, 0, VR::SS, VM::M1, "SetIfFatqEstimatesWereUsed" }, { 0x0019, 0x0072, 0, VR::DS, VM::M1, "ZChannelAvgOverViews" }, { 0x0019, 0x0073, 0, VR::DS, VM::M1, "AvgOfLeftRefChannelsOverViews" }, { 0x0019, 0x0074, 0, VR::DS, VM::M1, "MaxLeftChannelOverViews" }, { 0x0019, 0x0075, 0, VR::DS, VM::M1, "AvgOfRightRefChannelsOverViews" }, { 0x0019, 0x0076, 0, VR::DS, VM::M1, "MaxRightChannelOverViews" }, { 0x0019, 0x007d, 0, VR::DS, VM::M1, "SecondEcho" }, { 0x0019, 0x007e, 0, VR::SS, VM::M1, "NumberOfEchos" }, { 0x0019, 0x007f, 0, VR::DS, VM::M1, "TableDelta" }, { 0x0019, 0x0081, 0, VR::SS, VM::M1, "Contiguous" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0084, 0, VR::DS, VM::M1, "PeakSAR" }, { 0x0019, 0x0085, 0, VR::SS, VM::M1, "MonitorSAR" }, { 0x0019, 0x0086, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetitionTime" }, { 0x0019, 0x0088, 0, VR::SS, VM::M1, "ImagesPerCardiacCycle" }, { 0x0019, 0x008a, 0, VR::SS, VM::M1, "ActualReceiveGainAnalog" }, { 0x0019, 0x008b, 0, VR::SS, VM::M1, "ActualReceiveGainDigital" }, { 0x0019, 0x008d, 0, VR::DS, VM::M1, "DelayAfterTrigger" }, { 0x0019, 0x008f, 0, VR::SS, VM::M1, "SwapPhaseFrequency" }, { 0x0019, 0x0090, 0, VR::SS, VM::M1, "PauseInterval" }, { 0x0019, 0x0091, 0, VR::DS, VM::M1, "PauseTime" }, { 0x0019, 0x0092, 0, VR::SL, VM::M1, "SliceOffsetOnFrequencyAxis" }, { 0x0019, 0x0093, 0, VR::DS, VM::M1, "AutoPrescanCenterFrequency" }, { 0x0019, 0x0094, 0, VR::SS, VM::M1, "AutoPrescanTransmitGain" }, { 0x0019, 0x0095, 0, VR::SS, VM::M1, "AutoPrescanAnalogReceiverGain" }, { 0x0019, 0x0096, 0, VR::SS, VM::M1, "AutoPrescanDigitalReceiverGain" }, { 0x0019, 0x0097, 0, VR::SL, VM::M1, "BitmapDefiningCVs" }, { 0x0019, 0x0098, 0, VR::SS, VM::M1, "CenterFrequencyMethod" }, { 0x0019, 0x0099, 0, VR::US, VM::M1, "" }, { 0x0019, 0x009b, 0, VR::SS, VM::M1, "PulseSequenceMode" }, { 0x0019, 0x009c, 0, VR::LO, VM::M1, "PulseSequenceName" }, { 0x0019, 0x009d, 0, VR::DT, VM::M1, "PulseSequenceDate" }, { 0x0019, 0x009e, 0, VR::LO, VM::M1, "InternalPulseSequenceName" }, { 0x0019, 0x009f, 0, VR::SS, VM::M1, "TransmittingCoil" }, { 0x0019, 0x00a0, 0, VR::SS, VM::M1, "SurfaceCoilType" }, { 0x0019, 0x00a1, 0, VR::SS, VM::M1, "ExtremityCoilFlag" }, { 0x0019, 0x00a2, 0, VR::SL, VM::M1, "RawDataRunNumber" }, { 0x0019, 0x00a3, 0, VR::UL, VM::M1, "CalibratedFieldStrength" }, { 0x0019, 0x00a4, 0, VR::SS, VM::M1, "SATFatWaterBone" }, { 0x0019, 0x00a5, 0, VR::DS, VM::M1, "ReceiveBandwidth" }, { 0x0019, 0x00a7, 0, VR::DS, VM::M1, "UserData0" }, { 0x0019, 0x00a8, 0, VR::DS, VM::M1, "UserData1" }, { 0x0019, 0x00a9, 0, VR::DS, VM::M1, "UserData2" }, { 0x0019, 0x00aa, 0, VR::DS, VM::M1, "UserData3" }, { 0x0019, 0x00ab, 0, VR::DS, VM::M1, "UserData4" }, { 0x0019, 0x00ac, 0, VR::DS, VM::M1, "UserData5" }, { 0x0019, 0x00ad, 0, VR::DS, VM::M1, "UserData6" }, { 0x0019, 0x00ae, 0, VR::DS, VM::M1, "UserData7" }, { 0x0019, 0x00af, 0, VR::DS, VM::M1, "UserData8" }, { 0x0019, 0x00b0, 0, VR::DS, VM::M1, "UserData9" }, { 0x0019, 0x00b1, 0, VR::DS, VM::M1, "UserData10" }, { 0x0019, 0x00b2, 0, VR::DS, VM::M1, "UserData11" }, { 0x0019, 0x00b3, 0, VR::DS, VM::M1, "UserData12" }, { 0x0019, 0x00b4, 0, VR::DS, VM::M1, "UserData13" }, { 0x0019, 0x00b5, 0, VR::DS, VM::M1, "UserData14" }, { 0x0019, 0x00b6, 0, VR::DS, VM::M1, "UserData15" }, { 0x0019, 0x00b7, 0, VR::DS, VM::M1, "UserData16" }, { 0x0019, 0x00b8, 0, VR::DS, VM::M1, "UserData17" }, { 0x0019, 0x00b9, 0, VR::DS, VM::M1, "UserData18" }, { 0x0019, 0x00ba, 0, VR::DS, VM::M1, "UserData19" }, { 0x0019, 0x00bb, 0, VR::DS, VM::M1, "UserData20" }, { 0x0019, 0x00bc, 0, VR::DS, VM::M1, "UserData21" }, { 0x0019, 0x00bd, 0, VR::DS, VM::M1, "UserData22" }, { 0x0019, 0x00be, 0, VR::DS, VM::M1, "ProjectionAngle" }, { 0x0019, 0x00c0, 0, VR::SS, VM::M1, "SaturationPlanes" }, { 0x0019, 0x00c1, 0, VR::SS, VM::M1, "SurfaceCoilIntensityCorrectionFlag" }, { 0x0019, 0x00c2, 0, VR::SS, VM::M1, "SATLocationR" }, { 0x0019, 0x00c3, 0, VR::SS, VM::M1, "SATLocationL" }, { 0x0019, 0x00c4, 0, VR::SS, VM::M1, "SATLocationA" }, { 0x0019, 0x00c5, 0, VR::SS, VM::M1, "SATLocationP" }, { 0x0019, 0x00c6, 0, VR::SS, VM::M1, "SATLocationH" }, { 0x0019, 0x00c7, 0, VR::SS, VM::M1, "SATLocationF" }, { 0x0019, 0x00c8, 0, VR::SS, VM::M1, "SATThicknessRL" }, { 0x0019, 0x00c9, 0, VR::SS, VM::M1, "SATThicknessAP" }, { 0x0019, 0x00ca, 0, VR::SS, VM::M1, "SATThicknessHF" }, { 0x0019, 0x00cb, 0, VR::SS, VM::M1, "PhaseContrastFlowAxis" }, { 0x0019, 0x00cc, 0, VR::SS, VM::M1, "VelocityEncoding" }, { 0x0019, 0x00cd, 0, VR::SS, VM::M1, "ThicknessDisclaimer" }, { 0x0019, 0x00ce, 0, VR::SS, VM::M1, "PrescanType" }, { 0x0019, 0x00cf, 0, VR::SS, VM::M1, "PrescanStatus" }, { 0x0019, 0x00d0, 0, VR::SH, VM::M1, "RawDataType" }, { 0x0019, 0x00d2, 0, VR::SS, VM::M1, "ProjectionAlgorithm" }, { 0x0019, 0x00d3, 0, VR::SH, VM::M1, "ProjectionAlgorithmName" }, { 0x0019, 0x00d4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00d5, 0, VR::SS, VM::M1, "FractionalEcho" }, { 0x0019, 0x00d6, 0, VR::SS, VM::M1, "PrepPulse" }, { 0x0019, 0x00d7, 0, VR::SS, VM::M1, "CardiacPhases" }, { 0x0019, 0x00d8, 0, VR::SS, VM::M1, "VariableEchoFlag" }, { 0x0019, 0x00d9, 0, VR::DS, VM::M1, "ConcatenatedSatOrDTIDiffusionDirection" }, { 0x0019, 0x00da, 0, VR::SS, VM::M1, "ReferenceChannelUsed" }, { 0x0019, 0x00db, 0, VR::DS, VM::M1, "BackProjectorCoefficient" }, { 0x0019, 0x00dc, 0, VR::SS, VM::M1, "PrimarySpeedCorrectionUsed" }, { 0x0019, 0x00dd, 0, VR::SS, VM::M1, "OverrangeCorrectionUsed" }, { 0x0019, 0x00de, 0, VR::DS, VM::M1, "DynamicZAlphaValue" }, { 0x0019, 0x00df, 0, VR::DS, VM::M1, "UserData23" }, { 0x0019, 0x00e0, 0, VR::DS, VM::M1, "UserData24" }, { 0x0019, 0x00e1, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00e2, 0, VR::DS, VM::M1, "VelocityEncodeScale" }, { 0x0019, 0x00e3, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x00e4, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x00e5, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00e6, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00e8, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00e9, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00eb, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00ec, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00f0, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00f1, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x00f2, 0, VR::SS, VM::M1, "FastPhases" }, { 0x0019, 0x00f3, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x00f4, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x00f9, 0, VR::DS, VM::M1, "TransmitGain" }, }; const unsigned short Dict226TagHashTable[] = { 186, 191, 196, 201, 185, 206, 209, 212, 217, 222, 225, 230, 235, 240, 245, 250, 255, 258, 185, 261, 264, 267, 270, 275, 280, 285, 288, 293, 298, 303, 308, 311, 316, 321, 324, 329, 334, 337, 342, 347, 185, 185, 350, 185, 353, 356, 185, 359, 362, 365, 368, 373, 376, 379, 384, 389, 394, 399, 406, 411, 414, 417, 422, 425, 430, 435, 438, 443, 185, 446, 451, 456, 185, 185, 459, 464, 467, 185, 185, 470, 473, 476, 479, 482, 185, 185, 185, 185, 485, 488, 491, 494, 497, 185, 185, 500, 185, 185, 185, 185, 185, 503, 506, 509, 512, 515, 518, 521, 524, 527, 530, 185, 185, 185, 533, 536, 185, 185, 185, 185, 539, 542, 545, 185, 185, 185, 185, 185, 548, 185, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 590, 593, 596, 185, 599, 602, 185, 605, 185, 608, 611, 614, 185, 617, 620, 623, 626, 629, 632, 635, 638, 185, 641, 644, 647, 650, 653, 656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, 695, 698, 0, 2, 24, 25, 109, 162, 2, 23, 24, 108, 161, 2, 26, 27, 107, 160, 2, 25, 26, 113, 167, 1, 112, 165, 1, 111, 164, 2, 27, 30, 162, 218, 2, 16, 17, 163, 219, 1, 160, 216, 2, 18, 19, 161, 217, 2, 17, 18, 166, 222, 2, 20, 21, 167, 223, 2, 19, 20, 164, 220, 2, 22, 23, 165, 221, 2, 21, 22, 154, 210, 1, 155, 211, 1, 153, 208, 1, 158, 214, 1, 159, 215, 1, 156, 212, 2, 15, 15, 157, 213, 2, 14, 14, 147, 202, 2, 8, 1, 148, 203, 1, 145, 200, 2, 10, 3, 146, 201, 2, 9, 2, 151, 206, 2, 12, 5, 152, 207, 2, 11, 4, 149, 204, 1, 150, 205, 2, 13, 6, 139, 194, 2, 41, 57, 140, 195, 1, 137, 192, 2, 43, 59, 138, 193, 2, 42, 58, 143, 198, 1, 144, 199, 2, 44, 60, 141, 196, 2, 46, 63, 142, 197, 1, 45, 62, 1, 184, 249, 1, 1, 37, 1, 0, 36, 1, 181, 242, 1, 182, 243, 1, 179, 240, 2, 36, 43, 180, 241, 1, 35, 42, 1, 38, 45, 2, 37, 44, 183, 244, 2, 3, 63, 40, 47, 2, 2, 62, 39, 46, 2, 7, 251, 177, 235, 3, 6, 248, 28, 32, 175, 232, 2, 30, 35, 176, 233, 1, 29, 34, 1, 32, 37, 2, 31, 36, 178, 236, 1, 34, 39, 2, 33, 38, 170, 226, 2, 60, 88, 171, 227, 1, 168, 224, 2, 61, 90, 169, 225, 1, 174, 230, 2, 62, 93, 172, 228, 2, 63, 94, 173, 229, 1, 64, 95, 2, 4, 66, 57, 82, 1, 5, 67, 1, 58, 84, 1, 59, 87, 1, 53, 72, 1, 54, 73, 1, 55, 74, 1, 56, 75, 1, 47, 64, 1, 48, 65, 1, 49, 66, 1, 50, 67, 1, 51, 68, 1, 52, 71, 1, 77, 125, 1, 78, 126, 1, 79, 127, 1, 70, 112, 1, 71, 113, 1, 72, 114, 1, 73, 115, 1, 74, 116, 1, 75, 117, 1, 76, 118, 1, 68, 106, 1, 69, 107, 1, 65, 96, 1, 66, 97, 1, 67, 98, 1, 102, 155, 1, 101, 153, 1, 100, 152, 1, 106, 159, 1, 105, 158, 1, 104, 157, 1, 103, 156, 1, 95, 147, 1, 94, 146, 1, 93, 145, 1, 92, 144, 1, 99, 151, 1, 98, 150, 1, 97, 149, 1, 96, 148, 1, 89, 139, 1, 88, 138, 1, 87, 136, 1, 91, 143, 1, 90, 141, 1, 82, 131, 1, 81, 130, 1, 80, 129, 1, 86, 135, 1, 85, 134, 1, 84, 133, 1, 83, 132, 1, 133, 187, 1, 132, 186, 1, 131, 185, 1, 130, 184, 1, 136, 190, 1, 135, 189, 1, 134, 188, 1, 125, 179, 1, 124, 178, 1, 123, 177, 1, 122, 176, 1, 129, 183, 1, 128, 182, 1, 127, 181, 1, 126, 180, 1, 117, 171, 1, 116, 170, 1, 115, 169, 1, 114, 168, 1, 121, 175, 1, 120, 174, 1, 119, 173, 1, 118, 172, 1, 110, 163, }; const unsigned short Dict226KeyHashTable[] = { 185, 185, 185, 186, 185, 185, 185, 189, 185, 185, 185, 194, 199, 185, 202, 205, 208, 185, 185, 295, 298, 185, 301, 185, 304, 185, 307, 312, 315, 318, 323, 328, 335, 338, 341, 346, 351, 356, 185, 185, 185, 185, 361, 364, 185, 367, 370, 185, 373, 185, 376, 379, 185, 185, 384, 185, 185, 185, 389, 185, 392, 185, 185, 395, 398, 185, 185, 185, 401, 404, 185, 185, 185, 185, 185, 407, 185, 410, 185, 185, 415, 418, 185, 423, 185, 185, 428, 185, 431, 185, 436, 439, 185, 442, 445, 185, 448, 185, 453, 456, 459, 185, 185, 464, 185, 185, 467, 470, 473, 185, 185, 185, 478, 481, 484, 185, 489, 494, 499, 506, 509, 514, 519, 524, 527, 530, 185, 535, 538, 185, 541, 185, 546, 185, 549, 552, 555, 185, 558, 185, 565, 570, 573, 580, 185, 185, 583, 185, 185, 586, 593, 596, 603, 606, 185, 185, 609, 612, 185, 617, 185, 185, 185, 185, 185, 185, 620, 185, 185, 185, 623, 185, 626, 629, 634, 185, 637, 640, 645, 185, 185, 648, 651, 185, 185, 0, 1, 152, 32418, 2, 71, 42680, 106, 2801, 2, 76, 37961, 79, 50732, 1, 60, 29957, 1, 91, 60157, 1, 36, 51610, 43, 0, 29, 1, 29, 2, 29, 3, 29, 4, 29, 5, 29, 6, 29, 7, 29, 8, 29, 12, 29, 13, 29, 14, 29, 28, 29, 29, 29, 38, 29, 42, 29, 43, 29, 44, 29, 45, 29, 46, 29, 53, 29, 54, 29, 55, 47520, 58, 29, 62, 29, 81, 29, 82, 29, 85, 29, 101, 29, 156, 29, 169, 29, 171, 29, 172, 29, 173, 29, 174, 29, 175, 29, 176, 29, 177, 29, 178, 29, 179, 29, 180, 29, 182, 29, 183, 29, 1, 17, 10519, 1, 33, 40187, 1, 157, 31609, 1, 57, 42985, 2, 96, 21353, 184, 50492, 1, 113, 38411, 1, 114, 38411, 2, 115, 38411, 170, 31829, 2, 109, 1649, 116, 38411, 3, 47, 4683, 102, 40149, 117, 38411, 1, 118, 38411, 1, 119, 38411, 2, 120, 38411, 158, 30843, 2, 10, 43718, 121, 38411, 2, 16, 23082, 122, 38411, 2, 24, 18294, 52, 65068, 1, 56, 48006, 1, 89, 10804, 1, 20, 25060, 1, 94, 53410, 1, 161, 33360, 1, 40, 8513, 2, 41, 29924, 70, 50718, 2, 100, 52987, 151, 11269, 1, 111, 17405, 1, 104, 38321, 1, 80, 6886, 1, 149, 36147, 1, 108, 6997, 1, 73, 19929, 1, 51, 44368, 2, 68, 48636, 92, 39219, 1, 166, 17839, 2, 99, 60073, 146, 56801, 2, 145, 56804, 163, 61322, 1, 112, 56159, 2, 66, 52961, 86, 41174, 1, 26, 14661, 1, 59, 20661, 1, 27, 10146, 1, 48, 8278, 2, 39, 30340, 162, 23598, 1, 18, 11748, 1, 21, 43727, 2, 75, 21229, 110, 14679, 1, 69, 32166, 1, 64, 12486, 1, 154, 9518, 2, 37, 56462, 74, 45781, 1, 136, 44353, 1, 107, 56726, 2, 35, 48529, 103, 40262, 2, 19, 22387, 123, 55683, 2, 124, 55683, 147, 56802, 3, 15, 28424, 63, 44429, 125, 55683, 1, 126, 55683, 2, 34, 43358, 127, 55683, 2, 87, 56384, 128, 55683, 2, 78, 8371, 129, 55683, 1, 130, 55683, 1, 131, 55683, 2, 132, 55683, 141, 29050, 1, 23, 55937, 1, 77, 34624, 2, 105, 26299, 144, 29050, 1, 143, 29050, 1, 153, 46317, 1, 83, 27277, 1, 140, 29050, 3, 9, 28389, 30, 17908, 150, 61380, 2, 50, 25668, 142, 29050, 1, 25, 30895, 3, 90, 51852, 97, 28114, 139, 29050, 1, 88, 8196, 1, 137, 21504, 3, 65, 9967, 133, 55683, 181, 44754, 1, 134, 55683, 3, 135, 55683, 159, 9889, 165, 62464, 1, 167, 55683, 1, 168, 55683, 1, 95, 6793, 2, 138, 33497, 160, 60639, 1, 98, 25733, 1, 93, 8524, 1, 61, 31930, 1, 49, 2333, 2, 22, 5387, 155, 29573, 1, 67, 58900, 1, 84, 21563, 2, 32, 13685, 148, 56608, 1, 72, 54014, 1, 164, 45150, 2, 11, 54484, 31, 16389, }; vtkDICOMDictionary::Dict Dict226Data = { "GEMS_ACQU_01", 185, 185, Dict226TagHashTable, Dict226KeyHashTable, Dict226Contents }; // ----- GEMS_IT_US_REPORT ----- const DictEntry Dict227Contents[] = { { 0x0045, 0x0111, 0, VR::OW, VM::M1, "VividExcelFile" }, { 0x0045, 0x0112, 0, VR::OW, VM::M1, "VividCHMFile" }, { 0x0045, 0x0113, 0, VR::OW, VM::M1, "VividPDFFile" }, }; const unsigned short Dict227TagHashTable[] = { 4, 7, 10, 0, 1, 2, 275, 1, 0, 273, 1, 1, 274, }; const unsigned short Dict227KeyHashTable[] = { 4, 7, 3, 0, 1, 2, 55563, 2, 0, 34973, 1, 60362, }; vtkDICOMDictionary::Dict Dict227Data = { "GEMS_IT_US_REPORT", 3, 3, Dict227TagHashTable, Dict227KeyHashTable, Dict227Contents }; // ----- SCHICK TECHNOLOGIES - Change List Creator ID ----- const DictEntry Dict228Contents[] = { { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict228TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict228KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict228Data = { "SCHICK TECHNOLOGIES - Change List Creator ID", 2, 2, Dict228TagHashTable, Dict228KeyHashTable, Dict228Contents }; // ----- astm.org/diconde/iod/NdeCtDetector ----- const DictEntry Dict229Contents[] = { { 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" }, { 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" }, { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" }, { 0x0009, 0x0022, 0, VR::DS, VM::M1, "SensorName" }, { 0x0009, 0x0024, 0, VR::DS, VM::M1, "HorizontalOffsetOfSensor" }, { 0x0009, 0x0026, 0, VR::DS, VM::M1, "VerticalOffsetOfSensor" }, { 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" }, }; const unsigned short Dict229TagHashTable[] = { 7, 8, 7, 11, 7, 16, 21, 0, 1, 3, 34, 2, 0, 17, 4, 36, 2, 5, 38, 6, 40, 2, 1, 18, 2, 32, }; const unsigned short Dict229KeyHashTable[] = { 8, 7, 13, 16, 7, 19, 24, 0, 2, 0, 20186, 6, 21387, 1, 3, 20978, 1, 5, 52094, 2, 1, 53765, 2, 8567, 1, 4, 7561, }; vtkDICOMDictionary::Dict Dict229Data = { "astm.org/diconde/iod/NdeCtDetector", 7, 7, Dict229TagHashTable, Dict229KeyHashTable, Dict229Contents }; // ----- DLX_PATNT_01 ----- const DictEntry Dict230Contents[] = { { 0x0011, 0x0001, 0, VR::LT, VM::M1, "PatientDOB" }, }; const unsigned short Dict230TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict230KeyHashTable[] = { 2, 0, 1, 0, 49839, }; vtkDICOMDictionary::Dict Dict230Data = { "DLX_PATNT_01", 1, 1, Dict230TagHashTable, Dict230KeyHashTable, Dict230Contents }; // ----- MEDIFACE ----- const DictEntry Dict231Contents[] = { { 0x0029, 0x0001, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0022, 0, VR::DS, VM::M2, "" }, { 0x0029, 0x0030, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict231TagHashTable[] = { 8, 11, 16, 7, 19, 24, 7, 0, 1, 2, 17, 2, 1, 16, 4, 33, 1, 3, 32, 2, 5, 34, 6, 48, 1, 0, 1, }; const unsigned short Dict231KeyHashTable[] = { 7, 7, 7, 7, 7, 8, 7, 0, 7, 0, 768, 1, 768, 2, 768, 3, 768, 4, 768, 5, 768, 6, 768, }; vtkDICOMDictionary::Dict Dict231Data = { "MEDIFACE", 7, 7, Dict231TagHashTable, Dict231KeyHashTable, Dict231Contents }; // ----- MITRA OBJECT ATTRIBUTES 1.0 ----- const DictEntry Dict232Contents[] = { { 0x0033, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x0004, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x0033, 0x000a, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict232TagHashTable[] = { 6, 5, 9, 12, 15, 0, 1, 1, 4, 1, 4, 10, 1, 2, 6, 2, 0, 2, 3, 8, }; const unsigned short Dict232KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict232Data = { "MITRA OBJECT ATTRIBUTES 1.0", 5, 5, Dict232TagHashTable, Dict232KeyHashTable, Dict232Contents }; // ----- SIEMENS MR DATAMAPPING ATTRIBUTES ----- const DictEntry Dict233Contents[] = { { 0x0011, 0x0001, 0, VR::ST, VM::M1, "ReprocessingInfo" }, { 0x0011, 0x0002, 0, VR::CS, VM::M1TN, "DataRoleType" }, { 0x0011, 0x0003, 0, VR::ST, VM::M1, "DataRoleName" }, { 0x0011, 0x0004, 0, VR::SL, VM::M1, "RescanName" }, { 0x0011, 0x0005, 0, VR::FD, VM::M1, "" }, { 0x0011, 0x0006, 0, VR::ST, VM::M1, "CardiacTypeName" }, { 0x0011, 0x0007, 0, VR::ST, VM::M1, "CardiacTypeNameL2" }, { 0x0011, 0x0008, 0, VR::ST, VM::M1, "MiscIndicator" }, { 0x0011, 0x0009, 0, VR::SL, VM::M1, "" }, { 0x0011, 0x000A, 0, VR::SL, VM::M1, "" }, { 0x0011, 0x000B, 0, VR::DS, VM::M1, "" }, { 0x0011, 0x000C, 0, VR::ST, VM::M1, "SplitBaggingName" }, { 0x0011, 0x000D, 0, VR::ST, VM::M1, "SplitSubBaggingName" }, { 0x0011, 0x000E, 0, VR::ST, VM::M1, "StageSubBaggingName" }, { 0x0011, 0x000F, 0, VR::ST, VM::M1, "IsInternalDataRole" }, }; const unsigned short Dict233TagHashTable[] = { 16, 19, 15, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 0, 1, 14, 15, 2, 0, 1, 13, 14, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 1, 5, 6, 1, 8, 9, 1, 7, 8, 1, 10, 11, 1, 9, 10, 1, 12, 13, 1, 11, 12, }; const unsigned short Dict233KeyHashTable[] = { 15, 16, 15, 19, 24, 15, 27, 30, 15, 15, 15, 35, 46, 51, 15, 0, 1, 14, 46599, 2, 7, 7781, 13, 43440, 1, 1, 53729, 1, 3, 63044, 2, 2, 37605, 12, 29916, 5, 4, 358, 8, 358, 9, 358, 10, 358, 11, 21098, 2, 0, 25143, 5, 60941, 1, 6, 52096, }; vtkDICOMDictionary::Dict Dict233Data = { "SIEMENS MR DATAMAPPING ATTRIBUTES", 15, 15, Dict233TagHashTable, Dict233KeyHashTable, Dict233Contents }; // ----- SET WINDOW ----- const DictEntry Dict234Contents[] = { { 0x0019, 0x0000, 0, VR::SH, VM::M1, "SetWindowImageFilter" }, { 0x0019, 0x0001, 0, VR::US, VM::M1, "SetWindowMagnificationPower" }, }; const unsigned short Dict234TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict234KeyHashTable[] = { 3, 6, 0, 1, 0, 4537, 1, 1, 59799, }; vtkDICOMDictionary::Dict Dict234Data = { "SET WINDOW", 2, 2, Dict234TagHashTable, Dict234KeyHashTable, Dict234Contents }; // ----- SIEMENS CSA NON-IMAGE ----- const DictEntry Dict235Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSADataType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSADataVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSADataInfo" }, { 0x7fe1, 0x0010, 0, VR::OB, VM::M1, "CSAData" }, }; const unsigned short Dict235TagHashTable[] = { 5, 8, 13, 4, 0, 1, 1, 9, 2, 0, 8, 2, 16, 1, 3, 16, }; const unsigned short Dict235KeyHashTable[] = { 5, 4, 10, 4, 0, 2, 0, 38590, 1, 50215, 2, 2, 2224, 3, 14245, }; vtkDICOMDictionary::Dict Dict235Data = { "SIEMENS CSA NON-IMAGE", 4, 4, Dict235TagHashTable, Dict235KeyHashTable, Dict235Contents }; // ----- GEMS_ADWSoft_DPO ----- const DictEntry Dict236Contents[] = { { 0x0039, 0x0080, 0, VR::IS, VM::M1, "PrivateEntityNumber" }, { 0x0039, 0x0085, 0, VR::DA, VM::M1, "PrivateEntityDate" }, { 0x0039, 0x0090, 0, VR::TM, VM::M1, "PrivateEntityTime" }, { 0x0039, 0x0095, 0, VR::LO, VM::M1, "PrivateEntityLaunchCommand" }, { 0x0039, 0x00AA, 0, VR::CS, VM::M1, "PrivateEntityType" }, }; const unsigned short Dict236TagHashTable[] = { 6, 11, 14, 5, 17, 0, 2, 1, 133, 4, 170, 1, 2, 144, 1, 0, 128, 1, 3, 149, }; const unsigned short Dict236KeyHashTable[] = { 6, 5, 9, 14, 17, 0, 1, 2, 10204, 2, 1, 24581, 3, 50609, 1, 4, 13708, 1, 0, 26074, }; vtkDICOMDictionary::Dict Dict236Data = { "GEMS_ADWSoft_DPO", 5, 5, Dict236TagHashTable, Dict236KeyHashTable, Dict236Contents }; // ----- EMAGEON STUDY HOME ----- const DictEntry Dict237Contents[] = { { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0001, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict237TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict237KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict237Data = { "EMAGEON STUDY HOME", 2, 2, Dict237TagHashTable, Dict237KeyHashTable, Dict237Contents }; // ----- SIEMENS MR IMA ----- const DictEntry Dict238Contents[] = { { 0x0021, 0x0001, 0, VR::SQ, VM::M1, "MRImageSequence" }, }; const unsigned short Dict238TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict238KeyHashTable[] = { 2, 0, 1, 0, 11488, }; vtkDICOMDictionary::Dict Dict238Data = { "SIEMENS MR IMA", 1, 1, Dict238TagHashTable, Dict238KeyHashTable, Dict238Contents }; // ----- SIEMENS MED PT ----- const DictEntry Dict239Contents[] = { { 0x0071, 0x0021, 0, VR::UI, VM::M1, "RegistrationMatrixUID" }, { 0x0071, 0x0022, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" }, { 0x0071, 0x0023, 0, VR::US, VM::M1, "VolumeIndex" }, { 0x0071, 0x0024, 0, VR::IS, VM::M1, "TimeSliceDuration" }, }; const unsigned short Dict239TagHashTable[] = { 5, 8, 11, 14, 0, 1, 3, 36, 1, 0, 33, 1, 1, 34, 1, 2, 35, }; const unsigned short Dict239KeyHashTable[] = { 5, 8, 11, 14, 0, 1, 1, 31052, 1, 2, 24277, 1, 3, 35418, 1, 0, 14317, }; vtkDICOMDictionary::Dict Dict239Data = { "SIEMENS MED PT", 4, 4, Dict239TagHashTable, Dict239KeyHashTable, Dict239Contents }; // ----- SIEMENS MED ----- const DictEntry Dict240Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "RecognitionCode" }, { 0x0009, 0x0030, 0, VR::US, VM::M1, "ByteOffsetOfOriginalHeader" }, { 0x0009, 0x0031, 0, VR::UL, VM::M1, "LengthOfOriginalHeader" }, { 0x0009, 0x0040, 0, VR::US, VM::M1, "ByteOffsetOfPixelmatrix" }, { 0x0009, 0x0041, 0, VR::UL, VM::M1, "LengthOfPixelmatrixInBytes" }, { 0x0009, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0051, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x00f5, 0, VR::LO, VM::M1, "PDMEFIDPlaceholder" }, { 0x0009, 0x00f6, 0, VR::LO, VM::M1, "PDMDataObjectTypeExtension" }, { 0x0021, 0x0010, 0, VR::DS, VM::M1, "Zoom" }, { 0x0021, 0x0011, 0, VR::DS, VM::M2, "Target" }, { 0x0021, 0x0012, 0, VR::IS, VM::M1, "TubeAngle" }, { 0x0021, 0x0020, 0, VR::US, VM::M1, "ROIMask" }, { 0x7001, 0x0010, 0, VR::LO, VM::M1, "Dummy" }, { 0x7003, 0x0010, 0, VR::LO, VM::M1, "Header" }, { 0x7005, 0x0010, 0, VR::LO, VM::M1, "Dummy" }, }; const unsigned short Dict240TagHashTable[] = { 17, 20, 16, 27, 16, 32, 16, 16, 35, 42, 16, 16, 51, 16, 16, 54, 0, 1, 10, 17, 3, 9, 16, 12, 32, 13, 16, 2, 11, 18, 14, 16, 1, 15, 16, 3, 2, 49, 3, 64, 5, 80, 4, 0, 16, 1, 48, 4, 65, 6, 81, 1, 8, 246, 1, 7, 245, }; const unsigned short Dict240KeyHashTable[] = { 16, 17, 16, 28, 16, 31, 36, 16, 16, 16, 39, 44, 47, 16, 54, 16, 0, 5, 0, 24778, 4, 31907, 7, 62752, 13, 63631, 15, 63631, 1, 1, 48585, 2, 5, 336, 6, 336, 1, 8, 64739, 2, 2, 21719, 9, 1288, 1, 12, 14315, 3, 3, 1872, 10, 48788, 11, 10273, 1, 14, 53320, }; vtkDICOMDictionary::Dict Dict240Data = { "SIEMENS MED", 16, 16, Dict240TagHashTable, Dict240KeyHashTable, Dict240Contents }; // ----- GEMS_AWSoft_SB1 ----- const DictEntry Dict241Contents[] = { { 0x0039, 0x0050, 0, VR::UI, VM::M1, "ReferenceToStudyUID" }, { 0x0039, 0x0051, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" }, { 0x0039, 0x0052, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" }, { 0x0039, 0x0095, 0, VR::LO, VM::M1, "PrivateEntityLaunchCommand" }, }; const unsigned short Dict241TagHashTable[] = { 5, 8, 11, 4, 0, 1, 0, 80, 1, 1, 81, 2, 2, 82, 3, 149, }; const unsigned short Dict241KeyHashTable[] = { 5, 8, 11, 14, 0, 1, 1, 29625, 1, 2, 39160, 1, 0, 57324, 1, 3, 63261, }; vtkDICOMDictionary::Dict Dict241Data = { "GEMS_AWSoft_SB1", 4, 4, Dict241TagHashTable, Dict241KeyHashTable, Dict241Contents }; // ----- ShowcaseAppearance ----- const DictEntry Dict242Contents[] = { { 0x0029, 0x0010, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0012, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0013, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0014, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict242TagHashTable[] = { 5, 6, 11, 14, 17, 0, 2, 1, 17, 4, 20, 1, 0, 16, 1, 3, 19, 1, 2, 18, }; const unsigned short Dict242KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict242Data = { "ShowcaseAppearance", 5, 5, Dict242TagHashTable, Dict242KeyHashTable, Dict242Contents }; // ----- SIEMENS SYNGO INSTANCE MANIFEST ----- const DictEntry Dict243Contents[] = { { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "TemporaryOriginalHeaderSequence" }, { 0x0009, 0x0010, 0, VR::AE, VM::M1, "syngoIndexSourceAETitle" }, }; const unsigned short Dict243TagHashTable[] = { 2, 3, 0, 2, 0, 0, 1, 16, }; const unsigned short Dict243KeyHashTable[] = { 3, 6, 0, 1, 1, 21619, 1, 0, 18847, }; vtkDICOMDictionary::Dict Dict243Data = { "SIEMENS SYNGO INSTANCE MANIFEST", 2, 2, Dict243TagHashTable, Dict243KeyHashTable, Dict243Contents }; // ----- Image (ID, Version, Size, Dump, GUID) ----- const DictEntry Dict244Contents[] = { { 0x8003, 0x0000, 0, VR::LO, VM::M1, "ID" }, { 0x8003, 0x0010, 0, VR::LO, VM::M1, "Version" }, { 0x8003, 0x0020, 0, VR::UL, VM::M1, "Size" }, { 0x8003, 0x0030, 0, VR::OB, VM::M1, "Dump" }, { 0x8003, 0x0040, 0, VR::LO, VM::M1, "GUID" }, }; const unsigned short Dict244TagHashTable[] = { 6, 9, 5, 14, 17, 0, 1, 2, 32, 2, 3, 48, 4, 64, 1, 0, 0, 1, 1, 16, }; const unsigned short Dict244KeyHashTable[] = { 6, 9, 5, 12, 17, 0, 1, 1, 10863, 1, 0, 58365, 2, 2, 57433, 3, 17688, 1, 4, 32034, }; vtkDICOMDictionary::Dict Dict244Data = { "Image (ID, Version, Size, Dump, GUID)", 5, 5, Dict244TagHashTable, Dict244KeyHashTable, Dict244Contents }; // ----- SIEMENS SYNGO ENHANCED IDATASET API ----- const DictEntry Dict245Contents[] = { { 0x0027, 0x0001, 0, VR::CS, VM::M1, "BusinessUnitCode" }, { 0x0027, 0x0002, 0, VR::LO, VM::M1, "ApplicationType" }, { 0x0027, 0x0003, 0, VR::SQ, VM::M1, "ApplicationAttributesSequence" }, }; const unsigned short Dict245TagHashTable[] = { 4, 7, 10, 0, 1, 2, 3, 1, 1, 2, 1, 0, 1, }; const unsigned short Dict245KeyHashTable[] = { 4, 7, 10, 0, 1, 0, 43524, 1, 1, 60478, 1, 2, 14077, }; vtkDICOMDictionary::Dict Dict245Data = { "SIEMENS SYNGO ENHANCED IDATASET API", 3, 3, Dict245TagHashTable, Dict245KeyHashTable, Dict245Contents }; // ----- astm.org/diconde/iod/NdeUsEquipmentSettings ----- const DictEntry Dict246Contents[] = { { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "PulserSettingsSequence" }, { 0x0009, 0x0022, 0, VR::DS, VM::M1, "PulseWidth" }, { 0x0009, 0x0024, 0, VR::DS, VM::M1, "ExcitationFrequency" }, { 0x0009, 0x0026, 0, VR::CS, VM::M1, "ModulationType" }, { 0x0009, 0x0028, 0, VR::DS, VM::M1, "Damping" }, { 0x0009, 0x0030, 0, VR::SQ, VM::M1, "ReceiverSettingsSequence" }, { 0x0009, 0x0031, 0, VR::DS, VM::M1, "AcquiredSoundpathLength" }, { 0x0009, 0x0032, 0, VR::CS, VM::M1, "AcquisitionCompressionType" }, { 0x0009, 0x0033, 0, VR::IS, VM::M1, "AcquisitionSampleSize" }, { 0x0009, 0x0034, 0, VR::DS, VM::M1, "RectifierSmoothing" }, { 0x0009, 0x0035, 0, VR::SQ, VM::M1, "DACSequence" }, { 0x0009, 0x0036, 0, VR::CS, VM::M1, "DACType" }, { 0x0009, 0x0038, 0, VR::DS, VM::M1TN, "DACGainPoints" }, { 0x0009, 0x003A, 0, VR::DS, VM::M1TN, "DACTimePoints" }, { 0x0009, 0x003C, 0, VR::DS, VM::M1TN, "DACAmplitude" }, { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "PreAmplifierSettingsSequence" }, { 0x0009, 0x0050, 0, VR::SQ, VM::M1, "TransmitTransducerSettingsSequence" }, { 0x0009, 0x0051, 0, VR::SQ, VM::M1, "ReceiveTransducerSettingsSequence" }, { 0x0009, 0x0052, 0, VR::DS, VM::M1, "IncidentAngle" }, { 0x0009, 0x0054, 0, VR::ST, VM::M1, "CouplingTechnique" }, { 0x0009, 0x0056, 0, VR::ST, VM::M1, "CouplingMedium" }, { 0x0009, 0x0057, 0, VR::DS, VM::M1, "CouplingVelocity" }, { 0x0009, 0x0058, 0, VR::DS, VM::M1, "CrystalCenterLocationX" }, { 0x0009, 0x0059, 0, VR::DS, VM::M1, "CrystalCenterLocationZ" }, { 0x0009, 0x005A, 0, VR::DS, VM::M1, "SoundPathLength" }, { 0x0009, 0x005C, 0, VR::ST, VM::M1, "DelayLawIdentifier" }, { 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GateSettingsSequence" }, { 0x0009, 0x0062, 0, VR::DS, VM::M1, "GateThreshold" }, { 0x0009, 0x0064, 0, VR::DS, VM::M1, "VelocityOfSound" }, { 0x0009, 0x0070, 0, VR::SQ, VM::M1, "CalibrationSettingsSequence" }, { 0x0009, 0x0072, 0, VR::ST, VM::M1, "CalibrationProcedure" }, { 0x0009, 0x0074, 0, VR::SH, VM::M1, "ProcedureVersion" }, { 0x0009, 0x0076, 0, VR::DA, VM::M1, "ProcedureCreationDate" }, { 0x0009, 0x0078, 0, VR::DA, VM::M1, "ProcedureExpirationDate" }, { 0x0009, 0x007A, 0, VR::DA, VM::M1, "ProcedureLastModifiedDate" }, { 0x0009, 0x007C, 0, VR::TM, VM::M1TN, "CalibrationTime" }, { 0x0009, 0x007E, 0, VR::DA, VM::M1TN, "CalibrationDate" }, }; const unsigned short Dict246TagHashTable[] = { 37, 38, 37, 41, 44, 47, 50, 55, 60, 65, 68, 73, 76, 79, 82, 87, 92, 37, 97, 100, 103, 108, 113, 116, 119, 37, 122, 37, 37, 37, 125, 37, 128, 131, 134, 137, 37, 0, 1, 33, 120, 1, 34, 122, 1, 0, 32, 1, 35, 124, 2, 1, 34, 22, 88, 2, 23, 89, 36, 126, 2, 2, 36, 24, 90, 1, 29, 112, 2, 3, 38, 25, 92, 1, 30, 114, 1, 12, 56, 1, 31, 116, 2, 13, 58, 16, 80, 2, 17, 81, 32, 118, 2, 14, 60, 18, 82, 1, 19, 84, 1, 6, 49, 2, 5, 48, 20, 86, 2, 8, 51, 21, 87, 1, 7, 50, 1, 10, 53, 1, 9, 52, 1, 11, 54, 1, 26, 96, 1, 27, 98, 1, 4, 40, 1, 28, 100, 1, 15, 64, }; const unsigned short Dict246KeyHashTable[] = { 37, 38, 43, 46, 53, 56, 37, 59, 64, 67, 70, 37, 73, 76, 79, 84, 37, 89, 98, 101, 104, 107, 112, 37, 115, 37, 118, 37, 121, 37, 124, 129, 132, 37, 135, 37, 37, 0, 2, 2, 48790, 8, 46530, 1, 3, 14957, 3, 5, 21421, 18, 43819, 31, 64413, 1, 30, 56490, 1, 14, 23529, 2, 12, 43002, 33, 50344, 1, 7, 11218, 1, 19, 1799, 1, 4, 15583, 1, 13, 50249, 1, 9, 15657, 2, 11, 54221, 17, 38259, 2, 21, 7790, 34, 44042, 4, 0, 5445, 6, 56562, 15, 34790, 35, 28847, 1, 10, 43812, 1, 25, 57800, 1, 1, 20594, 2, 24, 14472, 27, 43078, 1, 20, 26877, 1, 32, 37877, 1, 28, 7960, 1, 22, 25273, 2, 16, 45254, 23, 25273, 1, 29, 10968, 1, 26, 2544, 1, 36, 13077, }; vtkDICOMDictionary::Dict Dict246Data = { "astm.org/diconde/iod/NdeUsEquipmentSettings", 37, 37, Dict246TagHashTable, Dict246KeyHashTable, Dict246Contents }; // ----- SIEMENS MR HEADER ----- const DictEntry Dict247Contents[] = { { 0x0019, 0x0008, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x000A, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" }, { 0x0019, 0x000B, 0, VR::DS, VM::M1, "SliceMeasurementDuration" }, { 0x0019, 0x000C, 0, VR::IS, VM::M1, "BValue" }, { 0x0019, 0x000D, 0, VR::CS, VM::M1, "DiffusionDirectionality" }, { 0x0019, 0x000E, 0, VR::FD, VM::M3, "DiffusionGradientDirection" }, { 0x0019, 0x000f, 0, VR::SH, VM::M1, "GradientMode" }, { 0x0019, 0x0011, 0, VR::SH, VM::M1, "FlowCompensation" }, { 0x0019, 0x0012, 0, VR::SL, VM::M3, "TablePositionOrigin" }, { 0x0019, 0x0013, 0, VR::SL, VM::M3, "ImaAbsTablePosition" }, { 0x0019, 0x0014, 0, VR::IS, VM::M3, "ImaRelTablePosition" }, { 0x0019, 0x0015, 0, VR::FD, VM::M3, "SlicePosition_PCS" }, { 0x0019, 0x0016, 0, VR::DS, VM::M1, "TimeAfterStart" }, { 0x0019, 0x0017, 0, VR::DS, VM::M1, "SliceResolution" }, { 0x0019, 0x0018, 0, VR::IS, VM::M1, "RealDwellTime" }, { 0x0019, 0x0023, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0025, 0, VR::FD, VM::M1TN, "" }, { 0x0019, 0x0026, 0, VR::FD, VM::M1TN, "" }, { 0x0019, 0x0027, 0, VR::FD, VM::M6, "BMatrix" }, { 0x0019, 0x0028, 0, VR::FD, VM::M1, "BandwidthPerPixelPhaseEncode" }, { 0x0019, 0x0029, 0, VR::FD, VM::M1TN, "MosaicRefAcqTimes" }, { 0x0051, 0x0008, 0, VR::CS, VM::M1, "CSAImageHeaderType" }, { 0x0051, 0x0009, 0, VR::LO, VM::M1, "CSAImageHeaderVersion" }, { 0x0051, 0x000a, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x000b, 0, VR::LO, VM::M1, "AcquisitionMatrixText" }, { 0x0051, 0x000c, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x000d, 0, VR::SH, VM::M1, "" }, { 0x0051, 0x000e, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x000f, 0, VR::LO, VM::M1, "CoilString" }, { 0x0051, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x0012, 0, VR::SH, VM::M1, "" }, { 0x0051, 0x0013, 0, VR::SH, VM::M1, "PositivePCSDirections" }, { 0x0051, 0x0015, 0, VR::SH, VM::M1, "" }, { 0x0051, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0051, 0x0017, 0, VR::SH, VM::M1, "" }, { 0x0051, 0x0018, 0, VR::SH, VM::M1, "" }, { 0x0051, 0x0019, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict247TagHashTable[] = { 38, 39, 38, 38, 38, 38, 38, 38, 42, 38, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 103, 108, 111, 114, 38, 117, 120, 123, 38, 126, 129, 132, 135, 138, 38, 38, 0, 1, 15, 24, 1, 8, 17, 2, 10, 19, 21, 41, 2, 9, 18, 20, 40, 2, 12, 21, 22, 8, 2, 11, 20, 23, 9, 2, 14, 23, 24, 10, 2, 13, 22, 25, 11, 2, 1, 9, 26, 12, 2, 0, 8, 27, 13, 2, 3, 11, 28, 14, 2, 2, 10, 29, 15, 2, 5, 13, 16, 35, 1, 4, 12, 2, 7, 15, 17, 37, 1, 6, 14, 1, 19, 39, 1, 18, 38, 1, 30, 17, 1, 31, 18, 1, 32, 19, 1, 33, 21, 1, 34, 22, 1, 35, 23, 1, 36, 24, 1, 37, 25, }; const unsigned short Dict247KeyHashTable[] = { 39, 42, 45, 38, 48, 38, 38, 38, 53, 38, 56, 61, 38, 38, 38, 38, 38, 38, 66, 71, 38, 38, 74, 77, 38, 112, 38, 38, 38, 38, 38, 115, 118, 121, 38, 38, 124, 38, 0, 1, 22, 19895, 1, 6, 63855, 1, 25, 29297, 2, 2, 1324, 15, 12770, 1, 11, 64174, 2, 5, 3873, 20, 49764, 2, 12, 51702, 21, 57303, 2, 7, 11169, 9, 11860, 1, 10, 46538, 1, 32, 48970, 17, 0, 141, 1, 141, 8, 46329, 16, 141, 17, 141, 18, 141, 24, 141, 26, 141, 27, 141, 28, 141, 30, 141, 31, 141, 33, 141, 34, 141, 35, 141, 36, 141, 37, 141, 1, 3, 36876, 1, 29, 52406, 1, 4, 39270, 1, 14, 57612, 3, 13, 51176, 19, 12660, 23, 8471, }; vtkDICOMDictionary::Dict Dict247Data = { "SIEMENS MR HEADER", 38, 38, Dict247TagHashTable, Dict247KeyHashTable, Dict247Contents }; // ----- AGFA KOSD 1.0 ----- const DictEntry Dict248Contents[] = { { 0x0035, 0x0000, 0, VR::SH, VM::M1, "" }, { 0x0035, 0x0003, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict248TagHashTable[] = { 3, 6, 0, 1, 1, 3, 1, 0, 0, }; const unsigned short Dict248KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict248Data = { "AGFA KOSD 1.0", 2, 2, Dict248TagHashTable, Dict248KeyHashTable, Dict248Contents }; // ----- Siemens: Thorax/Multix FD Version ----- const DictEntry Dict249Contents[] = { { 0x0017, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x0001, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict249TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict249KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict249Data = { "Siemens: Thorax/Multix FD Version", 2, 2, Dict249TagHashTable, Dict249KeyHashTable, Dict249Contents }; // ----- SPI-P-Private-DiDi Release 1 ----- const DictEntry Dict250Contents[] = { { 0x0019, 0x0000, 0, VR::LT, VM::M1, "PostModeString" }, { 0x0019, 0x0001, 0, VR::LT, VM::M1, "PostData" }, { 0x0019, 0x0010, 0, VR::LT, VM::M1, "ImageHeader" }, }; const unsigned short Dict250TagHashTable[] = { 4, 9, 3, 0, 2, 1, 1, 2, 16, 1, 0, 0, }; const unsigned short Dict250KeyHashTable[] = { 4, 9, 3, 0, 2, 0, 33837, 2, 58907, 1, 1, 10284, }; vtkDICOMDictionary::Dict Dict250Data = { "SPI-P-Private-DiDi Release 1", 3, 3, Dict250TagHashTable, Dict250KeyHashTable, Dict250Contents }; // ----- BioscanMedisoScivisNanoSPECT ----- const DictEntry Dict251Contents[] = { { 0x0009, 0x0035, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict251TagHashTable[] = { 2, 0, 1, 0, 53, }; const unsigned short Dict251KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict251Data = { "BioscanMedisoScivisNanoSPECT", 1, 1, Dict251TagHashTable, Dict251KeyHashTable, Dict251Contents }; // ----- NUMACALC-INVENTORY ----- const DictEntry Dict252Contents[] = { { 0x0031, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0004, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0005, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0008, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0009, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x000a, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x000c, 0, VR::UI, VM::M1, "" }, { 0x0031, 0x000e, 0, VR::DT, VM::M1, "" }, { 0x0031, 0x000f, 0, VR::DT, VM::M1, "" }, { 0x0031, 0x0010, 0, VR::FD, VM::M1, "" }, { 0x0031, 0x0011, 0, VR::PN, VM::M1, "" }, { 0x0031, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0014, 0, VR::FD, VM::M1, "" }, { 0x0031, 0x0015, 0, VR::DT, VM::M1, "" }, { 0x0031, 0x001a, 0, VR::PN, VM::M1, "" }, { 0x0031, 0x001b, 0, VR::FD, VM::M1, "" }, { 0x0031, 0x001c, 0, VR::DT, VM::M1, "" }, { 0x0031, 0x0021, 0, VR::PN, VM::M1, "" }, { 0x0031, 0x0022, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0023, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0024, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0025, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0026, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0027, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0028, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x0029, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x002a, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x002b, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x002c, 0, VR::SH, VM::M1, "" }, { 0x0031, 0x002d, 0, VR::LO, VM::M1, "" }, { 0x0031, 0x0032, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict252TagHashTable[] = { 34, 33, 37, 40, 45, 33, 33, 33, 33, 48, 51, 33, 54, 33, 33, 33, 57, 60, 63, 66, 71, 76, 81, 86, 91, 96, 99, 104, 107, 112, 117, 33, 120, 0, 1, 11, 16, 1, 13, 18, 2, 15, 21, 32, 50, 1, 14, 20, 1, 17, 27, 1, 16, 26, 1, 18, 28, 1, 19, 33, 1, 0, 3, 1, 21, 35, 2, 2, 5, 20, 34, 2, 1, 4, 23, 37, 2, 4, 7, 22, 36, 2, 3, 6, 25, 39, 2, 6, 9, 24, 38, 2, 5, 8, 27, 41, 1, 26, 40, 2, 7, 10, 29, 43, 1, 28, 42, 2, 8, 12, 31, 45, 2, 10, 15, 30, 44, 1, 9, 14, 1, 12, 17, }; const unsigned short Dict252KeyHashTable[] = { 33, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 33, 0, 163, 1, 163, 2, 163, 3, 163, 4, 163, 5, 163, 6, 163, 7, 163, 8, 163, 9, 163, 10, 163, 11, 163, 12, 163, 13, 163, 14, 163, 15, 163, 16, 163, 17, 163, 18, 163, 19, 163, 20, 163, 21, 163, 22, 163, 23, 163, 24, 163, 25, 163, 26, 163, 27, 163, 28, 163, 29, 163, 30, 163, 31, 163, 32, 163, }; vtkDICOMDictionary::Dict Dict252Data = { "NUMACALC-INVENTORY", 33, 33, Dict252TagHashTable, Dict252KeyHashTable, Dict252Contents }; // ----- SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0 ----- const DictEntry Dict253Contents[] = { { 0x0025, 0x0000, 0, VR::US, VM::M1, "ViewNative" }, { 0x0025, 0x0001, 0, VR::US, VM::M1, "OriginalSeriesNumber" }, { 0x0025, 0x0002, 0, VR::US, VM::M1, "OriginalImageNumber" }, { 0x0025, 0x0003, 0, VR::US, VM::M1, "WinCenter" }, { 0x0025, 0x0004, 0, VR::US, VM::M1, "WinWidth" }, { 0x0025, 0x0005, 0, VR::US, VM::M1, "WinBrightness" }, { 0x0025, 0x0006, 0, VR::US, VM::M1, "WinContrast" }, { 0x0025, 0x0007, 0, VR::US, VM::M1, "OriginalFrameNumber" }, { 0x0025, 0x0008, 0, VR::US, VM::M1, "OriginalMaskFrameNumber" }, { 0x0025, 0x0009, 0, VR::US, VM::M1, "Opac" }, { 0x0025, 0x000a, 0, VR::US, VM::M1, "OriginalNumberofFrames" }, { 0x0025, 0x000b, 0, VR::DS, VM::M1, "OriginalSceneDuration" }, { 0x0025, 0x000c, 0, VR::LO, VM::M1, "IdentifierLOID" }, { 0x0025, 0x000d, 0, VR::SS, VM::M1TN, "OriginalSceneVFRInfo" }, { 0x0025, 0x000e, 0, VR::SS, VM::M1, "OriginalFrameECGPosition" }, { 0x0025, 0x000f, 0, VR::SS, VM::M1, "OriginalECG1stFrameOffset" }, { 0x0025, 0x0010, 0, VR::SS, VM::M1, "ZoomFlag" }, { 0x0025, 0x0011, 0, VR::US, VM::M1, "FlexiblePixelShift" }, { 0x0025, 0x0012, 0, VR::US, VM::M1, "NumberOfMaskFrames" }, { 0x0025, 0x0013, 0, VR::US, VM::M1, "NumberOfFillFrames" }, { 0x0025, 0x0014, 0, VR::IS, VM::M1, "SeriesNumber" }, { 0x0025, 0x0015, 0, VR::IS, VM::M1, "ImageNumber" }, { 0x0025, 0x0016, 0, VR::IS, VM::M1, "ReadyProcessingStatus" }, }; const unsigned short Dict253TagHashTable[] = { 24, 27, 30, 33, 23, 36, 39, 42, 45, 48, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 0, 1, 11, 11, 1, 10, 10, 1, 21, 21, 1, 20, 20, 1, 22, 22, 1, 17, 17, 1, 16, 16, 1, 19, 19, 2, 5, 5, 18, 18, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 13, 13, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 9, 9, 1, 8, 8, }; const unsigned short Dict253KeyHashTable[] = { 23, 24, 27, 23, 34, 23, 39, 44, 47, 50, 23, 23, 59, 62, 23, 65, 68, 71, 23, 74, 77, 80, 83, 0, 1, 7, 14171, 3, 1, 45204, 4, 64503, 16, 36334, 2, 5, 5432, 10, 36062, 2, 13, 34884, 17, 53990, 1, 20, 16638, 1, 8, 32542, 4, 0, 26450, 3, 39789, 14, 35424, 19, 24825, 1, 15, 6865, 1, 2, 9327, 1, 22, 36052, 1, 21, 33415, 1, 12, 4729, 1, 18, 30582, 1, 11, 31094, 1, 9, 12229, 1, 6, 3597, }; vtkDICOMDictionary::Dict Dict253Data = { "SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0", 23, 23, Dict253TagHashTable, Dict253KeyHashTable, Dict253Contents }; // ----- SIENET ----- const DictEntry Dict254Contents[] = { { 0x0009, 0x0001, 0, VR::US, VM::M1, "SIENETCommandField" }, { 0x0009, 0x0014, 0, VR::LO, VM::M1, "ReceiverPLA" }, { 0x0009, 0x0016, 0, VR::US, VM::M1, "TransferPriority" }, { 0x0009, 0x0029, 0, VR::LO, VM::M1, "ActualUser" }, { 0x0009, 0x0070, 0, VR::DS, VM::M1, "" }, { 0x0009, 0x0071, 0, VR::DS, VM::M1, "" }, { 0x0009, 0x0072, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0073, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0074, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0075, 0, VR::LO, VM::M1, "" }, { 0x0091, 0x0020, 0, VR::PN, VM::M1, "RISPatientName" }, { 0x0093, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0095, 0x0001, 0, VR::LO, VM::M1, "ExaminationFolderID" }, { 0x0095, 0x0004, 0, VR::UL, VM::M1, "FolderReportedStatus" }, { 0x0095, 0x0005, 0, VR::LO, VM::M1, "FolderReportingRadiologist" }, { 0x0095, 0x0007, 0, VR::LO, VM::M1, "SIENETISAPLA" }, { 0x0095, 0x000c, 0, VR::SL, VM::M1, "" }, { 0x0095, 0x0020, 0, VR::PN, VM::M1, "RISPatientName" }, { 0x0097, 0x0003, 0, VR::SL, VM::M1, "" }, { 0x0097, 0x0005, 0, VR::LO, VM::M1, "" }, { 0x0099, 0x0002, 0, VR::SL, VM::M1, "DataObjectAttributes" }, { 0x0099, 0x0005, 0, VR::SL, VM::M1, "" }, { 0x00A5, 0x0005, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict254TagHashTable[] = { 23, 24, 23, 23, 23, 27, 30, 39, 42, 51, 60, 23, 63, 23, 23, 68, 23, 71, 74, 23, 77, 23, 80, 0, 1, 22, 5, 1, 4, 112, 4, 1, 20, 5, 113, 15, 7, 19, 5, 1, 6, 114, 4, 0, 1, 2, 22, 7, 115, 14, 5, 4, 3, 41, 8, 116, 11, 2, 13, 4, 1, 9, 117, 2, 12, 1, 18, 3, 1, 20, 2, 1, 16, 12, 1, 10, 32, 1, 21, 5, 1, 17, 32, }; const unsigned short Dict254KeyHashTable[] = { 23, 24, 23, 23, 23, 23, 27, 30, 23, 23, 33, 23, 36, 39, 44, 23, 23, 23, 49, 52, 23, 23, 55, 0, 1, 12, 9350, 1, 14, 2362, 1, 13, 38901, 1, 2, 33198, 1, 3, 62558, 2, 10, 64228, 17, 64228, 2, 0, 39118, 15, 57359, 1, 20, 8397, 1, 1, 48380, 12, 4, 233, 5, 233, 6, 233, 7, 233, 8, 233, 9, 233, 11, 233, 16, 233, 18, 233, 19, 233, 21, 233, 22, 233, }; vtkDICOMDictionary::Dict Dict254Data = { "SIENET", 23, 23, Dict254TagHashTable, Dict254KeyHashTable, Dict254Contents }; // ----- TOSHIBA_MEC_CT3 ----- const DictEntry Dict255Contents[] = { { 0x7005, 0x0000, 0, VR::OB, VM::M1, "CTPrivateData1" }, { 0x7005, 0x0003, 0, VR::SH, VM::M1, "CardiacRRMeanTime" }, { 0x7005, 0x0004, 0, VR::SH, VM::M1, "CardiacReconstructionGettingPhaseInPercent" }, { 0x7005, 0x0005, 0, VR::SH, VM::M1, "CardiacReconstructionGettingPhaseInMS" }, { 0x7005, 0x0006, 0, VR::SH, VM::M1, "CardiacReconstructionMode" }, { 0x7005, 0x0007, 0, VR::DS, VM::M1TN, "ReconstructionCenter" }, { 0x7005, 0x0008, 0, VR::DS, VM::M1, "DetectorSliceThickness" }, { 0x7005, 0x0009, 0, VR::LO, VM::M1, "NumberOfDetectorRowsToReconstruct" }, { 0x7005, 0x000a, 0, VR::DS, VM::M1, "TableSpeed" }, { 0x7005, 0x000b, 0, VR::SH, VM::M1, "Filter" }, { 0x7005, 0x000c, 0, VR::SH, VM::M1, "ReconstructionCorrectionType" }, { 0x7005, 0x000d, 0, VR::SH, VM::M1, "Organ" }, { 0x7005, 0x000e, 0, VR::SH, VM::M1, "FileTypeRemarks" }, { 0x7005, 0x000f, 0, VR::SH, VM::M1, "Direction" }, { 0x7005, 0x0010, 0, VR::OB, VM::M1, "CTPrivateData2" }, { 0x7005, 0x0011, 0, VR::LT, VM::M1, "SeriesComment" }, { 0x7005, 0x0012, 0, VR::SH, VM::M1, "Position" }, { 0x7005, 0x0013, 0, VR::US, VM::M1, "ExpertPlanNumber" }, { 0x7005, 0x0014, 0, VR::US, VM::M1, "ReconstructionROINumber" }, { 0x7005, 0x0015, 0, VR::US, VM::M1, "SpecialHelicalAcquisitionNumber" }, { 0x7005, 0x0016, 0, VR::UI, VM::M1, "VolumeUID" }, { 0x7005, 0x0017, 0, VR::US, VM::M1, "TotalFrameCountInTheVolume" }, { 0x7005, 0x0018, 0, VR::US, VM::M1, "FrameNumber" }, { 0x7005, 0x0019, 0, VR::UL, VM::M1, "FrameSortKey" }, { 0x7005, 0x001a, 0, VR::US, VM::M1, "FrameSortOrder" }, { 0x7005, 0x001b, 0, VR::SH, VM::M1, "ConvolutionKernelForSeriesRecord" }, { 0x7005, 0x001c, 0, VR::LO, VM::M1, "ContrastBolusAgentForSeriesRecord" }, { 0x7005, 0x001d, 0, VR::UL, VM::M1, "ReconstructionNumber" }, { 0x7005, 0x001e, 0, VR::UL, VM::M1, "RawDataNumber" }, { 0x7005, 0x001f, 0, VR::LO, VM::M1, "VolumeNumber" }, { 0x7005, 0x0020, 0, VR::UL, VM::M1, "LocalSeriesNumber" }, { 0x7005, 0x0021, 0, VR::LO, VM::M1, "DecreaseInArtifactFilter" }, { 0x7005, 0x0022, 0, VR::DS, VM::M1, "ReconstructionInterval" }, { 0x7005, 0x0023, 0, VR::DS, VM::M1, "PitchFactor" }, { 0x7005, 0x0024, 0, VR::DA, VM::M1, "AcquisitionDateOfNRA" }, { 0x7005, 0x0025, 0, VR::UL, VM::M1, "LargeDataFileAttribute" }, { 0x7005, 0x0026, 0, VR::CS, VM::M1T8, "LargeDataFileName" }, { 0x7005, 0x0028, 0, VR::SQ, VM::M1, "EnhancedCTPrivateSequence" }, { 0x7005, 0x0029, 0, VR::UI, VM::M1, "FrameUID" }, { 0x7005, 0x0030, 0, VR::CS, VM::M1, "MainModalityInStudy" }, { 0x7005, 0x0035, 0, VR::DS, VM::M2, "ScanRange" }, { 0x7005, 0x0036, 0, VR::OB, VM::M1, "CTPrivateData3" }, { 0x7005, 0x0037, 0, VR::IS, VM::M1, "TotalFrames" }, { 0x7005, 0x0038, 0, VR::IS, VM::M1, "StartFrame" }, { 0x7005, 0x0039, 0, VR::IS, VM::M1, "EndFrame" }, { 0x7005, 0x0040, 0, VR::FD, VM::M1, "DLP" }, { 0x7005, 0x0041, 0, VR::SH, VM::M1, "RowSliceInformation" }, { 0x7005, 0x0042, 0, VR::US, VM::M1, "LocalFrameNumber" }, { 0x7005, 0x0043, 0, VR::DS, VM::M3, "VolumeVector" }, { 0x7005, 0x0044, 0, VR::US, VM::M1, "VolumeType" }, { 0x7005, 0x0045, 0, VR::DS, VM::M1, "RelativeTablePositionOf4DVolume" }, { 0x7005, 0x0046, 0, VR::DS, VM::M1, "AbsoluteTablePositionOf4DVolume" }, { 0x7005, 0x0047, 0, VR::DS, VM::M1, "SlicePitchOf4DVolume" }, { 0x7005, 0x0048, 0, VR::LO, VM::M1, "RespiratoryGatingInformation" }, { 0x7005, 0x0049, 0, VR::SH, VM::M1, "RespiratoryPhase" }, { 0x7005, 0x0061, 0, VR::LO, VM::M1, "SynchronizedSignalInformation" }, { 0x7005, 0x0062, 0, VR::DS, VM::M1, "TotalRawDataSize" }, { 0x7005, 0x0063, 0, VR::FD, VM::M1, "CTDIw" }, { 0x7005, 0x0067, 0, VR::UI, VM::M1, "VolumeUIDOf4DVolume" }, { 0x7005, 0x0068, 0, VR::US, VM::M1, "TotalFrameCountIn4DVolume" }, { 0x7005, 0x0069, 0, VR::US, VM::M1, "FrameNumberIn4DVolume" }, { 0x7005, 0x006a, 0, VR::DS, VM::M3, "ImagePositionOf4DVolumeTop" }, { 0x7005, 0x006b, 0, VR::DS, VM::M3, "ImagePositionOf4DVolumeTopEquipment" }, { 0x7005, 0x006c, 0, VR::UI, VM::M1, "SOPInstanceUIDOf4DVolume" }, { 0x7005, 0x006d, 0, VR::UI, VM::M1, "SeriesInstanceUIDOf4DVolume" }, { 0x7005, 0x0079, 0, VR::SH, VM::M1, "InjectorElapsedTime" }, { 0x7005, 0x00F1, 0, VR::CS, VM::M1, "ProtectMarkForStudyRecord" }, }; const unsigned short Dict255TagHashTable[] = { 68, 71, 74, 77, 80, 83, 86, 89, 92, 67, 95, 98, 101, 104, 109, 112, 115, 118, 121, 124, 129, 67, 132, 135, 140, 143, 148, 67, 151, 67, 67, 67, 67, 67, 67, 154, 157, 67, 67, 160, 67, 67, 165, 168, 171, 174, 179, 182, 187, 192, 195, 200, 205, 210, 213, 216, 219, 222, 227, 232, 235, 238, 241, 244, 247, 250, 253, 0, 1, 26, 28, 1, 29, 31, 1, 28, 30, 1, 23, 25, 1, 22, 24, 1, 25, 27, 1, 24, 26, 1, 35, 37, 1, 34, 36, 1, 36, 38, 1, 31, 33, 1, 30, 32, 2, 33, 35, 58, 103, 1, 32, 34, 1, 55, 97, 1, 56, 98, 1, 57, 99, 1, 63, 108, 2, 38, 41, 64, 109, 1, 37, 40, 1, 59, 104, 2, 40, 53, 60, 105, 1, 61, 106, 2, 42, 55, 62, 107, 1, 41, 54, 1, 39, 48, 1, 44, 57, 1, 43, 56, 2, 65, 121, 66, 241, 1, 3, 5, 1, 2, 4, 1, 5, 7, 2, 4, 6, 49, 68, 1, 50, 69, 2, 0, 0, 51, 70, 2, 1, 3, 52, 71, 1, 45, 64, 2, 11, 13, 46, 65, 2, 10, 12, 47, 66, 2, 13, 15, 48, 67, 1, 12, 14, 1, 7, 9, 1, 6, 8, 1, 9, 11, 2, 8, 10, 53, 72, 2, 19, 21, 54, 73, 1, 18, 20, 1, 21, 23, 1, 20, 22, 1, 15, 17, 1, 14, 16, 1, 17, 19, 1, 16, 18, 1, 27, 29, }; const unsigned short Dict255KeyHashTable[] = { 67, 68, 67, 67, 71, 74, 81, 86, 89, 67, 67, 92, 97, 100, 103, 67, 67, 106, 67, 109, 67, 112, 117, 67, 122, 125, 67, 128, 67, 67, 67, 67, 135, 67, 140, 67, 143, 67, 146, 149, 152, 67, 157, 67, 164, 169, 172, 177, 182, 185, 196, 199, 67, 67, 202, 207, 67, 67, 67, 67, 214, 67, 217, 224, 231, 234, 237, 0, 1, 3, 35661, 1, 22, 61063, 3, 0, 54367, 60, 41577, 64, 16141, 2, 9, 16023, 14, 54367, 1, 41, 54367, 1, 37, 23050, 2, 18, 25285, 21, 6806, 1, 8, 40646, 1, 7, 20734, 1, 2, 8249, 1, 36, 4958, 1, 47, 7099, 2, 33, 54605, 38, 35423, 2, 6, 32951, 65, 58942, 1, 16, 38998, 1, 10, 19352, 3, 15, 25592, 29, 21753, 57, 23127, 2, 20, 26677, 63, 41105, 1, 44, 62135, 1, 55, 25975, 1, 26, 43430, 1, 58, 30079, 2, 30, 56980, 40, 60549, 3, 24, 40078, 28, 15544, 42, 14431, 2, 23, 5127, 43, 29478, 1, 19, 42879, 2, 35, 29744, 61, 26829, 2, 12, 3183, 56, 62387, 1, 45, 3783, 5, 4, 48662, 34, 60891, 50, 25702, 52, 29995, 59, 8145, 1, 32, 60382, 1, 49, 9092, 2, 27, 59774, 66, 5726, 3, 39, 3682, 46, 13332, 54, 34337, 1, 48, 15452, 3, 11, 55594, 13, 824, 62, 61509, 3, 1, 60747, 25, 9864, 31, 47151, 1, 5, 36856, 1, 53, 28792, 2, 17, 33893, 51, 21356, }; vtkDICOMDictionary::Dict Dict255Data = { "TOSHIBA_MEC_CT3", 67, 67, Dict255TagHashTable, Dict255KeyHashTable, Dict255Contents }; // ----- Silhouette Annot V1.0 ----- const DictEntry Dict256Contents[] = { { 0x0029, 0x0011, 0, VR::IS, VM::M1, "AnnotationName" }, { 0x0029, 0x0012, 0, VR::LT, VM::M1, "AnnotationFont" }, { 0x0029, 0x0013, 0, VR::LT, VM::M1, "AnnotationTextForegroundColor" }, { 0x0029, 0x0014, 0, VR::LT, VM::M1, "AnnotationTextBackgroundColor" }, { 0x0029, 0x0015, 0, VR::UL, VM::M1, "AnnotationTextBackingMode" }, { 0x0029, 0x0016, 0, VR::UL, VM::M1, "AnnotationTextJustification" }, { 0x0029, 0x0017, 0, VR::UL, VM::M1, "AnnotationTextLocation" }, { 0x0029, 0x0018, 0, VR::LT, VM::M1, "AnnotationTextString" }, { 0x0029, 0x0019, 0, VR::UL, VM::M1, "AnnotationTextAttachMode" }, { 0x0029, 0x0020, 0, VR::UL, VM::M1, "AnnotationTextCursorMode" }, { 0x0029, 0x0021, 0, VR::UL, VM::M1, "AnnotationTextShadowOffsetX" }, { 0x0029, 0x0022, 0, VR::UL, VM::M1, "AnnotationTextShadowOffsetY" }, { 0x0029, 0x0023, 0, VR::LT, VM::M1, "AnnotationLineColor" }, { 0x0029, 0x0024, 0, VR::UL, VM::M1, "AnnotationLineThickness" }, { 0x0029, 0x0025, 0, VR::UL, VM::M1, "AnnotationLineType" }, { 0x0029, 0x0026, 0, VR::UL, VM::M1, "AnnotationLineStyle" }, { 0x0029, 0x0027, 0, VR::UL, VM::M1, "AnnotationLineDashLength" }, { 0x0029, 0x0028, 0, VR::UL, VM::M1, "AnnotationLineAttachMode" }, { 0x0029, 0x0029, 0, VR::UL, VM::M1, "AnnotationLinePointCount" }, { 0x0029, 0x0030, 0, VR::FD, VM::M1, "AnnotationLinePoints" }, { 0x0029, 0x0031, 0, VR::UL, VM::M1, "AnnotationLineControlSize" }, { 0x0029, 0x0032, 0, VR::LT, VM::M1, "AnnotationMarkerColor" }, { 0x0029, 0x0033, 0, VR::UL, VM::M1, "AnnotationMarkerType" }, { 0x0029, 0x0034, 0, VR::UL, VM::M1, "AnnotationMarkerSize" }, { 0x0029, 0x0035, 0, VR::FD, VM::M1, "AnnotationMarkerLocation" }, { 0x0029, 0x0036, 0, VR::UL, VM::M1, "AnnotationMarkerAttachMode" }, { 0x0029, 0x0037, 0, VR::LT, VM::M1, "AnnotationGeomColor" }, { 0x0029, 0x0038, 0, VR::UL, VM::M1, "AnnotationGeomThickness" }, { 0x0029, 0x0039, 0, VR::UL, VM::M1, "AnnotationGeomLineStyle" }, { 0x0029, 0x0040, 0, VR::UL, VM::M1, "AnnotationGeomDashLength" }, { 0x0029, 0x0041, 0, VR::UL, VM::M1, "AnnotationGeomFillPattern" }, { 0x0029, 0x0042, 0, VR::UL, VM::M1, "AnnotationInteractivity" }, { 0x0029, 0x0043, 0, VR::FD, VM::M1, "AnnotationArrowLength" }, { 0x0029, 0x0044, 0, VR::FD, VM::M1, "AnnotationArrowAngle" }, { 0x0029, 0x0045, 0, VR::UL, VM::M1, "AnnotationDontSave" }, }; const unsigned short Dict256TagHashTable[] = { 36, 41, 46, 49, 52, 35, 35, 35, 55, 58, 61, 64, 67, 70, 75, 80, 83, 86, 35, 35, 35, 89, 35, 92, 95, 100, 105, 110, 115, 120, 123, 126, 35, 35, 129, 0, 2, 18, 41, 30, 65, 2, 17, 40, 31, 66, 1, 32, 67, 1, 33, 68, 1, 34, 69, 1, 10, 33, 1, 9, 32, 1, 12, 35, 1, 11, 34, 1, 14, 37, 2, 8, 25, 13, 36, 2, 7, 24, 16, 39, 1, 15, 38, 1, 28, 57, 1, 27, 56, 1, 0, 17, 1, 2, 19, 2, 1, 18, 20, 49, 2, 4, 21, 19, 48, 2, 3, 20, 22, 51, 2, 6, 23, 21, 50, 2, 5, 22, 24, 53, 1, 23, 52, 1, 26, 55, 1, 25, 54, 1, 29, 64, }; const unsigned short Dict256KeyHashTable[] = { 36, 39, 35, 35, 42, 35, 45, 48, 51, 56, 59, 62, 35, 69, 72, 77, 35, 80, 83, 86, 35, 35, 91, 96, 99, 106, 35, 35, 109, 114, 119, 35, 35, 124, 35, 0, 1, 22, 33164, 1, 21, 58624, 1, 34, 23328, 1, 18, 26951, 1, 10, 54817, 2, 8, 32157, 11, 54817, 1, 24, 5798, 1, 28, 52317, 3, 4, 44730, 15, 55738, 31, 63916, 1, 14, 5983, 2, 9, 15390, 16, 60724, 1, 6, 32709, 1, 26, 32306, 1, 20, 49574, 2, 13, 28491, 27, 25867, 2, 3, 10938, 32, 46141, 1, 1, 53920, 3, 2, 58189, 19, 1199, 33, 14014, 1, 25, 12993, 2, 5, 8503, 30, 2011, 2, 7, 60085, 23, 31648, 2, 0, 61697, 12, 32355, 2, 17, 6091, 29, 37795, }; vtkDICOMDictionary::Dict Dict256Data = { "Silhouette Annot V1.0", 35, 35, Dict256TagHashTable, Dict256KeyHashTable, Dict256Contents }; // ----- Brainlab-S14-SSO ----- const DictEntry Dict257Contents[] = { { 0x0067, 0x0004, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict257TagHashTable[] = { 2, 0, 1, 0, 4, }; const unsigned short Dict257KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict257Data = { "Brainlab-S14-SSO", 1, 1, Dict257TagHashTable, Dict257KeyHashTable, Dict257Contents }; // ----- SIEMENS CT APPL MEASUREMENT ----- const DictEntry Dict258Contents[] = { { 0x0029, 0x0000, 0, VR::UT, VM::M1, "OncologySegmentationMeasurementValues" }, { 0x0029, 0x0001, 0, VR::ST, VM::M1, "OncologyMeasurementRecistStandard" }, { 0x0029, 0x0010, 0, VR::CS, VM::M1, "DualEnergyROIAnnotationMode" }, }; const unsigned short Dict258TagHashTable[] = { 4, 7, 10, 0, 1, 2, 16, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict258KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 61627, 1, 7898, 2, 27039, }; vtkDICOMDictionary::Dict Dict258Data = { "SIEMENS CT APPL MEASUREMENT", 3, 3, Dict258TagHashTable, Dict258KeyHashTable, Dict258Contents }; // ----- GEMS_CT_FLRO_1 ----- const DictEntry Dict259Contents[] = { { 0x0029, 0x0001, 0, VR::SS, VM::M1, "CTIntFluoro" }, { 0x0029, 0x0002, 0, VR::DS, VM::M1, "ImagePreciseLocation" }, }; const unsigned short Dict259TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict259KeyHashTable[] = { 3, 2, 0, 2, 0, 51487, 1, 30694, }; vtkDICOMDictionary::Dict Dict259Data = { "GEMS_CT_FLRO_1", 2, 2, Dict259TagHashTable, Dict259KeyHashTable, Dict259Contents }; // ----- RadWorksMarconi ----- const DictEntry Dict260Contents[] = { { 0x0029, 0x0024, 0, VR::US, VM::M1TN, "KeyFrameIndices" }, }; const unsigned short Dict260TagHashTable[] = { 2, 0, 1, 0, 36, }; const unsigned short Dict260KeyHashTable[] = { 2, 0, 1, 0, 35992, }; vtkDICOMDictionary::Dict Dict260Data = { "RadWorksMarconi", 1, 1, Dict260TagHashTable, Dict260KeyHashTable, Dict260Contents }; // ----- A.L.I. Technologies, Inc. ----- const DictEntry Dict261Contents[] = { { 0x3711, 0x0001, 0, VR::LO, VM::M1, "Filename" }, { 0x3711, 0x0002, 0, VR::OB, VM::M1, "DataBlobOfAVisit" }, { 0x3711, 0x0003, 0, VR::US, VM::M1, "RevisionNumber" }, { 0x3711, 0x0004, 0, VR::UL, VM::M1, "UnixTimestamp" }, { 0x3711, 0x0005, 0, VR::IS, VM::M1, "BagID" }, { 0x3711, 0x000C, 0, VR::UI, VM::M1, "OriginalStudyUID" }, { 0x3711, 0x000D, 0, VR::US, VM::M1, "OverlayGrayscaleValue" }, { 0x3711, 0x000E, 0, VR::CS, VM::M1, "AnonymizationStatus" }, { 0x3711, 0x000F, 0, VR::CS, VM::M1, "InstanceType" }, { 0x3711, 0x0030, 0, VR::LO, VM::M1, "IPConvertedFrame" }, { 0x3711, 0x0097, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict261TagHashTable[] = { 12, 11, 17, 20, 11, 23, 26, 31, 34, 39, 11, 0, 2, 9, 48, 10, 151, 1, 4, 5, 1, 3, 4, 1, 6, 13, 2, 0, 1, 5, 12, 1, 8, 15, 2, 2, 3, 7, 14, 1, 1, 2, }; const unsigned short Dict261KeyHashTable[] = { 11, 11, 12, 15, 20, 27, 30, 11, 11, 35, 38, 0, 1, 10, 489, 2, 5, 40854, 8, 65259, 3, 4, 43240, 7, 7295, 9, 13293, 1, 2, 27112, 2, 1, 21303, 6, 1323, 1, 0, 42967, 1, 3, 27161, }; vtkDICOMDictionary::Dict Dict261Data = { "A.L.I. Technologies, Inc.", 11, 11, Dict261TagHashTable, Dict261KeyHashTable, Dict261Contents }; // ----- SEGAMI MIML ----- const DictEntry Dict262Contents[] = { { 0x0031, 0x0098, 0, VR::OW, VM::M1, "" }, }; const unsigned short Dict262TagHashTable[] = { 2, 0, 1, 0, 152, }; const unsigned short Dict262KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict262Data = { "SEGAMI MIML", 1, 1, Dict262TagHashTable, Dict262KeyHashTable, Dict262Contents }; // ----- EMAGEON JPEG2K INFO ----- const DictEntry Dict263Contents[] = { { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "" }, { 0x0009, 0x0001, 0, VR::DT, VM::M1, "" }, { 0x0023, 0x0013, 0, VR::IS, VM::M1, "" }, { 0x0023, 0x0015, 0, VR::SQ, VM::M1, "" }, { 0x0023, 0x0016, 0, VR::IS, VM::M1, "" }, { 0x0023, 0x0017, 0, VR::FL, VM::M1TN, "" }, { 0x0023, 0x0018, 0, VR::FL, VM::M1TN, "" }, { 0x0023, 0x0019, 0, VR::IS, VM::M1TN, "" }, }; const unsigned short Dict263TagHashTable[] = { 9, 14, 17, 20, 23, 26, 29, 8, 0, 2, 1, 1, 2, 19, 1, 0, 0, 1, 7, 25, 1, 6, 24, 1, 5, 23, 1, 4, 22, 1, 3, 21, }; const unsigned short Dict263KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict263Data = { "EMAGEON JPEG2K INFO", 8, 8, Dict263TagHashTable, Dict263KeyHashTable, Dict263Contents }; // ----- FOEM 1.0 ----- const DictEntry Dict264Contents[] = { { 0x0019, 0x0050, 0, VR::IS, VM::M1, "" }, { 0x0025, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0025, 0x0012, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict264TagHashTable[] = { 5, 8, 4, 13, 0, 1, 0, 80, 2, 1, 16, 3, 32, 1, 2, 18, }; const unsigned short Dict264KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict264Data = { "FOEM 1.0", 4, 4, Dict264TagHashTable, Dict264KeyHashTable, Dict264Contents }; // ----- MeVis eD: Timepoint Information ----- const DictEntry Dict265Contents[] = { { 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" }, { 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" }, { 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" }, { 0x0021, 0x0013, 0, VR::UN, VM::M1, "TimepointGradientDirections" }, { 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" }, }; const unsigned short Dict265TagHashTable[] = { 6, 9, 5, 14, 17, 0, 1, 3, 19, 2, 2, 18, 4, 113, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict265KeyHashTable[] = { 6, 5, 11, 14, 5, 0, 2, 0, 20911, 1, 25769, 1, 2, 4175, 2, 3, 13689, 4, 63720, }; vtkDICOMDictionary::Dict Dict265Data = { "MeVis eD: Timepoint Information", 5, 5, Dict265TagHashTable, Dict265KeyHashTable, Dict265Contents }; // ----- Harmony R2.0 ----- const DictEntry Dict266Contents[] = { { 0x0019, 0x0079, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x007c, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x007d, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0084, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0085, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0086, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0087, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0088, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0089, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008c, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x008d, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x008f, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0091, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0092, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0093, 0, VR::DS, VM::M2, "" }, { 0x0019, 0x0094, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0095, 0, VR::LO, VM::M1TN, "" }, { 0x0019, 0x0096, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0097, 0, VR::IS, VM::M2, "" }, { 0x0019, 0x0099, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict266TagHashTable[] = { 26, 31, 36, 39, 42, 45, 48, 51, 54, 57, 25, 60, 63, 66, 69, 72, 75, 78, 81, 25, 84, 87, 90, 95, 25, 0, 2, 1, 124, 14, 141, 2, 2, 125, 13, 140, 1, 5, 131, 1, 4, 130, 1, 3, 129, 1, 24, 153, 1, 9, 135, 1, 8, 134, 1, 7, 133, 1, 6, 132, 1, 19, 147, 1, 18, 146, 1, 17, 145, 1, 16, 144, 1, 23, 151, 1, 22, 150, 1, 21, 149, 1, 20, 148, 1, 12, 138, 1, 11, 137, 2, 0, 121, 10, 136, 1, 15, 143, }; const unsigned short Dict266KeyHashTable[] = { 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 215, 1, 215, 2, 215, 3, 215, 4, 215, 5, 215, 6, 215, 7, 215, 8, 215, 9, 215, 10, 215, 11, 215, 12, 215, 13, 215, 14, 215, 15, 215, 16, 215, 17, 215, 18, 215, 19, 215, 20, 215, 21, 215, 22, 215, 23, 215, 24, 215, }; vtkDICOMDictionary::Dict Dict266Data = { "Harmony R2.0", 25, 25, Dict266TagHashTable, Dict266KeyHashTable, Dict266Contents }; // ----- PAPYRUS ----- const DictEntry Dict267Contents[] = { { 0x0009, 0x0000, 0, VR::LT, VM::M1, "OriginalFileName" }, { 0x0009, 0x0010, 0, VR::LT, VM::M1, "OriginalFileLocation" }, { 0x0009, 0x0018, 0, VR::LT, VM::M1, "DataSetIdentifier" }, { 0x0041, 0x0000, 0, VR::LT, VM::M1TN, "PapyrusComments" }, { 0x0041, 0x0010, 0, VR::US, VM::M1, "FolderType" }, { 0x0041, 0x0011, 0, VR::LT, VM::M1, "PatientFolderDataSetID" }, { 0x0041, 0x0020, 0, VR::LT, VM::M1, "FolderName" }, { 0x0041, 0x0030, 0, VR::DA, VM::M1, "CreationDate" }, { 0x0041, 0x0032, 0, VR::TM, VM::M1, "CreationTime" }, { 0x0041, 0x0034, 0, VR::DA, VM::M1, "ModifiedDate" }, { 0x0041, 0x0036, 0, VR::TM, VM::M1, "ModifiedTime" }, { 0x0041, 0x0040, 0, VR::LT, VM::M1TN, "OwnerName" }, { 0x0041, 0x0050, 0, VR::LT, VM::M1, "FolderStatus" }, { 0x0041, 0x0060, 0, VR::UL, VM::M1, "NumberOfImages" }, { 0x0041, 0x0062, 0, VR::UL, VM::M1, "NumberOfOther" }, { 0x0041, 0x00a0, 0, VR::LT, VM::M1TN, "ExternalFolderElementDSID" }, { 0x0041, 0x00a1, 0, VR::US, VM::M1TN, "ExternalFolderElementDataSetType" }, { 0x0041, 0x00a2, 0, VR::LT, VM::M1TN, "ExternalFolderElementFileLocation" }, { 0x0041, 0x00a3, 0, VR::UL, VM::M1TN, "ExternalFolderElementLength" }, { 0x0041, 0x00b0, 0, VR::LT, VM::M1TN, "InternalFolderElementDSID" }, { 0x0041, 0x00b1, 0, VR::US, VM::M1TN, "InternalFolderElementDataSetType" }, { 0x0041, 0x00b2, 0, VR::UL, VM::M1TN, "InternalOffsetToDataSet" }, { 0x0041, 0x00b3, 0, VR::UL, VM::M1TN, "InternalOffsetToImage" }, }; const unsigned short Dict267TagHashTable[] = { 23, 24, 29, 32, 35, 23, 23, 23, 23, 38, 41, 46, 51, 58, 23, 23, 23, 61, 68, 73, 76, 23, 81, 0, 2, 9, 52, 11, 64, 1, 1, 16, 1, 10, 54, 1, 6, 32, 1, 0, 0, 2, 13, 96, 21, 178, 2, 4, 16, 22, 179, 3, 5, 17, 14, 98, 19, 176, 1, 20, 177, 3, 2, 24, 12, 80, 17, 162, 2, 3, 0, 18, 163, 1, 15, 160, 2, 7, 48, 16, 161, 1, 8, 50, }; const unsigned short Dict267KeyHashTable[] = { 24, 23, 27, 23, 23, 30, 33, 23, 36, 47, 23, 23, 52, 55, 23, 23, 58, 61, 64, 69, 74, 79, 23, 0, 1, 7, 24168, 1, 2, 54676, 1, 10, 24752, 1, 6, 55492, 5, 0, 4965, 3, 12801, 18, 24120, 19, 59452, 21, 6310, 2, 8, 49536, 17, 25490, 1, 5, 9643, 1, 16, 5791, 1, 22, 60441, 1, 12, 5004, 2, 4, 471, 15, 12000, 2, 9, 64919, 13, 61194, 2, 1, 49657, 14, 5431, 2, 11, 65124, 20, 22909, }; vtkDICOMDictionary::Dict Dict267Data = { "PAPYRUS", 23, 23, Dict267TagHashTable, Dict267KeyHashTable, Dict267Contents }; // ----- Philips Imaging DD 070 ----- const DictEntry Dict268Contents[] = { { 0x4001, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x4001, 0x0011, 0, VR::SQ, VM::M1, "" }, { 0x4001, 0x0012, 0, VR::SQ, VM::M1, "" }, { 0x4001, 0x0013, 0, VR::ST, VM::M1, "" }, { 0x4001, 0x0016, 0, VR::ST, VM::M1, "" }, { 0x4001, 0x0017, 0, VR::ST, VM::M1, "" }, { 0x4001, 0x0018, 0, VR::ST, VM::M1, "" }, { 0x4001, 0x001c, 0, VR::SQ, VM::M1, "" }, { 0x4001, 0x001d, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict268TagHashTable[] = { 10, 15, 9, 18, 21, 9, 24, 29, 32, 0, 2, 2, 18, 8, 29, 1, 7, 28, 1, 5, 23, 1, 4, 22, 2, 1, 17, 6, 24, 1, 0, 16, 1, 3, 19, }; const unsigned short Dict268KeyHashTable[] = { 9, 9, 9, 9, 9, 9, 9, 9, 10, 0, 9, 0, 597, 1, 597, 2, 597, 3, 597, 4, 597, 5, 597, 6, 597, 7, 597, 8, 597, }; vtkDICOMDictionary::Dict Dict268Data = { "Philips Imaging DD 070", 9, 9, Dict268TagHashTable, Dict268KeyHashTable, Dict268Contents }; // ----- TOSHIBA_MEC_XA3 ----- const DictEntry Dict269Contents[] = { { 0x7079, 0x0021, 0, VR::SH, VM::M5, "" }, { 0x7079, 0x0022, 0, VR::IS, VM::M2, "" }, { 0x7079, 0x0023, 0, VR::IS, VM::M2, "" }, { 0x7079, 0x0024, 0, VR::DS, VM::M1, "" }, { 0x7079, 0x0025, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0026, 0, VR::DS, VM::M2, "" }, { 0x7079, 0x0027, 0, VR::US, VM::M2, "" }, { 0x7079, 0x0028, 0, VR::US, VM::M1, "" }, { 0x7079, 0x002a, 0, VR::US, VM::M5, "" }, { 0x7079, 0x002c, 0, VR::SH, VM::M3, "" }, { 0x7079, 0x002d, 0, VR::SS, VM::M2, "" }, { 0x7079, 0x002e, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x002f, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0030, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0031, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0032, 0, VR::SH, VM::M2, "" }, { 0x7079, 0x0033, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0034, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0035, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0036, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0037, 0, VR::US, VM::M4, "" }, { 0x7079, 0x0038, 0, VR::SS, VM::M1TN, "" }, { 0x7079, 0x0039, 0, VR::SS, VM::M1TN, "" }, { 0x7079, 0x003a, 0, VR::US, VM::M2, "" }, { 0x7079, 0x003b, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x003c, 0, VR::DS, VM::M2, "" }, { 0x7079, 0x003d, 0, VR::SS, VM::M2, "" }, { 0x7079, 0x003e, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x003f, 0, VR::US, VM::M2, "" }, { 0x7079, 0x0040, 0, VR::SH, VM::M2, "" }, { 0x7079, 0x0041, 0, VR::SS, VM::M2, "" }, { 0x7079, 0x0042, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0043, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0044, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0045, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0046, 0, VR::SS, VM::M1, "" }, { 0x7079, 0x0047, 0, VR::SS, VM::M18, "" }, { 0x7079, 0x0048, 0, VR::US, VM::M12, "" }, { 0x7079, 0x0049, 0, VR::US, VM::M3, "" }, { 0x7079, 0x004a, 0, VR::US, VM::M1, "" }, { 0x7079, 0x004b, 0, VR::LO, VM::M3, "" }, { 0x7079, 0x004c, 0, VR::OB, VM::M1, "" }, { 0x7079, 0x004d, 0, VR::SH, VM::M3, "" }, { 0x7079, 0x004e, 0, VR::SL, VM::M35, "" }, { 0x7079, 0x004f, 0, VR::SH, VM::M3, "" }, { 0x7079, 0x0050, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0051, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0052, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0053, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0054, 0, VR::US, VM::M5, "" }, { 0x7079, 0x0055, 0, VR::UL, VM::M47T47N, "" }, { 0x7079, 0x0056, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0057, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0058, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0059, 0, VR::US, VM::M2T2N, "" }, { 0x7079, 0x005a, 0, VR::US, VM::M1, "" }, { 0x7079, 0x005b, 0, VR::US, VM::M2, "" }, { 0x7079, 0x005c, 0, VR::US, VM::M2T2N, "" }, { 0x7079, 0x005d, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x005e, 0, VR::US, VM::M2, "" }, { 0x7079, 0x005f, 0, VR::SS, VM::M4T4N, "" }, { 0x7079, 0x0060, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0061, 0, VR::SS, VM::M30T30N, "" }, { 0x7079, 0x0062, 0, VR::US, VM::M4, "" }, { 0x7079, 0x0063, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0064, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0065, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0066, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0067, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0068, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x0069, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x006a, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x006b, 0, VR::US, VM::M1TN, "" }, { 0x7079, 0x006c, 0, VR::US, VM::M1, "" }, { 0x7079, 0x006d, 0, VR::DS, VM::M1, "" }, { 0x7079, 0x006e, 0, VR::LO, VM::M1, "" }, { 0x7079, 0x006f, 0, VR::DS, VM::M1, "" }, { 0x7079, 0x0070, 0, VR::DS, VM::M1, "" }, { 0x7079, 0x0071, 0, VR::DS, VM::M1TN, "" }, { 0x7079, 0x0072, 0, VR::DS, VM::M1TN, "" }, { 0x7079, 0x0073, 0, VR::SL, VM::M4, "" }, { 0x7079, 0x0074, 0, VR::SL, VM::M28, "" }, { 0x7079, 0x0075, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0076, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0077, 0, VR::SL, VM::M1, "" }, { 0x7079, 0x0078, 0, VR::US, VM::M1, "" }, { 0x7079, 0x0079, 0, VR::US, VM::M1, "" }, { 0x7079, 0x007b, 0, VR::SH, VM::M1, "" }, { 0x7079, 0x0080, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict269TagHashTable[] = { 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 93, 96, 89, 89, 89, 89, 89, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 238, 243, 248, 253, 258, 263, 268, 271, 276, 281, 286, 291, 296, 301, 306, 309, 312, 315, 318, 321, 324, 89, 89, 89, 89, 89, 89, 89, 89, 0, 1, 86, 121, 1, 85, 120, 1, 87, 123, 1, 78, 113, 1, 77, 112, 1, 80, 115, 1, 79, 114, 1, 82, 117, 1, 81, 116, 1, 84, 119, 1, 83, 118, 1, 70, 105, 1, 69, 104, 1, 72, 107, 1, 71, 106, 1, 74, 109, 1, 73, 108, 1, 76, 111, 1, 75, 110, 1, 62, 97, 2, 21, 56, 61, 96, 2, 22, 57, 64, 99, 2, 23, 58, 63, 98, 2, 24, 59, 66, 101, 2, 25, 60, 65, 100, 2, 26, 61, 68, 103, 2, 27, 62, 67, 102, 2, 28, 63, 54, 89, 2, 13, 48, 53, 88, 2, 14, 49, 56, 91, 2, 15, 50, 55, 90, 2, 16, 51, 58, 93, 2, 17, 52, 57, 92, 2, 18, 53, 60, 95, 2, 19, 54, 59, 94, 2, 20, 55, 46, 81, 2, 7, 40, 45, 80, 1, 48, 83, 2, 8, 42, 47, 82, 2, 50, 85, 88, 128, 2, 9, 44, 49, 84, 2, 10, 45, 52, 87, 2, 11, 46, 51, 86, 2, 12, 47, 38, 73, 1, 37, 72, 2, 0, 33, 40, 75, 2, 1, 34, 39, 74, 2, 2, 35, 42, 77, 2, 3, 36, 41, 76, 2, 4, 37, 44, 79, 2, 5, 38, 43, 78, 2, 6, 39, 30, 65, 1, 29, 64, 1, 32, 67, 1, 31, 66, 1, 34, 69, 1, 33, 68, 1, 36, 71, 1, 35, 70, }; const unsigned short Dict269KeyHashTable[] = { 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 89, 0, 60, 1, 60, 2, 60, 3, 60, 4, 60, 5, 60, 6, 60, 7, 60, 8, 60, 9, 60, 10, 60, 11, 60, 12, 60, 13, 60, 14, 60, 15, 60, 16, 60, 17, 60, 18, 60, 19, 60, 20, 60, 21, 60, 22, 60, 23, 60, 24, 60, 25, 60, 26, 60, 27, 60, 28, 60, 29, 60, 30, 60, 31, 60, 32, 60, 33, 60, 34, 60, 35, 60, 36, 60, 37, 60, 38, 60, 39, 60, 40, 60, 41, 60, 42, 60, 43, 60, 44, 60, 45, 60, 46, 60, 47, 60, 48, 60, 49, 60, 50, 60, 51, 60, 52, 60, 53, 60, 54, 60, 55, 60, 56, 60, 57, 60, 58, 60, 59, 60, 60, 60, 61, 60, 62, 60, 63, 60, 64, 60, 65, 60, 66, 60, 67, 60, 68, 60, 69, 60, 70, 60, 71, 60, 72, 60, 73, 60, 74, 60, 75, 60, 76, 60, 77, 60, 78, 60, 79, 60, 80, 60, 81, 60, 82, 60, 83, 60, 84, 60, 85, 60, 86, 60, 87, 60, 88, 60, }; vtkDICOMDictionary::Dict Dict269Data = { "TOSHIBA_MEC_XA3", 89, 89, Dict269TagHashTable, Dict269KeyHashTable, Dict269Contents }; // ----- Philips Imaging DD 073 ----- const DictEntry Dict270Contents[] = { { 0x4007, 0x0048, 0, VR::FL, VM::M1, "" }, { 0x4007, 0x004b, 0, VR::FL, VM::M1, "" }, { 0x4007, 0x004c, 0, VR::LO, VM::M1, "" }, { 0x4007, 0x004d, 0, VR::FL, VM::M1, "" }, { 0x4007, 0x004e, 0, VR::FL, VM::M1, "" }, { 0x4007, 0x004f, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict270TagHashTable[] = { 6, 7, 10, 15, 18, 21, 0, 1, 1, 75, 2, 0, 72, 4, 78, 1, 5, 79, 1, 2, 76, 1, 3, 77, }; const unsigned short Dict270KeyHashTable[] = { 6, 6, 6, 6, 6, 7, 0, 6, 0, 896, 1, 896, 2, 896, 3, 896, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict270Data = { "Philips Imaging DD 073", 6, 6, Dict270TagHashTable, Dict270KeyHashTable, Dict270Contents }; // ----- SEGAMI_HEADER ----- const DictEntry Dict271Contents[] = { { 0x0029, 0x0031, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0032, 0, VR::OW, VM::M1, "" }, }; const unsigned short Dict271TagHashTable[] = { 3, 6, 0, 1, 0, 49, 1, 1, 50, }; const unsigned short Dict271KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict271Data = { "SEGAMI_HEADER", 2, 2, Dict271TagHashTable, Dict271KeyHashTable, Dict271Contents }; // ----- IMS s.r.l. Mammography Private Code ----- const DictEntry Dict272Contents[] = { { 0x1271, 0x0001, 0, VR::IS, VM::M1, "Threshold1" }, { 0x1271, 0x0002, 0, VR::IS, VM::M1, "Threshold2" }, { 0x1271, 0x0010, 0, VR::IS, VM::M1, "SegmentationLeftBorder" }, { 0x1271, 0x0011, 0, VR::IS, VM::M1, "SegmentationRightBorder" }, { 0x1271, 0x0012, 0, VR::IS, VM::M1, "SegmentationTopBorder" }, { 0x1271, 0x0013, 0, VR::IS, VM::M1, "SegmentationBottomBorder" }, { 0x1271, 0x0020, 0, VR::IS, VM::M1, "CompressorStatus" }, { 0x1271, 0x0021, 0, VR::IS, VM::M1, "CollimatorType" }, { 0x1271, 0x0022, 0, VR::IS, VM::M1, "BiopsySpecimen" }, { 0x1271, 0x0030, 0, VR::IS, VM::M1, "PrinterSegmentation" }, { 0x1271, 0x0031, 0, VR::IS, VM::M1, "Printer8x10Format" }, { 0x1271, 0x0032, 0, VR::FD, VM::M1, "Printer8x10SizeX" }, { 0x1271, 0x0033, 0, VR::FD, VM::M1, "Printer8x10SizeY" }, { 0x1271, 0x0034, 0, VR::IS, VM::M1, "Printer8x10AreaLeftBorder" }, { 0x1271, 0x0035, 0, VR::IS, VM::M1, "Printer8x10AreaRightBorder" }, { 0x1271, 0x0036, 0, VR::IS, VM::M1, "Printer8x10AreaTopBorder" }, { 0x1271, 0x0037, 0, VR::IS, VM::M1, "Printer8x10AreaBottomBorder" }, { 0x1271, 0x0038, 0, VR::LO, VM::M1, "RotationAndInclinationSensorPresence" }, { 0x1271, 0x0039, 0, VR::US, VM::M1TN, "WindowCenterForForProcessingImages" }, { 0x1271, 0x0040, 0, VR::US, VM::M1TN, "WindowWidthForForProcessingImages" }, { 0x1271, 0x0041, 0, VR::LO, VM::M1TN, "WindowCenterAndWidthExplanationForForProcessingImages" }, { 0x1271, 0x0042, 0, VR::LT, VM::M1, "ProcessingInformation" }, { 0x1271, 0x0043, 0, VR::LT, VM::M1, "Filename" }, { 0x1271, 0x0044, 0, VR::LT, VM::M1, "ContrastView" }, { 0x1271, 0x0045, 0, VR::IS, VM::M1, "Threshold3" }, { 0x1271, 0x0046, 0, VR::IS, VM::M1, "Threshold4" }, { 0x1271, 0x0047, 0, VR::IS, VM::M1, "Threshold5" }, { 0x1271, 0x0048, 0, VR::IS, VM::M1, "Threshold6" }, { 0x1271, 0x0049, 0, VR::IS, VM::M1, "Threshold7" }, { 0x1271, 0x0050, 0, VR::IS, VM::M1, "Threshold8" }, { 0x1271, 0x0051, 0, VR::IS, VM::M1, "Threshold9" }, { 0x1271, 0x0052, 0, VR::IS, VM::M1, "Threshold9" }, { 0x1271, 0x0053, 0, VR::IS, VM::M1, "ScalingFactorForProcessing" }, { 0x1271, 0x0054, 0, VR::IS, VM::M1, "ConfirmXImage" }, { 0x1271, 0x0055, 0, VR::IS, VM::M1, "Backgroundcounts" }, { 0x1271, 0x0056, 0, VR::IS, VM::M1, "WLRoiAreaX" }, { 0x1271, 0x0057, 0, VR::IS, VM::M1, "WLRoiAreaY" }, { 0x1271, 0x0060, 0, VR::IS, VM::M1, "SecondProcessingImage" }, { 0x1271, 0x0061, 0, VR::IS, VM::M1, "SFilter" }, { 0x1271, 0x0062, 0, VR::IS, VM::M1, "UFilter" }, { 0x1271, 0x0063, 0, VR::IS, VM::M1, "Anonymous" }, { 0x1271, 0x0070, 0, VR::IS, VM::M1, "TomoSAD" }, { 0x1271, 0x0071, 0, VR::IS, VM::M1, "TomoDetectorYAW" }, { 0x1271, 0x0072, 0, VR::IS, VM::M1, "TomoDetectorPitch" }, { 0x1271, 0x0073, 0, VR::IS, VM::M1, "TomoDetectorRoll" }, { 0x1271, 0x0074, 0, VR::IS, VM::M1, "TomoFocalSpotX" }, { 0x1271, 0x0075, 0, VR::IS, VM::M1, "TomoFocalSpotY" }, { 0x1271, 0x0076, 0, VR::IS, VM::M1, "TomoXrayStartAngle" }, { 0x1271, 0x0077, 0, VR::IS, VM::M1, "TomoXrayEndAngle" }, { 0x1271, 0x0078, 0, VR::IS, VM::M1, "TomoXrayAngle" }, { 0x1271, 0x0079, 0, VR::IS, VM::M1, "TomoExposureCounter" }, { 0x1271, 0x0080, 0, VR::IS, VM::M1, "TomoExposureNumber" }, { 0x1271, 0x0081, 0, VR::IS, VM::M1, "TomoWLModified" }, { 0x1271, 0x0082, 0, VR::IS, VM::M1, "TomoProjection" }, { 0x1271, 0x0083, 0, VR::IS, VM::M1, "KeyObjectSelectionTitleCode" }, { 0x1271, 0x0084, 0, VR::IS, VM::M1, "RejectedForQualityReasonsCode" }, { 0x1271, 0x0085, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict272TagHashTable[] = { 58, 63, 68, 73, 78, 85, 90, 97, 102, 105, 108, 113, 118, 121, 57, 124, 127, 130, 57, 57, 57, 57, 133, 136, 139, 142, 57, 57, 57, 57, 57, 145, 148, 151, 154, 57, 57, 57, 157, 160, 163, 166, 169, 172, 175, 178, 181, 184, 187, 192, 57, 57, 57, 57, 197, 200, 205, 0, 2, 10, 49, 21, 66, 2, 11, 50, 24, 69, 2, 12, 51, 23, 68, 2, 13, 52, 26, 71, 3, 14, 53, 25, 70, 53, 130, 2, 15, 54, 54, 131, 3, 16, 55, 42, 113, 51, 128, 2, 41, 112, 52, 129, 1, 44, 115, 1, 43, 114, 2, 46, 117, 55, 132, 2, 45, 116, 56, 133, 1, 48, 119, 1, 47, 118, 1, 6, 32, 1, 7, 33, 1, 8, 34, 1, 38, 97, 1, 37, 96, 1, 40, 99, 1, 39, 98, 1, 2, 16, 1, 3, 17, 1, 4, 18, 1, 5, 19, 1, 30, 81, 1, 29, 80, 1, 32, 83, 1, 31, 82, 1, 34, 85, 1, 33, 84, 1, 36, 87, 1, 35, 86, 1, 28, 73, 1, 27, 72, 2, 0, 1, 17, 56, 2, 1, 2, 18, 57, 1, 20, 65, 2, 19, 64, 50, 121, 3, 9, 48, 22, 67, 49, 120, }; const unsigned short Dict272KeyHashTable[] = { 57, 58, 57, 61, 64, 67, 57, 70, 57, 73, 76, 83, 88, 93, 98, 103, 106, 111, 114, 57, 57, 119, 57, 124, 127, 130, 135, 57, 138, 143, 57, 57, 146, 149, 57, 154, 159, 57, 57, 162, 57, 165, 57, 57, 168, 175, 178, 183, 188, 57, 191, 57, 194, 197, 202, 205, 208, 0, 1, 38, 51365, 1, 19, 65331, 1, 35, 42999, 1, 36, 42999, 1, 15, 165, 1, 39, 31215, 3, 0, 1249, 10, 64929, 18, 5021, 2, 1, 1249, 47, 13826, 2, 24, 1249, 37, 52061, 2, 22, 58881, 25, 1249, 2, 5, 4920, 26, 1249, 1, 27, 1249, 2, 28, 1249, 33, 60270, 1, 29, 1249, 2, 30, 1249, 31, 1249, 2, 3, 42538, 9, 31250, 1, 56, 94, 1, 43, 34766, 2, 6, 14437, 45, 54942, 1, 46, 54942, 2, 23, 25858, 49, 39339, 1, 42, 60802, 1, 53, 54505, 2, 13, 29395, 40, 29621, 2, 34, 22478, 50, 27804, 1, 51, 15300, 1, 17, 19560, 1, 41, 37803, 3, 2, 49680, 8, 53659, 55, 22317, 1, 52, 4883, 2, 4, 37606, 21, 27978, 2, 7, 17854, 20, 63510, 1, 44, 29983, 1, 14, 61829, 1, 16, 19522, 2, 11, 59480, 48, 32249, 1, 12, 59480, 1, 54, 58457, 1, 32, 14681, }; vtkDICOMDictionary::Dict Dict272Data = { "IMS s.r.l. Mammography Private Code", 57, 57, Dict272TagHashTable, Dict272KeyHashTable, Dict272Contents }; // ----- Silhouette Sequence Ids V1.0 ----- const DictEntry Dict273Contents[] = { { 0x0029, 0x0041, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0042, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0043, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict273TagHashTable[] = { 4, 7, 10, 0, 1, 0, 65, 1, 1, 66, 1, 2, 67, }; const unsigned short Dict273KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict273Data = { "Silhouette Sequence Ids V1.0", 3, 3, Dict273TagHashTable, Dict273KeyHashTable, Dict273Contents }; // ----- SIEMENS SYNGO ADVANCED PRESENTATION ----- const DictEntry Dict274Contents[] = { { 0x0029, 0x0000, 0, VR::CS, VM::M1, "PresentationName" }, { 0x0029, 0x0001, 0, VR::CS, VM::M1, "PresentationType" }, { 0x0029, 0x0002, 0, VR::SQ, VM::M1, "AdvancedPresentationSequence" }, { 0x0029, 0x0003, 0, VR::SQ, VM::M1, "TimePointSequence" }, { 0x0029, 0x0004, 0, VR::SQ, VM::M1, "BaseImageSequence" }, { 0x0029, 0x0005, 0, VR::SQ, VM::M1, "OverlayImageSequence" }, { 0x0029, 0x0006, 0, VR::SQ, VM::M1, "RegistrationInstanceSequence" }, { 0x0029, 0x0007, 0, VR::SQ, VM::M1, "RealWorldValueMappingInstanceSequence" }, { 0x0029, 0x0008, 0, VR::SQ, VM::M1, "MeasurementSequence" }, { 0x0029, 0x0009, 0, VR::UI, VM::M1, "MeasurementUID" }, { 0x0029, 0x0010, 0, VR::SQ, VM::M1, "SegmentationSequence" }, { 0x0029, 0x0011, 0, VR::UI, VM::M1, "SegmentationUID" }, { 0x0029, 0x0012, 0, VR::SQ, VM::M1, "NavigationSequence" }, { 0x0029, 0x0013, 0, VR::CS, VM::M1, "NavigationName" }, { 0x0029, 0x0014, 0, VR::CS, VM::M1, "AutoNavigationDirection" }, { 0x0029, 0x0015, 0, VR::DS, VM::M1, "AutoNavigationFrameRate" }, { 0x0029, 0x0016, 0, VR::CS, VM::M1, "AutoNavigationMode" }, { 0x0029, 0x0017, 0, VR::DS, VM::M1, "AutoNavigationRealtimeSpeed" }, { 0x0029, 0x0018, 0, VR::CS, VM::M1, "AutoNavigationStrategy" }, { 0x0029, 0x0019, 0, VR::CS, VM::M1, "AutoNavigationRealtimeFlag" }, { 0x0029, 0x0020, 0, VR::IS, VM::M1, "IndexNavigationCurrentIndex" }, { 0x0029, 0x0021, 0, VR::IS, VM::M1, "IndexAutoNavigationSkippingDegree" }, { 0x0029, 0x0022, 0, VR::DS, VM::M1, "VolumeNavigationMinimumPixelSpacing" }, { 0x0029, 0x0023, 0, VR::CS, VM::M1, "VolumeNavigationScrollUnit" }, { 0x0029, 0x0024, 0, VR::DS, VM::M1, "VolumeNavigationStepSize" }, { 0x0029, 0x0025, 0, VR::DS, VM::M1, "VolumeNavigationJumpSize" }, { 0x0029, 0x0026, 0, VR::IS, VM::M1, "ReferencedRegistrationNumber" }, { 0x0029, 0x0027, 0, VR::UI, VM::M1, "RealWorldValueMappingUID" }, { 0x0029, 0x0028, 0, VR::DS, VM::M1, "ChannelAlphaValue" }, { 0x0029, 0x0030, 0, VR::LO, VM::M1, "MeasurementApplicationName" }, { 0x0029, 0x0031, 0, VR::SQ, VM::M1, "MeasurementDataSequence" }, { 0x0029, 0x0032, 0, VR::LO, VM::M1, "MeasurementType" }, { 0x0029, 0x0033, 0, VR::UI, VM::M1, "MeasurementFrameOfReferenceUID" }, { 0x0029, 0x0034, 0, VR::UI, VM::M1, "MeasurementUid" }, { 0x0029, 0x0035, 0, VR::IS, VM::M1, "MeasurementApplicationNumber" }, { 0x0029, 0x0036, 0, VR::ST, VM::M1, "MeasurementApplicationNumberPrefixText" }, { 0x0029, 0x0037, 0, VR::CS, VM::M1, "MeasurementGraphicIsVisibleFlag" }, { 0x0029, 0x0038, 0, VR::UI, VM::M4, "ReferencedSyngoUID" }, { 0x0029, 0x0039, 0, VR::UI, VM::M1, "ClinicalFindingUID" }, { 0x0029, 0x003A, 0, VR::CS, VM::M1, "MeasurementEvaluationStringValue" }, { 0x0029, 0x003B, 0, VR::IS, VM::M1, "MeasurementEvaluationIntegerValue" }, { 0x0029, 0x003C, 0, VR::FL, VM::M1, "MeasurementEvaluationDecimalValue" }, { 0x0029, 0x003D, 0, VR::CS, VM::M1, "MeasurementLineShowCenterFlag" }, { 0x0029, 0x003E, 0, VR::CS, VM::M1, "MeasurementAngleShowArrowTipFlag" }, { 0x0029, 0x003F, 0, VR::SQ, VM::M1, "CameraHomeSettingsSequence" }, { 0x0029, 0x0040, 0, VR::DS, VM::M1, "CameraZoom" }, { 0x0029, 0x0041, 0, VR::DS, VM::M3, "CameraPosition" }, { 0x0029, 0x0042, 0, VR::DS, VM::M4, "CameraOrientation" }, { 0x0029, 0x0043, 0, VR::DS, VM::M1, "CameraFarClipPlane" }, { 0x0029, 0x0044, 0, VR::DS, VM::M1, "CameraNearClipPlane" }, { 0x0029, 0x0045, 0, VR::DS, VM::M1, "CameraThickness" }, { 0x0029, 0x0046, 0, VR::DS, VM::M1, "CameraViewPortSize" }, { 0x0029, 0x0047, 0, VR::DS, VM::M1, "CameraAspectRatio" }, { 0x0029, 0x0048, 0, VR::LO, VM::M1, "CameraProjectionType" }, { 0x0029, 0x0049, 0, VR::DS, VM::M1, "CameraFieldOfView" }, { 0x0029, 0x004A, 0, VR::DS, VM::M1, "CameraImagePlaneDistance" }, { 0x0029, 0x004B, 0, VR::DS, VM::M1, "CameraImageMaximumHeight" }, { 0x0029, 0x004C, 0, VR::DS, VM::M1, "CameraImageMinimumHeight" }, { 0x0029, 0x004D, 0, VR::DS, VM::M1, "ParallelShiftIntervalMM" }, { 0x0029, 0x004E, 0, VR::DS, VM::M3, "ParallelShiftBoundingBoxMinimum" }, { 0x0029, 0x004F, 0, VR::DS, VM::M3, "ParallelShiftBoundingBoxMaximum" }, { 0x0029, 0x0050, 0, VR::CS, VM::M1, "RendererVertexIsCharacteristicFlag" }, { 0x0029, 0x0051, 0, VR::CS, VM::M1, "RendererThicknessUsageFlag" }, { 0x0029, 0x0052, 0, VR::DS, VM::M4, "RendererThreshold" }, { 0x0029, 0x0053, 0, VR::DS, VM::M4, "RendererMaterial" }, { 0x0029, 0x0054, 0, VR::DS, VM::M4, "RendererDirectionalLightColor" }, { 0x0029, 0x0055, 0, VR::DS, VM::M3, "RendererDirectionalLightDirection" }, { 0x0029, 0x0056, 0, VR::CS, VM::M1, "RendererDirectionalLightTwoSideUsageFlag" }, { 0x0029, 0x0057, 0, VR::SQ, VM::M1, "RendererPWLTransferFunctionSequence" }, { 0x0029, 0x0058, 0, VR::IS, VM::M0TN, "RendererPWLVertexIndex" }, { 0x0029, 0x0059, 0, VR::DS, VM::M0TN, "RendererPWLVertexColor" }, { 0x0029, 0x005A, 0, VR::CS, VM::M1, "RendererIsCameraRequiredFlag" }, { 0x0029, 0x005B, 0, VR::CS, VM::M1, "RendererDoDepthTestFlag" }, { 0x0029, 0x005C, 0, VR::CS, VM::M1, "RendererDirectionalLightUsageFlag" }, { 0x0029, 0x005D, 0, VR::SQ, VM::M1, "RendererThicknessSequence" }, { 0x0029, 0x005E, 0, VR::SQ, VM::M0TN, "RendererSliceSpacingSequence" }, { 0x0029, 0x005F, 0, VR::DS, VM::M1, "RendererSamplingDistance" }, { 0x0029, 0x0060, 0, VR::DS, VM::M1, "RendererInitialSamplingDistance" }, { 0x0029, 0x0061, 0, VR::SQ, VM::M1, "SegmentationDisplayDataSequence" }, { 0x0029, 0x0062, 0, VR::UI, VM::M0TN, "SegmentationDisplayDataUID" }, { 0x0029, 0x0063, 0, VR::SQ, VM::M1, "SegmentationDisplayParameterSequence" }, { 0x0029, 0x0064, 0, VR::LO, VM::M1, "SegmentationDisplayParameterType" }, { 0x0029, 0x0065, 0, VR::LO, VM::M1, "SegmentationDisplayVisibility" }, { 0x0029, 0x0066, 0, VR::DS, VM::M4, "SegmentationDisplayColor" }, { 0x0029, 0x0067, 0, VR::CS, VM::M1, "SegmentationDisplayIsSelectedFlag" }, { 0x0029, 0x0068, 0, VR::OB, VM::M1, "SegmentationAdditionalInformationBlob" }, { 0x0029, 0x0069, 0, VR::ST, VM::M1, "HashCodeValue" }, { 0x0029, 0x006A, 0, VR::LO, VM::M1TN, "SegmentationVersionIdentifier" }, { 0x0029, 0x0070, 0, VR::DS, VM::M3, "SegmentationVolumeSize" }, { 0x0029, 0x0071, 0, VR::UI, VM::M1TN, "RegistrationReferencedFrames" }, { 0x0029, 0x0072, 0, VR::UI, VM::M1TN, "RegistrationReferencedRegistrations" }, { 0x0029, 0x0073, 0, VR::LO, VM::M1, "RegistrationCreationAlgorithmName" }, { 0x0029, 0x0074, 0, VR::CS, VM::M1, "ECGGraphicType" }, { 0x0029, 0x007A, 0, VR::DS, VM::M1, "SegmentationVolumeStorageDataType" }, { 0x0029, 0x007B, 0, VR::FL, VM::M16, "SegmentationVolumeModelMatrix" }, { 0x0029, 0x0080, 0, VR::DS, VM::M3, "CameraRotationAxis" }, { 0x0029, 0x0081, 0, VR::SL, VM::M0TN, "OverlayHiddenDisplayAttributes" }, { 0x0029, 0x0082, 0, VR::LO, VM::M1, "PresentationStateGroupIdentifier" }, { 0x0029, 0x0083, 0, VR::US, VM::M1, "TemporarySmallestImagePixelValue" }, { 0x0029, 0x0084, 0, VR::DS, VM::M3, "CameraRotationCenter" }, { 0x0029, 0x0085, 0, VR::CS, VM::M1, "CameraRotationCenterUsageFlag" }, { 0x0029, 0x0086, 0, VR::DS, VM::M12, "CameraParallelEpiped" }, { 0x0029, 0x0087, 0, VR::DS, VM::M1, "CameraMaxZoomInFactor" }, { 0x0029, 0x0088, 0, VR::DS, VM::M1, "CameraMinZoomInFactor" }, { 0x0029, 0x0089, 0, VR::US, VM::M1, "TemporaryLargestImagePixelValue" }, { 0x0029, 0x008A, 0, VR::CS, VM::M1, "CameraRotationAxisUsageFlag" }, { 0x0029, 0x008B, 0, VR::DS, VM::M3, "MeasurementSurfaceNormal" }, { 0x0029, 0x008C, 0, VR::FL, VM::M16, "MeasurementEllipsoidModelMatrix" }, { 0x0029, 0x008D, 0, VR::LO, VM::M1, "MeasurementEvaluationDataRoleID" }, { 0x0029, 0x008E, 0, VR::LO, VM::M1, "MeasurementAlgorithmType" }, { 0x0029, 0x0091, 0, VR::SQ, VM::M1, "MeasurementEvaluationDataRoleSequence" }, { 0x0029, 0x0092, 0, VR::CS, VM::M1, "MeasurementEvaluationDataRoleItem" }, { 0x0029, 0x0093, 0, VR::SQ, VM::M1, "MeasurementEvaluationSequence" }, { 0x0029, 0x0094, 0, VR::DS, VM::M1, "MeasurementEvaluationValue" }, { 0x0029, 0x0095, 0, VR::CS, VM::M1, "MeasurementEvaluationID" }, { 0x0029, 0x0096, 0, VR::FL, VM::M0TN, "MeasurementDataPoints" }, { 0x0029, 0x0097, 0, VR::FL, VM::M0TN, "MeasurementDataAngles" }, { 0x0029, 0x0098, 0, VR::LO, VM::M1, "MeasurementDataSlice" }, { 0x0029, 0x0099, 0, VR::FL, VM::M1, "MeasurementDataSliceThickness" }, { 0x0029, 0x009A, 0, VR::SQ, VM::M1, "MeasurementReferencedFramesSequence" }, { 0x0029, 0x009B, 0, VR::DS, VM::M0TN, "MeasurementEvaluationLongestDistance" }, { 0x0029, 0x009C, 0, VR::DS, VM::M0TN, "MeasurementEvaluationCentroid" }, { 0x0029, 0x009D, 0, VR::FL, VM::M6, "MeasurementDataBoundingBox" }, { 0x0029, 0x009E, 0, VR::LO, VM::M1, "MeasurementText" }, { 0x0029, 0x009F, 0, VR::IS, VM::M1, "MeasurementDiameter" }, { 0x0029, 0x00A0, 0, VR::DS, VM::M1, "ImageRotationFractional" }, { 0x0029, 0x00A1, 0, VR::LO, VM::M1, "PresetName" }, { 0x0029, 0x00A2, 0, VR::SQ, VM::M1, "FusionLUTSequence" }, { 0x0029, 0x00A3, 0, VR::CS, VM::M1, "FusionLUTIsActiveFlag" }, { 0x0029, 0x00A5, 0, VR::UI, VM::M1, "SyngoUID" }, { 0x0029, 0x00A6, 0, VR::UI, VM::M1, "PresentationVersionIdentifier" }, { 0x0029, 0x00A7, 0, VR::SQ, VM::M1, "PresentationModuleSequence" }, { 0x0029, 0x00A8, 0, VR::LO, VM::M1, "PresentationModuleType" }, { 0x0029, 0x00A9, 0, VR::SQ, VM::M1, "PresentationStateSequence" }, { 0x0029, 0x00AA, 0, VR::CS, VM::M1, "LUTInvertedFlag" }, { 0x0029, 0x00AB, 0, VR::IS, VM::M1, "SoftcopyVOILUTViewingIndex" }, { 0x0029, 0x00AC, 0, VR::FD, VM::M2, "DisplayedAreaBottomRightHandCornerFractional" }, { 0x0029, 0x00AD, 0, VR::FD, VM::M2, "DisplayedAreaTopLeftHandCornerFractional" }, { 0x0029, 0x00AE, 0, VR::FL, VM::M1, "MeasurementAlpha" }, { 0x0029, 0x00AF, 0, VR::OB, VM::M1, "MeasurementBitmap" }, { 0x0029, 0x00B0, 0, VR::US, VM::M1, "CurrentFrameNumber" }, { 0x0029, 0x00B1, 0, VR::LO, VM::M1, "ImageTextViewName" }, { 0x0029, 0x00B2, 0, VR::SQ, VM::M1, "ImageTextViewContentSequence" }, { 0x0029, 0x00B3, 0, VR::LO, VM::M1TN, "ImageTextLineNames" }, { 0x0029, 0x00B4, 0, VR::LO, VM::M1TN, "ImageTextLineValues" }, { 0x0029, 0x00B5, 0, VR::SQ, VM::M1, "MeasurementEvaluationTextPositionSequence" }, { 0x0029, 0x00B6, 0, VR::CS, VM::M1, "MeasurementLinkEvaluationTextFlag" }, { 0x0029, 0x00B7, 0, VR::DS, VM::M3, "MeasurementEvaluationTextPositionVector" }, { 0x0029, 0x00B8, 0, VR::OB, VM::M1, "ImageTextAlphaBlendingLineValue" }, { 0x0029, 0x00C1, 0, VR::SQ, VM::M1, "TaskDataSequence" }, { 0x0029, 0x00C2, 0, VR::CS, VM::M1, "TaskDataType" }, { 0x0029, 0x00C3, 0, VR::LO, VM::M1, "TaskDataVersion" }, { 0x0029, 0x00C4, 0, VR::ST, VM::M1, "TaskDataDescription" }, { 0x0029, 0x00C5, 0, VR::OB, VM::M1, "TaskData" }, { 0x0029, 0x00C6, 0, VR::IS, VM::M1, "TaskDataSize" }, { 0x0029, 0x00C9, 0, VR::SQ, VM::M1, "ClipPlaneSequence" }, { 0x0029, 0x00CA, 0, VR::DS, VM::M3, "ClipPlaneCenter" }, { 0x0029, 0x00CB, 0, VR::DS, VM::M3, "ClipPlaneNormal" }, { 0x0029, 0x00CC, 0, VR::DS, VM::M2, "ClipPlaneScale" }, { 0x0029, 0x00CD, 0, VR::CS, VM::M1, "ClipPlaneUseThicknessFlag" }, { 0x0029, 0x00CE, 0, VR::DS, VM::M1, "ClipPlaneThickness" }, { 0x0029, 0x00CF, 0, VR::SQ, VM::M1, "ImageSequence" }, { 0x0029, 0x00D0, 0, VR::CS, VM::M1, "ClipPlaneEnableClip" }, { 0x0029, 0x00D1, 0, VR::DS, VM::M1, "ClipPlaneHandleRatio" }, { 0x0029, 0x00D2, 0, VR::DS, VM::M24, "ClipPlaneBoundingPoints" }, { 0x0029, 0x00D3, 0, VR::DS, VM::M16, "ClipPlaneMotionMatrix" }, { 0x0029, 0x00D4, 0, VR::DS, VM::M1, "ClipPlaneShiftVelocity" }, { 0x0029, 0x00D5, 0, VR::CS, VM::M1, "ClipPlaneEnabledFlag" }, { 0x0029, 0x00D6, 0, VR::DS, VM::M1, "ClipPlaneRotateVelocity" }, { 0x0029, 0x00D7, 0, VR::CS, VM::M1, "ClipPlaneShowGraphicsFlag" }, { 0x0029, 0x00E0, 0, VR::DS, VM::M3, "CropBoxSize" }, { 0x0029, 0x00E1, 0, VR::CS, VM::M1, "CropBoxEnabledFlag" }, { 0x0029, 0x00E2, 0, VR::DS, VM::M3, "CropBoxAbsoluteOrigin" }, { 0x0029, 0x00E3, 0, VR::CS, VM::M1, "CropBoxShowGraphicsFlag" }, { 0x0029, 0x00F1, 0, VR::DS, VM::M0TN, "CurvedCameraCoordinates" }, { 0x0029, 0x00F2, 0, VR::DS, VM::M1, "CurvedCameraPointOfInterest" }, { 0x0029, 0x00F3, 0, VR::CS, VM::M1, "CurvedCameraPointOfInterestUsageFlag" }, { 0x0029, 0x00F4, 0, VR::DS, VM::M1, "CurvedCameraThickness" }, { 0x0029, 0x00F5, 0, VR::DS, VM::M1, "CurvedCameraExtrusionLength" }, { 0x0029, 0x00F6, 0, VR::CS, VM::M1, "CurvedCameraRotationAxisMode" }, { 0x0029, 0x00F7, 0, VR::DS, VM::M1, "CurvedCameraRollRotationAxis" }, { 0x0029, 0x00F8, 0, VR::DS, VM::M1, "CurvedCameraViewPortHeight" }, { 0x0029, 0x00F9, 0, VR::DS, VM::M1, "CurvedCameraCutDirection" }, { 0x0029, 0x00FA, 0, VR::DS, VM::M1, "CurvedCameraPanVector" }, { 0x0029, 0x00FB, 0, VR::LO, VM::M1, "ClinicalFindingID" }, { 0x0029, 0x00FC, 0, VR::CS, VM::M1, "MeasurementIsCircleFlag" }, { 0x0029, 0x00FD, 0, VR::LO, VM::M1, "MeasurementApplicationTypeID" }, }; const unsigned short Dict274TagHashTable[] = { 187, 188, 193, 196, 199, 187, 187, 187, 202, 205, 208, 211, 214, 217, 222, 227, 232, 237, 240, 243, 246, 249, 254, 259, 264, 269, 272, 275, 280, 285, 290, 295, 298, 303, 308, 311, 314, 317, 320, 187, 323, 328, 333, 338, 343, 348, 353, 358, 361, 366, 187, 371, 374, 187, 187, 187, 377, 380, 383, 386, 389, 392, 397, 402, 407, 412, 417, 422, 425, 187, 187, 187, 428, 431, 434, 437, 440, 443, 446, 449, 187, 187, 452, 455, 187, 187, 187, 187, 458, 461, 464, 467, 470, 187, 187, 187, 473, 476, 479, 482, 485, 488, 491, 494, 497, 500, 503, 506, 509, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, 557, 560, 563, 566, 569, 572, 575, 578, 581, 584, 587, 590, 593, 596, 599, 602, 605, 608, 611, 187, 187, 187, 187, 614, 187, 187, 187, 187, 617, 620, 623, 626, 629, 632, 635, 638, 641, 644, 647, 650, 187, 653, 656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 0, 2, 28, 40, 116, 151, 1, 115, 150, 1, 114, 149, 1, 113, 148, 1, 21, 33, 1, 20, 32, 1, 23, 35, 1, 22, 34, 1, 25, 37, 2, 24, 36, 172, 226, 2, 27, 39, 173, 227, 2, 26, 38, 170, 224, 2, 38, 57, 171, 225, 1, 37, 56, 1, 40, 59, 1, 39, 58, 1, 42, 61, 2, 41, 60, 183, 250, 2, 44, 63, 184, 251, 2, 43, 62, 181, 248, 2, 30, 49, 182, 249, 1, 29, 48, 1, 32, 51, 2, 31, 50, 185, 252, 2, 34, 53, 186, 253, 2, 33, 52, 175, 242, 2, 36, 55, 176, 243, 1, 35, 54, 2, 9, 9, 174, 241, 2, 8, 8, 179, 246, 1, 180, 247, 1, 177, 244, 1, 178, 245, 1, 156, 202, 1, 157, 203, 2, 1, 1, 155, 201, 2, 0, 0, 160, 206, 2, 3, 3, 161, 207, 2, 2, 2, 158, 204, 2, 5, 5, 159, 205, 2, 4, 4, 150, 194, 2, 7, 7, 151, 195, 1, 6, 6, 2, 19, 25, 149, 193, 2, 18, 24, 154, 198, 1, 152, 196, 1, 153, 197, 1, 11, 17, 1, 10, 16, 1, 13, 19, 1, 12, 18, 1, 15, 21, 2, 14, 20, 164, 210, 2, 17, 23, 165, 211, 2, 16, 22, 162, 208, 2, 85, 104, 163, 209, 2, 86, 105, 168, 214, 2, 87, 106, 169, 215, 1, 166, 212, 1, 167, 213, 1, 77, 96, 1, 78, 97, 1, 79, 98, 1, 80, 99, 1, 81, 100, 1, 82, 101, 1, 83, 102, 1, 84, 103, 1, 93, 122, 1, 94, 123, 1, 88, 112, 1, 89, 113, 1, 90, 114, 1, 91, 115, 1, 92, 116, 1, 53, 72, 1, 54, 73, 1, 55, 74, 1, 56, 75, 1, 57, 76, 1, 58, 77, 1, 59, 78, 1, 60, 79, 1, 45, 64, 1, 46, 65, 1, 47, 66, 1, 48, 67, 1, 49, 68, 1, 50, 69, 1, 51, 70, 1, 52, 71, 1, 69, 88, 1, 70, 89, 1, 71, 90, 1, 72, 91, 1, 73, 92, 1, 74, 93, 1, 75, 94, 1, 76, 95, 1, 61, 80, 1, 62, 81, 1, 63, 82, 1, 64, 83, 1, 65, 84, 1, 66, 85, 1, 67, 86, 1, 68, 87, 1, 135, 171, 1, 134, 170, 1, 133, 169, 1, 132, 168, 1, 139, 175, 1, 138, 174, 1, 137, 173, 1, 136, 172, 1, 128, 163, 1, 127, 162, 1, 126, 161, 1, 125, 160, 1, 131, 167, 1, 130, 166, 1, 129, 165, 1, 148, 184, 1, 143, 179, 1, 142, 178, 1, 141, 177, 1, 140, 176, 1, 147, 183, 1, 146, 182, 1, 145, 181, 1, 144, 180, 1, 106, 139, 1, 105, 138, 1, 104, 137, 1, 103, 136, 1, 109, 142, 1, 108, 141, 1, 107, 140, 1, 98, 131, 1, 97, 130, 1, 96, 129, 1, 95, 128, 1, 102, 135, 1, 101, 134, 1, 100, 133, 1, 99, 132, 1, 120, 155, 1, 119, 154, 1, 118, 153, 1, 117, 152, 1, 124, 159, 1, 123, 158, 1, 122, 157, 1, 121, 156, 1, 112, 147, 1, 111, 146, 1, 110, 145, }; const unsigned short Dict274KeyHashTable[] = { 188, 193, 187, 198, 201, 204, 187, 207, 187, 187, 212, 215, 218, 187, 187, 221, 187, 187, 187, 187, 226, 187, 233, 187, 240, 243, 187, 248, 251, 256, 259, 264, 267, 270, 273, 280, 187, 187, 285, 290, 295, 300, 187, 303, 306, 309, 187, 312, 317, 320, 323, 187, 328, 187, 187, 187, 187, 187, 331, 187, 334, 339, 187, 342, 345, 187, 350, 355, 360, 187, 367, 370, 373, 376, 379, 382, 387, 390, 187, 187, 187, 393, 187, 187, 187, 187, 398, 405, 410, 413, 187, 416, 187, 187, 419, 422, 187, 425, 428, 187, 187, 433, 436, 439, 442, 445, 448, 187, 459, 466, 471, 474, 477, 187, 480, 483, 492, 495, 498, 503, 508, 511, 187, 514, 517, 520, 525, 528, 531, 536, 187, 187, 187, 539, 546, 549, 554, 187, 187, 559, 564, 187, 567, 574, 187, 581, 586, 591, 187, 187, 187, 594, 187, 597, 187, 187, 604, 187, 187, 187, 611, 614, 619, 624, 627, 632, 635, 638, 187, 641, 187, 644, 647, 187, 650, 657, 187, 662, 187, 669, 187, 672, 187, 675, 187, 187, 678, 0, 2, 13, 11458, 175, 1388, 2, 85, 23728, 88, 46079, 1, 65, 26, 1, 114, 44580, 1, 136, 10838, 2, 12, 61733, 134, 26698, 1, 45, 26955, 1, 64, 49056, 1, 146, 47020, 2, 1, 36508, 113, 59779, 3, 59, 3893, 87, 24888, 89, 5159, 3, 106, 25349, 162, 16866, 167, 3684, 1, 72, 25682, 2, 74, 43416, 158, 15556, 1, 94, 6466, 2, 2, 43196, 91, 56371, 1, 84, 17649, 2, 16, 46063, 35, 47655, 1, 99, 52288, 1, 4, 31380, 1, 27, 52577, 3, 110, 562, 117, 61065, 120, 41400, 2, 73, 37866, 126, 9602, 2, 112, 28994, 184, 33470, 2, 38, 9050, 68, 17284, 2, 33, 44159, 43, 1959, 1, 100, 799, 1, 71, 12227, 1, 169, 44135, 1, 92, 18117, 2, 109, 42559, 139, 18427, 1, 130, 1486, 1, 148, 18302, 2, 105, 9520, 150, 56390, 1, 77, 60968, 1, 166, 24144, 2, 90, 45567, 102, 8073, 1, 174, 37807, 1, 96, 49475, 2, 18, 22227, 76, 50918, 2, 23, 62958, 54, 19424, 2, 25, 8275, 142, 45819, 3, 29, 1012, 32, 32296, 118, 62567, 1, 53, 5573, 1, 34, 28275, 1, 51, 62547, 1, 116, 10306, 1, 9, 44153, 2, 69, 64622, 127, 13012, 1, 30, 12534, 1, 57, 1563, 2, 15, 54140, 83, 31925, 3, 143, 13225, 165, 23350, 177, 47415, 2, 6, 28085, 41, 29416, 1, 50, 36742, 1, 75, 35299, 1, 98, 61692, 1, 103, 59741, 1, 115, 10521, 1, 183, 54136, 2, 49, 59966, 79, 46265, 1, 131, 24705, 1, 186, 64728, 1, 56, 16339, 1, 145, 20842, 1, 63, 12768, 5, 67, 8178, 80, 44059, 152, 13220, 156, 65084, 179, 56373, 3, 81, 51936, 140, 2128, 185, 23141, 2, 93, 65533, 147, 15225, 1, 36, 18317, 1, 58, 31712, 1, 11, 26783, 1, 181, 6138, 4, 61, 34066, 128, 60279, 144, 5718, 168, 55256, 1, 42, 10049, 1, 135, 15905, 2, 46, 34679, 160, 27753, 2, 107, 61037, 172, 24598, 1, 19, 6713, 1, 111, 31359, 1, 95, 3464, 1, 44, 33055, 2, 66, 56050, 97, 41647, 1, 28, 10745, 1, 154, 56106, 2, 78, 63636, 170, 32615, 1, 24, 26841, 3, 20, 51737, 155, 7395, 180, 42160, 1, 8, 50650, 2, 86, 590, 133, 22556, 2, 0, 35214, 10, 9516, 2, 137, 37717, 138, 25906, 1, 48, 2121, 3, 31, 6253, 39, 39851, 161, 57769, 3, 125, 34404, 132, 53710, 163, 64795, 2, 121, 51518, 164, 8653, 2, 123, 6138, 182, 2422, 1, 26, 57611, 1, 122, 61687, 3, 37, 38627, 173, 51599, 178, 52803, 3, 5, 40421, 124, 60558, 159, 53468, 1, 119, 18735, 2, 17, 53155, 153, 48227, 2, 52, 8945, 108, 25422, 1, 151, 48559, 2, 55, 57144, 141, 33695, 1, 82, 36004, 1, 129, 30019, 1, 176, 55460, 1, 104, 63913, 1, 40, 60249, 1, 171, 42433, 3, 3, 27435, 22, 23142, 60, 31469, 2, 14, 44320, 47, 52241, 3, 7, 47733, 62, 21682, 157, 6479, 1, 70, 26811, 1, 101, 17543, 1, 149, 37084, 1, 21, 62279, }; vtkDICOMDictionary::Dict Dict274Data = { "SIEMENS SYNGO ADVANCED PRESENTATION", 187, 187, Dict274TagHashTable, Dict274KeyHashTable, Dict274Contents }; // ----- MITRA PRESENTATION 1.0 ----- const DictEntry Dict275Contents[] = { { 0x0029, 0x0000, 0, VR::CS, VM::M1, "Rotation" }, { 0x0029, 0x0001, 0, VR::LO, VM::M1, "WindowWidth" }, { 0x0029, 0x0002, 0, VR::LO, VM::M1, "WindowCentre" }, { 0x0029, 0x0003, 0, VR::IS, VM::M1, "Invert" }, { 0x0029, 0x0004, 0, VR::IS, VM::M1, "HasTabstop" }, { 0x0029, 0x0005, 0, VR::CS, VM::M1, "SmoothRotation" }, { 0x0029, 0x0010, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0012, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0013, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict275TagHashTable[] = { 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 0, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 17, 1, 6, 16, 1, 9, 19, 1, 8, 18, }; const unsigned short Dict275KeyHashTable[] = { 10, 11, 24, 29, 10, 10, 10, 10, 10, 32, 0, 6, 0, 6066, 1, 16198, 6, 538, 7, 538, 8, 538, 9, 538, 2, 2, 22918, 4, 58278, 1, 3, 29993, 1, 5, 33367, }; vtkDICOMDictionary::Dict Dict275Data = { "MITRA PRESENTATION 1.0", 10, 10, Dict275TagHashTable, Dict275KeyHashTable, Dict275Contents }; // ----- CAMTRONICS IP ----- const DictEntry Dict276Contents[] = { { 0x0029, 0x0010, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0040, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict276TagHashTable[] = { 5, 8, 4, 4, 0, 1, 3, 64, 3, 0, 16, 1, 32, 2, 48, }; const unsigned short Dict276KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict276Data = { "CAMTRONICS IP", 4, 4, Dict276TagHashTable, Dict276KeyHashTable, Dict276Contents }; // ----- GEMS_VXTL_USERDATA_01 ----- const DictEntry Dict277Contents[] = { { 0x0047, 0x0011, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict277TagHashTable[] = { 2, 0, 1, 0, 17, }; const unsigned short Dict277KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict277Data = { "GEMS_VXTL_USERDATA_01", 1, 1, Dict277TagHashTable, Dict277KeyHashTable, Dict277Contents }; // ----- MITRA OBJECT DOCUMENT 1.0 ----- const DictEntry Dict278Contents[] = { { 0x0029, 0x0000, 0, VR::OB, VM::M1, "IMPAXObjectDocument" }, { 0x0029, 0x0001, 0, VR::OB, VM::M1, "IMPAXMarkupXMLStored" }, }; const unsigned short Dict278TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict278KeyHashTable[] = { 3, 2, 0, 2, 0, 48829, 1, 31771, }; vtkDICOMDictionary::Dict Dict278Data = { "MITRA OBJECT DOCUMENT 1.0", 2, 2, Dict278TagHashTable, Dict278KeyHashTable, Dict278Contents }; // ----- QTUltrasound ----- const DictEntry Dict279Contents[] = { { 0x0099, 0x0000, 0, VR::SS, VM::M1, "BreastDensityValue" }, }; const unsigned short Dict279TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict279KeyHashTable[] = { 2, 0, 1, 0, 16835, }; vtkDICOMDictionary::Dict Dict279Data = { "QTUltrasound", 1, 1, Dict279TagHashTable, Dict279KeyHashTable, Dict279Contents }; // ----- SIEMENS MED SMS USG ANTARES ----- const DictEntry Dict280Contents[] = { { 0x0019, 0x0000, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x000c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x000d, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x000e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0023, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0025, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002d, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003b, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0041, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0043, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0047, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0049, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0061, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0062, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0063, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0065, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0066, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0067, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0069, 0, VR::US, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x006c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::FD, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0086, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0087, 0, VR::SH, VM::M1, "" }, { 0x0019, 0x0088, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0095, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict280TagHashTable[] = { 52, 57, 62, 65, 68, 75, 78, 81, 84, 87, 90, 93, 98, 51, 103, 51, 51, 51, 106, 109, 112, 117, 51, 122, 127, 130, 137, 51, 51, 140, 143, 51, 51, 51, 146, 151, 51, 154, 157, 160, 163, 170, 51, 173, 176, 179, 51, 51, 182, 185, 188, 0, 2, 15, 42, 44, 130, 2, 16, 45, 43, 129, 1, 42, 128, 1, 47, 135, 3, 17, 46, 41, 114, 46, 134, 1, 6, 33, 1, 5, 32, 1, 8, 35, 1, 7, 34, 1, 10, 37, 1, 9, 36, 2, 12, 39, 38, 105, 2, 11, 38, 39, 106, 1, 40, 108, 1, 31, 96, 1, 32, 97, 2, 3, 13, 33, 98, 2, 2, 12, 34, 99, 2, 4, 14, 35, 101, 1, 36, 102, 3, 0, 0, 30, 84, 37, 103, 1, 1, 3, 1, 28, 72, 1, 29, 73, 2, 20, 59, 50, 160, 1, 19, 58, 1, 21, 64, 1, 22, 65, 1, 23, 66, 3, 18, 49, 24, 67, 49, 149, 1, 25, 68, 1, 26, 70, 1, 27, 71, 1, 48, 136, 1, 14, 41, 1, 13, 40, 1, 45, 131, }; const unsigned short Dict280KeyHashTable[] = { 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 51, 0, 105, 1, 105, 2, 105, 3, 105, 4, 105, 5, 105, 6, 105, 7, 105, 8, 105, 9, 105, 10, 105, 11, 105, 12, 105, 13, 105, 14, 105, 15, 105, 16, 105, 17, 105, 18, 105, 19, 105, 20, 105, 21, 105, 22, 105, 23, 105, 24, 105, 25, 105, 26, 105, 27, 105, 28, 105, 29, 105, 30, 105, 31, 105, 32, 105, 33, 105, 34, 105, 35, 105, 36, 105, 37, 105, 38, 105, 39, 105, 40, 105, 41, 105, 42, 105, 43, 105, 44, 105, 45, 105, 46, 105, 47, 105, 48, 105, 49, 105, 50, 105, }; vtkDICOMDictionary::Dict Dict280Data = { "SIEMENS MED SMS USG ANTARES", 51, 51, Dict280TagHashTable, Dict280KeyHashTable, Dict280Contents }; // ----- PI Private Block (0781:3000 - 0781:30FF) ----- const DictEntry Dict281Contents[] = { { 0x0781, 0x0001, 0, VR::US, VM::M1, "" }, { 0x0781, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0781, 0x0005, 0, VR::FL, VM::M1, "" }, { 0x0781, 0x0009, 0, VR::FL, VM::M4, "" }, }; const unsigned short Dict281TagHashTable[] = { 4, 5, 8, 4, 0, 1, 1, 2, 3, 0, 1, 2, 5, 3, 9, }; const unsigned short Dict281KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict281Data = { "PI Private Block (0781:3000 - 0781:30FF)", 4, 4, Dict281TagHashTable, Dict281KeyHashTable, Dict281Contents }; // ----- SIEMENS MED MAMMO ----- const DictEntry Dict282Contents[] = { { 0x0029, 0x005a, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict282TagHashTable[] = { 2, 0, 1, 0, 90, }; const unsigned short Dict282KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict282Data = { "SIEMENS MED MAMMO", 1, 1, Dict282TagHashTable, Dict282KeyHashTable, Dict282Contents }; // ----- PM ----- const DictEntry Dict283Contents[] = { { 0x0101, 0x0005, 0, VR::LO, VM::M1TN, "ImageEnhancementParameterFile" }, { 0x0101, 0x0006, 0, VR::IS, VM::M1, "OriginalSigmoidRatio" }, }; const unsigned short Dict283TagHashTable[] = { 3, 6, 0, 1, 0, 5, 1, 1, 6, }; const unsigned short Dict283KeyHashTable[] = { 2, 3, 0, 2, 0, 39543, 1, 33778, }; vtkDICOMDictionary::Dict Dict283Data = { "PM", 2, 2, Dict283TagHashTable, Dict283KeyHashTable, Dict283Contents }; // ----- MITRA MARKUP 1.0 ----- const DictEntry Dict284Contents[] = { { 0x0029, 0x0000, 0, VR::OB, VM::M1TN, "Markup1" }, { 0x0029, 0x0001, 0, VR::OB, VM::M1TN, "Markup2" }, { 0x0029, 0x0002, 0, VR::OB, VM::M1TN, "Markup3" }, { 0x0029, 0x0003, 0, VR::OB, VM::M1TN, "Markup4" }, { 0x0029, 0x0004, 0, VR::OB, VM::M1TN, "Markup5" }, { 0x0029, 0x0005, 0, VR::OB, VM::M1TN, "Markup6" }, { 0x0029, 0x0006, 0, VR::OB, VM::M1TN, "Markup7" }, { 0x0029, 0x0007, 0, VR::OB, VM::M1TN, "Markup8" }, { 0x0029, 0x0008, 0, VR::OB, VM::M1TN, "Markup9" }, { 0x0029, 0x0009, 0, VR::OB, VM::M1TN, "Markup10" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1TN, "Markup11" }, { 0x0029, 0x0011, 0, VR::OB, VM::M1TN, "Markup12" }, { 0x0029, 0x0012, 0, VR::OB, VM::M1TN, "Markup13" }, { 0x0029, 0x0013, 0, VR::OB, VM::M1TN, "Markup14" }, { 0x0029, 0x0014, 0, VR::OB, VM::M1TN, "Markup15" }, }; const unsigned short Dict284TagHashTable[] = { 16, 19, 24, 29, 15, 15, 15, 15, 15, 15, 32, 35, 40, 45, 50, 0, 1, 4, 4, 2, 7, 7, 14, 20, 2, 6, 6, 9, 9, 1, 8, 8, 1, 1, 1, 2, 0, 0, 11, 17, 2, 3, 3, 10, 16, 2, 2, 2, 13, 19, 2, 5, 5, 12, 18, }; const unsigned short Dict284KeyHashTable[] = { 16, 15, 15, 19, 22, 25, 28, 31, 34, 37, 40, 45, 50, 53, 56, 0, 1, 14, 24981, 1, 0, 16909, 1, 1, 16909, 1, 2, 16909, 1, 3, 16909, 1, 4, 16909, 1, 5, 16909, 1, 6, 16909, 2, 7, 16909, 9, 24980, 2, 8, 16909, 10, 24980, 1, 11, 24980, 1, 12, 24980, 1, 13, 24980, }; vtkDICOMDictionary::Dict Dict284Data = { "MITRA MARKUP 1.0", 15, 15, Dict284TagHashTable, Dict284KeyHashTable, Dict284Contents }; // ----- CureMetrix ----- const DictEntry Dict285Contents[] = { { 0x0019, 0x1000, 0, VR::UT, VM::M1, "" }, { 0x8901, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0030, 0, VR::LT, VM::M1, "" }, { 0x8901, 0x0040, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0060, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0070, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x8901, 0x0090, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict285TagHashTable[] = { 12, 15, 11, 20, 23, 26, 31, 11, 36, 39, 11, 0, 1, 5, 64, 2, 7, 96, 9, 128, 1, 1, 0, 1, 3, 32, 2, 0, 4096, 6, 80, 2, 8, 112, 10, 144, 1, 2, 16, 1, 4, 48, }; const unsigned short Dict285KeyHashTable[] = { 11, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 489, 1, 489, 2, 489, 3, 489, 4, 489, 5, 489, 6, 489, 7, 489, 8, 489, 9, 489, 10, 489, }; vtkDICOMDictionary::Dict Dict285Data = { "CureMetrix", 11, 11, Dict285TagHashTable, Dict285KeyHashTable, Dict285Contents }; // ----- SIEMENS_FLCOMPACT_VA01A_PROC ----- const DictEntry Dict286Contents[] = { { 0x0017, 0x000a, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x000b, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x000c, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x000d, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x000e, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x000f, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x0010, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0011, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0016, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0017, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0018, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0019, 0, VR::US, VM::M1, "" }, { 0x0017, 0x001a, 0, VR::US, VM::M1, "" }, { 0x0017, 0x001b, 0, VR::US, VM::M1, "" }, { 0x0017, 0x001c, 0, VR::US, VM::M1, "" }, { 0x0017, 0x001e, 0, VR::US, VM::M1, "" }, { 0x0017, 0x001f, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0020, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0023, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0025, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0028, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x0029, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x0048, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0049, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x004d, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x004e, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x004f, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x0050, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0051, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x0052, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0053, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0054, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x0055, 0, VR::SS, VM::M1, "" }, { 0x0017, 0x005c, 0, VR::OW, VM::M1, "" }, { 0x0017, 0x0064, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0066, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0067, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0068, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0085, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0086, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0087, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0088, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0089, 0, VR::US, VM::M1, "" }, { 0x0017, 0x008a, 0, VR::US, VM::M1, "" }, { 0x0017, 0x008b, 0, VR::US, VM::M1, "" }, { 0x0017, 0x008c, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x008d, 0, VR::FL, VM::M1, "" }, { 0x0017, 0x008e, 0, VR::US, VM::M1, "" }, { 0x0017, 0x008f, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a0, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a1, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a2, 0, VR::LO, VM::M1, "" }, { 0x0017, 0x00a3, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a4, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a5, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00a6, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00aa, 0, VR::US, VM::M1, "" }, { 0x0017, 0x00b0, 0, VR::DS, VM::M1, "" }, { 0x0017, 0x00c0, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict286TagHashTable[] = { 66, 69, 74, 77, 82, 85, 88, 93, 96, 99, 65, 104, 107, 110, 113, 118, 121, 124, 65, 65, 65, 65, 129, 132, 137, 144, 149, 156, 161, 166, 173, 65, 65, 65, 65, 176, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 179, 182, 187, 192, 199, 204, 209, 214, 219, 222, 65, 65, 65, 65, 65, 225, 230, 233, 65, 0, 1, 10, 23, 2, 9, 22, 37, 84, 1, 38, 85, 2, 8, 20, 35, 82, 1, 36, 83, 1, 33, 80, 2, 7, 17, 34, 81, 1, 6, 16, 1, 17, 31, 2, 16, 30, 39, 92, 1, 15, 28, 1, 14, 27, 1, 13, 26, 2, 12, 25, 44, 133, 1, 11, 24, 1, 46, 135, 2, 45, 134, 64, 192, 1, 52, 141, 2, 31, 78, 51, 140, 3, 5, 15, 32, 79, 54, 143, 2, 4, 14, 53, 142, 3, 3, 13, 30, 77, 48, 137, 2, 2, 12, 47, 136, 2, 1, 11, 50, 139, 3, 0, 10, 28, 72, 49, 138, 1, 29, 73, 1, 63, 176, 1, 60, 165, 2, 41, 102, 59, 164, 2, 25, 39, 42, 103, 3, 24, 38, 40, 100, 61, 166, 2, 23, 37, 56, 161, 2, 22, 36, 55, 160, 2, 21, 35, 58, 163, 2, 20, 34, 57, 162, 1, 19, 33, 1, 18, 32, 2, 43, 104, 62, 170, 1, 27, 41, 1, 26, 40, }; const unsigned short Dict286KeyHashTable[] = { 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 65, 0, 82, 1, 82, 2, 82, 3, 82, 4, 82, 5, 82, 6, 82, 7, 82, 8, 82, 9, 82, 10, 82, 11, 82, 12, 82, 13, 82, 14, 82, 15, 82, 16, 82, 17, 82, 18, 82, 19, 82, 20, 82, 21, 82, 22, 82, 23, 82, 24, 82, 25, 82, 26, 82, 27, 82, 28, 82, 29, 82, 30, 82, 31, 82, 32, 82, 33, 82, 34, 82, 35, 82, 36, 82, 37, 82, 38, 82, 39, 82, 40, 82, 41, 82, 42, 82, 43, 82, 44, 82, 45, 82, 46, 82, 47, 82, 48, 82, 49, 82, 50, 82, 51, 82, 52, 82, 53, 82, 54, 82, 55, 82, 56, 82, 57, 82, 58, 82, 59, 82, 60, 82, 61, 82, 62, 82, 63, 82, 64, 82, }; vtkDICOMDictionary::Dict Dict286Data = { "SIEMENS_FLCOMPACT_VA01A_PROC", 65, 65, Dict286TagHashTable, Dict286KeyHashTable, Dict286Contents }; // ----- Applicare/RadStore/Version 1.0 ----- const DictEntry Dict287Contents[] = { { 0x3113, 0x0001, 0, VR::SL, VM::M1, "" }, { 0x3113, 0x0002, 0, VR::SL, VM::M1, "Id1" }, { 0x3113, 0x0003, 0, VR::SL, VM::M1, "Id2" }, { 0x3113, 0x0004, 0, VR::SL, VM::M1, "Id3" }, { 0x3113, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x3113, 0x0012, 0, VR::CS, VM::M1, "InstanceState" }, { 0x3113, 0x0013, 0, VR::DT, VM::M1, "DateLastModified" }, { 0x3113, 0x0014, 0, VR::DT, VM::M1, "DateLastAccessed" }, { 0x3113, 0x0015, 0, VR::CS, VM::M1, "" }, { 0x3113, 0x0016, 0, VR::FD, VM::M1, "InstanceSizeInBytes" }, { 0x3113, 0x0017, 0, VR::LO, VM::M1, "LibraryId" }, { 0x3113, 0x0018, 0, VR::LO, VM::M1, "Pathnames" }, { 0x3113, 0x0019, 0, VR::LO, VM::M1, "DriverPath" }, { 0x3113, 0x001A, 0, VR::LO, VM::M1, "Source" }, { 0x3113, 0x001B, 0, VR::LO, VM::M1, "Destination" }, { 0x3113, 0x001C, 0, VR::SL, VM::M1, "MediumId" }, { 0x3113, 0x001D, 0, VR::LO, VM::M1, "ArchiveId" }, { 0x3113, 0x001E, 0, VR::LO, VM::M1, "InstanceOrigin" }, { 0x3113, 0x0021, 0, VR::SL, VM::M1, "InstanceVersion" }, { 0x3113, 0x0022, 0, VR::SL, VM::M1, "" }, { 0x3113, 0x0023, 0, VR::ST, VM::M1, "InstanceFileLocation" }, { 0x3113, 0x0031, 0, VR::IS, VM::M1, "" }, { 0x3113, 0x0032, 0, VR::IS, VM::M1, "" }, { 0x3113, 0x0033, 0, VR::IS, VM::M1, "" }, { 0x3113, 0x0035, 0, VR::LO, VM::M1, "ImageMediumLocation" }, { 0x3113, 0x0036, 0, VR::LO, VM::M1, "ImageMediumLabel" }, { 0x3113, 0x0037, 0, VR::CS, VM::M1, "ImageMediumState" }, { 0x3113, 0x0038, 0, VR::LO, VM::M1, "SeriesMediumLocation" }, { 0x3113, 0x0039, 0, VR::LO, VM::M1, "SeriesMediumLabel" }, { 0x3113, 0x003A, 0, VR::CS, VM::M1, "SeriesMediumState" }, { 0x3113, 0x003B, 0, VR::LO, VM::M1, "StudyMediumLocation" }, { 0x3113, 0x003C, 0, VR::LO, VM::M1, "StudyMediumLabel" }, { 0x3113, 0x003D, 0, VR::CS, VM::M1, "StudyMediumState" }, { 0x3113, 0x0052, 0, VR::CS, VM::M1, "StudyState" }, { 0x3113, 0x0053, 0, VR::CS, VM::M1, "SeriesState" }, { 0x3113, 0x0055, 0, VR::CS, VM::M1, "ImageStateText" }, { 0x3113, 0x0056, 0, VR::CS, VM::M1, "SeriesStateText" }, { 0x3113, 0x0057, 0, VR::CS, VM::M1, "StudyStateText" }, { 0x3113, 0x0060, 0, VR::DT, VM::M1, "Expiration" }, { 0x3113, 0x0069, 0, VR::AT, VM::M1TN, "DeletedTags" }, }; const unsigned short Dict287TagHashTable[] = { 40, 40, 40, 40, 40, 40, 41, 40, 44, 47, 50, 40, 53, 56, 59, 62, 65, 68, 71, 76, 81, 86, 91, 96, 40, 99, 102, 105, 108, 113, 118, 123, 126, 129, 40, 132, 137, 142, 147, 40, 0, 1, 38, 96, 1, 26, 55, 1, 25, 54, 1, 24, 53, 1, 23, 51, 1, 22, 50, 1, 21, 49, 1, 39, 105, 1, 10, 23, 1, 9, 22, 2, 8, 21, 32, 61, 2, 7, 20, 31, 60, 2, 6, 19, 30, 59, 2, 5, 18, 29, 58, 2, 4, 17, 28, 57, 1, 27, 56, 1, 17, 30, 1, 16, 29, 1, 15, 28, 2, 14, 27, 20, 35, 2, 13, 26, 19, 34, 2, 12, 25, 18, 33, 1, 11, 24, 1, 36, 86, 1, 37, 87, 2, 3, 4, 35, 85, 2, 2, 3, 33, 82, 2, 1, 2, 34, 83, 1, 0, 1, }; const unsigned short Dict287KeyHashTable[] = { 41, 40, 48, 51, 56, 59, 62, 65, 68, 40, 73, 76, 81, 40, 84, 40, 40, 40, 87, 90, 40, 95, 40, 40, 40, 110, 40, 40, 40, 40, 40, 115, 40, 120, 123, 40, 130, 40, 133, 140, 0, 3, 6, 34127, 32, 64256, 38, 34081, 1, 26, 8277, 2, 1, 52368, 15, 46230, 1, 2, 52368, 1, 3, 52368, 1, 11, 57564, 1, 10, 2620, 2, 18, 1275, 30, 40530, 1, 7, 35645, 2, 5, 33406, 20, 61537, 1, 37, 52495, 1, 13, 22805, 1, 24, 44274, 2, 9, 45552, 39, 58495, 7, 0, 134, 4, 134, 8, 134, 19, 134, 21, 134, 22, 134, 23, 134, 2, 28, 13507, 34, 14559, 2, 31, 36272, 33, 58300, 1, 25, 45829, 3, 17, 59316, 27, 28329, 29, 41490, 1, 16, 17210, 3, 12, 59871, 35, 19693, 36, 4510, 1, 14, 12256, }; vtkDICOMDictionary::Dict Dict287Data = { "Applicare/RadStore/Version 1.0", 40, 40, Dict287TagHashTable, Dict287KeyHashTable, Dict287Contents }; // ----- Siemens: Thorax/Multix FD Post Processing ----- const DictEntry Dict288Contents[] = { { 0x0021, 0x0000, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0001, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::FL, VM::M1, "" }, { 0x0021, 0x0003, 0, VR::FL, VM::M1, "" }, { 0x0021, 0x0004, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0005, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0006, 0, VR::FL, VM::M1, "" }, { 0x0021, 0x0007, 0, VR::FL, VM::M1, "" }, { 0x0021, 0x0008, 0, VR::US, VM::M1, "AutoWindowFlag" }, { 0x0021, 0x0009, 0, VR::SL, VM::M1, "AutoWindowCenter" }, { 0x0021, 0x000a, 0, VR::SL, VM::M1, "AutoWindowWidth" }, { 0x0021, 0x000b, 0, VR::SS, VM::M1, "FilterID" }, { 0x0021, 0x000c, 0, VR::FL, VM::M1, "" }, { 0x0021, 0x000d, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x000e, 0, VR::US, VM::M1, "DoseControlValue" }, { 0x0021, 0x000f, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0011, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0012, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0013, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0014, 0, VR::US, VM::M1, "AnatomicCorrectView" }, { 0x0021, 0x0015, 0, VR::SS, VM::M1, "AutoWindowShift" }, { 0x0021, 0x0016, 0, VR::DS, VM::M1, "AutoWindowExpansion" }, { 0x0021, 0x0017, 0, VR::LO, VM::M1, "SystemType" }, { 0x0021, 0x0018, 0, VR::LO, VM::M1, "DetectorType" }, { 0x0021, 0x0030, 0, VR::US, VM::M1, "AnatomicSortNumber" }, { 0x0021, 0x0031, 0, VR::US, VM::M1, "AcquisitionSortNumber" }, }; const unsigned short Dict288TagHashTable[] = { 28, 31, 27, 34, 27, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 75, 80, 83, 86, 89, 92, 95, 98, 101, 104, 0, 1, 23, 23, 1, 22, 22, 1, 24, 24, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 9, 9, 1, 8, 8, 1, 11, 11, 2, 10, 10, 26, 49, 2, 13, 13, 25, 48, 1, 12, 12, 1, 15, 15, 1, 14, 14, 1, 17, 17, 1, 16, 16, 1, 19, 19, 1, 18, 18, 1, 21, 21, 1, 20, 20, }; const unsigned short Dict288KeyHashTable[] = { 28, 31, 27, 34, 37, 27, 27, 27, 42, 27, 73, 27, 27, 27, 27, 27, 27, 76, 79, 82, 27, 27, 27, 27, 85, 27, 27, 0, 1, 22, 18001, 1, 8, 7197, 1, 26, 35092, 2, 11, 21788, 23, 216, 15, 0, 199, 1, 199, 2, 199, 3, 199, 4, 199, 5, 199, 6, 199, 7, 199, 12, 199, 13, 199, 15, 199, 16, 199, 17, 199, 18, 199, 19, 199, 1, 20, 23420, 1, 9, 562, 1, 14, 41108, 1, 25, 51037, 3, 10, 43418, 21, 63188, 24, 65387, }; vtkDICOMDictionary::Dict Dict288Data = { "Siemens: Thorax/Multix FD Post Processing", 27, 27, Dict288TagHashTable, Dict288KeyHashTable, Dict288Contents }; // ----- AMICAS0 ----- const DictEntry Dict289Contents[] = { { 0x0023, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x0023, 0x0008, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0016, 0, VR::SL, VM::M1, "" }, { 0x0023, 0x0043, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0045, 0, VR::US, VM::M1, "" }, { 0x0023, 0x0054, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict289TagHashTable[] = { 7, 8, 11, 7, 14, 17, 20, 0, 1, 1, 8, 1, 2, 16, 1, 3, 22, 1, 5, 69, 3, 0, 1, 4, 67, 6, 84, }; const unsigned short Dict289KeyHashTable[] = { 7, 7, 7, 7, 7, 8, 7, 0, 7, 0, 768, 1, 768, 2, 768, 3, 768, 4, 768, 5, 768, 6, 768, }; vtkDICOMDictionary::Dict Dict289Data = { "AMICAS0", 7, 7, Dict289TagHashTable, Dict289KeyHashTable, Dict289Contents }; // ----- RamSoft Custom Report Identifier ----- const DictEntry Dict290Contents[] = { { 0x3113, 0x0010, 0, VR::OB, VM::M1, "BinaryDocument" }, { 0x3113, 0x0020, 0, VR::UL, VM::M1, "BinaryDocumentSize" }, }; const unsigned short Dict290TagHashTable[] = { 2, 3, 0, 2, 0, 16, 1, 32, }; const unsigned short Dict290KeyHashTable[] = { 3, 6, 0, 1, 1, 16338, 1, 0, 28788, }; vtkDICOMDictionary::Dict Dict290Data = { "RamSoft Custom Report Identifier", 2, 2, Dict290TagHashTable, Dict290KeyHashTable, Dict290Contents }; // ----- Applicare/RadWorks/Version 5.0 ----- const DictEntry Dict291Contents[] = { { 0x3109, 0x0001, 0, VR::ST, VM::M1, "WorklistFilename" }, { 0x3109, 0x0002, 0, VR::SH, VM::M1, "NewSeenStatus" }, { 0x3109, 0x0003, 0, VR::CS, VM::M1, "DeleteLock" }, { 0x3109, 0x0004, 0, VR::CS, VM::M1, "" }, { 0x3109, 0x0005, 0, VR::CS, VM::M1, "" }, { 0x3109, 0x0006, 0, VR::CS, VM::M1, "" }, { 0x3109, 0x0007, 0, VR::UL, VM::M1, "" }, { 0x3109, 0x0008, 0, VR::LO, VM::M1, "ReceiveOrigin" }, { 0x3109, 0x0009, 0, VR::LO, VM::M1, "Folder" }, { 0x3109, 0x000A, 0, VR::DA, VM::M1, "ReceiveDate" }, { 0x3109, 0x000B, 0, VR::TM, VM::M1, "ReceiveTime" }, { 0x3109, 0x000C, 0, VR::CS, VM::M1, "Prior" }, { 0x3109, 0x000D, 0, VR::CS, VM::M1, "StatStudy" }, { 0x3109, 0x000E, 0, VR::CS, VM::M1, "Key" }, { 0x3109, 0x0010, 0, VR::CS, VM::M1, "LocalStudy" }, { 0x3109, 0x0011, 0, VR::LO, VM::M1, "ResultMessage" }, { 0x3109, 0x0012, 0, VR::LO, VM::M1, "CurrentUser" }, { 0x3109, 0x0013, 0, VR::DA, VM::M1, "SystemDate" }, { 0x3109, 0x0014, 0, VR::TM, VM::M1, "SystemTime" }, { 0x3109, 0x0019, 0, VR::LO, VM::M1, "WorklistName" }, { 0x3109, 0x0020, 0, VR::UI, VM::M1, "WorklistUID" }, { 0x3109, 0x0021, 0, VR::CS, VM::M1, "Hostname" }, { 0x3109, 0x0022, 0, VR::AE, VM::M1, "DICOMAETitle" }, { 0x3109, 0x0023, 0, VR::US, VM::M1, "DICOMPortNumber" }, { 0x3109, 0x0024, 0, VR::LO, VM::M1, "DestinationName" }, { 0x3109, 0x0025, 0, VR::LO, VM::M1, "OriginName" }, { 0x3109, 0x0026, 0, VR::UI, VM::M1, "ModalityStudyInstanceUID" }, { 0x3109, 0x0027, 0, VR::SQ, VM::M1, "ExamRouting" }, { 0x3109, 0x0028, 0, VR::LO, VM::M1, "NotificationComments" }, { 0x3109, 0x0029, 0, VR::LO, VM::M1, "TransactionComments" }, { 0x3109, 0x002A, 0, VR::LO, VM::M1, "SendFlag" }, { 0x3109, 0x002B, 0, VR::LO, VM::M1, "PrintFlag" }, { 0x3109, 0x002C, 0, VR::LO, VM::M1, "ArchiveFlag" }, { 0x3109, 0x0030, 0, VR::LO, VM::M1, "RequestingFacilityName" }, { 0x3109, 0x0031, 0, VR::CS, VM::M1, "RequestingProcedureName" }, { 0x3109, 0x0032, 0, VR::CS, VM::M1, "RequestingProcedureCode" }, { 0x3109, 0x0033, 0, VR::CS, VM::M1, "RequestStorageCommitment" }, { 0x3109, 0x0034, 0, VR::CS, VM::M1, "RequestedCompression" }, { 0x3109, 0x0035, 0, VR::SQ, VM::M1, "StudySequence" }, { 0x3109, 0x0037, 0, VR::UI, VM::M1, "ReplacedStudyUID" }, { 0x3109, 0x0038, 0, VR::SH, VM::M1, "TeachingACRCode" }, { 0x3109, 0x0039, 0, VR::SH, VM::M1, "TeachingSpecialInterestCode" }, { 0x3109, 0x0040, 0, VR::IS, VM::M1, "NumberOfStudyRelatedImages" }, { 0x3109, 0x0041, 0, VR::CS, VM::M1, "StudyLocked" }, { 0x3109, 0x0042, 0, VR::CS, VM::M1, "WorkstationName" }, { 0x3109, 0x0043, 0, VR::CS, VM::M1, "ArchiveStatus" }, { 0x3109, 0x00EE, 0, VR::UI, VM::M1, "InternalListUID" }, { 0x3109, 0x00EF, 0, VR::CS, VM::M1, "Action" }, }; const unsigned short Dict291TagHashTable[] = { 49, 52, 48, 48, 57, 60, 63, 66, 69, 72, 75, 78, 81, 86, 91, 96, 101, 104, 48, 107, 110, 115, 120, 123, 126, 131, 136, 141, 144, 149, 152, 157, 48, 48, 48, 48, 162, 48, 48, 48, 48, 165, 48, 48, 168, 171, 174, 177, 0, 1, 46, 238, 2, 32, 44, 47, 239, 1, 29, 41, 1, 28, 40, 1, 31, 43, 1, 30, 42, 1, 25, 37, 1, 24, 36, 1, 27, 39, 1, 26, 38, 2, 21, 33, 42, 64, 2, 20, 32, 43, 65, 2, 23, 35, 44, 66, 2, 22, 34, 45, 67, 1, 12, 13, 1, 11, 12, 1, 13, 14, 2, 8, 9, 41, 57, 2, 7, 8, 40, 56, 1, 10, 11, 1, 9, 10, 2, 4, 5, 38, 53, 2, 3, 4, 37, 52, 2, 6, 7, 39, 55, 1, 5, 6, 2, 0, 1, 34, 49, 1, 33, 48, 2, 2, 3, 36, 51, 2, 1, 2, 35, 50, 1, 19, 25, 1, 18, 20, 1, 15, 17, 1, 14, 16, 1, 17, 19, 1, 16, 18, }; const unsigned short Dict291KeyHashTable[] = { 49, 52, 48, 48, 48, 55, 66, 48, 69, 72, 48, 48, 77, 48, 80, 48, 83, 94, 99, 104, 48, 107, 110, 113, 120, 125, 134, 48, 48, 48, 137, 140, 48, 143, 148, 151, 154, 48, 157, 48, 160, 163, 48, 166, 48, 48, 171, 48, 0, 1, 35, 25911, 1, 32, 52096, 5, 0, 17274, 3, 112, 4, 112, 5, 112, 6, 112, 1, 34, 33835, 1, 27, 5199, 2, 15, 17940, 40, 51295, 1, 31, 30532, 1, 25, 57850, 5, 7, 48886, 36, 48709, 39, 7535, 43, 33628, 46, 57169, 2, 8, 62381, 11, 9520, 2, 28, 16792, 41, 7434, 1, 47, 20783, 1, 19, 15665, 1, 20, 21799, 3, 10, 9504, 16, 2417, 38, 35570, 2, 24, 37073, 26, 33334, 4, 14, 34119, 18, 65292, 30, 8925, 37, 23461, 1, 12, 22692, 1, 1, 32096, 1, 23, 52308, 2, 2, 14242, 29, 62173, 1, 33, 51164, 1, 42, 32597, 1, 21, 13442, 1, 9, 62884, 1, 17, 53136, 1, 22, 32931, 2, 44, 15990, 45, 27686, 1, 13, 32764, }; vtkDICOMDictionary::Dict Dict291Data = { "Applicare/RadWorks/Version 5.0", 48, 48, Dict291TagHashTable, Dict291KeyHashTable, Dict291Contents }; // ----- Voxar 2.16.124.113543.6003.1999.12.20.12.5.0 ----- const DictEntry Dict292Contents[] = { { 0x1135, 0x0000, 0, VR::UI, VM::M1, "" }, { 0x1135, 0x0001, 0, VR::OB, VM::M1, "" }, { 0x1135, 0x0002, 0, VR::SQ, VM::M1, "" }, { 0x1135, 0x0006, 0, VR::UL, VM::M1, "" }, { 0x1135, 0x0007, 0, VR::UI, VM::M1, "" }, { 0x1135, 0x0008, 0, VR::SQ, VM::M1, "" }, { 0x1135, 0x0009, 0, VR::UI, VM::M1, "" }, { 0x1135, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x1135, 0x0013, 0, VR::LO, VM::M1, "" }, { 0x1135, 0x0014, 0, VR::UN, VM::M1, "" }, { 0x1135, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x1135, 0x0017, 0, VR::UN, VM::M1, "" }, { 0x1135, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x1135, 0x0021, 0, VR::UL, VM::M1, "" }, }; const unsigned short Dict292TagHashTable[] = { 14, 15, 20, 23, 26, 29, 34, 37, 40, 14, 14, 43, 46, 51, 0, 2, 2, 2, 9, 20, 1, 11, 23, 1, 10, 22, 1, 4, 7, 2, 3, 6, 12, 24, 1, 6, 9, 1, 5, 8, 1, 13, 33, 1, 7, 16, 2, 1, 1, 8, 19, 1, 0, 0, }; const unsigned short Dict292KeyHashTable[] = { 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 0, 384, 1, 384, 2, 384, 3, 384, 4, 384, 5, 384, 6, 384, 7, 384, 8, 384, 9, 384, 10, 384, 11, 384, 12, 384, 13, 384, }; vtkDICOMDictionary::Dict Dict292Data = { "Voxar 2.16.124.113543.6003.1999.12.20.12.5.0", 14, 14, Dict292TagHashTable, Dict292KeyHashTable, Dict292Contents }; // ----- astm.org/diconde/iod/NDEGeometry ----- const DictEntry Dict293Contents[] = { { 0x0021, 0x0002, 0, VR::IS, VM::M1, "CoordinateSystemNumberOfAxes" }, { 0x0021, 0x0004, 0, VR::SQ, VM::M1, "CoordinateSystemAxesSequence" }, { 0x0021, 0x0006, 0, VR::ST, VM::M1, "CoordinateSystemAxisDescription" }, { 0x0021, 0x0008, 0, VR::CS, VM::M1, "CoordinateSystemDataSetMapping" }, { 0x0021, 0x000A, 0, VR::IS, VM::M1, "CoordinateSystemAxisNumber" }, { 0x0021, 0x000C, 0, VR::CS, VM::M1, "CoordinateSystemAxisType" }, { 0x0021, 0x000E, 0, VR::CS, VM::M1, "CoordinateSystemAxisUnits" }, { 0x0021, 0x0010, 0, VR::OB, VM::M1, "CoordinateSystemAxisValues" }, { 0x0021, 0x0020, 0, VR::SQ, VM::M1, "CoordinateSystemTransformSequence" }, { 0x0021, 0x0022, 0, VR::ST, VM::M1, "TransformDescription" }, { 0x0021, 0x0024, 0, VR::IS, VM::M1, "TransformNumberOfAxes" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1TN, "TransformOrderOfAxes" }, { 0x0021, 0x0028, 0, VR::CS, VM::M1, "TransformedAxisUnits" }, { 0x0021, 0x002A, 0, VR::DS, VM::M1TN, "CoordinateSystemTransformRotationAndScaleMatrix" }, { 0x0021, 0x002C, 0, VR::DS, VM::M1TN, "CoordinateSystemTransformTranslationMatrix" }, }; const unsigned short Dict293TagHashTable[] = { 16, 19, 22, 25, 28, 31, 15, 36, 15, 41, 15, 46, 15, 51, 15, 0, 1, 5, 12, 1, 8, 32, 1, 6, 14, 1, 9, 34, 1, 7, 16, 2, 0, 2, 10, 36, 2, 1, 4, 11, 38, 2, 2, 6, 12, 40, 2, 3, 8, 13, 42, 2, 4, 10, 14, 44, }; const unsigned short Dict293KeyHashTable[] = { 15, 16, 21, 24, 27, 15, 15, 32, 35, 42, 15, 45, 15, 15, 50, 0, 2, 2, 8054, 11, 11934, 1, 5, 5865, 1, 1, 39863, 2, 0, 19315, 14, 19282, 1, 4, 8391, 3, 3, 40868, 9, 14579, 13, 63194, 1, 8, 33794, 2, 7, 30772, 12, 48521, 2, 6, 14228, 10, 22782, }; vtkDICOMDictionary::Dict Dict293Data = { "astm.org/diconde/iod/NDEGeometry", 15, 15, Dict293TagHashTable, Dict293KeyHashTable, Dict293Contents }; // ----- BRAINWAVE: 1.2.840.113819.3 ----- const DictEntry Dict294Contents[] = { { 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" }, { 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" }, { 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID" }, { 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" }, { 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" }, { 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" }, { 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" }, { 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" }, { 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" }, { 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" }, { 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" }, { 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" }, { 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" }, { 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" }, { 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" }, { 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" }, { 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" }, { 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" }, { 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" }, { 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" }, { 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" }, { 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" }, { 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" }, { 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" }, { 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" }, { 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" }, { 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" }, { 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" }, { 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" }, { 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" }, { 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" }, { 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" }, { 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" }, }; const unsigned short Dict294TagHashTable[] = { 33, 34, 37, 40, 33, 33, 33, 33, 45, 50, 53, 58, 33, 61, 33, 33, 64, 67, 70, 73, 80, 85, 88, 91, 94, 99, 104, 109, 112, 115, 118, 121, 33, 0, 1, 10, 96, 1, 11, 97, 2, 6, 33, 8, 65, 2, 30, 162, 32, 192, 1, 29, 161, 2, 16, 129, 28, 160, 1, 15, 128, 1, 17, 134, 1, 19, 139, 1, 18, 138, 1, 12, 113, 3, 7, 49, 9, 81, 13, 114, 2, 1, 17, 14, 115, 1, 0, 16, 1, 3, 19, 1, 2, 18, 2, 5, 21, 23, 147, 2, 4, 20, 22, 146, 2, 21, 145, 31, 176, 1, 20, 144, 1, 27, 151, 1, 26, 150, 1, 25, 149, 1, 24, 148, }; const unsigned short Dict294KeyHashTable[] = { 34, 37, 33, 33, 42, 33, 51, 33, 54, 33, 57, 60, 65, 72, 75, 33, 33, 82, 87, 90, 93, 33, 33, 96, 33, 99, 104, 107, 110, 113, 33, 116, 119, 0, 1, 18, 60524, 2, 26, 883, 31, 24793, 4, 0, 61333, 7, 38376, 27, 4897, 28, 10251, 1, 32, 51312, 1, 29, 41996, 1, 19, 23448, 2, 5, 29882, 11, 46877, 3, 17, 57709, 22, 10678, 23, 18186, 1, 24, 13940, 3, 1, 24399, 12, 61310, 21, 59116, 2, 4, 37294, 8, 22544, 1, 10, 7665, 1, 2, 56256, 1, 25, 2202, 1, 20, 20031, 2, 3, 39873, 9, 24844, 1, 15, 37913, 1, 14, 51987, 1, 16, 42645, 1, 13, 56334, 1, 30, 33808, 1, 6, 56805, }; vtkDICOMDictionary::Dict Dict294Data = { "BRAINWAVE: 1.2.840.113819.3", 33, 33, Dict294TagHashTable, Dict294KeyHashTable, Dict294Contents }; // ----- GEMS_CT_VES_01 ----- const DictEntry Dict295Contents[] = { { 0x0051, 0x1001, 0, VR::SQ, VM::M1, "CTVESSequence" }, }; const unsigned short Dict295TagHashTable[] = { 2, 0, 1, 0, 4097, }; const unsigned short Dict295KeyHashTable[] = { 2, 0, 1, 0, 32067, }; vtkDICOMDictionary::Dict Dict295Data = { "GEMS_CT_VES_01", 1, 1, Dict295TagHashTable, Dict295KeyHashTable, Dict295Contents }; // ----- AMI Sequence Annotations_01 ----- const DictEntry Dict296Contents[] = { { 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" }, { 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" }, { 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" }, { 0x3103, 0x0050, 0, VR::CS, VM::M1, "AnnotationLineStyle" }, { 0x3103, 0x0060, 0, VR::SQ, VM::M1, "AnnotationElements" }, { 0x3103, 0x0070, 0, VR::SH, VM::M1, "AnnotationLabel" }, { 0x3103, 0x0080, 0, VR::PN, VM::M1, "AnnotationCreator" }, { 0x3103, 0x0090, 0, VR::PN, VM::M1, "AnnotationModifiers" }, { 0x3103, 0x00A0, 0, VR::DA, VM::M1, "AnnotationCreationDate" }, { 0x3103, 0x00B0, 0, VR::TM, VM::M1, "AnnotationCreationTime" }, { 0x3103, 0x00C0, 0, VR::DA, VM::M1, "AnnotationModificationDates" }, { 0x3103, 0x00D0, 0, VR::TM, VM::M1, "AnnotationMofificationTimes" }, { 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" }, }; const unsigned short Dict296TagHashTable[] = { 13, 13, 13, 14, 13, 13, 19, 13, 13, 28, 13, 13, 37, 0, 2, 6, 128, 10, 192, 4, 0, 16, 3, 80, 7, 144, 11, 208, 4, 1, 32, 4, 96, 8, 160, 12, 224, 3, 2, 48, 5, 112, 9, 176, }; const unsigned short Dict296KeyHashTable[] = { 13, 14, 17, 20, 23, 28, 31, 34, 13, 37, 42, 47, 13, 0, 1, 1, 40997, 1, 2, 9937, 1, 9, 18917, 2, 10, 9359, 12, 45136, 1, 0, 61540, 1, 5, 4962, 1, 3, 59322, 2, 7, 55037, 8, 39570, 2, 4, 58303, 6, 14270, 1, 11, 12683, }; vtkDICOMDictionary::Dict Dict296Data = { "AMI Sequence Annotations_01", 13, 13, Dict296TagHashTable, Dict296KeyHashTable, Dict296Contents }; // ----- AMI Sequence Annotations_02 ----- const DictEntry Dict297Contents[] = { { 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" }, { 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" }, { 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" }, { 0x3103, 0x0050, 0, VR::CS, VM::M1, "AnnotationLineStyle" }, { 0x3103, 0x0060, 0, VR::SQ, VM::M1, "AnnotationElements" }, { 0x3103, 0x0070, 0, VR::SH, VM::M1, "AnnotationLabel" }, { 0x3103, 0x0080, 0, VR::PN, VM::M1, "AnnotationCreator" }, { 0x3103, 0x0090, 0, VR::PN, VM::M1, "AnnotationModifiers" }, { 0x3103, 0x00A0, 0, VR::DA, VM::M1, "AnnotationCreationDate" }, { 0x3103, 0x00B0, 0, VR::TM, VM::M1, "AnnotationCreationTime" }, { 0x3103, 0x00C0, 0, VR::DA, VM::M1, "AnnotationModificationDates" }, { 0x3103, 0x00D0, 0, VR::TM, VM::M1, "AnnotationModificationTimes" }, { 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" }, }; const unsigned short Dict297TagHashTable[] = { 13, 13, 13, 14, 13, 13, 19, 13, 13, 28, 13, 13, 37, 0, 2, 6, 128, 10, 192, 4, 0, 16, 3, 80, 7, 144, 11, 208, 4, 1, 32, 4, 96, 8, 160, 12, 224, 3, 2, 48, 5, 112, 9, 176, }; const unsigned short Dict297KeyHashTable[] = { 13, 14, 19, 22, 25, 30, 33, 36, 13, 39, 44, 13, 13, 0, 2, 1, 40997, 11, 48691, 1, 2, 9937, 1, 9, 18917, 2, 10, 9359, 12, 45136, 1, 0, 61540, 1, 5, 4962, 1, 3, 59322, 2, 7, 55037, 8, 39570, 2, 4, 58303, 6, 14270, }; vtkDICOMDictionary::Dict Dict297Data = { "AMI Sequence Annotations_02", 13, 13, Dict297TagHashTable, Dict297KeyHashTable, Dict297Contents }; // ----- GE LUT Asymmetry Parameter ----- const DictEntry Dict298Contents[] = { { 0x0045, 0x0067, 0, VR::DS, VM::M1, "LUTAssymetry" }, }; const unsigned short Dict298TagHashTable[] = { 2, 0, 1, 0, 103, }; const unsigned short Dict298KeyHashTable[] = { 2, 0, 1, 0, 59819, }; vtkDICOMDictionary::Dict Dict298Data = { "GE LUT Asymmetry Parameter", 1, 1, Dict298TagHashTable, Dict298KeyHashTable, Dict298Contents }; // ----- ACUSON:1.2.840.113680.1.0:0910 ----- const DictEntry Dict299Contents[] = { { 0x0009, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientRegistrationCustomField1" }, { 0x0009, 0x0003, 0, VR::LO, VM::M1, "PatientRegistrationCustomField2" }, { 0x0009, 0x0004, 0, VR::LO, VM::M1, "Indications" }, { 0x0009, 0x000f, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict299TagHashTable[] = { 7, 10, 13, 16, 19, 22, 0, 1, 5, 15, 1, 4, 4, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, }; const unsigned short Dict299KeyHashTable[] = { 7, 6, 6, 6, 10, 13, 0, 1, 3, 2065, 1, 4, 8233, 4, 0, 896, 1, 896, 2, 2064, 5, 896, }; vtkDICOMDictionary::Dict Dict299Data = { "ACUSON:1.2.840.113680.1.0:0910", 6, 6, Dict299TagHashTable, Dict299KeyHashTable, Dict299Contents }; // ----- MATAKINA_10 ----- const DictEntry Dict300Contents[] = { { 0x0015, 0x0028, 0, VR::LO, VM::M1, "VolparaDensityGrade" }, { 0x0015, 0x0029, 0, VR::LT, VM::M1, "VolparaRunInformation" }, { 0x0015, 0x0030, 0, VR::LO, VM::M1, "VolparaDensityGradeCutoffs" }, }; const unsigned short Dict300TagHashTable[] = { 4, 7, 3, 0, 1, 1, 41, 2, 0, 40, 2, 48, }; const unsigned short Dict300KeyHashTable[] = { 4, 3, 7, 0, 1, 2, 49309, 2, 0, 48841, 1, 31377, }; vtkDICOMDictionary::Dict Dict300Data = { "MATAKINA_10", 3, 3, Dict300TagHashTable, Dict300KeyHashTable, Dict300Contents }; // ----- SIEMENS CT VA0 OST ----- const DictEntry Dict301Contents[] = { { 0x6021, 0x0000, 0, VR::LO, VM::M1, "OsteoContourComment" }, { 0x6021, 0x0010, 0, VR::US, VM::M256, "OsteoContourBuffer" }, }; const unsigned short Dict301TagHashTable[] = { 2, 3, 0, 2, 0, 0, 1, 16, }; const unsigned short Dict301KeyHashTable[] = { 3, 6, 0, 1, 0, 64726, 1, 1, 37913, }; vtkDICOMDictionary::Dict Dict301Data = { "SIEMENS CT VA0 OST", 2, 2, Dict301TagHashTable, Dict301KeyHashTable, Dict301Contents }; // ----- SIEMENS MED DISPLAY 0000 ----- const DictEntry Dict302Contents[] = { { 0x0029, 0x0099, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x00b0, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00b2, 0, VR::US, VM::M1TN, "" }, { 0x0029, 0x00c1, 0, VR::US, VM::M1TN, "" }, }; const unsigned short Dict302TagHashTable[] = { 4, 5, 8, 11, 0, 1, 2, 178, 1, 0, 153, 2, 1, 176, 3, 193, }; const unsigned short Dict302KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict302Data = { "SIEMENS MED DISPLAY 0000", 4, 4, Dict302TagHashTable, Dict302KeyHashTable, Dict302Contents }; // ----- SIEMENS MED DISPLAY 0001 ----- const DictEntry Dict303Contents[] = { { 0x0029, 0x0099, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x00a0, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00a1, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00a2, 0, VR::US, VM::M1TN, "" }, }; const unsigned short Dict303TagHashTable[] = { 4, 5, 8, 13, 0, 1, 3, 162, 2, 0, 153, 2, 161, 1, 1, 160, }; const unsigned short Dict303KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict303Data = { "SIEMENS MED DISPLAY 0001", 4, 4, Dict303TagHashTable, Dict303KeyHashTable, Dict303Contents }; // ----- Picker NM Private Group ----- const DictEntry Dict304Contents[] = { { 0x7001, 0x0001, 0, VR::UI, VM::M1, "" }, { 0x7001, 0x0002, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0003, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0004, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0005, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0006, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0007, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0008, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0009, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x7001, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x7001, 0x0012, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0013, 0, VR::US, VM::M1, "" }, { 0x7001, 0x0014, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0016, 0, VR::OB, VM::M1, "" }, { 0x7001, 0x0017, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict304TagHashTable[] = { 17, 22, 25, 30, 35, 38, 43, 48, 53, 56, 16, 16, 16, 16, 16, 16, 0, 2, 0, 1, 10, 17, 1, 9, 16, 2, 2, 3, 12, 19, 2, 1, 2, 11, 18, 1, 4, 5, 2, 3, 4, 13, 20, 2, 6, 7, 15, 23, 2, 5, 6, 14, 22, 1, 8, 9, 1, 7, 8, }; const unsigned short Dict304KeyHashTable[] = { 16, 16, 16, 16, 16, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 0, 336, 1, 336, 2, 336, 3, 336, 4, 336, 5, 336, 6, 336, 7, 336, 8, 336, 9, 336, 10, 336, 11, 336, 12, 336, 13, 336, 14, 336, 15, 336, }; vtkDICOMDictionary::Dict Dict304Data = { "Picker NM Private Group", 16, 16, Dict304TagHashTable, Dict304KeyHashTable, Dict304Contents }; // ----- PHILIPS MR SPECTRO;1 ----- const DictEntry Dict305Contents[] = { { 0x0019, 0x0001, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0012, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0013, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0016, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0017, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0023, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0025, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0027, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0041, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::IS, VM::M2, "" }, { 0x0019, 0x0043, 0, VR::IS, VM::M2, "" }, { 0x0019, 0x0045, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0047, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0049, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0061, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0071, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0073, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0076, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0077, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0079, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict305TagHashTable[] = { 50, 51, 50, 50, 54, 57, 62, 67, 72, 77, 82, 89, 96, 101, 106, 109, 112, 115, 50, 50, 118, 121, 124, 50, 127, 50, 130, 133, 136, 139, 142, 147, 50, 50, 50, 50, 50, 50, 50, 152, 155, 160, 50, 163, 168, 171, 174, 177, 180, 183, 0, 1, 16, 24, 1, 40, 112, 2, 41, 113, 49, 128, 2, 18, 33, 42, 114, 2, 17, 32, 43, 115, 2, 20, 35, 44, 116, 2, 9, 16, 19, 34, 3, 11, 19, 22, 37, 45, 118, 3, 10, 18, 21, 36, 46, 119, 2, 13, 21, 24, 39, 2, 12, 20, 23, 38, 1, 15, 23, 1, 14, 22, 1, 8, 9, 1, 7, 8, 1, 38, 96, 1, 39, 97, 1, 37, 80, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 2, 6, 7, 35, 72, 2, 5, 6, 36, 73, 1, 29, 65, 2, 27, 49, 30, 66, 1, 31, 67, 2, 28, 50, 32, 69, 1, 33, 70, 1, 34, 71, 1, 47, 120, 1, 48, 121, 1, 26, 41, 1, 25, 40, }; const unsigned short Dict305KeyHashTable[] = { 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 0, 107, 1, 107, 2, 107, 3, 107, 4, 107, 5, 107, 6, 107, 7, 107, 8, 107, 9, 107, 10, 107, 11, 107, 12, 107, 13, 107, 14, 107, 15, 107, 16, 107, 17, 107, 18, 107, 19, 107, 20, 107, 21, 107, 22, 107, 23, 107, 24, 107, 25, 107, 26, 107, 27, 107, 28, 107, 29, 107, 30, 107, 31, 107, 32, 107, 33, 107, 34, 107, 35, 107, 36, 107, 37, 107, 38, 107, 39, 107, 40, 107, 41, 107, 42, 107, 43, 107, 44, 107, 45, 107, 46, 107, 47, 107, 48, 107, 49, 107, }; vtkDICOMDictionary::Dict Dict305Data = { "PHILIPS MR SPECTRO;1", 50, 50, Dict305TagHashTable, Dict305KeyHashTable, Dict305Contents }; // ----- astm.org/diconde/iod/NdeIndication ----- const DictEntry Dict306Contents[] = { { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "EvaluatorSequence" }, { 0x0021, 0x0004, 0, VR::IS, VM::M1, "EvaluatorNumber" }, { 0x0021, 0x0006, 0, VR::PN, VM::M1, "EvaluatorName" }, { 0x0021, 0x0008, 0, VR::IS, VM::M1, "EvaluationAttempt" }, { 0x0021, 0x0012, 0, VR::SQ, VM::M1, "IndicationSequence" }, { 0x0021, 0x0014, 0, VR::IS, VM::M1, "IndicationNumber" }, { 0x0021, 0x0016, 0, VR::SH, VM::M1, "IndicationLabel" }, { 0x0021, 0x0018, 0, VR::ST, VM::M1, "IndicationDescription" }, { 0x0021, 0x001A, 0, VR::CS, VM::M1TN, "IndicationType" }, { 0x0021, 0x001C, 0, VR::CS, VM::M1, "IndicationDisposition" }, { 0x0021, 0x001E, 0, VR::SQ, VM::M1, "IndicationROISequence" }, { 0x0021, 0x0030, 0, VR::SQ, VM::M1, "IndicationPhysicalPropertySequence" }, { 0x0021, 0x0032, 0, VR::SH, VM::M1, "PropertyLabel" }, }; const unsigned short Dict306TagHashTable[] = { 14, 17, 20, 23, 26, 29, 32, 35, 13, 38, 13, 43, 48, 0, 1, 2, 6, 1, 5, 20, 1, 3, 8, 1, 6, 22, 1, 11, 48, 1, 7, 24, 1, 12, 50, 1, 8, 26, 2, 0, 2, 9, 28, 2, 1, 4, 10, 30, 1, 4, 18, }; const unsigned short Dict306KeyHashTable[] = { 14, 13, 17, 22, 13, 13, 31, 34, 39, 42, 13, 13, 45, 0, 1, 4, 37280, 2, 5, 46406, 11, 43872, 4, 0, 15814, 1, 23990, 7, 58856, 8, 49950, 1, 12, 61652, 2, 6, 24288, 10, 39247, 1, 9, 35076, 1, 3, 33727, 1, 2, 53665, }; vtkDICOMDictionary::Dict Dict306Data = { "astm.org/diconde/iod/NdeIndication", 13, 13, Dict306TagHashTable, Dict306KeyHashTable, Dict306Contents }; // ----- GEMS_LUNAR_RAW ----- const DictEntry Dict307Contents[] = { { 0x7003, 0x0001, 0, VR::ST, VM::M1, "enCOREFileName" }, { 0x7003, 0x0002, 0, VR::OB, VM::M1, "enCOREFileData" }, { 0x7003, 0x0003, 0, VR::UL, VM::M1, "enCOREFileLength" }, { 0x7003, 0x0004, 0, VR::LO, VM::M1, "enCOREFileModifiedTime" }, }; const unsigned short Dict307TagHashTable[] = { 5, 8, 11, 14, 0, 1, 2, 3, 1, 1, 2, 1, 0, 1, 1, 3, 4, }; const unsigned short Dict307KeyHashTable[] = { 4, 5, 8, 11, 0, 1, 3, 47668, 1, 0, 24392, 2, 1, 142, 2, 168, }; vtkDICOMDictionary::Dict Dict307Data = { "GEMS_LUNAR_RAW", 4, 4, Dict307TagHashTable, Dict307KeyHashTable, Dict307Contents }; // ----- PRIVATE_CODE_STRING_3007 ----- const DictEntry Dict308Contents[] = { { 0x3007, 0x0000, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" }, { 0x3007, 0x0001, 0, VR::FD, VM::M16, "VolumeResolutionConversion" }, { 0x3007, 0x0002, 0, VR::FD, VM::M16, "VolumeDataConversion" }, { 0x3007, 0x0003, 0, VR::FD, VM::M16, "PatientDataConversion" }, { 0x3007, 0x0004, 0, VR::FD, VM::M16, "DICOMDataConversion" }, }; const unsigned short Dict308TagHashTable[] = { 6, 9, 12, 15, 18, 0, 1, 2, 2, 1, 1, 1, 1, 0, 0, 1, 4, 4, 1, 3, 3, }; const unsigned short Dict308KeyHashTable[] = { 6, 11, 14, 5, 17, 0, 2, 2, 61209, 4, 10045, 1, 0, 45781, 1, 1, 59953, 1, 3, 41758, }; vtkDICOMDictionary::Dict Dict308Data = { "PRIVATE_CODE_STRING_3007", 5, 5, Dict308TagHashTable, Dict308KeyHashTable, Dict308Contents }; // ----- TELEMIS ----- const DictEntry Dict309Contents[] = { { 0x0029, 0x0004, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict309TagHashTable[] = { 2, 0, 1, 0, 4, }; const unsigned short Dict309KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict309Data = { "TELEMIS", 1, 1, Dict309TagHashTable, Dict309KeyHashTable, Dict309Contents }; // ----- SIEMENS Selma ----- const DictEntry Dict310Contents[] = { { 0x0019, 0x0006, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0029, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0033, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0035, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict310TagHashTable[] = { 12, 15, 11, 11, 18, 11, 21, 24, 27, 34, 39, 0, 1, 10, 53, 1, 9, 52, 1, 4, 41, 1, 2, 8, 1, 6, 49, 3, 1, 7, 3, 38, 5, 48, 2, 0, 6, 8, 51, 1, 7, 50, }; const unsigned short Dict310KeyHashTable[] = { 11, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 489, 1, 489, 2, 489, 3, 489, 4, 489, 5, 489, 6, 489, 7, 489, 8, 489, 9, 489, 10, 489, }; vtkDICOMDictionary::Dict Dict310Data = { "SIEMENS Selma", 11, 11, Dict310TagHashTable, Dict310KeyHashTable, Dict310Contents }; // ----- ETIAM DICOMDIR ----- const DictEntry Dict311Contents[] = { { 0x0859, 0x0040, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict311TagHashTable[] = { 2, 0, 1, 0, 64, }; const unsigned short Dict311KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict311Data = { "ETIAM DICOMDIR", 1, 1, Dict311TagHashTable, Dict311KeyHashTable, Dict311Contents }; // ----- MAROTECH Inc. ----- const DictEntry Dict312Contents[] = { { 0x0037, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0037, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0037, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0037, 0x0023, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict312TagHashTable[] = { 5, 8, 11, 4, 0, 1, 3, 35, 1, 2, 34, 2, 0, 1, 1, 33, }; const unsigned short Dict312KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict312Data = { "MAROTECH Inc.", 4, 4, Dict312TagHashTable, Dict312KeyHashTable, Dict312Contents }; // ----- GEMS_DL_FRAME_01 ----- const DictEntry Dict313Contents[] = { { 0x0025, 0x0002, 0, VR::IS, VM::M1, "FrameID" }, { 0x0025, 0x0003, 0, VR::DS, VM::M1, "DistanceSourceToDetector" }, { 0x0025, 0x0004, 0, VR::DS, VM::M1, "DistanceSourceToPatient" }, { 0x0025, 0x0005, 0, VR::DS, VM::M1, "DistanceSourceToSkin" }, { 0x0025, 0x0006, 0, VR::DS, VM::M1, "PositionerPrimaryAngle" }, { 0x0025, 0x0007, 0, VR::DS, VM::M1, "PositionerSecondaryAngle" }, { 0x0025, 0x0008, 0, VR::IS, VM::M1, "BeamOrientation" }, { 0x0025, 0x0009, 0, VR::DS, VM::M1, "LArmAngle" }, { 0x0025, 0x000A, 0, VR::SQ, VM::M1, "FrameSequence" }, { 0x0025, 0x0010, 0, VR::DS, VM::M1, "PivotAngle" }, { 0x0025, 0x001A, 0, VR::DS, VM::M1, "ArcAngle" }, { 0x0025, 0x001B, 0, VR::DS, VM::M1, "TableVerticalPosition" }, { 0x0025, 0x001C, 0, VR::DS, VM::M1, "TableLongitudinalPosition" }, { 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" }, { 0x0025, 0x001E, 0, VR::IS, VM::M1, "BeamCoverArea" }, { 0x0025, 0x001F, 0, VR::DS, VM::M1, "kVPActual" }, { 0x0025, 0x0020, 0, VR::DS, VM::M1, "mASActual" }, { 0x0025, 0x0021, 0, VR::DS, VM::M1, "PWActual" }, { 0x0025, 0x0022, 0, VR::DS, VM::M1, "KvpCommanded" }, { 0x0025, 0x0023, 0, VR::DS, VM::M1, "MasCommanded" }, { 0x0025, 0x0024, 0, VR::DS, VM::M1, "PwCommanded" }, { 0x0025, 0x0025, 0, VR::CS, VM::M1, "Grid" }, { 0x0025, 0x0026, 0, VR::DS, VM::M1, "SensorFeedback" }, { 0x0025, 0x0027, 0, VR::DS, VM::M1, "TargetEntranceDose" }, { 0x0025, 0x0028, 0, VR::DS, VM::M1, "CnrCommanded" }, { 0x0025, 0x0029, 0, VR::DS, VM::M1, "ContrastCommanded" }, { 0x0025, 0x002A, 0, VR::DS, VM::M1, "EPTActual" }, { 0x0025, 0x002B, 0, VR::IS, VM::M1, "SpectralFilterZnb" }, { 0x0025, 0x002C, 0, VR::DS, VM::M1, "SpectralFilterWeight" }, { 0x0025, 0x002D, 0, VR::DS, VM::M1, "SpectralFilterDensity" }, { 0x0025, 0x002E, 0, VR::IS, VM::M1, "SpectralFilterThickness" }, { 0x0025, 0x002F, 0, VR::IS, VM::M1, "SpectralFilterStatus" }, { 0x0025, 0x0030, 0, VR::IS, VM::M2, "FOVDimension" }, { 0x0025, 0x0033, 0, VR::IS, VM::M2, "FOVOrigin" }, { 0x0025, 0x0034, 0, VR::IS, VM::M1, "CollimatorLeftVerticalEdge" }, { 0x0025, 0x0035, 0, VR::IS, VM::M1, "CollimatorRightVerticalEdge" }, { 0x0025, 0x0036, 0, VR::IS, VM::M1, "CollimatorUpHorizontalEdge" }, { 0x0025, 0x0037, 0, VR::IS, VM::M1, "CollimatorLowHorizontalEdge" }, { 0x0025, 0x0038, 0, VR::IS, VM::M1, "VerticesPolygonalCollimator" }, { 0x0025, 0x0039, 0, VR::IS, VM::M1, "ContourFilterDistance" }, { 0x0025, 0x003A, 0, VR::UL, VM::M1, "ContourFilterAngle" }, { 0x0025, 0x003B, 0, VR::CS, VM::M1, "TableRotationStatus" }, { 0x0025, 0x003C, 0, VR::CS, VM::M1, "InternalLabelFrame" }, }; const unsigned short Dict313TagHashTable[] = { 44, 47, 52, 57, 60, 65, 68, 71, 74, 77, 80, 85, 88, 91, 96, 101, 106, 111, 114, 117, 122, 125, 128, 43, 43, 131, 43, 43, 134, 137, 140, 143, 146, 149, 152, 155, 43, 43, 158, 161, 43, 43, 43, 0, 1, 21, 37, 2, 7, 9, 20, 36, 2, 6, 8, 23, 39, 1, 22, 38, 2, 8, 10, 17, 33, 1, 16, 32, 1, 19, 35, 1, 18, 34, 1, 29, 45, 1, 28, 44, 2, 9, 16, 31, 47, 1, 30, 46, 1, 25, 41, 2, 13, 29, 24, 40, 2, 12, 28, 27, 43, 2, 15, 31, 26, 42, 2, 14, 30, 35, 53, 1, 34, 52, 1, 37, 55, 2, 11, 27, 36, 54, 1, 10, 26, 1, 32, 48, 1, 33, 51, 1, 42, 60, 1, 39, 57, 1, 38, 56, 1, 41, 59, 1, 40, 58, 1, 3, 5, 1, 2, 4, 1, 5, 7, 1, 4, 6, 1, 1, 3, 1, 0, 2, }; const unsigned short Dict313KeyHashTable[] = { 44, 47, 50, 43, 55, 43, 60, 63, 43, 43, 66, 69, 72, 75, 82, 43, 43, 43, 85, 88, 91, 94, 99, 104, 113, 43, 116, 119, 122, 43, 127, 132, 43, 135, 138, 141, 144, 147, 150, 153, 43, 158, 43, 0, 1, 7, 13416, 1, 38, 17788, 2, 4, 42862, 19, 45860, 2, 24, 39748, 39, 43540, 1, 34, 47277, 1, 15, 54363, 1, 13, 55351, 1, 37, 25091, 1, 33, 49284, 3, 27, 43570, 29, 54804, 30, 8248, 1, 2, 34881, 1, 3, 27637, 1, 17, 1305, 1, 12, 3080, 2, 10, 47879, 41, 28484, 2, 0, 39765, 42, 39045, 4, 18, 6901, 22, 34119, 25, 56972, 31, 54562, 1, 32, 46650, 1, 28, 10917, 1, 16, 40847, 2, 6, 26974, 9, 37734, 2, 1, 2816, 35, 8894, 1, 8, 19742, 1, 26, 42453, 1, 14, 40400, 1, 36, 43732, 1, 21, 22773, 1, 40, 31653, 1, 23, 43747, 2, 5, 44971, 20, 35431, 1, 11, 46905, }; vtkDICOMDictionary::Dict Dict313Data = { "GEMS_DL_FRAME_01", 43, 43, Dict313TagHashTable, Dict313KeyHashTable, Dict313Contents }; // ----- PHILIPS MR/PART 12 ----- const DictEntry Dict314Contents[] = { { 0x0009, 0x0010, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict314TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict314KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict314Data = { "PHILIPS MR/PART 12", 1, 1, Dict314TagHashTable, Dict314KeyHashTable, Dict314Contents }; // ----- SIEMENS MR N3D ----- const DictEntry Dict315Contents[] = { { 0x0021, 0x0030, 0, VR::SQ, VM::M1, "BackgroundColorDRSequence" }, { 0x0021, 0x0031, 0, VR::DS, VM::M3, "BackgroundColor" }, { 0x0021, 0x0036, 0, VR::SQ, VM::M1, "FieldMapDRSequence" }, { 0x0021, 0x0037, 0, VR::CS, VM::M1, "Visible" }, { 0x0021, 0x0038, 0, VR::DS, VM::M3, "TintingColor" }, { 0x0021, 0x0039, 0, VR::CS, VM::M1, "TintingEnabled" }, { 0x0021, 0x003A, 0, VR::LO, VM::M1, "VolumeID" }, { 0x0021, 0x003B, 0, VR::LO, VM::M1, "VolumeIDAsBound" }, { 0x0021, 0x0041, 0, VR::SQ, VM::M1, "FloatingMPRColorLUTDRSequence" }, { 0x0021, 0x0042, 0, VR::DS, VM::M1, "RGBALUT" }, { 0x0021, 0x0043, 0, VR::DS, VM::M1, "BlendFactor" }, { 0x0021, 0x0044, 0, VR::SQ, VM::M1, "RGBALUTDataSequence" }, { 0x0021, 0x0045, 0, VR::OB, VM::M1, "ColorLUT" }, { 0x0021, 0x004A, 0, VR::SQ, VM::M1, "OrthoMPRColorLUTDRSequence" }, { 0x0021, 0x004B, 0, VR::SQ, VM::M1, "VRTColorLUTDRSequence" }, { 0x0021, 0x004C, 0, VR::SQ, VM::M1, "PwlTransferFunctionSequence" }, { 0x0021, 0x004D, 0, VR::SQ, VM::M1, "PwlTransferFunctionDataSequence" }, { 0x0021, 0x004E, 0, VR::DS, VM::M1, "PwlVertexIndex" }, { 0x0021, 0x0050, 0, VR::SQ, VM::M1, "PwlVertexSequence" }, { 0x0021, 0x0051, 0, VR::SQ, VM::M1, "FloatingMPRRenderDRSequence" }, { 0x0021, 0x0052, 0, VR::CS, VM::M1, "PrimaryShowHide" }, { 0x0021, 0x0053, 0, VR::CS, VM::M1, "SecondaryShowHide" }, { 0x0021, 0x0054, 0, VR::LO, VM::M1, "PrimaryShadingIndex" }, { 0x0021, 0x0055, 0, VR::LO, VM::M1, "SecondaryShadingIndex" }, { 0x0021, 0x0056, 0, VR::CS, VM::M1, "AlphaDependentFieldmap" }, { 0x0021, 0x0057, 0, VR::LO, VM::M1, "VolumeFilter" }, { 0x0021, 0x0058, 0, VR::DS, VM::M3, "BoundingBoxColor" }, { 0x0021, 0x0059, 0, VR::CS, VM::M1, "SceneInteractionOn" }, { 0x0021, 0x005A, 0, VR::SQ, VM::M1, "OrthoMPRRenderDRSequence" }, { 0x0021, 0x005B, 0, VR::SQ, VM::M1, "VRTRenderDRSequence" }, { 0x0021, 0x0060, 0, VR::SQ, VM::M6, "ClipPlaneDRSequence" }, { 0x0021, 0x0061, 0, VR::DS, VM::M3, "PlaneCenter" }, { 0x0021, 0x0062, 0, VR::DS, VM::M3, "PlaneNormal" }, { 0x0021, 0x0063, 0, VR::DS, VM::M2, "PlaneScale" }, { 0x0021, 0x0064, 0, VR::CS, VM::M1, "PlaneEnableGLClip" }, { 0x0021, 0x0065, 0, VR::DS, VM::M1, "PlaneHandleRatio" }, { 0x0021, 0x0066, 0, VR::DS, VM::M24, "PlaneBoundingPoints" }, { 0x0021, 0x0067, 0, VR::DS, VM::M16, "PlaneMotionMatrix" }, { 0x0021, 0x0068, 0, VR::DS, VM::M1, "PlaneShiftVelocity" }, { 0x0021, 0x0069, 0, VR::CS, VM::M1, "PlaneEnabled" }, { 0x0021, 0x006A, 0, VR::DS, VM::M1, "PlaneRotateVelocity" }, { 0x0021, 0x006B, 0, VR::CS, VM::M1, "PlaneShowGraphics" }, { 0x0021, 0x006C, 0, VR::DS, VM::M1, "Offset" }, { 0x0021, 0x006D, 0, VR::CS, VM::M1, "OrthoMPRAtBoundingBox" }, { 0x0021, 0x006E, 0, VR::CS, VM::M1, "PlaneMPRLocked" }, { 0x0021, 0x006F, 0, VR::CS, VM::M1, "PlaneScalingDisabled" }, { 0x0021, 0x0070, 0, VR::SQ, VM::M1, "SplitPlaneDRSequence" }, { 0x0021, 0x0071, 0, VR::SQ, VM::M3, "FloatingMPRDRSequence" }, { 0x0021, 0x0072, 0, VR::SQ, VM::M3, "OrthoMPRDRSequence" }, { 0x0021, 0x0073, 0, VR::CS, VM::M1, "PlaneSingleSelectionMode" }, { 0x0021, 0x0074, 0, VR::CS, VM::M1, "PlaneAlignment" }, { 0x0021, 0x0075, 0, VR::CS, VM::M1, "PlaneSelected" }, { 0x0021, 0x0076, 0, VR::SQ, VM::M1, "ClusteringDRSequence" }, { 0x0021, 0x0077, 0, VR::DS, VM::M1, "ClusterSize" }, { 0x0021, 0x0078, 0, VR::CS, VM::M1, "ClusteringEnabled" }, { 0x0021, 0x0079, 0, VR::LO, VM::M1, "ClusterMaskVolID" }, { 0x0021, 0x0080, 0, VR::SQ, VM::M1, "HeadMaskingDRSequence" }, { 0x0021, 0x0081, 0, VR::DS, VM::M2, "MaskingRange" }, { 0x0021, 0x0082, 0, VR::CS, VM::M1, "MaskEnabled" }, { 0x0021, 0x0083, 0, VR::SQ, VM::M1, "BrainMaskingDRSequence" }, { 0x0021, 0x0084, 0, VR::SQ, VM::M1, "MaskingStatusDRSequence" }, { 0x0021, 0x0085, 0, VR::SQ, VM::M1, "VRTMaskingDRSequence" }, { 0x0021, 0x0086, 0, VR::SQ, VM::M1, "OrthoMPRMaskingDRSequence" }, { 0x0021, 0x0087, 0, VR::SQ, VM::M1, "FloatingMPRMaskingDRSequence" }, { 0x0021, 0x0088, 0, VR::SQ, VM::M1, "AlignDRSequence" }, { 0x0021, 0x0089, 0, VR::DS, VM::M16, "RegistrationMatrix" }, { 0x0021, 0x0090, 0, VR::SQ, VM::M1, "FunctionalEvaluationDRSequence" }, { 0x0021, 0x0091, 0, VR::DS, VM::M1TN, "FrameAcquitionNumbers" }, { 0x0021, 0x0092, 0, VR::CS, VM::M1, "ShowCursor" }, { 0x0021, 0x0093, 0, VR::DS, VM::M1, "CurrentFrame" }, { 0x0021, 0x0094, 0, VR::DS, VM::M1TN, "PlotArea" }, { 0x0021, 0x0095, 0, VR::DS, VM::M2, "PlotTextPosition" }, { 0x0021, 0x0096, 0, VR::DS, VM::M1TN, "BaseLinePoints" }, { 0x0021, 0x0097, 0, VR::DS, VM::M1TN, "ActivePoints" }, { 0x0021, 0x0098, 0, VR::CS, VM::M1, "ShowLabel" }, { 0x0021, 0x0099, 0, VR::CS, VM::M1, "MeanPlot" }, { 0x0021, 0x009A, 0, VR::CS, VM::M1, "MotionPlot" }, { 0x0021, 0x009B, 0, VR::CS, VM::M1, "ActivateNormallizedCurve" }, { 0x0021, 0x009C, 0, VR::DS, VM::M1, "PlotSize" }, { 0x0021, 0x00A0, 0, VR::SQ, VM::M4, "PlotDRSequence" }, { 0x0021, 0x00A1, 0, VR::LO, VM::M1, "Title" }, { 0x0021, 0x00A2, 0, VR::CS, VM::M1, "AutoScale" }, { 0x0021, 0x00A3, 0, VR::DS, VM::M1, "FixedScale" }, { 0x0021, 0x00A4, 0, VR::DS, VM::M3, "BackgroundColor" }, { 0x0021, 0x00A5, 0, VR::LO, VM::M1, "LabelX" }, { 0x0021, 0x00A6, 0, VR::LO, VM::M1, "LabelY" }, { 0x0021, 0x00A7, 0, VR::CS, VM::M1, "Legend" }, { 0x0021, 0x00A8, 0, VR::CS, VM::M1, "ScrollBarX" }, { 0x0021, 0x00A9, 0, VR::CS, VM::M1, "ScrollBarY" }, { 0x0021, 0x00AA, 0, VR::LO, VM::M1, "ConnectScrollX" }, { 0x0021, 0x00AB, 0, VR::LO, VM::M1, "PlotID" }, { 0x0021, 0x00AC, 0, VR::DS, VM::M1, "PlotPosition" }, { 0x0021, 0x00B0, 0, VR::SQ, VM::M1, "CurveDRSequence" }, { 0x0021, 0x00B1, 0, VR::LO, VM::M1, "CurveID" }, { 0x0021, 0x00B2, 0, VR::LO, VM::M1, "PlotType" }, { 0x0021, 0x00B3, 0, VR::DS, VM::M1TN, "CurveValues" }, { 0x0021, 0x00B4, 0, VR::DS, VM::M3, "LineColor" }, { 0x0021, 0x00B5, 0, VR::DS, VM::M3, "MarkerColor" }, { 0x0021, 0x00B6, 0, VR::CS, VM::M1, "LineFilled" }, { 0x0021, 0x00B7, 0, VR::LO, VM::M1, "Label" }, { 0x0021, 0x00B8, 0, VR::CS, VM::M1, "ShowMarker" }, { 0x0021, 0x00B9, 0, VR::LO, VM::M1, "MarkerShape" }, { 0x0021, 0x00BA, 0, VR::LO, VM::M1, "SmoothingAlgo" }, { 0x0021, 0x00BB, 0, VR::DS, VM::M1, "MarkerSize" }, { 0x0021, 0x00BC, 0, VR::LO, VM::M1, "LineStyle" }, { 0x0021, 0x00BD, 0, VR::LO, VM::M1, "LinePattern" }, { 0x0021, 0x00BE, 0, VR::DS, VM::M1, "LineWidth" }, { 0x0021, 0x00C0, 0, VR::SQ, VM::M1, "VRTFilterDRSequence" }, { 0x0021, 0x00C1, 0, VR::LO, VM::M1, "FilterType" }, { 0x0021, 0x00C2, 0, VR::CS, VM::M1, "CurrentActivePlane" }, }; const unsigned short Dict315TagHashTable[] = { 111, 110, 114, 117, 120, 125, 128, 133, 138, 141, 144, 147, 150, 153, 110, 110, 156, 159, 162, 165, 168, 171, 174, 179, 184, 189, 194, 199, 204, 207, 110, 110, 110, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 110, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, 110, 110, 282, 285, 110, 110, 288, 291, 294, 299, 304, 309, 314, 319, 324, 329, 334, 339, 344, 349, 354, 357, 360, 363, 368, 371, 374, 377, 380, 383, 386, 389, 110, 110, 110, 110, 110, 110, 110, 392, 395, 398, 401, 404, 110, 110, 110, 110, 407, 410, 413, 416, 0, 1, 17, 78, 1, 18, 80, 1, 19, 81, 2, 20, 82, 109, 194, 1, 21, 83, 2, 22, 84, 107, 192, 2, 23, 85, 108, 193, 1, 24, 86, 1, 25, 87, 1, 26, 88, 1, 27, 89, 1, 28, 90, 1, 29, 91, 1, 1, 49, 1, 0, 48, 1, 82, 163, 1, 81, 162, 1, 80, 161, 1, 79, 160, 2, 3, 55, 86, 167, 2, 2, 54, 85, 166, 2, 5, 57, 84, 165, 2, 4, 56, 83, 164, 2, 7, 59, 90, 171, 2, 6, 58, 89, 170, 1, 88, 169, 1, 87, 168, 1, 91, 172, 1, 95, 179, 1, 94, 178, 1, 93, 177, 1, 92, 176, 1, 99, 183, 1, 98, 182, 1, 97, 181, 1, 96, 180, 1, 103, 187, 1, 102, 186, 1, 101, 185, 1, 100, 184, 1, 106, 190, 1, 105, 189, 1, 104, 188, 1, 59, 131, 1, 58, 130, 1, 57, 129, 1, 56, 128, 1, 63, 135, 1, 62, 134, 1, 61, 133, 1, 60, 132, 1, 65, 137, 1, 64, 136, 1, 30, 96, 1, 31, 97, 2, 32, 98, 69, 147, 2, 33, 99, 68, 146, 2, 34, 100, 67, 145, 2, 35, 101, 66, 144, 2, 36, 102, 73, 151, 2, 37, 103, 72, 150, 2, 38, 104, 71, 149, 2, 39, 105, 70, 148, 2, 40, 106, 77, 155, 2, 41, 107, 76, 154, 2, 42, 108, 75, 153, 2, 43, 109, 74, 152, 1, 44, 110, 1, 45, 111, 1, 46, 112, 2, 47, 113, 78, 156, 1, 48, 114, 1, 49, 115, 1, 50, 116, 1, 51, 117, 1, 52, 118, 1, 53, 119, 1, 54, 120, 1, 55, 121, 1, 8, 65, 1, 9, 66, 1, 10, 67, 1, 11, 68, 1, 12, 69, 1, 13, 74, 1, 14, 75, 1, 15, 76, 1, 16, 77, }; const unsigned short Dict315KeyHashTable[] = { 111, 114, 119, 122, 131, 134, 139, 110, 110, 110, 110, 110, 142, 110, 147, 110, 152, 110, 155, 158, 161, 110, 164, 167, 170, 173, 110, 176, 179, 188, 191, 194, 197, 200, 110, 110, 205, 210, 217, 220, 223, 110, 226, 229, 232, 237, 110, 240, 245, 110, 252, 110, 255, 110, 258, 110, 110, 265, 268, 271, 274, 279, 110, 284, 289, 110, 294, 110, 297, 300, 303, 306, 110, 311, 316, 321, 328, 333, 336, 110, 341, 110, 110, 110, 344, 349, 352, 110, 359, 110, 110, 110, 362, 365, 368, 110, 371, 374, 377, 380, 383, 386, 389, 392, 395, 110, 110, 398, 110, 110, 0, 1, 17, 47521, 2, 65, 64774, 70, 63602, 1, 9, 59942, 4, 26, 40704, 48, 18154, 62, 35309, 108, 11507, 1, 73, 32507, 2, 79, 61809, 82, 3236, 1, 38, 63938, 2, 74, 28619, 103, 46349, 2, 6, 2962, 57, 53409, 1, 81, 9277, 1, 104, 22138, 1, 40, 52240, 1, 30, 53780, 1, 27, 27723, 1, 0, 55154, 1, 16, 4617, 1, 18, 2589, 1, 47, 2690, 4, 15, 44848, 35, 14750, 100, 730, 102, 10190, 1, 33, 15248, 1, 86, 2957, 1, 13, 41662, 1, 46, 64632, 2, 4, 40640, 67, 5668, 2, 2, 14767, 24, 38656, 3, 3, 36913, 69, 22865, 80, 63511, 1, 49, 42642, 1, 41, 25904, 1, 29, 31516, 1, 96, 44487, 1, 106, 61463, 2, 37, 62758, 50, 2572, 1, 10, 40626, 2, 64, 52344, 87, 32831, 3, 7, 41589, 54, 49360, 88, 32831, 1, 68, 1007, 1, 60, 40897, 3, 31, 5664, 43, 47081, 58, 40949, 1, 105, 12207, 1, 61, 55888, 1, 72, 6883, 2, 39, 49838, 44, 54987, 2, 28, 30495, 34, 22811, 2, 55, 14671, 91, 22715, 2, 1, 3566, 83, 3566, 1, 95, 42964, 1, 42, 32300, 1, 66, 20587, 1, 109, 20657, 2, 12, 19023, 75, 27961, 2, 84, 23734, 92, 43000, 2, 77, 60575, 85, 23734, 3, 5, 17559, 8, 31504, 19, 34650, 2, 56, 32942, 89, 43875, 1, 99, 40004, 2, 20, 9245, 52, 41157, 1, 21, 29364, 2, 45, 5787, 101, 43070, 1, 22, 45523, 3, 51, 19292, 53, 49754, 97, 4040, 1, 32, 44853, 1, 71, 3511, 1, 78, 3863, 1, 14, 10613, 1, 59, 20675, 1, 90, 62488, 1, 107, 50630, 1, 98, 49435, 1, 36, 39742, 1, 93, 46719, 1, 76, 50502, 1, 23, 13106, 1, 94, 4345, 3, 11, 16233, 25, 10468, 63, 36589, }; vtkDICOMDictionary::Dict Dict315Data = { "SIEMENS MR N3D", 110, 110, Dict315TagHashTable, Dict315KeyHashTable, Dict315Contents }; // ----- Camtronics image level data ----- const DictEntry Dict316Contents[] = { { 0x0009, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0006, 0, VR::IS, VM::M1, "" }, { 0x0009, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0016, 0, VR::AE, VM::M1, "" }, { 0x0009, 0x0017, 0, VR::CS, VM::M1, "" }, { 0x0009, 0x0018, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict316TagHashTable[] = { 7, 12, 6, 17, 6, 20, 0, 2, 2, 9, 4, 23, 2, 0, 4, 3, 22, 1, 1, 6, 1, 5, 24, }; const unsigned short Dict316KeyHashTable[] = { 6, 6, 6, 6, 6, 7, 0, 6, 0, 896, 1, 896, 2, 896, 3, 896, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict316Data = { "Camtronics image level data", 6, 6, Dict316TagHashTable, Dict316KeyHashTable, Dict316Contents }; // ----- SIEMENS MED HG ----- const DictEntry Dict317Contents[] = { { 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" }, { 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" }, { 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" }, { 0x0029, 0x0030, 0, VR::US, VM::M1, "ListOfTotalDisplayLength" }, { 0x0029, 0x0040, 0, VR::LO, VM::M1TN, "ListOfDisplayPrefix" }, { 0x0029, 0x0050, 0, VR::LO, VM::M1TN, "ListOfDisplayPostfix" }, { 0x0029, 0x0060, 0, VR::US, VM::M1, "ListOfTextPosition" }, { 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" }, }; const unsigned short Dict317TagHashTable[] = { 9, 18, 8, 8, 25, 8, 8, 8, 0, 4, 4, 64, 5, 80, 6, 96, 7, 112, 3, 0, 16, 2, 32, 3, 48, 1, 1, 21, }; const unsigned short Dict317KeyHashTable[] = { 9, 12, 17, 8, 22, 25, 8, 28, 0, 1, 6, 28194, 2, 5, 28059, 7, 2168, 2, 3, 16906, 4, 43179, 1, 2, 50495, 1, 1, 4798, 1, 0, 31019, }; vtkDICOMDictionary::Dict Dict317Data = { "SIEMENS MED HG", 8, 8, Dict317TagHashTable, Dict317KeyHashTable, Dict317Contents }; // ----- SCIVIS-1 ----- const DictEntry Dict318Contents[] = { { 0x6001, 0x00a0, 0, VR::DS, VM::M1, "" }, { 0x6001, 0x00a1, 0, VR::DS, VM::M1, "" }, { 0x6001, 0x00a2, 0, VR::US, VM::M1, "" }, { 0x6001, 0x00a3, 0, VR::DS, VM::M1, "" }, { 0x6001, 0x00a4, 0, VR::IS, VM::M1, "" }, { 0x6001, 0x00a5, 0, VR::ST, VM::M1, "" }, { 0x6001, 0x00a6, 0, VR::ST, VM::M1, "" }, { 0x6001, 0x00a7, 0, VR::FL, VM::M1, "" }, { 0x6001, 0x00a8, 0, VR::FL, VM::M1, "" }, { 0x6001, 0x00a9, 0, VR::IS, VM::M1, "" }, { 0x6001, 0x00aa, 0, VR::IS, VM::M1, "" }, { 0x6001, 0x00ab, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict318TagHashTable[] = { 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 0, 1, 3, 163, 1, 2, 162, 1, 1, 161, 1, 0, 160, 1, 7, 167, 1, 6, 166, 1, 5, 165, 1, 4, 164, 1, 11, 171, 1, 10, 170, 1, 9, 169, 1, 8, 168, }; const unsigned short Dict318KeyHashTable[] = { 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 0, 12, 0, 448, 1, 448, 2, 448, 3, 448, 4, 448, 5, 448, 6, 448, 7, 448, 8, 448, 9, 448, 10, 448, 11, 448, }; vtkDICOMDictionary::Dict Dict318Data = { "SCIVIS-1", 12, 12, Dict318TagHashTable, Dict318KeyHashTable, Dict318Contents }; // ----- BrainLAB_PatientSetup ----- const DictEntry Dict319Contents[] = { { 0x3273, 0x0000, 0, VR::DS, VM::M3, "IsocenterPosition" }, { 0x3273, 0x0001, 0, VR::CS, VM::M1, "PatientPosition" }, }; const unsigned short Dict319TagHashTable[] = { 3, 6, 0, 1, 0, 0, 1, 1, 1, }; const unsigned short Dict319KeyHashTable[] = { 3, 6, 0, 1, 0, 61443, 1, 1, 52199, }; vtkDICOMDictionary::Dict Dict319Data = { "BrainLAB_PatientSetup", 2, 2, Dict319TagHashTable, Dict319KeyHashTable, Dict319Contents }; // ----- GEMS_CT_CARDIAC_001 ----- const DictEntry Dict320Contents[] = { { 0x0049, 0x0001, 0, VR::SQ, VM::M1, "CTCardiacSequence" }, { 0x0049, 0x0002, 0, VR::CS, VM::M1, "HeartRateAtConfirm" }, { 0x0049, 0x0003, 0, VR::FL, VM::M1, "AvgHeartRatePriorToConfirm" }, { 0x0049, 0x0004, 0, VR::CS, VM::M1, "MinHeartRatePriorToConfirm" }, { 0x0049, 0x0005, 0, VR::CS, VM::M1, "MaxHeartRatePriorToConfirm" }, { 0x0049, 0x0006, 0, VR::FL, VM::M1, "StdDevHeartRatePriorToConfirm" }, { 0x0049, 0x0007, 0, VR::US, VM::M1, "NumHeartRateSamplesPriorToConfirm" }, { 0x0049, 0x0008, 0, VR::CS, VM::M1, "AutoHeartRateDetectPredict" }, { 0x0049, 0x0009, 0, VR::CS, VM::M1, "SystemOptimizedHeartRate" }, { 0x0049, 0x000A, 0, VR::ST, VM::M1, "EkgMonitorType" }, { 0x0049, 0x000B, 0, VR::CS, VM::M1, "NumReconSectors" }, { 0x0049, 0x000C, 0, VR::FL, VM::M256, "RpeakTimeStamps" }, { 0x0049, 0x0016, 0, VR::SH, VM::M1, "EkgGatingType" }, { 0x0049, 0x001b, 0, VR::FL, VM::M1, "EkgWaveTimeOffFirstDataPoint" }, { 0x0049, 0x0022, 0, VR::CS, VM::M1, "TemporalAlg" }, { 0x0049, 0x0023, 0, VR::CS, VM::M1, "PhaseLocation" }, { 0x0049, 0x0024, 0, VR::OW, VM::M1, "PreBlendedCycle1" }, { 0x0049, 0x0025, 0, VR::OW, VM::M1, "PreBlendedCycle2" }, { 0x0049, 0x0026, 0, VR::CS, VM::M1, "CompressionAlg" }, }; const unsigned short Dict320TagHashTable[] = { 20, 23, 26, 29, 19, 19, 19, 32, 37, 40, 43, 46, 51, 54, 57, 60, 63, 66, 69, 0, 1, 3, 4, 1, 4, 5, 1, 5, 6, 1, 6, 7, 2, 7, 8, 13, 27, 1, 8, 9, 1, 9, 10, 1, 10, 11, 2, 11, 12, 14, 34, 1, 15, 35, 1, 16, 36, 1, 17, 37, 1, 18, 38, 1, 0, 1, 1, 1, 2, 2, 2, 3, 12, 22, }; const unsigned short Dict320KeyHashTable[] = { 20, 23, 28, 33, 19, 19, 19, 36, 43, 46, 19, 53, 56, 19, 59, 19, 19, 19, 66, 0, 1, 12, 19816, 2, 16, 65086, 18, 45230, 2, 15, 57407, 17, 65086, 1, 5, 21491, 3, 9, 43301, 10, 40536, 14, 2898, 1, 6, 49413, 3, 3, 61199, 7, 30371, 11, 21970, 1, 4, 51023, 1, 1, 52372, 3, 0, 19450, 2, 21766, 8, 12075, 1, 13, 16609, }; vtkDICOMDictionary::Dict Dict320Data = { "GEMS_CT_CARDIAC_001", 19, 19, Dict320TagHashTable, Dict320KeyHashTable, Dict320Contents }; // ----- MMCPrivate ----- const DictEntry Dict321Contents[] = { { 0x0009, 0x0001, 0, VR::LO, VM::M1, "Technologist" }, { 0x0009, 0x0002, 0, VR::LO, VM::M1, "ScheduledStudyDateTime" }, { 0x0009, 0x0003, 0, VR::OB, VM::M1, "StudyAppData" }, { 0x0009, 0x0048, 0, VR::LO, VM::M1, "ProtocolName" }, { 0x0009, 0x004e, 0, VR::LO, VM::M1, "Cms_BodyPartExamined" }, { 0x0009, 0x004f, 0, VR::LO, VM::M1, "IsProtected" }, { 0x0009, 0x0050, 0, VR::CS, VM::M1, "Cms_PatientPosition" }, { 0x0009, 0x0051, 0, VR::LO, VM::M1, "Cmi_contrastBolusAgent" }, { 0x0009, 0x0052, 0, VR::LO, VM::M1, "Cms_institutionName" }, { 0x0009, 0x0053, 0, VR::LO, VM::M1, "Cms_institutionalDepartmentName" }, { 0x0009, 0x0054, 0, VR::LO, VM::M1, "Cms_seriesDescription" }, { 0x0009, 0x0055, 0, VR::LO, VM::M1, "Cms_operatorsName" }, { 0x0009, 0x0056, 0, VR::LO, VM::M1, "Cms_PerformingPhysiciansName" }, { 0x0009, 0x0057, 0, VR::ST, VM::M1, "Cms_institutionAddress" }, { 0x0009, 0x0058, 0, VR::LO, VM::M1, "Cmi_imageComments" }, { 0x0009, 0x0059, 0, VR::LO, VM::M1, "Cmi_instanceCreationDateTime" }, { 0x0009, 0x005A, 0, VR::LO, VM::M1, "MPPSStepStatus" }, { 0x0009, 0x005B, 0, VR::IS, VM::M1, "FilmedCount" }, { 0x0009, 0x005C, 0, VR::LO, VM::M1, "IsAllowCascadeSave" }, { 0x0009, 0x005D, 0, VR::LO, VM::M1, "IsAllowCascadeProtect" }, { 0x0009, 0x005E, 0, VR::LO, VM::M1, "IsDeleted" }, { 0x0011, 0x0001, 0, VR::LO, VM::M1, "IsRapidRegistration" }, { 0x0011, 0x0002, 0, VR::LO, VM::M1, "IsProtected" }, { 0x0011, 0x0003, 0, VR::IS, VM::M1, "FilmedCount" }, { 0x0011, 0x0004, 0, VR::OB, VM::M1, "ApplicationData" }, { 0x0011, 0x0005, 0, VR::LO, VM::M1, "IsAllowCascadeSave" }, { 0x0011, 0x0006, 0, VR::LO, VM::M1, "IsAllowCascadeProtect" }, { 0x0011, 0x0007, 0, VR::LO, VM::M1, "IsDeleted" }, { 0x0019, 0x0001, 0, VR::LO, VM::M1, "ProcType" }, { 0x0019, 0x0002, 0, VR::LO, VM::M1, "Plane" }, { 0x0019, 0x0003, 0, VR::SH, VM::M1, "IsSnapShotSeries" }, { 0x0019, 0x0004, 0, VR::DS, VM::M1, "MaxFscalor" }, { 0x0019, 0x0005, 0, VR::LO, VM::M1, "SeriesCategoryType" }, { 0x0019, 0x0007, 0, VR::LO, VM::M1, "ImageContrastBolusAgent" }, { 0x0019, 0x0008, 0, VR::DS, VM::M1, "ImageSliceThickness" }, { 0x0019, 0x0009, 0, VR::DS, VM::M1, "ImageReconstructionDiameter" }, { 0x0019, 0x000a, 0, VR::LO, VM::M1, "ImageEchoTime" }, { 0x0019, 0x000b, 0, VR::DS, VM::M1, "ImageRepetitionTime" }, { 0x0019, 0x000c, 0, VR::LO, VM::M1, "SequenceType" }, { 0x0019, 0x000d, 0, VR::LO, VM::M1, "TaskUID" }, { 0x0019, 0x000e, 0, VR::OB, VM::M1, "SeriesAppData" }, { 0x0019, 0x000f, 0, VR::IS, VM::M1, "MultiSliceNumber" }, { 0x0019, 0x0010, 0, VR::LO, VM::M1, "ImageScanTime" }, { 0x0019, 0x0011, 0, VR::LO, VM::M1, "IsProtected" }, { 0x0019, 0x0012, 0, VR::IS, VM::M1, "ImageIncrement" }, { 0x0019, 0x0013, 0, VR::LO, VM::M1, "MPPSStepStatus" }, { 0x0019, 0x0014, 0, VR::IS, VM::M1, "StorageCommittedCount" }, { 0x0019, 0x0015, 0, VR::IS, VM::M1, "ArchivedCount" }, { 0x0019, 0x0016, 0, VR::IS, VM::M1, "TransferredCount" }, { 0x0019, 0x0017, 0, VR::LO, VM::M1, "IsAllowCascadeSave" }, { 0x0019, 0x0018, 0, VR::LO, VM::M1, "IsAllowCascadeProtect" }, { 0x0019, 0x0019, 0, VR::LO, VM::M1, "IsDeleted" }, { 0x0019, 0x001A, 0, VR::UI, VM::M1, "CharacterizedImageInstanceUID" }, { 0x0019, 0x001B, 0, VR::IS, VM::M1, "CharacterizedImageCount" }, { 0x0019, 0x001C, 0, VR::LO, VM::M1, "InternalWindowWidth" }, { 0x0019, 0x001D, 0, VR::LO, VM::M1, "InternalWindowLevel" }, { 0x0019, 0x001E, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::IS, VM::M1, "SliceNumber" }, { 0x0029, 0x0002, 0, VR::IS, VM::M1, "PhaseNumber" }, { 0x0029, 0x0003, 0, VR::LO, VM::M1, "ProcType" }, { 0x0029, 0x0004, 0, VR::LO, VM::M1, "StopwatchTime" }, { 0x0029, 0x0005, 0, VR::LO, VM::M1, "Plane" }, { 0x0029, 0x0006, 0, VR::LO, VM::M1, "ScanTime" }, { 0x0029, 0x0008, 0, VR::LO, VM::M1, "DualSliceFlag" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "SSPRatio" }, { 0x0029, 0x000a, 0, VR::LO, VM::M1, "GatingSignalSource" }, { 0x0029, 0x000b, 0, VR::LO, VM::M1, "Rephase" }, { 0x0029, 0x000c, 0, VR::LO, VM::M1, "HalfEcho" }, { 0x0029, 0x000d, 0, VR::LO, VM::M1, "RectFOVRatio" }, { 0x0029, 0x000e, 0, VR::LO, VM::M1, "HalfScan" }, { 0x0029, 0x000f, 0, VR::LO, VM::M1, "NumShots" }, { 0x0029, 0x0010, 0, VR::LO, VM::M1, "ContrastAgent" }, { 0x0029, 0x0011, 0, VR::LO, VM::M1, "EchoAllocation" }, { 0x0029, 0x0012, 0, VR::LO, VM::M1, "NumEchoShift" }, { 0x0029, 0x0013, 0, VR::LO, VM::M1, "FatSat" }, { 0x0029, 0x0014, 0, VR::LO, VM::M1, "MTC" }, { 0x0029, 0x0015, 0, VR::LO, VM::M1, "NumPreSat" }, { 0x0029, 0x0016, 0, VR::LO, VM::M1, "TargetVelocity" }, { 0x0029, 0x0017, 0, VR::LO, VM::M1, "VENCAxis" }, { 0x0029, 0x0018, 0, VR::LO, VM::M1, "NumVENCDirection" }, { 0x0029, 0x001c, 0, VR::LO, VM::M1, "IsScalableWindowLevel" }, { 0x0029, 0x001d, 0, VR::LO, VM::M1, "ThreeDSettingLineAngle" }, { 0x0029, 0x001e, 0, VR::LO, VM::M1, "MPGTotalAxis" }, { 0x0029, 0x001f, 0, VR::LO, VM::M1, "MPGAxisNumber" }, { 0x0029, 0x0020, 0, VR::IS, VM::M1, "MultiEchoNumber" }, { 0x0029, 0x0021, 0, VR::DS, VM::M1, "NaviAverageGateWidth" }, { 0x0029, 0x0022, 0, VR::ST, VM::M1, "ShimCompensateValue" }, { 0x0029, 0x0023, 0, VR::LO, VM::M1, "GCOffset" }, { 0x0029, 0x0024, 0, VR::DS, VM::M1, "NaviMaxGateWidth" }, { 0x0029, 0x0025, 0, VR::DS, VM::M1, "NaviMinGateWidth" }, { 0x0029, 0x0026, 0, VR::DS, VM::M1, "NaviMaxGatePosition" }, { 0x0029, 0x0027, 0, VR::DS, VM::M1, "NaviMinGatePosition" }, { 0x0029, 0x0028, 0, VR::DS, VM::M1, "TimeDuration" }, { 0x0029, 0x0029, 0, VR::DS, VM::M1, "TablePosition" }, { 0x0029, 0x002a, 0, VR::DS, VM::M1, "NaviInitialGateWidth" }, { 0x0029, 0x002b, 0, VR::DS, VM::M1, "NaviFinalGateWidth" }, { 0x0029, 0x002c, 0, VR::DS, VM::M1, "NaviInitialGatePosition" }, { 0x0029, 0x002d, 0, VR::DS, VM::M1, "NaviFinalGatePosition" }, { 0x0029, 0x002e, 0, VR::DS, VM::M1, "NaviAverageGatePosition" }, { 0x0029, 0x002f, 0, VR::OB, VM::M1, "ImageAppData" }, { 0x0029, 0x0030, 0, VR::FD, VM::M1, "DiffusionBValue" }, { 0x0029, 0x0031, 0, VR::SQ, VM::M1, "SharedFunctionalGroupsSequence" }, { 0x0029, 0x0032, 0, VR::SQ, VM::M1, "PerFrameFunctionalGroupsSequence" }, { 0x0029, 0x0033, 0, VR::DS, VM::M1, "LossyImageCompressionRatio" }, { 0x0029, 0x0034, 0, VR::UI, VM::M1, "InstanceCreatorUID" }, { 0x0029, 0x0035, 0, VR::UI, VM::M1, "RelatedGeneralSOPClassUID" }, { 0x0029, 0x0036, 0, VR::UI, VM::M1, "OriginalSpecializedSOPClassUID" }, { 0x0029, 0x0037, 0, VR::SH, VM::M1, "TimezoneOffsetFromUTC" }, { 0x0029, 0x0038, 0, VR::CS, VM::M1, "SOPInstanceStatus" }, { 0x0029, 0x0039, 0, VR::DT, VM::M1, "SOPAuthorizationDateandTime" }, { 0x0029, 0x003a, 0, VR::LT, VM::M1, "SOPAuthorizationComment" }, { 0x0029, 0x003b, 0, VR::LO, VM::M1, "AuthorizationEquipmentCertificationNumber" }, { 0x0029, 0x003c, 0, VR::UL, VM::M1, "ConcatenationFrameOffsetNumber" }, { 0x0029, 0x003d, 0, VR::US, VM::M1, "RepresentativeFrameNumber" }, { 0x0029, 0x003e, 0, VR::UI, VM::M1, "ConcatenationUID" }, { 0x0029, 0x003f, 0, VR::US, VM::M1, "InConcatenationNumber" }, { 0x0029, 0x0040, 0, VR::CS, VM::M1, "CardiacSynchronizationTechnique" }, { 0x0029, 0x0041, 0, VR::CS, VM::M1, "CardiacSignalSource" }, { 0x0029, 0x0042, 0, VR::FD, VM::M1, "CardiacRRIntervalSpecified" }, { 0x0029, 0x0043, 0, VR::CS, VM::M1, "CardiacBeatRejectionTechnique" }, { 0x0029, 0x0044, 0, VR::IS, VM::M1, "LowRRValue" }, { 0x0029, 0x0045, 0, VR::IS, VM::M1, "HighRRValue" }, { 0x0029, 0x0046, 0, VR::IS, VM::M1, "IntervalsAcquired" }, { 0x0029, 0x0047, 0, VR::IS, VM::M1, "IntervalsRejected" }, { 0x0029, 0x0048, 0, VR::CS, VM::M1, "RespiratoryMotionCompensationTechnique" }, { 0x0029, 0x0049, 0, VR::CS, VM::M1, "RespiratorySignalSource" }, { 0x0029, 0x004a, 0, VR::CS, VM::M1, "BulkMotionCompensationTechnique" }, { 0x0029, 0x004b, 0, VR::CS, VM::M1, "BulkMotionSignalSource" }, { 0x0029, 0x004c, 0, VR::CS, VM::M1, "PixelPresentation" }, { 0x0029, 0x004d, 0, VR::CS, VM::M1, "VolumetricProperties" }, { 0x0029, 0x004e, 0, VR::CS, VM::M1, "VolumeBasedCalculationTechnique" }, { 0x0029, 0x004f, 0, VR::ST, VM::M1, "AcquisitionContextDescription" }, { 0x0029, 0x0050, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0051, 0, VR::LO, VM::M1, "LUTDescriptor" }, { 0x0029, 0x0052, 0, VR::LO, VM::M1, "LUTExplanation" }, { 0x0029, 0x0053, 0, VR::LO, VM::M1, "LUTData" }, { 0x0029, 0x0054, 0, VR::CS, VM::M1, "PresentationLUTShape" }, { 0x0029, 0x0055, 0, VR::SQ, VM::M1, "FrameAnatomySequence" }, { 0x0029, 0x0056, 0, VR::CS, VM::M1, "FrameLaterality" }, { 0x0029, 0x0057, 0, VR::SQ, VM::M1, "AnatomicRegionSequence" }, { 0x0029, 0x0058, 0, VR::SH, VM::M1, "AnatomicRegionCodeValue" }, { 0x0029, 0x0059, 0, VR::SH, VM::M1, "AnatomicRegionCodingSchemeDesignator" }, { 0x0029, 0x005a, 0, VR::SH, VM::M1, "AnatomicRegionCodingSchemeVersion" }, { 0x0029, 0x005b, 0, VR::LO, VM::M1, "AnatomicRegionCodeMeaning" }, { 0x0029, 0x005c, 0, VR::SQ, VM::M1, "PixelValueTransformationSequence" }, { 0x0029, 0x005d, 0, VR::LO, VM::M1, "RescaleType" }, { 0x0029, 0x005e, 0, VR::SQ, VM::M1, "CardiacSynchronizationSequence" }, { 0x0029, 0x005f, 0, VR::FD, VM::M1, "TriggerDelayTime" }, { 0x0029, 0x0060, 0, VR::SQ, VM::M1, "FrameVOILUTSequence" }, { 0x0029, 0x0061, 0, VR::LO, VM::M1, "WindowCenterAndWidthExplanation" }, { 0x0029, 0x0062, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0063, 0, VR::SQ, VM::M1, "MRModifierSequence" }, { 0x0029, 0x0064, 0, VR::CS, VM::M1, "ParallelAcquisitionTechnique" }, { 0x0029, 0x0065, 0, VR::FD, VM::M1, "ParallelReductionFactorSecIn" }, { 0x0029, 0x0066, 0, VR::CS, VM::M1, "InversionRecovery" }, { 0x0029, 0x0067, 0, VR::CS, VM::M1, "FlowCompensation" }, { 0x0029, 0x0068, 0, VR::CS, VM::M1, "FlowCompensationDirection" }, { 0x0029, 0x0069, 0, VR::CS, VM::M1, "SpatialPreSaturation" }, { 0x0029, 0x006a, 0, VR::CS, VM::M1, "PartialFourier" }, { 0x0029, 0x006b, 0, VR::CS, VM::M1, "PartialFourierDirection" }, { 0x0029, 0x0070, 0, VR::SQ, VM::M1, "MRReceiveCoilSequence" }, { 0x0029, 0x0071, 0, VR::LO, VM::M1, "ReceiveCoilManufacturerName" }, { 0x0029, 0x0072, 0, VR::CS, VM::M1, "ReceiveCoilType" }, { 0x0029, 0x0073, 0, VR::CS, VM::M1, "QuadratureReceiveCoil" }, { 0x0029, 0x0074, 0, VR::LO, VM::M1, "MultiCoilConfiguration" }, { 0x0029, 0x0075, 0, VR::CS, VM::M1, "ComplexImageComponent" }, { 0x0029, 0x0076, 0, VR::SH, VM::M1, "PulseSequenceName" }, { 0x0029, 0x0077, 0, VR::CS, VM::M1, "EchoPulseSequence" }, { 0x0029, 0x0078, 0, VR::CS, VM::M1, "MultipleSpinEcho" }, { 0x0029, 0x0079, 0, VR::CS, VM::M1, "MultiPlanarExcitation" }, { 0x0029, 0x007a, 0, VR::CS, VM::M1, "PhaseContrast" }, { 0x0029, 0x007b, 0, VR::CS, VM::M1, "TimeOfFlightContrast" }, { 0x0029, 0x007c, 0, VR::CS, VM::M1, "SteadyStatePulseSequence" }, { 0x0029, 0x007d, 0, VR::CS, VM::M1, "EchoPlanarPulseSequence" }, { 0x0029, 0x007e, 0, VR::CS, VM::M1, "SpectrallySelectedSuppression" }, { 0x0029, 0x007f, 0, VR::CS, VM::M1, "OversamplingPhase" }, { 0x0029, 0x0080, 0, VR::CS, VM::M1, "SegmentedKSpaceTraversal" }, { 0x0029, 0x0081, 0, VR::CS, VM::M1, "CoverageOfKSpace" }, { 0x0029, 0x0082, 0, VR::SQ, VM::M1, "MRTimingAndRelatedParametersSequence" }, { 0x0029, 0x0083, 0, VR::US, VM::M1, "RFEchoTrainLength" }, { 0x0029, 0x0084, 0, VR::US, VM::M1, "GradientEchoTrainLength" }, { 0x0029, 0x0085, 0, VR::CS, VM::M1, "GradientOutputType" }, { 0x0029, 0x0086, 0, VR::FD, VM::M1, "GradientOutput" }, { 0x0029, 0x0087, 0, VR::SQ, VM::M1, "MRFOVGeometrySequence" }, { 0x0029, 0x0088, 0, VR::US, VM::M1, "MRAcquisitionFrequencyEncodingSteps" }, { 0x0029, 0x0089, 0, VR::US, VM::M1, "MRAcquisitionPhaseEncodingStepsInPlane" }, { 0x0029, 0x008a, 0, VR::US, VM::M1, "MRAcquisitionPhaseEncodingStepsOutOfPlane" }, { 0x0029, 0x008b, 0, VR::SQ, VM::M1, "MRTransmitCoilSequence" }, { 0x0029, 0x008c, 0, VR::SH, VM::M1, "TransmitCoilName" }, { 0x0029, 0x008d, 0, VR::LO, VM::M1, "TransmitCoilManufacturerName" }, { 0x0029, 0x008e, 0, VR::CS, VM::M1, "TransmitCoilType" }, { 0x0029, 0x008f, 0, VR::SQ, VM::M1, "MREchoSequence" }, { 0x0029, 0x0090, 0, VR::FD, VM::M1, "EffectiveEchoTime" }, { 0x0029, 0x0091, 0, VR::SQ, VM::M1, "MRMetaboliteMapSequence" }, { 0x0029, 0x0092, 0, VR::ST, VM::M1, "MetaboliteMapDescription" }, { 0x0029, 0x0093, 0, VR::SQ, VM::M1, "MetaboliteMapCodeSequence" }, { 0x0029, 0x0094, 0, VR::SH, VM::M1, "MetaboliteMapCodeValue" }, { 0x0029, 0x0095, 0, VR::SH, VM::M1, "MetaboliteMapCodingSchemeDesignator" }, { 0x0029, 0x0096, 0, VR::SH, VM::M1, "MetaboliteMapCodingSchemeVersion" }, { 0x0029, 0x0097, 0, VR::LO, VM::M1, "MetaboliteMapCodeMeaning" }, { 0x0029, 0x0098, 0, VR::SQ, VM::M1, "MRImagingModifierSequence" }, { 0x0029, 0x0099, 0, VR::CS, VM::M1, "MagnetizationTransfer" }, { 0x0029, 0x009a, 0, VR::CS, VM::M1, "BloodSignalNulling" }, { 0x0029, 0x009b, 0, VR::CS, VM::M1, "Tagging" }, { 0x0029, 0x009c, 0, VR::FD, VM::M1, "TagSpacingFirstDimension" }, { 0x0029, 0x009d, 0, VR::FD, VM::M1, "TagSpacingSecondDimension" }, { 0x0029, 0x009e, 0, VR::FD, VM::M1, "TagAngleFirstAxis" }, { 0x0029, 0x009f, 0, VR::SS, VM::M1, "TagAngleSecondAxis" }, { 0x0029, 0x00a0, 0, VR::FD, VM::M1, "TagThickness" }, { 0x0029, 0x00a1, 0, VR::FD, VM::M1, "TaggingDelay" }, { 0x0029, 0x00a2, 0, VR::FD, VM::M1, "TransmitterFrequency" }, { 0x0029, 0x00a3, 0, VR::DS, VM::M1, "PixelBandwidth" }, { 0x0029, 0x00a4, 0, VR::SQ, VM::M1, "MRVelocityEncodingSequence" }, { 0x0029, 0x00a5, 0, VR::FD, VM::M1, "VelocityEncodingDirection" }, { 0x0029, 0x00a6, 0, VR::FD, VM::M1, "VelocityEncodingMinimumValue" }, { 0x0029, 0x00a7, 0, VR::FD, VM::M1, "VelocityEncodingMaximumValue" }, { 0x0029, 0x00a8, 0, VR::SQ, VM::M1, "MRImageFrameTypeSequence" }, { 0x0029, 0x00a9, 0, VR::CS, VM::M1, "FrameType" }, { 0x0029, 0x00aa, 0, VR::CS, VM::M1, "PixelPresentation" }, { 0x0029, 0x00ab, 0, VR::CS, VM::M1, "VolumetricProperties" }, { 0x0029, 0x00ac, 0, VR::CS, VM::M1, "VolumeBasedCalculationTechnique" }, { 0x0029, 0x00ad, 0, VR::IS, VM::M1, "FilmedCount" }, { 0x0029, 0x00ae, 0, VR::LO, VM::M1, "IsTransferred" }, { 0x0029, 0x00af, 0, VR::LO, VM::M1, "IsArchived" }, { 0x0029, 0x00b0, 0, VR::LO, VM::M1, "MPPSStepStatus" }, { 0x0029, 0x00b1, 0, VR::LO, VM::M1, "CommitmentStatus" }, { 0x0029, 0x00b2, 0, VR::LO, VM::M1, "IsStorageCommitted" }, { 0x0029, 0x00b3, 0, VR::LO, VM::M1, "IsDicom" }, { 0x0029, 0x00b4, 0, VR::LO, VM::M1, "IsAllowCascadeSave" }, { 0x0029, 0x00b5, 0, VR::LO, VM::M1, "IsAllowCascadeProtect" }, { 0x0029, 0x00b6, 0, VR::LO, VM::M1, "IsDeleted" }, { 0x0029, 0x00b7, 0, VR::OB, VM::M1, "ApplicationData" }, { 0x0029, 0x00b8, 0, VR::LO, VM::M1, "IsAllowCascadeSave" }, { 0x0029, 0x00b9, 0, VR::LO, VM::M1, "IsAllowCascadeProtect" }, { 0x0029, 0x00ba, 0, VR::LO, VM::M1, "IsDeleted" }, { 0x0029, 0x00bb, 0, VR::IS, VM::M1, "VOI1" }, { 0x0029, 0x00bc, 0, VR::IS, VM::M1, "VOI2" }, { 0x0029, 0x00bd, 0, VR::DS, VM::M1, "MixingTime" }, { 0x0029, 0x00be, 0, VR::FD, VM::M1, "SelectiveIRPosition" }, { 0x0029, 0x00bf, 0, VR::FD, VM::M1, "SelectiveIRRow" }, { 0x0029, 0x00c0, 0, VR::FD, VM::M1, "SelectiveIRColumn" }, { 0x0029, 0x00c1, 0, VR::FD, VM::M1, "SelectiveIROrientation" }, { 0x0029, 0x00c2, 0, VR::DS, VM::M1, "SelectiveIRThickness" }, { 0x0029, 0x00c3, 0, VR::CS, VM::M1, "RephaseOrderSlice" }, { 0x0029, 0x00c4, 0, VR::CS, VM::M1, "RephaseOrderPhase" }, { 0x0029, 0x00c5, 0, VR::CS, VM::M1, "RephaseOrderFreq" }, { 0x0029, 0x00d0, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x00d3, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x00d5, 0, VR::UI, VM::M1, "" }, { 0x0029, 0x00d6, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x00d7, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict321TagHashTable[] = { 252, 257, 264, 271, 276, 283, 288, 291, 296, 303, 308, 315, 322, 327, 332, 337, 342, 349, 354, 361, 368, 375, 382, 389, 396, 401, 404, 409, 414, 419, 424, 429, 432, 435, 438, 441, 444, 447, 450, 453, 456, 251, 459, 462, 465, 468, 251, 471, 251, 474, 251, 251, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 518, 521, 524, 251, 251, 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, 557, 562, 567, 572, 577, 582, 587, 592, 595, 600, 605, 610, 615, 620, 625, 630, 635, 638, 641, 644, 647, 650, 653, 656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, 731, 734, 737, 740, 743, 746, 749, 752, 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, 875, 878, 881, 884, 887, 890, 893, 896, 899, 902, 905, 908, 911, 914, 917, 920, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 923, 926, 929, 932, 251, 251, 935, 938, 251, 251, 251, 251, 251, 251, 251, 251, 251, 941, 944, 0, 2, 51, 25, 93, 41, 3, 50, 24, 92, 40, 249, 214, 3, 53, 27, 95, 43, 250, 215, 2, 52, 26, 94, 42, 3, 55, 29, 97, 45, 248, 213, 2, 54, 28, 96, 44, 1, 99, 47, 2, 56, 30, 98, 46, 3, 0, 1, 43, 17, 85, 33, 2, 42, 16, 84, 32, 3, 2, 3, 45, 19, 87, 35, 3, 1, 2, 44, 18, 86, 34, 2, 47, 21, 89, 37, 2, 46, 20, 88, 36, 2, 49, 23, 91, 39, 2, 48, 22, 90, 38, 3, 21, 1, 35, 9, 109, 57, 2, 34, 8, 108, 56, 3, 23, 3, 37, 11, 111, 59, 3, 22, 2, 36, 10, 110, 58, 3, 25, 5, 39, 13, 113, 61, 3, 24, 4, 38, 12, 112, 60, 3, 27, 7, 41, 15, 115, 63, 3, 26, 6, 40, 14, 114, 62, 2, 28, 1, 101, 49, 1, 100, 48, 2, 30, 3, 103, 51, 2, 29, 2, 102, 50, 2, 32, 5, 105, 53, 2, 31, 4, 104, 52, 2, 33, 7, 107, 55, 1, 106, 54, 1, 64, 9, 1, 63, 8, 1, 66, 11, 1, 65, 10, 1, 68, 13, 1, 67, 12, 1, 70, 15, 1, 69, 14, 1, 57, 1, 1, 59, 3, 1, 58, 2, 1, 61, 5, 1, 60, 4, 1, 62, 6, 1, 79, 24, 1, 81, 29, 1, 80, 28, 1, 83, 31, 1, 82, 30, 1, 72, 17, 1, 71, 16, 1, 74, 19, 1, 73, 18, 1, 76, 21, 1, 75, 20, 1, 78, 23, 1, 77, 22, 2, 3, 72, 156, 104, 1, 157, 105, 1, 158, 106, 1, 159, 107, 1, 4, 78, 1, 5, 79, 1, 148, 96, 1, 149, 97, 1, 150, 98, 1, 151, 99, 1, 152, 100, 1, 153, 101, 1, 154, 102, 1, 155, 103, 2, 14, 88, 168, 120, 2, 15, 89, 169, 121, 2, 16, 90, 170, 122, 2, 17, 91, 171, 123, 2, 18, 92, 172, 124, 2, 19, 93, 173, 125, 2, 20, 94, 174, 126, 1, 175, 127, 2, 6, 80, 160, 112, 2, 7, 81, 161, 113, 2, 8, 82, 162, 114, 2, 9, 83, 163, 115, 2, 10, 84, 164, 116, 2, 11, 85, 165, 117, 2, 12, 86, 166, 118, 2, 13, 87, 167, 119, 1, 124, 72, 1, 125, 73, 1, 126, 74, 1, 127, 75, 1, 128, 76, 1, 129, 77, 1, 130, 78, 1, 131, 79, 1, 116, 64, 1, 117, 65, 1, 118, 66, 1, 119, 67, 1, 120, 68, 1, 121, 69, 1, 122, 70, 1, 123, 71, 1, 140, 88, 1, 141, 89, 1, 142, 90, 1, 143, 91, 1, 144, 92, 1, 145, 93, 1, 146, 94, 1, 147, 95, 1, 132, 80, 1, 133, 81, 1, 134, 82, 1, 135, 83, 1, 136, 84, 1, 137, 85, 1, 138, 86, 1, 139, 87, 1, 219, 171, 1, 218, 170, 1, 217, 169, 1, 216, 168, 1, 223, 175, 1, 222, 174, 1, 221, 173, 1, 220, 172, 1, 211, 163, 1, 210, 162, 1, 209, 161, 1, 208, 160, 1, 215, 167, 1, 214, 166, 1, 213, 165, 1, 212, 164, 1, 235, 187, 1, 234, 186, 1, 233, 185, 1, 232, 184, 1, 239, 191, 1, 238, 190, 1, 237, 189, 1, 236, 188, 1, 227, 179, 1, 226, 178, 1, 225, 177, 1, 224, 176, 1, 231, 183, 1, 230, 182, 1, 229, 181, 1, 228, 180, 1, 187, 139, 1, 186, 138, 1, 185, 137, 1, 184, 136, 1, 191, 143, 1, 190, 142, 1, 189, 141, 1, 188, 140, 1, 179, 131, 1, 178, 130, 1, 177, 129, 1, 176, 128, 1, 183, 135, 1, 182, 134, 1, 181, 133, 1, 180, 132, 1, 203, 155, 1, 202, 154, 1, 201, 153, 1, 200, 152, 1, 207, 159, 1, 206, 158, 1, 205, 157, 1, 204, 156, 1, 195, 147, 1, 194, 146, 1, 193, 145, 1, 192, 144, 1, 199, 151, 1, 198, 150, 1, 197, 149, 1, 196, 148, 1, 242, 194, 1, 243, 195, 1, 240, 192, 1, 241, 193, 1, 244, 196, 1, 245, 197, 1, 247, 211, 1, 246, 208, }; const unsigned short Dict321KeyHashTable[] = { 251, 251, 252, 255, 251, 251, 258, 261, 251, 264, 269, 274, 279, 292, 299, 251, 251, 302, 307, 312, 315, 251, 318, 321, 324, 327, 332, 251, 337, 251, 251, 342, 345, 251, 251, 251, 251, 348, 251, 351, 354, 357, 362, 251, 251, 251, 365, 370, 251, 251, 251, 251, 251, 251, 251, 377, 380, 395, 402, 251, 405, 408, 411, 414, 251, 251, 419, 422, 425, 428, 251, 431, 251, 434, 251, 251, 251, 439, 446, 251, 251, 451, 251, 251, 454, 457, 462, 467, 470, 251, 473, 251, 478, 485, 251, 488, 251, 251, 491, 494, 251, 497, 251, 500, 503, 506, 251, 251, 251, 509, 512, 251, 529, 538, 543, 251, 251, 546, 557, 251, 251, 560, 251, 251, 251, 251, 565, 251, 568, 571, 574, 251, 581, 251, 584, 587, 590, 251, 251, 251, 251, 251, 251, 595, 251, 598, 603, 608, 251, 611, 620, 625, 251, 628, 633, 636, 643, 646, 649, 652, 251, 655, 251, 251, 251, 658, 251, 251, 661, 666, 669, 674, 677, 251, 251, 692, 695, 251, 698, 701, 704, 707, 251, 251, 710, 715, 251, 722, 727, 251, 251, 730, 733, 740, 743, 746, 749, 251, 754, 759, 762, 251, 765, 251, 251, 768, 773, 778, 783, 251, 251, 251, 788, 251, 797, 251, 800, 809, 814, 819, 822, 825, 830, 251, 251, 251, 835, 840, 845, 251, 852, 855, 858, 251, 251, 861, 864, 251, 251, 251, 867, 870, 873, 878, 883, 886, 889, 251, 251, 894, 899, 0, 1, 205, 338, 1, 92, 1365, 1, 78, 50304, 1, 68, 16226, 2, 162, 45592, 175, 11660, 2, 37, 42768, 85, 34911, 2, 131, 19748, 208, 13830, 6, 8, 62354, 19, 37851, 26, 37851, 50, 37851, 229, 37851, 233, 37851, 3, 2, 19620, 116, 38837, 139, 6899, 1, 86, 57820, 2, 46, 43880, 213, 28433, 2, 81, 28084, 137, 38256, 1, 54, 46309, 1, 226, 41272, 1, 33, 41436, 1, 206, 618, 1, 194, 53423, 2, 216, 42492, 217, 55707, 2, 149, 4398, 244, 60544, 2, 44, 16835, 126, 57, 1, 10, 24437, 1, 0, 43816, 1, 67, 58126, 1, 142, 41575, 1, 168, 63814, 2, 36, 37943, 207, 26576, 1, 187, 38308, 2, 141, 28928, 245, 25259, 3, 24, 23916, 161, 3722, 231, 23916, 1, 39, 29785, 7, 20, 40800, 27, 40800, 51, 40800, 151, 25820, 183, 51572, 230, 40800, 234, 40800, 3, 32, 4885, 134, 16236, 145, 15703, 1, 14, 6116, 1, 195, 63571, 1, 47, 58741, 1, 204, 40866, 2, 158, 10493, 166, 18187, 1, 167, 37804, 1, 127, 15727, 1, 171, 48227, 1, 215, 9443, 1, 197, 29089, 2, 177, 35868, 201, 59681, 3, 82, 12815, 89, 16465, 140, 5792, 2, 3, 9918, 100, 13191, 1, 77, 20574, 1, 200, 12092, 2, 214, 44429, 222, 51172, 2, 129, 54610, 219, 54610, 1, 188, 23256, 1, 144, 63380, 2, 80, 26666, 159, 40655, 3, 17, 601, 23, 601, 221, 601, 1, 172, 39311, 1, 74, 53643, 1, 112, 7788, 1, 106, 54666, 1, 15, 59229, 1, 35, 50602, 1, 71, 17774, 1, 155, 23724, 1, 42, 3069, 8, 56, 21, 132, 21, 150, 21, 246, 21, 247, 21, 248, 21, 249, 21, 250, 21, 4, 16, 53135, 45, 53135, 165, 64697, 224, 53135, 2, 21, 10593, 153, 15277, 1, 163, 60129, 5, 29, 10848, 61, 10848, 117, 13650, 235, 2237, 241, 59809, 1, 236, 2237, 2, 12, 11545, 94, 10463, 1, 114, 53789, 1, 99, 60025, 1, 98, 5657, 3, 122, 45355, 130, 24381, 220, 24381, 1, 83, 29529, 1, 179, 29634, 1, 110, 58428, 2, 70, 57466, 184, 15031, 1, 102, 33628, 2, 65, 25575, 170, 44777, 2, 198, 9266, 212, 23731, 1, 52, 2847, 4, 84, 2841, 148, 52341, 156, 33723, 189, 34421, 2, 38, 50878, 40, 65167, 1, 223, 51536, 2, 192, 61233, 211, 58969, 1, 242, 36898, 3, 41, 426, 58, 48780, 101, 311, 1, 119, 53583, 1, 109, 53937, 1, 196, 20121, 1, 113, 49361, 1, 91, 29476, 1, 60, 42052, 2, 31, 63319, 75, 49875, 1, 11, 6426, 2, 69, 60129, 154, 16805, 1, 4, 45572, 7, 18, 3813, 25, 3813, 49, 3813, 62, 62295, 95, 32822, 228, 3813, 232, 3813, 1, 30, 1303, 1, 178, 2567, 1, 53, 64520, 1, 227, 37070, 1, 9, 3117, 1, 66, 54184, 2, 88, 53542, 174, 20268, 3, 87, 50503, 146, 24474, 238, 64736, 2, 138, 25712, 202, 24995, 1, 120, 62836, 1, 160, 9496, 3, 107, 277, 181, 4850, 243, 9787, 1, 6, 20400, 1, 111, 29531, 1, 239, 21243, 2, 63, 20995, 152, 17255, 2, 105, 11928, 169, 46240, 1, 237, 17691, 1, 121, 13050, 1, 147, 13431, 2, 28, 2634, 59, 2634, 2, 34, 18946, 193, 63369, 2, 48, 61197, 118, 59222, 2, 128, 27113, 218, 27113, 4, 79, 40106, 103, 5261, 125, 47084, 135, 52256, 1, 13, 53427, 4, 5, 33801, 22, 33801, 43, 33801, 90, 27797, 2, 7, 34546, 143, 63554, 2, 57, 14476, 73, 22376, 1, 185, 58848, 1, 203, 38142, 2, 55, 59375, 72, 61303, 2, 97, 13455, 133, 17345, 2, 199, 1427, 209, 42153, 2, 76, 26515, 164, 32612, 3, 157, 44640, 186, 13559, 240, 48586, 1, 180, 32932, 1, 190, 24219, 1, 136, 37805, 1, 115, 47296, 1, 173, 35272, 1, 225, 16930, 1, 64, 55019, 2, 93, 33840, 108, 51834, 2, 123, 44496, 191, 15915, 1, 182, 4112, 1, 96, 6778, 2, 104, 1506, 210, 42682, 2, 1, 5337, 124, 35924, 1, 176, 12982, }; vtkDICOMDictionary::Dict Dict321Data = { "MMCPrivate", 251, 251, Dict321TagHashTable, Dict321KeyHashTable, Dict321Contents }; // ----- IDEXX ----- const DictEntry Dict322Contents[] = { { 0x0011, 0x0000, 0, VR::LO, VM::M1, "BreedName" }, { 0x0011, 0x0001, 0, VR::LO, VM::M1, "SpeciesName" }, { 0x0011, 0x0002, 0, VR::PN, VM::M1, "Owner" }, }; const unsigned short Dict322TagHashTable[] = { 3, 4, 9, 0, 2, 1, 1, 2, 2, 1, 0, 0, }; const unsigned short Dict322KeyHashTable[] = { 4, 3, 9, 0, 2, 0, 32408, 1, 51206, 1, 2, 15226, }; vtkDICOMDictionary::Dict Dict322Data = { "IDEXX", 3, 3, Dict322TagHashTable, Dict322KeyHashTable, Dict322Contents }; // ----- VEPRO DICOM TRANSFER 1.0 ----- const DictEntry Dict323Contents[] = { { 0x0059, 0x0010, 0, VR::SQ, VM::M1, "DicomTransferInfo" }, }; const unsigned short Dict323TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict323KeyHashTable[] = { 2, 0, 1, 0, 610, }; vtkDICOMDictionary::Dict Dict323Data = { "VEPRO DICOM TRANSFER 1.0", 1, 1, Dict323TagHashTable, Dict323KeyHashTable, Dict323Contents }; // ----- SPI-P Release 1 ----- const DictEntry Dict324Contents[] = { { 0x0009, 0x0000, 0, VR::LT, VM::M1, "DataObjectRecognitionCode" }, { 0x0009, 0x0004, 0, VR::LO, VM::M1, "ImageDataConsistency" }, { 0x0009, 0x0008, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UniqueIdentifier" }, { 0x0009, 0x0016, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0018, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0021, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0031, 0, VR::LT, VM::M1, "PACSUniqueIdentifier" }, { 0x0009, 0x0034, 0, VR::LT, VM::M1, "ClusterUniqueIdentifier" }, { 0x0009, 0x0038, 0, VR::LT, VM::M1, "SystemUniqueIdentifier" }, { 0x0009, 0x0039, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0051, 0, VR::LT, VM::M1, "StudyUniqueIdentifier" }, { 0x0009, 0x0061, 0, VR::LT, VM::M1, "SeriesUniqueIdentifier" }, { 0x0009, 0x0091, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x00a0, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x00f2, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x00f3, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x00f4, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x00f5, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x00f7, 0, VR::LT, VM::M1, "" }, { 0x0011, 0x0010, 0, VR::LT, VM::M1, "PatientEntryID" }, { 0x0011, 0x0020, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0021, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0022, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0031, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0032, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::US, VM::M1, "MainsFrequency" }, { 0x0019, 0x0025, 0, VR::LO, VM::M1TN, "OriginalPixelDataQuality" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "ECGTriggering" }, { 0x0019, 0x0031, 0, VR::UN, VM::M1, "ECG1Offset" }, { 0x0019, 0x0032, 0, VR::UN, VM::M1, "ECG2Offset1" }, { 0x0019, 0x0033, 0, VR::UN, VM::M1, "ECG2Offset2" }, { 0x0019, 0x0050, 0, VR::US, VM::M1, "VideoScanMode" }, { 0x0019, 0x0051, 0, VR::US, VM::M1, "VideoLineRate" }, { 0x0019, 0x0060, 0, VR::US, VM::M1, "XrayTechnique" }, { 0x0019, 0x0061, 0, VR::DS, VM::M1, "ImageIdentifierFromat" }, { 0x0019, 0x0062, 0, VR::US, VM::M1, "IrisDiaphragm" }, { 0x0019, 0x0063, 0, VR::CS, VM::M1, "Filter" }, { 0x0019, 0x0064, 0, VR::CS, VM::M1, "CineParallel" }, { 0x0019, 0x0065, 0, VR::CS, VM::M1, "CineMaster" }, { 0x0019, 0x0070, 0, VR::US, VM::M1, "ExposureChannel" }, { 0x0019, 0x0071, 0, VR::UN, VM::M1, "ExposureChannelFirstImage" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "ProcessingChannel" }, { 0x0019, 0x0080, 0, VR::DS, VM::M1, "AcquisitionDelay" }, { 0x0019, 0x0081, 0, VR::UN, VM::M1, "RelativeImageTime" }, { 0x0019, 0x0090, 0, VR::CS, VM::M1, "VideoWhiteCompression" }, { 0x0019, 0x00a0, 0, VR::US, VM::M1, "Angulation" }, { 0x0019, 0x00a1, 0, VR::US, VM::M1, "Rotation" }, { 0x0021, 0x0012, 0, VR::LT, VM::M1, "SeriesUniqueIdentifier" }, { 0x0021, 0x0014, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0000, 0, VR::DS, VM::M4, "" }, { 0x0029, 0x0020, 0, VR::DS, VM::M1, "PixelAspectRatio" }, { 0x0029, 0x0025, 0, VR::LO, VM::M1TN, "ProcessedPixelDataQuality" }, { 0x0029, 0x0030, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0060, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0061, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0067, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0070, 0, VR::LT, VM::M1, "WindowID" }, { 0x0029, 0x0071, 0, VR::CS, VM::M1, "VideoInvertSubtracted" }, { 0x0029, 0x0072, 0, VR::CS, VM::M1, "VideoInvertNonsubtracted" }, { 0x0029, 0x0077, 0, VR::CS, VM::M1, "WindowSelectStatus" }, { 0x0029, 0x0078, 0, VR::LT, VM::M1, "ECGDisplayPrintingID" }, { 0x0029, 0x0079, 0, VR::CS, VM::M1, "ECGDisplayPrinting" }, { 0x0029, 0x007e, 0, VR::CS, VM::M1, "ECGDisplayPrintingEnableStatus" }, { 0x0029, 0x007f, 0, VR::CS, VM::M1, "ECGDisplayPrintingSelectStatus" }, { 0x0029, 0x0080, 0, VR::LT, VM::M1, "PhysiologicalDisplayID" }, { 0x0029, 0x0081, 0, VR::US, VM::M1, "PreferredPhysiologicalChannelDisplay" }, { 0x0029, 0x008e, 0, VR::CS, VM::M1, "PhysiologicalDisplayEnableStatus" }, { 0x0029, 0x008f, 0, VR::CS, VM::M1, "PhysiologicalDisplaySelectStatus" }, { 0x0029, 0x0090, 0, VR::DS, VM::M1TN, "" }, { 0x0029, 0x0091, 0, VR::US, VM::M1, "" }, { 0x0029, 0x009f, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x00a0, 0, VR::DS, VM::M1TN, "" }, { 0x0029, 0x00a1, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00af, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x00b0, 0, VR::DS, VM::M1TN, "" }, { 0x0029, 0x00b1, 0, VR::US, VM::M1, "" }, { 0x0029, 0x00bf, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x00c0, 0, VR::LT, VM::M1, "FunctionalShutterID" }, { 0x0029, 0x00c1, 0, VR::US, VM::M1, "FieldOfShutter" }, { 0x0029, 0x00c5, 0, VR::LT, VM::M1, "FieldOfShutterRectangle" }, { 0x0029, 0x00ce, 0, VR::CS, VM::M1, "ShutterEnableStatus" }, { 0x0029, 0x00cf, 0, VR::CS, VM::M1, "ShutterSelectStatus" }, { 0x7FE1, 0x0010, 0, VR::OW, VM::M1, "PixelData" }, }; const unsigned short Dict324TagHashTable[] = { 91, 92, 91, 91, 97, 104, 91, 91, 91, 109, 91, 91, 116, 119, 124, 129, 91, 132, 91, 91, 91, 91, 91, 91, 137, 140, 91, 147, 152, 155, 158, 161, 166, 171, 176, 179, 91, 91, 91, 91, 182, 187, 194, 197, 91, 91, 200, 203, 208, 217, 91, 222, 227, 230, 91, 91, 235, 240, 91, 91, 245, 248, 91, 251, 258, 91, 263, 266, 91, 91, 91, 269, 272, 279, 288, 91, 91, 91, 91, 291, 296, 303, 91, 91, 91, 91, 306, 309, 312, 315, 322, 0, 2, 2, 8, 22, 16, 3, 53, 161, 67, 119, 77, 145, 2, 52, 160, 76, 144, 3, 0, 0, 32, 16, 57, 32, 1, 58, 37, 2, 1, 4, 46, 112, 2, 14, 97, 47, 113, 1, 48, 114, 2, 7, 24, 60, 56, 1, 30, 1, 3, 3, 16, 29, 0, 59, 48, 2, 4, 18, 31, 2, 1, 5, 21, 1, 40, 96, 1, 41, 97, 2, 6, 22, 42, 98, 2, 27, 49, 43, 99, 2, 26, 48, 44, 100, 1, 45, 101, 1, 28, 50, 2, 8, 33, 35, 49, 3, 34, 48, 56, 0, 81, 175, 1, 37, 51, 1, 36, 50, 1, 88, 206, 2, 80, 161, 89, 207, 4, 12, 57, 24, 33, 51, 144, 79, 160, 2, 11, 56, 23, 32, 2, 25, 34, 54, 18, 1, 85, 192, 2, 55, 20, 86, 193, 2, 9, 49, 90, 16, 2, 84, 191, 87, 197, 1, 33, 37, 1, 10, 52, 3, 15, 145, 50, 129, 83, 177, 2, 49, 128, 82, 176, 1, 17, 242, 1, 18, 243, 1, 21, 247, 3, 19, 244, 38, 80, 61, 96, 4, 20, 245, 39, 81, 62, 97, 75, 143, 1, 74, 142, 2, 63, 103, 73, 129, 3, 16, 160, 68, 120, 72, 128, 1, 69, 121, 1, 70, 126, 1, 71, 127, 1, 64, 112, 3, 13, 81, 65, 113, 78, 159, 1, 66, 114, }; const unsigned short Dict324KeyHashTable[] = { 92, 91, 91, 91, 91, 99, 91, 91, 102, 91, 107, 91, 112, 193, 196, 91, 91, 91, 91, 201, 206, 91, 91, 91, 91, 91, 91, 209, 212, 91, 91, 91, 215, 218, 91, 91, 91, 91, 221, 226, 229, 232, 235, 91, 240, 91, 243, 91, 246, 91, 249, 252, 91, 257, 91, 91, 91, 91, 260, 263, 91, 91, 91, 266, 271, 274, 91, 91, 91, 91, 91, 91, 91, 91, 91, 281, 91, 91, 286, 289, 294, 297, 91, 300, 91, 303, 306, 91, 91, 309, 91, 0, 3, 0, 56022, 50, 42505, 51, 19485, 1, 48, 20514, 2, 40, 49381, 75, 19690, 2, 43, 3155, 66, 27762, 40, 2, 59, 3, 59, 4, 59, 6, 59, 7, 59, 8, 59, 12, 59, 15, 59, 16, 59, 17, 59, 18, 59, 19, 59, 20, 59, 21, 59, 23, 59, 24, 59, 25, 59, 26, 59, 27, 59, 28, 59, 29, 59, 30, 59, 31, 59, 55, 59, 56, 59, 59, 59, 60, 59, 61, 59, 62, 59, 63, 59, 74, 35267, 76, 59, 77, 59, 78, 59, 79, 59, 80, 59, 81, 59, 82, 59, 83, 59, 84, 59, 1, 9, 3387, 2, 42, 9665, 44, 51481, 2, 85, 36307, 88, 43620, 1, 57, 64150, 1, 22, 5050, 1, 41, 28520, 1, 5, 4365, 1, 49, 19188, 2, 47, 13018, 58, 25380, 1, 39, 26475, 1, 34, 15578, 1, 67, 54792, 2, 73, 34688, 86, 34073, 1, 68, 28066, 1, 33, 42371, 1, 52, 29189, 1, 45, 3738, 2, 10, 21706, 32, 34100, 1, 35, 64405, 1, 11, 53982, 1, 53, 17230, 2, 13, 62907, 36, 20909, 1, 37, 20909, 3, 46, 1000, 71, 3208, 87, 54835, 2, 1, 20747, 38, 19041, 1, 69, 46917, 2, 14, 13761, 54, 13761, 1, 65, 10511, 1, 64, 52187, 1, 72, 16932, 1, 90, 30948, 1, 70, 7262, 1, 89, 39565, }; vtkDICOMDictionary::Dict Dict324Data = { "SPI-P Release 1", 91, 91, Dict324TagHashTable, Dict324KeyHashTable, Dict324Contents }; // ----- Philips EV Imaging DD 022 ----- const DictEntry Dict325Contents[] = { { 0x2007, 0x0000, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict325TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict325KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict325Data = { "Philips EV Imaging DD 022", 1, 1, Dict325TagHashTable, Dict325KeyHashTable, Dict325Contents }; // ----- TOSHIBA ENCRYPTED SR DATA ----- const DictEntry Dict326Contents[] = { { 0x7015, 0x0000, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict326TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict326KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict326Data = { "TOSHIBA ENCRYPTED SR DATA", 1, 1, Dict326TagHashTable, Dict326KeyHashTable, Dict326Contents }; // ----- SECTRA_OverlayInfo_01 ----- const DictEntry Dict327Contents[] = { { 0x6001, 0x0001, 0, VR::LO, VM::M1, "SectraOverlay" }, }; const unsigned short Dict327TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict327KeyHashTable[] = { 2, 0, 1, 0, 38985, }; vtkDICOMDictionary::Dict Dict327Data = { "SECTRA_OverlayInfo_01", 1, 1, Dict327TagHashTable, Dict327KeyHashTable, Dict327Contents }; // ----- SIEMENS CSA ENVELOPE ----- const DictEntry Dict328Contents[] = { { 0x0029, 0x0010, 0, VR::OB, VM::M1, "syngoReportData" }, { 0x0029, 0x0011, 0, VR::OB, VM::M1, "syngoReportPresentation" }, }; const unsigned short Dict328TagHashTable[] = { 3, 6, 0, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict328KeyHashTable[] = { 2, 3, 0, 2, 0, 22501, 1, 44118, }; vtkDICOMDictionary::Dict Dict328Data = { "SIEMENS CSA ENVELOPE", 2, 2, Dict328TagHashTable, Dict328KeyHashTable, Dict328Contents }; // ----- SIEMENS RA PLANE A ----- const DictEntry Dict329Contents[] = { { 0x0011, 0x0028, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0029, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002a, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002b, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0019, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001a, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001b, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001c, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001d, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001f, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002a, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x002c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0036, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x004a, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x004c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x004e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0056, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0058, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x005e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0062, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0066, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0072, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0076, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x007a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0084, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0086, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0088, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0092, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0094, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0096, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0098, 0, VR::US, VM::M1, "" }, { 0x0019, 0x009a, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009c, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x00a2, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x00a4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a6, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a8, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00aa, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ac, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ae, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b2, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b3, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b5, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b6, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b7, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b8, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b9, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00bb, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bc, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00be, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bf, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c0, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c1, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c2, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c3, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c4, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c5, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c6, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c7, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c8, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c9, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ca, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cb, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cc, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ce, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cf, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00d1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00d2, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d3, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d4, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d5, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d6, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d7, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d8, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d9, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00da, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00db, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00dc, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00dd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00de, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x00df, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" }, }; const unsigned short Dict329TagHashTable[] = { 134, 139, 142, 147, 150, 155, 158, 163, 166, 133, 169, 133, 172, 133, 177, 133, 180, 133, 183, 133, 186, 133, 189, 133, 192, 133, 195, 198, 133, 201, 204, 207, 210, 213, 218, 221, 226, 229, 234, 237, 242, 245, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 297, 302, 307, 314, 317, 324, 327, 332, 337, 340, 345, 348, 133, 353, 358, 361, 366, 369, 374, 377, 382, 385, 390, 393, 398, 401, 406, 409, 414, 417, 422, 425, 430, 433, 133, 438, 133, 441, 133, 444, 133, 447, 133, 450, 133, 453, 133, 456, 133, 459, 133, 462, 133, 465, 133, 468, 133, 471, 133, 474, 477, 480, 133, 483, 133, 486, 133, 489, 133, 492, 133, 133, 495, 133, 498, 133, 0, 2, 7, 25, 77, 158, 1, 6, 24, 2, 9, 27, 76, 156, 1, 8, 26, 2, 11, 29, 71, 146, 1, 10, 28, 2, 13, 31, 70, 144, 1, 12, 30, 1, 73, 150, 1, 72, 148, 2, 5, 21, 67, 138, 1, 66, 136, 1, 69, 142, 1, 68, 140, 1, 63, 130, 1, 62, 128, 1, 65, 134, 1, 64, 132, 1, 96, 187, 1, 95, 185, 1, 94, 184, 1, 100, 191, 1, 99, 190, 2, 26, 56, 98, 189, 1, 97, 188, 2, 27, 58, 89, 179, 1, 88, 178, 2, 28, 60, 87, 177, 1, 86, 176, 2, 29, 62, 93, 183, 1, 92, 182, 2, 22, 48, 91, 181, 1, 90, 180, 1, 23, 50, 1, 83, 170, 1, 24, 52, 1, 82, 168, 1, 25, 54, 1, 85, 174, 1, 18, 40, 1, 84, 172, 1, 19, 42, 1, 79, 162, 1, 20, 44, 1, 78, 160, 1, 21, 46, 2, 1, 41, 81, 166, 2, 0, 40, 14, 32, 2, 3, 43, 80, 164, 3, 2, 42, 15, 34, 126, 218, 1, 127, 219, 3, 4, 44, 16, 36, 124, 216, 1, 125, 217, 2, 17, 38, 130, 222, 2, 42, 88, 131, 223, 1, 128, 220, 2, 43, 90, 129, 221, 1, 118, 210, 2, 44, 92, 119, 211, 2, 45, 94, 117, 209, 1, 122, 214, 2, 38, 80, 123, 215, 1, 120, 212, 2, 39, 82, 121, 213, 1, 111, 202, 2, 40, 84, 112, 203, 1, 109, 200, 2, 41, 86, 110, 201, 1, 115, 206, 2, 34, 72, 116, 207, 1, 113, 204, 2, 35, 74, 114, 205, 1, 103, 194, 2, 36, 76, 104, 195, 1, 101, 192, 2, 37, 78, 102, 193, 1, 107, 198, 2, 30, 64, 108, 199, 1, 105, 196, 2, 31, 66, 106, 197, 1, 32, 68, 1, 33, 70, 1, 58, 120, 1, 59, 122, 1, 60, 124, 1, 61, 126, 1, 54, 112, 1, 55, 114, 1, 56, 116, 1, 57, 118, 1, 50, 104, 1, 51, 106, 1, 52, 108, 1, 132, 224, 1, 53, 110, 1, 46, 96, 1, 47, 98, 1, 48, 100, 1, 49, 102, 1, 75, 154, 1, 74, 152, }; const unsigned short Dict329KeyHashTable[] = { 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 0, 40, 1, 40, 2, 40, 3, 40, 4, 40, 5, 40, 6, 40, 7, 40, 8, 40, 9, 40, 10, 40, 11, 40, 12, 40, 13, 40, 14, 40, 15, 40, 16, 40, 17, 40, 18, 40, 19, 40, 20, 40, 21, 40, 22, 40, 23, 40, 24, 40, 25, 40, 26, 40, 27, 40, 28, 40, 29, 40, 30, 40, 31, 40, 32, 40, 33, 40, 34, 40, 35, 40, 36, 40, 37, 40, 38, 40, 39, 40, 40, 40, 41, 40, 42, 40, 43, 40, 44, 40, 45, 40, 46, 40, 47, 40, 48, 40, 49, 40, 50, 40, 51, 40, 52, 40, 53, 40, 54, 40, 55, 40, 56, 40, 57, 40, 58, 40, 59, 40, 60, 40, 61, 40, 62, 40, 63, 40, 64, 40, 65, 40, 66, 40, 67, 40, 68, 40, 69, 40, 70, 40, 71, 40, 72, 40, 73, 40, 74, 40, 75, 40, 76, 40, 77, 40, 78, 40, 79, 40, 80, 40, 81, 40, 82, 40, 83, 40, 84, 40, 85, 40, 86, 40, 87, 40, 88, 40, 89, 40, 90, 40, 91, 40, 92, 40, 93, 40, 94, 40, 95, 40, 96, 40, 97, 40, 98, 40, 99, 40, 100, 40, 101, 40, 102, 40, 103, 40, 104, 40, 105, 40, 106, 40, 107, 40, 108, 40, 109, 40, 110, 40, 111, 40, 112, 40, 113, 40, 114, 40, 115, 40, 116, 40, 117, 40, 118, 40, 119, 40, 120, 40, 121, 40, 122, 40, 123, 40, 124, 40, 125, 40, 126, 40, 127, 40, 128, 40, 129, 40, 130, 40, 131, 40, 132, 40, }; vtkDICOMDictionary::Dict Dict329Data = { "SIEMENS RA PLANE A", 133, 133, Dict329TagHashTable, Dict329KeyHashTable, Dict329Contents }; // ----- SIEMENS RA PLANE B ----- const DictEntry Dict330Contents[] = { { 0x0011, 0x0028, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0029, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002a, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002b, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x002c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0019, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001a, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001b, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001c, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001d, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x001f, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002a, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x002c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x002e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0034, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0036, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x003e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0042, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0044, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0046, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0048, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x004a, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x004c, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x004e, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0050, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0054, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0056, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0058, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x005e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0062, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0064, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0066, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0068, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006c, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x006e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0070, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0072, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0076, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x007a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0084, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0086, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0088, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x008e, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0092, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0094, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0096, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0098, 0, VR::US, VM::M1, "" }, { 0x0019, 0x009a, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009c, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x009e, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00a0, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x00a2, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x00a4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a6, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00a8, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00aa, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ac, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ae, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b2, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b3, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b4, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b5, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b6, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b7, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b8, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00b9, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00bb, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bc, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00be, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00bf, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c0, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c1, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c2, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c3, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c4, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c5, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c6, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c7, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c8, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00c9, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ca, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cb, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cc, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00ce, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00cf, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00d1, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00d2, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d3, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d4, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d5, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d6, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d7, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d8, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00d9, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00da, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00db, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00dc, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00dd, 0, VR::UL, VM::M1, "" }, { 0x0019, 0x00de, 0, VR::UL, VM::M1TN, "" }, { 0x0019, 0x00df, 0, VR::OB, VM::M1, "" }, { 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" }, }; const unsigned short Dict330TagHashTable[] = { 134, 139, 142, 147, 150, 155, 158, 163, 166, 133, 169, 133, 172, 133, 177, 133, 180, 133, 183, 133, 186, 133, 189, 133, 192, 133, 195, 198, 133, 201, 204, 207, 210, 213, 218, 221, 226, 229, 234, 237, 242, 245, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 297, 302, 307, 314, 317, 324, 327, 332, 337, 340, 345, 348, 133, 353, 358, 361, 366, 369, 374, 377, 382, 385, 390, 393, 398, 401, 406, 409, 414, 417, 422, 425, 430, 433, 133, 438, 133, 441, 133, 444, 133, 447, 133, 450, 133, 453, 133, 456, 133, 459, 133, 462, 133, 465, 133, 468, 133, 471, 133, 474, 477, 480, 133, 483, 133, 486, 133, 489, 133, 492, 133, 133, 495, 133, 498, 133, 0, 2, 7, 25, 77, 158, 1, 6, 24, 2, 9, 27, 76, 156, 1, 8, 26, 2, 11, 29, 71, 146, 1, 10, 28, 2, 13, 31, 70, 144, 1, 12, 30, 1, 73, 150, 1, 72, 148, 2, 5, 21, 67, 138, 1, 66, 136, 1, 69, 142, 1, 68, 140, 1, 63, 130, 1, 62, 128, 1, 65, 134, 1, 64, 132, 1, 96, 187, 1, 95, 185, 1, 94, 184, 1, 100, 191, 1, 99, 190, 2, 26, 56, 98, 189, 1, 97, 188, 2, 27, 58, 89, 179, 1, 88, 178, 2, 28, 60, 87, 177, 1, 86, 176, 2, 29, 62, 93, 183, 1, 92, 182, 2, 22, 48, 91, 181, 1, 90, 180, 1, 23, 50, 1, 83, 170, 1, 24, 52, 1, 82, 168, 1, 25, 54, 1, 85, 174, 1, 18, 40, 1, 84, 172, 1, 19, 42, 1, 79, 162, 1, 20, 44, 1, 78, 160, 1, 21, 46, 2, 1, 41, 81, 166, 2, 0, 40, 14, 32, 2, 3, 43, 80, 164, 3, 2, 42, 15, 34, 126, 218, 1, 127, 219, 3, 4, 44, 16, 36, 124, 216, 1, 125, 217, 2, 17, 38, 130, 222, 2, 42, 88, 131, 223, 1, 128, 220, 2, 43, 90, 129, 221, 1, 118, 210, 2, 44, 92, 119, 211, 2, 45, 94, 117, 209, 1, 122, 214, 2, 38, 80, 123, 215, 1, 120, 212, 2, 39, 82, 121, 213, 1, 111, 202, 2, 40, 84, 112, 203, 1, 109, 200, 2, 41, 86, 110, 201, 1, 115, 206, 2, 34, 72, 116, 207, 1, 113, 204, 2, 35, 74, 114, 205, 1, 103, 194, 2, 36, 76, 104, 195, 1, 101, 192, 2, 37, 78, 102, 193, 1, 107, 198, 2, 30, 64, 108, 199, 1, 105, 196, 2, 31, 66, 106, 197, 1, 32, 68, 1, 33, 70, 1, 58, 120, 1, 59, 122, 1, 60, 124, 1, 61, 126, 1, 54, 112, 1, 55, 114, 1, 56, 116, 1, 57, 118, 1, 50, 104, 1, 51, 106, 1, 52, 108, 1, 132, 224, 1, 53, 110, 1, 46, 96, 1, 47, 98, 1, 48, 100, 1, 49, 102, 1, 75, 154, 1, 74, 152, }; const unsigned short Dict330KeyHashTable[] = { 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 0, 40, 1, 40, 2, 40, 3, 40, 4, 40, 5, 40, 6, 40, 7, 40, 8, 40, 9, 40, 10, 40, 11, 40, 12, 40, 13, 40, 14, 40, 15, 40, 16, 40, 17, 40, 18, 40, 19, 40, 20, 40, 21, 40, 22, 40, 23, 40, 24, 40, 25, 40, 26, 40, 27, 40, 28, 40, 29, 40, 30, 40, 31, 40, 32, 40, 33, 40, 34, 40, 35, 40, 36, 40, 37, 40, 38, 40, 39, 40, 40, 40, 41, 40, 42, 40, 43, 40, 44, 40, 45, 40, 46, 40, 47, 40, 48, 40, 49, 40, 50, 40, 51, 40, 52, 40, 53, 40, 54, 40, 55, 40, 56, 40, 57, 40, 58, 40, 59, 40, 60, 40, 61, 40, 62, 40, 63, 40, 64, 40, 65, 40, 66, 40, 67, 40, 68, 40, 69, 40, 70, 40, 71, 40, 72, 40, 73, 40, 74, 40, 75, 40, 76, 40, 77, 40, 78, 40, 79, 40, 80, 40, 81, 40, 82, 40, 83, 40, 84, 40, 85, 40, 86, 40, 87, 40, 88, 40, 89, 40, 90, 40, 91, 40, 92, 40, 93, 40, 94, 40, 95, 40, 96, 40, 97, 40, 98, 40, 99, 40, 100, 40, 101, 40, 102, 40, 103, 40, 104, 40, 105, 40, 106, 40, 107, 40, 108, 40, 109, 40, 110, 40, 111, 40, 112, 40, 113, 40, 114, 40, 115, 40, 116, 40, 117, 40, 118, 40, 119, 40, 120, 40, 121, 40, 122, 40, 123, 40, 124, 40, 125, 40, 126, 40, 127, 40, 128, 40, 129, 40, 130, 40, 131, 40, 132, 40, }; vtkDICOMDictionary::Dict Dict330Data = { "SIEMENS RA PLANE B", 133, 133, Dict330TagHashTable, Dict330KeyHashTable, Dict330Contents }; // ----- Silhouette V1.0 ----- const DictEntry Dict331Contents[] = { { 0x0029, 0x0013, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0014, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0017, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0019, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x001a, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001b, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x001c, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x001d, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x001e, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0022, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0023, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0024, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0025, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0027, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0028, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0029, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0031, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0046, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0047, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0052, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0053, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0054, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0055, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0056, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0057, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0073, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0074, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0077, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0078, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0088, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0089, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0090, 0, VR::UN, VM::M1, "" }, { 0x0029, 0x0091, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict331TagHashTable[] = { 37, 40, 43, 46, 36, 36, 49, 52, 55, 36, 60, 63, 66, 71, 76, 83, 88, 93, 98, 103, 112, 36, 115, 118, 121, 124, 129, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 1, 17, 41, 1, 16, 40, 1, 20, 70, 1, 21, 71, 1, 35, 145, 1, 34, 144, 2, 10, 33, 31, 120, 1, 12, 35, 1, 11, 34, 2, 4, 25, 14, 37, 2, 3, 24, 13, 36, 3, 6, 27, 15, 39, 22, 82, 2, 5, 26, 23, 83, 2, 8, 29, 24, 84, 2, 7, 28, 25, 85, 2, 26, 86, 33, 137, 4, 9, 30, 27, 87, 28, 115, 32, 136, 1, 29, 116, 1, 0, 19, 1, 30, 119, 1, 19, 49, 2, 1, 20, 18, 48, 1, 2, 23, }; const unsigned short Dict331KeyHashTable[] = { 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 0, 149, 1, 149, 2, 149, 3, 149, 4, 149, 5, 149, 6, 149, 7, 149, 8, 149, 9, 149, 10, 149, 11, 149, 12, 149, 13, 149, 14, 149, 15, 149, 16, 149, 17, 149, 18, 149, 19, 149, 20, 149, 21, 149, 22, 149, 23, 149, 24, 149, 25, 149, 26, 149, 27, 149, 28, 149, 29, 149, 30, 149, 31, 149, 32, 149, 33, 149, 34, 149, 35, 149, }; vtkDICOMDictionary::Dict Dict331Data = { "Silhouette V1.0", 36, 36, Dict331TagHashTable, Dict331KeyHashTable, Dict331Contents }; // ----- SIEMENS MED PT WAVEFORM ----- const DictEntry Dict332Contents[] = { { 0x0071, 0x0046, 0, VR::UN, VM::M1, "StartingRespiratoryAmplitude" }, { 0x0071, 0x0047, 0, VR::UN, VM::M1, "StartingRespiratoryPhase" }, { 0x0071, 0x0048, 0, VR::UN, VM::M1, "EndingRespiratoryAmplitude" }, { 0x0071, 0x0049, 0, VR::UN, VM::M1, "EndingRespiratoryPhase" }, { 0x0071, 0x0050, 0, VR::CS, VM::M1, "RespiratoryTriggerType" }, }; const unsigned short Dict332TagHashTable[] = { 6, 9, 12, 15, 18, 0, 1, 0, 70, 1, 3, 73, 1, 2, 72, 1, 4, 80, 1, 1, 71, }; const unsigned short Dict332KeyHashTable[] = { 5, 5, 6, 9, 12, 0, 1, 4, 51609, 1, 0, 61035, 3, 1, 15354, 2, 34163, 3, 64847, }; vtkDICOMDictionary::Dict Dict332Data = { "SIEMENS MED PT WAVEFORM", 5, 5, Dict332TagHashTable, Dict332KeyHashTable, Dict332Contents }; // ----- GEMS_STDY_01 ----- const DictEntry Dict333Contents[] = { { 0x0023, 0x0001, 0, VR::SL, VM::M1, "NumberOfSeriesInStudy" }, { 0x0023, 0x0002, 0, VR::SL, VM::M1, "NumberOfUnarchivedSeries" }, { 0x0023, 0x0010, 0, VR::SS, VM::M1, "ReferenceImageField" }, { 0x0023, 0x0050, 0, VR::SS, VM::M1, "SummaryImage" }, { 0x0023, 0x0070, 0, VR::FD, VM::M1, "StartTimeSecsInFirstAxial" }, { 0x0023, 0x0074, 0, VR::SL, VM::M1, "NumberOfUpdatesToHeader" }, { 0x0023, 0x007d, 0, VR::SS, VM::M1, "IndicatesIfStudyHasCompleteInfo" }, { 0x0023, 0x0080, 0, VR::SQ, VM::M1, "PPSDataSequence" }, }; const unsigned short Dict333TagHashTable[] = { 8, 9, 14, 21, 8, 8, 24, 27, 0, 2, 1, 2, 7, 128, 3, 0, 1, 3, 80, 4, 112, 1, 2, 16, 1, 5, 116, 1, 6, 125, }; const unsigned short Dict333KeyHashTable[] = { 8, 8, 9, 12, 8, 17, 20, 27, 0, 1, 6, 5368, 2, 2, 41255, 7, 57601, 1, 5, 42112, 3, 0, 19343, 3, 33850, 4, 6019, 1, 1, 29474, }; vtkDICOMDictionary::Dict Dict333Data = { "GEMS_STDY_01", 8, 8, Dict333TagHashTable, Dict333KeyHashTable, Dict333Contents }; // ----- TOSHIBA COMAPL HEADER ----- const DictEntry Dict334Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLHeaderVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLHeaderInfo" }, { 0x0029, 0x0020, 0, VR::OB, VM::M1, "COMAPLHistoryInformation" }, { 0x0029, 0x0031, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0034, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict334TagHashTable[] = { 7, 6, 10, 13, 6, 20, 0, 1, 4, 49, 1, 1, 9, 3, 0, 8, 2, 16, 3, 32, 1, 5, 52, }; const unsigned short Dict334KeyHashTable[] = { 6, 7, 10, 6, 15, 18, 0, 1, 3, 16724, 2, 1, 6957, 2, 61854, 1, 0, 64252, 2, 4, 896, 5, 896, }; vtkDICOMDictionary::Dict Dict334Data = { "TOSHIBA COMAPL HEADER", 6, 6, Dict334TagHashTable, Dict334KeyHashTable, Dict334Contents }; // ----- GEMS_GDXE_FALCON_04 ----- const DictEntry Dict335Contents[] = { { 0x0011, 0x0003, 0, VR::UI, VM::M1, "ProcessedSeriesUID" }, { 0x0011, 0x0004, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x0011, 0x0005, 0, VR::UI, VM::M1, "AcquisitionUID" }, { 0x0011, 0x0006, 0, VR::DS, VM::M1, "ImageDose" }, { 0x0011, 0x0007, 0, VR::FL, VM::M1, "StudyDose" }, { 0x0011, 0x0008, 0, VR::FL, VM::M1, "StudyDAP" }, { 0x0011, 0x0009, 0, VR::SL, VM::M1, "NonDigitalExposures" }, { 0x0011, 0x0010, 0, VR::SL, VM::M1, "TotalExposures" }, { 0x0011, 0x0011, 0, VR::LT, VM::M1, "ROI" }, { 0x0011, 0x0012, 0, VR::LT, VM::M1, "PatientSizeString" }, { 0x0011, 0x0013, 0, VR::UI, VM::M1, "SPSUID" }, { 0x0011, 0x0014, 0, VR::UI, VM::M1, "" }, { 0x0011, 0x0015, 0, VR::DS, VM::M1, "DetectorARCGain" }, { 0x0011, 0x0016, 0, VR::LT, VM::M1, "ProcessingDebugInfo" }, { 0x0011, 0x0017, 0, VR::CS, VM::M1, "OverrideMode" }, { 0x0011, 0x0019, 0, VR::DS, VM::M1, "FilmSpeedSelection" }, { 0x0011, 0x0027, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0028, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0029, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0030, 0, VR::UN, VM::M1, "" }, { 0x0011, 0x0031, 0, VR::IS, VM::M1TN, "DetectedFieldOfView" }, { 0x0011, 0x0032, 0, VR::IS, VM::M1TN, "AdjustedFieldOfView" }, { 0x0011, 0x0033, 0, VR::DS, VM::M1, "DetectorExposureIndex" }, { 0x0011, 0x0034, 0, VR::DS, VM::M1, "CompensatedDetectorExposure" }, { 0x0011, 0x0035, 0, VR::DS, VM::M1, "UncompensatedDetectorExposure" }, { 0x0011, 0x0036, 0, VR::DS, VM::M1, "MedianAnatomyCountValue" }, { 0x0011, 0x0037, 0, VR::DS, VM::M2, "DEILowerAndUpperLimitValues" }, { 0x0011, 0x0038, 0, VR::SL, VM::M6, "ShiftVectorForPasting" }, { 0x0011, 0x0039, 0, VR::CS, VM::M6, "ImageNumberInPasting" }, { 0x0011, 0x0040, 0, VR::SL, VM::M1, "PastingOverlap" }, { 0x0011, 0x0041, 0, VR::IS, VM::M24, "SubImageCollimatorVertices" }, { 0x0011, 0x0042, 0, VR::LO, VM::M1, "ViewIP" }, { 0x0011, 0x0043, 0, VR::IS, VM::M24, "KeystoneCoordinates" }, { 0x0011, 0x0044, 0, VR::CS, VM::M1, "ReceptorType" }, { 0x0011, 0x0046, 0, VR::LO, VM::M1TN, "" }, { 0x0011, 0x0047, 0, VR::DS, VM::M1, "" }, { 0x0011, 0x0059, 0, VR::CS, VM::M1, "" }, { 0x0011, 0x0060, 0, VR::CS, VM::M1, "" }, { 0x0011, 0x006d, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict335TagHashTable[] = { 40, 45, 50, 57, 62, 67, 72, 77, 80, 87, 39, 39, 39, 39, 39, 90, 39, 93, 96, 39, 101, 104, 107, 110, 113, 116, 39, 39, 39, 39, 39, 39, 119, 122, 125, 132, 135, 138, 141, 0, 2, 8, 17, 25, 54, 2, 7, 16, 28, 57, 3, 10, 19, 27, 56, 29, 64, 2, 9, 18, 30, 65, 2, 12, 21, 31, 66, 2, 11, 20, 32, 67, 2, 14, 23, 33, 68, 1, 13, 22, 3, 15, 25, 34, 70, 38, 109, 1, 35, 71, 1, 16, 39, 1, 18, 41, 2, 0, 3, 17, 40, 1, 2, 5, 1, 1, 4, 1, 4, 7, 1, 3, 6, 1, 6, 9, 1, 5, 8, 1, 20, 49, 1, 19, 48, 3, 22, 51, 36, 89, 37, 96, 1, 21, 50, 1, 24, 53, 1, 23, 52, 1, 26, 55, }; const unsigned short Dict335KeyHashTable[] = { 40, 43, 48, 39, 39, 53, 39, 39, 56, 59, 62, 39, 39, 39, 39, 39, 67, 39, 70, 39, 39, 73, 78, 81, 39, 39, 39, 39, 84, 39, 87, 90, 39, 95, 104, 107, 39, 114, 117, 0, 1, 32, 28606, 2, 13, 17292, 24, 16569, 2, 6, 3126, 14, 40472, 1, 20, 62330, 1, 25, 59206, 1, 33, 62542, 2, 12, 61062, 15, 3574, 1, 31, 43887, 1, 22, 18208, 2, 5, 26034, 21, 52360, 1, 9, 11994, 1, 29, 33435, 1, 0, 3666, 1, 30, 13241, 2, 10, 56818, 26, 21625, 4, 2, 63065, 3, 39710, 23, 3316, 28, 39067, 1, 4, 47137, 3, 1, 34891, 7, 19788, 27, 11376, 1, 8, 45542, 10, 11, 137, 16, 137, 17, 137, 18, 137, 19, 137, 34, 137, 35, 137, 36, 137, 37, 137, 38, 137, }; vtkDICOMDictionary::Dict Dict335Data = { "GEMS_GDXE_FALCON_04", 39, 39, Dict335TagHashTable, Dict335KeyHashTable, Dict335Contents }; // ----- PHILIPS IMAGING DD 001 ----- const DictEntry Dict336Contents[] = { { 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" }, { 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" }, { 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" }, { 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" }, { 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" }, { 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" }, { 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" }, { 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" }, { 0x2001, 0x0009, 0, VR::FL, VM::M1, "ImagePrepulseDelay" }, { 0x2001, 0x000a, 0, VR::IS, VM::M1, "ImagePlaneNumber" }, { 0x2001, 0x000b, 0, VR::CS, VM::M1, "ImageOrientation" }, { 0x2001, 0x000c, 0, VR::CS, VM::M1, "ArrhythmiaRejection" }, { 0x2001, 0x000e, 0, VR::CS, VM::M1, "CardiacCycled" }, { 0x2001, 0x000f, 0, VR::SS, VM::M1, "CardiacGateWidth" }, { 0x2001, 0x0010, 0, VR::CS, VM::M1, "CardiacSync" }, { 0x2001, 0x0011, 0, VR::FL, VM::M1, "DiffusionEchoTime" }, { 0x2001, 0x0012, 0, VR::CS, VM::M1, "DynamicSeries" }, { 0x2001, 0x0013, 0, VR::SL, VM::M1, "EPIFactor" }, { 0x2001, 0x0014, 0, VR::SL, VM::M1, "NumberOfEchoes" }, { 0x2001, 0x0015, 0, VR::SS, VM::M1, "NumberOfLocations" }, { 0x2001, 0x0016, 0, VR::SS, VM::M1, "NumberOfPCDirections" }, { 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhases" }, { 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlices" }, { 0x2001, 0x0019, 0, VR::CS, VM::M1, "PartialMatrixScanned" }, { 0x2001, 0x001a, 0, VR::FL, VM::M3, "PCVelocity" }, { 0x2001, 0x001b, 0, VR::FL, VM::M1, "PrepulseDelay" }, { 0x2001, 0x001c, 0, VR::CS, VM::M1, "PrepulseType" }, { 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumber" }, { 0x2001, 0x001e, 0, VR::CS, VM::M1, "ReformatAccuracy" }, { 0x2001, 0x001f, 0, VR::CS, VM::M1, "RespirationSync" }, { 0x2001, 0x0020, 0, VR::LO, VM::M1, "ScanningTechnique" }, { 0x2001, 0x0021, 0, VR::CS, VM::M1, "SPIR" }, { 0x2001, 0x0022, 0, VR::FL, VM::M1, "WaterFatShift" }, { 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" }, { 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" }, { 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" }, { 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" }, { 0x2001, 0x0029, 0, VR::FL, VM::M1, "" }, { 0x2001, 0x002b, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" }, { 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" }, { 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" }, { 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" }, { 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" }, { 0x2001, 0x0039, 0, VR::FL, VM::M1, "" }, { 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" }, { 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" }, { 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" }, { 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" }, { 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" }, { 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" }, { 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" }, { 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" }, { 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" }, { 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" }, { 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" }, { 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" }, { 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" }, { 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" }, { 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" }, { 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" }, { 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" }, { 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" }, { 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" }, { 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" }, { 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" }, { 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" }, { 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" }, { 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" }, { 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" }, { 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" }, { 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" }, { 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" }, { 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" }, { 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" }, { 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" }, { 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" }, { 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" }, { 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" }, { 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" }, { 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" }, { 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" }, { 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" }, { 0x2001, 0x0074, 0, VR::DS, VM::M1, "" }, { 0x2001, 0x0075, 0, VR::DS, VM::M1, "" }, { 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" }, { 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" }, { 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" }, { 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" }, { 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" }, { 0x2001, 0x0080, 0, VR::LO, VM::M1, "" }, { 0x2001, 0x0081, 0, VR::IS, VM::M1, "NumberOfDynamicScans" }, { 0x2001, 0x0082, 0, VR::IS, VM::M1, "EchoTrainLength" }, { 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" }, { 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" }, { 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" }, { 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" }, { 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" }, { 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" }, { 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" }, { 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" }, { 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" }, { 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" }, { 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" }, { 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" }, { 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" }, { 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" }, { 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" }, { 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" }, { 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" }, { 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" }, { 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" }, { 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" }, { 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" }, { 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" }, { 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" }, { 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" }, { 0x2001, 0x00da, 0, VR::CS, VM::M1, "" }, { 0x2001, 0x00f1, 0, VR::FL, VM::M1TN, "ProspectiveMotionCorrection" }, { 0x2001, 0x00f2, 0, VR::FL, VM::M1TN, "RetrospectiveMotionCorrection" }, }; const unsigned short Dict336TagHashTable[] = { 122, 125, 128, 133, 138, 141, 144, 147, 150, 121, 153, 156, 121, 159, 121, 162, 121, 121, 121, 121, 121, 165, 168, 171, 121, 121, 174, 177, 121, 121, 121, 180, 121, 185, 121, 121, 121, 121, 188, 193, 196, 199, 202, 207, 121, 121, 210, 213, 216, 219, 121, 222, 225, 230, 233, 236, 239, 242, 121, 245, 121, 248, 121, 121, 251, 254, 257, 260, 263, 266, 269, 272, 275, 121, 278, 281, 284, 289, 292, 295, 298, 301, 121, 121, 304, 307, 312, 315, 320, 325, 330, 335, 338, 343, 348, 355, 362, 367, 370, 373, 376, 379, 384, 389, 394, 397, 400, 403, 406, 409, 414, 419, 422, 425, 430, 433, 436, 441, 446, 449, 454, 0, 1, 26, 28, 1, 29, 31, 2, 28, 30, 114, 165, 2, 31, 33, 113, 164, 1, 30, 32, 1, 33, 35, 1, 32, 34, 1, 35, 37, 1, 34, 36, 1, 36, 38, 1, 37, 41, 1, 38, 43, 1, 39, 45, 1, 41, 51, 1, 40, 50, 1, 42, 53, 1, 43, 54, 1, 44, 57, 2, 45, 61, 115, 193, 1, 46, 63, 2, 47, 67, 116, 200, 1, 48, 68, 1, 49, 69, 1, 50, 70, 2, 51, 71, 117, 204, 1, 52, 72, 1, 53, 75, 1, 54, 76, 1, 55, 77, 1, 56, 78, 1, 57, 80, 2, 58, 81, 118, 218, 1, 59, 82, 1, 60, 83, 1, 61, 84, 1, 62, 85, 1, 63, 86, 1, 64, 88, 1, 65, 90, 1, 66, 93, 1, 67, 94, 1, 68, 95, 1, 69, 96, 1, 70, 97, 1, 71, 98, 1, 72, 99, 1, 73, 100, 1, 74, 101, 1, 75, 103, 1, 76, 104, 2, 77, 105, 120, 242, 1, 78, 106, 1, 79, 107, 1, 119, 241, 1, 80, 109, 1, 81, 110, 1, 82, 113, 2, 83, 114, 94, 131, 1, 93, 130, 2, 84, 116, 92, 129, 2, 85, 117, 91, 128, 2, 86, 118, 98, 135, 2, 87, 119, 97, 134, 1, 96, 133, 2, 0, 1, 95, 132, 2, 88, 122, 102, 139, 3, 2, 3, 89, 123, 101, 138, 3, 1, 2, 90, 124, 100, 137, 2, 4, 5, 99, 136, 1, 3, 4, 1, 6, 7, 1, 5, 6, 1, 8, 9, 2, 7, 8, 106, 147, 2, 10, 11, 105, 146, 2, 9, 10, 104, 145, 1, 103, 144, 1, 11, 12, 1, 13, 15, 1, 12, 14, 1, 15, 17, 2, 14, 16, 108, 155, 2, 17, 19, 107, 154, 1, 16, 18, 1, 19, 21, 2, 18, 20, 110, 159, 1, 21, 23, 1, 20, 22, 2, 23, 25, 109, 156, 2, 22, 24, 112, 163, 1, 25, 27, 2, 24, 26, 111, 161, 1, 27, 29, }; const unsigned short Dict336KeyHashTable[] = { 121, 121, 121, 121, 121, 122, 125, 132, 137, 121, 121, 140, 143, 146, 149, 154, 159, 162, 165, 168, 121, 121, 121, 121, 171, 121, 174, 177, 121, 121, 121, 182, 185, 121, 188, 121, 191, 196, 121, 201, 206, 211, 121, 121, 214, 217, 121, 121, 222, 225, 234, 237, 244, 247, 121, 121, 121, 252, 271, 274, 121, 279, 282, 121, 287, 292, 121, 121, 297, 300, 303, 121, 306, 309, 312, 317, 324, 327, 330, 333, 338, 121, 343, 348, 121, 121, 121, 351, 354, 361, 364, 367, 121, 374, 121, 377, 382, 385, 388, 391, 396, 121, 399, 402, 407, 121, 410, 121, 121, 415, 418, 423, 426, 429, 121, 121, 432, 435, 121, 121, 438, 0, 1, 36, 38495, 3, 67, 48876, 74, 48231, 96, 36938, 2, 61, 25073, 101, 3610, 1, 93, 6268, 1, 80, 29542, 1, 31, 33007, 1, 102, 40571, 2, 90, 37603, 97, 26027, 2, 14, 26570, 15, 60995, 1, 54, 13865, 1, 4, 53828, 1, 19, 11781, 1, 94, 40256, 1, 40, 35759, 1, 99, 1999, 2, 60, 13301, 83, 37303, 1, 58, 23725, 1, 25, 48964, 1, 20, 49480, 2, 21, 53787, 22, 16946, 2, 8, 27410, 24, 56946, 2, 41, 26630, 49, 18458, 2, 33, 44007, 116, 10747, 1, 104, 51872, 1, 62, 9966, 2, 29, 53677, 32, 47156, 1, 34, 44458, 4, 16, 35172, 65, 11534, 109, 63093, 113, 14616, 1, 23, 3673, 3, 5, 25859, 68, 30409, 82, 4893, 1, 103, 33584, 2, 6, 63622, 50, 37311, 9, 37, 44, 38, 44, 44, 44, 79, 44, 84, 44, 85, 44, 91, 44, 107, 44, 118, 44, 1, 105, 30749, 2, 27, 28765, 66, 14024, 1, 11, 52132, 2, 30, 26222, 73, 33790, 2, 46, 59320, 63, 54477, 2, 87, 4861, 89, 11334, 1, 57, 52379, 1, 119, 31474, 1, 3, 9247, 1, 71, 61982, 1, 98, 55314, 2, 39, 23185, 72, 46193, 3, 10, 9553, 17, 16527, 78, 61047, 1, 92, 18740, 1, 43, 15568, 1, 51, 7525, 2, 42, 19885, 110, 49529, 2, 1, 40729, 77, 22250, 2, 28, 5198, 75, 40916, 1, 7, 34028, 1, 53, 62351, 3, 45, 45029, 55, 23907, 111, 57702, 1, 108, 40875, 1, 56, 46044, 3, 70, 14852, 76, 61743, 115, 61743, 1, 0, 10108, 2, 18, 28627, 86, 38226, 1, 59, 37023, 1, 13, 13356, 1, 64, 29103, 2, 95, 10750, 100, 40071, 1, 48, 45173, 1, 26, 6137, 2, 106, 60724, 117, 9487, 1, 12, 7832, 2, 2, 35067, 120, 64248, 1, 112, 34383, 2, 9, 31243, 81, 25668, 1, 88, 59755, 1, 47, 26328, 1, 69, 27443, 1, 35, 317, 1, 114, 37450, 1, 52, 45035, }; vtkDICOMDictionary::Dict Dict336Data = { "PHILIPS IMAGING DD 001", 121, 121, Dict336TagHashTable, Dict336KeyHashTable, Dict336Contents }; // ----- NQRight ----- const DictEntry Dict337Contents[] = { { 0x0299, 0x0001, 0, VR::FL, VM::M1, "RightCorticalWhiteMatter" }, { 0x0299, 0x0002, 0, VR::FL, VM::M1, "RightCorticalGrayMatter" }, { 0x0299, 0x0003, 0, VR::FL, VM::M1, "Right3rdVentricle" }, { 0x0299, 0x0004, 0, VR::FL, VM::M1, "Right4thVentricle" }, { 0x0299, 0x0005, 0, VR::FL, VM::M1, "Right5thVentricle" }, { 0x0299, 0x0006, 0, VR::FL, VM::M1, "RightLateralVentricle" }, { 0x0299, 0x0007, 0, VR::FL, VM::M1, "RightInferiorLateralVentricle" }, { 0x0299, 0x0008, 0, VR::FL, VM::M1, "RightInferiorCSF" }, { 0x0299, 0x0009, 0, VR::FL, VM::M1, "RightCerebellarWhiteMatter" }, { 0x0299, 0x000a, 0, VR::FL, VM::M1, "RightCerebellarGrayMatter" }, { 0x0299, 0x000b, 0, VR::FL, VM::M1, "RightHippocampus" }, { 0x0299, 0x000c, 0, VR::FL, VM::M1, "RightAmygdala" }, { 0x0299, 0x000d, 0, VR::FL, VM::M1, "RightThalamus" }, { 0x0299, 0x000e, 0, VR::FL, VM::M1, "RightCaudate" }, { 0x0299, 0x000f, 0, VR::FL, VM::M1, "RightPutamen" }, { 0x0299, 0x0010, 0, VR::FL, VM::M1, "RightPallidum" }, { 0x0299, 0x0011, 0, VR::FL, VM::M1, "RightVentralDiencephalon" }, { 0x0299, 0x0012, 0, VR::FL, VM::M1, "RightNucleusAccumbens" }, { 0x0299, 0x0013, 0, VR::FL, VM::M1, "RightBrainStem" }, { 0x0299, 0x0014, 0, VR::FL, VM::M1, "RightExteriorCSF" }, { 0x0299, 0x0015, 0, VR::FL, VM::M1, "RightWMHypo" }, { 0x0299, 0x0016, 0, VR::FL, VM::M1, "RightOther" }, { 0x0299, 0x0017, 0, VR::FL, VM::M1, "RightCortexUnkown" }, { 0x0299, 0x0018, 0, VR::FL, VM::M1, "RightCortexBankssts" }, { 0x0299, 0x0019, 0, VR::FL, VM::M1, "RightCortexCaudalAnteriorCingulate" }, { 0x0299, 0x001a, 0, VR::FL, VM::M1, "RightCortexCaudalMiddleFrontal" }, { 0x0299, 0x001b, 0, VR::FL, VM::M1, "RightCortexCorpusCallosum" }, { 0x0299, 0x001c, 0, VR::FL, VM::M1, "RightCortexCuneus" }, { 0x0299, 0x001d, 0, VR::FL, VM::M1, "RightCortexEntorhinal" }, { 0x0299, 0x001e, 0, VR::FL, VM::M1, "RightCortexFusiform" }, { 0x0299, 0x001f, 0, VR::FL, VM::M1, "RightCortexInferiorParietal" }, { 0x0299, 0x0020, 0, VR::FL, VM::M1, "RightCortexInferiorTemporal" }, { 0x0299, 0x0021, 0, VR::FL, VM::M1, "RightCortexIsthmusCingulate" }, { 0x0299, 0x0022, 0, VR::FL, VM::M1, "RightCortexLateralOccipital" }, { 0x0299, 0x0023, 0, VR::FL, VM::M1, "RightCortexLateralOrbitoFrontal" }, { 0x0299, 0x0024, 0, VR::FL, VM::M1, "RightCortexLingual" }, { 0x0299, 0x0025, 0, VR::FL, VM::M1, "RightCortexMedialOrbitoFrontal" }, { 0x0299, 0x0026, 0, VR::FL, VM::M1, "RightCortexMiddleTemporal" }, { 0x0299, 0x0027, 0, VR::FL, VM::M1, "RightCortexParahippocampal" }, { 0x0299, 0x0028, 0, VR::FL, VM::M1, "RightCortexParacentral" }, { 0x0299, 0x0029, 0, VR::FL, VM::M1, "RightCortexParsOpercularis" }, { 0x0299, 0x002a, 0, VR::FL, VM::M1, "RightCortexParsOrbitalis" }, { 0x0299, 0x002b, 0, VR::FL, VM::M1, "RightCortexParsTriangularis" }, { 0x0299, 0x002c, 0, VR::FL, VM::M1, "RightCortexPericalcarine" }, { 0x0299, 0x002d, 0, VR::FL, VM::M1, "RightCortexPostcentral" }, { 0x0299, 0x002e, 0, VR::FL, VM::M1, "RightCortexPosteriorCingulate" }, { 0x0299, 0x002f, 0, VR::FL, VM::M1, "RightCortexPrecentral" }, { 0x0299, 0x0030, 0, VR::FL, VM::M1, "RightCortexPrecuneus" }, { 0x0299, 0x0031, 0, VR::FL, VM::M1, "RightCortexRostralAnteriorCingulate" }, { 0x0299, 0x0032, 0, VR::FL, VM::M1, "RightCortexRostralMiddleFrontal" }, { 0x0299, 0x0033, 0, VR::FL, VM::M1, "RightCortexSuperiorFrontal" }, { 0x0299, 0x0034, 0, VR::FL, VM::M1, "RightCortexSuperiorParietal" }, { 0x0299, 0x0035, 0, VR::FL, VM::M1, "RightCortexSuperiorTemporal" }, { 0x0299, 0x0036, 0, VR::FL, VM::M1, "RightCortexSupramarginal" }, { 0x0299, 0x0037, 0, VR::FL, VM::M1, "RightCortexFrontalPole" }, { 0x0299, 0x0038, 0, VR::FL, VM::M1, "RightCortexTemporalPole" }, { 0x0299, 0x0039, 0, VR::FL, VM::M1, "RightCortexTransvereTemporal" }, { 0x0299, 0x003a, 0, VR::FL, VM::M1, "RightMeningie" }, }; const unsigned short Dict337TagHashTable[] = { 59, 62, 65, 70, 75, 80, 85, 90, 95, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 58, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 188, 191, 58, 194, 197, 200, 58, 58, 58, 58, 203, 206, 209, 212, 215, 218, 221, 224, 0, 1, 42, 43, 1, 41, 42, 2, 18, 19, 40, 41, 2, 17, 18, 39, 40, 2, 16, 17, 46, 47, 2, 15, 16, 45, 46, 2, 22, 23, 44, 45, 2, 21, 22, 43, 44, 1, 20, 21, 1, 19, 20, 1, 26, 27, 1, 25, 26, 1, 24, 25, 1, 23, 24, 1, 30, 31, 1, 29, 30, 1, 28, 29, 1, 27, 28, 1, 2, 3, 1, 1, 2, 1, 0, 1, 1, 6, 7, 1, 5, 6, 1, 4, 5, 1, 3, 4, 1, 10, 11, 1, 9, 10, 1, 8, 9, 1, 7, 8, 1, 14, 15, 1, 13, 14, 1, 12, 13, 1, 11, 12, 1, 50, 51, 1, 49, 50, 1, 48, 49, 1, 47, 48, 1, 54, 55, 1, 53, 54, 1, 52, 53, 1, 51, 52, 1, 57, 58, 1, 56, 57, 1, 55, 56, 1, 34, 35, 1, 33, 34, 1, 32, 33, 1, 31, 32, 1, 38, 39, 1, 37, 38, 1, 36, 37, 1, 35, 36, }; const unsigned short Dict337KeyHashTable[] = { 58, 58, 59, 58, 62, 65, 72, 58, 75, 58, 78, 83, 86, 58, 58, 89, 58, 92, 58, 95, 98, 105, 108, 58, 115, 118, 58, 125, 128, 58, 131, 134, 139, 142, 145, 148, 151, 58, 154, 157, 160, 163, 168, 171, 178, 183, 58, 186, 191, 196, 199, 58, 58, 202, 58, 205, 208, 213, 0, 1, 43, 836, 1, 18, 56426, 3, 17, 56723, 48, 61361, 51, 12043, 1, 56, 15880, 1, 6, 16345, 2, 30, 59803, 55, 60069, 1, 44, 31334, 1, 1, 18004, 1, 40, 25540, 1, 52, 35322, 1, 23, 7283, 3, 34, 33459, 35, 55848, 47, 65339, 1, 21, 53560, 3, 5, 20539, 22, 20458, 31, 17546, 1, 38, 61517, 3, 7, 49802, 14, 36714, 57, 6055, 1, 20, 25502, 1, 4, 34186, 1, 9, 9447, 2, 3, 30384, 36, 56553, 1, 28, 36830, 1, 41, 52407, 1, 24, 21520, 1, 32, 56875, 1, 54, 39569, 1, 13, 51730, 1, 16, 15301, 1, 10, 34026, 2, 11, 40961, 25, 45387, 1, 26, 59833, 3, 29, 62060, 37, 22256, 50, 23190, 2, 2, 47278, 49, 27996, 1, 45, 39731, 2, 39, 23223, 42, 50, 2, 8, 14573, 53, 59835, 1, 33, 63098, 1, 0, 30280, 1, 19, 59990, 1, 15, 55466, 2, 12, 23833, 46, 24728, 1, 27, 12877, }; vtkDICOMDictionary::Dict Dict337Data = { "NQRight", 58, 58, Dict337TagHashTable, Dict337KeyHashTable, Dict337Contents }; // ----- Siemens: Thorax/Multix FD Lab Settings ----- const DictEntry Dict338Contents[] = { { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::LO, VM::M1, "TotalDoseAreaProduct" }, { 0x0019, 0x0003, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::FD, VM::M1, "TableObjectDistance" }, { 0x0019, 0x0007, 0, VR::FD, VM::M1, "TableDetectorDistance" }, { 0x0019, 0x0008, 0, VR::US, VM::M1TN, "OrthoStepDistance" }, { 0x0021, 0x0008, 0, VR::US, VM::M1, "AutoWindowFlag" }, { 0x0021, 0x0009, 0, VR::SL, VM::M1, "AutoWindowCenter" }, { 0x0021, 0x000A, 0, VR::SL, VM::M1, "AutoWindowWidth" }, { 0x0021, 0x000B, 0, VR::SS, VM::M1, "FilterID" }, { 0x0021, 0x0014, 0, VR::US, VM::M1, "AnatomicCorrectView" }, { 0x0021, 0x0015, 0, VR::SS, VM::M1, "AutoWindowShift" }, { 0x0021, 0x0016, 0, VR::DS, VM::M1, "AutoWindowExpansion" }, { 0x0021, 0x0017, 0, VR::LO, VM::M1, "SystemType" }, { 0x0021, 0x0030, 0, VR::SH, VM::M1, "AnatomicSortNumber" }, { 0x0021, 0x0031, 0, VR::SH, VM::M1, "AcquisitionSortNumber" }, }; const unsigned short Dict338TagHashTable[] = { 19, 19, 20, 23, 26, 29, 34, 37, 40, 43, 46, 49, 52, 19, 55, 58, 61, 66, 19, 0, 1, 10, 9, 1, 9, 8, 1, 12, 11, 2, 1, 1, 11, 10, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 14, 21, 1, 13, 20, 2, 16, 23, 18, 49, 3, 8, 8, 15, 22, 17, 48, }; const unsigned short Dict338KeyHashTable[] = { 20, 23, 26, 19, 31, 42, 45, 19, 48, 19, 19, 19, 53, 56, 59, 19, 19, 62, 65, 0, 1, 14, 27708, 1, 9, 58517, 2, 10, 21495, 11, 16860, 5, 0, 283, 1, 283, 3, 283, 4, 283, 5, 283, 1, 16, 27901, 1, 7, 26724, 2, 8, 42224, 12, 48208, 1, 18, 22273, 1, 13, 60875, 1, 2, 33760, 1, 6, 55050, 2, 15, 46275, 17, 55280, }; vtkDICOMDictionary::Dict Dict338Data = { "Siemens: Thorax/Multix FD Lab Settings", 19, 19, Dict338TagHashTable, Dict338KeyHashTable, Dict338Contents }; // ----- CAD Sciences ----- const DictEntry Dict339Contents[] = { { 0x3335, 0x0000, 0, VR::UN, VM::M1, "" }, { 0x3335, 0x0006, 0, VR::UN, VM::M1, "" }, { 0x3335, 0x0007, 0, VR::UN, VM::M1, "" }, { 0x3335, 0x0008, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict339TagHashTable[] = { 4, 5, 10, 13, 0, 2, 0, 0, 3, 8, 1, 2, 7, 1, 1, 6, }; const unsigned short Dict339KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict339Data = { "CAD Sciences", 4, 4, Dict339TagHashTable, Dict339KeyHashTable, Dict339Contents }; // ----- V1 ----- const DictEntry Dict340Contents[] = { { 0x0011, 0x0001, 0, VR::OB, VM::M1, "UserData" }, { 0x0011, 0x0002, 0, VR::DS, VM::M1, "NormalizationCoefficient" }, { 0x0011, 0x0003, 0, VR::DS, VM::M1TN, "ReceivingGain" }, { 0x0011, 0x0004, 0, VR::DS, VM::M1, "MeanImageNoise" }, { 0x0011, 0x0005, 0, VR::LT, VM::M1, "" }, { 0x0011, 0x0006, 0, VR::LT, VM::M1, "" }, { 0x0011, 0x0007, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict340TagHashTable[] = { 8, 11, 14, 7, 19, 22, 25, 0, 1, 3, 4, 1, 6, 7, 2, 0, 1, 5, 6, 1, 2, 3, 1, 1, 2, 1, 4, 5, }; const unsigned short Dict340KeyHashTable[] = { 8, 7, 11, 7, 7, 14, 21, 0, 1, 1, 60477, 1, 3, 47699, 3, 4, 768, 5, 768, 6, 768, 2, 0, 20264, 2, 55030, }; vtkDICOMDictionary::Dict Dict340Data = { "V1", 7, 7, Dict340TagHashTable, Dict340KeyHashTable, Dict340Contents }; // ----- GEMS_SERS_01 ----- const DictEntry Dict341Contents[] = { { 0x0025, 0x0006, 0, VR::SS, VM::M1, "LastPulseSequenceUsed" }, { 0x0025, 0x0007, 0, VR::SL, VM::M1, "ImagesInSeries" }, { 0x0025, 0x0010, 0, VR::SL, VM::M1, "LandmarkCounter" }, { 0x0025, 0x0011, 0, VR::SS, VM::M1, "NumberOfAcquisitions" }, { 0x0025, 0x0014, 0, VR::SL, VM::M1, "IndicatesNumberOfUpdatesToHeader" }, { 0x0025, 0x0017, 0, VR::SL, VM::M1, "SeriesCompleteFlag" }, { 0x0025, 0x0018, 0, VR::SL, VM::M1, "NumberOfImagesArchived" }, { 0x0025, 0x0019, 0, VR::SL, VM::M1, "LastInstanceNumberUsed" }, { 0x0025, 0x001a, 0, VR::SH, VM::M1, "PrimaryReceiverSuiteAndHost" }, { 0x0025, 0x001b, 0, VR::OB, VM::M1, "ProtocolDataBlockCompressed" }, }; const unsigned short Dict341TagHashTable[] = { 11, 16, 19, 24, 29, 32, 10, 10, 10, 35, 0, 2, 5, 23, 7, 25, 1, 6, 24, 2, 3, 17, 9, 27, 2, 2, 16, 8, 26, 1, 1, 7, 1, 0, 6, 1, 4, 20, }; const unsigned short Dict341KeyHashTable[] = { 11, 10, 10, 14, 17, 20, 10, 27, 10, 30, 0, 1, 0, 48638, 1, 4, 38095, 1, 7, 10378, 3, 5, 57651, 6, 44233, 8, 31186, 1, 9, 20657, 3, 1, 31090, 2, 30503, 3, 40239, }; vtkDICOMDictionary::Dict Dict341Data = { "GEMS_SERS_01", 10, 10, Dict341TagHashTable, Dict341KeyHashTable, Dict341Contents }; // ----- astm.org/diconde/iod/NdeCtImage ----- const DictEntry Dict342Contents[] = { { 0x0009, 0x0002, 0, VR::IS, VM::M1, "LINACEnergy" }, { 0x0009, 0x0004, 0, VR::IS, VM::M1, "LINACOutput" }, }; const unsigned short Dict342TagHashTable[] = { 2, 3, 0, 2, 0, 2, 1, 4, }; const unsigned short Dict342KeyHashTable[] = { 3, 6, 0, 1, 0, 5547, 1, 1, 20494, }; vtkDICOMDictionary::Dict Dict342Data = { "astm.org/diconde/iod/NdeCtImage", 2, 2, Dict342TagHashTable, Dict342KeyHashTable, Dict342Contents }; // ----- AMI ImageContext_01 ----- const DictEntry Dict343Contents[] = { { 0x3109, 0x0010, 0, VR::CS, VM::M1, "WindowInvert" }, { 0x3109, 0x0020, 0, VR::IS, VM::M1, "WindowCenter" }, { 0x3109, 0x0030, 0, VR::IS, VM::M1, "WindowWidth" }, { 0x3109, 0x0040, 0, VR::CS, VM::M1, "PixelAspectRatioSwap" }, { 0x3109, 0x0050, 0, VR::CS, VM::M1, "EnableAveraging" }, { 0x3109, 0x0060, 0, VR::CS, VM::M1, "Quality" }, { 0x3109, 0x0070, 0, VR::CS, VM::M1, "ViewportAnnotationLevel" }, { 0x3109, 0x0080, 0, VR::CS, VM::M1, "ShowImageAnnotation" }, { 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" }, }; const unsigned short Dict343TagHashTable[] = { 9, 10, 9, 15, 9, 22, 25, 9, 28, 0, 2, 1, 32, 4, 80, 3, 0, 16, 3, 64, 8, 144, 1, 7, 128, 1, 6, 112, 2, 2, 48, 5, 96, }; const unsigned short Dict343KeyHashTable[] = { 9, 9, 10, 13, 18, 23, 28, 31, 9, 0, 1, 4, 14990, 2, 0, 3266, 2, 3434, 2, 1, 25418, 3, 28245, 2, 5, 12513, 7, 9639, 1, 6, 34690, 1, 8, 62020, }; vtkDICOMDictionary::Dict Dict343Data = { "AMI ImageContext_01", 9, 9, Dict343TagHashTable, Dict343KeyHashTable, Dict343Contents }; // ----- SPI-P-XSB-VISUB Release 1 ----- const DictEntry Dict344Contents[] = { { 0x0019, 0x0000, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0010, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0011, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0012, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0002, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x000f, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0012, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x001f, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0020, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0022, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x002f, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0031, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0032, 0, VR::CS, VM::M1, "" }, { 0x0029, 0x003f, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict344TagHashTable[] = { 23, 24, 27, 32, 35, 23, 38, 23, 41, 48, 53, 56, 23, 65, 23, 68, 23, 71, 74, 77, 80, 23, 83, 0, 1, 20, 49, 2, 0, 0, 19, 48, 1, 6, 80, 1, 21, 50, 1, 18, 47, 3, 2, 17, 14, 31, 16, 33, 2, 1, 16, 15, 32, 1, 12, 17, 4, 3, 18, 4, 32, 11, 16, 17, 34, 1, 13, 18, 1, 10, 15, 1, 8, 1, 1, 7, 0, 1, 5, 64, 1, 9, 2, 1, 22, 63, }; const unsigned short Dict344KeyHashTable[] = { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 0, 23, 0, 233, 1, 233, 2, 233, 3, 233, 4, 233, 5, 233, 6, 233, 7, 233, 8, 233, 9, 233, 10, 233, 11, 233, 12, 233, 13, 233, 14, 233, 15, 233, 16, 233, 17, 233, 18, 233, 19, 233, 20, 233, 21, 233, 22, 233, }; vtkDICOMDictionary::Dict Dict344Data = { "SPI-P-XSB-VISUB Release 1", 23, 23, Dict344TagHashTable, Dict344KeyHashTable, Dict344Contents }; // ----- 2.16.840.1.114059.1.1.6.1.50.1 ----- const DictEntry Dict345Contents[] = { { 0x0029, 0x0020, 0, VR::LT, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::ST, VM::M1, "" }, { 0x0029, 0x0022, 0, VR::ST, VM::M1, "" }, { 0x0029, 0x0023, 0, VR::ST, VM::M1, "" }, { 0x0029, 0x0024, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0025, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0026, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0027, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict345TagHashTable[] = { 9, 12, 15, 18, 21, 24, 27, 30, 0, 1, 1, 33, 1, 0, 32, 1, 3, 35, 1, 2, 34, 1, 5, 37, 1, 4, 36, 1, 7, 39, 1, 6, 38, }; const unsigned short Dict345KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict345Data = { "2.16.840.1.114059.1.1.6.1.50.1", 8, 8, Dict345TagHashTable, Dict345KeyHashTable, Dict345Contents }; // ----- SIEMENS RIS ----- const DictEntry Dict346Contents[] = { { 0x0011, 0x0010, 0, VR::LO, VM::M1, "PatientUID" }, { 0x0011, 0x0011, 0, VR::LO, VM::M1, "PatientID" }, { 0x0011, 0x0020, 0, VR::DA, VM::M1, "PatientRegistrationDate" }, { 0x0011, 0x0021, 0, VR::TM, VM::M1, "PatientRegistrationTime" }, { 0x0011, 0x0030, 0, VR::PN, VM::M1, "PatientnameRIS" }, { 0x0011, 0x0031, 0, VR::LO, VM::M1, "PatientprenameRIS" }, { 0x0011, 0x0040, 0, VR::LO, VM::M1, "PatientHospitalStatus" }, { 0x0011, 0x0041, 0, VR::LO, VM::M1, "MedicalAlerts" }, { 0x0011, 0x0042, 0, VR::LO, VM::M1, "ContrastAllergies" }, { 0x0031, 0x0010, 0, VR::LO, VM::M1, "RequestUID" }, { 0x0031, 0x0045, 0, VR::LO, VM::M1, "RequestingPhysician" }, { 0x0031, 0x0050, 0, VR::LO, VM::M1, "RequestedPhysician" }, { 0x0033, 0x0010, 0, VR::LO, VM::M1, "PatientStudyUID" }, }; const unsigned short Dict346TagHashTable[] = { 14, 19, 22, 25, 28, 31, 34, 37, 13, 42, 47, 13, 13, 0, 2, 1, 17, 10, 69, 1, 0, 16, 1, 6, 64, 1, 7, 65, 1, 8, 66, 1, 11, 80, 1, 5, 49, 2, 4, 48, 9, 16, 2, 3, 33, 12, 16, 1, 2, 32, }; const unsigned short Dict346KeyHashTable[] = { 14, 17, 20, 13, 23, 26, 13, 31, 38, 13, 13, 13, 43, 0, 1, 11, 3643, 1, 2, 61210, 1, 1, 8377, 1, 6, 50806, 2, 7, 47106, 8, 47230, 3, 5, 16365, 9, 59341, 10, 61089, 2, 0, 45572, 3, 40556, 2, 4, 46545, 12, 32781, }; vtkDICOMDictionary::Dict Dict346Data = { "SIEMENS RIS", 13, 13, Dict346TagHashTable, Dict346KeyHashTable, Dict346Contents }; // ----- GEMS_YMHD_01 ----- const DictEntry Dict347Contents[] = { { 0x0033, 0x0005, 0, VR::UN, VM::M1, "" }, { 0x0033, 0x0006, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict347TagHashTable[] = { 3, 6, 0, 1, 0, 5, 1, 1, 6, }; const unsigned short Dict347KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict347Data = { "GEMS_YMHD_01", 2, 2, Dict347TagHashTable, Dict347KeyHashTable, Dict347Contents }; // ----- SPI-P-CTBE Release 1 ----- const DictEntry Dict348Contents[] = { { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000b, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000c, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0014, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0019, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001a, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x001b, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001c, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001d, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict348TagHashTable[] = { 15, 20, 25, 28, 31, 36, 14, 39, 14, 14, 14, 42, 45, 48, 0, 2, 4, 5, 9, 25, 2, 3, 4, 8, 24, 1, 11, 27, 1, 10, 26, 2, 5, 11, 13, 29, 1, 12, 28, 1, 6, 12, 1, 0, 0, 1, 2, 3, 2, 1, 2, 7, 20, }; const unsigned short Dict348KeyHashTable[] = { 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 0, 384, 1, 384, 2, 384, 3, 384, 4, 384, 5, 384, 6, 384, 7, 384, 8, 384, 9, 384, 10, 384, 11, 384, 12, 384, 13, 384, }; vtkDICOMDictionary::Dict Dict348Data = { "SPI-P-CTBE Release 1", 14, 14, Dict348TagHashTable, Dict348KeyHashTable, Dict348Contents }; // ----- ISG shadow ----- const DictEntry Dict349Contents[] = { { 0x0029, 0x0070, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0080, 0, VR::IS, VM::M1, "" }, { 0x0029, 0x0090, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict349TagHashTable[] = { 4, 7, 3, 0, 1, 1, 128, 2, 0, 112, 2, 144, }; const unsigned short Dict349KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict349Data = { "ISG shadow", 3, 3, Dict349TagHashTable, Dict349KeyHashTable, Dict349Contents }; // ----- METAEMOTION GINKGO RETINAL ----- const DictEntry Dict350Contents[] = { { 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" }, { 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" }, { 0x0011, 0x000C, 0, VR::UN, VM::M1, "VirtualAneritraContrastImage" }, }; const unsigned short Dict350TagHashTable[] = { 3, 4, 7, 0, 1, 0, 1, 2, 1, 11, 2, 12, }; const unsigned short Dict350KeyHashTable[] = { 4, 9, 3, 0, 2, 0, 32761, 2, 48753, 1, 1, 8406, }; vtkDICOMDictionary::Dict Dict350Data = { "METAEMOTION GINKGO RETINAL", 3, 3, Dict350TagHashTable, Dict350KeyHashTable, Dict350Contents }; // ----- Riverain Medical ----- const DictEntry Dict351Contents[] = { { 0x0203, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0203, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0203, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0203, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0203, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0203, 0x00f0, 0, VR::UI, VM::M1, "" }, { 0x0203, 0x00f1, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict351TagHashTable[] = { 8, 7, 11, 14, 17, 22, 7, 0, 1, 4, 16, 1, 3, 3, 1, 2, 2, 2, 1, 1, 5, 240, 2, 0, 0, 6, 241, }; const unsigned short Dict351KeyHashTable[] = { 7, 7, 7, 7, 7, 8, 7, 0, 7, 0, 768, 1, 768, 2, 768, 3, 768, 4, 768, 5, 768, 6, 768, }; vtkDICOMDictionary::Dict Dict351Data = { "Riverain Medical", 7, 7, Dict351TagHashTable, Dict351KeyHashTable, Dict351Contents }; // ----- HOLOGIC ----- const DictEntry Dict352Contents[] = { { 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" }, { 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" }, { 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" }, { 0x0021, 0x0001, 0, VR::LT, VM::M1, "ImageAnalysisDataInXML" }, { 0x0023, 0x0000, 0, VR::LO, VM::M1, "EncodingSchemeVersion" }, { 0x0023, 0x0001, 0, VR::LO, VM::M1, "PFileName" }, { 0x0023, 0x0002, 0, VR::OB, VM::M1, "PFileData" }, { 0x0023, 0x0003, 0, VR::UL, VM::M1, "PFileLength" }, { 0x0023, 0x0004, 0, VR::OB, VM::M1, "RFileData" }, { 0x0023, 0x0005, 0, VR::UL, VM::M1, "RFileLength" }, { 0x0029, 0x0000, 0, VR::OB, VM::M1, "GraphBitmapData" }, { 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" }, }; const unsigned short Dict352TagHashTable[] = { 12, 13, 16, 19, 22, 25, 12, 30, 33, 38, 41, 44, 0, 1, 2, 0, 1, 9, 5, 1, 8, 4, 1, 11, 1, 2, 0, 0, 10, 0, 1, 1, 0, 2, 3, 1, 7, 3, 1, 6, 2, 1, 5, 1, 1, 4, 0, }; const unsigned short Dict352KeyHashTable[] = { 12, 13, 12, 18, 21, 12, 24, 27, 12, 30, 33, 38, 0, 2, 8, 19844, 9, 18946, 1, 4, 54723, 1, 0, 12614, 1, 5, 1260, 1, 2, 46831, 1, 1, 54398, 2, 3, 5451, 10, 30347, 3, 6, 36867, 7, 33057, 11, 10475, }; vtkDICOMDictionary::Dict Dict352Data = { "HOLOGIC", 12, 12, Dict352TagHashTable, Dict352KeyHashTable, Dict352Contents }; // ----- GEMS_ACRQA_2.0 BLOCK1 ----- const DictEntry Dict353Contents[] = { { 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" }, { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" }, { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" }, { 0x0023, 0x0030, 0, VR::LO, VM::M1, "CRLatitude" }, { 0x0023, 0x0040, 0, VR::LO, VM::M1, "CRGroupNumber" }, { 0x0023, 0x0050, 0, VR::US, VM::M1, "CRImageSerialNumber" }, { 0x0023, 0x0060, 0, VR::LO, VM::M1, "CRBarCodeNumber" }, { 0x0023, 0x0070, 0, VR::LO, VM::M1, "CRFilmOutputExposure" }, { 0x0023, 0x0080, 0, VR::LO, VM::M1, "CRFilmFormat" }, { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" }, }; const unsigned short Dict353TagHashTable[] = { 10, 11, 16, 19, 22, 25, 28, 31, 34, 37, 0, 2, 1, 16, 8, 128, 1, 7, 112, 1, 2, 32, 1, 5, 80, 1, 0, 0, 1, 6, 96, 1, 9, 144, 1, 4, 64, 1, 3, 48, }; const unsigned short Dict353KeyHashTable[] = { 11, 14, 17, 22, 27, 10, 30, 35, 10, 10, 0, 1, 2, 48761, 1, 1, 46224, 2, 3, 41522, 5, 31050, 2, 6, 39736, 8, 39860, 1, 4, 55886, 2, 7, 30788, 9, 22214, 1, 0, 6115, }; vtkDICOMDictionary::Dict Dict353Data = { "GEMS_ACRQA_2.0 BLOCK1", 10, 10, Dict353TagHashTable, Dict353KeyHashTable, Dict353Contents }; // ----- GEMS_ACRQA_2.0 BLOCK2 ----- const DictEntry Dict354Contents[] = { { 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" }, { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRCShift" }, { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CRGT" }, { 0x0023, 0x0030, 0, VR::DS, VM::M1, "CRGA" }, { 0x0023, 0x0040, 0, VR::DS, VM::M1, "CRGC" }, { 0x0023, 0x0050, 0, VR::DS, VM::M1, "CRGS" }, { 0x0023, 0x0060, 0, VR::LO, VM::M1, "CRRT" }, { 0x0023, 0x0070, 0, VR::DS, VM::M1, "CRRE" }, { 0x0023, 0x0080, 0, VR::US, VM::M1, "CRRN" }, { 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" }, }; const unsigned short Dict354TagHashTable[] = { 10, 11, 16, 19, 22, 25, 28, 31, 34, 37, 0, 2, 1, 16, 8, 128, 1, 7, 112, 1, 2, 32, 1, 5, 80, 1, 0, 0, 1, 6, 96, 1, 9, 144, 1, 4, 64, 1, 3, 48, }; const unsigned short Dict354KeyHashTable[] = { 11, 10, 14, 10, 10, 21, 24, 27, 32, 35, 0, 1, 3, 34077, 3, 4, 34077, 6, 34115, 9, 36381, 1, 0, 28887, 1, 8, 34114, 2, 1, 64674, 7, 34113, 1, 5, 34078, 1, 2, 34078, }; vtkDICOMDictionary::Dict Dict354Data = { "GEMS_ACRQA_2.0 BLOCK2", 10, 10, Dict354TagHashTable, Dict354KeyHashTable, Dict354Contents }; // ----- GEMS_ACRQA_2.0 BLOCK3 ----- const DictEntry Dict355Contents[] = { { 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" }, { 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" }, { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" }, { 0x0023, 0x0030, 0, VR::US, VM::M1, "CRORN" }, { 0x0023, 0x0040, 0, VR::US, VM::M1, "CRORD" }, { 0x0023, 0x0050, 0, VR::LO, VM::M1, "CRCassetteSize" }, { 0x0023, 0x0060, 0, VR::LO, VM::M1, "CRMachineID" }, { 0x0023, 0x0070, 0, VR::LO, VM::M1, "CRMachineType" }, { 0x0023, 0x0080, 0, VR::LO, VM::M1, "CRTechnicianCode" }, { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CREnergySubtractionParameters" }, { 0x0023, 0x00f0, 0, VR::LO, VM::M1, "CRDistributionCode" }, { 0x0023, 0x00ff, 0, VR::US, VM::M1, "CRShuttersApplied" }, }; const unsigned short Dict355TagHashTable[] = { 12, 12, 13, 16, 21, 24, 27, 32, 12, 37, 40, 43, 0, 1, 4, 64, 2, 1, 16, 2, 32, 1, 10, 240, 1, 8, 128, 2, 5, 80, 6, 96, 2, 3, 48, 11, 255, 1, 9, 144, 1, 7, 112, 1, 0, 0, }; const unsigned short Dict355KeyHashTable[] = { 12, 13, 18, 21, 12, 24, 29, 32, 37, 42, 12, 12, 0, 2, 5, 508, 7, 36020, 1, 1, 30317, 1, 11, 14138, 2, 0, 30316, 3, 31315, 1, 9, 14472, 2, 4, 31314, 8, 46323, 2, 2, 31314, 6, 40639, 1, 10, 61249, }; vtkDICOMDictionary::Dict Dict355Data = { "GEMS_ACRQA_2.0 BLOCK3", 12, 12, Dict355TagHashTable, Dict355KeyHashTable, Dict355Contents }; // ----- GEMS_3DSTATE_001 ----- const DictEntry Dict356Contents[] = { { 0x0047, 0x00e9, 0, VR::FL, VM::M3, "" }, { 0x0047, 0x00ea, 0, VR::DS, VM::M3, "" }, { 0x0047, 0x00eb, 0, VR::DS, VM::M3, "" }, { 0x0047, 0x00ec, 0, VR::FL, VM::M1, "" }, { 0x0047, 0x00ed, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict356TagHashTable[] = { 6, 5, 9, 12, 15, 0, 1, 1, 234, 1, 0, 233, 1, 4, 237, 2, 2, 235, 3, 236, }; const unsigned short Dict356KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict356Data = { "GEMS_3DSTATE_001", 5, 5, Dict356TagHashTable, Dict356KeyHashTable, Dict356Contents }; // ----- RamSoft File Kind Identifier ----- const DictEntry Dict357Contents[] = { { 0x3111, 0x0010, 0, VR::CS, VM::M1, "BinaryDocumentKind" }, }; const unsigned short Dict357TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict357KeyHashTable[] = { 2, 0, 1, 0, 6927, }; vtkDICOMDictionary::Dict Dict357Data = { "RamSoft File Kind Identifier", 1, 1, Dict357TagHashTable, Dict357KeyHashTable, Dict357Contents }; // ----- SEGAMI__PAGE ----- const DictEntry Dict358Contents[] = { { 0x0033, 0x0097, 0, VR::IS, VM::M1, "" }, { 0x0033, 0x0098, 0, VR::OW, VM::M1, "" }, }; const unsigned short Dict358TagHashTable[] = { 3, 6, 0, 1, 0, 151, 1, 1, 152, }; const unsigned short Dict358KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict358Data = { "SEGAMI__PAGE", 2, 2, Dict358TagHashTable, Dict358KeyHashTable, Dict358Contents }; // ----- 3DHISTECH ZOOMLEVEL REGION MAP ----- const DictEntry Dict359Contents[] = { { 0x0029, 0x0020, 0, VR::UL, VM::M2, "" }, { 0x0029, 0x0035, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0037, 0, VR::SL, VM::M1, "" }, { 0x0029, 0x0038, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0040, 0, VR::DS, VM::M1, "" }, { 0x0029, 0x0050, 0, VR::UL, VM::M1, "" }, { 0x0029, 0x0061, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0070, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict359TagHashTable[] = { 9, 16, 8, 8, 23, 8, 26, 8, 0, 3, 4, 64, 5, 80, 7, 112, 3, 0, 32, 3, 56, 6, 97, 1, 1, 53, 1, 2, 55, }; const unsigned short Dict359KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict359Data = { "3DHISTECH ZOOMLEVEL REGION MAP", 8, 8, Dict359TagHashTable, Dict359KeyHashTable, Dict359Contents }; // ----- Sound Eklin ----- const DictEntry Dict360Contents[] = { { 0xf001, 0x0002, 0, VR::LO, VM::M1, "PatientCategorySize" }, { 0xf001, 0x0003, 0, VR::LO, VM::M1, "PatientSexExtended" }, { 0xf001, 0x0004, 0, VR::LO, VM::M1, "ImageView" }, { 0xf001, 0x0005, 0, VR::LO, VM::M1, "AnatomyImaged" }, { 0xf001, 0x0006, 0, VR::LO, VM::M1, "ImageEnhancements" }, { 0xf001, 0x0007, 0, VR::LO, VM::M1, "DetectorSettings" }, { 0xf001, 0x0008, 0, VR::LO, VM::M1, "ApplicationVersion" }, { 0xf001, 0x0009, 0, VR::LO, VM::M1, "ImageLateralityExtended" }, { 0xf001, 0x000a, 0, VR::PN, VM::M1, "ClientName" }, { 0xf001, 0x000b, 0, VR::UI, VM::M1, "ReferenceStudyInstanceUID" }, { 0xf001, 0x000c, 0, VR::UI, VM::M1, "ReferenceSeriesInstanceUID" }, { 0xf001, 0x000d, 0, VR::LO, VM::M1, "ExamRefId" }, { 0xf001, 0x000e, 0, VR::ST, VM::M1, "PhysicianOfRecordAddress" }, { 0xf001, 0x000f, 0, VR::SH, VM::M1TN, "PhysicianOfRecordPhoneNumbers" }, { 0xf001, 0x0010, 0, VR::LT, VM::M1, "ReasonForStudy" }, { 0xf001, 0x0011, 0, VR::LO, VM::M1, "Protocol" }, { 0xf001, 0x0012, 0, VR::LO, VM::M1, "CaptureInputType" }, { 0xf001, 0x0013, 0, VR::LT, VM::M1, "ExamComplaint" }, { 0xf001, 0x0014, 0, VR::LO, VM::M1, "ExamWebCode" }, { 0xf001, 0x0015, 0, VR::LO, VM::M1, "ExamCategory" }, { 0xf001, 0x0016, 0, VR::SH, VM::M1, "ExamDiagnosis" }, { 0xf001, 0x0017, 0, VR::PN, VM::M1, "ExamCreatedBy" }, { 0xf001, 0x0018, 0, VR::LO, VM::M1, "ExamCreatedByGroup" }, { 0xf001, 0x0019, 0, VR::DT, VM::M1, "ExamRequiredByDateTime" }, { 0xf001, 0x001a, 0, VR::LO, VM::M1, "CaptureType" }, { 0xf001, 0x001b, 0, VR::IS, VM::M1, "TelemedExamID" }, { 0xf001, 0x001c, 0, VR::LO, VM::M1, "ExamCreatedByGuid" }, { 0xf001, 0x001d, 0, VR::LO, VM::M1, "ClientNameGuid" }, { 0xf001, 0x001e, 0, VR::LO, VM::M1, "ReceptorBitsPerPixel" }, }; const unsigned short Dict360TagHashTable[] = { 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 29, 96, 101, 104, 107, 110, 113, 0, 1, 7, 9, 1, 6, 8, 1, 9, 11, 1, 8, 10, 1, 11, 13, 1, 10, 12, 1, 13, 15, 1, 12, 14, 1, 15, 17, 1, 14, 16, 1, 17, 19, 1, 16, 18, 1, 19, 21, 1, 18, 20, 1, 21, 23, 1, 20, 22, 1, 23, 25, 1, 22, 24, 1, 25, 27, 1, 24, 26, 1, 27, 29, 1, 26, 28, 2, 1, 3, 28, 30, 1, 0, 2, 1, 3, 5, 1, 2, 4, 1, 5, 7, 1, 4, 6, }; const unsigned short Dict360KeyHashTable[] = { 30, 35, 29, 29, 29, 38, 45, 54, 29, 29, 29, 29, 59, 62, 29, 29, 29, 67, 29, 29, 70, 73, 78, 81, 29, 29, 84, 89, 98, 0, 2, 15, 36515, 24, 51447, 1, 12, 60926, 3, 4, 27116, 8, 4096, 13, 17818, 4, 11, 29540, 14, 58003, 26, 37630, 28, 39254, 2, 1, 47236, 3, 44374, 1, 25, 30117, 2, 5, 13951, 18, 56076, 1, 9, 37967, 1, 16, 547, 2, 0, 64438, 17, 40650, 1, 22, 8962, 1, 20, 4962, 2, 2, 893, 27, 45700, 4, 6, 4020, 19, 16271, 21, 22728, 23, 37078, 2, 7, 38680, 10, 898, }; vtkDICOMDictionary::Dict Dict360Data = { "Sound Eklin", 29, 29, Dict360TagHashTable, Dict360KeyHashTable, Dict360Contents }; // ----- SECTRA_Ident_01 ----- const DictEntry Dict361Contents[] = { { 0x0009, 0x0001, 0, VR::SH, VM::M1, "RequestNumber" }, { 0x0009, 0x0002, 0, VR::SH, VM::M1, "ExaminationNumber" }, { 0x0009, 0x0004, 0, VR::LO, VM::M1, "SeriesIdentifier" }, { 0x0009, 0x0005, 0, VR::LO, VM::M1, "SeriesOrder" }, { 0x0009, 0x0006, 0, VR::LO, VM::M1, "FileName" }, { 0x0009, 0x0007, 0, VR::LO, VM::M1, "ImageDataID" }, }; const unsigned short Dict361TagHashTable[] = { 7, 10, 13, 18, 6, 21, 0, 1, 3, 5, 1, 2, 4, 2, 0, 1, 5, 7, 1, 4, 6, 1, 1, 2, }; const unsigned short Dict361KeyHashTable[] = { 7, 10, 6, 6, 15, 18, 0, 1, 3, 59522, 2, 0, 3545, 1, 48247, 1, 4, 40027, 2, 2, 18701, 5, 359, }; vtkDICOMDictionary::Dict Dict361Data = { "SECTRA_Ident_01", 6, 6, Dict361TagHashTable, Dict361KeyHashTable, Dict361Contents }; // ----- STENTOR ----- const DictEntry Dict362Contents[] = { { 0x0073, 0x0001, 0, VR::ST, VM::M1, "" }, { 0x0073, 0x0002, 0, VR::ST, VM::M1, "" }, { 0x0073, 0x0003, 0, VR::ST, VM::M1, "" }, { 0x0073, 0x0004, 0, VR::ST, VM::M1, "" }, { 0x0073, 0x0006, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict362TagHashTable[] = { 6, 9, 12, 15, 5, 0, 1, 0, 1, 1, 4, 6, 1, 1, 2, 2, 2, 3, 3, 4, }; const unsigned short Dict362KeyHashTable[] = { 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1, 1076, 2, 1076, 3, 1076, 4, 1076, }; vtkDICOMDictionary::Dict Dict362Data = { "STENTOR", 5, 5, Dict362TagHashTable, Dict362KeyHashTable, Dict362Contents }; // ----- ObjectModel (ID, Version, Place, PlaceDescription) ----- const DictEntry Dict363Contents[] = { { 0x8101, 0x0000, 0, VR::LO, VM::M1, "ID" }, { 0x8101, 0x0010, 0, VR::LO, VM::M1, "Version" }, }; const unsigned short Dict363TagHashTable[] = { 2, 3, 0, 2, 0, 0, 1, 16, }; const unsigned short Dict363KeyHashTable[] = { 3, 6, 0, 1, 0, 47609, 1, 1, 27157, }; vtkDICOMDictionary::Dict Dict363Data = { "ObjectModel (ID, Version, Place, PlaceDescription)", 2, 2, Dict363TagHashTable, Dict363KeyHashTable, Dict363Contents }; // ----- SIEMENS CSA REPORT ----- const DictEntry Dict364Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "ReportType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "ReportVersion" }, { 0x0029, 0x0015, 0, VR::US, VM::M1, "SRVariant" }, { 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" }, }; const unsigned short Dict364TagHashTable[] = { 5, 10, 13, 4, 0, 2, 1, 9, 2, 21, 1, 0, 8, 1, 3, 23, }; const unsigned short Dict364KeyHashTable[] = { 5, 4, 4, 8, 0, 1, 3, 38633, 3, 0, 28600, 1, 7209, 2, 38167, }; vtkDICOMDictionary::Dict Dict364Data = { "SIEMENS CSA REPORT", 4, 4, Dict364TagHashTable, Dict364KeyHashTable, Dict364Contents }; // ----- astm.org/diconde/iod/ComponentSeries ----- const DictEntry Dict365Contents[] = { { 0x0009, 0x0010, 0, VR::ST, VM::M1, "ActualEnvironmentalConditions" }, { 0x0009, 0x0040, 0, VR::ST, VM::M1, "EnvironmentalConditions" }, }; const unsigned short Dict365TagHashTable[] = { 3, 6, 0, 1, 1, 64, 1, 0, 16, }; const unsigned short Dict365KeyHashTable[] = { 2, 3, 0, 2, 0, 4141, 1, 11328, }; vtkDICOMDictionary::Dict Dict365Data = { "astm.org/diconde/iod/ComponentSeries", 2, 2, Dict365TagHashTable, Dict365KeyHashTable, Dict365Contents }; // ----- GEMS_0039 ----- const DictEntry Dict366Contents[] = { { 0x0039, 0x0095, 0, VR::LO, VM::M1, "SRApplicationName" }, }; const unsigned short Dict366TagHashTable[] = { 2, 0, 1, 0, 149, }; const unsigned short Dict366KeyHashTable[] = { 2, 0, 1, 0, 43423, }; vtkDICOMDictionary::Dict Dict366Data = { "GEMS_0039", 1, 1, Dict366TagHashTable, Dict366KeyHashTable, Dict366Contents }; // ----- PHILIPS MR IMAGING DD 001 ----- const DictEntry Dict367Contents[] = { { 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" }, { 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" }, { 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" }, { 0x2005, 0x0004, 0, VR::CS, VM::M1, "ImageDisplayOrientation" }, { 0x2005, 0x0005, 0, VR::CS, VM::M1, "SynergyReconstructionType" }, { 0x2005, 0x0008, 0, VR::FL, VM::M1, "ImageOffcenterAP" }, { 0x2005, 0x0009, 0, VR::FL, VM::M1, "ImageOffcenterFH" }, { 0x2005, 0x000a, 0, VR::FL, VM::M1, "ImageOffCentreRL" }, { 0x2005, 0x000b, 0, VR::FL, VM::M1, "MaxFP" }, { 0x2005, 0x000c, 0, VR::FL, VM::M1, "MinFP" }, { 0x2005, 0x000d, 0, VR::FL, VM::M1, "ScaleIntercept" }, { 0x2005, 0x000e, 0, VR::FL, VM::M1, "ScaleSlope" }, { 0x2005, 0x000f, 0, VR::DS, VM::M1, "WindowCenter" }, { 0x2005, 0x0010, 0, VR::DS, VM::M1, "WindowWidth" }, { 0x2005, 0x0011, 0, VR::CS, VM::M1, "ImageType" }, { 0x2005, 0x0012, 0, VR::CS, VM::M1, "CardiacGating" }, { 0x2005, 0x0013, 0, VR::CS, VM::M1, "DevelopmentMode" }, { 0x2005, 0x0014, 0, VR::CS, VM::M1, "Diffusion" }, { 0x2005, 0x0015, 0, VR::CS, VM::M1, "FatSaturation" }, { 0x2005, 0x0016, 0, VR::CS, VM::M1, "FlowCompensation" }, { 0x2005, 0x0017, 0, VR::CS, VM::M1, "FourierInterpolation" }, { 0x2005, 0x0018, 0, VR::LO, VM::M1, "HardcopyProtocol" }, { 0x2005, 0x0019, 0, VR::CS, VM::M1, "InverseReconstructed" }, { 0x2005, 0x001a, 0, VR::SS, VM::M1, "LabelSyntax" }, { 0x2005, 0x001b, 0, VR::CS, VM::M1, "MagnetizationPrepared" }, { 0x2005, 0x001c, 0, VR::CS, VM::M1, "MagnetizationTransferContrast" }, { 0x2005, 0x001d, 0, VR::SS, VM::M1, "MeasurementScanResolution" }, { 0x2005, 0x001e, 0, VR::SH, VM::M1, "MIPProtocol" }, { 0x2005, 0x001f, 0, VR::SH, VM::M1, "MPRProtocol" }, { 0x2005, 0x0020, 0, VR::SL, VM::M1, "NumberOfChemicalShift" }, { 0x2005, 0x0021, 0, VR::SS, VM::M1, "NumberOfMixes" }, { 0x2005, 0x0022, 0, VR::IS, VM::M1, "NumberOfReferences" }, { 0x2005, 0x0023, 0, VR::SS, VM::M1, "NumberOfSlabs" }, { 0x2005, 0x0025, 0, VR::SS, VM::M1, "NumberOfVolumes" }, { 0x2005, 0x0026, 0, VR::CS, VM::M1, "OverSamplingPhase" }, { 0x2005, 0x0027, 0, VR::CS, VM::M1, "PackageMode" }, { 0x2005, 0x0028, 0, VR::CS, VM::M1, "PartialFourierFrequency" }, { 0x2005, 0x0029, 0, VR::CS, VM::M1, "PartialFourierPhase" }, { 0x2005, 0x002a, 0, VR::IS, VM::M1, "PatientReferenceID" }, { 0x2005, 0x002b, 0, VR::SS, VM::M1, "PercentScanComplete" }, { 0x2005, 0x002c, 0, VR::CS, VM::M1, "PhaseEncodeReordering" }, { 0x2005, 0x002d, 0, VR::IS, VM::M1, "PlanScanSurveyNumberOfImages" }, { 0x2005, 0x002e, 0, VR::CS, VM::M1, "PPGPPUGating" }, { 0x2005, 0x002f, 0, VR::CS, VM::M1, "SpatialPresaturation" }, { 0x2005, 0x0030, 0, VR::FL, VM::M1TN, "RepetitionTime" }, { 0x2005, 0x0031, 0, VR::CS, VM::M1, "RespiratoryGating" }, { 0x2005, 0x0032, 0, VR::CS, VM::M1, "SampleRepresentation" }, { 0x2005, 0x0033, 0, VR::FL, VM::M1, "AcquisitionDuration" }, { 0x2005, 0x0034, 0, VR::CS, VM::M1, "SegmentedKSpace" }, { 0x2005, 0x0035, 0, VR::CS, VM::M1, "DataType" }, { 0x2005, 0x0036, 0, VR::CS, VM::M1, "IsCardiac" }, { 0x2005, 0x0037, 0, VR::CS, VM::M1, "IsSpectro" }, { 0x2005, 0x0038, 0, VR::CS, VM::M1, "Spoiled" }, { 0x2005, 0x0039, 0, VR::CS, VM::M1, "SteadyState" }, { 0x2005, 0x003a, 0, VR::SH, VM::M1, "SubAnatomy" }, { 0x2005, 0x003b, 0, VR::CS, VM::M1, "TimeReversedSteadyState" }, { 0x2005, 0x003c, 0, VR::CS, VM::M1, "TiltOptimizedNonsaturatedExcitation" }, { 0x2005, 0x003d, 0, VR::SS, VM::M1, "NumberOfRRIntervalRanges" }, { 0x2005, 0x003e, 0, VR::SL, VM::M1TN, "RRIntervalsDistribution" }, { 0x2005, 0x003f, 0, VR::SL, VM::M1, "PlanScanAcquisitionNumber" }, { 0x2005, 0x0048, 0, VR::IS, VM::M1TN, "ReferencedAcquisitionNumber" }, { 0x2005, 0x0049, 0, VR::IS, VM::M1TN, "ReferencedChemicalShiftNumber" }, { 0x2005, 0x004a, 0, VR::IS, VM::M1TN, "ReferenceDynamicScanNumber" }, { 0x2005, 0x004b, 0, VR::IS, VM::M1TN, "ReferencedEchoNumber" }, { 0x2005, 0x004c, 0, VR::CS, VM::M1TN, "ReferencedEntity" }, { 0x2005, 0x004d, 0, VR::CS, VM::M1TN, "ReferencedImageType" }, { 0x2005, 0x004e, 0, VR::FL, VM::M1TN, "SlabFOVRL" }, { 0x2005, 0x004f, 0, VR::FL, VM::M1TN, "SlabOffcentreAP" }, { 0x2005, 0x0050, 0, VR::FL, VM::M1TN, "SlabOffcentreFH" }, { 0x2005, 0x0051, 0, VR::FL, VM::M1TN, "SlabOffcentreRL" }, { 0x2005, 0x0052, 0, VR::CS, VM::M1TN, "SlabType" }, { 0x2005, 0x0053, 0, VR::CS, VM::M1TN, "SlabViewAxis" }, { 0x2005, 0x0054, 0, VR::FL, VM::M1TN, "VolumeAngulationAP" }, { 0x2005, 0x0055, 0, VR::FL, VM::M1TN, "VolumeAngulationFH" }, { 0x2005, 0x0056, 0, VR::FL, VM::M1TN, "VolumeAngulationRL" }, { 0x2005, 0x0057, 0, VR::FL, VM::M1TN, "VolumeFOVAP" }, { 0x2005, 0x0058, 0, VR::FL, VM::M1TN, "VolumeFOVFH" }, { 0x2005, 0x0059, 0, VR::FL, VM::M1TN, "VolumeFOVRL" }, { 0x2005, 0x005a, 0, VR::FL, VM::M1TN, "VolumeOffcentreAP" }, { 0x2005, 0x005b, 0, VR::FL, VM::M1TN, "VolumeOffcentreFH" }, { 0x2005, 0x005c, 0, VR::FL, VM::M1TN, "VolumeOffcentreRL" }, { 0x2005, 0x005d, 0, VR::CS, VM::M1TN, "VolumeType" }, { 0x2005, 0x005e, 0, VR::CS, VM::M1, "VolumeViewAxis" }, { 0x2005, 0x005f, 0, VR::CS, VM::M1, "StudyOrigin" }, { 0x2005, 0x0060, 0, VR::IS, VM::M1, "StudySequenceNumber" }, { 0x2005, 0x0061, 0, VR::CS, VM::M1, "PrepulseType" }, { 0x2005, 0x0063, 0, VR::SS, VM::M1, "fMRIStatusIndication" }, { 0x2005, 0x0064, 0, VR::IS, VM::M1TN, "ReferencePhaseNumber" }, { 0x2005, 0x0065, 0, VR::IS, VM::M1TN, "ReferenceReconstructionNumber" }, { 0x2005, 0x0066, 0, VR::CS, VM::M1TN, "ReferenceScanningSequence" }, { 0x2005, 0x0067, 0, VR::IS, VM::M1TN, "ReferenceSliceNumber" }, { 0x2005, 0x0068, 0, VR::CS, VM::M1TN, "ReferenceType" }, { 0x2005, 0x0069, 0, VR::FL, VM::M1TN, "SlabAngulationAP" }, { 0x2005, 0x006a, 0, VR::FL, VM::M1TN, "SlabAngulationFH" }, { 0x2005, 0x006b, 0, VR::FL, VM::M1TN, "SlabAngulationRL" }, { 0x2005, 0x006c, 0, VR::FL, VM::M1TN, "SlabFOVAP" }, { 0x2005, 0x006d, 0, VR::FL, VM::M1TN, "SlabFOVFH" }, { 0x2005, 0x006e, 0, VR::CS, VM::M1TN, "ScanningSequence" }, { 0x2005, 0x006f, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x2005, 0x0070, 0, VR::LO, VM::M1, "HardcopyProtocolEV" }, { 0x2005, 0x0071, 0, VR::FL, VM::M1TN, "StackAngulationAP" }, { 0x2005, 0x0072, 0, VR::FL, VM::M1TN, "StackAngulationFH" }, { 0x2005, 0x0073, 0, VR::FL, VM::M1TN, "StackAngulationRL" }, { 0x2005, 0x0074, 0, VR::FL, VM::M1TN, "StackFOVAP" }, { 0x2005, 0x0075, 0, VR::FL, VM::M1TN, "StackFOVFH" }, { 0x2005, 0x0076, 0, VR::FL, VM::M1TN, "StackFOVRL" }, { 0x2005, 0x0078, 0, VR::FL, VM::M1TN, "StackOffcentreAP" }, { 0x2005, 0x0079, 0, VR::FL, VM::M1TN, "StackOffcentreFH" }, { 0x2005, 0x007a, 0, VR::FL, VM::M1TN, "StackOffcentreRL" }, { 0x2005, 0x007b, 0, VR::CS, VM::M1TN, "StackPreparationDirection" }, { 0x2005, 0x007e, 0, VR::FL, VM::M1TN, "StackSliceDistance" }, { 0x2005, 0x0080, 0, VR::SQ, VM::M1, "SeriesPlanScan" }, { 0x2005, 0x0081, 0, VR::CS, VM::M1TN, "StackViewAxis" }, { 0x2005, 0x0083, 0, VR::SQ, VM::M1, "SeriesSlab" }, { 0x2005, 0x0084, 0, VR::SQ, VM::M1, "SeriesReference" }, { 0x2005, 0x0085, 0, VR::SQ, VM::M1, "SeriesVolume" }, { 0x2005, 0x0086, 0, VR::SS, VM::M1, "NumberOfGeometry" }, { 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" }, { 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" }, { 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" }, { 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" }, { 0x2005, 0x00a2, 0, VR::CS, VM::M1, "IsCOCA" }, { 0x2005, 0x00a3, 0, VR::IS, VM::M1, "StackCoilID" }, { 0x2005, 0x00a4, 0, VR::IS, VM::M1, "StackCBBCoil1" }, { 0x2005, 0x00a5, 0, VR::IS, VM::M1, "StackCBBCoil2" }, { 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" }, { 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" }, { 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" }, { 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" }, { 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" }, { 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" }, { 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" }, { 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" }, }; const unsigned short Dict367TagHashTable[] = { 134, 139, 144, 147, 150, 133, 133, 133, 133, 133, 133, 133, 133, 153, 156, 159, 162, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 133, 245, 248, 251, 254, 257, 260, 263, 266, 269, 272, 275, 278, 133, 281, 284, 287, 290, 133, 133, 293, 133, 296, 299, 302, 305, 133, 133, 133, 133, 133, 308, 311, 133, 133, 314, 317, 320, 323, 328, 333, 338, 341, 346, 351, 354, 357, 360, 363, 366, 369, 372, 375, 378, 381, 384, 387, 390, 393, 396, 399, 404, 409, 412, 133, 415, 418, 421, 424, 429, 434, 439, 444, 449, 454, 459, 464, 467, 470, 473, 476, 479, 482, 487, 492, 495, 498, 501, 504, 507, 0, 2, 58, 62, 130, 177, 2, 53, 57, 129, 176, 1, 52, 56, 1, 55, 59, 1, 54, 58, 1, 64, 76, 1, 65, 77, 1, 66, 78, 2, 67, 79, 132, 192, 1, 60, 72, 1, 61, 73, 1, 62, 74, 1, 63, 75, 1, 72, 84, 1, 73, 85, 1, 74, 86, 1, 75, 87, 1, 68, 80, 1, 69, 81, 1, 70, 82, 1, 71, 83, 1, 80, 92, 1, 81, 93, 1, 82, 94, 1, 83, 95, 1, 76, 88, 1, 77, 89, 1, 78, 90, 1, 79, 91, 1, 87, 100, 1, 88, 101, 1, 89, 102, 1, 90, 103, 1, 84, 96, 1, 85, 97, 1, 86, 99, 1, 95, 108, 1, 96, 109, 1, 97, 110, 1, 98, 111, 1, 91, 104, 1, 92, 105, 1, 93, 106, 1, 94, 107, 1, 103, 116, 1, 104, 117, 1, 105, 118, 1, 99, 112, 1, 100, 113, 1, 101, 114, 1, 102, 115, 1, 110, 126, 1, 106, 120, 1, 107, 121, 1, 108, 122, 1, 109, 123, 1, 4, 5, 1, 3, 4, 1, 1, 1, 1, 0, 0, 1, 116, 134, 2, 2, 2, 115, 133, 2, 10, 13, 114, 132, 2, 9, 12, 113, 131, 1, 12, 15, 2, 11, 14, 112, 129, 2, 6, 9, 111, 128, 1, 5, 8, 1, 8, 11, 1, 7, 10, 1, 18, 21, 1, 17, 20, 1, 20, 23, 1, 19, 22, 1, 14, 17, 1, 13, 16, 1, 16, 19, 1, 15, 18, 1, 26, 29, 1, 25, 28, 1, 28, 31, 1, 27, 30, 1, 22, 25, 2, 21, 24, 118, 159, 2, 24, 27, 117, 158, 1, 23, 26, 1, 33, 37, 1, 35, 39, 1, 34, 38, 1, 30, 33, 2, 29, 32, 126, 167, 2, 32, 35, 125, 166, 2, 31, 34, 124, 165, 2, 41, 45, 123, 164, 2, 40, 44, 122, 163, 2, 43, 47, 121, 162, 2, 42, 46, 120, 161, 2, 37, 41, 119, 160, 1, 36, 40, 1, 39, 43, 1, 38, 42, 1, 49, 53, 1, 48, 52, 1, 51, 55, 2, 50, 54, 128, 169, 2, 45, 49, 127, 168, 1, 44, 48, 1, 47, 51, 1, 46, 50, 1, 57, 61, 1, 56, 60, 2, 59, 63, 131, 178, }; const unsigned short Dict367KeyHashTable[] = { 134, 137, 133, 140, 143, 133, 133, 148, 151, 133, 154, 157, 162, 173, 133, 176, 179, 133, 184, 187, 190, 133, 193, 133, 196, 133, 133, 199, 206, 209, 212, 215, 218, 225, 228, 233, 238, 133, 241, 133, 133, 244, 247, 250, 255, 258, 133, 265, 268, 133, 273, 276, 281, 286, 133, 133, 289, 294, 303, 133, 133, 310, 133, 133, 133, 133, 313, 316, 321, 133, 324, 329, 332, 335, 133, 133, 340, 343, 346, 133, 351, 354, 359, 362, 365, 133, 133, 370, 133, 133, 133, 379, 386, 133, 133, 389, 394, 397, 133, 400, 407, 133, 412, 415, 418, 423, 133, 426, 431, 434, 133, 441, 444, 133, 447, 450, 455, 133, 133, 133, 133, 458, 461, 133, 133, 464, 133, 467, 472, 477, 133, 480, 133, 0, 1, 96, 39936, 1, 66, 39939, 1, 88, 59884, 2, 45, 58451, 75, 2929, 1, 33, 31035, 1, 43, 57708, 1, 120, 63754, 2, 5, 40642, 40, 19746, 5, 7, 13694, 11, 10356, 42, 19619, 83, 55986, 93, 56767, 1, 94, 56770, 1, 82, 1286, 2, 32, 9256, 49, 54045, 1, 109, 59619, 1, 91, 33319, 1, 58, 40105, 1, 26, 64726, 1, 9, 20603, 3, 3, 20547, 99, 23421, 122, 47556, 1, 76, 2930, 1, 77, 2933, 1, 90, 52995, 1, 4, 12607, 3, 67, 48932, 72, 33440, 112, 6063, 1, 37, 12774, 2, 63, 43046, 126, 44880, 2, 6, 40643, 47, 64125, 1, 97, 39823, 1, 27, 58571, 1, 70, 63488, 1, 123, 54544, 2, 124, 54544, 127, 10766, 1, 39, 46760, 3, 21, 7188, 31, 54104, 62, 28498, 1, 111, 317, 2, 86, 47189, 103, 37819, 1, 60, 35960, 2, 30, 20670, 114, 31708, 2, 17, 33176, 119, 59971, 1, 0, 26174, 2, 68, 48933, 73, 33441, 4, 69, 48936, 74, 33444, 78, 1533, 110, 49817, 3, 8, 18523, 29, 58137, 81, 36609, 1, 19, 60048, 1, 38, 31972, 2, 23, 59381, 106, 5377, 1, 132, 14323, 2, 52, 63139, 56, 4141, 1, 59, 42688, 1, 104, 37820, 2, 36, 21419, 105, 37823, 1, 115, 38092, 1, 1, 26175, 2, 2, 26178, 14, 60396, 1, 130, 15542, 2, 48, 62491, 79, 1534, 1, 80, 1537, 1, 10, 14600, 2, 15, 13834, 85, 26279, 4, 35, 49395, 41, 2784, 53, 6757, 57, 2257, 3, 22, 27407, 107, 5378, 121, 55532, 1, 108, 5381, 2, 34, 39158, 87, 8835, 1, 116, 36547, 1, 20, 46856, 3, 44, 56196, 84, 33049, 125, 7391, 2, 28, 1338, 61, 51581, 1, 118, 63738, 1, 98, 27477, 2, 100, 44990, 131, 15543, 1, 129, 15546, 2, 12, 4183, 71, 54844, 1, 25, 60494, 3, 16, 3168, 55, 55530, 95, 39934, 1, 18, 34655, 1, 46, 9826, 1, 13, 54927, 2, 64, 19418, 117, 9749, 1, 24, 10054, 1, 92, 56765, 1, 89, 20628, 1, 128, 61180, 2, 51, 3354, 113, 4247, 2, 65, 26169, 101, 44991, 1, 102, 44994, 2, 50, 36577, 54, 60481, }; vtkDICOMDictionary::Dict Dict367Data = { "PHILIPS MR IMAGING DD 001", 133, 133, Dict367TagHashTable, Dict367KeyHashTable, Dict367Contents }; // ----- GE_GENESIS_REV3.0 ----- const DictEntry Dict368Contents[] = { { 0x0019, 0x0039, 0, VR::SS, VM::M1, "AxialType" }, { 0x0019, 0x008f, 0, VR::SS, VM::M1, "SwapPhaseFrequency" }, { 0x0019, 0x009c, 0, VR::SS, VM::M1, "PulseSequenceName" }, { 0x0019, 0x009f, 0, VR::SS, VM::M1, "CoilType" }, { 0x0019, 0x00a4, 0, VR::SS, VM::M1, "SATFatWaterBone" }, { 0x0019, 0x00c0, 0, VR::SS, VM::M1, "BitmapOfSATSelections" }, { 0x0019, 0x00c1, 0, VR::SS, VM::M1, "SurfaceCoilIntensityCorrectionFlag" }, { 0x0019, 0x00cb, 0, VR::SS, VM::M1, "PhaseContrastFlowAxis" }, { 0x0019, 0x00cc, 0, VR::SS, VM::M1, "PhaseContrastVelocityEncoding" }, { 0x0019, 0x00d5, 0, VR::SS, VM::M1, "FractionalEcho" }, { 0x0019, 0x00d8, 0, VR::SS, VM::M1, "VariableEchoFlag" }, { 0x0019, 0x00d9, 0, VR::DS, VM::M1, "ConcatenatedSat" }, { 0x0019, 0x00f2, 0, VR::SS, VM::M1, "NumberOfPhases" }, { 0x0043, 0x001e, 0, VR::DS, VM::M1, "DeltaStartTime" }, { 0x0043, 0x0027, 0, VR::SH, VM::M1, "ScanPitchRatio" }, }; const unsigned short Dict368TagHashTable[] = { 16, 15, 21, 15, 26, 15, 15, 29, 32, 35, 15, 38, 43, 48, 51, 0, 2, 2, 156, 11, 217, 2, 0, 57, 13, 30, 1, 8, 204, 1, 12, 242, 1, 5, 192, 1, 6, 193, 2, 4, 164, 14, 39, 2, 3, 159, 9, 213, 1, 1, 143, 2, 7, 203, 10, 216, }; const unsigned short Dict368KeyHashTable[] = { 16, 21, 24, 29, 34, 39, 15, 42, 15, 15, 15, 15, 45, 52, 15, 0, 2, 8, 37446, 13, 7540, 1, 5, 39961, 2, 3, 45780, 10, 5150, 2, 0, 55933, 4, 61748, 2, 1, 21041, 2, 37820, 1, 11, 26047, 1, 7, 64662, 3, 6, 63614, 9, 62165, 14, 42747, 1, 12, 18822, }; vtkDICOMDictionary::Dict Dict368Data = { "GE_GENESIS_REV3.0", 15, 15, Dict368TagHashTable, Dict368KeyHashTable, Dict368Contents }; // ----- SIEMENS MR VA0 COAD ----- const DictEntry Dict369Contents[] = { { 0x0019, 0x0012, 0, VR::DS, VM::M1, "MagneticFieldStrength" }, { 0x0019, 0x0014, 0, VR::DS, VM::M1, "ADCVoltage" }, { 0x0019, 0x0016, 0, VR::DS, VM::M2, "ADCOffset" }, { 0x0019, 0x0020, 0, VR::DS, VM::M1, "TransmitterAmplitude" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "NumberOfTransmitterAmplitudes" }, { 0x0019, 0x0022, 0, VR::DS, VM::M1, "TransmitterAttenuator" }, { 0x0019, 0x0024, 0, VR::DS, VM::M1, "TransmitterCalibration" }, { 0x0019, 0x0026, 0, VR::DS, VM::M1, "TransmitterReference" }, { 0x0019, 0x0050, 0, VR::DS, VM::M1, "ReceiverTotalGain" }, { 0x0019, 0x0051, 0, VR::DS, VM::M1, "ReceiverAmplifierGain" }, { 0x0019, 0x0052, 0, VR::DS, VM::M1, "ReceiverPreamplifierGain" }, { 0x0019, 0x0054, 0, VR::DS, VM::M1, "ReceiverCableAttenuation" }, { 0x0019, 0x0055, 0, VR::DS, VM::M1, "ReceiverReferenceGain" }, { 0x0019, 0x0056, 0, VR::DS, VM::M1, "ReceiverFilterFrequency" }, { 0x0019, 0x0060, 0, VR::DS, VM::M1, "ReconstructionScaleFactor" }, { 0x0019, 0x0062, 0, VR::DS, VM::M1, "ReferenceScaleFactor" }, { 0x0019, 0x0070, 0, VR::DS, VM::M1, "PhaseGradientAmplitude" }, { 0x0019, 0x0071, 0, VR::DS, VM::M1, "ReadoutGradientAmplitude" }, { 0x0019, 0x0072, 0, VR::DS, VM::M1, "SelectionGradientAmplitude" }, { 0x0019, 0x0080, 0, VR::DS, VM::M3, "GradientDelayTime" }, { 0x0019, 0x0082, 0, VR::DS, VM::M1, "TotalGradientDelayTime" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "SensitivityCorrectionLabel" }, { 0x0019, 0x0091, 0, VR::DS, VM::M6, "SaturationPhaseEncodingVectorCoronalComponent" }, { 0x0019, 0x0092, 0, VR::DS, VM::M6, "SaturationReadoutVectorCoronalComponent" }, { 0x0019, 0x00a0, 0, VR::IS, VM::M1, "RFWatchdogMask" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "EPIReconstructionSlope" }, { 0x0019, 0x00a2, 0, VR::DS, VM::M1, "RFPowerErrorIndicator" }, { 0x0019, 0x00a5, 0, VR::DS, VM::M3, "SpecificAbsorptionRateWholeBody" }, { 0x0019, 0x00a6, 0, VR::DS, VM::M3, "SpecificEnergyDose" }, { 0x0019, 0x00b0, 0, VR::UL, VM::M1, "AdjustmentStatusMask" }, { 0x0019, 0x00c1, 0, VR::DS, VM::M6, "EPICapacity" }, { 0x0019, 0x00c2, 0, VR::DS, VM::M3, "EPIInductance" }, { 0x0019, 0x00c3, 0, VR::IS, VM::M1TN, "EPISwitchConfigurationCode" }, { 0x0019, 0x00c4, 0, VR::IS, VM::M1TN, "EPISwitchHardwareCode" }, { 0x0019, 0x00c5, 0, VR::DS, VM::M1TN, "EPISwitchDelayTime" }, { 0x0019, 0x00d1, 0, VR::DS, VM::M1, "FlowSensitivity" }, { 0x0019, 0x00d2, 0, VR::CS, VM::M1, "CalculationSubmode" }, { 0x0019, 0x00d3, 0, VR::DS, VM::M1, "FieldOfViewRatio" }, { 0x0019, 0x00d4, 0, VR::IS, VM::M1, "BaseRawMatrixSize" }, { 0x0019, 0x00d5, 0, VR::IS, VM::M1, "2DOversamplingLines" }, { 0x0019, 0x00d6, 0, VR::IS, VM::M1, "ThreeDPhaseOversamplingPartitions" }, { 0x0019, 0x00d7, 0, VR::IS, VM::M1, "EchoLinePosition" }, { 0x0019, 0x00d8, 0, VR::IS, VM::M1, "EchoColumnPosition" }, { 0x0019, 0x00d9, 0, VR::IS, VM::M1, "LinesPerSegment" }, { 0x0019, 0x00da, 0, VR::CS, VM::M1, "PhaseCodingDirection" }, }; const unsigned short Dict369TagHashTable[] = { 45, 45, 46, 49, 52, 55, 58, 61, 45, 64, 67, 70, 75, 80, 83, 90, 97, 45, 102, 45, 107, 112, 45, 115, 118, 121, 124, 127, 132, 135, 138, 141, 144, 149, 45, 45, 152, 157, 45, 160, 45, 45, 163, 166, 45, 0, 1, 23, 146, 1, 22, 145, 1, 21, 144, 1, 26, 162, 1, 25, 161, 1, 24, 160, 1, 28, 166, 1, 27, 165, 2, 0, 18, 4, 33, 2, 3, 32, 44, 218, 1, 1, 20, 3, 5, 34, 16, 112, 42, 216, 3, 2, 22, 17, 113, 43, 217, 2, 6, 36, 18, 114, 2, 7, 38, 20, 130, 2, 19, 128, 36, 210, 1, 37, 211, 1, 35, 209, 1, 40, 214, 1, 41, 215, 1, 38, 212, 2, 8, 80, 39, 213, 1, 9, 81, 1, 10, 82, 1, 14, 96, 1, 11, 84, 2, 12, 85, 15, 98, 1, 13, 86, 2, 29, 176, 31, 194, 1, 32, 195, 1, 30, 193, 1, 33, 196, 1, 34, 197, }; const unsigned short Dict369KeyHashTable[] = { 45, 46, 45, 45, 45, 51, 45, 64, 45, 67, 70, 77, 82, 85, 88, 45, 95, 45, 45, 45, 98, 103, 45, 45, 45, 45, 45, 106, 45, 109, 112, 45, 45, 45, 121, 126, 45, 129, 134, 45, 143, 148, 151, 154, 157, 0, 2, 28, 13563, 41, 25152, 6, 0, 20679, 5, 47892, 8, 17784, 12, 4495, 29, 40523, 32, 4143, 1, 9, 49015, 1, 24, 32757, 3, 4, 31494, 23, 33633, 26, 38627, 2, 17, 38725, 19, 4190, 1, 27, 62077, 1, 33, 60373, 3, 15, 49569, 22, 61121, 38, 17724, 1, 1, 32171, 2, 21, 32356, 44, 3219, 1, 3, 52602, 1, 35, 49729, 1, 42, 32434, 4, 7, 27679, 10, 26695, 30, 7423, 43, 5228, 2, 13, 3088, 34, 24853, 1, 16, 22910, 2, 20, 28688, 36, 64790, 4, 2, 39142, 11, 48243, 14, 26440, 18, 34264, 2, 25, 31872, 39, 53241, 1, 40, 59617, 1, 31, 61907, 1, 37, 53889, 1, 6, 39638, }; vtkDICOMDictionary::Dict Dict369Data = { "SIEMENS MR VA0 COAD", 45, 45, Dict369TagHashTable, Dict369KeyHashTable, Dict369Contents }; // ----- GEMS_PATI_01 ----- const DictEntry Dict370Contents[] = { { 0x0011, 0x0010, 0, VR::SS, VM::M1, "PatientStatus" }, }; const unsigned short Dict370TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict370KeyHashTable[] = { 2, 0, 1, 0, 24862, }; vtkDICOMDictionary::Dict Dict370Data = { "GEMS_PATI_01", 1, 1, Dict370TagHashTable, Dict370KeyHashTable, Dict370Contents }; // ----- NNT ----- const DictEntry Dict371Contents[] = { { 0x0019, 0x0002, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000a, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000b, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000c, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000d, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000e, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x000f, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0012, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0013, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::DS, VM::M3, "" }, { 0x0019, 0x001f, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0022, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0023, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0024, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0025, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0026, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0027, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0028, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0031, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0032, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0033, 0, VR::DS, VM::M8, "" }, }; const unsigned short Dict371TagHashTable[] = { 31, 36, 41, 44, 30, 30, 47, 50, 30, 30, 53, 58, 63, 66, 30, 30, 69, 30, 72, 75, 80, 83, 86, 89, 30, 30, 92, 97, 102, 107, 0, 2, 5, 7, 22, 37, 2, 4, 6, 21, 36, 1, 24, 39, 1, 23, 38, 1, 16, 31, 1, 15, 30, 2, 14, 19, 27, 49, 2, 13, 18, 26, 48, 1, 29, 51, 1, 28, 50, 1, 6, 9, 1, 8, 11, 2, 7, 10, 25, 40, 1, 10, 13, 1, 9, 12, 1, 12, 15, 1, 11, 14, 2, 1, 3, 18, 33, 2, 0, 2, 17, 32, 2, 3, 5, 20, 35, 2, 2, 4, 19, 34, }; const unsigned short Dict371KeyHashTable[] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 30, 0, 179, 1, 179, 2, 179, 3, 179, 4, 179, 5, 179, 6, 179, 7, 179, 8, 179, 9, 179, 10, 179, 11, 179, 12, 179, 13, 179, 14, 179, 15, 179, 16, 179, 17, 179, 18, 179, 19, 179, 20, 179, 21, 179, 22, 179, 23, 179, 24, 179, 25, 179, 26, 179, 27, 179, 28, 179, 29, 179, }; vtkDICOMDictionary::Dict Dict371Data = { "NNT", 30, 30, Dict371TagHashTable, Dict371KeyHashTable, Dict371Contents }; // ----- agfa/displayableImages ----- const DictEntry Dict372Contents[] = { { 0x2e13, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x2e13, 0x0011, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict372TagHashTable[] = { 3, 6, 0, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict372KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict372Data = { "agfa/displayableImages", 2, 2, Dict372TagHashTable, Dict372KeyHashTable, Dict372Contents }; // ----- Brainlab-S32-SO ----- const DictEntry Dict373Contents[] = { { 0x0063, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0063, 0x0010, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict373TagHashTable[] = { 3, 6, 0, 1, 1, 16, 1, 0, 1, }; const unsigned short Dict373KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict373Data = { "Brainlab-S32-SO", 2, 2, Dict373TagHashTable, Dict373KeyHashTable, Dict373Contents }; // ----- GEMS_Ultrasound_ImageGroup_001 ----- const DictEntry Dict374Contents[] = { { 0x6003, 0x0010, 0, VR::SQ, VM::M1, "" }, { 0x6003, 0x0011, 0, VR::OB, VM::M1, "" }, { 0x6003, 0x0012, 0, VR::LT, VM::M1, "" }, { 0x6003, 0x0015, 0, VR::LT, VM::M1TN, "" }, }; const unsigned short Dict374TagHashTable[] = { 4, 5, 8, 13, 0, 1, 2, 18, 2, 1, 17, 3, 21, 1, 0, 16, }; const unsigned short Dict374KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict374Data = { "GEMS_Ultrasound_ImageGroup_001", 4, 4, Dict374TagHashTable, Dict374KeyHashTable, Dict374Contents }; // ----- SIEMENS MEDCOM HEADER ----- const DictEntry Dict375Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComHeaderType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComHeaderVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComHeaderInfo" }, { 0x0029, 0x0020, 0, VR::OB, VM::M1, "MedComHistoryInformation" }, { 0x0029, 0x0031, 0, VR::LO, VM::M1, "PMTFInformation1" }, { 0x0029, 0x0032, 0, VR::UL, VM::M1, "PMTFInformation2" }, { 0x0029, 0x0033, 0, VR::UL, VM::M1, "PMTFInformation3" }, { 0x0029, 0x0034, 0, VR::CS, VM::M1, "PMTFInformation4" }, { 0x0029, 0x0035, 0, VR::UL, VM::M1, "PMTFInformation5" }, { 0x0029, 0x0040, 0, VR::SQ, VM::M1, "ApplicationHeaderSequence" }, { 0x0029, 0x0041, 0, VR::CS, VM::M1, "ApplicationHeaderType" }, { 0x0029, 0x0042, 0, VR::LO, VM::M1, "ApplicationHeaderID" }, { 0x0029, 0x0043, 0, VR::LO, VM::M1, "ApplicationHeaderVersion" }, { 0x0029, 0x0044, 0, VR::OB, VM::M1, "ApplicationHeaderInfo" }, { 0x0029, 0x0050, 0, VR::LO, VM::M8, "WorkflowControlFlags" }, { 0x0029, 0x0051, 0, VR::CS, VM::M1, "ArchiveManagementFlagKeepOnline" }, { 0x0029, 0x0052, 0, VR::CS, VM::M1, "ArchiveManagementFlagDoNotArchive" }, { 0x0029, 0x0053, 0, VR::CS, VM::M1, "ImageLocationStatus" }, { 0x0029, 0x0054, 0, VR::DS, VM::M1, "EstimatedRetrieveTime" }, { 0x0029, 0x0055, 0, VR::DS, VM::M1, "DataSizeOfRetrievedImages" }, { 0x0029, 0x0070, 0, VR::SQ, VM::M1, "SiemensLinkSequence" }, { 0x0029, 0x0071, 0, VR::AT, VM::M1, "ReferencedTag" }, { 0x0029, 0x0072, 0, VR::CS, VM::M1, "ReferencedTagType" }, { 0x0029, 0x0073, 0, VR::UL, VM::M1, "ReferencedValueLength" }, { 0x0029, 0x0074, 0, VR::CS, VM::M1, "ReferencedObjectDeviceType" }, { 0x0029, 0x0075, 0, VR::OB, VM::M1, "ReferencedObjectDeviceLocation" }, { 0x0029, 0x0076, 0, VR::OB, VM::M1, "ReferencedObjectID" }, { 0x0029, 0x0077, 0, VR::UL, VM::M1, "ReferencedObjectOffset" }, }; const unsigned short Dict375TagHashTable[] = { 29, 32, 28, 28, 37, 42, 47, 50, 53, 58, 65, 70, 75, 78, 28, 28, 28, 28, 28, 28, 81, 84, 87, 90, 93, 28, 98, 101, 0, 1, 8, 53, 2, 2, 16, 7, 52, 2, 1, 9, 20, 112, 2, 0, 8, 21, 113, 1, 22, 114, 1, 23, 115, 2, 14, 80, 24, 116, 3, 3, 32, 15, 81, 25, 117, 2, 16, 82, 26, 118, 2, 17, 83, 27, 119, 1, 18, 84, 1, 19, 85, 1, 9, 64, 1, 10, 65, 1, 11, 66, 1, 12, 67, 2, 4, 49, 13, 68, 1, 6, 51, 1, 5, 50, }; const unsigned short Dict375KeyHashTable[] = { 29, 28, 32, 28, 39, 28, 28, 42, 47, 50, 55, 28, 58, 28, 63, 66, 69, 28, 72, 75, 78, 28, 28, 81, 86, 91, 98, 101, 0, 1, 20, 36704, 3, 13, 38981, 18, 63562, 22, 47547, 1, 16, 64752, 2, 11, 8846, 23, 17092, 1, 25, 43532, 2, 1, 44200, 17, 39137, 1, 3, 24054, 2, 10, 53538, 26, 43404, 1, 14, 24568, 1, 2, 55000, 1, 15, 39850, 1, 27, 20951, 1, 9, 15230, 1, 21, 46272, 2, 4, 39385, 19, 6890, 2, 5, 39385, 12, 39660, 3, 0, 4021, 6, 39385, 24, 3366, 1, 7, 39385, 1, 8, 39385, }; vtkDICOMDictionary::Dict Dict375Data = { "SIEMENS MEDCOM HEADER", 28, 28, Dict375TagHashTable, Dict375KeyHashTable, Dict375Contents }; // ----- SIEMENS SYNGO EVIDENCE DOCUMENT DATA ----- const DictEntry Dict376Contents[] = { { 0x0077, 0x0010, 0, VR::LO, VM::M1, "EvidenceDocumentTemplateName" }, { 0x0077, 0x0011, 0, VR::DS, VM::M1, "EvidenceDocumentTemplateVersion" }, { 0x0077, 0x0020, 0, VR::OB, VM::M1, "ClinicalFindingData" }, { 0x0077, 0x0021, 0, VR::OB, VM::M1, "Metadata" }, { 0x0077, 0x0030, 0, VR::DS, VM::M1, "ImplementationVersion" }, { 0x0077, 0x0040, 0, VR::OB, VM::M1, "Predecessor" }, { 0x0077, 0x0050, 0, VR::LO, VM::M1, "LogicalID" }, { 0x0077, 0x0060, 0, VR::OB, VM::M1, "ApplicationData" }, { 0x0077, 0x0070, 0, VR::LO, VM::M1, "OwnerClinicalTaskName" }, { 0x0077, 0x0071, 0, VR::LO, VM::M1, "OwnerTaskName" }, { 0x0077, 0x0072, 0, VR::OB, VM::M1, "OwnerSupportedTemplates" }, { 0x0077, 0x0080, 0, VR::OB, VM::M1, "VolumeCatalog" }, }; const unsigned short Dict376TagHashTable[] = { 12, 12, 13, 16, 21, 24, 27, 32, 12, 12, 39, 42, 0, 1, 2, 32, 2, 3, 33, 6, 80, 1, 11, 128, 1, 10, 114, 2, 0, 16, 9, 113, 3, 1, 17, 5, 64, 8, 112, 1, 4, 48, 1, 7, 96, }; const unsigned short Dict376KeyHashTable[] = { 13, 20, 12, 25, 12, 28, 12, 12, 33, 36, 39, 42, 0, 3, 0, 15331, 5, 22763, 9, 43355, 2, 6, 43689, 10, 53675, 1, 7, 30572, 2, 2, 7034, 4, 56601, 1, 11, 45612, 1, 1, 2600, 1, 3, 2677, 1, 8, 45714, }; vtkDICOMDictionary::Dict Dict376Data = { "SIEMENS SYNGO EVIDENCE DOCUMENT DATA", 12, 12, Dict376TagHashTable, Dict376KeyHashTable, Dict376Contents }; // ----- GEMS_DL_SERIES_01 ----- const DictEntry Dict377Contents[] = { { 0x0015, 0x0085, 0, VR::LO, VM::M1, "SeriesFileName" }, { 0x0015, 0x0087, 0, VR::IS, VM::M1, "NumberOfImages" }, { 0x0015, 0x008C, 0, VR::CS, VM::M1, "SentFlag" }, { 0x0015, 0x008D, 0, VR::US, VM::M1, "ItemLocked" }, { 0x0019, 0x004c, 0, VR::CS, VM::M1, "InternalLabel" }, { 0x0019, 0x004d, 0, VR::CS, VM::M1, "BrowserHide" }, }; const unsigned short Dict377TagHashTable[] = { 7, 12, 15, 6, 18, 21, 0, 2, 1, 135, 4, 76, 1, 5, 77, 1, 0, 133, 1, 3, 141, 1, 2, 140, }; const unsigned short Dict377KeyHashTable[] = { 7, 10, 17, 6, 6, 20, 0, 1, 3, 45009, 3, 1, 37972, 2, 22596, 5, 28427, 1, 4, 7152, 1, 0, 18914, }; vtkDICOMDictionary::Dict Dict377Data = { "GEMS_DL_SERIES_01", 6, 6, Dict377TagHashTable, Dict377KeyHashTable, Dict377Contents }; // ----- Canon Inc. ----- const DictEntry Dict378Contents[] = { { 0x0019, 0x0010, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0013, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0015, 0, VR::DS, VM::M2, "" }, { 0x0019, 0x0016, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0017, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0018, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0019, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x001a, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x001b, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x001c, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001e, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x001f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict378TagHashTable[] = { 14, 17, 22, 27, 30, 33, 36, 39, 13, 42, 45, 13, 48, 0, 1, 6, 25, 2, 4, 23, 5, 24, 2, 3, 22, 8, 27, 1, 7, 26, 1, 12, 33, 1, 9, 28, 1, 11, 31, 1, 10, 30, 1, 0, 16, 1, 1, 19, 1, 2, 21, }; const unsigned short Dict378KeyHashTable[] = { 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 0, 13, 0, 413, 1, 413, 2, 413, 3, 413, 4, 413, 5, 413, 6, 413, 7, 413, 8, 413, 9, 413, 10, 413, 11, 413, 12, 413, }; vtkDICOMDictionary::Dict Dict378Data = { "Canon Inc.", 13, 13, Dict378TagHashTable, Dict378KeyHashTable, Dict378Contents }; // ----- GEMS_GENIE_1 ----- const DictEntry Dict379Contents[] = { { 0x0009, 0x0001, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::LO, VM::M1, "StudyName" }, { 0x0009, 0x0011, 0, VR::SL, VM::M1, "StudyFlags" }, { 0x0009, 0x0012, 0, VR::SL, VM::M1, "StudyType" }, { 0x0009, 0x001e, 0, VR::UI, VM::M1, "DatasetUID" }, { 0x0009, 0x0020, 0, VR::LO, VM::M1, "SeriesObjectName" }, { 0x0009, 0x0021, 0, VR::SL, VM::M1, "SeriesFlags" }, { 0x0009, 0x0022, 0, VR::SH, VM::M1, "UserOrientation" }, { 0x0009, 0x0023, 0, VR::SL, VM::M1, "InitiationType" }, { 0x0009, 0x0024, 0, VR::SL, VM::M1, "InitiationDelay" }, { 0x0009, 0x0025, 0, VR::SL, VM::M1, "InitiationCountRate" }, { 0x0009, 0x0026, 0, VR::SL, VM::M1, "NumberEnergySets" }, { 0x0009, 0x0027, 0, VR::SL, VM::M1, "NumberDetectors" }, { 0x0009, 0x0028, 0, VR::SL, VM::M1, "NumberRRWindows" }, { 0x0009, 0x0029, 0, VR::SL, VM::M1, "NumberMGTimeSlots" }, { 0x0009, 0x002a, 0, VR::SL, VM::M1, "NumberViewSets" }, { 0x0009, 0x002b, 0, VR::LO, VM::M1, "TriggerHistoryUID" }, { 0x0009, 0x002c, 0, VR::LO, VM::M1, "SeriesComments" }, { 0x0009, 0x002d, 0, VR::SL, VM::M1, "TrackBeatAverage" }, { 0x0009, 0x002e, 0, VR::FD, VM::M1, "DistancePrescribed" }, { 0x0009, 0x002f, 0, VR::SL, VM::M1, "TableDirection" }, { 0x0009, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0033, 0, VR::FD, VM::M1, "RotationalContinuousSpeed" }, { 0x0009, 0x0034, 0, VR::SL, VM::M1, "GantryMotionTypeRetired" }, { 0x0009, 0x0035, 0, VR::SL, VM::M1, "GantryLocusType" }, { 0x0009, 0x0037, 0, VR::SL, VM::M1, "StartingHeartRate" }, { 0x0009, 0x0038, 0, VR::SL, VM::M1, "RRWindowWidth" }, { 0x0009, 0x0039, 0, VR::SL, VM::M1, "RRWindowOffset" }, { 0x0009, 0x003a, 0, VR::SL, VM::M1, "PercentCycleImaged" }, { 0x0009, 0x0040, 0, VR::PN, VM::M1, "PatientObjectName" }, { 0x0009, 0x0041, 0, VR::SL, VM::M1, "PatientFlags" }, { 0x0009, 0x0042, 0, VR::DA, VM::M1, "PatientCreationDate" }, { 0x0009, 0x0043, 0, VR::TM, VM::M1, "PatientCreationTime" }, { 0x0009, 0x0044, 0, VR::SL, VM::M1, "NumViewsAcquiredRetired" }, { 0x0009, 0x0045, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0046, 0, VR::UI, VM::M1, "" }, { 0x0011, 0x000a, 0, VR::SL, VM::M1, "SeriesType" }, { 0x0011, 0x000b, 0, VR::SL, VM::M1, "EffectiveSeriesDuration" }, { 0x0011, 0x000c, 0, VR::SL, VM::M1, "NumBeats" }, { 0x0011, 0x000d, 0, VR::LO, VM::M1, "RadioNuclideName" }, { 0x0011, 0x0010, 0, VR::LO, VM::M1, "DatasetObjectName" }, { 0x0011, 0x0011, 0, VR::SL, VM::M1, "DatasetModified" }, { 0x0011, 0x0012, 0, VR::LO, VM::M1, "DatasetName" }, { 0x0011, 0x0013, 0, VR::SL, VM::M1, "DatasetType" }, { 0x0011, 0x0014, 0, VR::LO, VM::M1, "CompletionTime" }, { 0x0011, 0x0015, 0, VR::SL, VM::M1, "DetectorNumber" }, { 0x0011, 0x0016, 0, VR::SL, VM::M1, "EnergyNumber" }, { 0x0011, 0x0017, 0, VR::SL, VM::M1, "RRIntervalWindowNumber" }, { 0x0011, 0x0018, 0, VR::SL, VM::M1, "MGBinNumber" }, { 0x0011, 0x0019, 0, VR::FD, VM::M1, "RadiusOfRotation" }, { 0x0011, 0x001a, 0, VR::SL, VM::M1, "DetectorCountZone" }, { 0x0011, 0x001b, 0, VR::SL, VM::M1, "NumEnergyWindows" }, { 0x0011, 0x001c, 0, VR::SL, VM::M4, "EnergyOffset" }, { 0x0011, 0x001d, 0, VR::SL, VM::M1, "EnergyRange" }, { 0x0011, 0x001e, 0, VR::SL, VM::M4, "EnergyWidthRetired" }, { 0x0011, 0x001f, 0, VR::SL, VM::M1, "ImageOrientation" }, { 0x0011, 0x0021, 0, VR::DS, VM::M1, "AcqZoomRetired" }, { 0x0011, 0x0022, 0, VR::DS, VM::M1, "AcqPanRetired" }, { 0x0011, 0x0023, 0, VR::SL, VM::M1, "UseFOVMask" }, { 0x0011, 0x0024, 0, VR::SL, VM::M1, "FOVMaskYCutoffAngle" }, { 0x0011, 0x0025, 0, VR::SL, VM::M1, "FOVMaskCutoffAngle" }, { 0x0011, 0x0026, 0, VR::SL, VM::M1, "TableOrientation" }, { 0x0011, 0x0027, 0, VR::SL, VM::M2, "ROITopLeft" }, { 0x0011, 0x0028, 0, VR::SL, VM::M2, "ROIBottomRight" }, { 0x0011, 0x0029, 0, VR::SL, VM::M1, "UniformityMean" }, { 0x0011, 0x002a, 0, VR::FD, VM::M1, "PhaseDurationRetired" }, { 0x0011, 0x002c, 0, VR::FD, VM::M1, "ViewXAdjustment" }, { 0x0011, 0x002d, 0, VR::FD, VM::M1, "ViewYAdjustment" }, { 0x0011, 0x002e, 0, VR::SL, VM::M1, "PixelOverflowFlag" }, { 0x0011, 0x002f, 0, VR::SL, VM::M1, "OverflowLevel" }, { 0x0011, 0x0030, 0, VR::LO, VM::M1, "PictureObjectName" }, { 0x0011, 0x0031, 0, VR::LO, VM::M1, "AcquisitionParentUID" }, { 0x0011, 0x0032, 0, VR::LO, VM::M1, "ProcessingParentUID" }, { 0x0011, 0x0033, 0, VR::LO, VM::M1, "EnergyCorrectName" }, { 0x0011, 0x0034, 0, VR::LO, VM::M1, "SpatialCorrectName" }, { 0x0011, 0x0035, 0, VR::LO, VM::M1, "TuningCalibName" }, { 0x0011, 0x0036, 0, VR::LO, VM::M1, "UniformityCorrectName" }, { 0x0011, 0x0037, 0, VR::LT, VM::M1, "AcquisitionSpecificCorrectName" }, { 0x0011, 0x0038, 0, VR::SL, VM::M1, "ByteOrder" }, { 0x0011, 0x0039, 0, VR::SL, VM::M1, "CompressionType" }, { 0x0011, 0x003a, 0, VR::SL, VM::M1, "PictureFormat" }, { 0x0011, 0x003b, 0, VR::FD, VM::M1, "PixelScale" }, { 0x0011, 0x003c, 0, VR::FD, VM::M1, "PixelOffset" }, { 0x0011, 0x003d, 0, VR::SL, VM::M4, "EnergyPeakRetired" }, { 0x0011, 0x003e, 0, VR::SL, VM::M1, "FOVShape" }, { 0x0011, 0x003f, 0, VR::SL, VM::M1, "DatasetFlags" }, { 0x0011, 0x0040, 0, VR::LO, VM::M1, "ViewingObjectName" }, { 0x0011, 0x0041, 0, VR::SL, VM::M1, "OrientationAngle" }, { 0x0011, 0x0042, 0, VR::FD, VM::M1, "RotationAngle" }, { 0x0011, 0x0043, 0, VR::SL, VM::M1, "WindowInverseFlag" }, { 0x0011, 0x0044, 0, VR::FD, VM::M1, "ThresholdCenter" }, { 0x0011, 0x0045, 0, VR::FD, VM::M1, "ThresholdWidth" }, { 0x0011, 0x0046, 0, VR::SL, VM::M1, "InterpolationType" }, { 0x0011, 0x0050, 0, VR::LO, VM::M1, "WhereObjectName" }, { 0x0011, 0x0055, 0, VR::FD, VM::M1, "Period" }, { 0x0011, 0x0056, 0, VR::FD, VM::M1, "ElapsedTime" }, { 0x0011, 0x0057, 0, VR::FD, VM::M2, "FOV" }, { 0x0011, 0x0061, 0, VR::SL, VM::M1, "ImageSize" }, { 0x0011, 0x0062, 0, VR::FD, VM::M1, "LinearFOV" }, { 0x0011, 0x0063, 0, VR::FD, VM::M1, "SpatialOffset" }, { 0x0011, 0x0064, 0, VR::FD, VM::M1, "SpatialOrientation" }, { 0x0011, 0x0065, 0, VR::LO, VM::M1, "ReferenceDatasetUID" }, { 0x0011, 0x0066, 0, VR::SH, VM::M1, "StarcamReferenceDataset" }, { 0x0011, 0x0067, 0, VR::SL, VM::M1, "ReferenceFrameNumber" }, { 0x0011, 0x0068, 0, VR::SL, VM::M1, "CursorLength" }, { 0x0011, 0x0069, 0, VR::SL, VM::M1, "NumberOfCursors" }, { 0x0011, 0x006a, 0, VR::SL, VM::M1, "CursorCoordinates" }, { 0x0011, 0x006b, 0, VR::SL, VM::M1, "ReconOptionsFlag" }, { 0x0011, 0x006c, 0, VR::FD, VM::M1, "MotionThreshold" }, { 0x0011, 0x006d, 0, VR::UI, VM::M1, "MotionCurveUID" }, { 0x0011, 0x006e, 0, VR::SL, VM::M1, "ReconType" }, { 0x0011, 0x006f, 0, VR::SL, VM::M1, "PreFilterType" }, { 0x0011, 0x0071, 0, VR::SL, VM::M1, "BackProjFilterType" }, { 0x0011, 0x0072, 0, VR::SL, VM::M1, "ReconArc" }, { 0x0011, 0x0073, 0, VR::FD, VM::M1, "ReconPanAPOffset" }, { 0x0011, 0x0074, 0, VR::FD, VM::M1, "ReconPanLROffset" }, { 0x0011, 0x0075, 0, VR::FD, VM::M1, "ReconArea" }, { 0x0011, 0x0076, 0, VR::SL, VM::M1, "StartView" }, { 0x0011, 0x0077, 0, VR::SL, VM::M1, "AttenuationType" }, { 0x0011, 0x0078, 0, VR::SL, VM::M1, "DualEnergyProcessing" }, { 0x0011, 0x0079, 0, VR::SH, VM::M1, "PreFilterParam" }, { 0x0011, 0x007a, 0, VR::SH, VM::M1, "PreFilterParam2" }, { 0x0011, 0x007b, 0, VR::SH, VM::M1, "BackProjFilterParam" }, { 0x0011, 0x007c, 0, VR::SH, VM::M1, "BackProjFilterParam2" }, { 0x0011, 0x007d, 0, VR::SH, VM::M1, "AttenuationCoef" }, { 0x0011, 0x007e, 0, VR::SL, VM::M1, "RefSliceWidth" }, { 0x0011, 0x007f, 0, VR::FD, VM::M1, "RefTransPixelVolume" }, { 0x0011, 0x0081, 0, VR::SH, VM::M1, "AttenuationThreshold" }, { 0x0011, 0x0082, 0, VR::FD, VM::M1, "InterpolationDistance" }, { 0x0011, 0x0083, 0, VR::FD, VM::M1, "InterpolationCenterX" }, { 0x0011, 0x0084, 0, VR::FD, VM::M1, "InterpolationCenterY" }, { 0x0011, 0x0085, 0, VR::SL, VM::M1, "QuantFilterFlag" }, { 0x0011, 0x0086, 0, VR::SL, VM::M1, "HeadConversion" }, { 0x0011, 0x0087, 0, VR::SL, VM::M1, "SliceWidthPixels" }, { 0x0011, 0x0088, 0, VR::SL, VM::M1, "RfmtrTransRef" }, { 0x0011, 0x0089, 0, VR::FD, VM::M1, "RfmtrTransRefmm" }, { 0x0011, 0x008a, 0, VR::SL, VM::M1, "TwoLineTransRef" }, { 0x0011, 0x008b, 0, VR::SL, VM::M1, "ThreeDZero" }, { 0x0011, 0x008c, 0, VR::SL, VM::M1, "ThreeDZeroLength" }, { 0x0011, 0x008d, 0, VR::SL, VM::M1, "ThreeDZeroIn" }, { 0x0013, 0x0010, 0, VR::FD, VM::M2, "DigitalFOV" }, { 0x0013, 0x0011, 0, VR::SL, VM::M1, "SourceTranslator" }, { 0x0013, 0x0012, 0, VR::SL, VM::M1, "RALFlags" }, { 0x0013, 0x0013, 0, VR::SQ, VM::M1, "eNTEGRAFrameSequence" }, { 0x0013, 0x0014, 0, VR::SL, VM::M1, "OriginalImageNumber" }, { 0x0013, 0x0015, 0, VR::FD, VM::M1, "Fscalar" }, { 0x0013, 0x0016, 0, VR::SL, VM::M1, "AutoTrackPeak" }, { 0x0013, 0x0017, 0, VR::SL, VM::M1, "AutoTrackWidth" }, { 0x0013, 0x0018, 0, VR::FD, VM::M1, "TransmissionScanTime" }, { 0x0013, 0x0019, 0, VR::FD, VM::M1, "TransmissionMaskWidth" }, { 0x0013, 0x001a, 0, VR::FD, VM::M1, "CopperAttenuatorThickness" }, { 0x0013, 0x001b, 0, VR::FD, VM::M1, "DetAngSeparation" }, { 0x0013, 0x001c, 0, VR::SL, VM::M1, "AxialAcceptanceAngle" }, { 0x0013, 0x001d, 0, VR::SL, VM::M1, "ThetaAcceptanceValue" }, { 0x0013, 0x001e, 0, VR::FD, VM::M1TN, "TomoViewOffset" }, { 0x0013, 0x0020, 0, VR::FD, VM::M1, "AcceptedBeatsTime" }, { 0x0013, 0x0021, 0, VR::FD, VM::M2, "Threshold" }, { 0x0013, 0x0022, 0, VR::FD, VM::M2, "LinearDepth" }, { 0x0013, 0x0023, 0, VR::LO, VM::M1, "UnifDateTime" }, { 0x0013, 0x0024, 0, VR::SL, VM::M1, "SeriesAcceptedBeats" }, { 0x0013, 0x0025, 0, VR::SL, VM::M1, "SeriesRejectedBeats" }, { 0x0013, 0x0026, 0, VR::LT, VM::M1, "StudyComments" }, { 0x0015, 0x0010, 0, VR::SL, VM::M1, "FrameTerminationCondition" }, { 0x0015, 0x0011, 0, VR::SL, VM::M1, "FrameTerminationValue" }, { 0x0015, 0x0012, 0, VR::SL, VM::M1, "NumECTPhases" }, { 0x0015, 0x0013, 0, VR::SL, VM::M1, "NumWBScans" }, { 0x0015, 0x0014, 0, VR::SL, VM::M1, "ECTPhaseNum" }, { 0x0015, 0x0015, 0, VR::SL, VM::M1, "WBScanNum" }, { 0x0015, 0x0016, 0, VR::SL, VM::M1, "CombHeadNumber" }, { 0x0015, 0x0017, 0, VR::UL, VM::M1, "PrecedingBeat" }, { 0x0019, 0x005f, 0, VR::SQ, VM::M1, "" }, { 0x0033, 0x0007, 0, VR::LO, VM::M1TN, "OriginalSOPInstanceUID" }, { 0x0033, 0x0008, 0, VR::CS, VM::M1, "eNTEGRADataObjectType" }, { 0x0033, 0x0010, 0, VR::SL, VM::M1, "Modified" }, { 0x0033, 0x0011, 0, VR::LO, VM::M1, "Name" }, { 0x0033, 0x0016, 0, VR::LO, VM::M1, "ProtocolDataUID" }, { 0x0033, 0x0017, 0, VR::SH, VM::M1, "Date" }, { 0x0033, 0x0018, 0, VR::SH, VM::M1, "Time" }, { 0x0033, 0x0019, 0, VR::UL, VM::M1, "ProtocolDataFlags" }, { 0x0033, 0x001a, 0, VR::UL, VM::M1, "ProtocolName" }, { 0x0033, 0x001b, 0, VR::LO, VM::M1, "RelevantDataUID" }, { 0x0033, 0x001c, 0, VR::LO, VM::M1, "BulkData" }, { 0x0033, 0x001d, 0, VR::SL, VM::M1TN, "IntData" }, { 0x0033, 0x001e, 0, VR::FD, VM::M1TN, "DoubleData" }, { 0x0033, 0x001f, 0, VR::OB, VM::M1, "StringData" }, { 0x0033, 0x0020, 0, VR::LT, VM::M1TN, "BulkDataFormat" }, { 0x0033, 0x0021, 0, VR::LT, VM::M1TN, "IntDataFormat" }, { 0x0033, 0x0022, 0, VR::LT, VM::M1TN, "DoubleDataFormat" }, { 0x0033, 0x0023, 0, VR::LT, VM::M1TN, "StringDataFormat" }, { 0x0033, 0x0024, 0, VR::LT, VM::M1, "Description" }, { 0x0033, 0x0030, 0, VR::UL, VM::M1, "AllocateTriggerBuffer" }, { 0x0033, 0x0033, 0, VR::UL, VM::M1, "NumberOfTriggers" }, { 0x0033, 0x0034, 0, VR::UL, VM::M1, "TriggerSize" }, { 0x0033, 0x0035, 0, VR::UL, VM::M1, "TriggerDataSize" }, { 0x0033, 0x0036, 0, VR::OB, VM::M1, "TriggerData" }, { 0x0035, 0x0001, 0, VR::FD, VM::M1TN, "StartAngle" }, { 0x0055, 0x0012, 0, VR::SQ, VM::M1, "eNTEGRAEnergyWindowInformationSequence" }, { 0x0055, 0x0013, 0, VR::SQ, VM::M1, "eNTEGRAEnergyWindowRangeSequence" }, { 0x0055, 0x0022, 0, VR::SQ, VM::M1, "eNTEGRADetectorInformationSequence" }, { 0x0055, 0x0052, 0, VR::SQ, VM::M1, "eNTEGRARotationInformationSequence" }, { 0x0055, 0x0062, 0, VR::SQ, VM::M1, "eNTEGRAGatedInformationSequence" }, { 0x0055, 0x0063, 0, VR::SQ, VM::M1, "eNTEGRADataInformationSequence" }, { 0x0055, 0x0064, 0, VR::SQ, VM::M1, "SDODoubleDataSequence" }, { 0x0055, 0x0065, 0, VR::SQ, VM::M1, "" }, { 0x5001, 0x0001, 0, VR::SL, VM::M1, "Modified" }, { 0x5001, 0x0002, 0, VR::LO, VM::M1, "Name" }, { 0x5001, 0x0003, 0, VR::SL, VM::M1, "Cid" }, { 0x5001, 0x0004, 0, VR::SL, VM::M1, "Srid" }, { 0x5001, 0x0005, 0, VR::LO, VM::M1, "SOPClassUID" }, { 0x5001, 0x0006, 0, VR::LO, VM::M1, "SOPInstanceUID" }, { 0x5001, 0x0007, 0, VR::SL, VM::M1, "CurveType" }, { 0x5001, 0x0008, 0, VR::SL, VM::M1, "GraphType" }, { 0x5001, 0x0009, 0, VR::LO, VM::M1, "Legend" }, { 0x5001, 0x000a, 0, VR::LO, VM::M1, "XUnits" }, { 0x5001, 0x000b, 0, VR::LO, VM::M1, "YUnits" }, { 0x5001, 0x000c, 0, VR::SL, VM::M1, "Edit" }, { 0x5001, 0x000d, 0, VR::SL, VM::M1, "Suspend" }, { 0x5001, 0x000e, 0, VR::SL, VM::M1, "StyleLine" }, { 0x5001, 0x000f, 0, VR::SL, VM::M1, "StyleFill" }, { 0x5001, 0x0010, 0, VR::LO, VM::M1, "StyleColour" }, { 0x5001, 0x0011, 0, VR::SL, VM::M1, "StyleWidth" }, { 0x5001, 0x0012, 0, VR::SL, VM::M1, "StylePoint" }, { 0x5001, 0x0013, 0, VR::LO, VM::M1, "StylePColour" }, { 0x5001, 0x0014, 0, VR::SL, VM::M1, "StylePSize" }, { 0x5001, 0x0015, 0, VR::SL, VM::M1, "Segments" }, { 0x5001, 0x0016, 0, VR::SL, VM::M1, "SegType" }, { 0x5001, 0x0017, 0, VR::FD, VM::M1TN, "SegStart" }, { 0x5001, 0x0018, 0, VR::FD, VM::M1TN, "SegEnd" }, { 0x5001, 0x0019, 0, VR::SL, VM::M1TN, "SegStyleLine" }, { 0x5001, 0x001a, 0, VR::SL, VM::M1TN, "SegStyleFill" }, { 0x5001, 0x001b, 0, VR::LO, VM::M1, "SegStyleColour" }, { 0x5001, 0x001c, 0, VR::SL, VM::M1TN, "SegStyleWidth" }, { 0x5001, 0x001d, 0, VR::SL, VM::M1TN, "SegStylePoint" }, { 0x5001, 0x001e, 0, VR::SL, VM::M1, "SegStylePColour" }, { 0x5001, 0x001f, 0, VR::SL, VM::M1, "SegStylePSize" }, { 0x5001, 0x0020, 0, VR::LO, VM::M1, "SegName" }, { 0x5001, 0x0021, 0, VR::SL, VM::M1TN, "SegAllowDirInt" }, { 0x5001, 0x0022, 0, VR::SL, VM::M1, "TextAnnots" }, { 0x5001, 0x0023, 0, VR::FD, VM::M1TN, "TxtX" }, { 0x5001, 0x0024, 0, VR::FD, VM::M1TN, "TxtY" }, { 0x5001, 0x0025, 0, VR::LO, VM::M1, "TxtText" }, { 0x5001, 0x0026, 0, VR::LO, VM::M1, "TxtName" }, { 0x5001, 0x0030, 0, VR::LO, VM::M1, "ROIName" }, { 0x5001, 0x0031, 0, VR::LO, VM::M1, "DerivedFromImageUID" }, { 0x5001, 0x0032, 0, VR::SL, VM::M1TN, "DerivedFromImages" }, { 0x5001, 0x0033, 0, VR::UL, VM::M1, "CurveFlags" }, { 0x5001, 0x0034, 0, VR::LO, VM::M1, "CurveName" }, { 0x5001, 0x0035, 0, VR::LO, VM::M1, "DatasetName" }, { 0x5001, 0x0036, 0, VR::LO, VM::M1, "CurveUID" }, { 0x5001, 0x0037, 0, VR::FD, VM::M1, "ROIArea" }, { 0x5001, 0x0038, 0, VR::LO, VM::M1, "Modified" }, { 0x5001, 0x0039, 0, VR::LO, VM::M1, "Name" }, { 0x5001, 0x003a, 0, VR::LO, VM::M1, "SoftwareVersion" }, { 0x5001, 0x003b, 0, VR::SH, VM::M1, "StartDate" }, { 0x5001, 0x003c, 0, VR::SH, VM::M1, "CompletionDate" }, { 0x5001, 0x003d, 0, VR::LO, VM::M1, "DetectorName" }, { 0x5001, 0x0041, 0, VR::SL, VM::M1, "Modified" }, { 0x5001, 0x0042, 0, VR::LO, VM::M1, "Name" }, { 0x5001, 0x0043, 0, VR::SL, VM::M1, "Name" }, { 0x5001, 0x0044, 0, VR::SL, VM::M1, "Name" }, { 0x5001, 0x0045, 0, VR::LO, VM::M1, "SOPClassUID" }, { 0x5001, 0x0046, 0, VR::LO, VM::M1, "SOPInstanceUID" }, { 0x5001, 0x0047, 0, VR::LO, VM::M1, "NormalColor" }, { 0x5001, 0x0048, 0, VR::LT, VM::M1, "NameFont" }, { 0x5001, 0x0049, 0, VR::SL, VM::M1, "FillPattern" }, { 0x5001, 0x004a, 0, VR::SL, VM::M1, "LineStyle" }, { 0x5001, 0x004b, 0, VR::SL, VM::M1, "LineDashLength" }, { 0x5001, 0x004c, 0, VR::SL, VM::M1, "LineThickness" }, { 0x5001, 0x004d, 0, VR::SL, VM::M1, "Interactivity" }, { 0x5001, 0x004e, 0, VR::SL, VM::M1, "NamePos" }, { 0x5001, 0x004f, 0, VR::SL, VM::M1, "NameDisplay" }, { 0x5001, 0x0050, 0, VR::LO, VM::M1, "Label" }, { 0x5001, 0x0051, 0, VR::SL, VM::M1TN, "BpSeg" }, { 0x5001, 0x0052, 0, VR::US, VM::M1TN, "BpSegPairs" }, { 0x5001, 0x0053, 0, VR::SL, VM::M1, "SeedSpace" }, { 0x5001, 0x0054, 0, VR::FD, VM::M1TN, "Seeds" }, { 0x5001, 0x0055, 0, VR::SL, VM::M1TN, "Shape" }, { 0x5001, 0x0056, 0, VR::FD, VM::M1TN, "ShapeTilt" }, { 0x5001, 0x0059, 0, VR::SL, VM::M1TN, "ShapePtsSpace" }, { 0x5001, 0x005a, 0, VR::SL, VM::M1TN, "ShapeCtrlPtsCounts" }, { 0x5001, 0x005b, 0, VR::FD, VM::M1TN, "ShapeCtrlPts" }, { 0x5001, 0x005c, 0, VR::SL, VM::M1, "ShapeCtrlPSpace" }, { 0x5001, 0x005d, 0, VR::SL, VM::M1, "ROIFlags" }, { 0x5001, 0x005e, 0, VR::SL, VM::M1, "FrameNumber" }, { 0x5001, 0x005f, 0, VR::SL, VM::M1, "ID" }, { 0x5001, 0x0060, 0, VR::LO, VM::M1TN, "DatasetROIMapping" }, }; const unsigned short Dict379TagHashTable[] = { 287, 296, 303, 310, 319, 326, 335, 344, 355, 362, 367, 372, 377, 380, 385, 390, 395, 398, 401, 404, 286, 286, 286, 407, 412, 415, 418, 421, 426, 429, 286, 286, 432, 437, 442, 449, 456, 463, 470, 475, 480, 487, 494, 501, 508, 515, 522, 529, 536, 545, 552, 557, 564, 571, 576, 583, 590, 593, 598, 601, 606, 611, 616, 621, 624, 286, 286, 286, 286, 627, 630, 635, 642, 645, 648, 651, 654, 657, 660, 286, 663, 666, 669, 672, 675, 678, 681, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 684, 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, 717, 720, 723, 726, 286, 729, 732, 735, 738, 741, 744, 749, 752, 755, 758, 761, 764, 767, 770, 773, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 776, 779, 784, 789, 792, 797, 802, 807, 812, 817, 822, 827, 832, 835, 838, 843, 848, 851, 854, 857, 860, 863, 866, 286, 286, 869, 872, 875, 878, 881, 884, 887, 890, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 893, 286, 896, 899, 902, 905, 908, 911, 914, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 947, 950, 953, 956, 959, 962, 965, 968, 971, 974, 977, 980, 983, 986, 989, 992, 995, 998, 1001, 286, 1004, 286, 286, 286, 286, 286, 286, 286, 286, 1007, 1010, 1013, 1016, 1019, 1022, 1025, 1028, 1031, 1034, 1037, 1040, 1043, 1046, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 0, 4, 41, 17, 143, 19, 167, 21, 191, 51, 3, 40, 16, 142, 18, 166, 20, 3, 43, 19, 141, 17, 169, 23, 4, 42, 18, 140, 16, 168, 22, 190, 48, 3, 45, 21, 147, 23, 163, 17, 4, 44, 20, 146, 22, 162, 16, 194, 54, 4, 47, 23, 145, 21, 165, 19, 193, 53, 5, 46, 22, 144, 20, 164, 18, 192, 52, 199, 82, 3, 0, 1, 49, 25, 151, 27, 2, 48, 24, 150, 26, 2, 51, 27, 149, 25, 2, 50, 26, 148, 24, 1, 53, 29, 2, 52, 28, 154, 30, 2, 55, 31, 153, 29, 2, 54, 30, 152, 28, 1, 188, 35, 1, 187, 34, 1, 186, 33, 1, 185, 32, 2, 4, 30, 189, 36, 1, 2, 17, 1, 1, 16, 1, 37, 11, 2, 3, 18, 36, 10, 1, 39, 13, 1, 38, 12, 2, 14, 41, 71, 49, 2, 13, 40, 70, 48, 3, 16, 43, 73, 51, 174, 17, 3, 15, 42, 72, 50, 173, 16, 3, 18, 45, 75, 53, 176, 23, 3, 17, 44, 74, 52, 175, 22, 2, 20, 47, 77, 55, 2, 19, 46, 76, 54, 3, 6, 33, 79, 57, 180, 27, 3, 5, 32, 78, 56, 179, 26, 3, 8, 35, 81, 59, 178, 25, 3, 7, 34, 80, 58, 177, 24, 3, 10, 37, 83, 61, 184, 31, 3, 9, 36, 82, 60, 183, 30, 3, 12, 39, 85, 63, 182, 29, 3, 11, 38, 84, 62, 181, 28, 4, 27, 57, 56, 33, 158, 35, 203, 101, 3, 26, 56, 157, 34, 202, 100, 2, 58, 35, 156, 33, 3, 28, 58, 57, 34, 155, 32, 3, 60, 37, 171, 7, 195, 1, 2, 59, 36, 161, 38, 3, 62, 39, 160, 37, 201, 99, 3, 61, 38, 159, 36, 200, 98, 1, 64, 41, 2, 21, 48, 63, 40, 1, 22, 51, 2, 65, 42, 172, 8, 2, 24, 53, 67, 45, 2, 23, 52, 66, 44, 2, 25, 55, 69, 47, 1, 68, 46, 1, 93, 80, 1, 94, 85, 2, 95, 86, 196, 18, 3, 96, 87, 170, 95, 197, 19, 1, 29, 64, 1, 30, 65, 1, 31, 66, 1, 32, 67, 1, 33, 68, 1, 34, 69, 1, 35, 70, 1, 86, 64, 1, 87, 65, 1, 88, 66, 1, 89, 67, 1, 90, 68, 1, 91, 69, 1, 92, 70, 1, 112, 113, 1, 113, 114, 1, 114, 115, 1, 115, 116, 1, 116, 117, 1, 117, 118, 1, 118, 119, 1, 119, 120, 1, 120, 121, 1, 121, 122, 1, 122, 123, 1, 123, 124, 1, 124, 125, 1, 125, 126, 1, 126, 127, 1, 97, 97, 1, 98, 98, 1, 99, 99, 1, 100, 100, 1, 101, 101, 2, 102, 102, 198, 34, 1, 103, 103, 1, 104, 104, 1, 105, 105, 1, 106, 106, 1, 107, 107, 1, 108, 108, 1, 109, 109, 1, 110, 110, 1, 111, 111, 1, 129, 131, 2, 128, 130, 256, 65, 2, 127, 129, 257, 66, 1, 258, 67, 2, 133, 135, 259, 68, 2, 132, 134, 260, 69, 2, 131, 133, 261, 70, 2, 130, 132, 262, 71, 2, 137, 139, 263, 72, 2, 136, 138, 264, 73, 2, 135, 137, 265, 74, 2, 134, 136, 266, 75, 1, 267, 76, 1, 268, 77, 2, 139, 141, 269, 78, 2, 138, 140, 270, 79, 1, 271, 80, 1, 272, 81, 1, 273, 82, 1, 274, 83, 1, 275, 84, 1, 276, 85, 1, 277, 86, 1, 278, 89, 1, 279, 90, 1, 280, 91, 1, 281, 92, 1, 282, 93, 1, 283, 94, 1, 284, 95, 1, 285, 96, 1, 204, 1, 1, 206, 3, 1, 205, 2, 1, 208, 5, 1, 207, 4, 1, 210, 7, 1, 209, 6, 1, 212, 9, 1, 211, 8, 1, 214, 11, 1, 213, 10, 1, 216, 13, 1, 215, 12, 1, 218, 15, 1, 217, 14, 1, 220, 17, 1, 219, 16, 1, 222, 19, 1, 221, 18, 1, 224, 21, 1, 223, 20, 1, 226, 23, 1, 225, 22, 1, 228, 25, 1, 227, 24, 1, 230, 27, 1, 229, 26, 1, 232, 29, 1, 231, 28, 1, 234, 31, 1, 233, 30, 1, 236, 33, 1, 235, 32, 1, 238, 35, 1, 237, 34, 1, 240, 37, 1, 239, 36, 1, 241, 38, 1, 243, 49, 1, 242, 48, 1, 245, 51, 1, 244, 50, 1, 247, 53, 1, 246, 52, 1, 249, 55, 1, 248, 54, 1, 251, 57, 1, 250, 56, 1, 253, 59, 1, 252, 58, 1, 255, 61, 1, 254, 60, }; const unsigned short Dict379KeyHashTable[] = { 286, 287, 290, 286, 295, 286, 286, 298, 301, 286, 306, 286, 309, 312, 315, 286, 318, 286, 286, 323, 286, 328, 286, 286, 331, 334, 337, 286, 340, 345, 350, 355, 286, 358, 361, 286, 286, 368, 371, 378, 385, 388, 395, 286, 398, 401, 286, 286, 404, 411, 414, 417, 422, 425, 286, 428, 431, 434, 286, 286, 439, 442, 286, 286, 445, 450, 453, 286, 456, 463, 470, 286, 473, 476, 481, 486, 489, 286, 492, 497, 500, 286, 286, 509, 286, 286, 512, 515, 518, 286, 521, 524, 529, 534, 537, 540, 543, 550, 286, 286, 286, 286, 286, 286, 286, 553, 556, 561, 286, 286, 566, 286, 286, 569, 576, 579, 584, 286, 589, 592, 286, 286, 595, 598, 286, 605, 286, 286, 610, 615, 622, 625, 630, 286, 633, 638, 641, 286, 646, 286, 649, 652, 286, 655, 658, 286, 661, 286, 286, 666, 286, 669, 672, 689, 694, 697, 702, 286, 286, 707, 286, 710, 286, 715, 718, 721, 286, 724, 727, 286, 732, 286, 286, 735, 286, 738, 745, 754, 757, 286, 760, 286, 763, 286, 770, 775, 778, 791, 286, 796, 286, 286, 286, 286, 799, 286, 806, 286, 286, 286, 286, 286, 813, 818, 821, 826, 829, 832, 286, 286, 286, 286, 835, 840, 286, 286, 843, 846, 286, 286, 851, 854, 857, 286, 860, 286, 286, 865, 870, 875, 878, 286, 881, 884, 899, 904, 286, 907, 286, 286, 910, 913, 286, 922, 927, 286, 932, 937, 286, 940, 945, 948, 951, 958, 286, 286, 286, 286, 286, 965, 970, 286, 977, 286, 984, 987, 286, 286, 286, 990, 286, 993, 996, 999, 286, 1002, 1005, 286, 1008, 286, 286, 1011, 1014, 1017, 1022, 1027, 0, 1, 143, 9385, 2, 67, 29477, 119, 65480, 1, 191, 20941, 1, 89, 61466, 2, 94, 45760, 242, 29340, 1, 86, 61706, 1, 85, 61738, 1, 78, 34748, 1, 76, 43008, 2, 165, 21173, 198, 17366, 2, 138, 59000, 207, 31742, 1, 188, 41035, 1, 195, 35647, 1, 98, 5623, 1, 264, 1416, 2, 24, 36029, 272, 36243, 2, 28, 41496, 197, 34853, 2, 124, 56488, 225, 12908, 1, 48, 60754, 1, 47, 14969, 3, 14, 51054, 213, 25033, 217, 27186, 1, 116, 3656, 3, 184, 24776, 209, 22876, 261, 22876, 3, 92, 40316, 153, 40852, 186, 59178, 1, 103, 44576, 3, 8, 43749, 137, 15764, 230, 3456, 1, 95, 1276, 1, 9, 64128, 1, 214, 30798, 3, 52, 45133, 269, 58140, 279, 16825, 1, 187, 26119, 1, 122, 7381, 2, 61, 15933, 275, 39885, 1, 128, 4942, 1, 147, 5857, 1, 271, 10345, 1, 182, 2855, 2, 66, 5025, 233, 59664, 1, 151, 41479, 1, 232, 52943, 2, 42, 45290, 247, 45290, 1, 79, 20020, 1, 50, 19359, 3, 115, 8594, 136, 8348, 234, 49426, 3, 6, 19076, 26, 56594, 278, 35846, 1, 276, 40248, 1, 5, 63088, 2, 62, 4494, 246, 32607, 2, 240, 29216, 282, 24839, 1, 157, 53067, 1, 111, 50604, 2, 75, 30604, 185, 19772, 1, 142, 38623, 4, 99, 8603, 117, 17601, 139, 58140, 169, 45695, 1, 224, 41780, 1, 96, 21059, 1, 120, 11946, 1, 252, 40017, 1, 105, 45587, 2, 77, 63882, 283, 785, 2, 87, 14738, 249, 27770, 1, 148, 9165, 1, 133, 11898, 1, 102, 9261, 3, 113, 6471, 152, 58351, 212, 21302, 1, 1, 43377, 1, 18, 30844, 2, 146, 51083, 226, 1340, 2, 208, 14414, 260, 14414, 1, 201, 38421, 3, 216, 17653, 237, 12250, 285, 30072, 1, 51, 5780, 2, 65, 8308, 69, 22497, 2, 20, 3267, 172, 10555, 1, 129, 47768, 1, 130, 47768, 1, 64, 33103, 3, 114, 46948, 164, 60211, 167, 43812, 2, 23, 44462, 104, 52844, 2, 60, 17931, 220, 42629, 3, 11, 22645, 37, 19101, 235, 12062, 1, 10, 18056, 2, 31, 8427, 90, 63064, 1, 107, 31953, 2, 155, 34069, 178, 58388, 1, 175, 24378, 2, 54, 15973, 196, 44462, 1, 72, 31470, 1, 110, 6071, 1, 25, 29918, 1, 254, 20057, 1, 91, 26895, 2, 93, 10349, 125, 12288, 1, 273, 10704, 1, 16, 54453, 8, 154, 1577, 174, 31049, 205, 31049, 251, 31049, 257, 31049, 258, 31049, 259, 31049, 280, 63915, 2, 68, 25746, 81, 38581, 1, 219, 22200, 2, 19, 62148, 134, 30051, 2, 82, 33623, 101, 27776, 1, 83, 51168, 2, 118, 58663, 277, 13287, 1, 243, 64769, 1, 32, 10467, 1, 245, 7543, 1, 12, 55558, 2, 192, 15258, 248, 32078, 1, 274, 25900, 1, 281, 42963, 3, 135, 33760, 171, 50022, 194, 13342, 4, 36, 25983, 44, 22097, 80, 9619, 158, 2454, 1, 267, 60972, 1, 46, 36845, 1, 88, 6556, 3, 22, 1046, 57, 54679, 180, 634, 2, 53, 5486, 183, 57455, 1, 189, 63272, 6, 38, 33819, 166, 30028, 173, 48650, 204, 48650, 250, 48650, 256, 48650, 2, 145, 59117, 202, 56977, 1, 215, 29929, 3, 33, 14625, 109, 55744, 190, 55061, 3, 56, 17851, 193, 41115, 270, 35556, 2, 29, 63276, 74, 9554, 1, 40, 41700, 2, 73, 55269, 222, 17369, 1, 253, 15310, 1, 221, 14375, 1, 266, 44480, 2, 161, 63640, 179, 4350, 1, 223, 10858, 1, 126, 4938, 2, 132, 42478, 227, 61535, 1, 45, 49626, 1, 160, 42716, 1, 41, 5449, 2, 144, 47037, 241, 28445, 2, 200, 24970, 238, 31891, 2, 239, 31891, 255, 40386, 1, 176, 29793, 1, 27, 9119, 1, 140, 34477, 7, 0, 18, 21, 18, 34, 18, 35, 18, 170, 18, 203, 18, 263, 32406, 2, 108, 20241, 229, 58375, 1, 163, 45706, 1, 70, 3882, 1, 55, 56974, 4, 2, 6403, 59, 56039, 112, 9052, 121, 20718, 2, 100, 27290, 162, 44681, 2, 7, 53154, 284, 20497, 2, 49, 64658, 106, 36332, 1, 236, 32325, 2, 39, 32784, 58, 20184, 1, 63, 33260, 1, 43, 46135, 3, 127, 45743, 199, 9121, 244, 61877, 3, 4, 41864, 97, 7277, 149, 2417, 2, 168, 59153, 262, 5771, 3, 210, 33452, 265, 13555, 268, 29560, 3, 15, 2911, 123, 12598, 177, 31833, 1, 17, 553, 1, 206, 21050, 1, 231, 15660, 1, 228, 59129, 1, 71, 62059, 1, 150, 57736, 1, 211, 22813, 1, 156, 58689, 1, 141, 46523, 1, 181, 57350, 1, 131, 32918, 2, 84, 16621, 218, 26431, 2, 3, 44222, 159, 35938, 2, 13, 21968, 30, 61371, }; vtkDICOMDictionary::Dict Dict379Data = { "GEMS_GENIE_1", 286, 286, Dict379TagHashTable, Dict379KeyHashTable, Dict379Contents }; // ----- CT IMG ACQUISITION ----- const DictEntry Dict380Contents[] = { { 0x7029, 0x0002, 0, VR::FL, VM::M1, "DetectorElementTransverseSpacing" }, { 0x7029, 0x0006, 0, VR::FL, VM::M1, "DetectorElementAxialSpacing" }, { 0x7029, 0x000B, 0, VR::CS, VM::M1, "DetectorShape" }, { 0x7029, 0x0010, 0, VR::US, VM::M1, "NumberofDetectorRows" }, { 0x7029, 0x0011, 0, VR::US, VM::M1, "NumberofDetectorColumns" }, { 0x7031, 0x0001, 0, VR::FL, VM::M1, "DetectorFocalCenterAngularPosition" }, { 0x7031, 0x0002, 0, VR::FL, VM::M1, "DetectorFocalCenterAxialPosition" }, { 0x7031, 0x0003, 0, VR::FL, VM::M1, "DetectorFocalCenterRadialDistance" }, { 0x7031, 0x0031, 0, VR::FL, VM::M1, "ConstantRadialDistance" }, { 0x7031, 0x0033, 0, VR::FL, VM::M1TN, "DetectorCentralElement" }, { 0x7033, 0x000B, 0, VR::FL, VM::M1, "SourceAxialPositionShift" }, { 0x7033, 0x000C, 0, VR::FL, VM::M1, "SourceAngularPositionShift" }, { 0x7033, 0x000D, 0, VR::FL, VM::M1, "SourceRadialDistanceShift" }, { 0x7033, 0x000E, 0, VR::CS, VM::M1, "FlyingFocalSpotMode" }, { 0x7033, 0x0013, 0, VR::US, VM::M1, "NumberofSourceAngularSteps" }, { 0x7033, 0x0061, 0, VR::US, VM::M1, "NumberofSources" }, { 0x7033, 0x0063, 0, VR::US, VM::M1, "SourceIndex" }, { 0x7033, 0x0065, 0, VR::FL, VM::M1TN, "PhotonStatistics" }, { 0x7037, 0x0009, 0, VR::CS, VM::M1, "TypeofProjectionData" }, { 0x7037, 0x000A, 0, VR::CS, VM::M1, "TypeofProjectionGeometry" }, { 0x7039, 0x0003, 0, VR::CS, VM::M1, "BeamHardeningCorrectionFlag" }, { 0x7039, 0x0004, 0, VR::CS, VM::M1, "GainCorrectionFlag" }, { 0x7039, 0x0005, 0, VR::CS, VM::M1, "DarkFieldCorrectionFlag" }, { 0x7039, 0x0006, 0, VR::CS, VM::M1, "FlatFieldCorrectionFlag" }, { 0x7039, 0x0007, 0, VR::CS, VM::M1, "BadPixelCorrectionFlag" }, { 0x7039, 0x0008, 0, VR::CS, VM::M1, "ScatterCorrectionFlag" }, { 0x7039, 0x0009, 0, VR::CS, VM::M1, "LogFlag" }, { 0x7041, 0x0003, 0, VR::US, VM::M1, "NumberofLesions" }, { 0x7041, 0x0004, 0, VR::ST, VM::M1, "LesionPathologyArray" }, { 0x7041, 0x0005, 0, VR::FL, VM::M1TN, "LesionAngularPositionArray" }, { 0x7041, 0x0006, 0, VR::FL, VM::M1TN, "LesionAxialPositionArray" }, { 0x7041, 0x0007, 0, VR::FL, VM::M1TN, "LesionRadialDistanceArray" }, }; const unsigned short Dict380TagHashTable[] = { 33, 32, 38, 43, 46, 49, 52, 55, 32, 32, 32, 58, 32, 32, 32, 61, 64, 69, 74, 77, 32, 32, 32, 82, 85, 90, 93, 32, 96, 99, 106, 113, 0, 2, 8, 49, 14, 19, 2, 2, 11, 9, 51, 1, 27, 3, 1, 28, 4, 1, 29, 5, 1, 30, 6, 1, 31, 7, 1, 0, 2, 1, 1, 6, 2, 5, 1, 26, 9, 2, 16, 99, 25, 8, 1, 7, 3, 2, 6, 2, 15, 97, 1, 17, 101, 2, 4, 17, 10, 11, 1, 3, 16, 1, 20, 3, 1, 22, 5, 3, 13, 14, 19, 10, 21, 4, 3, 12, 13, 18, 9, 24, 7, 2, 11, 12, 23, 6, }; const unsigned short Dict380KeyHashTable[] = { 33, 38, 41, 32, 44, 47, 52, 55, 60, 65, 32, 32, 68, 71, 78, 32, 81, 32, 84, 89, 32, 32, 94, 32, 97, 32, 32, 100, 103, 106, 113, 32, 0, 2, 24, 33915, 27, 55861, 1, 26, 13018, 1, 23, 40542, 1, 5, 5741, 2, 19, 43492, 28, 34785, 1, 31, 55547, 2, 8, 60381, 15, 31635, 2, 3, 63269, 17, 12517, 1, 6, 53763, 1, 12, 3316, 3, 14, 62790, 25, 25536, 29, 46276, 1, 16, 7091, 1, 2, 8860, 2, 9, 16138, 30, 21279, 2, 11, 20548, 18, 37884, 1, 21, 2742, 1, 10, 29809, 1, 0, 5262, 1, 20, 3334, 3, 1, 49312, 7, 6736, 22, 60115, 2, 4, 38638, 13, 25005, }; vtkDICOMDictionary::Dict Dict380Data = { "CT IMG ACQUISITION", 32, 32, Dict380TagHashTable, Dict380KeyHashTable, Dict380Contents }; // ----- SCHICK TECHNOLOGIES - Image Security Creator ID ----- const DictEntry Dict381Contents[] = { { 0x0029, 0x0001, 0, VR::UL, VM::M1, "" }, }; const unsigned short Dict381TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict381KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict381Data = { "SCHICK TECHNOLOGIES - Image Security Creator ID", 1, 1, Dict381TagHashTable, Dict381KeyHashTable, Dict381Contents }; // ----- SIEMENS MR VA0 GEN ----- const DictEntry Dict382Contents[] = { { 0x0019, 0x0010, 0, VR::DS, VM::M1, "TotalMeasurementTimeNominal" }, { 0x0019, 0x0011, 0, VR::DS, VM::M1, "TotalMeasurementTimeCurrent" }, { 0x0019, 0x0012, 0, VR::DS, VM::M1, "StartDelayTime" }, { 0x0019, 0x0013, 0, VR::DS, VM::M1, "DwellTime" }, { 0x0019, 0x0014, 0, VR::IS, VM::M1, "NumberOfPhases" }, { 0x0019, 0x0016, 0, VR::UL, VM::M2, "SequenceControlMask" }, { 0x0019, 0x0018, 0, VR::UL, VM::M1, "MeasurementStatusMask" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "NumberOfFourierLinesNominal" }, { 0x0019, 0x0021, 0, VR::IS, VM::M1, "NumberOfFourierLinesCurrent" }, { 0x0019, 0x0026, 0, VR::IS, VM::M1, "NumberOfFourierLinesAfterZero" }, { 0x0019, 0x0028, 0, VR::IS, VM::M1, "FirstMeasuredFourierLine" }, { 0x0019, 0x0030, 0, VR::IS, VM::M1, "AcquisitionColumns" }, { 0x0019, 0x0031, 0, VR::IS, VM::M1, "ReconstructionColumns" }, { 0x0019, 0x0040, 0, VR::IS, VM::M1, "ArrayCoilElementNumber" }, { 0x0019, 0x0041, 0, VR::UL, VM::M1, "ArrayCoilElementSelectMask" }, { 0x0019, 0x0042, 0, VR::UL, VM::M1, "ArrayCoilElementDataMask" }, { 0x0019, 0x0043, 0, VR::IS, VM::M1TN, "ArrayCoilElementToADCConnect" }, { 0x0019, 0x0044, 0, VR::DS, VM::M1TN, "ArrayCoilElementNoiseLevel" }, { 0x0019, 0x0045, 0, VR::IS, VM::M1, "ArrayCoilADCPairNumber" }, { 0x0019, 0x0046, 0, VR::UL, VM::M1, "ArrayCoilCombinationMask" }, { 0x0019, 0x0050, 0, VR::IS, VM::M1, "NumberOfAveragesCurrent" }, { 0x0019, 0x0060, 0, VR::DS, VM::M1, "FlipAngle" }, { 0x0019, 0x0070, 0, VR::IS, VM::M1, "NumberOfPrescans" }, { 0x0019, 0x0081, 0, VR::CS, VM::M1, "FilterTypeForRawData" }, { 0x0019, 0x0082, 0, VR::DS, VM::M1TN, "FilterParameterForRawData" }, { 0x0019, 0x0083, 0, VR::CS, VM::M1, "FilterTypeForImageData" }, { 0x0019, 0x0084, 0, VR::DS, VM::M1TN, "FilterParameterForImageData" }, { 0x0019, 0x0085, 0, VR::CS, VM::M1, "FilterTypeForPhaseCorrection" }, { 0x0019, 0x0086, 0, VR::DS, VM::M1TN, "FilterParameterForPhaseCorrection" }, { 0x0019, 0x0087, 0, VR::CS, VM::M1, "NormalizationFilterTypeForImageData" }, { 0x0019, 0x0088, 0, VR::DS, VM::M1TN, "NormalizationFilterParameterForImageData" }, { 0x0019, 0x0090, 0, VR::IS, VM::M1, "NumberOfSaturationRegions" }, { 0x0019, 0x0091, 0, VR::DS, VM::M6, "SaturationPhaseEncodingVectorSagittalComponent" }, { 0x0019, 0x0092, 0, VR::DS, VM::M6, "SaturationReadoutVectorSagittalComponent" }, { 0x0019, 0x0093, 0, VR::IS, VM::M1, "EPIStimulationMonitorMode" }, { 0x0019, 0x0094, 0, VR::DS, VM::M1, "ImageRotationAngle" }, { 0x0019, 0x0096, 0, VR::UL, VM::M3, "CoilIDMask" }, { 0x0019, 0x0097, 0, VR::UL, VM::M2, "CoilClassMask" }, { 0x0019, 0x0098, 0, VR::DS, VM::M3, "CoilPosition" }, { 0x0019, 0x00a0, 0, VR::DS, VM::M1, "EPIReconstructionPhase" }, { 0x0019, 0x00a1, 0, VR::DS, VM::M1, "EPIReconstructionSlope" }, { 0x0021, 0x0020, 0, VR::IS, VM::M1, "PhaseCorrectionRowsSequence" }, { 0x0021, 0x0021, 0, VR::IS, VM::M1, "PhaseCorrectionColumnsSequence" }, { 0x0021, 0x0022, 0, VR::IS, VM::M1, "PhaseCorrectionRowsReconstruction" }, { 0x0021, 0x0024, 0, VR::IS, VM::M1, "PhaseCorrectionColumnsReconstruction" }, { 0x0021, 0x0030, 0, VR::IS, VM::M1, "NumberOf3DRawPartitionsNominal" }, { 0x0021, 0x0031, 0, VR::IS, VM::M1, "NumberOf3DRawPartitionsCurrent" }, { 0x0021, 0x0034, 0, VR::IS, VM::M1, "NumberOf3DImagePartitions" }, { 0x0021, 0x0036, 0, VR::IS, VM::M1, "Actual3DImagePartitionNumber" }, { 0x0021, 0x0039, 0, VR::DS, VM::M1, "SlabThickness" }, { 0x0021, 0x0040, 0, VR::IS, VM::M1, "NumberOfSlicesNominal" }, { 0x0021, 0x0041, 0, VR::IS, VM::M1, "NumberOfSlicesCurrent" }, { 0x0021, 0x0042, 0, VR::IS, VM::M1, "CurrentSliceNumber" }, { 0x0021, 0x0043, 0, VR::IS, VM::M1, "CurrentGroupNumber" }, { 0x0021, 0x0044, 0, VR::DS, VM::M1, "CurrentSliceDistanceFactor" }, { 0x0021, 0x0045, 0, VR::IS, VM::M1, "MIPStartRow" }, { 0x0021, 0x0046, 0, VR::IS, VM::M1, "MIPStopRow" }, { 0x0021, 0x0047, 0, VR::IS, VM::M1, "MIPStartColumn" }, { 0x0021, 0x0048, 0, VR::IS, VM::M1, "MIPStartColumn" }, { 0x0021, 0x0049, 0, VR::IS, VM::M1, "MIPStartSlice" }, { 0x0021, 0x004a, 0, VR::IS, VM::M1, "MIPStartSlice" }, { 0x0021, 0x004f, 0, VR::CS, VM::M1, "OrderofSlices" }, { 0x0021, 0x0050, 0, VR::UL, VM::M1TN, "SignalMask" }, { 0x0021, 0x0052, 0, VR::IS, VM::M1, "DelayAfterTrigger" }, { 0x0021, 0x0053, 0, VR::IS, VM::M1, "RRInterval" }, { 0x0021, 0x0054, 0, VR::DS, VM::M1, "NumberOfTriggerPulses" }, { 0x0021, 0x0056, 0, VR::DS, VM::M1, "RepetitionTimeEffective" }, { 0x0021, 0x0057, 0, VR::LO, VM::M1, "GatePhase" }, { 0x0021, 0x0058, 0, VR::DS, VM::M1, "GateThreshold" }, { 0x0021, 0x0059, 0, VR::DS, VM::M1, "GatedRatio" }, { 0x0021, 0x0060, 0, VR::IS, VM::M1, "NumberOfInterpolatedImages" }, { 0x0021, 0x0070, 0, VR::IS, VM::M1, "NumberOfEchoes" }, { 0x0021, 0x0072, 0, VR::DS, VM::M1, "SecondRepetitionTime" }, { 0x0021, 0x0073, 0, VR::DS, VM::M1, "SecondRepetitionTime" }, { 0x0021, 0x0080, 0, VR::IS, VM::M1, "CardiacCode" }, { 0x0021, 0x0091, 0, VR::DS, VM::M6, "SaturationPhaseEncodingVectorTransverseComponent" }, { 0x0021, 0x0092, 0, VR::DS, VM::M6, "SaturationReadoutVectorTransverseComponent" }, { 0x0021, 0x0093, 0, VR::DS, VM::M1, "EPIChangeValueOfMagnitude" }, { 0x0021, 0x0094, 0, VR::DS, VM::M1, "EPIChangeValueOfXComponent" }, { 0x0021, 0x0095, 0, VR::DS, VM::M1, "EPIChangeValueOfYComponent" }, { 0x0021, 0x0096, 0, VR::DS, VM::M1, "EPIChangeValueOfZComponent" }, }; const unsigned short Dict382TagHashTable[] = { 82, 85, 94, 97, 81, 100, 81, 103, 106, 111, 116, 121, 126, 129, 134, 137, 144, 151, 156, 159, 164, 169, 176, 179, 186, 193, 81, 81, 81, 81, 198, 201, 81, 204, 207, 210, 81, 213, 216, 219, 224, 229, 81, 81, 81, 81, 81, 81, 81, 232, 235, 81, 81, 81, 81, 238, 241, 246, 251, 254, 257, 81, 260, 263, 266, 81, 269, 81, 81, 81, 81, 272, 275, 280, 81, 283, 286, 289, 292, 81, 295, 0, 1, 42, 33, 4, 6, 24, 41, 32, 72, 114, 74, 128, 1, 73, 115, 1, 43, 34, 1, 44, 36, 1, 13, 64, 2, 1, 17, 14, 65, 2, 0, 16, 15, 66, 2, 3, 19, 16, 67, 2, 2, 18, 17, 68, 1, 18, 69, 2, 4, 20, 19, 70, 1, 77, 147, 3, 5, 22, 50, 64, 76, 146, 3, 46, 49, 51, 65, 75, 145, 2, 45, 48, 52, 66, 1, 53, 67, 2, 54, 68, 80, 150, 2, 55, 69, 79, 149, 3, 47, 52, 56, 70, 78, 148, 1, 57, 71, 3, 22, 112, 48, 54, 58, 72, 3, 40, 161, 49, 57, 59, 73, 2, 39, 160, 60, 74, 1, 61, 79, 1, 62, 80, 1, 63, 82, 1, 64, 83, 1, 65, 84, 1, 66, 86, 1, 67, 87, 2, 21, 96, 68, 88, 2, 12, 49, 69, 89, 1, 11, 48, 1, 10, 40, 1, 38, 152, 1, 34, 147, 2, 8, 33, 33, 146, 2, 7, 32, 32, 145, 1, 31, 144, 1, 37, 151, 1, 36, 150, 1, 35, 148, 1, 9, 38, 1, 70, 96, 1, 30, 136, 1, 25, 131, 2, 20, 80, 24, 130, 1, 23, 129, 1, 29, 135, 1, 28, 134, 1, 27, 133, 1, 26, 132, 1, 71, 112, }; const unsigned short Dict382KeyHashTable[] = { 81, 82, 81, 81, 87, 94, 97, 81, 81, 81, 100, 109, 114, 119, 122, 81, 127, 81, 130, 81, 133, 81, 136, 141, 81, 144, 147, 81, 81, 81, 81, 150, 155, 158, 81, 161, 81, 166, 169, 172, 179, 81, 182, 185, 81, 81, 188, 81, 191, 198, 201, 206, 211, 216, 81, 223, 226, 81, 233, 81, 238, 81, 241, 244, 81, 81, 249, 254, 257, 260, 271, 274, 81, 277, 81, 81, 81, 280, 283, 288, 291, 0, 2, 9, 39899, 24, 16854, 3, 39, 51922, 61, 57061, 63, 23766, 1, 18, 26771, 1, 48, 38582, 4, 55, 58967, 59, 43535, 60, 43535, 68, 22105, 2, 43, 7024, 74, 42972, 2, 57, 9995, 58, 9995, 1, 49, 16614, 2, 5, 56973, 11, 35185, 1, 4, 64167, 1, 8, 2075, 1, 65, 55567, 2, 27, 36055, 50, 26558, 1, 37, 18151, 1, 2, 35032, 1, 47, 57424, 2, 30, 36216, 75, 48139, 1, 52, 34865, 1, 7, 28279, 2, 10, 53636, 41, 8927, 1, 32, 913, 1, 25, 27483, 3, 51, 60226, 67, 51344, 70, 64493, 1, 78, 38846, 1, 64, 59844, 1, 79, 23932, 1, 80, 9018, 3, 22, 16434, 72, 51187, 73, 51187, 1, 20, 32947, 2, 13, 59660, 26, 50430, 2, 35, 65388, 36, 5490, 2, 1, 14109, 44, 41037, 3, 16, 27941, 19, 22117, 76, 8881, 1, 33, 26107, 3, 56, 31425, 71, 58946, 77, 52977, 2, 38, 57911, 40, 32270, 1, 66, 29004, 1, 46, 62934, 2, 15, 39260, 53, 19599, 2, 54, 51232, 62, 55549, 1, 0, 40313, 1, 69, 48757, 5, 3, 40311, 6, 17238, 12, 55443, 14, 31932, 23, 30883, 1, 17, 37109, 1, 28, 56357, 1, 42, 20815, 1, 45, 23602, 2, 29, 16554, 31, 3958, 1, 34, 49082, 1, 21, 15575, }; vtkDICOMDictionary::Dict Dict382Data = { "SIEMENS MR VA0 GEN", 81, 81, Dict382TagHashTable, Dict382KeyHashTable, Dict382Contents }; // ----- Hologic ----- const DictEntry Dict383Contents[] = { { 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" }, { 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" }, { 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" }, { 0x0021, 0x0001, 0, VR::LT, VM::M1, "ImageAnalysisDataInXML" }, { 0x0023, 0x0000, 0, VR::LO, VM::M1, "EncodingSchemeVersion" }, { 0x0023, 0x0001, 0, VR::LO, VM::M1, "PFileName" }, { 0x0023, 0x0002, 0, VR::OB, VM::M1, "PFileData" }, { 0x0023, 0x0003, 0, VR::UL, VM::M1, "PFileLength" }, { 0x0023, 0x0004, 0, VR::OB, VM::M1, "RFileData" }, { 0x0023, 0x0005, 0, VR::UL, VM::M1, "RFileLength" }, { 0x0029, 0x0000, 0, VR::OB, VM::M1, "GraphBitmapData" }, { 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" }, }; const unsigned short Dict383TagHashTable[] = { 12, 13, 16, 19, 22, 25, 12, 30, 33, 38, 41, 44, 0, 1, 2, 0, 1, 9, 5, 1, 8, 4, 1, 11, 1, 2, 0, 0, 10, 0, 1, 1, 0, 2, 3, 1, 7, 3, 1, 6, 2, 1, 5, 1, 1, 4, 0, }; const unsigned short Dict383KeyHashTable[] = { 12, 13, 12, 18, 21, 12, 24, 27, 12, 30, 33, 38, 0, 2, 8, 19844, 9, 18946, 1, 4, 54723, 1, 0, 12614, 1, 5, 1260, 1, 2, 46831, 1, 1, 54398, 2, 3, 5451, 10, 30347, 3, 6, 36867, 7, 33057, 11, 10475, }; vtkDICOMDictionary::Dict Dict383Data = { "Hologic", 12, 12, Dict383TagHashTable, Dict383KeyHashTable, Dict383Contents }; // ----- GEMS_DL_PATNT_01 ----- const DictEntry Dict384Contents[] = { { 0x0011, 0x0080, 0, VR::UI, VM::M1, "PatientInstanceUid" }, { 0x0011, 0x0081, 0, VR::IS, VM::M1, "LastStudyNumber" }, { 0x0011, 0x0082, 0, VR::CS, VM::M1, "PatientRepaired" }, { 0x0011, 0x0083, 0, VR::CS, VM::M1, "LockDemographics" }, }; const unsigned short Dict384TagHashTable[] = { 5, 8, 11, 14, 0, 1, 3, 131, 1, 2, 130, 1, 1, 129, 1, 0, 128, }; const unsigned short Dict384KeyHashTable[] = { 5, 8, 11, 14, 0, 1, 3, 21937, 1, 0, 49412, 1, 2, 12345, 1, 1, 37238, }; vtkDICOMDictionary::Dict Dict384Data = { "GEMS_DL_PATNT_01", 4, 4, Dict384TagHashTable, Dict384KeyHashTable, Dict384Contents }; // ----- SIEMENS SYNGO FRAME SET ----- const DictEntry Dict385Contents[] = { { 0x0029, 0x0010, 0, VR::SQ, VM::M1, "ImageFrameSequence" }, { 0x0029, 0x0012, 0, VR::CS, VM::M1, "TypeOfProgression" }, { 0x0029, 0x0014, 0, VR::IS, VM::M1, "RepresentationLevel" }, { 0x0029, 0x0016, 0, VR::SQ, VM::M1, "RepresentationInformationSequence" }, { 0x0029, 0x0018, 0, VR::IS, VM::M1, "NumberOfRepresentations" }, { 0x0029, 0x0020, 0, VR::IS, VM::M1, "RepresentationPixelOffset" }, }; const unsigned short Dict385TagHashTable[] = { 6, 7, 6, 12, 6, 19, 0, 2, 2, 20, 4, 24, 3, 0, 16, 3, 22, 5, 32, 1, 1, 18, }; const unsigned short Dict385KeyHashTable[] = { 6, 7, 6, 12, 15, 20, 0, 2, 4, 10332, 5, 36944, 1, 3, 18894, 2, 0, 45420, 2, 21842, 1, 1, 34947, }; vtkDICOMDictionary::Dict Dict385Data = { "SIEMENS SYNGO FRAME SET", 6, 6, Dict385TagHashTable, Dict385KeyHashTable, Dict385Contents }; // ----- SIEMENS MR CM 03 ----- const DictEntry Dict386Contents[] = { { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict386TagHashTable[] = { 3, 6, 0, 1, 0, 1, 1, 1, 2, }; const unsigned short Dict386KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict386Data = { "SIEMENS MR CM 03", 2, 2, Dict386TagHashTable, Dict386KeyHashTable, Dict386Contents }; // ----- SIEMENS Ultrasound SC2000 ----- const DictEntry Dict387Contents[] = { { 0x0019, 0x002D, 0, VR::US, VM::M1, "BModeTintIndex" }, { 0x0019, 0x0072, 0, VR::US, VM::M1, "DopplerTintIndex" }, { 0x0019, 0x0088, 0, VR::US, VM::M1, "MModeTintIndex" }, { 0x0019, 0x0089, 0, VR::LO, VM::M1, "" }, { 0x0119, 0x0000, 0, VR::LO, VM::M1, "AcousticMetaInformationVersion" }, { 0x0119, 0x0001, 0, VR::OB, VM::M1, "CommonAcousticMetaInformation" }, { 0x0119, 0x0002, 0, VR::SQ, VM::M1, "MultiStreamSequence" }, { 0x0119, 0x0003, 0, VR::SQ, VM::M1, "AcousticDataSequence" }, { 0x0119, 0x0004, 0, VR::OB, VM::M1, "PerTransactionAcousticControlInformation" }, { 0x0119, 0x0005, 0, VR::UL, VM::M1, "AcousticDataOffset" }, { 0x0119, 0x0006, 0, VR::UL, VM::M1, "AcousticDataLength" }, { 0x0119, 0x0007, 0, VR::UL, VM::M1, "FooterOffset" }, { 0x0119, 0x0008, 0, VR::UL, VM::M1, "FooterLength" }, { 0x0119, 0x0009, 0, VR::SS, VM::M1, "AcousticStreamNumber" }, { 0x0119, 0x0010, 0, VR::SH, VM::M1, "AcousticStreamType" }, { 0x0119, 0x0011, 0, VR::UN, VM::M1, "StageTimerTime" }, { 0x0119, 0x0012, 0, VR::UN, VM::M1, "StopWatchTime" }, { 0x0119, 0x0013, 0, VR::IS, VM::M1, "VolumeRate" }, { 0x0119, 0x0021, 0, VR::SH, VM::M1, "" }, { 0x0129, 0x0000, 0, VR::SQ, VM::M1, "MPRViewSequence" }, { 0x0129, 0x0002, 0, VR::UI, VM::M1, "BookmarkUID" }, { 0x0129, 0x0003, 0, VR::UN, VM::M1, "PlaneOriginVector" }, { 0x0129, 0x0004, 0, VR::UN, VM::M1, "RowVector" }, { 0x0129, 0x0005, 0, VR::UN, VM::M1, "ColumnVector" }, { 0x0129, 0x0006, 0, VR::SQ, VM::M1, "VisualizationSequence" }, { 0x0129, 0x0007, 0, VR::UI, VM::M1, "BookmarkUID" }, { 0x0129, 0x0008, 0, VR::OB, VM::M1, "VisualizationInformation" }, { 0x0129, 0x0009, 0, VR::SQ, VM::M1, "ApplicationStateSequence" }, { 0x0129, 0x0010, 0, VR::OB, VM::M1, "ApplicationStateInformation" }, { 0x0129, 0x0011, 0, VR::SQ, VM::M1, "ReferencedBookmarkSequence" }, { 0x0129, 0x0012, 0, VR::UI, VM::M1, "ReferencedBookmarkUID" }, { 0x0129, 0x0020, 0, VR::SQ, VM::M1, "CineParametersSequence" }, { 0x0129, 0x0021, 0, VR::OB, VM::M1, "CineParametersSchema" }, { 0x0129, 0x0022, 0, VR::OB, VM::M1, "ValuesOfCineParameters" }, { 0x0129, 0x0029, 0, VR::OB, VM::M1, "" }, { 0x0129, 0x0030, 0, VR::CS, VM::M1, "RawDataObjectType" }, { 0x0139, 0x0001, 0, VR::SL, VM::M1, "PhysioCaptureROI" }, { 0x0149, 0x0001, 0, VR::FD, VM::M1TN, "VectorOfBROIPoints" }, { 0x0149, 0x0002, 0, VR::FD, VM::M1TN, "StartEndTimestampsOfStripStream" }, { 0x0149, 0x0003, 0, VR::FD, VM::M1TN, "TimestampsOfVisibleRWaves" }, { 0x7FD1, 0x0001, 0, VR::OB, VM::M1, "AcousticImageAndFooterData" }, { 0x7FD1, 0x0009, 0, VR::UI, VM::M1, "VolumeVersionID" }, { 0x7FD1, 0x0010, 0, VR::OB, VM::M1, "VolumePayload" }, { 0x7FD1, 0x0011, 0, VR::OB, VM::M1, "AfterPayload" }, }; const unsigned short Dict387TagHashTable[] = { 44, 44, 44, 44, 45, 50, 55, 58, 65, 74, 44, 77, 80, 83, 86, 89, 92, 95, 98, 103, 106, 109, 114, 119, 44, 124, 127, 130, 133, 136, 44, 44, 139, 142, 145, 148, 44, 151, 154, 157, 160, 44, 44, 163, 0, 2, 15, 17, 32, 33, 2, 14, 16, 31, 32, 1, 17, 19, 3, 16, 18, 33, 34, 40, 1, 4, 0, 45, 18, 33, 29, 17, 36, 1, 1, 28, 16, 1, 30, 18, 1, 13, 9, 1, 12, 8, 1, 3, 137, 1, 2, 136, 1, 9, 5, 1, 8, 4, 2, 1, 114, 11, 7, 1, 10, 6, 1, 5, 1, 2, 4, 0, 35, 48, 2, 7, 3, 42, 16, 2, 6, 2, 43, 17, 1, 37, 1, 1, 38, 2, 1, 39, 3, 1, 27, 9, 1, 26, 8, 1, 23, 5, 1, 22, 4, 1, 25, 7, 1, 24, 6, 1, 19, 0, 1, 21, 3, 1, 20, 2, 1, 34, 41, 1, 41, 9, }; const unsigned short Dict387KeyHashTable[] = { 45, 44, 44, 44, 48, 55, 64, 44, 67, 72, 44, 44, 44, 75, 82, 44, 85, 88, 44, 44, 91, 94, 97, 102, 44, 107, 110, 113, 44, 118, 123, 126, 131, 44, 134, 139, 44, 142, 44, 44, 147, 150, 44, 153, 0, 1, 38, 22699, 3, 8, 51596, 19, 10643, 21, 32185, 4, 6, 46644, 17, 17579, 20, 50210, 25, 50210, 1, 23, 19368, 2, 22, 14702, 41, 1806, 1, 33, 11239, 3, 3, 122, 18, 122, 34, 122, 1, 1, 11883, 1, 10, 58441, 1, 9, 60492, 1, 24, 21733, 1, 31, 43373, 2, 12, 28128, 35, 56809, 2, 11, 30179, 29, 25604, 1, 13, 44861, 1, 14, 51463, 2, 27, 52530, 40, 31323, 2, 15, 24721, 16, 17775, 1, 37, 17890, 2, 0, 40467, 42, 62542, 1, 28, 48944, 2, 2, 50113, 5, 10711, 1, 39, 51843, 2, 32, 13683, 43, 57965, 1, 30, 23230, 1, 26, 15743, 3, 4, 39934, 7, 3558, 36, 52207, }; vtkDICOMDictionary::Dict Dict387Data = { "SIEMENS Ultrasound SC2000", 44, 44, Dict387TagHashTable, Dict387KeyHashTable, Dict387Contents }; // ----- TOSHIBA_MEC_1.0 ----- const DictEntry Dict388Contents[] = { { 0x0009, 0x0001, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x0009, 0x0003, 0, VR::US, VM::M1TN, "" }, { 0x0009, 0x0004, 0, VR::US, VM::M1TN, "" }, { 0x0011, 0x0001, 0, VR::LT, VM::M1, "" }, { 0x0011, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0001, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x0021, 0x0001, 0, VR::US, VM::M1TN, "" }, { 0x0021, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x0021, 0x0003, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0001, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0003, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0010, 0, VR::US, VM::M1TN, "" }, }; const unsigned short Dict388TagHashTable[] = { 15, 16, 19, 22, 25, 32, 35, 15, 40, 43, 46, 49, 52, 55, 15, 0, 1, 4, 1, 1, 8, 1, 1, 12, 2, 3, 5, 2, 10, 3, 13, 3, 1, 9, 2, 2, 11, 1, 14, 16, 1, 0, 1, 1, 6, 1, 1, 2, 3, 1, 1, 2, 1, 7, 2, 1, 3, 4, }; const unsigned short Dict388KeyHashTable[] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 15, 15, 15, 0, 15, 0, 358, 1, 358, 2, 358, 3, 358, 4, 358, 5, 358, 6, 358, 7, 358, 8, 358, 9, 358, 10, 358, 11, 358, 12, 358, 13, 358, 14, 358, }; vtkDICOMDictionary::Dict Dict388Data = { "TOSHIBA_MEC_1.0", 15, 15, Dict388TagHashTable, Dict388KeyHashTable, Dict388Contents }; // ----- SIEMENS MED SMS USG S2000 3D VOLUME ----- const DictEntry Dict389Contents[] = { { 0x0039, 0x0050, 0, VR::LO, VM::M1, "PrivateCreatorVersionOfBookmark" }, { 0x0039, 0x0051, 0, VR::US, VM::M1, "BCutPlaneEnable" }, { 0x0039, 0x0052, 0, VR::US, VM::M1, "BMprColorMapIndex" }, { 0x0039, 0x0053, 0, VR::US, VM::M1, "BMprDynamicRangeDb" }, { 0x0039, 0x0054, 0, VR::US, VM::M1, "BMprGrayMapIndex" }, { 0x0039, 0x0055, 0, VR::US, VM::M1, "BVolumeRenderMode" }, { 0x0039, 0x0056, 0, VR::US, VM::M1, "BVrBrightness" }, { 0x0039, 0x0057, 0, VR::US, VM::M1, "BVrContrast" }, { 0x0039, 0x0058, 0, VR::US, VM::M1, "BVrColorMapIndex" }, { 0x0039, 0x0059, 0, VR::US, VM::M1, "BVrDynamicRangeDb" }, { 0x0039, 0x005a, 0, VR::US, VM::M1, "BVrGrayMapIndex" }, { 0x0039, 0x005b, 0, VR::US, VM::M1, "BVrGrayMapIndex" }, { 0x0039, 0x005c, 0, VR::US, VM::M1, "BVrThresholdHigh" }, { 0x0039, 0x005d, 0, VR::US, VM::M1, "BVrThresholdLow" }, { 0x0039, 0x005e, 0, VR::US, VM::M1, "BPreProcessFilterMix" }, { 0x0039, 0x005f, 0, VR::US, VM::M1, "CCutPlaneEnable" }, { 0x0039, 0x0060, 0, VR::US, VM::M1, "CFrontClipMode" }, { 0x0039, 0x0061, 0, VR::US, VM::M1, "CMprColorMapIndex" }, { 0x0039, 0x0062, 0, VR::US, VM::M1, "CMprColorFlowPriorityIndex" }, { 0x0039, 0x0063, 0, VR::US, VM::M1, "CVolumeRenderMode" }, { 0x0039, 0x0064, 0, VR::US, VM::M1, "CVrColorMapIndex" }, { 0x0039, 0x0065, 0, VR::US, VM::M1, "CVrColorFlowPriorityIndex" }, { 0x0039, 0x0066, 0, VR::US, VM::M1, "CVrOpacity" }, { 0x0039, 0x0067, 0, VR::US, VM::M1, "CVrThresholdHigh" }, { 0x0039, 0x0068, 0, VR::US, VM::M1, "CVrThresholdLow" }, { 0x0039, 0x0069, 0, VR::US, VM::M1, "VoiMode" }, { 0x0039, 0x006a, 0, VR::US, VM::M1, "VoiRotationOffsetDeg" }, { 0x0039, 0x006b, 0, VR::FD, VM::M1, "VoiSizeRatioX" }, { 0x0039, 0x006c, 0, VR::FD, VM::M1, "VoiSizeRatioY" }, { 0x0039, 0x006d, 0, VR::FD, VM::M1, "VoiSizeRatioZ" }, { 0x0039, 0x006e, 0, VR::US, VM::M1, "VoiSyncPlane" }, { 0x0039, 0x006f, 0, VR::US, VM::M1, "VoiViewMode" }, { 0x0039, 0x0070, 0, VR::FD, VM::M1TN, "VrOrientationA" }, { 0x0039, 0x0071, 0, VR::FD, VM::M1TN, "MprOrientationA" }, { 0x0039, 0x0072, 0, VR::FD, VM::M1, "VrOffsetVector" }, { 0x0039, 0x0073, 0, VR::FD, VM::M1, "BlendingRatio" }, { 0x0039, 0x0074, 0, VR::US, VM::M1, "FusionBlendMode" }, { 0x0039, 0x0075, 0, VR::FD, VM::M1, "QualityFactor" }, { 0x0039, 0x0076, 0, VR::US, VM::M1, "RendererType" }, { 0x0039, 0x0077, 0, VR::US, VM::M1, "SliceMode" }, { 0x0039, 0x0078, 0, VR::US, VM::M1, "ActiveQuad" }, { 0x0039, 0x0079, 0, VR::US, VM::M1, "ScreenMode" }, { 0x0039, 0x007a, 0, VR::US, VM::M1, "CutPlaneSide" }, { 0x0039, 0x007b, 0, VR::US, VM::M1, "WireframeMode" }, { 0x0039, 0x007c, 0, VR::US, VM::M1, "CrossmarkMode" }, { 0x0039, 0x007d, 0, VR::US, VM::M1, "MprDisplayType" }, { 0x0039, 0x007e, 0, VR::US, VM::M1, "VolumeDisplayType" }, { 0x0039, 0x007f, 0, VR::US, VM::M1, "LastReset" }, { 0x0039, 0x0080, 0, VR::US, VM::M1, "LastNonFullScreenMode" }, { 0x0039, 0x0081, 0, VR::US, VM::M1, "MprToolIndex" }, { 0x0039, 0x0082, 0, VR::US, VM::M1, "VoiToolIndex" }, { 0x0039, 0x0083, 0, VR::US, VM::M1, "ToolLoopMode" }, { 0x0039, 0x0084, 0, VR::US, VM::M1, "VolumeArbMode" }, { 0x0039, 0x0085, 0, VR::US, VM::M1, "MprZoomEn" }, { 0x0039, 0x0086, 0, VR::US, VM::M1, "IsVolumeZoomEn" }, { 0x0039, 0x0087, 0, VR::SS, VM::M1, "ZoomLevelMpr" }, { 0x0039, 0x0088, 0, VR::SS, VM::M1, "ZoomLevelVolume" }, { 0x0039, 0x0089, 0, VR::US, VM::M1, "IsAutoRotateEn" }, { 0x0039, 0x008a, 0, VR::US, VM::M1, "AutoRotateAxis" }, { 0x0039, 0x008b, 0, VR::US, VM::M1, "AutoRotateRangeIndex" }, { 0x0039, 0x008c, 0, VR::US, VM::M1, "AutoRotateSpeedIndex" }, { 0x0039, 0x008d, 0, VR::US, VM::M1, "CVrBrightness" }, { 0x0039, 0x008e, 0, VR::US, VM::M1, "CFlowStateIndex" }, { 0x0039, 0x008f, 0, VR::US, VM::M1, "BSubmodeIndex" }, { 0x0039, 0x0090, 0, VR::US, VM::M1, "CSubmodeIndex" }, { 0x0039, 0x0091, 0, VR::US, VM::M1, "CutPlane" }, { 0x0039, 0x0092, 0, VR::US, VM::M1, "BookmarkChunkId" }, { 0x0039, 0x0093, 0, VR::US, VM::M1, "SequenceMinChunkId" }, { 0x0039, 0x0094, 0, VR::US, VM::M1, "SequenceMaxChunkId" }, { 0x0039, 0x0095, 0, VR::FD, VM::M1, "VolumeRateHz" }, { 0x0039, 0x009a, 0, VR::FD, VM::M1, "VoiPositionOffsetX" }, { 0x0039, 0x009b, 0, VR::FD, VM::M1, "VoiPositionOffsetY" }, { 0x0039, 0x009c, 0, VR::FD, VM::M1, "VoiPositionOffsetZ" }, { 0x0039, 0x009d, 0, VR::US, VM::M1, "VrToolIndex" }, { 0x0039, 0x009e, 0, VR::US, VM::M1, "ShadingPercent" }, { 0x0039, 0x009f, 0, VR::US, VM::M1, "VolumeType" }, { 0x0039, 0x00a0, 0, VR::US, VM::M1, "VrQuadDisplayType" }, { 0x0039, 0x00a1, 0, VR::FD, VM::M1TN, "MprCenterLocation" }, { 0x0039, 0x00e0, 0, VR::US, VM::M1, "SliceRangeType" }, { 0x0039, 0x00e1, 0, VR::US, VM::M1, "SliceMPRPlane" }, { 0x0039, 0x00e2, 0, VR::US, VM::M1, "SliceLayout" }, { 0x0039, 0x00e3, 0, VR::FD, VM::M1, "SliceSpacing" }, { 0x0039, 0x00e4, 0, VR::US, VM::M1, "ThinVrMode" }, { 0x0039, 0x00e5, 0, VR::US, VM::M1, "ThinVrThickness" }, { 0x0039, 0x00e6, 0, VR::FD, VM::M1, "VoiPivotX" }, { 0x0039, 0x00e7, 0, VR::FD, VM::M1, "VoiPivotY" }, { 0x0039, 0x00e8, 0, VR::FD, VM::M1, "VoiPivotZ" }, { 0x0039, 0x00e9, 0, VR::US, VM::M1, "CTopVoiQuad" }, { 0x0039, 0x00ea, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ed, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ee, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ef, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f0, 0, VR::US, VM::M1TN, "" }, { 0x0039, 0x00f1, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f2, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f3, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f4, 0, VR::FD, VM::M1, "" }, { 0x0039, 0x00f5, 0, VR::LO, VM::M1, "" }, { 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict389TagHashTable[] = { 100, 103, 106, 111, 116, 121, 126, 131, 134, 139, 144, 149, 152, 157, 160, 163, 99, 166, 169, 172, 175, 178, 181, 184, 187, 190, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 193, 196, 99, 99, 99, 99, 199, 202, 99, 205, 208, 213, 218, 223, 228, 233, 238, 243, 248, 251, 254, 259, 264, 269, 274, 279, 284, 289, 294, 299, 304, 309, 314, 319, 324, 329, 334, 339, 344, 347, 350, 353, 356, 359, 0, 1, 11, 91, 1, 12, 92, 2, 13, 93, 94, 242, 2, 14, 94, 95, 243, 2, 15, 95, 92, 240, 2, 0, 80, 93, 241, 2, 1, 81, 98, 246, 1, 2, 82, 2, 3, 83, 96, 244, 2, 4, 84, 97, 245, 2, 5, 85, 88, 234, 1, 6, 86, 2, 7, 87, 86, 232, 1, 87, 233, 1, 90, 238, 1, 91, 239, 1, 89, 237, 1, 80, 226, 1, 81, 227, 1, 78, 224, 1, 79, 225, 1, 84, 230, 1, 85, 231, 1, 82, 228, 1, 83, 229, 1, 77, 161, 1, 76, 160, 1, 71, 155, 1, 70, 154, 1, 40, 120, 2, 41, 121, 75, 159, 2, 42, 122, 74, 158, 2, 43, 123, 73, 157, 2, 44, 124, 72, 156, 2, 45, 125, 67, 147, 2, 46, 126, 66, 146, 2, 47, 127, 65, 145, 2, 32, 112, 64, 144, 1, 33, 113, 1, 34, 114, 2, 35, 115, 69, 149, 2, 36, 116, 68, 148, 2, 37, 117, 59, 139, 2, 38, 118, 58, 138, 2, 39, 119, 57, 137, 2, 24, 104, 56, 136, 2, 25, 105, 63, 143, 2, 26, 106, 62, 142, 2, 27, 107, 61, 141, 2, 28, 108, 60, 140, 2, 29, 109, 51, 131, 2, 30, 110, 50, 130, 2, 31, 111, 49, 129, 2, 16, 96, 48, 128, 2, 17, 97, 55, 135, 2, 18, 98, 54, 134, 2, 19, 99, 53, 133, 2, 20, 100, 52, 132, 1, 21, 101, 1, 22, 102, 1, 23, 103, 1, 8, 88, 1, 9, 89, 1, 10, 90, }; const unsigned short Dict389KeyHashTable[] = { 100, 107, 99, 112, 117, 120, 123, 99, 99, 99, 99, 126, 99, 131, 136, 139, 142, 147, 152, 99, 99, 157, 99, 99, 162, 165, 99, 168, 173, 99, 99, 178, 183, 188, 193, 196, 99, 221, 226, 229, 234, 237, 240, 99, 243, 246, 251, 256, 99, 261, 264, 267, 99, 99, 99, 99, 99, 270, 99, 275, 278, 99, 99, 281, 286, 291, 99, 294, 99, 297, 99, 302, 307, 99, 99, 99, 99, 310, 99, 313, 99, 316, 319, 99, 324, 327, 99, 99, 332, 335, 338, 99, 341, 99, 346, 99, 349, 354, 99, 0, 3, 37, 4047, 39, 18142, 40, 7684, 2, 33, 24672, 45, 35321, 2, 19, 55670, 65, 8426, 1, 9, 1249, 1, 56, 50919, 1, 73, 37855, 2, 5, 6099, 13, 29121, 2, 0, 64924, 77, 26091, 1, 80, 33111, 1, 63, 59349, 2, 27, 28391, 70, 21053, 2, 28, 28391, 71, 21053, 2, 29, 28391, 72, 21053, 2, 54, 63380, 55, 12148, 1, 64, 9725, 1, 68, 43611, 2, 15, 41136, 58, 18925, 2, 4, 12961, 20, 27459, 2, 17, 45103, 84, 9322, 2, 79, 17500, 85, 9322, 2, 83, 10361, 86, 9322, 1, 59, 14544, 12, 38, 32969, 88, 54, 89, 54, 90, 54, 91, 54, 92, 54, 93, 54, 94, 54, 95, 54, 96, 54, 97, 54, 98, 54, 2, 47, 5725, 51, 43423, 1, 6, 14582, 2, 2, 61068, 67, 1387, 1, 49, 30230, 1, 53, 63777, 1, 14, 22077, 1, 35, 36393, 2, 24, 44630, 44, 27846, 2, 8, 55826, 22, 53961, 2, 21, 7398, 61, 30494, 1, 69, 45566, 1, 81, 10968, 1, 76, 20927, 2, 36, 38478, 66, 60792, 1, 31, 63496, 1, 75, 8801, 2, 50, 51726, 74, 18791, 2, 10, 45640, 11, 45640, 1, 62, 55560, 1, 43, 65379, 2, 30, 61481, 32, 3431, 2, 23, 29490, 82, 330, 1, 16, 39218, 1, 3, 8075, 1, 42, 21437, 1, 87, 62529, 2, 7, 47257, 26, 33720, 1, 78, 43312, 2, 48, 26221, 52, 16502, 1, 57, 33452, 1, 12, 57857, 1, 60, 25844, 2, 1, 25626, 25, 62100, 1, 41, 11300, 2, 18, 23800, 34, 54477, 1, 46, 24860, }; vtkDICOMDictionary::Dict Dict389Data = { "SIEMENS MED SMS USG S2000 3D VOLUME", 99, 99, Dict389TagHashTable, Dict389KeyHashTable, Dict389Contents }; // ----- Picker MR Private Group ----- const DictEntry Dict390Contents[] = { { 0x7101, 0x0000, 0, VR::OB, VM::M1, "" }, { 0x7101, 0x0001, 0, VR::SL, VM::M1, "" }, { 0x7101, 0x0002, 0, VR::OB, VM::M1, "" }, { 0x7101, 0x0003, 0, VR::SL, VM::M1, "" }, { 0x7101, 0x0004, 0, VR::SH, VM::M1, "" }, { 0x7101, 0x0005, 0, VR::SH, VM::M2, "" }, { 0x7101, 0x0006, 0, VR::SH, VM::M4, "" }, { 0x7101, 0x0010, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict390TagHashTable[] = { 9, 12, 8, 15, 18, 21, 26, 29, 0, 1, 5, 5, 1, 4, 4, 1, 6, 6, 1, 1, 1, 2, 0, 0, 7, 16, 1, 3, 3, 1, 2, 2, }; const unsigned short Dict390KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict390Data = { "Picker MR Private Group", 8, 8, Dict390TagHashTable, Dict390KeyHashTable, Dict390Contents }; // ----- DLX_SERIE_01 ----- const DictEntry Dict391Contents[] = { { 0x0019, 0x0001, 0, VR::DS, VM::M1, "AngleValueLArm" }, { 0x0019, 0x0002, 0, VR::DS, VM::M1, "AngleValuePArm" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "AngleValueCArm" }, { 0x0019, 0x0004, 0, VR::CS, VM::M1, "AngleLabelLArm" }, { 0x0019, 0x0005, 0, VR::CS, VM::M1, "AngleLabelPArm" }, { 0x0019, 0x0006, 0, VR::CS, VM::M1, "AngleLabelCArm" }, { 0x0019, 0x0007, 0, VR::ST, VM::M1, "ProcedureName" }, { 0x0019, 0x0008, 0, VR::ST, VM::M1, "ExamName" }, { 0x0019, 0x0009, 0, VR::SH, VM::M1, "PatientSize" }, { 0x0019, 0x000A, 0, VR::IS, VM::M1, "RecordView" }, { 0x0019, 0x0010, 0, VR::DS, VM::M1, "InjectorDelay" }, { 0x0019, 0x0011, 0, VR::CS, VM::M1, "AutoInject" }, { 0x0019, 0x0014, 0, VR::IS, VM::M1, "AcquisitionMode" }, { 0x0019, 0x0015, 0, VR::CS, VM::M1, "CameraRotationEnabled" }, { 0x0019, 0x0016, 0, VR::CS, VM::M1, "ReverseSweep" }, { 0x0019, 0x0017, 0, VR::IS, VM::M1, "UserSpatialFilterStrength" }, { 0x0019, 0x0018, 0, VR::IS, VM::M1, "UserZoomFactor" }, { 0x0019, 0x0019, 0, VR::IS, VM::M1, "XZoomCenter" }, { 0x0019, 0x001A, 0, VR::IS, VM::M1, "YZoomCenter" }, { 0x0019, 0x001B, 0, VR::DS, VM::M1, "Focus" }, { 0x0019, 0x001C, 0, VR::CS, VM::M1, "Dose" }, { 0x0019, 0x001D, 0, VR::IS, VM::M1, "SideMark" }, { 0x0019, 0x001E, 0, VR::IS, VM::M1, "PercentageLandscape" }, { 0x0019, 0x001F, 0, VR::DS, VM::M1, "ExposureDuration" }, { 0x0019, 0x0020, 0, VR::LO, VM::M1, "IpAddress" }, { 0x0019, 0x0021, 0, VR::DS, VM::M1, "TablePositionZ" }, { 0x0019, 0x0022, 0, VR::DS, VM::M1, "TablePositionX" }, { 0x0019, 0x0023, 0, VR::DS, VM::M1, "TablePositionY" }, { 0x0019, 0x0024, 0, VR::DS, VM::M1, "Lambda" }, { 0x0019, 0x0025, 0, VR::DS, VM::M1, "RegressionSlope" }, { 0x0019, 0x0026, 0, VR::DS, VM::M1, "RegressionIntercept" }, { 0x0019, 0x1027, 0, VR::DS, VM::M1, "ImageChainFWHMPsfMmMin" }, { 0x0019, 0x1028, 0, VR::DS, VM::M1, "ImageChainFWHMPsfMmMax" }, }; const unsigned short Dict391TagHashTable[] = { 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 33, 33, 64, 67, 70, 73, 76, 79, 82, 85, 33, 33, 33, 88, 91, 96, 99, 104, 109, 114, 117, 122, 33, 0, 1, 17, 25, 1, 16, 24, 1, 19, 27, 1, 18, 26, 1, 21, 29, 1, 20, 28, 1, 23, 31, 1, 22, 30, 1, 11, 17, 1, 10, 16, 1, 13, 21, 1, 12, 20, 1, 15, 23, 1, 14, 22, 1, 8, 9, 1, 7, 8, 1, 32, 4136, 1, 9, 10, 1, 25, 33, 2, 0, 1, 24, 32, 1, 27, 35, 2, 2, 3, 26, 34, 2, 1, 2, 29, 37, 2, 4, 5, 28, 36, 1, 3, 4, 2, 6, 7, 30, 38, 2, 5, 6, 31, 4135, }; const unsigned short Dict391KeyHashTable[] = { 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 37, 33, 42, 33, 45, 48, 59, 62, 33, 71, 33, 74, 77, 94, 33, 33, 99, 102, 105, 33, 110, 33, 0, 1, 17, 55363, 2, 6, 38340, 8, 25386, 1, 31, 38359, 1, 14, 43126, 5, 0, 4549, 1, 8905, 2, 60284, 21, 9253, 22, 3294, 1, 9, 40174, 4, 7, 12735, 19, 20403, 23, 44852, 30, 59138, 1, 10, 25438, 1, 26, 39940, 8, 3, 56865, 4, 61221, 5, 47064, 12, 39228, 16, 47249, 27, 39940, 29, 47954, 32, 38351, 2, 13, 6865, 25, 39940, 1, 28, 25451, 1, 15, 64075, 2, 18, 30951, 24, 35783, 2, 11, 38012, 20, 62065, }; vtkDICOMDictionary::Dict Dict391Data = { "DLX_SERIE_01", 33, 33, Dict391TagHashTable, Dict391KeyHashTable, Dict391Contents }; // ----- SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA ----- const DictEntry Dict392Contents[] = { { 0x0087, 0x0020, 0, VR::OB, VM::M1, "StudyModel" }, { 0x0087, 0x0030, 0, VR::OB, VM::M1, "ReportXMLSchema" }, { 0x0087, 0x0040, 0, VR::OB, VM::M1, "ReportIdentifier" }, }; const unsigned short Dict392TagHashTable[] = { 4, 7, 3, 0, 1, 0, 32, 2, 1, 48, 2, 64, }; const unsigned short Dict392KeyHashTable[] = { 3, 4, 9, 0, 2, 0, 6778, 2, 17185, 1, 1, 11691, }; vtkDICOMDictionary::Dict Dict392Data = { "SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA", 3, 3, Dict392TagHashTable, Dict392KeyHashTable, Dict392Contents }; // ----- 1.2.840.113663.1 ----- const DictEntry Dict393Contents[] = { { 0x0029, 0x0000, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0001, 0, VR::US, VM::M1, "" }, }; const unsigned short Dict393TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict393KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict393Data = { "1.2.840.113663.1", 2, 2, Dict393TagHashTable, Dict393KeyHashTable, Dict393Contents }; // ----- SIEMENS MED OCS BEAM DISPLAY INFO ----- const DictEntry Dict394Contents[] = { { 0x0039, 0x0076, 0, VR::CS, VM::M1, "BeamDisplayProperties" }, }; const unsigned short Dict394TagHashTable[] = { 2, 0, 1, 0, 118, }; const unsigned short Dict394KeyHashTable[] = { 2, 0, 1, 0, 57277, }; vtkDICOMDictionary::Dict Dict394Data = { "SIEMENS MED OCS BEAM DISPLAY INFO", 1, 1, Dict394TagHashTable, Dict394KeyHashTable, Dict394Contents }; // ----- CMR42 CIRCLECVI ----- const DictEntry Dict395Contents[] = { { 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" }, { 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" }, { 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" }, }; const unsigned short Dict395TagHashTable[] = { 4, 3, 7, 0, 1, 2, 48, 2, 0, 16, 1, 32, }; const unsigned short Dict395KeyHashTable[] = { 4, 3, 7, 0, 1, 2, 28192, 2, 0, 42805, 1, 61032, }; vtkDICOMDictionary::Dict Dict395Data = { "CMR42 CIRCLECVI", 3, 3, Dict395TagHashTable, Dict395KeyHashTable, Dict395Contents }; // ----- Applicare/RadWorks/Version 6.0/Summary ----- const DictEntry Dict396Contents[] = { { 0x3109, 0x0001, 0, VR::SH, VM::M1, "Status" }, { 0x3109, 0x0011, 0, VR::ST, VM::M1, "ReceiveOriginSiteName" }, { 0x3109, 0x0012, 0, VR::ST, VM::M1, "ReceiveOriginDescription" }, { 0x3109, 0x0015, 0, VR::DA, VM::M1, "ReceiveDate" }, { 0x3109, 0x0016, 0, VR::TM, VM::M1, "ReceiveTime" }, }; const unsigned short Dict396TagHashTable[] = { 6, 5, 9, 12, 17, 0, 1, 3, 21, 1, 2, 18, 2, 0, 1, 4, 22, 1, 1, 17, }; const unsigned short Dict396KeyHashTable[] = { 6, 9, 14, 17, 5, 0, 1, 0, 45525, 2, 2, 11863, 4, 38814, 1, 1, 5876, 1, 3, 53191, }; vtkDICOMDictionary::Dict Dict396Data = { "Applicare/RadWorks/Version 6.0/Summary", 5, 5, Dict396TagHashTable, Dict396KeyHashTable, Dict396Contents }; // ----- CARDIO-D.R. 1.0 ----- const DictEntry Dict397Contents[] = { { 0x0009, 0x0000, 0, VR::UL, VM::M1, "FileLocation" }, { 0x0009, 0x0001, 0, VR::UL, VM::M1, "FileSize" }, { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "AlternateImageSequence" }, { 0x0019, 0x0000, 0, VR::CS, VM::M1, "ImageBlankingShape" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "ImageBlankingLeftVerticalEdge" }, { 0x0019, 0x0004, 0, VR::IS, VM::M1, "ImageBlankingRightVerticalEdge" }, { 0x0019, 0x0006, 0, VR::IS, VM::M1, "ImageBlankingUpperHorizontalEdge" }, { 0x0019, 0x0008, 0, VR::IS, VM::M1, "ImageBlankingLowerHorizontalEdge" }, { 0x0019, 0x0010, 0, VR::IS, VM::M1, "CenterOfCircularImageBlanking" }, { 0x0019, 0x0012, 0, VR::IS, VM::M1, "RadiusOfCircularImageBlanking" }, { 0x0019, 0x0030, 0, VR::UL, VM::M1, "MaximumImageFrameSize" }, { 0x0021, 0x0013, 0, VR::IS, VM::M1, "ImageSequenceNumber" }, { 0x0029, 0x0000, 0, VR::SQ, VM::M1, "EdgeEnhancementSequence" }, { 0x0029, 0x0001, 0, VR::US, VM::M2, "ConvolutionKernelSize" }, { 0x0029, 0x0002, 0, VR::US, VM::M1TN, "ConvolutionKernelCoefficients" }, { 0x0029, 0x0003, 0, VR::FL, VM::M1, "EdgeEnhancementGain" }, { 0x0029, 0x00AC, 0, VR::FL, VM::M1, "DisplayedAreaBottomRightHandCornerFractional" }, { 0x0029, 0x00AD, 0, VR::FL, VM::M1, "DisplayedAreaTopLeftHandCornerFractional" }, }; const unsigned short Dict397TagHashTable[] = { 19, 18, 18, 18, 22, 25, 30, 33, 38, 43, 18, 52, 18, 57, 60, 18, 18, 63, 0, 1, 2, 64, 1, 13, 1, 2, 10, 48, 12, 0, 1, 15, 3, 2, 3, 0, 14, 2, 2, 1, 1, 17, 173, 4, 0, 0, 4, 2, 8, 16, 16, 172, 2, 5, 4, 9, 18, 1, 6, 6, 1, 11, 19, 1, 7, 8, }; const unsigned short Dict397KeyHashTable[] = { 19, 24, 27, 30, 33, 18, 18, 36, 18, 39, 18, 46, 18, 18, 51, 18, 54, 63, 0, 2, 10, 35814, 17, 45961, 1, 16, 47059, 1, 14, 8195, 1, 13, 44471, 1, 4, 64066, 1, 8, 61281, 3, 2, 20236, 5, 6769, 15, 13027, 2, 3, 51194, 12, 64127, 1, 0, 34232, 4, 1, 23832, 7, 27963, 9, 49832, 11, 41349, 1, 6, 15396, }; vtkDICOMDictionary::Dict Dict397Data = { "CARDIO-D.R. 1.0", 18, 18, Dict397TagHashTable, Dict397KeyHashTable, Dict397Contents }; // ----- LODOX_STATSCAN ----- const DictEntry Dict398Contents[] = { { 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::DS, VM::M1, "" }, }; const unsigned short Dict398TagHashTable[] = { 9, 12, 15, 18, 21, 24, 27, 30, 0, 1, 0, 1, 1, 7, 8, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 1, 5, 6, }; const unsigned short Dict398KeyHashTable[] = { 8, 8, 8, 8, 8, 9, 8, 8, 0, 8, 0, 672, 1, 672, 2, 672, 3, 672, 4, 672, 5, 672, 6, 672, 7, 672, }; vtkDICOMDictionary::Dict Dict398Data = { "LODOX_STATSCAN", 8, 8, Dict398TagHashTable, Dict398KeyHashTable, Dict398Contents }; // ----- SIEMENS MED SMS USG ANTARES 3D VOLUME ----- const DictEntry Dict399Contents[] = { { 0x0039, 0x0000, 0, VR::UN, VM::M1, "ReleaseVersion" }, { 0x0039, 0x0003, 0, VR::UN, VM::M1, "VolumeAcquisitionDuration" }, { 0x0039, 0x0004, 0, VR::UN, VM::M1, "VolumeRawDataType" }, { 0x0039, 0x0005, 0, VR::UN, VM::M1, "ScanType" }, { 0x0039, 0x0006, 0, VR::UN, VM::M1, "ZlateralMin" }, { 0x0039, 0x0007, 0, VR::UN, VM::M1, "ZlateralSpan" }, { 0x0039, 0x0008, 0, VR::UN, VM::M1, "ZRadiusOfCurvature" }, { 0x0039, 0x0009, 0, VR::UN, VM::M1, "WobbleCorrection" }, { 0x0039, 0x0010, 0, VR::UN, VM::M1, "ScaleAlongWidth" }, { 0x0039, 0x0011, 0, VR::UN, VM::M1, "ScaleAlongHeight" }, { 0x0039, 0x0012, 0, VR::UN, VM::M1, "ScaleAlongDepth" }, { 0x0039, 0x0013, 0, VR::UN, VM::M1, "BufferSize" }, { 0x0039, 0x0014, 0, VR::UN, VM::M1, "AcquisitionRate" }, { 0x0039, 0x0015, 0, VR::UN, VM::M1, "DepthMinCm" }, { 0x0039, 0x0016, 0, VR::UN, VM::M1, "IsLeftRightFlippedEn" }, { 0x0039, 0x0017, 0, VR::UN, VM::M1, "IsUpDownFlippedEn" }, { 0x0039, 0x0018, 0, VR::UN, VM::M1, "IsVolumeGeomAccurate" }, { 0x0039, 0x0019, 0, VR::UN, VM::M1, "BByteMaskOffset" }, { 0x0039, 0x0020, 0, VR::UN, VM::M1, "BByteMaskSize" }, { 0x0039, 0x0022, 0, VR::UN, VM::M1, "AcqPlaneRotationDeg" }, { 0x0039, 0x0023, 0, VR::UN, VM::M1, "BeamAxialSpan" }, { 0x0039, 0x0024, 0, VR::UN, VM::M1, "BeamLateralMin" }, { 0x0039, 0x0025, 0, VR::UN, VM::M1, "BeamLateralSpan" }, { 0x0039, 0x0026, 0, VR::UN, VM::M1, "BeamAxialMin" }, { 0x0039, 0x0027, 0, VR::UN, VM::M1, "NumDisplaySamples" }, { 0x0039, 0x0028, 0, VR::UN, VM::M1, "DVolumeWidth" }, { 0x0039, 0x0029, 0, VR::UN, VM::M1, "DVolumeDepth" }, { 0x0039, 0x0030, 0, VR::UN, VM::M1, "DVolumeHeight" }, { 0x0039, 0x0031, 0, VR::UN, VM::M1, "DVolumePosX" }, { 0x0039, 0x0032, 0, VR::UN, VM::M1, "DVolumePosY" }, { 0x0039, 0x0033, 0, VR::UN, VM::M1, "DVolumePosZ" }, { 0x0039, 0x0034, 0, VR::UN, VM::M1, "DBeamAxialMin" }, { 0x0039, 0x0035, 0, VR::UN, VM::M1, "DBeamAxialSpan" }, { 0x0039, 0x0037, 0, VR::UN, VM::M1, "DBeamLateralSpan" }, { 0x0039, 0x0038, 0, VR::UN, VM::M1, "NumOfVolumesInSequence" }, { 0x0039, 0x0039, 0, VR::UN, VM::M1, "DByteMaskOffset" }, { 0x0039, 0x0040, 0, VR::UN, VM::M1, "DByteMaskSize" }, { 0x0039, 0x0050, 0, VR::LO, VM::M1, "PrivateCreatorVersionOfBookmark" }, { 0x0039, 0x0051, 0, VR::US, VM::M1, "BCutPlaneEnable" }, { 0x0039, 0x0052, 0, VR::US, VM::M1, "BMprColorMapIndex" }, { 0x0039, 0x0053, 0, VR::US, VM::M1, "BMprDynamicRangeDb" }, { 0x0039, 0x0054, 0, VR::US, VM::M1, "BMprGrayMapIndex" }, { 0x0039, 0x0055, 0, VR::US, VM::M1, "BVolumeRenderMode" }, { 0x0039, 0x0056, 0, VR::US, VM::M1, "BVrBrightness" }, { 0x0039, 0x0057, 0, VR::US, VM::M1, "BVrContrast" }, { 0x0039, 0x0058, 0, VR::US, VM::M1, "BVrColorMapIndex" }, { 0x0039, 0x0059, 0, VR::US, VM::M1, "BVrDynamicRangeDb" }, { 0x0039, 0x005a, 0, VR::US, VM::M1, "BVrGrayMapIndex" }, { 0x0039, 0x005b, 0, VR::US, VM::M1, "BVrGrayMapIndex" }, { 0x0039, 0x005c, 0, VR::US, VM::M1, "BVrThresholdHigh" }, { 0x0039, 0x005d, 0, VR::US, VM::M1, "BVrThresholdLow" }, { 0x0039, 0x005e, 0, VR::US, VM::M1, "BPreProcessFilterMix" }, { 0x0039, 0x005f, 0, VR::US, VM::M1, "CCutPlaneEnable" }, { 0x0039, 0x0060, 0, VR::US, VM::M1, "CFrontClipMode" }, { 0x0039, 0x0061, 0, VR::US, VM::M1, "CMprColorMapIndex" }, { 0x0039, 0x0062, 0, VR::US, VM::M1, "CMprColorFlowPriorityIndex" }, { 0x0039, 0x0063, 0, VR::US, VM::M1, "CVolumeRenderMode" }, { 0x0039, 0x0064, 0, VR::US, VM::M1, "CVrColorMapIndex" }, { 0x0039, 0x0065, 0, VR::US, VM::M1, "CVrColorFlowPriorityIndex" }, { 0x0039, 0x0066, 0, VR::US, VM::M1, "CVrOpacity" }, { 0x0039, 0x0067, 0, VR::US, VM::M1, "CVrThresholdHigh" }, { 0x0039, 0x0068, 0, VR::US, VM::M1, "CVrThresholdLow" }, { 0x0039, 0x0069, 0, VR::US, VM::M1, "VoiMode" }, { 0x0039, 0x006a, 0, VR::US, VM::M1, "VoiRotationOffsetDeg" }, { 0x0039, 0x006b, 0, VR::FD, VM::M1, "VoiSizeRatioX" }, { 0x0039, 0x006c, 0, VR::FD, VM::M1, "VoiSizeRatioY" }, { 0x0039, 0x006d, 0, VR::FD, VM::M1, "VoiSizeRatioZ" }, { 0x0039, 0x006e, 0, VR::US, VM::M1, "VoiSyncPlane" }, { 0x0039, 0x006f, 0, VR::US, VM::M1, "VoiViewMode" }, { 0x0039, 0x0070, 0, VR::FD, VM::M1TN, "VrOrientationA" }, { 0x0039, 0x0071, 0, VR::FD, VM::M1TN, "MprOrientationA" }, { 0x0039, 0x0072, 0, VR::FD, VM::M1, "VrOffsetVector" }, { 0x0039, 0x0073, 0, VR::FD, VM::M1, "BlendingRatio" }, { 0x0039, 0x0074, 0, VR::US, VM::M1, "FusionBlendMode" }, { 0x0039, 0x0075, 0, VR::FD, VM::M1, "QualityFactor" }, { 0x0039, 0x0076, 0, VR::US, VM::M1, "RendererType" }, { 0x0039, 0x0077, 0, VR::US, VM::M1, "SliceMode" }, { 0x0039, 0x0078, 0, VR::US, VM::M1, "ActiveQuad" }, { 0x0039, 0x0079, 0, VR::US, VM::M1, "ScreenMode" }, { 0x0039, 0x007a, 0, VR::US, VM::M1, "CutPlaneSide" }, { 0x0039, 0x007b, 0, VR::US, VM::M1, "WireframeMode" }, { 0x0039, 0x007c, 0, VR::US, VM::M1, "CrossmarkMode" }, { 0x0039, 0x007d, 0, VR::US, VM::M1, "MprDisplayType" }, { 0x0039, 0x007e, 0, VR::US, VM::M1, "VolumeDisplayType" }, { 0x0039, 0x007f, 0, VR::US, VM::M1, "LastReset" }, { 0x0039, 0x0080, 0, VR::US, VM::M1, "LastNonFullScreenMode" }, { 0x0039, 0x0081, 0, VR::US, VM::M1, "MprToolIndex" }, { 0x0039, 0x0082, 0, VR::US, VM::M1, "VoiToolIndex" }, { 0x0039, 0x0083, 0, VR::US, VM::M1, "ToolLoopMode" }, { 0x0039, 0x0084, 0, VR::US, VM::M1, "VolumeArbMode" }, { 0x0039, 0x0085, 0, VR::US, VM::M1, "MprZoomEn" }, { 0x0039, 0x0086, 0, VR::US, VM::M1, "IsVolumeZoomEn" }, { 0x0039, 0x0087, 0, VR::SS, VM::M1, "ZoomLevelMpr" }, { 0x0039, 0x0088, 0, VR::SS, VM::M1, "ZoomLevelVolume" }, { 0x0039, 0x0089, 0, VR::US, VM::M1, "IsAutoRotateEn" }, { 0x0039, 0x008a, 0, VR::US, VM::M1, "AutoRotateAxis" }, { 0x0039, 0x008b, 0, VR::US, VM::M1, "AutoRotateRangeIndex" }, { 0x0039, 0x008c, 0, VR::US, VM::M1, "AutoRotateSpeedIndex" }, { 0x0039, 0x008d, 0, VR::US, VM::M1, "CVrBrightness" }, { 0x0039, 0x008e, 0, VR::US, VM::M1, "CFlowStateIndex" }, { 0x0039, 0x008f, 0, VR::US, VM::M1, "BSubmodeIndex" }, { 0x0039, 0x0090, 0, VR::US, VM::M1, "CSubmodeIndex" }, { 0x0039, 0x0091, 0, VR::US, VM::M1, "CutPlane" }, { 0x0039, 0x0092, 0, VR::US, VM::M1, "BookmarkChunkId" }, { 0x0039, 0x0093, 0, VR::US, VM::M1, "SequenceMinChunkId" }, { 0x0039, 0x0094, 0, VR::US, VM::M1, "SequenceMaxChunkId" }, { 0x0039, 0x0095, 0, VR::FD, VM::M1, "VolumeRateHz" }, { 0x0039, 0x009a, 0, VR::FD, VM::M1, "VoiPositionOffsetX" }, { 0x0039, 0x009b, 0, VR::FD, VM::M1, "VoiPositionOffsetY" }, { 0x0039, 0x009c, 0, VR::FD, VM::M1, "VoiPositionOffsetZ" }, { 0x0039, 0x009d, 0, VR::US, VM::M1, "VrToolIndex" }, { 0x0039, 0x009e, 0, VR::US, VM::M1, "ShadingPercent" }, { 0x0039, 0x009f, 0, VR::US, VM::M1, "VolumeType" }, { 0x0039, 0x00a0, 0, VR::US, VM::M1, "VrQuadDisplayType" }, { 0x0039, 0x00a1, 0, VR::FD, VM::M1TN, "MprCenterLocation" }, { 0x0039, 0x00e0, 0, VR::US, VM::M1, "SliceRangeType" }, { 0x0039, 0x00e1, 0, VR::US, VM::M1, "SliceMPRPlane" }, { 0x0039, 0x00e2, 0, VR::US, VM::M1, "SliceLayout" }, { 0x0039, 0x00e3, 0, VR::FD, VM::M1, "SliceSpacing" }, { 0x0039, 0x00e4, 0, VR::US, VM::M1, "ThinVrMode" }, { 0x0039, 0x00e5, 0, VR::US, VM::M1, "ThinVrThickness" }, { 0x0039, 0x00e6, 0, VR::FD, VM::M1, "VoiPivotX" }, { 0x0039, 0x00e7, 0, VR::FD, VM::M1, "VoiPivotY" }, { 0x0039, 0x00e8, 0, VR::FD, VM::M1, "VoiPivotZ" }, { 0x0039, 0x00e9, 0, VR::US, VM::M1, "CTopVoiQuad" }, { 0x0039, 0x00ea, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ed, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ee, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00ef, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f0, 0, VR::US, VM::M1TN, "" }, { 0x0039, 0x00f1, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f2, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f3, 0, VR::US, VM::M1, "" }, { 0x0039, 0x00f4, 0, VR::FD, VM::M1, "" }, { 0x0039, 0x00f5, 0, VR::LO, VM::M1, "" }, { 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict399TagHashTable[] = { 137, 140, 136, 136, 136, 136, 136, 136, 143, 146, 149, 152, 155, 158, 161, 136, 164, 167, 170, 173, 136, 136, 136, 136, 176, 179, 184, 187, 190, 195, 200, 205, 210, 215, 220, 223, 136, 136, 226, 229, 232, 237, 242, 247, 252, 257, 262, 267, 272, 277, 282, 285, 288, 291, 294, 297, 136, 300, 303, 136, 306, 309, 312, 315, 318, 323, 328, 333, 338, 343, 346, 351, 356, 361, 364, 369, 374, 379, 384, 387, 392, 397, 402, 407, 412, 417, 422, 427, 432, 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 136, 136, 136, 136, 136, 136, 136, 136, 504, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 0, 1, 35, 57, 1, 34, 56, 1, 28, 49, 1, 27, 48, 1, 30, 51, 1, 29, 50, 1, 32, 53, 1, 31, 52, 1, 33, 55, 1, 26, 41, 1, 25, 40, 1, 114, 161, 1, 113, 160, 1, 108, 155, 2, 18, 32, 107, 154, 1, 20, 35, 1, 19, 34, 2, 22, 37, 112, 159, 2, 21, 36, 111, 158, 2, 24, 39, 110, 157, 2, 23, 38, 109, 156, 2, 17, 25, 104, 147, 2, 16, 24, 103, 146, 1, 102, 145, 1, 101, 144, 1, 106, 149, 1, 105, 148, 2, 9, 17, 96, 139, 2, 8, 16, 95, 138, 2, 11, 19, 94, 137, 2, 10, 18, 93, 136, 2, 13, 21, 100, 143, 2, 12, 20, 99, 142, 2, 15, 23, 98, 141, 2, 14, 22, 97, 140, 2, 7, 9, 88, 131, 2, 6, 8, 87, 130, 1, 86, 129, 1, 85, 128, 1, 92, 135, 1, 91, 134, 1, 90, 133, 1, 89, 132, 1, 0, 0, 1, 1, 3, 1, 3, 5, 1, 2, 4, 1, 5, 7, 1, 4, 6, 2, 77, 120, 131, 242, 2, 78, 121, 132, 243, 2, 79, 122, 129, 240, 2, 80, 123, 130, 241, 2, 81, 124, 135, 246, 1, 82, 125, 2, 83, 126, 133, 244, 2, 84, 127, 134, 245, 2, 69, 112, 125, 234, 1, 70, 113, 2, 71, 114, 123, 232, 2, 72, 115, 124, 233, 2, 73, 116, 127, 238, 2, 74, 117, 128, 239, 1, 75, 118, 2, 76, 119, 126, 237, 2, 61, 104, 117, 226, 2, 62, 105, 118, 227, 2, 63, 106, 115, 224, 2, 64, 107, 116, 225, 2, 65, 108, 121, 230, 2, 66, 109, 122, 231, 2, 67, 110, 119, 228, 2, 68, 111, 120, 229, 1, 53, 96, 1, 54, 97, 1, 55, 98, 1, 56, 99, 1, 57, 100, 1, 58, 101, 1, 59, 102, 1, 60, 103, 1, 45, 88, 1, 46, 89, 1, 47, 90, 1, 48, 91, 1, 49, 92, 1, 50, 93, 1, 51, 94, 1, 52, 95, 1, 37, 80, 1, 38, 81, 1, 39, 82, 1, 40, 83, 1, 41, 84, 1, 42, 85, 1, 43, 86, 1, 44, 87, 1, 36, 64, }; const unsigned short Dict399KeyHashTable[] = { 136, 136, 137, 136, 140, 136, 145, 148, 136, 136, 153, 136, 136, 136, 158, 136, 136, 136, 136, 161, 166, 136, 136, 136, 136, 169, 136, 172, 136, 175, 136, 178, 183, 186, 191, 136, 194, 197, 202, 207, 210, 213, 220, 225, 228, 231, 136, 136, 236, 136, 239, 136, 136, 136, 242, 136, 136, 245, 250, 255, 260, 265, 268, 273, 278, 281, 286, 289, 292, 295, 298, 301, 304, 136, 309, 136, 136, 314, 136, 136, 339, 344, 136, 136, 347, 354, 359, 368, 375, 136, 380, 387, 390, 397, 136, 400, 405, 408, 136, 415, 418, 423, 136, 426, 429, 432, 136, 136, 136, 435, 136, 136, 136, 136, 136, 136, 438, 136, 136, 136, 441, 444, 449, 452, 457, 460, 463, 136, 136, 468, 471, 474, 477, 484, 487, 136, 0, 1, 78, 46777, 2, 80, 37473, 90, 18477, 1, 17, 31493, 2, 89, 24542, 101, 24909, 2, 27, 3246, 95, 27751, 1, 13, 28424, 2, 2, 51666, 39, 48791, 1, 111, 34400, 1, 91, 4695, 1, 117, 14947, 1, 119, 31081, 2, 41, 53768, 81, 13524, 1, 4, 15377, 2, 37, 17384, 103, 65456, 1, 38, 33593, 1, 120, 53321, 2, 15, 12202, 56, 49680, 2, 26, 21234, 114, 8873, 1, 72, 18300, 1, 35, 19377, 3, 22, 61581, 25, 56803, 92, 24745, 2, 11, 44922, 86, 53328, 1, 68, 56341, 1, 49, 45490, 2, 44, 45002, 57, 17579, 1, 62, 6173, 1, 63, 46713, 1, 5, 15640, 2, 31, 12327, 59, 57110, 2, 69, 17436, 96, 26971, 2, 20, 45128, 52, 64158, 2, 42, 14077, 116, 3583, 1, 121, 13532, 2, 50, 62158, 122, 13532, 2, 9, 33975, 123, 13532, 1, 43, 977, 2, 58, 26588, 102, 10952, 1, 76, 32963, 1, 73, 42948, 1, 1, 65029, 1, 6, 25143, 1, 79, 27652, 1, 32, 49923, 2, 7, 6414, 24, 62731, 2, 12, 48318, 19, 12940, 12, 83, 33517, 125, 39, 126, 39, 127, 39, 128, 39, 129, 39, 130, 39, 131, 39, 132, 39, 133, 39, 134, 39, 135, 39, 2, 55, 9615, 67, 5722, 1, 16, 32099, 3, 0, 23151, 36, 51470, 124, 18532, 2, 33, 55972, 64, 38978, 4, 40, 18407, 53, 1081, 65, 38978, 100, 63923, 3, 46, 36086, 61, 27187, 66, 38978, 2, 47, 37560, 48, 37560, 3, 18, 56253, 93, 34656, 105, 6206, 1, 21, 65249, 3, 3, 1858, 45, 18953, 77, 41734, 1, 74, 57398, 2, 71, 3033, 112, 16044, 1, 113, 36918, 3, 14, 58444, 51, 50284, 87, 46809, 1, 28, 1441, 2, 29, 1441, 115, 8880, 1, 30, 1441, 1, 107, 18216, 1, 108, 18216, 1, 109, 18216, 1, 34, 55263, 1, 82, 171, 1, 104, 29922, 2, 98, 27498, 99, 24060, 1, 88, 63413, 2, 106, 11966, 110, 61769, 1, 84, 48500, 1, 23, 59026, 2, 75, 27372, 97, 9175, 1, 70, 29524, 1, 118, 1719, 1, 10, 54290, 3, 54, 18857, 85, 60047, 94, 31579, 1, 60, 44115, 1, 8, 24323, }; vtkDICOMDictionary::Dict Dict399Data = { "SIEMENS MED SMS USG ANTARES 3D VOLUME", 136, 136, Dict399TagHashTable, Dict399KeyHashTable, Dict399Contents }; // ----- 1.2.840.113681 ----- const DictEntry Dict400Contents[] = { { 0x0019, 0x0010, 0, VR::ST, VM::M1, "CRImageParamsCommon" }, { 0x0019, 0x0011, 0, VR::ST, VM::M1, "CRImageIPParamsSingle" }, { 0x0019, 0x0012, 0, VR::ST, VM::M1, "CRImageIPParamsLeft" }, { 0x0019, 0x0013, 0, VR::ST, VM::M1, "CRImageIPParamsRight" }, }; const unsigned short Dict400TagHashTable[] = { 5, 8, 11, 14, 0, 1, 1, 17, 1, 0, 16, 1, 3, 19, 1, 2, 18, }; const unsigned short Dict400KeyHashTable[] = { 5, 10, 13, 4, 0, 2, 1, 31079, 3, 6414, 1, 2, 26617, 1, 0, 12906, }; vtkDICOMDictionary::Dict Dict400Data = { "1.2.840.113681", 4, 4, Dict400TagHashTable, Dict400KeyHashTable, Dict400Contents }; // ----- Philips PET Private Group ----- const DictEntry Dict401Contents[] = { { 0x0511, 0x0000, 0, VR::US, VM::M1, "PrivateData" }, { 0x0511, 0x0001, 0, VR::US, VM::M1, "PrivateData" }, { 0x0511, 0x0002, 0, VR::OB, VM::M1, "PrivateData" }, { 0x0511, 0x0003, 0, VR::OB, VM::M1, "PrivateData" }, { 0x0511, 0x0032, 0, VR::DS, VM::M1, "PrivateData" }, { 0x0511, 0x0050, 0, VR::DS, VM::M1, "PrivateData" }, { 0x7053, 0x0000, 0, VR::DS, VM::M1, "SUVFactor" }, { 0x7053, 0x0001, 0, VR::OB, VM::M1, "PrivateData" }, { 0x7053, 0x0002, 0, VR::OB, VM::M1, "PrivateData" }, { 0x7053, 0x0003, 0, VR::ST, VM::M1, "OriginalFileName" }, { 0x7053, 0x0004, 0, VR::OB, VM::M1, "" }, { 0x7053, 0x0005, 0, VR::LO, VM::M1, "WorklistInfoFileName" }, { 0x7053, 0x0006, 0, VR::OB, VM::M1, "" }, { 0x7053, 0x0007, 0, VR::SQ, VM::M1, "" }, { 0x7053, 0x0008, 0, VR::SQ, VM::M1, "" }, { 0x7053, 0x0009, 0, VR::DS, VM::M1, "ActivityConcentrationScaleFactor" }, { 0x7053, 0x000f, 0, VR::UL, VM::M1, "" }, { 0x7053, 0x0010, 0, VR::US, VM::M1, "" }, { 0x7053, 0x0011, 0, VR::US, VM::M1, "" }, { 0x7053, 0x0012, 0, VR::SQ, VM::M1, "" }, { 0x7053, 0x0013, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x0014, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x0015, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x0016, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x0017, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x0018, 0, VR::SS, VM::M1, "" }, { 0x7053, 0x00c2, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict401TagHashTable[] = { 28, 27, 27, 31, 34, 39, 42, 47, 50, 53, 56, 59, 62, 65, 68, 73, 76, 79, 82, 27, 85, 88, 91, 94, 97, 100, 103, 0, 1, 11, 5, 1, 14, 8, 2, 15, 9, 19, 18, 1, 20, 19, 2, 16, 15, 17, 16, 1, 18, 17, 1, 23, 22, 1, 24, 23, 1, 21, 20, 1, 22, 21, 1, 4, 50, 1, 26, 194, 2, 5, 80, 25, 24, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 1, 8, 2, 1, 9, 3, 1, 6, 0, 1, 7, 1, 1, 12, 6, 1, 13, 7, 1, 10, 4, }; const unsigned short Dict401KeyHashTable[] = { 27, 28, 27, 45, 27, 27, 27, 48, 51, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 84, 27, 27, 27, 27, 27, 0, 8, 0, 37819, 1, 37819, 2, 37819, 3, 37819, 4, 37819, 5, 37819, 7, 37819, 8, 37819, 1, 9, 35784, 1, 6, 53249, 16, 10, 199, 12, 199, 13, 199, 14, 199, 15, 51256, 16, 199, 17, 199, 18, 199, 19, 199, 20, 199, 21, 199, 22, 199, 23, 199, 24, 199, 25, 199, 26, 199, 1, 11, 56148, }; vtkDICOMDictionary::Dict Dict401Data = { "Philips PET Private Group", 27, 27, Dict401TagHashTable, Dict401KeyHashTable, Dict401Contents }; // ----- GEMS-IT/Centricity RA600/7.0 ----- const DictEntry Dict402Contents[] = { { 0x4113, 0x0010, 0, VR::UI, VM::M1, "NumberOfImagesInStudy" }, }; const unsigned short Dict402TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict402KeyHashTable[] = { 2, 0, 1, 0, 48361, }; vtkDICOMDictionary::Dict Dict402Data = { "GEMS-IT/Centricity RA600/7.0", 1, 1, Dict402TagHashTable, Dict402KeyHashTable, Dict402Contents }; // ----- syngoDynamics_Reporting ----- const DictEntry Dict403Contents[] = { { 0x0021, 0x00AD, 0, VR::OB, VM::M1, "Data" }, }; const unsigned short Dict403TagHashTable[] = { 2, 0, 1, 0, 173, }; const unsigned short Dict403KeyHashTable[] = { 2, 0, 1, 0, 1343, }; vtkDICOMDictionary::Dict Dict403Data = { "syngoDynamics_Reporting", 1, 1, Dict403TagHashTable, Dict403KeyHashTable, Dict403Contents }; // ----- Harmony R1.0 C3 ----- const DictEntry Dict404Contents[] = { { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x000b, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0050, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0051, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0052, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0053, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x005a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005b, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x005c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x005f, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0079, 0, VR::PN, VM::M1, "" }, { 0x0019, 0x007a, 0, VR::PN, VM::M1, "" }, { 0x0019, 0x007b, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x007c, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x007d, 0, VR::CS, VM::M1, "" }, { 0x0019, 0x007e, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x007f, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0094, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0095, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0096, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0097, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0098, 0, VR::IS, VM::M1TN, "" }, { 0x0019, 0x00e4, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00e5, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00e6, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00e7, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00e8, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00e9, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ea, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00eb, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ec, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00ed, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00ee, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00ef, 0, VR::US, VM::M1, "" }, { 0x0019, 0x00f0, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00f1, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x00f2, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict404TagHashTable[] = { 43, 46, 49, 52, 42, 55, 42, 42, 42, 42, 42, 42, 58, 61, 64, 69, 74, 79, 84, 89, 42, 42, 92, 42, 95, 100, 107, 42, 42, 114, 119, 126, 131, 136, 141, 144, 147, 150, 42, 42, 42, 42, 0, 1, 29, 230, 1, 30, 231, 1, 27, 228, 1, 28, 229, 1, 26, 152, 1, 12, 120, 1, 13, 121, 2, 14, 122, 25, 151, 2, 15, 123, 24, 150, 2, 16, 124, 23, 149, 2, 17, 125, 22, 148, 2, 3, 11, 18, 126, 1, 19, 127, 1, 41, 242, 2, 8, 90, 39, 240, 3, 0, 0, 9, 91, 40, 241, 3, 1, 3, 10, 92, 21, 131, 2, 11, 95, 20, 128, 3, 2, 7, 4, 80, 33, 234, 2, 5, 81, 34, 235, 2, 6, 82, 31, 232, 2, 7, 83, 32, 233, 1, 37, 238, 1, 38, 239, 1, 35, 236, 1, 36, 237, }; const unsigned short Dict404KeyHashTable[] = { 42, 42, 42, 42, 42, 43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 0, 128, 1, 128, 2, 128, 3, 128, 4, 128, 5, 128, 6, 128, 7, 128, 8, 128, 9, 128, 10, 128, 11, 128, 12, 128, 13, 128, 14, 128, 15, 128, 16, 128, 17, 128, 18, 128, 19, 128, 20, 128, 21, 128, 22, 128, 23, 128, 24, 128, 25, 128, 26, 128, 27, 128, 28, 128, 29, 128, 30, 128, 31, 128, 32, 128, 33, 128, 34, 128, 35, 128, 36, 128, 37, 128, 38, 128, 39, 128, 40, 128, 41, 128, }; vtkDICOMDictionary::Dict Dict404Data = { "Harmony R1.0 C3", 42, 42, Dict404TagHashTable, Dict404KeyHashTable, Dict404Contents }; // ----- Harmony R1.0 C2 ----- const DictEntry Dict405Contents[] = { { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0001, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0004, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0007, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0008, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0009, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x000a, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x006a, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x006c, 0, VR::US, VM::M1, "" }, { 0x0019, 0x006d, 0, VR::US, VM::M1, "" }, { 0x0019, 0x006e, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0074, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0076, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0078, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0079, 0, VR::US, VM::M1, "" }, { 0x0019, 0x007a, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0081, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0082, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0083, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0084, 0, VR::UN, VM::M1, "" }, { 0x0019, 0x0091, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict405TagHashTable[] = { 27, 30, 33, 36, 41, 46, 49, 26, 52, 26, 55, 26, 58, 61, 64, 26, 67, 70, 73, 76, 81, 26, 84, 87, 90, 95, 0, 1, 3, 3, 1, 2, 2, 1, 5, 5, 2, 4, 4, 24, 132, 2, 7, 7, 15, 116, 1, 6, 6, 1, 16, 118, 1, 25, 145, 1, 11, 106, 1, 12, 108, 1, 13, 109, 1, 14, 110, 1, 9, 9, 1, 8, 8, 1, 17, 120, 2, 10, 10, 18, 121, 1, 19, 122, 1, 23, 131, 1, 22, 130, 2, 1, 1, 21, 129, 2, 0, 0, 20, 128, }; const unsigned short Dict405KeyHashTable[] = { 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 0, 26, 0, 206, 1, 206, 2, 206, 3, 206, 4, 206, 5, 206, 6, 206, 7, 206, 8, 206, 9, 206, 10, 206, 11, 206, 12, 206, 13, 206, 14, 206, 15, 206, 16, 206, 17, 206, 18, 206, 19, 206, 20, 206, 21, 206, 22, 206, 23, 206, 24, 206, 25, 206, }; vtkDICOMDictionary::Dict Dict405Data = { "Harmony R1.0 C2", 26, 26, Dict405TagHashTable, Dict405KeyHashTable, Dict405Contents }; // ----- SEGAMI__MEMO ----- const DictEntry Dict406Contents[] = { { 0x0035, 0x0097, 0, VR::SH, VM::M1, "" }, { 0x0035, 0x0098, 0, VR::LT, VM::M1, "" }, }; const unsigned short Dict406TagHashTable[] = { 3, 6, 0, 1, 0, 151, 1, 1, 152, }; const unsigned short Dict406KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict406Data = { "SEGAMI__MEMO", 2, 2, Dict406TagHashTable, Dict406KeyHashTable, Dict406Contents }; // ----- AGFA ----- const DictEntry Dict407Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0011, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0013, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0014, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::ST, VM::M1, "CassetteDataStream" }, { 0x0019, 0x0010, 0, VR::ST, VM::M1, "ImageProcessingParameters" }, { 0x0019, 0x0011, 0, VR::LO, VM::M1, "IdentificationData" }, { 0x0019, 0x0013, 0, VR::LO, VM::M1, "SensitometryName" }, { 0x0019, 0x0014, 0, VR::ST, VM::M1, "WindowLevelList" }, { 0x0019, 0x0015, 0, VR::LO, VM::M1, "DoseMonitoring" }, { 0x0019, 0x0016, 0, VR::LO, VM::M1, "OtherInfo" }, { 0x0019, 0x001a, 0, VR::LO, VM::M1, "ClippedExposureDeviation" }, { 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" }, { 0x0019, 0x0060, 0, VR::US, VM::M1, "TotalNumberSeries" }, { 0x0019, 0x0061, 0, VR::SH, VM::M1, "SessionNumber" }, { 0x0019, 0x0062, 0, VR::SH, VM::M1, "IDStationName" }, { 0x0019, 0x0065, 0, VR::US, VM::M1, "NumberOfImagesInStudyToBeTransmitted" }, { 0x0019, 0x0070, 0, VR::US, VM::M1, "TotalNumberImages" }, { 0x0019, 0x0080, 0, VR::ST, VM::M1, "GeometricalTransformations" }, { 0x0019, 0x0081, 0, VR::ST, VM::M1, "RoamOrigin" }, { 0x0019, 0x0082, 0, VR::US, VM::M1, "ZoomFactor" }, { 0x0019, 0x0093, 0, VR::CS, VM::M1, "Status" }, }; const unsigned short Dict407TagHashTable[] = { 23, 24, 27, 32, 23, 37, 44, 49, 52, 55, 58, 23, 63, 68, 23, 71, 76, 79, 23, 23, 23, 82, 23, 0, 1, 1, 17, 2, 0, 16, 13, 27, 2, 2, 19, 12, 26, 3, 4, 21, 5, 5, 14, 96, 2, 3, 20, 15, 97, 1, 16, 98, 1, 7, 17, 1, 6, 16, 2, 8, 19, 17, 101, 2, 10, 21, 18, 112, 1, 9, 20, 2, 11, 22, 21, 130, 1, 20, 129, 1, 19, 128, 1, 22, 147, }; const unsigned short Dict407KeyHashTable[] = { 24, 23, 27, 32, 37, 42, 23, 23, 51, 23, 23, 23, 58, 23, 23, 23, 23, 63, 23, 23, 23, 23, 66, 0, 1, 15, 16126, 2, 10, 3564, 13, 58343, 2, 16, 446, 18, 53827, 2, 5, 61109, 20, 56072, 4, 7, 15484, 9, 63060, 11, 49602, 12, 42521, 3, 8, 23404, 17, 16022, 19, 5701, 2, 21, 30571, 22, 15595, 1, 6, 40216, 6, 0, 233, 1, 233, 2, 233, 3, 233, 4, 233, 14, 37233, }; vtkDICOMDictionary::Dict Dict407Data = { "AGFA", 23, 23, Dict407TagHashTable, Dict407KeyHashTable, Dict407Contents }; // ----- Philips Imaging DD 067 ----- const DictEntry Dict408Contents[] = { { 0x4001, 0x0000, 0, VR::SQ, VM::M1, "" }, { 0x4001, 0x0001, 0, VR::CS, VM::M1, "" }, { 0x4001, 0x0008, 0, VR::CS, VM::M1, "" }, { 0x4001, 0x0009, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict408TagHashTable[] = { 5, 10, 4, 4, 0, 2, 1, 1, 3, 9, 2, 0, 0, 2, 8, }; const unsigned short Dict408KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict408Data = { "Philips Imaging DD 067", 4, 4, Dict408TagHashTable, Dict408KeyHashTable, Dict408Contents }; // ----- DLX_EXAMS_01 ----- const DictEntry Dict409Contents[] = { { 0x0015, 0x0001, 0, VR::DS, VM::M1, "StenosisCalibrationRatio" }, { 0x0015, 0x0002, 0, VR::DS, VM::M1, "StenosisMagnification" }, { 0x0015, 0x0003, 0, VR::DS, VM::M1, "CardiacCalibrationRatio" }, }; const unsigned short Dict409TagHashTable[] = { 3, 4, 7, 0, 1, 2, 3, 2, 0, 1, 1, 2, }; const unsigned short Dict409KeyHashTable[] = { 3, 4, 9, 0, 2, 0, 7265, 2, 44742, 1, 1, 40220, }; vtkDICOMDictionary::Dict Dict409Data = { "DLX_EXAMS_01", 3, 3, Dict409TagHashTable, Dict409KeyHashTable, Dict409Contents }; // ----- Philips Imaging DD 065 ----- const DictEntry Dict410Contents[] = { { 0x4007, 0x0000, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict410TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict410KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict410Data = { "Philips Imaging DD 065", 1, 1, Dict410TagHashTable, Dict410KeyHashTable, Dict410Contents }; // ----- GE_GROUP ----- const DictEntry Dict411Contents[] = { { 0x6005, 0x0010, 0, VR::UT, VM::M1, "" }, }; const unsigned short Dict411TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict411KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict411Data = { "GE_GROUP", 1, 1, Dict411TagHashTable, Dict411KeyHashTable, Dict411Contents }; // ----- SIEMENS SYNGO OBJECT GRAPHICS ----- const DictEntry Dict412Contents[] = { { 0x0071, 0x0000, 0, VR::SQ, VM::M1, "GraphicObjectSequence" }, { 0x0071, 0x0001, 0, VR::SL, VM::M1, "FillStyleVersion" }, { 0x0071, 0x0002, 0, VR::FL, VM::M4, "FillBackgroundColor" }, { 0x0071, 0x0003, 0, VR::FL, VM::M4, "FillForegroundColor" }, { 0x0071, 0x0004, 0, VR::SL, VM::M1, "FillMode" }, { 0x0071, 0x0005, 0, VR::OB, VM::M1, "FillPattern" }, { 0x0071, 0x0006, 0, VR::SL, VM::M1, "LineStyleVersion" }, { 0x0071, 0x0007, 0, VR::FL, VM::M4, "LineBackgroundColor" }, { 0x0071, 0x0008, 0, VR::FL, VM::M4, "LineForegroundColor" }, { 0x0071, 0x0009, 0, VR::DS, VM::M1, "LineType" }, { 0x0071, 0x0010, 0, VR::DS, VM::M1, "LineThickness" }, { 0x0071, 0x0011, 0, VR::DS, VM::M1, "LineShadowXOffset" }, { 0x0071, 0x0012, 0, VR::DS, VM::M1, "LineShadowYOffset" }, { 0x0071, 0x0013, 0, VR::DS, VM::M1, "ShadowStyle" }, { 0x0071, 0x0014, 0, VR::FL, VM::M4, "ShadowColor" }, { 0x0071, 0x0015, 0, VR::DS, VM::M1, "StipplePattern" }, { 0x0071, 0x0016, 0, VR::DS, VM::M1, "LineAntiAliasing" }, { 0x0071, 0x0017, 0, VR::CS, VM::M1, "Line-Z-BlendFlag" }, { 0x0071, 0x0018, 0, VR::SL, VM::M1, "TextStyleVersion" }, { 0x0071, 0x0019, 0, VR::FL, VM::M4, "TextColor" }, { 0x0071, 0x0020, 0, VR::SL, VM::M1, "TextHorizontalAlign" }, { 0x0071, 0x0021, 0, VR::SL, VM::M1, "TextVerticalAlign" }, { 0x0071, 0x0022, 0, VR::DS, VM::M1, "TextShadowXOffset" }, { 0x0071, 0x0023, 0, VR::DS, VM::M1, "TextShadowYOffset" }, { 0x0071, 0x0024, 0, VR::SL, VM::M1, "TextShadowStyle" }, { 0x0071, 0x0025, 0, VR::FL, VM::M4, "TextShadowColor" }, { 0x0071, 0x0026, 0, VR::CS, VM::M1TN, "TextLogFont" }, { 0x0071, 0x0027, 0, VR::CS, VM::M1, "Text-Z-BlendFlag" }, { 0x0071, 0x0028, 0, VR::OB, VM::M1, "GraphicBitMask" }, { 0x0071, 0x0029, 0, VR::CS, VM::M1, "VisiblilityFlag" }, { 0x0071, 0x0030, 0, VR::SL, VM::M1, "GraphicSensitivity" }, { 0x0071, 0x0031, 0, VR::SL, VM::M1, "GraphicPickModeType" }, { 0x0071, 0x0032, 0, VR::SL, VM::M1, "GraphicLayer" }, { 0x0071, 0x0033, 0, VR::SL, VM::M1, "GraphicObjectVersion" }, { 0x0071, 0x0034, 0, VR::SL, VM::M1, "GraphicCoordinateSystem" }, { 0x0071, 0x0035, 0, VR::CS, VM::M1, "GraphicCustomAttributes" }, { 0x0071, 0x0036, 0, VR::CS, VM::M1, "GraphicCustomAttributesKey" }, { 0x0071, 0x0037, 0, VR::CS, VM::M1, "GraphicCustomAttributesValue" }, { 0x0071, 0x0038, 0, VR::CS, VM::M1, "GraphicViewName" }, { 0x0071, 0x0039, 0, VR::DS, VM::M3, "GraphicData" }, { 0x0071, 0x0040, 0, VR::CS, VM::M1, "GraphicType" }, { 0x0071, 0x0041, 0, VR::US, VM::M1, "NumberOfGraphicPoints" }, { 0x0071, 0x0042, 0, VR::DS, VM::M1, "AxisMainTickLength" }, { 0x0071, 0x0043, 0, VR::DS, VM::M1, "AxisDetailTickLength" }, { 0x0071, 0x0044, 0, VR::DS, VM::M1, "AxisMainTickSpacing" }, { 0x0071, 0x0045, 0, VR::DS, VM::M1TN, "AxisDetailTickSpacing" }, { 0x0071, 0x0046, 0, VR::DS, VM::M1, "AxisMainTickCount" }, { 0x0071, 0x0047, 0, VR::DS, VM::M1, "AxisDetailTickCount" }, { 0x0071, 0x0048, 0, VR::SL, VM::M1, "AxisTickBehavior" }, { 0x0071, 0x0049, 0, VR::SL, VM::M1, "AxisTickAligment" }, { 0x0071, 0x0050, 0, VR::DS, VM::M1, "AxisStep" }, { 0x0071, 0x0051, 0, VR::SL, VM::M1, "AxisStepIndex" }, { 0x0071, 0x0052, 0, VR::CS, VM::M1, "AxisTextFormat" }, { 0x0071, 0x0053, 0, VR::CS, VM::M1, "AxisShowCenterTextFlag" }, { 0x0071, 0x0054, 0, VR::CS, VM::M1, "AxisShowTickTextFlag" }, { 0x0071, 0x0055, 0, VR::DS, VM::M3, "BitmapXOrientation" }, { 0x0071, 0x0056, 0, VR::DS, VM::M3, "BitmapYOrientation" }, { 0x0071, 0x0057, 0, VR::OB, VM::M1, "GraphicBlob" }, { 0x0071, 0x0058, 0, VR::CS, VM::M1, "GraphicInterpolation" }, { 0x0071, 0x0059, 0, VR::DS, VM::M1, "GraphicAngle" }, { 0x0071, 0x0060, 0, VR::DS, VM::M1, "GraphicSize" }, { 0x0071, 0x0061, 0, VR::CS, VM::M1, "CutLineSide" }, { 0x0071, 0x0062, 0, VR::DS, VM::M1, "GraphicTipLength" }, { 0x0071, 0x0063, 0, VR::DS, VM::M1, "CutLineArrowLength" }, { 0x0071, 0x0064, 0, VR::DS, VM::M1, "LineGapLength" }, { 0x0071, 0x0065, 0, VR::DS, VM::M1, "GraphicCircleRadius" }, { 0x0071, 0x0066, 0, VR::DS, VM::M1, "LineDistanceMove" }, { 0x0071, 0x0067, 0, VR::DS, VM::M1, "LineMarkerLength" }, { 0x0071, 0x0068, 0, VR::DS, VM::M3, "GraphicCenter" }, { 0x0071, 0x0069, 0, VR::DS, VM::M3, "RangeCenterAreaTopLeft" }, { 0x0071, 0x0070, 0, VR::DS, VM::M3, "RangeCenterAreaBottomRight" }, { 0x0071, 0x0071, 0, VR::DS, VM::M1, "RangeTilt" }, { 0x0071, 0x0072, 0, VR::DS, VM::M1, "RangeMinimumTilt" }, { 0x0071, 0x0073, 0, VR::DS, VM::M1, "RangeMaximumTilt" }, { 0x0071, 0x0074, 0, VR::DS, VM::M1, "GraphicWidth" }, { 0x0071, 0x0075, 0, VR::DS, VM::M1, "RangeMinimumWidth" }, { 0x0071, 0x0076, 0, VR::DS, VM::M1, "RangeMaximumWidth" }, { 0x0071, 0x0077, 0, VR::DS, VM::M1, "GraphicHeight" }, { 0x0071, 0x0078, 0, VR::DS, VM::M1, "RangeFeed" }, { 0x0071, 0x0079, 0, VR::CS, VM::M1, "RangeDirection" }, { 0x0071, 0x0080, 0, VR::CS, VM::M1, "RangeShowScans" }, { 0x0071, 0x0081, 0, VR::DS, VM::M1, "RangeMinimumScanDistance" }, { 0x0071, 0x0082, 0, VR::CS, VM::M1, "RangeOrthogonalHeight" }, { 0x0071, 0x0083, 0, VR::DS, VM::M3, "GraphicPosition" }, { 0x0071, 0x0084, 0, VR::CS, VM::M1, "GraphicClosedFlag" }, { 0x0071, 0x0085, 0, VR::SL, VM::M1, "RangeLineTipMode" }, { 0x0071, 0x0086, 0, VR::SL, VM::M1, "GraphicListCount" }, { 0x0071, 0x0087, 0, VR::CS, VM::M1, "AxisFlipTextFlag" }, { 0x0071, 0x0088, 0, VR::CS, VM::M1, "CurveDiagramType" }, { 0x0071, 0x0089, 0, VR::DS, VM::M1, "GraphicStartAngle" }, { 0x0071, 0x0090, 0, VR::DS, VM::M1, "GraphicEndAngle" }, { 0x0071, 0x0091, 0, VR::IS, VM::M1, "LiveWireSmoothness" }, { 0x0071, 0x0092, 0, VR::CS, VM::M1, "LiveWireSplineFlag" }, { 0x0071, 0x0093, 0, VR::CS, VM::M1, "EllipseCircleFlag" }, { 0x0071, 0x0094, 0, VR::CS, VM::M1, "GraphicSquareFlag" }, { 0x0071, 0x0095, 0, VR::DS, VM::M1, "CurveSectionStartIndex" }, { 0x0071, 0x0096, 0, VR::DS, VM::M1, "CurveSectionEndIndex" }, { 0x0071, 0x0097, 0, VR::DS, VM::M1, "MarkerAlpha" }, { 0x0071, 0x0098, 0, VR::IS, VM::M1, "TableRowCount" }, { 0x0071, 0x0099, 0, VR::IS, VM::M1, "TableColumnCount" }, { 0x0071, 0x009A, 0, VR::DS, VM::M1, "TableRowHeight" }, { 0x0071, 0x009B, 0, VR::DS, VM::M1, "TableColumnWidth" }, { 0x0071, 0x009C, 0, VR::IS, VM::M1, "RectangleSelectionSegmentOffset" }, { 0x0071, 0x009D, 0, VR::CS, VM::M1, "GraphicText" }, { 0x0071, 0x00A0, 0, VR::SL, VM::M1, "AxisTickSpacingCoordinateSystem" }, { 0x0071, 0x00A1, 0, VR::CS, VM::M1, "AxisDiagramGridType" }, { 0x0071, 0x00A2, 0, VR::SL, VM::M1, "PolarPlotCircleCount" }, { 0x0071, 0x00A3, 0, VR::SL, VM::M1, "PolarPlotLines-per-Circle" }, { 0x0071, 0x00A4, 0, VR::SL, VM::M1, "PolarPlotCompartmentCount" }, { 0x0071, 0x00A5, 0, VR::SL, VM::M1, "PolarPlotRadiusWeight" }, { 0x0071, 0x00A6, 0, VR::DS, VM::M1, "CircleSegmentOuterRadius" }, { 0x0071, 0x00A7, 0, VR::CS, VM::M1, "CircleSegmentClockwiseFlag" }, { 0x0071, 0x00A8, 0, VR::CS, VM::M1, "AxisDiagramAutoResizeFlag" }, { 0x0071, 0x00A9, 0, VR::DS, VM::M1, "AxisDiagramStepStart" }, { 0x0071, 0x00B0, 0, VR::CS, VM::M1, "GroupRoot" }, { 0x0071, 0x00B1, 0, VR::ST, VM::M1, "GroupName" }, { 0x0071, 0x00B2, 0, VR::SQ, VM::M1, "GraphicAnnotationSequence" }, { 0x0071, 0x00B3, 0, VR::SL, VM::M1, "TextMinimumHeight" }, { 0x0071, 0x00B4, 0, VR::DS, VM::M1, "TextFontScalingFactor" }, { 0x0071, 0x00B5, 0, VR::SL, VM::M2, "TextMaximumExtensions" }, { 0x0071, 0x00B6, 0, VR::CS, VM::M1, "TextSegmentSize" }, { 0x0071, 0x00B7, 0, VR::SL, VM::M1, "GraphicObjectReferenceLabel" }, }; const unsigned short Dict412TagHashTable[] = { 123, 128, 133, 138, 143, 146, 149, 154, 159, 162, 122, 122, 122, 122, 122, 122, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 122, 122, 122, 122, 122, 122, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 122, 122, 122, 122, 122, 122, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 122, 122, 122, 122, 122, 122, 255, 258, 261, 264, 267, 270, 273, 278, 283, 288, 293, 296, 299, 302, 122, 122, 305, 308, 311, 314, 317, 320, 323, 328, 333, 338, 343, 346, 349, 352, 122, 122, 355, 360, 365, 368, 371, 374, 377, 382, 387, 392, 397, 400, 403, 406, 409, 412, 415, 420, 425, 428, 431, 436, 441, 446, 451, 456, 0, 2, 71, 113, 86, 134, 2, 70, 112, 87, 135, 2, 73, 115, 84, 132, 2, 72, 114, 85, 133, 1, 75, 117, 1, 74, 116, 2, 77, 119, 88, 136, 2, 76, 118, 89, 137, 1, 79, 121, 1, 78, 120, 1, 61, 97, 1, 60, 96, 1, 63, 99, 1, 62, 98, 1, 65, 101, 1, 64, 100, 1, 67, 103, 1, 66, 102, 1, 69, 105, 1, 68, 104, 1, 51, 81, 1, 50, 80, 1, 53, 83, 1, 52, 82, 1, 55, 85, 1, 54, 84, 1, 57, 87, 1, 56, 86, 1, 59, 89, 1, 58, 88, 1, 41, 65, 1, 40, 64, 1, 43, 67, 1, 42, 66, 1, 45, 69, 1, 44, 68, 1, 47, 71, 1, 46, 70, 1, 49, 73, 1, 48, 72, 1, 30, 48, 1, 31, 49, 1, 32, 50, 1, 33, 51, 1, 34, 52, 1, 35, 53, 2, 36, 54, 116, 178, 2, 37, 55, 117, 179, 2, 38, 56, 114, 176, 2, 39, 57, 115, 177, 1, 120, 182, 1, 121, 183, 1, 118, 180, 1, 119, 181, 1, 20, 32, 1, 21, 33, 1, 22, 34, 1, 23, 35, 1, 24, 36, 1, 25, 37, 2, 26, 38, 106, 162, 2, 27, 39, 107, 163, 2, 28, 40, 104, 160, 2, 29, 41, 105, 161, 1, 110, 166, 1, 111, 167, 1, 108, 164, 1, 109, 165, 2, 10, 16, 112, 168, 2, 11, 17, 113, 169, 1, 12, 18, 1, 13, 19, 1, 14, 20, 1, 15, 21, 2, 16, 22, 92, 146, 2, 17, 23, 93, 147, 2, 18, 24, 90, 144, 2, 19, 25, 91, 145, 1, 96, 150, 1, 97, 151, 1, 94, 148, 1, 95, 149, 1, 100, 154, 1, 101, 155, 2, 0, 0, 98, 152, 2, 1, 1, 99, 153, 1, 2, 2, 1, 3, 3, 2, 4, 4, 102, 156, 2, 5, 5, 103, 157, 2, 6, 6, 82, 130, 2, 7, 7, 83, 131, 2, 8, 8, 80, 128, 2, 9, 9, 81, 129, }; const unsigned short Dict412KeyHashTable[] = { 122, 122, 123, 130, 133, 136, 139, 122, 144, 122, 122, 122, 153, 122, 158, 122, 163, 166, 122, 169, 176, 122, 122, 179, 186, 122, 191, 194, 197, 200, 122, 203, 122, 206, 209, 212, 122, 122, 217, 222, 225, 228, 122, 237, 122, 122, 122, 122, 240, 122, 245, 248, 251, 254, 122, 257, 122, 262, 267, 270, 273, 276, 122, 122, 279, 122, 122, 284, 287, 290, 293, 296, 122, 299, 304, 309, 312, 315, 320, 323, 326, 329, 338, 343, 122, 354, 357, 122, 122, 122, 122, 360, 365, 368, 371, 122, 122, 376, 379, 382, 385, 390, 395, 398, 401, 404, 122, 407, 122, 122, 410, 415, 122, 418, 421, 424, 429, 122, 434, 437, 440, 445, 0, 3, 76, 11651, 78, 42778, 83, 43079, 1, 47, 23547, 1, 86, 59690, 1, 117, 47441, 2, 33, 57873, 61, 58716, 4, 59, 661, 75, 25615, 87, 20214, 111, 27808, 2, 14, 11195, 34, 41434, 2, 55, 17148, 77, 42371, 1, 63, 35559, 1, 97, 55334, 3, 18, 62003, 70, 34446, 90, 17875, 1, 28, 24081, 3, 4, 4305, 22, 7228, 53, 33546, 2, 62, 43009, 102, 36885, 1, 23, 41735, 1, 67, 48215, 1, 60, 50373, 1, 44, 45085, 1, 74, 16410, 1, 29, 19437, 1, 100, 31766, 2, 91, 32086, 105, 25666, 2, 41, 25004, 119, 45837, 1, 64, 1072, 1, 50, 38131, 4, 27, 43170, 35, 59558, 84, 52675, 118, 30124, 1, 1, 10780, 2, 57, 45389, 98, 35307, 1, 96, 55958, 1, 54, 51309, 1, 112, 43600, 1, 93, 27657, 2, 20, 40340, 31, 19041, 2, 65, 49610, 101, 52485, 1, 6, 55945, 1, 106, 47701, 1, 94, 59741, 1, 24, 43114, 2, 51, 57971, 120, 36364, 1, 116, 33938, 1, 15, 832, 1, 66, 33353, 1, 52, 36213, 1, 0, 12126, 2, 10, 55912, 72, 19493, 2, 30, 23274, 68, 12913, 1, 88, 51895, 1, 69, 43275, 2, 58, 3883, 92, 5946, 1, 114, 31252, 1, 26, 24034, 1, 17, 37112, 4, 9, 18619, 71, 46939, 80, 8913, 121, 20956, 2, 13, 37241, 103, 50631, 5, 2, 50460, 38, 43998, 39, 45881, 79, 17536, 108, 38293, 1, 19, 7858, 1, 5, 30178, 2, 56, 64078, 115, 29948, 1, 89, 58374, 1, 46, 38951, 2, 7, 30115, 49, 3500, 1, 95, 38490, 1, 99, 56597, 1, 110, 56795, 2, 43, 40855, 85, 8036, 2, 48, 36504, 73, 55956, 1, 107, 46393, 1, 104, 65384, 1, 3, 91, 1, 16, 5084, 1, 21, 53514, 2, 32, 38381, 36, 32032, 1, 40, 50807, 1, 25, 17067, 1, 11, 64096, 2, 8, 45282, 113, 4063, 2, 81, 60921, 109, 10331, 1, 42, 30295, 1, 45, 11087, 2, 37, 30873, 82, 26040, 1, 12, 21249, }; vtkDICOMDictionary::Dict Dict412Data = { "SIEMENS SYNGO OBJECT GRAPHICS", 122, 122, Dict412TagHashTable, Dict412KeyHashTable, Dict412Contents }; // ----- Visus Change ----- const DictEntry Dict413Contents[] = { { 0x5533, 0x0033, 0, VR::SQ, VM::M1, "SaveSequence" }, { 0x5533, 0x0035, 0, VR::DA, VM::M1, "SaveDate" }, { 0x5533, 0x0037, 0, VR::LO, VM::M1, "SaveOriginator" }, { 0x5533, 0x0039, 0, VR::FD, VM::M1, "SaveID" }, { 0x5533, 0x003b, 0, VR::TM, VM::M1, "SaveTime" }, }; const unsigned short Dict413TagHashTable[] = { 5, 6, 5, 11, 16, 0, 2, 1, 53, 4, 59, 2, 0, 51, 3, 57, 1, 2, 55, }; const unsigned short Dict413KeyHashTable[] = { 6, 9, 12, 5, 15, 0, 1, 2, 39946, 1, 0, 60092, 1, 4, 33901, 2, 1, 48278, 3, 11769, }; vtkDICOMDictionary::Dict Dict413Data = { "Visus Change", 5, 5, Dict413TagHashTable, Dict413KeyHashTable, Dict413Contents }; // ----- SIEMENS ISI ----- const DictEntry Dict414Contents[] = { { 0x0003, 0x0008, 0, VR::US, VM::M1, "ISICommandField" }, { 0x0003, 0x0011, 0, VR::US, VM::M1, "AttachIDApplicationCode" }, { 0x0003, 0x0012, 0, VR::UL, VM::M1, "AttachIDMessageCount" }, { 0x0003, 0x0013, 0, VR::DA, VM::M1, "AttachIDDate" }, { 0x0003, 0x0014, 0, VR::TM, VM::M1, "AttachIDTime" }, { 0x0003, 0x0020, 0, VR::US, VM::M1, "MessageType" }, { 0x0003, 0x0030, 0, VR::DA, VM::M1, "MaxWaitingDate" }, { 0x0003, 0x0031, 0, VR::TM, VM::M1, "MaxWaitingTime" }, { 0x0009, 0x0001, 0, VR::UN, VM::M1, "RISPatientInfoIMGEF" }, { 0x0011, 0x0003, 0, VR::LO, VM::M1, "PatientUID" }, { 0x0011, 0x0004, 0, VR::LO, VM::M1, "PatientID" }, { 0x0011, 0x000a, 0, VR::LO, VM::M1, "CaseID" }, { 0x0011, 0x0022, 0, VR::LO, VM::M1, "RequestID" }, { 0x0011, 0x0023, 0, VR::LO, VM::M1, "ExaminationUID" }, { 0x0011, 0x00a1, 0, VR::DA, VM::M1, "PatientRegistrationDate" }, { 0x0011, 0x00a2, 0, VR::TM, VM::M1, "PatientRegistrationTime" }, { 0x0011, 0x00b0, 0, VR::LO, VM::M1, "PatientLastName" }, { 0x0011, 0x00b2, 0, VR::LO, VM::M1, "PatientFirstName" }, { 0x0011, 0x00b4, 0, VR::LO, VM::M1, "PatientHospitalStatus" }, { 0x0011, 0x00bc, 0, VR::TM, VM::M1, "CurrentLocationTime" }, { 0x0011, 0x00c0, 0, VR::LO, VM::M1, "PatientInsuranceStatus" }, { 0x0011, 0x00d0, 0, VR::LO, VM::M1, "PatientBillingType" }, { 0x0011, 0x00d2, 0, VR::LO, VM::M1, "PatientBillingAddress" }, { 0x0031, 0x0012, 0, VR::LO, VM::M1, "ExaminationReason" }, { 0x0031, 0x0030, 0, VR::DA, VM::M1, "RequestedDate" }, { 0x0031, 0x0032, 0, VR::TM, VM::M1, "WorklistRequestStartTime" }, { 0x0031, 0x0033, 0, VR::TM, VM::M1, "WorklistRequestEndTime" }, { 0x0031, 0x004a, 0, VR::TM, VM::M1, "RequestedTime" }, { 0x0031, 0x0080, 0, VR::LO, VM::M1, "RequestedLocation" }, { 0x0055, 0x0046, 0, VR::LO, VM::M1, "CurrentWard" }, { 0x0193, 0x0002, 0, VR::DS, VM::M1, "RISKey" }, { 0x0307, 0x0001, 0, VR::UN, VM::M1, "RISWorklistIMGEF" }, { 0x0309, 0x0001, 0, VR::UN, VM::M1, "RISReportIMGEF" }, { 0x4009, 0x0001, 0, VR::LO, VM::M1, "ReportID" }, { 0x4009, 0x0020, 0, VR::LO, VM::M1, "ReportStatus" }, { 0x4009, 0x0030, 0, VR::DA, VM::M1, "ReportCreationDate" }, { 0x4009, 0x0070, 0, VR::LO, VM::M1, "ReportApprovingPhysician" }, { 0x4009, 0x00e0, 0, VR::LO, VM::M1, "ReportText" }, { 0x4009, 0x00e1, 0, VR::LO, VM::M1, "ReportAuthor" }, { 0x4009, 0x00e3, 0, VR::LO, VM::M1, "ReportingRadiologist" }, }; const unsigned short Dict414TagHashTable[] = { 41, 44, 51, 56, 40, 40, 40, 61, 66, 40, 71, 78, 85, 40, 40, 88, 91, 94, 101, 110, 40, 115, 40, 118, 40, 40, 40, 121, 40, 40, 40, 40, 124, 127, 130, 135, 40, 40, 40, 40, 0, 1, 36, 112, 3, 17, 178, 24, 48, 34, 32, 2, 26, 51, 27, 74, 2, 16, 176, 25, 50, 2, 18, 180, 30, 2, 2, 8, 1, 33, 1, 3, 7, 49, 13, 35, 20, 192, 3, 0, 8, 6, 48, 12, 34, 1, 32, 1, 1, 19, 188, 1, 3, 19, 3, 2, 18, 15, 162, 35, 48, 4, 1, 17, 9, 3, 14, 161, 31, 1, 2, 28, 128, 29, 70, 1, 10, 4, 1, 4, 20, 1, 11, 10, 1, 22, 210, 1, 39, 227, 2, 21, 208, 37, 224, 3, 5, 32, 23, 18, 38, 225, }; const unsigned short Dict414KeyHashTable[] = { 41, 40, 40, 44, 47, 50, 53, 56, 61, 40, 40, 66, 69, 76, 79, 40, 40, 40, 82, 87, 92, 97, 100, 105, 40, 40, 108, 40, 111, 116, 121, 130, 40, 133, 136, 40, 139, 142, 40, 40, 0, 1, 28, 2738, 1, 12, 50471, 1, 35, 34850, 1, 0, 54845, 1, 1, 58950, 2, 16, 21341, 32, 48118, 2, 19, 17605, 39, 21931, 1, 17, 25359, 3, 13, 27607, 15, 23011, 38, 14609, 1, 7, 41252, 1, 4, 21545, 2, 23, 34779, 25, 56587, 2, 14, 8424, 26, 18288, 2, 6, 26665, 30, 48877, 1, 3, 6958, 2, 27, 55310, 37, 35090, 1, 10, 60066, 1, 18, 55833, 2, 5, 41146, 8, 43396, 2, 24, 40723, 34, 15501, 4, 11, 7722, 20, 17829, 29, 43539, 33, 49682, 1, 36, 812, 1, 22, 58152, 1, 31, 6255, 1, 9, 42663, 2, 2, 37434, 21, 41031, }; vtkDICOMDictionary::Dict Dict414Data = { "SIEMENS ISI", 40, 40, Dict414TagHashTable, Dict414KeyHashTable, Dict414Contents }; // ----- PHILIPS MR R5.6/PART ----- const DictEntry Dict415Contents[] = { { 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" }, }; const unsigned short Dict415TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict415KeyHashTable[] = { 2, 0, 1, 0, 16313, }; vtkDICOMDictionary::Dict Dict415Data = { "PHILIPS MR R5.6/PART", 1, 1, Dict415TagHashTable, Dict415KeyHashTable, Dict415Contents }; // ----- METAEMOTION GINKGO ----- const DictEntry Dict416Contents[] = { { 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" }, { 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" }, }; const unsigned short Dict416TagHashTable[] = { 3, 2, 0, 2, 0, 1, 1, 11, }; const unsigned short Dict416KeyHashTable[] = { 2, 3, 0, 2, 0, 16373, 1, 45377, }; vtkDICOMDictionary::Dict Dict416Data = { "METAEMOTION GINKGO", 2, 2, Dict416TagHashTable, Dict416KeyHashTable, Dict416Contents }; // ----- GEMS_IDEN_01 ----- const DictEntry Dict417Contents[] = { { 0x0009, 0x0001, 0, VR::LO, VM::M1, "FullFidelity" }, { 0x0009, 0x0002, 0, VR::SH, VM::M1, "SuiteId" }, { 0x0009, 0x0004, 0, VR::SH, VM::M1, "ProductId" }, { 0x0009, 0x0017, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x001a, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0020, 0, VR::US, VM::M1, "" }, { 0x0009, 0x0027, 0, VR::SL, VM::M1, "ImageActualDate" }, { 0x0009, 0x002f, 0, VR::SH, VM::M1, "" }, { 0x0009, 0x0030, 0, VR::SH, VM::M1, "ServiceId" }, { 0x0009, 0x0031, 0, VR::SH, VM::M1, "MobileLocationNumber" }, { 0x0009, 0x00e2, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x00e3, 0, VR::UI, VM::M1, "EquipmentUID" }, { 0x0009, 0x00e6, 0, VR::SH, VM::M1, "GenesisVersionNow" }, { 0x0009, 0x00e7, 0, VR::UL, VM::M1, "ExamRecordChecksum" }, { 0x0009, 0x00e8, 0, VR::UL, VM::M1, "SeriesSuiteID" }, { 0x0009, 0x00e9, 0, VR::SL, VM::M1, "ActualSeriesDataTimeStamp" }, }; const unsigned short Dict417TagHashTable[] = { 16, 16, 17, 20, 16, 16, 25, 16, 28, 35, 16, 42, 45, 48, 53, 16, 0, 1, 14, 232, 2, 4, 26, 15, 233, 1, 7, 47, 3, 0, 1, 9, 49, 10, 226, 3, 5, 32, 8, 48, 11, 227, 1, 1, 2, 1, 12, 230, 2, 2, 4, 13, 231, 2, 3, 23, 6, 39, }; const unsigned short Dict417KeyHashTable[] = { 17, 16, 20, 25, 16, 30, 16, 41, 44, 16, 16, 16, 47, 50, 16, 53, 0, 1, 6, 45802, 2, 0, 39865, 13, 31860, 2, 2, 9495, 8, 8204, 5, 3, 336, 4, 336, 5, 336, 7, 336, 10, 336, 1, 14, 13720, 1, 15, 38115, 1, 1, 42013, 1, 12, 17514, 2, 9, 34293, 11, 62425, }; vtkDICOMDictionary::Dict Dict417Data = { "GEMS_IDEN_01", 16, 16, Dict417TagHashTable, Dict417KeyHashTable, Dict417Contents }; // ----- Silhouette Graphics Export V1.0 ----- const DictEntry Dict418Contents[] = { { 0x0029, 0x0000, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict418TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict418KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict418Data = { "Silhouette Graphics Export V1.0", 1, 1, Dict418TagHashTable, Dict418KeyHashTable, Dict418Contents }; // ----- SIEMENS MED ECAT FILE INFO ----- const DictEntry Dict419Contents[] = { { 0x0021, 0x0000, 0, VR::OB, VM::M1, "ECATMainHeader" }, { 0x0021, 0x0001, 0, VR::OB, VM::M1, "ECATImageSubheader" }, }; const unsigned short Dict419TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict419KeyHashTable[] = { 3, 2, 0, 2, 0, 2200, 1, 20300, }; vtkDICOMDictionary::Dict Dict419Data = { "SIEMENS MED ECAT FILE INFO", 2, 2, Dict419TagHashTable, Dict419KeyHashTable, Dict419Contents }; // ----- SIEMENS CT APPL EVIDENCEDOCUMENT ----- const DictEntry Dict420Contents[] = { { 0x0029, 0x0000, 0, VR::UT, VM::M1, "PrivateTaskDatamodel" }, }; const unsigned short Dict420TagHashTable[] = { 2, 0, 1, 0, 0, }; const unsigned short Dict420KeyHashTable[] = { 2, 0, 1, 0, 45534, }; vtkDICOMDictionary::Dict Dict420Data = { "SIEMENS CT APPL EVIDENCEDOCUMENT", 1, 1, Dict420TagHashTable, Dict420KeyHashTable, Dict420Contents }; // ----- Viewing Protocol ----- const DictEntry Dict421Contents[] = { { 0x0065, 0x0093, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict421TagHashTable[] = { 2, 0, 1, 0, 147, }; const unsigned short Dict421KeyHashTable[] = { 2, 0, 1, 0, 5381, }; vtkDICOMDictionary::Dict Dict421Data = { "Viewing Protocol", 1, 1, Dict421TagHashTable, Dict421KeyHashTable, Dict421Contents }; // ----- SIEMENS DFR.01 MANIPULATED ----- const DictEntry Dict422Contents[] = { { 0x0017, 0x0011, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0012, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0014, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0025, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0027, 0, VR::IS, VM::M1, "" }, { 0x0017, 0x0029, 0, VR::IS, VM::M1, "EdgeEnhancement" }, { 0x0017, 0x0030, 0, VR::IS, VM::M1, "Harmonization" }, { 0x0017, 0x0031, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0032, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0033, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0035, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0037, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0038, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0071, 0, VR::IS, VM::M1, "Landmark" }, { 0x0017, 0x0072, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0073, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0074, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0077, 0, VR::DS, VM::M1, "PixelShiftHorizontal" }, { 0x0017, 0x0078, 0, VR::DS, VM::M1, "PixelShiftVertical" }, { 0x0017, 0x0079, 0, VR::US, VM::M1, "" }, { 0x0017, 0x007a, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0017, 0x0083, 0, VR::LO, VM::M1, "LeftMarker" }, { 0x0017, 0x0084, 0, VR::LO, VM::M1, "RightMarker" }, { 0x0017, 0x00a1, 0, VR::SH, VM::M1, "" }, { 0x0017, 0x00a2, 0, VR::SH, VM::M1, "ImageNameExtension1" }, { 0x0017, 0x00a3, 0, VR::SH, VM::M1, "ImageNameExtension2" }, }; const unsigned short Dict422TagHashTable[] = { 28, 28, 29, 32, 35, 38, 43, 28, 50, 53, 58, 63, 66, 69, 72, 77, 80, 83, 28, 86, 91, 28, 94, 28, 97, 28, 100, 103, 0, 1, 3, 21, 1, 2, 20, 1, 12, 55, 2, 1, 18, 24, 132, 3, 0, 17, 6, 41, 11, 53, 1, 10, 51, 2, 9, 50, 22, 128, 2, 8, 49, 23, 131, 1, 7, 48, 1, 25, 161, 1, 18, 119, 2, 17, 116, 27, 163, 1, 26, 162, 1, 15, 114, 1, 16, 115, 2, 13, 56, 14, 113, 1, 5, 39, 1, 4, 37, 1, 21, 122, 1, 19, 120, 1, 20, 121, }; const unsigned short Dict422KeyHashTable[] = { 28, 29, 28, 28, 32, 35, 28, 28, 28, 28, 28, 28, 28, 28, 28, 74, 79, 28, 28, 82, 28, 28, 85, 88, 91, 28, 28, 28, 0, 1, 24, 50767, 1, 6, 50857, 19, 0, 192, 1, 192, 2, 192, 3, 192, 4, 192, 5, 192, 8, 192, 9, 192, 10, 192, 11, 192, 12, 192, 13, 192, 15, 192, 16, 192, 17, 192, 20, 192, 21, 192, 22, 192, 25, 192, 2, 14, 42080, 19, 54772, 1, 7, 47610, 1, 18, 18953, 1, 23, 20449, 1, 26, 55280, 1, 27, 55280, }; vtkDICOMDictionary::Dict Dict422Data = { "SIEMENS DFR.01 MANIPULATED", 28, 28, Dict422TagHashTable, Dict422KeyHashTable, Dict422Contents }; // ----- BioPri ----- const DictEntry Dict423Contents[] = { { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0001, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0002, 0, VR::UN, VM::M1, "" }, { 0x0009, 0x0003, 0, VR::LO, VM::M1TN, "" }, { 0x0009, 0x0004, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0005, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0008, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::UN, VM::M1, "" }, }; const unsigned short Dict423TagHashTable[] = { 11, 16, 21, 24, 27, 30, 10, 10, 33, 36, 0, 2, 3, 3, 8, 9, 2, 2, 2, 7, 8, 1, 5, 5, 1, 4, 4, 1, 6, 7, 1, 9, 16, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict423KeyHashTable[] = { 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 0, 538, 1, 538, 2, 538, 3, 538, 4, 538, 5, 538, 6, 538, 7, 538, 8, 538, 9, 538, }; vtkDICOMDictionary::Dict Dict423Data = { "BioPri", 10, 10, Dict423TagHashTable, Dict423KeyHashTable, Dict423Contents }; // ----- GEMS_FUNCTOOL_01 ----- const DictEntry Dict424Contents[] = { { 0x0051, 0x0001, 0, VR::LO, VM::M1, "GroupName" }, { 0x0051, 0x0002, 0, VR::LO, VM::M1, "FunctionName" }, { 0x0051, 0x0003, 0, VR::SL, VM::M1, "Bias" }, { 0x0051, 0x0004, 0, VR::FL, VM::M1, "Scale" }, { 0x0051, 0x0005, 0, VR::SL, VM::M1, "ParameterCount" }, { 0x0051, 0x0006, 0, VR::LT, VM::M1, "Parameters" }, { 0x0051, 0x0007, 0, VR::LO, VM::M1, "Version" }, { 0x0051, 0x0008, 0, VR::SL, VM::M1, "ColorRampIndex" }, { 0x0051, 0x0009, 0, VR::SL, VM::M1, "WindowWidth" }, { 0x0051, 0x000a, 0, VR::SL, VM::M1, "WindowLevel" }, { 0x0051, 0x000b, 0, VR::FL, VM::M1, "BValue" }, { 0x0051, 0x000c, 0, VR::LO, VM::M1, "AnalysisPackage" }, { 0x0051, 0x000d, 0, VR::SL, VM::M1, "" }, { 0x0051, 0x000e, 0, VR::SL, VM::M1, "" }, }; const unsigned short Dict424TagHashTable[] = { 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 0, 1, 3, 4, 1, 4, 5, 1, 5, 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10, 11, 1, 11, 12, 1, 12, 13, 1, 13, 14, 1, 0, 1, 1, 1, 2, 1, 2, 3, }; const unsigned short Dict424KeyHashTable[] = { 14, 15, 18, 21, 14, 24, 33, 36, 41, 44, 47, 14, 14, 50, 0, 1, 0, 36287, 1, 1, 56947, 1, 11, 36799, 4, 3, 32300, 5, 5494, 12, 384, 13, 384, 1, 10, 12969, 2, 4, 4812, 6, 31966, 1, 2, 51714, 1, 8, 30294, 1, 7, 24871, 1, 9, 7100, }; vtkDICOMDictionary::Dict Dict424Data = { "GEMS_FUNCTOOL_01", 14, 14, Dict424TagHashTable, Dict424KeyHashTable, Dict424Contents }; // ----- Vital Images SW 3.4 ----- const DictEntry Dict425Contents[] = { { 0x5653, 0x0010, 0, VR::OB, VM::M1, "SavedWorkflow" }, { 0x5653, 0x0011, 0, VR::LO, VM::M1, "SavedWorkflowFileName" }, { 0x5653, 0x0012, 0, VR::OB, VM::M1, "SavedWorkflowFileData" }, { 0x5653, 0x0013, 0, VR::SL, VM::M1, "SavedWorkflowFileLength" }, { 0x5653, 0x0014, 0, VR::SQ, VM::M1, "SavedWorkflowFileSequence" }, { 0x5653, 0x0015, 0, VR::SQ, VM::M1, "ImageSequence" }, { 0x5653, 0x0016, 0, VR::SL, VM::M1, "VolumeInterpolatedSlices" }, { 0x5653, 0x0017, 0, VR::UI, VM::M1, "VolumeSOPInstanceUID" }, { 0x5653, 0x0018, 0, VR::SH, VM::M1, "SavedWorkflowMark" }, { 0x5653, 0x0019, 0, VR::UI, VM::M1, "VolumeStudyInstanceUID" }, { 0x5653, 0x0020, 0, VR::SL, VM::M1, "NumStudySwf" }, { 0x5653, 0x0021, 0, VR::SL, VM::M1, "NumSeriesSwf" }, { 0x5653, 0x0022, 0, VR::UI, VM::M1, "VolumeSeriesInstanceUID" }, { 0x5653, 0x0023, 0, VR::LO, VM::M1, "SavedWorkflowCodeMeaning" }, { 0x5653, 0x0024, 0, VR::OB, VM::M1, "SavedWorkflowData" }, { 0x5653, 0x0025, 0, VR::SL, VM::M1, "SavedWorkflowDataLength" }, }; const unsigned short Dict425TagHashTable[] = { 16, 16, 17, 20, 16, 16, 16, 16, 23, 28, 33, 38, 43, 46, 49, 54, 0, 1, 8, 24, 1, 9, 25, 2, 2, 18, 12, 34, 2, 3, 19, 13, 35, 2, 0, 16, 10, 32, 2, 1, 17, 11, 33, 1, 6, 22, 1, 7, 23, 2, 4, 20, 14, 36, 2, 5, 21, 15, 37, }; const unsigned short Dict425KeyHashTable[] = { 17, 20, 16, 23, 26, 29, 32, 16, 16, 16, 16, 35, 38, 41, 50, 55, 0, 1, 11, 42451, 1, 5, 19824, 1, 0, 43211, 1, 1, 40701, 1, 3, 16029, 1, 7, 54748, 1, 6, 25884, 1, 4, 29746, 4, 2, 18254, 9, 60926, 13, 39082, 14, 59966, 2, 8, 14641, 10, 24291, 2, 12, 52573, 15, 3896, }; vtkDICOMDictionary::Dict Dict425Data = { "Vital Images SW 3.4", 16, 16, Dict425TagHashTable, Dict425KeyHashTable, Dict425Contents }; // ----- AMI Annotations_01 ----- const DictEntry Dict426Contents[] = { { 0x3101, 0x0010, 0, VR::SQ, VM::M1, "AnnotationSequence" }, }; const unsigned short Dict426TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict426KeyHashTable[] = { 2, 0, 1, 0, 13593, }; vtkDICOMDictionary::Dict Dict426Data = { "AMI Annotations_01", 1, 1, Dict426TagHashTable, Dict426KeyHashTable, Dict426Contents }; // ----- CAMTRONICS ----- const DictEntry Dict427Contents[] = { { 0x0029, 0x0010, 0, VR::LT, VM::M1, "Commentline" }, { 0x0029, 0x0020, 0, VR::DS, VM::M1, "EdgeEnhancementCoefficient" }, { 0x0029, 0x0050, 0, VR::LT, VM::M1, "SceneText" }, { 0x0029, 0x0060, 0, VR::LT, VM::M1, "ImageText" }, { 0x0029, 0x0070, 0, VR::IS, VM::M1, "PixelShiftHorizontal" }, { 0x0029, 0x0080, 0, VR::IS, VM::M1, "PixelShiftVertical" }, { 0x0029, 0x0090, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict427TagHashTable[] = { 7, 8, 13, 18, 21, 24, 7, 0, 2, 0, 16, 2, 80, 2, 1, 32, 3, 96, 1, 5, 128, 1, 4, 112, 1, 6, 144, }; const unsigned short Dict427KeyHashTable[] = { 7, 8, 11, 16, 19, 22, 7, 0, 1, 5, 22482, 2, 0, 13618, 2, 13114, 1, 1, 33636, 1, 3, 30351, 2, 4, 10278, 6, 768, }; vtkDICOMDictionary::Dict Dict427Data = { "CAMTRONICS", 7, 7, Dict427TagHashTable, Dict427KeyHashTable, Dict427Contents }; // ----- Applicare/Print/Version 5.1 ----- const DictEntry Dict428Contents[] = { { 0x4101, 0x0001, 0, VR::UL, VM::M1, "MaskState" }, { 0x4101, 0x0002, 0, VR::SQ, VM::M1, "Annotations" }, { 0x4101, 0x0003, 0, VR::LO, VM::M1, "Font" }, { 0x4101, 0x0004, 0, VR::UL, VM::M1, "FontSize" }, { 0x4101, 0x0005, 0, VR::FD, VM::M1, "FontRelativeSize" }, { 0x4101, 0x0006, 0, VR::US, VM::M1, "Overlay" }, { 0x4101, 0x0007, 0, VR::US, VM::M1, "PixelRep" }, { 0x4101, 0x0008, 0, VR::US, VM::M1, "AnnotationLevel" }, { 0x4101, 0x0009, 0, VR::US, VM::M1, "ShowCaliper" }, }; const unsigned short Dict428TagHashTable[] = { 9, 10, 13, 9, 16, 19, 22, 25, 30, 0, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 2, 5, 6, 8, 9, 2, 0, 1, 7, 8, }; const unsigned short Dict428KeyHashTable[] = { 10, 9, 13, 16, 19, 22, 27, 30, 33, 0, 1, 4, 7803, 1, 1, 32969, 1, 5, 37252, 1, 8, 18802, 2, 6, 44289, 7, 40123, 1, 0, 19596, 1, 2, 60781, 1, 3, 34391, }; vtkDICOMDictionary::Dict Dict428Data = { "Applicare/Print/Version 5.1", 9, 9, Dict428TagHashTable, Dict428KeyHashTable, Dict428Contents }; // ----- GEHC_CT_ADVAPP_001 ----- const DictEntry Dict429Contents[] = { { 0x0053, 0x0020, 0, VR::IS, VM::M1, "TableSpeedNotReachesTargetFlag" }, { 0x0053, 0x0040, 0, VR::SH, VM::M1, "IterativeReconAnnotation" }, { 0x0053, 0x0041, 0, VR::SH, VM::M1, "IterativeReconMode" }, { 0x0053, 0x0042, 0, VR::LO, VM::M1, "IterativeReconConfiguration" }, { 0x0053, 0x0043, 0, VR::SH, VM::M1, "IterativeReconLevel" }, { 0x0053, 0x0060, 0, VR::SH, VM::M1, "ReconFlipRotateAnno" }, { 0x0053, 0x0061, 0, VR::SH, VM::M1, "HighResolutionFlag" }, { 0x0053, 0x0062, 0, VR::SH, VM::M1, "RespiratoryFlag" }, { 0x0053, 0x0063, 0, VR::CS, VM::M1, "ImagePositionPatientSetting" }, { 0x0053, 0x0064, 0, VR::IS, VM::M1, "ShutterMode" }, { 0x0053, 0x0065, 0, VR::IS, VM::M1, "ShutterModePercent" }, { 0x0053, 0x0066, 0, VR::LO, VM::M1, "ImageBrowserAnnotation" }, { 0x0053, 0x0067, 0, VR::IS, VM::M1, "OverlappedReconFlag" }, { 0x0053, 0x0068, 0, VR::IS, VM::M1, "RowNumberAnotationFlag" }, { 0x0053, 0x0069, 0, VR::LO, VM::M1, "ImageCheckAnnotation" }, { 0x0053, 0x006A, 0, VR::IS, VM::M1, "ODMFlag" }, { 0x0053, 0x006B, 0, VR::IS, VM::M1, "ODMReductionPercent" }, { 0x0053, 0x0070, 0, VR::IS, VM::M1, "MultiEnergySourceCount" }, { 0x0053, 0x0071, 0, VR::LO, VM::M1, "MultiEnergyScanType" }, { 0x0053, 0x0072, 0, VR::LO, VM::M1, "MultiEnergyReconType" }, { 0x0053, 0x0073, 0, VR::LO, VM::M1, "MultiEnergyImageType" }, { 0x0053, 0x0074, 0, VR::LO, VM::M1, "MultiEnergyMaterialType" }, { 0x0053, 0x0075, 0, VR::DS, VM::M1, "MonchromaticEnergy" }, { 0x0053, 0x0076, 0, VR::DS, VM::M1, "MultiEnergyWeightedSubtractionWeight1" }, { 0x0053, 0x0077, 0, VR::DS, VM::M1, "MultiEnergyWeightedSubtractionWeight2" }, { 0x0053, 0x0078, 0, VR::LO, VM::M1, "MultiEnergyWeightedSubtractionType" }, { 0x0053, 0x0079, 0, VR::LO, VM::M1, "MultiEnergyAcqMethod" }, { 0x0053, 0x007A, 0, VR::SH, VM::M1, "MultiEnergyFeatAnnotName" }, { 0x0053, 0x007B, 0, VR::SH, VM::M1, "MultiEnergyNoiseReduced" }, { 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReduceMethod" }, { 0x0053, 0x007D, 0, VR::LO, VM::M1, "SubOptimalIQString" }, { 0x0053, 0x007E, 0, VR::DS, VM::M1, "MultiEnergyHighLowRatio" }, { 0x0053, 0x007F, 0, VR::DS, VM::M1, "MultiEnergyDutyCycle" }, { 0x0053, 0x0080, 0, VR::DS, VM::M1, "MeasuredEffectiveHighkVp" }, { 0x0053, 0x0081, 0, VR::DS, VM::M1, "MeasuredEffectiveLowkVp" }, { 0x0053, 0x0082, 0, VR::DS, VM::M1, "MeasuredEffectiveMeankVp" }, { 0x0053, 0x0083, 0, VR::DS, VM::M1, "MeasuredEffectiveMeanmA" }, { 0x0053, 0x0084, 0, VR::DS, VM::M1, "CommandedFirstkVp" }, { 0x0053, 0x0085, 0, VR::DS, VM::M1, "CommandedFirstmA" }, { 0x0053, 0x0086, 0, VR::DS, VM::M1, "CommandedSecondkVp" }, { 0x0053, 0x0087, 0, VR::DS, VM::M1, "CommandedSecondmA" }, { 0x0053, 0x0088, 0, VR::SH, VM::M1, "MultiEnergyKVAnnotName" }, { 0x0053, 0x0089, 0, VR::SH, VM::M1, "MultiEnergyKVUnitLabel" }, { 0x0053, 0x008A, 0, VR::LO, VM::M1, "MaterialType1" }, { 0x0053, 0x008B, 0, VR::LO, VM::M1, "MaterialType2" }, { 0x0053, 0x008C, 0, VR::LO, VM::M1, "GSIScanModePreset" }, { 0x0053, 0x008D, 0, VR::IS, VM::M2, "MonoWindowLow" }, { 0x0053, 0x008E, 0, VR::IS, VM::M2, "MonoWindoHigh" }, { 0x0053, 0x008F, 0, VR::FL, VM::M110, "MD1AttenuationCurve" }, { 0x0053, 0x0092, 0, VR::DS, VM::M1, "MD1intercept" }, { 0x0053, 0x0093, 0, VR::DS, VM::M1, "MD1slope" }, { 0x0053, 0x0095, 0, VR::OW, VM::M1, "MD1supportData" }, { 0x0053, 0x0096, 0, VR::OW, VM::M1, "MD2supportData" }, { 0x0053, 0x0097, 0, VR::OW, VM::M1, "NM1data" }, { 0x0053, 0x0098, 0, VR::DS, VM::M1, "MD2intercept" }, { 0x0053, 0x0099, 0, VR::DS, VM::M1, "MD2slope" }, { 0x0053, 0x009A, 0, VR::OW, VM::M1, "NM2data" }, { 0x0053, 0x009B, 0, VR::FL, VM::M110, "MD2attenuationCurve" }, { 0x0053, 0x009C, 0, VR::SH, VM::M1, "GSIdataVersion" }, { 0x0053, 0x009D, 0, VR::LO, VM::M1, "MARsAnnotation" }, { 0x0053, 0x009E, 0, VR::IS, VM::M1, "MultiEnergyNumNoiseRedPairs" }, { 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" }, }; const unsigned short Dict429TagHashTable[] = { 62, 62, 62, 62, 62, 62, 62, 62, 63, 66, 62, 69, 72, 75, 78, 81, 84, 89, 94, 99, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 145, 150, 155, 160, 165, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 217, 220, 223, 226, 229, 232, 235, 62, 62, 0, 1, 49, 146, 1, 50, 147, 1, 51, 149, 1, 52, 150, 1, 53, 151, 1, 54, 152, 1, 55, 153, 2, 4, 67, 56, 154, 2, 3, 66, 57, 155, 2, 2, 65, 58, 156, 2, 1, 64, 59, 157, 1, 60, 158, 1, 61, 159, 1, 33, 128, 1, 34, 129, 1, 35, 130, 1, 36, 131, 1, 37, 132, 1, 38, 133, 1, 39, 134, 1, 40, 135, 1, 41, 136, 1, 42, 137, 2, 20, 115, 43, 138, 2, 19, 114, 44, 139, 2, 18, 113, 45, 140, 2, 17, 112, 46, 141, 2, 24, 119, 47, 142, 2, 23, 118, 48, 143, 1, 22, 117, 1, 21, 116, 1, 28, 123, 1, 27, 122, 1, 26, 121, 1, 25, 120, 1, 32, 127, 1, 31, 126, 1, 30, 125, 1, 29, 124, 1, 8, 99, 1, 7, 98, 1, 6, 97, 1, 5, 96, 2, 0, 32, 12, 103, 1, 11, 102, 1, 10, 101, 1, 9, 100, 1, 16, 107, 1, 15, 106, 1, 14, 105, 1, 13, 104, }; const unsigned short Dict429KeyHashTable[] = { 63, 66, 69, 72, 62, 75, 80, 62, 85, 88, 62, 93, 96, 62, 62, 99, 102, 105, 110, 113, 62, 62, 118, 62, 121, 124, 127, 130, 62, 133, 62, 62, 138, 62, 62, 141, 144, 149, 152, 155, 62, 62, 162, 167, 62, 172, 62, 177, 180, 187, 190, 193, 62, 198, 201, 62, 204, 207, 62, 210, 213, 220, 0, 1, 44, 27548, 1, 6, 63239, 1, 51, 18530, 1, 14, 11761, 2, 15, 21939, 49, 22296, 2, 12, 35503, 30, 22440, 1, 46, 45856, 2, 11, 14497, 53, 17487, 1, 25, 46296, 1, 10, 23489, 1, 42, 52010, 1, 48, 30604, 2, 16, 10503, 27, 15851, 1, 1, 20951, 2, 3, 39321, 31, 25828, 1, 37, 25160, 1, 35, 32349, 1, 36, 11679, 1, 26, 24117, 1, 47, 19118, 2, 7, 35629, 18, 33070, 1, 17, 49494, 1, 22, 51192, 2, 41, 5460, 61, 43197, 1, 0, 60877, 1, 23, 16858, 3, 9, 18183, 24, 16858, 34, 43180, 2, 39, 58808, 54, 1754, 2, 33, 37351, 57, 48169, 2, 13, 36912, 59, 27885, 1, 52, 24200, 3, 2, 40673, 8, 17968, 32, 23472, 1, 40, 41757, 1, 5, 40168, 2, 21, 56836, 29, 40641, 1, 45, 39096, 1, 58, 62935, 1, 56, 36614, 1, 20, 46221, 1, 4, 57645, 3, 28, 56356, 50, 7785, 60, 8845, 4, 19, 52485, 38, 3709, 43, 27547, 55, 49177, }; vtkDICOMDictionary::Dict Dict429Data = { "GEHC_CT_ADVAPP_001", 62, 62, Dict429TagHashTable, Dict429KeyHashTable, Dict429Contents }; // ----- NUD_PRIVATE ----- const DictEntry Dict430Contents[] = { { 0x7777, 0x0002, 0, VR::UT, VM::M1, "Interfile" }, { 0x7777, 0x0005, 0, VR::IS, VM::M1, "" }, }; const unsigned short Dict430TagHashTable[] = { 3, 6, 0, 1, 0, 2, 1, 1, 5, }; const unsigned short Dict430KeyHashTable[] = { 2, 3, 0, 2, 0, 47187, 1, 2690, }; vtkDICOMDictionary::Dict Dict430Data = { "NUD_PRIVATE", 2, 2, Dict430TagHashTable, Dict430KeyHashTable, Dict430Contents }; // ----- astm.org/diconde/iod/NdeCtCalibrationData ----- const DictEntry Dict431Contents[] = { { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" }, { 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" }, { 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" }, { 0x0009, 0x0070, 0, VR::OW, VM::M1, "AirCounts" }, { 0x0009, 0x0071, 0, VR::DS, VM::M1, "KVUsedInGainCalibration" }, { 0x0009, 0x0072, 0, VR::DS, VM::M1, "MAUsedInGainCalibration" }, { 0x0009, 0x0073, 0, VR::DS, VM::M1, "NumberOfFramesUsedForIntegration" }, { 0x0009, 0x0074, 0, VR::LO, VM::M1, "FilterMaterialUsedInGainCalibration" }, { 0x0009, 0x0075, 0, VR::DS, VM::M1, "FilterThicknessUsedInGainCalibration" }, { 0x0009, 0x0076, 0, VR::DA, VM::M1, "DateOfGainCalibration" }, { 0x0009, 0x0077, 0, VR::TM, VM::M1, "TimeOfGainCalibration" }, { 0x0009, 0x0080, 0, VR::OB, VM::M1, "BadPixelImage" }, { 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" }, }; const unsigned short Dict431TagHashTable[] = { 14, 13, 13, 17, 22, 25, 28, 31, 36, 39, 44, 13, 13, 0, 1, 2, 96, 2, 3, 112, 12, 153, 1, 4, 113, 1, 5, 114, 1, 6, 115, 2, 0, 64, 7, 116, 1, 8, 117, 2, 9, 118, 11, 128, 2, 1, 80, 10, 119, }; const unsigned short Dict431KeyHashTable[] = { 14, 19, 22, 13, 25, 30, 35, 13, 38, 43, 13, 13, 13, 0, 2, 7, 25645, 11, 50357, 1, 3, 29772, 1, 0, 24037, 2, 2, 48192, 5, 8278, 2, 6, 22008, 12, 56917, 1, 1, 56032, 2, 8, 9334, 10, 7464, 2, 4, 53052, 9, 5902, }; vtkDICOMDictionary::Dict Dict431Data = { "astm.org/diconde/iod/NdeCtCalibrationData", 13, 13, Dict431TagHashTable, Dict431KeyHashTable, Dict431Contents }; // ----- SPI-P-Private-CWS Release 1 ----- const DictEntry Dict432Contents[] = { { 0x0021, 0x0000, 0, VR::LT, VM::M1, "WindowOfImagesID" }, { 0x0021, 0x0001, 0, VR::CS, VM::M1, "WindowOfImagesType" }, { 0x0021, 0x0002, 0, VR::IS, VM::M1TN, "WindowOfImagesScope" }, }; const unsigned short Dict432TagHashTable[] = { 4, 3, 7, 0, 1, 0, 0, 2, 1, 1, 2, 2, }; const unsigned short Dict432KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 12497, 1, 65208, 2, 51040, }; vtkDICOMDictionary::Dict Dict432Data = { "SPI-P-Private-CWS Release 1", 3, 3, Dict432TagHashTable, Dict432KeyHashTable, Dict432Contents }; // ----- GEMS_SENO_02 ----- const DictEntry Dict433Contents[] = { { 0x0045, 0x0001, 0, VR::LO, VM::M1, "DigitalSenographConfiguration" }, { 0x0045, 0x0002, 0, VR::LT, VM::M1, "SystemSeriesDescription" }, { 0x0045, 0x0003, 0, VR::CS, VM::M1, "Track" }, { 0x0045, 0x0004, 0, VR::CS, VM::M1, "AES" }, { 0x0045, 0x0004, 0, VR::CS, VM::M1, "ExposureStatus" }, { 0x0045, 0x0006, 0, VR::DS, VM::M1, "Angulation" }, { 0x0045, 0x0007, 0, VR::DS, VM::M1, "CompressionThickness" }, { 0x0045, 0x0008, 0, VR::DS, VM::M1, "CompressionForce" }, { 0x0045, 0x0009, 0, VR::DS, VM::M1, "RealMagnificationFactor" }, { 0x0045, 0x000a, 0, VR::DS, VM::M1, "DisplayedMagnificationFactor" }, { 0x0045, 0x000b, 0, VR::CS, VM::M1, "SenographType" }, { 0x0045, 0x000c, 0, VR::DS, VM::M1, "IntegrationTime" }, { 0x0045, 0x000d, 0, VR::DS, VM::M1, "ROIOriginXY" }, { 0x0045, 0x000e, 0, VR::CS, VM::M1, "CorrectionType" }, { 0x0045, 0x000f, 0, VR::CS, VM::M1, "AcquisitionType" }, { 0x0045, 0x0010, 0, VR::DS, VM::M2, "CCDTemperature" }, { 0x0045, 0x0011, 0, VR::DS, VM::M2, "ReceptorSizeCmXY" }, { 0x0045, 0x0012, 0, VR::IS, VM::M2, "ReceptorSizePixelsXY" }, { 0x0045, 0x0013, 0, VR::ST, VM::M1, "Screen" }, { 0x0045, 0x0014, 0, VR::DS, VM::M1, "PixelPitchMicrons" }, { 0x0045, 0x0015, 0, VR::IS, VM::M1, "PixelDepthBits" }, { 0x0045, 0x0016, 0, VR::IS, VM::M2, "BinningFactorXY" }, { 0x0045, 0x0017, 0, VR::DS, VM::M1, "QuantumGain" }, { 0x0045, 0x0018, 0, VR::DS, VM::M1, "ElectronEDURatio" }, { 0x0045, 0x0019, 0, VR::DS, VM::M1, "ElectronicGain" }, { 0x0045, 0x001A, 0, VR::OB, VM::M1, "IDSDataBuffer" }, { 0x0045, 0x001B, 0, VR::LO, VM::M1, "ClinicalView" }, { 0x0045, 0x001C, 0, VR::CS, VM::M1, "BreastLaterality" }, { 0x0045, 0x001D, 0, VR::DS, VM::M1, "MeanOfRawGrayLevels" }, { 0x0045, 0x001E, 0, VR::DS, VM::M1, "MeanOfOffsetGrayLevels" }, { 0x0045, 0x001F, 0, VR::DS, VM::M1, "MeanOfCorrectedGrayLevels" }, { 0x0045, 0x0020, 0, VR::DS, VM::M1, "MeanOfRegionGrayLevels" }, { 0x0045, 0x0021, 0, VR::DS, VM::M1, "MeanOfLogRegionGrayLevels" }, { 0x0045, 0x0022, 0, VR::DS, VM::M1, "StandardDeviationOfRawGrayLevels" }, { 0x0045, 0x0023, 0, VR::DS, VM::M1, "StandardDeviationOfCorrectedGrayLevels" }, { 0x0045, 0x0024, 0, VR::DS, VM::M1, "StandardDeviationOfRegionGrayLevels" }, { 0x0045, 0x0025, 0, VR::DS, VM::M1, "StandardDeviationOfLogRegionGrayLevels" }, { 0x0045, 0x0026, 0, VR::OB, VM::M1, "MAOBuffer" }, { 0x0045, 0x0027, 0, VR::IS, VM::M1, "SetNumber" }, { 0x0045, 0x0028, 0, VR::CS, VM::M1, "WindowingType" }, { 0x0045, 0x0029, 0, VR::DS, VM::M1TN, "WindowingParameters" }, { 0x0045, 0x002a, 0, VR::IS, VM::M1, "CrosshairCursorXCoordinates" }, { 0x0045, 0x002b, 0, VR::IS, VM::M1, "CrosshairCursorYCoordinates" }, { 0x0045, 0x002c, 0, VR::DS, VM::M1, "ReferenceLandmarkAX3DCoordinates" }, { 0x0045, 0x002d, 0, VR::DS, VM::M1, "ReferenceLandmarkAY3DCoordinates" }, { 0x0045, 0x002e, 0, VR::DS, VM::M1, "ReferenceLandmarkAZ3DCoordinates" }, { 0x0045, 0x002f, 0, VR::IS, VM::M1, "ReferenceLandmarkAXImageCoordinates" }, { 0x0045, 0x0030, 0, VR::IS, VM::M1, "ReferenceLandmarkAYImageCoordinates" }, { 0x0045, 0x0031, 0, VR::DS, VM::M1, "ReferenceLandmarkBX3DCoordinates" }, { 0x0045, 0x0032, 0, VR::DS, VM::M1, "ReferenceLandmarkBY3DCoordinates" }, { 0x0045, 0x0033, 0, VR::DS, VM::M1, "ReferenceLandmarkBZ3DCoordinates" }, { 0x0045, 0x0034, 0, VR::IS, VM::M1, "ReferenceLandmarkBXImageCoordinates" }, { 0x0045, 0x0035, 0, VR::IS, VM::M1, "ReferenceLandmarkBYImageCoordinates" }, { 0x0045, 0x0036, 0, VR::DS, VM::M1, "XRaySourceXLocation" }, { 0x0045, 0x0037, 0, VR::DS, VM::M1, "XRaySourceYLocation" }, { 0x0045, 0x0038, 0, VR::DS, VM::M1, "XRaySourceZLocation" }, { 0x0045, 0x0039, 0, VR::US, VM::M1, "VignetteRows" }, { 0x0045, 0x003a, 0, VR::US, VM::M1, "VignetteColumns" }, { 0x0045, 0x003b, 0, VR::US, VM::M1, "VignetteBitsAllocated" }, { 0x0045, 0x003c, 0, VR::US, VM::M1, "VignetteBitsStored" }, { 0x0045, 0x003d, 0, VR::US, VM::M1, "VignetteHighBit" }, { 0x0045, 0x003e, 0, VR::US, VM::M1, "VignettePixelRepresentation" }, { 0x0045, 0x003f, 0, VR::OB, VM::M1, "VignettePixelData" }, { 0x0045, 0x0049, 0, VR::DS, VM::M1, "RadiologicalThickness" }, { 0x0045, 0x0050, 0, VR::UI, VM::M1, "FallbackInstanceUID" }, { 0x0045, 0x0051, 0, VR::UI, VM::M1, "FallbackSeriesUID" }, { 0x0045, 0x0052, 0, VR::IS, VM::M1, "RawDiagnosticLow" }, { 0x0045, 0x0053, 0, VR::IS, VM::M1, "RawDiagnosticHigh" }, { 0x0045, 0x0054, 0, VR::DS, VM::M1, "Exponent" }, { 0x0045, 0x0055, 0, VR::IS, VM::M1, "ACoefficients" }, { 0x0045, 0x0056, 0, VR::DS, VM::M1, "NoiseReductionSensitivity" }, { 0x0045, 0x0057, 0, VR::DS, VM::M1, "NoiseReductionThreshold" }, { 0x0045, 0x0058, 0, VR::DS, VM::M1, "Mu" }, { 0x0045, 0x0059, 0, VR::IS, VM::M1, "Threshold" }, { 0x0045, 0x0060, 0, VR::IS, VM::M4, "BreastROIX" }, { 0x0045, 0x0061, 0, VR::IS, VM::M4, "BreastROIY" }, { 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" }, { 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" }, { 0x0045, 0x0064, 0, VR::IS, VM::M1, "SegmentationThreshold" }, { 0x0045, 0x0065, 0, VR::IS, VM::M1, "DetectorEntranceDose" }, { 0x0045, 0x0066, 0, VR::IS, VM::M1, "AsymmetricalCollimationInformation" }, { 0x0045, 0x0071, 0, VR::OB, VM::M1, "STXBuffer" }, { 0x0045, 0x0072, 0, VR::DS, VM::M2, "ImageCropPoint" }, { 0x0045, 0x0090, 0, VR::SH, VM::M1, "PremiumViewBeta" }, { 0x0045, 0x00A0, 0, VR::DS, VM::M1, "SignalAverageFactor" }, { 0x0045, 0x00A1, 0, VR::DS, VM::M2TN, "OrganDoseForSourceImages" }, { 0x0045, 0x00A2, 0, VR::DS, VM::M2TN, "EntranceDoseInmGyForSourceImages" }, { 0x0045, 0x00A4, 0, VR::DS, VM::M1, "OrganDoseIndGyForCompleteDBTSequence" }, { 0x0045, 0x00A6, 0, VR::UI, VM::M1, "SOPInstanceUIDForLossyCompression" }, { 0x0045, 0x00A7, 0, VR::LT, VM::M1, "ReconstructionParameters" }, { 0x0045, 0x00A8, 0, VR::DS, VM::M1, "EntranceDoseIndGyForCompleteDBTSequence" }, { 0x0045, 0x00A9, 0, VR::DS, VM::M1, "ReplacementImage" }, { 0x0045, 0x00AA, 0, VR::SQ, VM::M1, "ReplacemeImageSequence" }, { 0x0045, 0x00AB, 0, VR::DS, VM::M1, "CumulativeOrganDoseIndGy" }, { 0x0045, 0x00AC, 0, VR::DS, VM::M1, "CumulativeEntranceDoseInmGy" }, { 0x0045, 0x00AD, 0, VR::LO, VM::M1TN, "PaddleProperties" }, }; const unsigned short Dict433TagHashTable[] = { 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 138, 141, 144, 147, 152, 157, 162, 167, 172, 177, 184, 189, 192, 195, 198, 201, 206, 211, 214, 217, 222, 227, 230, 233, 238, 241, 246, 96, 96, 251, 254, 257, 260, 263, 266, 96, 96, 96, 96, 269, 96, 96, 272, 96, 96, 96, 96, 96, 96, 96, 96, 275, 96, 280, 283, 96, 286, 289, 292, 295, 298, 301, 304, 307, 310, 313, 316, 319, 322, 325, 328, 331, 334, 337, 340, 343, 346, 349, 352, 355, 358, 361, 364, 0, 1, 35, 36, 1, 36, 37, 1, 37, 38, 1, 38, 39, 1, 31, 32, 1, 32, 33, 1, 33, 34, 1, 34, 35, 1, 43, 44, 1, 44, 45, 1, 45, 46, 1, 46, 47, 2, 39, 40, 63, 73, 1, 40, 41, 1, 41, 42, 1, 42, 43, 2, 51, 52, 69, 85, 2, 52, 53, 68, 84, 2, 53, 54, 71, 87, 2, 54, 55, 70, 86, 2, 47, 48, 65, 81, 2, 48, 49, 64, 80, 3, 49, 50, 67, 83, 83, 144, 2, 50, 51, 66, 82, 1, 59, 60, 1, 60, 61, 1, 61, 62, 1, 62, 63, 2, 55, 56, 73, 89, 2, 56, 57, 72, 88, 1, 57, 58, 1, 58, 59, 2, 79, 101, 88, 166, 2, 78, 100, 89, 167, 1, 87, 164, 1, 80, 102, 2, 75, 97, 86, 162, 1, 74, 96, 2, 77, 99, 84, 160, 2, 76, 98, 85, 161, 1, 94, 172, 1, 95, 173, 1, 92, 170, 1, 93, 171, 1, 90, 168, 1, 91, 169, 1, 81, 113, 1, 82, 114, 2, 3, 4, 4, 4, 1, 5, 6, 1, 6, 7, 1, 0, 1, 1, 1, 2, 1, 2, 3, 1, 11, 12, 1, 12, 13, 1, 13, 14, 1, 14, 15, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10, 11, 1, 19, 20, 1, 20, 21, 1, 21, 22, 1, 22, 23, 1, 15, 16, 1, 16, 17, 1, 17, 18, 1, 18, 19, 1, 27, 28, 1, 28, 29, 1, 29, 30, 1, 30, 31, 1, 23, 24, 1, 24, 25, 1, 25, 26, 1, 26, 27, }; const unsigned short Dict433KeyHashTable[] = { 96, 97, 96, 100, 107, 112, 115, 96, 120, 96, 123, 126, 131, 96, 96, 96, 96, 138, 96, 96, 141, 144, 147, 150, 155, 96, 96, 158, 161, 166, 96, 169, 96, 96, 174, 96, 96, 177, 182, 185, 190, 193, 198, 96, 96, 203, 206, 215, 220, 96, 223, 96, 96, 96, 228, 96, 235, 240, 243, 252, 257, 260, 271, 276, 279, 286, 293, 96, 96, 96, 296, 299, 96, 96, 302, 305, 308, 96, 96, 313, 316, 96, 319, 96, 322, 325, 330, 96, 96, 333, 336, 339, 342, 96, 345, 96, 0, 1, 93, 26037, 3, 6, 26232, 28, 24320, 94, 43972, 2, 4, 20118, 41, 22029, 1, 42, 57094, 2, 58, 56603, 82, 26514, 1, 12, 51589, 1, 44, 63591, 2, 45, 20054, 49, 46817, 3, 54, 39300, 57, 12968, 64, 22319, 1, 80, 17463, 1, 30, 46969, 1, 87, 44150, 1, 33, 32554, 2, 5, 17429, 52, 15882, 1, 91, 25209, 1, 70, 31193, 2, 77, 35191, 95, 57312, 1, 84, 31960, 2, 26, 19286, 32, 19914, 1, 0, 23511, 2, 16, 6665, 18, 40216, 1, 7, 63059, 2, 34, 43817, 72, 61068, 1, 74, 64367, 2, 43, 63437, 75, 64367, 2, 48, 46663, 60, 36117, 1, 55, 15025, 4, 10, 39054, 20, 48698, 59, 38478, 90, 34871, 2, 40, 51299, 92, 65091, 1, 35, 12764, 2, 36, 16762, 73, 57428, 3, 51, 41903, 56, 49761, 68, 59118, 2, 11, 34927, 69, 12854, 1, 25, 15574, 4, 2, 54078, 19, 15035, 21, 24137, 38, 4591, 2, 83, 31562, 89, 33656, 1, 37, 9341, 5, 15, 41157, 31, 39124, 39, 55128, 71, 12909, 76, 18478, 2, 3, 49025, 23, 14306, 1, 13, 16445, 3, 29, 1394, 61, 17815, 78, 6145, 3, 8, 61646, 27, 17264, 88, 61127, 1, 65, 19411, 1, 66, 36261, 1, 62, 35933, 1, 17, 2907, 1, 53, 63574, 2, 24, 26408, 50, 46970, 1, 22, 54530, 1, 14, 36702, 1, 86, 32960, 1, 67, 59109, 2, 46, 26793, 85, 29626, 1, 47, 22617, 1, 1, 56465, 1, 79, 5351, 1, 63, 59782, 1, 9, 54346, 1, 81, 26806, }; vtkDICOMDictionary::Dict Dict433Data = { "GEMS_SENO_02", 96, 96, Dict433TagHashTable, Dict433KeyHashTable, Dict433Contents }; // ----- BioPri3D ----- const DictEntry Dict434Contents[] = { { 0x0011, 0x0020, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0024, 0, VR::DS, VM::M1TN, "" }, { 0x0011, 0x0030, 0, VR::LO, VM::M1, "" }, { 0x0011, 0x0031, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x0032, 0, VR::SL, VM::M1, "" }, { 0x0011, 0x0039, 0, VR::CS, VM::M1, "" }, { 0x0011, 0x003a, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x00d0, 0, VR::OB, VM::M1, "" }, { 0x0011, 0x00e0, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x00e1, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x00e2, 0, VR::UL, VM::M1, "" }, { 0x0011, 0x00e3, 0, VR::US, VM::M1, "" }, { 0x0011, 0x00e4, 0, VR::US, VM::M1, "" }, { 0x0011, 0x00e5, 0, VR::CS, VM::M1, "" }, { 0x0063, 0x000c, 0, VR::DS, VM::M1TN, "" }, { 0x0063, 0x0020, 0, VR::US, VM::M1, "" }, { 0x0063, 0x0021, 0, VR::UL, VM::M1, "" }, { 0x0063, 0x0035, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict434TagHashTable[] = { 18, 18, 19, 18, 22, 18, 25, 28, 33, 36, 18, 18, 39, 44, 51, 56, 18, 61, 0, 1, 14, 12, 1, 5, 57, 1, 10, 226, 2, 6, 58, 11, 227, 1, 8, 224, 1, 9, 225, 2, 12, 228, 15, 32, 3, 0, 32, 13, 229, 16, 33, 2, 3, 49, 7, 208, 2, 2, 48, 17, 53, 2, 1, 36, 4, 50, }; const unsigned short Dict434KeyHashTable[] = { 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 0, 18, 0, 298, 1, 298, 2, 298, 3, 298, 4, 298, 5, 298, 6, 298, 7, 298, 8, 298, 9, 298, 10, 298, 11, 298, 12, 298, 13, 298, 14, 298, 15, 298, 16, 298, 17, 298, }; vtkDICOMDictionary::Dict Dict434Data = { "BioPri3D", 18, 18, Dict434TagHashTable, Dict434KeyHashTable, Dict434Contents }; // ----- TOSHIBA_SR ----- const DictEntry Dict435Contents[] = { { 0x7015, 0x0010, 0, VR::OB, VM::M1, "" }, { 0x7015, 0x0060, 0, VR::OB, VM::M1, "" }, }; const unsigned short Dict435TagHashTable[] = { 3, 6, 0, 1, 1, 96, 1, 0, 16, }; const unsigned short Dict435KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict435Data = { "TOSHIBA_SR", 2, 2, Dict435TagHashTable, Dict435KeyHashTable, Dict435Contents }; // ----- DIDI TO PCR 1.1 ----- const DictEntry Dict436Contents[] = { { 0x0019, 0x0022, 0, VR::LO, VM::M1, "RouteAET" }, { 0x0019, 0x0023, 0, VR::DS, VM::M1, "PCRPrintScale" }, { 0x0019, 0x0024, 0, VR::ST, VM::M1, "PCRPrintJobEnd" }, { 0x0019, 0x0025, 0, VR::IS, VM::M1, "PCRNoFilmCopies" }, { 0x0019, 0x0026, 0, VR::IS, VM::M1, "PCRFilmLayoutPosition" }, { 0x0019, 0x0027, 0, VR::ST, VM::M1, "PCRPrintReportName" }, { 0x0019, 0x0070, 0, VR::ST, VM::M1, "RADProtocolPrinter" }, { 0x0019, 0x0071, 0, VR::ST, VM::M1, "RADProtocolMedium" }, { 0x0019, 0x0089, 0, VR::IS, VM::M1, "ExposureIndex" }, { 0x0019, 0x008A, 0, VR::IS, VM::M1, "CollimatorX" }, { 0x0019, 0x008B, 0, VR::IS, VM::M1, "CollimatorY" }, { 0x0019, 0x008C, 0, VR::LO, VM::M1, "PrintMarker" }, { 0x0019, 0x008D, 0, VR::LO, VM::M1, "RGDVName" }, { 0x0019, 0x008E, 0, VR::LO, VM::M1, "AcqdSensitivity" }, { 0x0019, 0x008F, 0, VR::LO, VM::M1, "ProcessingCategory" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "UnprocessedFlag" }, { 0x0019, 0x0091, 0, VR::DS, VM::M1TN, "KeyValues" }, { 0x0019, 0x0092, 0, VR::LO, VM::M1, "DestinationPostprocessingFunction" }, { 0x0019, 0x00A0, 0, VR::LO, VM::M1, "Version" }, { 0x0019, 0x00A1, 0, VR::LO, VM::M1, "RangingMode" }, { 0x0019, 0x00A2, 0, VR::DS, VM::M1, "AbdomenBrightness" }, { 0x0019, 0x00A3, 0, VR::DS, VM::M1, "FixedBrightness" }, { 0x0019, 0x00A4, 0, VR::DS, VM::M1, "DetailContrast" }, { 0x0019, 0x00A5, 0, VR::DS, VM::M1, "ContrastBalance" }, { 0x0019, 0x00A6, 0, VR::DS, VM::M1, "StructureBoost" }, { 0x0019, 0x00A7, 0, VR::DS, VM::M1, "StructurePreference" }, { 0x0019, 0x00A8, 0, VR::DS, VM::M1, "NoiseRobustness" }, { 0x0019, 0x00A9, 0, VR::DS, VM::M1, "NoiseDoseLimit" }, { 0x0019, 0x00AA, 0, VR::DS, VM::M1, "NoiseDoseStep" }, { 0x0019, 0x00AB, 0, VR::DS, VM::M1, "NoiseFrequencyLimit" }, { 0x0019, 0x00AC, 0, VR::DS, VM::M1, "WeakContrastLimit" }, { 0x0019, 0x00AD, 0, VR::DS, VM::M1, "StrongContrastLimit" }, { 0x0019, 0x00AE, 0, VR::DS, VM::M1, "StructureBoostOffset" }, { 0x0019, 0x00AF, 0, VR::LO, VM::M1, "SmoothGain" }, { 0x0019, 0x00B0, 0, VR::LO, VM::M1, "MeasureField1" }, { 0x0019, 0x00B1, 0, VR::LO, VM::M1, "MeasureField2" }, { 0x0019, 0x00B2, 0, VR::IS, VM::M1, "KeyPercentile1" }, { 0x0019, 0x00B3, 0, VR::IS, VM::M1, "KeyPercentile2" }, { 0x0019, 0x00B4, 0, VR::IS, VM::M1, "DensityLUT" }, { 0x0019, 0x00B5, 0, VR::DS, VM::M1, "Brightness" }, { 0x0019, 0x00B6, 0, VR::DS, VM::M1, "Gamma" }, { 0x0089, 0x0010, 0, VR::SQ, VM::M1, "StampImageSequence" }, }; const unsigned short Dict436TagHashTable[] = { 43, 46, 49, 52, 42, 55, 58, 61, 64, 67, 70, 73, 78, 83, 88, 91, 94, 99, 104, 111, 118, 127, 134, 139, 144, 147, 42, 42, 42, 150, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 1, 37, 179, 1, 36, 178, 1, 35, 177, 1, 34, 176, 1, 40, 182, 1, 39, 181, 1, 38, 180, 1, 29, 171, 1, 28, 170, 1, 27, 169, 2, 17, 146, 26, 168, 2, 16, 145, 33, 175, 2, 15, 144, 32, 174, 1, 31, 173, 1, 30, 172, 2, 1, 35, 21, 163, 2, 0, 34, 20, 162, 3, 3, 37, 10, 139, 19, 161, 3, 2, 36, 9, 138, 18, 160, 4, 5, 39, 6, 112, 8, 137, 25, 167, 3, 4, 38, 7, 113, 24, 166, 2, 14, 143, 23, 165, 2, 13, 142, 22, 164, 1, 12, 141, 1, 11, 140, 1, 41, 16, }; const unsigned short Dict436KeyHashTable[] = { 42, 42, 43, 48, 53, 42, 58, 42, 42, 42, 42, 61, 64, 42, 69, 72, 42, 42, 75, 78, 42, 81, 84, 89, 96, 42, 42, 42, 99, 42, 104, 42, 107, 114, 119, 128, 42, 133, 136, 143, 146, 149, 0, 2, 6, 14120, 39, 6294, 2, 27, 7793, 31, 6110, 2, 38, 303, 41, 47757, 1, 17, 41985, 1, 9, 11924, 2, 5, 55508, 10, 11924, 1, 30, 60574, 1, 26, 40782, 1, 40, 41903, 1, 1, 9678, 1, 12, 5914, 2, 3, 40326, 14, 54337, 3, 4, 9563, 23, 44781, 24, 47095, 1, 32, 11134, 2, 8, 57814, 22, 46849, 1, 28, 61070, 3, 11, 30034, 20, 54690, 21, 37611, 2, 2, 17652, 25, 52274, 4, 0, 17150, 15, 4980, 16, 52278, 34, 40113, 2, 18, 32500, 35, 40113, 1, 13, 26714, 3, 19, 609, 33, 58748, 36, 53434, 1, 37, 53434, 1, 29, 22574, 1, 7, 759, }; vtkDICOMDictionary::Dict Dict436Data = { "DIDI TO PCR 1.1", 42, 42, Dict436TagHashTable, Dict436KeyHashTable, Dict436Contents }; // ----- SIEMENS MEDCOM OOG ----- const DictEntry Dict437Contents[] = { { 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComOOGType" }, { 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComOOGVersion" }, { 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComOOGInfo" }, }; const unsigned short Dict437TagHashTable[] = { 4, 3, 9, 0, 2, 0, 8, 2, 16, 1, 1, 9, }; const unsigned short Dict437KeyHashTable[] = { 4, 7, 10, 0, 1, 0, 36427, 1, 2, 31630, 1, 1, 38561, }; vtkDICOMDictionary::Dict Dict437Data = { "SIEMENS MEDCOM OOG", 3, 3, Dict437TagHashTable, Dict437KeyHashTable, Dict437Contents }; // ----- astm.org/diconde/iod/NdeDxDetector ----- const DictEntry Dict438Contents[] = { { 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" }, { 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" }, { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" }, { 0x0009, 0x0022, 0, VR::DS, VM::M1, "SensorName" }, { 0x0009, 0x0024, 0, VR::DS, VM::M1, "HorizontalOffsetOfSensor" }, { 0x0009, 0x0026, 0, VR::DS, VM::M1, "VerticalOffsetOfSensor" }, { 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" }, }; const unsigned short Dict438TagHashTable[] = { 7, 8, 7, 11, 7, 16, 21, 0, 1, 3, 34, 2, 0, 17, 4, 36, 2, 5, 38, 6, 40, 2, 1, 18, 2, 32, }; const unsigned short Dict438KeyHashTable[] = { 8, 7, 13, 16, 7, 19, 24, 0, 2, 0, 20186, 6, 21387, 1, 3, 20978, 1, 5, 52094, 2, 1, 53765, 2, 8567, 1, 4, 7561, }; vtkDICOMDictionary::Dict Dict438Data = { "astm.org/diconde/iod/NdeDxDetector", 7, 7, Dict438TagHashTable, Dict438KeyHashTable, Dict438Contents }; // ----- PMTF INFORMATION DATA ----- const DictEntry Dict439Contents[] = { { 0x0029, 0x0001, 0, VR::SQ, VM::M1, "" }, { 0x0029, 0x0031, 0, VR::LO, VM::M1, "PMTFInformation1" }, { 0x0029, 0x0032, 0, VR::UL, VM::M1, "PMTFInformation2" }, { 0x0029, 0x0033, 0, VR::UL, VM::M1, "PMTFInformation3" }, { 0x0029, 0x0034, 0, VR::CS, VM::M1, "PMTFInformation4" }, { 0x0029, 0x0089, 0, VR::LO, VM::M1, "" }, { 0x0029, 0x0090, 0, VR::OB, VM::M1, "" }, { 0x7015, 0x0073, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict439TagHashTable[] = { 9, 8, 14, 19, 8, 24, 8, 27, 0, 2, 0, 1, 1, 49, 2, 3, 51, 5, 137, 2, 2, 50, 6, 144, 1, 4, 52, 1, 7, 115, }; const unsigned short Dict439KeyHashTable[] = { 8, 8, 8, 9, 12, 15, 26, 8, 0, 1, 1, 6778, 1, 2, 6778, 5, 0, 672, 3, 6778, 5, 672, 6, 672, 7, 672, 1, 4, 6778, }; vtkDICOMDictionary::Dict Dict439Data = { "PMTF INFORMATION DATA", 8, 8, Dict439TagHashTable, Dict439KeyHashTable, Dict439Contents }; // ----- SIEMENS MED DISPLAY ----- const DictEntry Dict440Contents[] = { { 0x0029, 0x0004, 0, VR::CS, VM::M1, "PhotometricInterpretation" }, { 0x0029, 0x0010, 0, VR::US, VM::M1, "RowsOfSubmatrix" }, { 0x0029, 0x0011, 0, VR::US, VM::M1, "ColumnsOfSubmatrix" }, { 0x0029, 0x0020, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0021, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0050, 0, VR::US, VM::M1, "OriginOfSubmatrix" }, { 0x0029, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0029, 0x0099, 0, VR::LO, VM::M1, "ShutterType" }, { 0x0029, 0x00a0, 0, VR::US, VM::M1, "RowsOfRectangularShutter" }, { 0x0029, 0x00a1, 0, VR::US, VM::M1, "ColumnsOfRectangularShutter" }, { 0x0029, 0x00a2, 0, VR::US, VM::M1, "OriginOfRectangularShutter" }, { 0x0029, 0x00b0, 0, VR::US, VM::M1, "RadiusOfCircularShutter" }, { 0x0029, 0x00b2, 0, VR::US, VM::M1, "OriginOfCircularShutter" }, { 0x0029, 0x00c1, 0, VR::US, VM::M1, "ContourOfIrregularShutter" }, }; const unsigned short Dict440TagHashTable[] = { 15, 18, 14, 23, 14, 14, 14, 14, 28, 33, 36, 39, 44, 47, 0, 1, 2, 17, 2, 1, 16, 11, 176, 2, 0, 4, 6, 128, 2, 4, 33, 5, 80, 1, 3, 32, 1, 7, 153, 2, 10, 162, 13, 193, 1, 9, 161, 2, 8, 160, 12, 178, }; const unsigned short Dict440KeyHashTable[] = { 15, 14, 18, 14, 14, 23, 32, 37, 40, 14, 45, 14, 14, 48, 0, 1, 1, 50526, 2, 2, 14292, 9, 23104, 4, 0, 5445, 3, 384, 4, 384, 6, 384, 2, 12, 24464, 13, 59755, 1, 10, 30903, 2, 7, 15041, 8, 44622, 1, 11, 37730, 1, 5, 20118, }; vtkDICOMDictionary::Dict Dict440Data = { "SIEMENS MED DISPLAY", 14, 14, Dict440TagHashTable, Dict440KeyHashTable, Dict440Contents }; // ----- MITRA LINKED ATTRIBUTES 1.0 ----- const DictEntry Dict441Contents[] = { { 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" }, }; const unsigned short Dict441TagHashTable[] = { 2, 0, 1, 0, 32, }; const unsigned short Dict441KeyHashTable[] = { 2, 0, 1, 0, 55096, }; vtkDICOMDictionary::Dict Dict441Data = { "MITRA LINKED ATTRIBUTES 1.0", 1, 1, Dict441TagHashTable, Dict441KeyHashTable, Dict441Contents }; // ----- BRIT Systems, Inc. ----- const DictEntry Dict442Contents[] = { { 0x0021, 0x0000, 0, VR::SQ, VM::M1, "PersonInformationSequence" }, { 0x0021, 0x0001, 0, VR::LO, VM::M1, "PersonID" }, { 0x0021, 0x0002, 0, VR::PN, VM::M1, "PersonName" }, { 0x0021, 0x0003, 0, VR::LO, VM::M1, "PersonRole" }, { 0x0021, 0x0004, 0, VR::SH, VM::M1, "PersonHomePhone" }, { 0x0021, 0x0005, 0, VR::SH, VM::M1, "PersonWorkPhone" }, { 0x0021, 0x0006, 0, VR::SH, VM::M1, "PersonCellPhone" }, { 0x0021, 0x0007, 0, VR::SH, VM::M1, "PersonPagerPhone" }, { 0x0021, 0x0008, 0, VR::SH, VM::M1, "PersonFaxPhone" }, { 0x0021, 0x0009, 0, VR::LO, VM::M1, "PersonEMail" }, { 0x0021, 0x000A, 0, VR::ST, VM::M1, "PersonAddress" }, { 0x0021, 0x000B, 0, VR::LO, VM::M1, "PersonPassword" }, { 0x0021, 0x000C, 0, VR::SH, VM::M1, "PersonEmergencyPhone" }, { 0x0021, 0x000D, 0, VR::LO, VM::M1, "PhysicianID" }, { 0x0021, 0x0011, 0, VR::LO, VM::M1, "OriginalPatientID" }, { 0x0021, 0x0012, 0, VR::UI, VM::M1, "OriginalStudyInstanceUID" }, { 0x0021, 0x0013, 0, VR::UI, VM::M1, "OriginalSeriesInstanceUID" }, { 0x0021, 0x0014, 0, VR::LO, VM::M1, "MasterAccessionNumber" }, { 0x0021, 0x0015, 0, VR::LO, VM::M1, "OrderCategory" }, { 0x0021, 0x0016, 0, VR::LO, VM::M1, "PatientICN" }, { 0x0021, 0x0017, 0, VR::LO, VM::M1, "PatientDFS" }, { 0x0021, 0x0018, 0, VR::LO, VM::M1, "PatientClass" }, { 0x0021, 0x0019, 0, VR::LO, VM::M1, "PatientType" }, { 0x0021, 0x001F, 0, VR::LT, VM::M1, "GenericString" }, { 0x0021, 0x0020, 0, VR::LO, VM::M1, "QCStudyAssignedBy" }, { 0x0021, 0x0021, 0, VR::LO, VM::M1, "QCStudySplitBy" }, { 0x0021, 0x0022, 0, VR::LO, VM::M1, "QCStudyMovedBy" }, { 0x0021, 0x0023, 0, VR::LO, VM::M1, "QCStudyEditedBy" }, { 0x0021, 0x0024, 0, VR::LO, VM::M1, "QCSeriesSplitBy" }, { 0x0021, 0x0025, 0, VR::LO, VM::M1, "QCSeriesMovedBy" }, { 0x0021, 0x0026, 0, VR::LO, VM::M1, "QCSeriesEditedBy" }, { 0x0021, 0x0027, 0, VR::LO, VM::M1, "QCImageMovedBy" }, { 0x0021, 0x0028, 0, VR::LO, VM::M1, "QCImageEditedBy" }, { 0x0021, 0x0030, 0, VR::LO, VM::M1, "QCDoneTime" }, { 0x0021, 0x0031, 0, VR::LO, VM::M1, "QCLastModificationTime" }, { 0x0021, 0x0032, 0, VR::LO, VM::M1, "QCImageAcceptedBy" }, { 0x0021, 0x0033, 0, VR::LO, VM::M1, "QCImageRejectedBy" }, { 0x0021, 0x0034, 0, VR::DA, VM::M1, "QCLastModificationDate" }, { 0x0021, 0x0050, 0, VR::LO, VM::M1, "QCDeletionRequested" }, { 0x0021, 0x0090, 0, VR::AE, VM::M1, "OriginalSenderAETitle" }, { 0x0021, 0x0091, 0, VR::LO, VM::M1, "SoftwareTitle" }, { 0x0021, 0x0092, 0, VR::SH, VM::M1, "SoftwareVersion" }, { 0x0021, 0x0093, 0, VR::LO, VM::M1, "SerialNumber" }, { 0x0021, 0x00a0, 0, VR::SQ, VM::M1, "ObjectActionSequence" }, { 0x0021, 0x00a1, 0, VR::ST, VM::M1, "ObjectAction" }, { 0x0021, 0x00a2, 0, VR::DA, VM::M1, "ObjectActionDate" }, { 0x0021, 0x00a3, 0, VR::TM, VM::M1, "ObjectActionTime" }, { 0x0021, 0x00a5, 0, VR::AE, VM::M1, "LocalAETitle" }, { 0x0021, 0x00a6, 0, VR::SH, VM::M1, "LocalIPAddress" }, { 0x0021, 0x00a7, 0, VR::AE, VM::M1, "RemoteAETitle" }, { 0x0021, 0x00a8, 0, VR::SH, VM::M1, "RemoteIPAddress" }, { 0x0021, 0x00b0, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b1, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b2, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b3, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b4, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b5, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b6, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x00b7, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict442TagHashTable[] = { 60, 65, 70, 75, 80, 83, 86, 89, 59, 92, 95, 98, 101, 104, 107, 110, 113, 118, 121, 124, 59, 127, 59, 59, 59, 59, 132, 135, 138, 141, 144, 147, 150, 155, 160, 163, 166, 169, 172, 175, 178, 181, 184, 187, 190, 193, 59, 59, 196, 59, 199, 202, 205, 208, 213, 216, 219, 222, 225, 0, 2, 25, 33, 41, 146, 2, 24, 32, 40, 145, 2, 27, 35, 39, 144, 2, 23, 31, 26, 34, 1, 29, 37, 1, 28, 36, 1, 31, 39, 1, 30, 38, 1, 32, 40, 1, 46, 163, 1, 45, 162, 1, 44, 161, 1, 43, 160, 1, 49, 167, 1, 48, 166, 2, 34, 49, 47, 165, 1, 33, 48, 1, 36, 51, 1, 35, 50, 2, 37, 52, 50, 168, 1, 54, 179, 1, 53, 178, 1, 52, 177, 1, 51, 176, 1, 58, 183, 1, 57, 182, 2, 1, 1, 56, 181, 2, 0, 0, 55, 180, 1, 3, 3, 1, 2, 2, 1, 5, 5, 1, 4, 4, 1, 7, 7, 1, 6, 6, 1, 9, 9, 1, 8, 8, 1, 11, 11, 1, 10, 10, 1, 13, 13, 1, 12, 12, 1, 14, 17, 1, 16, 19, 1, 15, 18, 1, 18, 21, 2, 17, 20, 38, 80, 1, 20, 23, 1, 19, 22, 1, 22, 25, 1, 21, 24, 1, 42, 147, }; const unsigned short Dict442KeyHashTable[] = { 59, 60, 65, 59, 59, 68, 59, 73, 78, 81, 88, 91, 96, 59, 113, 59, 59, 59, 116, 121, 124, 127, 130, 59, 133, 138, 59, 143, 59, 146, 149, 152, 155, 59, 158, 161, 59, 164, 59, 169, 172, 175, 180, 59, 59, 59, 59, 59, 185, 188, 191, 194, 59, 197, 200, 203, 208, 211, 59, 0, 2, 4, 53242, 13, 56827, 1, 37, 38573, 2, 0, 44034, 18, 40462, 2, 10, 28481, 47, 43107, 1, 49, 11651, 3, 30, 27263, 45, 12317, 50, 40965, 1, 36, 32649, 2, 3, 23225, 9, 9915, 8, 51, 91, 52, 91, 53, 91, 54, 91, 55, 91, 56, 91, 57, 91, 58, 91, 1, 21, 38374, 2, 15, 34408, 23, 47397, 1, 39, 12240, 1, 44, 54098, 1, 22, 48421, 1, 42, 9832, 2, 28, 47465, 34, 48462, 2, 7, 23780, 19, 16481, 1, 41, 16257, 1, 43, 12706, 1, 6, 60296, 1, 46, 22206, 1, 40, 10838, 1, 12, 52745, 1, 1, 46226, 2, 17, 5655, 24, 63426, 1, 33, 1381, 1, 25, 65027, 2, 8, 37860, 29, 25155, 2, 38, 28879, 48, 31199, 1, 35, 50112, 1, 27, 53649, 1, 32, 46748, 1, 14, 22475, 1, 20, 16390, 1, 16, 55762, 2, 2, 20530, 31, 20225, 1, 11, 64629, 2, 5, 768, 26, 42717, }; vtkDICOMDictionary::Dict Dict442Data = { "BRIT Systems, Inc.", 59, 59, Dict442TagHashTable, Dict442KeyHashTable, Dict442Contents }; // ----- SIEMENS CT VA0 RAW ----- const DictEntry Dict443Contents[] = { { 0x0021, 0x0010, 0, VR::UL, VM::M2, "CreationMask" }, { 0x0021, 0x0020, 0, VR::UL, VM::M2, "EvaluationMask" }, { 0x0021, 0x0030, 0, VR::US, VM::M7, "ExtendedProcessingMask" }, { 0x0021, 0x0040, 0, VR::UL, VM::M1TN, "" }, { 0x0021, 0x0041, 0, VR::UL, VM::M1TN, "" }, { 0x0021, 0x0042, 0, VR::UL, VM::M1TN, "" }, { 0x0021, 0x0043, 0, VR::UL, VM::M1TN, "" }, { 0x0021, 0x0044, 0, VR::UL, VM::M1TN, "" }, { 0x0021, 0x0050, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict443TagHashTable[] = { 10, 13, 9, 9, 18, 9, 23, 26, 29, 0, 1, 6, 67, 2, 1, 32, 7, 68, 2, 0, 16, 8, 80, 1, 3, 64, 1, 4, 65, 2, 2, 48, 5, 66, }; const unsigned short Dict443KeyHashTable[] = { 10, 13, 9, 16, 9, 9, 9, 9, 19, 0, 1, 1, 2209, 1, 0, 17597, 1, 2, 37852, 6, 3, 597, 4, 597, 5, 597, 6, 597, 7, 597, 8, 597, }; vtkDICOMDictionary::Dict Dict443Data = { "SIEMENS CT VA0 RAW", 9, 9, Dict443TagHashTable, Dict443KeyHashTable, Dict443Contents }; // ----- SPI-P Release 2;1 ----- const DictEntry Dict444Contents[] = { { 0x0011, 0x0018, 0, VR::LT, VM::M1, "" }, { 0x0023, 0x000d, 0, VR::UI, VM::M1, "" }, { 0x0023, 0x000e, 0, VR::UI, VM::M1, "" }, }; const unsigned short Dict444TagHashTable[] = { 4, 9, 3, 0, 2, 0, 24, 2, 14, 1, 1, 13, }; const unsigned short Dict444KeyHashTable[] = { 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2, 1793, }; vtkDICOMDictionary::Dict Dict444Data = { "SPI-P Release 2;1", 3, 3, Dict444TagHashTable, Dict444KeyHashTable, Dict444Contents }; // ----- SPI RELEASE 1 ----- const DictEntry Dict445Contents[] = { { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" }, { 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" }, { 0x0009, 0x0041, 0, VR::SH, VM::M1, "DataObjectSubtype" }, { 0x0011, 0x0010, 0, VR::LO, VM::M1, "Organ" }, { 0x0011, 0x0015, 0, VR::LO, VM::M1, "AllergyIndication" }, { 0x0011, 0x0020, 0, VR::LO, VM::M1, "Pregnancy" }, { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" }, }; const unsigned short Dict445TagHashTable[] = { 9, 14, 8, 8, 23, 8, 8, 8, 0, 2, 2, 64, 7, 96, 4, 0, 16, 3, 65, 4, 16, 6, 32, 2, 1, 21, 5, 21, }; const unsigned short Dict445KeyHashTable[] = { 9, 8, 12, 15, 18, 8, 23, 26, 0, 1, 2, 24415, 1, 3, 55708, 1, 0, 52021, 2, 4, 39623, 6, 29229, 1, 7, 57071, 2, 1, 1220, 5, 21898, }; vtkDICOMDictionary::Dict Dict445Data = { "SPI RELEASE 1", 8, 8, Dict445TagHashTable, Dict445KeyHashTable, Dict445Contents }; // ----- SIEMENS MI RWVM SUV ----- const DictEntry Dict446Contents[] = { { 0x0041, 0x0001, 0, VR::CS, VM::M1, "SUVDecayCorrectionMethod" }, }; const unsigned short Dict446TagHashTable[] = { 2, 0, 1, 0, 1, }; const unsigned short Dict446KeyHashTable[] = { 2, 0, 1, 0, 19490, }; vtkDICOMDictionary::Dict Dict446Data = { "SIEMENS MI RWVM SUV", 1, 1, Dict446TagHashTable, Dict446KeyHashTable, Dict446Contents }; // ----- MeVis eD: Slice Information ----- const DictEntry Dict447Contents[] = { { 0x0021, 0x0010, 0, VR::UI, VM::M1TN, "SliceSOPInstanceUIDs" }, }; const unsigned short Dict447TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict447KeyHashTable[] = { 2, 0, 1, 0, 16081, }; vtkDICOMDictionary::Dict Dict447Data = { "MeVis eD: Slice Information", 1, 1, Dict447TagHashTable, Dict447KeyHashTable, Dict447Contents }; // ----- AGFA PACS Archive Mirroring 1.0 ----- const DictEntry Dict448Contents[] = { { 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" }, { 0x0031, 0x0001, 0, VR::UL, VM::M1, "DateTimeVerified" }, }; const unsigned short Dict448TagHashTable[] = { 3, 6, 0, 1, 1, 1, 1, 0, 0, }; const unsigned short Dict448KeyHashTable[] = { 3, 2, 0, 2, 0, 9201, 1, 56416, }; vtkDICOMDictionary::Dict Dict448Data = { "AGFA PACS Archive Mirroring 1.0", 2, 2, Dict448TagHashTable, Dict448KeyHashTable, Dict448Contents }; // ----- Brainlab-S23-ProjectiveFusion ----- const DictEntry Dict449Contents[] = { { 0x0073, 0x0010, 0, VR::SQ, VM::M1, "ProjectiveRegistrationSequence" }, }; const unsigned short Dict449TagHashTable[] = { 2, 0, 1, 0, 16, }; const unsigned short Dict449KeyHashTable[] = { 2, 0, 1, 0, 58996, }; vtkDICOMDictionary::Dict Dict449Data = { "Brainlab-S23-ProjectiveFusion", 1, 1, Dict449TagHashTable, Dict449KeyHashTable, Dict449Contents }; // ----- SPI-P Release 1;3 ----- const DictEntry Dict450Contents[] = { { 0x0029, 0x0000, 0, VR::LT, VM::M1, "ImageEnhancementID" }, { 0x0029, 0x0001, 0, VR::LT, VM::M1, "ImageEnhancement" }, { 0x0029, 0x0002, 0, VR::LT, VM::M1, "ConvolutionID" }, { 0x0029, 0x0003, 0, VR::LT, VM::M1, "ConvolutionType" }, { 0x0029, 0x0004, 0, VR::LT, VM::M1, "ConvolutionKernelSizeID" }, { 0x0029, 0x0005, 0, VR::US, VM::M2, "ConvolutionKernelSize" }, { 0x0029, 0x0006, 0, VR::US, VM::M1TN, "ConvolutionKernel" }, { 0x0029, 0x000c, 0, VR::DS, VM::M1, "EnhancementGain" }, { 0x0029, 0x001e, 0, VR::CS, VM::M1, "ImageEnhancementEnableStatus" }, { 0x0029, 0x001f, 0, VR::CS, VM::M1, "ImageEnhancementSelectStatus" }, }; const unsigned short Dict450TagHashTable[] = { 11, 14, 17, 20, 23, 28, 10, 33, 10, 10, 0, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 2, 2, 2, 5, 5, 9, 31, 2, 4, 4, 8, 30, 2, 6, 6, 7, 12, }; const unsigned short Dict450KeyHashTable[] = { 11, 16, 19, 10, 10, 10, 10, 10, 10, 28, 0, 2, 1, 41307, 4, 35963, 1, 8, 23628, 4, 2, 31800, 6, 16426, 7, 14052, 9, 58824, 3, 0, 38981, 3, 7555, 5, 1404, }; vtkDICOMDictionary::Dict Dict450Data = { "SPI-P Release 1;3", 10, 10, Dict450TagHashTable, Dict450KeyHashTable, Dict450Contents }; // ----- SPI-P Release 1;2 ----- const DictEntry Dict451Contents[] = { { 0x0029, 0x0000, 0, VR::LT, VM::M1, "SubtractionMaskID" }, { 0x0029, 0x0004, 0, VR::UN, VM::M1, "MaskingFunction" }, { 0x0029, 0x000c, 0, VR::UN, VM::M1, "ProprietaryMaskingParameters" }, { 0x0029, 0x001e, 0, VR::CS, VM::M1, "SubtractionMaskEnableStatus" }, { 0x0029, 0x001f, 0, VR::CS, VM::M1, "SubtractionMaskSelectStatus" }, }; const unsigned short Dict451TagHashTable[] = { 6, 11, 14, 5, 17, 0, 2, 1, 4, 3, 30, 1, 0, 0, 1, 2, 12, 1, 4, 31, }; const unsigned short Dict451KeyHashTable[] = { 6, 9, 12, 5, 15, 0, 1, 3, 1026, 1, 4, 5882, 1, 2, 7098, 2, 0, 22248, 1, 24029, }; vtkDICOMDictionary::Dict Dict451Data = { "SPI-P Release 1;2", 5, 5, Dict451TagHashTable, Dict451KeyHashTable, Dict451Contents }; // ----- SPI-P Release 1;1 ----- const DictEntry Dict452Contents[] = { { 0x0009, 0x00c0, 0, VR::LT, VM::M1, "" }, { 0x0009, 0x00c1, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0000, 0, VR::UN, VM::M1, "PhysiologicalDataType" }, { 0x0019, 0x0001, 0, VR::UN, VM::M1, "PhysiologicalDataChannelAndKind" }, { 0x0019, 0x0002, 0, VR::US, VM::M1, "SampleBitsAllocated" }, { 0x0019, 0x0003, 0, VR::US, VM::M1, "SampleBitsStored" }, { 0x0019, 0x0004, 0, VR::US, VM::M1, "SampleHighBit" }, { 0x0019, 0x0005, 0, VR::US, VM::M1, "SampleRepresentation" }, { 0x0019, 0x0006, 0, VR::UN, VM::M1, "SmallestSampleValue" }, { 0x0019, 0x0007, 0, VR::UN, VM::M1, "LargestSampleValue" }, { 0x0019, 0x0008, 0, VR::UN, VM::M1, "NumberOfSamples" }, { 0x0019, 0x0009, 0, VR::UN, VM::M1, "SampleData" }, { 0x0019, 0x000a, 0, VR::UN, VM::M1, "SampleRate" }, { 0x0019, 0x0010, 0, VR::UN, VM::M1, "PhysiologicalDataType2" }, { 0x0019, 0x0011, 0, VR::UN, VM::M1, "PhysiologicalDataChannelAndKind2" }, { 0x0019, 0x0012, 0, VR::US, VM::M1, "SampleBitsAllocated2" }, { 0x0019, 0x0013, 0, VR::US, VM::M1, "SampleBitsStored2" }, { 0x0019, 0x0014, 0, VR::US, VM::M1, "SampleHighBit2" }, { 0x0019, 0x0015, 0, VR::US, VM::M1, "SampleRepresentation2" }, { 0x0019, 0x0016, 0, VR::UN, VM::M1, "SmallestSampleValue2" }, { 0x0019, 0x0017, 0, VR::UN, VM::M1, "LargestSampleValue2" }, { 0x0019, 0x0018, 0, VR::UN, VM::M1, "NumberOfSamples2" }, { 0x0019, 0x0019, 0, VR::UN, VM::M1, "SampleData2" }, { 0x0019, 0x001a, 0, VR::UN, VM::M1, "SampleRate2" }, { 0x0029, 0x0000, 0, VR::LT, VM::M1, "ZoomID" }, { 0x0029, 0x0001, 0, VR::DS, VM::M1TN, "ZoomRectangle" }, { 0x0029, 0x0003, 0, VR::DS, VM::M1, "ZoomFactor" }, { 0x0029, 0x0004, 0, VR::US, VM::M1, "ZoomFunction" }, { 0x0029, 0x000e, 0, VR::CS, VM::M1, "ZoomEnableStatus" }, { 0x0029, 0x000f, 0, VR::CS, VM::M1, "ZoomSelectStatus" }, { 0x0029, 0x0040, 0, VR::LT, VM::M1, "MagnifyingGlassID" }, { 0x0029, 0x0041, 0, VR::DS, VM::M1TN, "MagnifyingGlassRectangle" }, { 0x0029, 0x0043, 0, VR::DS, VM::M1, "MagnifyingGlassFactor" }, { 0x0029, 0x0044, 0, VR::US, VM::M1, "MagnifyingGlassFunction" }, { 0x0029, 0x004e, 0, VR::CS, VM::M1, "MagnifyingGlassEnableStatus" }, { 0x0029, 0x004f, 0, VR::CS, VM::M1, "MagnifyingGlassSelectStatus" }, }; const unsigned short Dict452TagHashTable[] = { 37, 42, 45, 48, 53, 56, 59, 36, 62, 65, 70, 73, 76, 79, 82, 85, 88, 91, 36, 94, 36, 36, 97, 100, 103, 106, 109, 112, 115, 118, 121, 126, 131, 134, 36, 137, 0, 2, 22, 25, 33, 68, 1, 21, 24, 1, 29, 15, 2, 23, 26, 28, 14, 1, 25, 1, 1, 24, 0, 1, 26, 3, 1, 14, 17, 2, 13, 16, 27, 4, 1, 16, 19, 1, 15, 18, 1, 18, 21, 1, 17, 20, 1, 20, 23, 1, 19, 22, 1, 11, 9, 1, 10, 8, 1, 12, 10, 1, 0, 192, 1, 1, 193, 1, 3, 1, 1, 2, 0, 1, 5, 3, 1, 4, 2, 1, 7, 5, 1, 6, 4, 2, 9, 7, 34, 78, 2, 8, 6, 35, 79, 1, 30, 64, 1, 31, 65, 1, 32, 67, }; const unsigned short Dict452KeyHashTable[] = { 37, 36, 44, 53, 36, 56, 59, 66, 69, 36, 72, 36, 75, 78, 36, 83, 86, 89, 36, 96, 36, 103, 36, 36, 106, 109, 36, 36, 112, 36, 115, 118, 121, 126, 129, 36, 0, 3, 15, 60885, 17, 2214, 35, 51955, 4, 13, 40858, 14, 54142, 29, 57051, 33, 10475, 1, 34, 16692, 1, 28, 21788, 3, 5, 4681, 7, 5357, 9, 60772, 1, 22, 63939, 1, 20, 61248, 1, 4, 2286, 1, 18, 31152, 2, 8, 50471, 23, 846, 1, 25, 56444, 1, 10, 28010, 3, 0, 149, 1, 149, 30, 15321, 3, 12, 57176, 24, 26657, 32, 56885, 1, 26, 10429, 1, 27, 42870, 1, 31, 21401, 1, 2, 11167, 1, 6, 50818, 1, 19, 41719, 2, 3, 58570, 16, 23407, 1, 11, 43200, 1, 21, 43250, }; vtkDICOMDictionary::Dict Dict452Data = { "SPI-P Release 1;1", 36, 36, Dict452TagHashTable, Dict452KeyHashTable, Dict452Contents }; // ----- SPI-P-PCR Release 2 ----- const DictEntry Dict453Contents[] = { { 0x0019, 0x0010, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0020, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0021, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0030, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0040, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x0060, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x0080, 0, VR::US, VM::M1, "" }, { 0x0019, 0x0090, 0, VR::LO, VM::M1, "" }, { 0x0019, 0x00a1, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00a3, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a4, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a6, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a7, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a8, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00a9, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00aa, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00ab, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00ac, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00ad, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00ae, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00af, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00b0, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00b1, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00b2, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00b3, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00b4, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x00b5, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b6, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b7, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00b8, 0, VR::DS, VM::M1, "" }, { 0x0019, 0x00b9, 0, VR::ST, VM::M1, "" }, { 0x0019, 0x00ba, 0, VR::ST, VM::M1, "" }, }; const unsigned short Dict453TagHashTable[] = { 33, 33, 33, 34, 37, 40, 43, 46, 51, 56, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 33, 91, 96, 99, 106, 111, 114, 33, 33, 117, 120, 123, 33, 0, 1, 25, 179, 1, 24, 178, 1, 23, 177, 1, 22, 176, 2, 7, 144, 29, 183, 2, 3, 48, 28, 182, 2, 0, 16, 27, 181, 1, 26, 180, 1, 17, 171, 1, 16, 170, 1, 15, 169, 1, 14, 168, 1, 21, 175, 1, 20, 174, 1, 19, 173, 1, 18, 172, 1, 9, 163, 2, 5, 96, 8, 161, 1, 4, 64, 3, 2, 33, 6, 128, 13, 167, 2, 1, 32, 12, 166, 1, 11, 165, 1, 10, 164, 1, 32, 186, 1, 31, 185, 1, 30, 184, }; const unsigned short Dict453KeyHashTable[] = { 33, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 33, 0, 163, 1, 163, 2, 163, 3, 163, 4, 163, 5, 163, 6, 163, 7, 163, 8, 163, 9, 163, 10, 163, 11, 163, 12, 163, 13, 163, 14, 163, 15, 163, 16, 163, 17, 163, 18, 163, 19, 163, 20, 163, 21, 163, 22, 163, 23, 163, 24, 163, 25, 163, 26, 163, 27, 163, 28, 163, 29, 163, 30, 163, 31, 163, 32, 163, }; vtkDICOMDictionary::Dict Dict453Data = { "SPI-P-PCR Release 2", 33, 33, Dict453TagHashTable, Dict453KeyHashTable, Dict453Contents }; // ----- SIEMENS MR PHOENIX ATTRIBUTES ----- const DictEntry Dict454Contents[] = { { 0x0021, 0x0001, 0, VR::UL, VM::M1, "MdsModeMask" }, { 0x0021, 0x0002, 0, VR::US, VM::M1, "Dixon" }, { 0x0021, 0x0003, 0, VR::LT, VM::M1, "SequenceFileName" }, { 0x0021, 0x00F1, 0, VR::UL, VM::M1, "CountOfPseudoAttributes" }, }; const unsigned short Dict454TagHashTable[] = { 5, 4, 8, 11, 0, 1, 0, 1, 1, 2, 3, 2, 1, 2, 3, 241, }; const unsigned short Dict454KeyHashTable[] = { 4, 4, 5, 10, 0, 2, 0, 9150, 3, 33686, 2, 1, 18649, 2, 43687, }; vtkDICOMDictionary::Dict Dict454Data = { "SIEMENS MR PHOENIX ATTRIBUTES", 4, 4, Dict454TagHashTable, Dict454KeyHashTable, Dict454Contents }; // ----- SIEMENS MR SDI 02 ----- const DictEntry Dict455Contents[] = { { 0x0021, 0x0001, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" }, { 0x0021, 0x0002, 0, VR::FD, VM::M3, "SliceNormalVector" }, { 0x0021, 0x0003, 0, VR::DS, VM::M1, "SliceMeasurementDuration" }, { 0x0021, 0x0004, 0, VR::DS, VM::M1, "TimeAfterStart" }, { 0x0021, 0x0005, 0, VR::IS, VM::M1, "BValue" }, { 0x0021, 0x0006, 0, VR::LO, VM::M1, "ICEDims" }, { 0x0021, 0x001A, 0, VR::SH, VM::M1, "RFSWDDataType" }, { 0x0021, 0x001B, 0, VR::US, VM::M1, "MoCoQMeasure" }, { 0x0021, 0x001C, 0, VR::IS, VM::M1, "PhaseEncodingDirectionPositive" }, { 0x0021, 0x001D, 0, VR::OB, VM::M1, "PixelFile" }, { 0x0021, 0x001F, 0, VR::IS, VM::M1, "FMRIStimulInfo" }, { 0x0021, 0x0020, 0, VR::DS, VM::M1, "VoxelInPlaneRot" }, { 0x0021, 0x0021, 0, VR::CS, VM::M1, "DiffusionDirectionality4MF" }, { 0x0021, 0x0022, 0, VR::DS, VM::M1, "VoxelThickness" }, { 0x0021, 0x0023, 0, VR::FD, VM::M6, "BMatrix" }, { 0x0021, 0x0024, 0, VR::IS, VM::M1, "MultistepIndex" }, { 0x0021, 0x0025, 0, VR::LT, VM::M1, "CompAdjustedParam" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1, "CompAlgorithm" }, { 0x0021, 0x0027, 0, VR::DS, VM::M1, "VoxelNormalCor" }, { 0x0021, 0x0029, 0, VR::SH, VM::M1, "FlowEncodingDirectionString" }, { 0x0021, 0x002A, 0, VR::DS, VM::M1, "VoxelNormalSag" }, { 0x0021, 0x002B, 0, VR::DS, VM::M1, "VoxelPositionSag" }, { 0x0021, 0x002C, 0, VR::DS, VM::M1, "VoxelNormalTra" }, { 0x0021, 0x002D, 0, VR::DS, VM::M1, "VoxelPositionTra" }, { 0x0021, 0x002E, 0, VR::UL, VM::M1, "UsedChannelMask" }, { 0x0021, 0x002F, 0, VR::DS, VM::M1, "RepetitionTimeEffective" }, { 0x0021, 0x0030, 0, VR::DS, VM::M6, "CSIImageOrientationPatient" }, { 0x0021, 0x0032, 0, VR::DS, VM::M1, "CSISliceLocation" }, { 0x0021, 0x0033, 0, VR::IS, VM::M1, "EchoColumnPosition" }, { 0x0021, 0x0034, 0, VR::FD, VM::M1, "FlowVENC" }, { 0x0021, 0x0035, 0, VR::IS, VM::M1, "MeasuredFourierLines" }, { 0x0021, 0x0036, 0, VR::SH, VM::M1, "LQAlgorithm" }, { 0x0021, 0x0037, 0, VR::DS, VM::M1, "VoxelPositionCor" }, { 0x0021, 0x0038, 0, VR::IS, VM::M1, "Filter2" }, { 0x0021, 0x0039, 0, VR::FD, VM::M1, "FMRIStimulLevel" }, { 0x0021, 0x003A, 0, VR::DS, VM::M1, "VoxelReadoutFOV" }, { 0x0021, 0x003B, 0, VR::IS, VM::M1, "NormalizeManipulated" }, { 0x0021, 0x003C, 0, VR::FD, VM::M3, "RBMoCoRot" }, { 0x0021, 0x003D, 0, VR::IS, VM::M1, "CompManualAdjusted" }, { 0x0021, 0x003F, 0, VR::SH, VM::M1, "SpectrumTextRegionLabel" }, { 0x0021, 0x0040, 0, VR::DS, VM::M1, "VoxelPhaseFOV" }, { 0x0021, 0x0041, 0, VR::SH, VM::M1, "GSWDDataType" }, { 0x0021, 0x0042, 0, VR::IS, VM::M1, "RealDwellTime" }, { 0x0021, 0x0043, 0, VR::LT, VM::M1, "CompJobID" }, { 0x0021, 0x0044, 0, VR::IS, VM::M1, "CompBlended" }, { 0x0021, 0x0045, 0, VR::SL, VM::M3, "ImaAbsTablePosition" }, { 0x0021, 0x0046, 0, VR::FD, VM::M3, "DiffusionGradientDirection" }, { 0x0021, 0x0047, 0, VR::IS, VM::M1, "FlowEncodingDirection" }, { 0x0021, 0x0048, 0, VR::IS, VM::M1, "EchoPartitionPosition" }, { 0x0021, 0x0049, 0, VR::IS, VM::M1, "EchoLinePosition" }, { 0x0021, 0x004B, 0, VR::LT, VM::M1, "CompAutoParam" }, { 0x0021, 0x004C, 0, VR::IS, VM::M1, "OriginalImageNumber" }, { 0x0021, 0x004D, 0, VR::IS, VM::M1, "OriginalSeriesNumber" }, { 0x0021, 0x004E, 0, VR::IS, VM::M1, "Actual3DImaPartNumber" }, { 0x0021, 0x004F, 0, VR::LO, VM::M1, "ImaCoilString" }, { 0x0021, 0x0050, 0, VR::DS, VM::M2, "CSIPixelSpacing" }, { 0x0021, 0x0051, 0, VR::UL, VM::M1, "SequenceMask" }, { 0x0021, 0x0052, 0, VR::US, VM::M1, "ImageGroup" }, { 0x0021, 0x0053, 0, VR::FD, VM::M1, "BandwidthPerPixelPhaseEncode" }, { 0x0021, 0x0054, 0, VR::US, VM::M1, "NonPlanarImage" }, { 0x0021, 0x0055, 0, VR::OB, VM::M1, "PixelFileName" }, { 0x0021, 0x0056, 0, VR::LO, VM::M1, "ImaPATModeText" }, { 0x0021, 0x0057, 0, VR::DS, VM::M3, "CSIImagePositionPatient" }, { 0x0021, 0x0058, 0, VR::SH, VM::M1, "AcquisitionMatrixText" }, { 0x0021, 0x0059, 0, VR::IS, VM::M3, "ImaRelTablePosition" }, { 0x0021, 0x005A, 0, VR::FD, VM::M3, "RBMoCoTrans" }, { 0x0021, 0x005B, 0, VR::FD, VM::M3, "SlicePositionPCS" }, { 0x0021, 0x005C, 0, VR::DS, VM::M1, "CSISliceThickness" }, { 0x0021, 0x005E, 0, VR::IS, VM::M1, "ProtocolSliceNumber" }, { 0x0021, 0x005F, 0, VR::IS, VM::M1, "Filter1" }, { 0x0021, 0x0060, 0, VR::SH, VM::M1, "TransmittingCoil" }, { 0x0021, 0x0061, 0, VR::DS, VM::M1, "NumberOfAveragesN4" }, { 0x0021, 0x0062, 0, VR::FD, VM::M1TN, "MosaicRefAcqTimes" }, { 0x0021, 0x0063, 0, VR::IS, VM::M1, "AutoInlineImageFilterEnabled" }, { 0x0021, 0x0065, 0, VR::FD, VM::M1TN, "QCData" }, { 0x0021, 0x0066, 0, VR::LT, VM::M1, "ExamLandmarks" }, { 0x0021, 0x0067, 0, VR::ST, VM::M1, "ExamDataRole" }, { 0x0021, 0x0068, 0, VR::OB, VM::M1, "MRDiffusion" }, { 0x0021, 0x0069, 0, VR::OB, VM::M1, "RealWorldValueMapping" }, { 0x0021, 0x0070, 0, VR::OB, VM::M1, "DataSetInfo" }, { 0x0021, 0x0071, 0, VR::UT, VM::M1, "UsedChannelString" }, { 0x0021, 0x0072, 0, VR::CS, VM::M1, "PhaseContrastN4" }, { 0x0021, 0x0073, 0, VR::UT, VM::M1, "MRVelocityEncoding" }, { 0x0021, 0x0074, 0, VR::FD, VM::M3, "VelocityEncodingDirectionN4" }, { 0x0021, 0x0075, 0, VR::CS, VM::M1TN, "ImageType4MF" }, { 0x0021, 0x0076, 0, VR::LO, VM::M1TN, "ImageHistory" }, { 0x0021, 0x0077, 0, VR::LO, VM::M1, "SequenceInfo" }, { 0x0021, 0x0078, 0, VR::CS, VM::M1TN, "ImageTypeVisible" }, { 0x0021, 0x0079, 0, VR::CS, VM::M1, "DistortionCorrectionType" }, { 0x0021, 0x0080, 0, VR::CS, VM::M1, "ImageFilterType" }, { 0x0021, 0x00FE, 0, VR::SQ, VM::M1, "SiemensMRSDISequence" }, }; const unsigned short Dict455TagHashTable[] = { 92, 95, 98, 101, 104, 107, 112, 117, 122, 127, 130, 135, 140, 145, 150, 155, 158, 161, 166, 171, 176, 181, 186, 191, 196, 201, 206, 211, 216, 221, 226, 231, 234, 239, 242, 245, 250, 255, 258, 261, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 264, 267, 270, 273, 276, 91, 279, 282, 285, 288, 91, 291, 294, 297, 300, 305, 91, 91, 91, 91, 91, 91, 308, 311, 314, 317, 320, 323, 326, 329, 332, 335, 91, 0, 1, 12, 33, 1, 11, 32, 1, 14, 35, 1, 13, 34, 1, 16, 37, 2, 15, 36, 40, 64, 2, 18, 39, 41, 65, 2, 17, 38, 42, 66, 2, 19, 41, 43, 67, 1, 44, 68, 2, 21, 43, 45, 69, 2, 20, 42, 46, 70, 2, 23, 45, 47, 71, 2, 22, 44, 48, 72, 2, 25, 47, 49, 73, 1, 24, 46, 1, 50, 75, 2, 26, 48, 51, 76, 2, 28, 51, 52, 77, 2, 27, 50, 53, 78, 2, 30, 53, 54, 79, 2, 29, 52, 55, 80, 2, 32, 55, 56, 81, 2, 31, 54, 57, 82, 2, 34, 57, 58, 83, 2, 33, 56, 59, 84, 2, 36, 59, 60, 85, 2, 35, 58, 61, 86, 2, 38, 61, 62, 87, 2, 37, 60, 63, 88, 2, 39, 63, 64, 89, 1, 65, 90, 2, 0, 1, 66, 91, 1, 67, 92, 1, 2, 3, 2, 1, 2, 68, 94, 2, 4, 5, 69, 95, 1, 3, 4, 1, 90, 254, 1, 5, 6, 1, 7, 27, 1, 6, 26, 1, 9, 29, 1, 8, 28, 1, 10, 31, 1, 70, 96, 1, 71, 97, 1, 72, 98, 1, 73, 99, 1, 74, 101, 1, 75, 102, 1, 76, 103, 2, 77, 104, 89, 128, 1, 78, 105, 1, 79, 112, 1, 80, 113, 1, 81, 114, 1, 82, 115, 1, 83, 116, 1, 84, 117, 1, 85, 118, 1, 86, 119, 1, 87, 120, 1, 88, 121, }; const unsigned short Dict455KeyHashTable[] = { 92, 95, 100, 103, 91, 91, 108, 113, 91, 118, 121, 91, 126, 131, 134, 137, 144, 91, 147, 91, 150, 91, 91, 91, 153, 158, 161, 91, 166, 91, 169, 172, 91, 175, 178, 183, 188, 191, 194, 197, 91, 200, 203, 208, 91, 211, 91, 214, 219, 91, 222, 225, 228, 231, 91, 91, 91, 236, 241, 244, 251, 91, 91, 258, 261, 91, 266, 269, 91, 280, 283, 91, 286, 289, 292, 91, 295, 91, 300, 305, 308, 311, 91, 320, 91, 323, 326, 329, 91, 91, 332, 0, 1, 25, 20056, 2, 31, 6872, 47, 28908, 1, 72, 24649, 2, 51, 16761, 68, 12407, 2, 4, 62490, 39, 7329, 2, 2, 44206, 6, 51424, 1, 63, 25197, 2, 38, 59636, 87, 1706, 2, 16, 47543, 82, 52234, 1, 54, 43927, 1, 20, 15115, 3, 10, 39210, 17, 56900, 73, 29414, 1, 7, 41362, 1, 19, 22558, 1, 22, 15133, 2, 59, 29147, 61, 9449, 1, 83, 4543, 2, 11, 7663, 65, 5967, 1, 52, 32310, 1, 24, 16423, 1, 49, 14598, 1, 44, 49619, 2, 46, 37467, 55, 59851, 2, 30, 30781, 79, 13340, 1, 28, 25401, 1, 56, 48703, 1, 15, 30746, 1, 50, 55381, 1, 89, 23877, 2, 32, 62598, 69, 35702, 1, 33, 35702, 1, 85, 40535, 2, 70, 26579, 81, 31221, 1, 78, 28798, 1, 60, 59682, 1, 88, 6433, 1, 41, 12358, 2, 13, 28414, 26, 22921, 2, 45, 56162, 76, 48345, 1, 9, 31831, 3, 12, 15124, 71, 38696, 74, 28264, 3, 37, 33280, 86, 47274, 90, 40207, 1, 5, 52044, 2, 1, 44899, 75, 11447, 1, 3, 5526, 5, 21, 62784, 36, 28133, 42, 18295, 53, 65246, 66, 24759, 1, 58, 615, 1, 77, 14815, 1, 48, 18033, 1, 23, 62802, 1, 40, 19519, 2, 27, 42419, 67, 38844, 2, 29, 30593, 34, 16065, 1, 57, 52370, 1, 18, 14928, 4, 14, 49937, 35, 20819, 43, 35057, 84, 54848, 1, 0, 12795, 1, 62, 42708, 1, 64, 46962, 1, 80, 53629, 1, 8, 6773, }; vtkDICOMDictionary::Dict Dict455Data = { "SIEMENS MR SDI 02", 91, 91, Dict455TagHashTable, Dict455KeyHashTable, Dict455Contents }; // ----- Biospace Med : EOS Tag ----- const DictEntry Dict456Contents[] = { { 0x0863, 0x0010, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0023, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0026, 0, VR::UL, VM::M1, "" }, { 0x0863, 0x0027, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0028, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0032, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0033, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0034, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0035, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0036, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0037, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0038, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0039, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0040, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0041, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0042, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0043, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0044, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0045, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0046, 0, VR::DS, VM::M11, "" }, { 0x0863, 0x0047, 0, VR::SL, VM::M1, "" }, { 0x0863, 0x0048, 0, VR::UL, VM::M1, "" }, { 0x0863, 0x0049, 0, VR::FL, VM::M1, "" }, { 0x0863, 0x0057, 0, VR::CS, VM::M1, "" }, }; const unsigned short Dict456TagHashTable[] = { 25, 28, 24, 24, 31, 36, 39, 42, 45, 48, 53, 58, 63, 68, 73, 76, 24, 24, 79, 86, 24, 24, 24, 24, 0, 1, 5, 50, 1, 6, 51, 2, 9, 54, 23, 87, 1, 10, 55, 1, 7, 52, 1, 8, 53, 1, 16, 67, 2, 1, 35, 15, 66, 2, 11, 56, 14, 65, 2, 12, 57, 13, 64, 2, 2, 38, 20, 71, 2, 3, 39, 19, 70, 1, 18, 69, 1, 17, 68, 3, 0, 16, 4, 40, 22, 73, 1, 21, 72, }; const unsigned short Dict456KeyHashTable[] = { 24, 24, 24, 24, 24, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 0, 224, 1, 224, 2, 224, 3, 224, 4, 224, 5, 224, 6, 224, 7, 224, 8, 224, 9, 224, 10, 224, 11, 224, 12, 224, 13, 224, 14, 224, 15, 224, 16, 224, 17, 224, 18, 224, 19, 224, 20, 224, 21, 224, 22, 224, 23, 224, }; vtkDICOMDictionary::Dict Dict456Data = { "Biospace Med : EOS Tag", 24, 24, Dict456TagHashTable, Dict456KeyHashTable, Dict456Contents }; // ----- AMI ImageContextExt_01 ----- const DictEntry Dict457Contents[] = { { 0x3107, 0x00A0, 0, VR::CS, VM::M1, "WindowFunction" }, { 0x3107, 0x00B0, 0, VR::DS, VM::M1, "WindowSlope" }, }; const unsigned short Dict457TagHashTable[] = { 2, 3, 0, 2, 0, 160, 1, 176, }; const unsigned short Dict457KeyHashTable[] = { 3, 6, 0, 1, 1, 62736, 1, 0, 38065, }; vtkDICOMDictionary::Dict Dict457Data = { "AMI ImageContextExt_01", 2, 2, Dict457TagHashTable, Dict457KeyHashTable, Dict457Contents }; // ----- IMS s.r.l. Biopsy Private Code ----- const DictEntry Dict458Contents[] = { { 0x1269, 0x0001, 0, VR::IS, VM::M1, "BiopsyImage" }, { 0x1269, 0x0010, 0, VR::IS, VM::M1TN, "BiopsyMarkersX" }, { 0x1269, 0x0011, 0, VR::IS, VM::M1TN, "BiopsyMarkersY" }, { 0x1269, 0x0012, 0, VR::IS, VM::M1TN, "BiopsyMarkersNumber" }, { 0x1269, 0x0020, 0, VR::IS, VM::M1, "BiopsyAreaLeftBorder" }, { 0x1269, 0x0021, 0, VR::IS, VM::M1, "BiopsyAreaRightBorder" }, { 0x1269, 0x0022, 0, VR::IS, VM::M1, "BiopsyAreaTopBorder" }, { 0x1269, 0x0023, 0, VR::IS, VM::M1, "BiopsyAreaBottomBorder" }, { 0x1269, 0x0024, 0, VR::IS, VM::M1, "BiopsyNumber" }, }; const unsigned short Dict458TagHashTable[] = { 10, 13, 16, 19, 24, 29, 32, 9, 9, 0, 1, 4, 32, 1, 5, 33, 1, 6, 34, 2, 1, 16, 7, 35, 2, 2, 17, 8, 36, 1, 3, 18, 1, 0, 1, }; const unsigned short Dict458KeyHashTable[] = { 9, 10, 15, 20, 9, 25, 9, 28, 31, 0, 2, 0, 51605, 4, 12124, 2, 1, 6166, 3, 48415, 2, 2, 6166, 7, 42788, 1, 6, 8128, 1, 8, 21301, 1, 5, 21960, }; vtkDICOMDictionary::Dict Dict458Data = { "IMS s.r.l. Biopsy Private Code", 9, 9, Dict458TagHashTable, Dict458KeyHashTable, Dict458Contents }; // ----- PMI Private Calibration Module Version 2.0 ----- const DictEntry Dict459Contents[] = { { 0x2121, 0x0001, 0, VR::ST, VM::M1, "CalibrationMethod" }, { 0x2121, 0x0002, 0, VR::ST, VM::M1, "CalibrationMethodInfo" }, { 0x2121, 0x0003, 0, VR::FL, VM::M1, "CalibrationObjectSize" }, { 0x2121, 0x0004, 0, VR::FL, VM::M1, "CalibrationObjectSDev" }, { 0x2121, 0x0005, 0, VR::FL, VM::M1, "CalibrationHorizontalPixelSpacing" }, { 0x2121, 0x0006, 0, VR::FL, VM::M1, "CalibrationVerticalPixelSpacing" }, { 0x2121, 0x0008, 0, VR::ST, VM::M1, "CalibrationFileName" }, { 0x2121, 0x0009, 0, VR::IS, VM::M1, "CalibrationFrameNumber" }, { 0x2121, 0x000a, 0, VR::SH, VM::M1, "CalibrationObjectUnit" }, { 0x2121, 0x000b, 0, VR::SS, VM::M1, "AveragedCalibrationsPerformed" }, { 0x2121, 0x000c, 0, VR::FL, VM::M1, "AutoMagnifyFactor" }, { 0x2121, 0x000d, 0, VR::FL, VM::M1, "HorizontalPixelSDev" }, { 0x2121, 0x000e, 0, VR::FL, VM::M1, "VerticalPixelSDev" }, }; const unsigned short Dict459TagHashTable[] = { 14, 17, 20, 25, 30, 33, 36, 13, 39, 42, 45, 48, 13, 0, 1, 12, 14, 1, 7, 9, 2, 4, 5, 6, 8, 2, 3, 4, 9, 11, 1, 8, 10, 1, 5, 6, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 11, 13, 1, 10, 12, }; const unsigned short Dict459KeyHashTable[] = { 14, 17, 13, 20, 23, 28, 13, 13, 31, 34, 43, 46, 13, 0, 1, 1, 44194, 1, 12, 26778, 1, 3, 19967, 2, 8, 29024, 10, 24532, 1, 11, 1814, 1, 6, 16286, 4, 0, 7641, 2, 23118, 7, 1048, 9, 9474, 1, 5, 54420, 1, 4, 30559, }; vtkDICOMDictionary::Dict Dict459Data = { "PMI Private Calibration Module Version 2.0", 13, 13, Dict459TagHashTable, Dict459KeyHashTable, Dict459Contents }; // ----- GEMS_ADWSoft_3D1 ----- const DictEntry Dict460Contents[] = { { 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" }, { 0x0047, 0x0050, 0, VR::UL, VM::M1, "VolumeVoxelCount" }, { 0x0047, 0x0051, 0, VR::UL, VM::M1, "VolumeSegmentCount" }, { 0x0047, 0x0053, 0, VR::US, VM::M1, "VolumeSliceSize" }, { 0x0047, 0x0054, 0, VR::US, VM::M1, "VolumeSliceCount" }, { 0x0047, 0x0055, 0, VR::SL, VM::M1, "VolumeThresholdValue" }, { 0x0047, 0x0057, 0, VR::DS, VM::M1, "VolumeVoxelRatio" }, { 0x0047, 0x0058, 0, VR::DS, VM::M1, "VolumeVoxelSize" }, { 0x0047, 0x0059, 0, VR::US, VM::M1, "VolumeZPositionSize" }, { 0x0047, 0x0060, 0, VR::DS, VM::M9, "VolumeBaseLine" }, { 0x0047, 0x0061, 0, VR::DS, VM::M3, "VolumeCenterPoint" }, { 0x0047, 0x0063, 0, VR::SL, VM::M1, "VolumeSkewBase" }, { 0x0047, 0x0064, 0, VR::DS, VM::M9, "VolumeRegistrationTransformRotationMatrix" }, { 0x0047, 0x0065, 0, VR::DS, VM::M3, "VolumeRegistrationTransformTranslationVector" }, { 0x0047, 0x0070, 0, VR::DS, VM::M1TN, "KVPList" }, { 0x0047, 0x0071, 0, VR::IS, VM::M1TN, "XRayTubeCurrentList" }, { 0x0047, 0x0072, 0, VR::IS, VM::M1TN, "ExposureList" }, { 0x0047, 0x0080, 0, VR::LO, VM::M1, "AcquisitionDLXIdentifier" }, { 0x0047, 0x0085, 0, VR::SQ, VM::M1, "AcquisitionDLX2DSeriesSequence" }, { 0x0047, 0x0089, 0, VR::DS, VM::M1TN, "ContrastAgentVolumeList" }, { 0x0047, 0x008A, 0, VR::US, VM::M1, "NumberOfInjections" }, { 0x0047, 0x008B, 0, VR::US, VM::M1, "FrameCount" }, { 0x0047, 0x0091, 0, VR::LO, VM::M1, "XA3DReconstructionAlgorithmName" }, { 0x0047, 0x0092, 0, VR::CS, VM::M1, "XA3DReconstructionAlgorithmVersion" }, { 0x0047, 0x0093, 0, VR::DA, VM::M1, "DLXCalibrationDate" }, { 0x0047, 0x0094, 0, VR::TM, VM::M1, "DLXCalibrationTime" }, { 0x0047, 0x0095, 0, VR::CS, VM::M1, "DLXCalibrationStatus" }, { 0x0047, 0x0096, 0, VR::IS, VM::M1TN, "UsedFrames" }, { 0x0047, 0x0098, 0, VR::US, VM::M1, "TransformCount" }, { 0x0047, 0x0099, 0, VR::SQ, VM::M1, "TransformSequence" }, { 0x0047, 0x009A, 0, VR::DS, VM::M9, "TransformRotationMatrix" }, { 0x0047, 0x009B, 0, VR::DS, VM::M3, "TransformTranslationVector" }, { 0x0047, 0x009C, 0, VR::LO, VM::M1, "TransformLabel" }, { 0x0047, 0x00B0, 0, VR::SQ, VM::M1, "WireframeList" }, { 0x0047, 0x00B1, 0, VR::US, VM::M1, "WireframeCount" }, { 0x0047, 0x00B2, 0, VR::US, VM::M1, "LocationSystem" }, { 0x0047, 0x00B5, 0, VR::LO, VM::M1, "WireframeName" }, { 0x0047, 0x00B6, 0, VR::LO, VM::M1, "WireframeGroupName" }, { 0x0047, 0x00B7, 0, VR::LO, VM::M1, "WireframeColor" }, { 0x0047, 0x00B8, 0, VR::SL, VM::M1, "WireframeAttributes" }, { 0x0047, 0x00B9, 0, VR::SL, VM::M1, "WireframePointCount" }, { 0x0047, 0x00BA, 0, VR::SL, VM::M1, "WireframeTimestamp" }, { 0x0047, 0x00BB, 0, VR::SQ, VM::M1, "WireframePointList" }, { 0x0047, 0x00BC, 0, VR::DS, VM::M3, "WireframePointsCoordinates" }, { 0x0047, 0x00C0, 0, VR::DS, VM::M3, "VolumeUpperLeftHighCornerRAS" }, { 0x0047, 0x00C1, 0, VR::DS, VM::M9, "VolumeSliceToRASRotationMatrix" }, { 0x0047, 0x00C2, 0, VR::DS, VM::M1, "VolumeUpperLeftHighCornerTLOC" }, { 0x0047, 0x00D1, 0, VR::OB, VM::M1, "VolumeSegmentList" }, { 0x0047, 0x00D2, 0, VR::OB, VM::M1, "VolumeGradientList" }, { 0x0047, 0x00D3, 0, VR::OB, VM::M1, "VolumeDensityList" }, { 0x0047, 0x00D4, 0, VR::OB, VM::M1, "VolumeZPositionList" }, { 0x0047, 0x00D5, 0, VR::OB, VM::M1, "VolumeOriginalIndexList" }, }; const unsigned short Dict460TagHashTable[] = { 53, 56, 61, 66, 52, 69, 72, 75, 78, 52, 52, 52, 81, 84, 87, 90, 93, 52, 96, 99, 104, 52, 107, 110, 52, 52, 52, 52, 113, 116, 119, 122, 52, 127, 130, 135, 140, 145, 150, 155, 158, 165, 52, 52, 168, 173, 176, 181, 52, 186, 189, 192, 0, 1, 25, 148, 2, 16, 114, 26, 149, 2, 15, 113, 27, 150, 1, 14, 112, 1, 22, 145, 1, 23, 146, 1, 24, 147, 1, 32, 156, 1, 28, 152, 1, 29, 153, 1, 30, 154, 1, 31, 155, 1, 6, 87, 1, 5, 85, 2, 0, 1, 4, 84, 1, 3, 83, 1, 2, 81, 1, 1, 80, 1, 45, 193, 1, 44, 192, 1, 8, 89, 2, 7, 88, 46, 194, 1, 36, 181, 2, 13, 101, 37, 182, 2, 12, 100, 38, 183, 2, 11, 99, 33, 176, 2, 18, 133, 34, 177, 2, 10, 97, 35, 178, 1, 9, 96, 3, 17, 128, 43, 188, 51, 213, 1, 50, 212, 2, 39, 184, 47, 209, 1, 40, 185, 2, 41, 186, 49, 211, 2, 42, 187, 48, 210, 1, 19, 137, 1, 20, 138, 1, 21, 139, }; const unsigned short Dict460KeyHashTable[] = { 53, 58, 52, 63, 68, 52, 71, 74, 77, 80, 85, 90, 93, 96, 99, 104, 52, 107, 112, 115, 52, 118, 123, 126, 131, 52, 136, 139, 52, 52, 142, 147, 150, 52, 52, 52, 153, 158, 161, 52, 164, 52, 167, 170, 173, 52, 180, 185, 188, 52, 52, 191, 0, 2, 9, 4240, 15, 30510, 2, 26, 41838, 32, 13112, 2, 35, 43240, 43, 39675, 1, 18, 615, 1, 29, 31433, 1, 31, 39219, 1, 36, 58080, 2, 21, 62660, 49, 36836, 2, 7, 49915, 19, 64687, 1, 48, 1619, 1, 16, 15156, 1, 12, 32015, 2, 4, 39802, 14, 7813, 1, 22, 22548, 2, 2, 5410, 42, 14339, 1, 51, 32153, 1, 45, 51122, 2, 17, 47037, 37, 54208, 1, 39, 40598, 2, 41, 40805, 46, 51894, 2, 10, 45812, 25, 46127, 1, 13, 6923, 1, 8, 24751, 2, 11, 11041, 28, 14543, 1, 33, 56869, 1, 34, 6980, 2, 47, 19394, 50, 19909, 1, 20, 54841, 1, 38, 6792, 1, 0, 19823, 1, 40, 25108, 1, 24, 34906, 3, 1, 51250, 23, 3630, 27, 33546, 2, 6, 55963, 30, 49438, 1, 5, 33470, 1, 3, 38110, 1, 44, 51324, }; vtkDICOMDictionary::Dict Dict460Data = { "GEMS_ADWSoft_3D1", 52, 52, Dict460TagHashTable, Dict460KeyHashTable, Dict460Contents }; // ----- INFINITT_FMX ----- const DictEntry Dict461Contents[] = { { 0x0015, 0x0010, 0, VR::LO, VM::M1, "" }, { 0x0015, 0x0011, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict461TagHashTable[] = { 3, 6, 0, 1, 1, 17, 1, 0, 16, }; const unsigned short Dict461KeyHashTable[] = { 2, 3, 0, 2, 0, 2690, 1, 2690, }; vtkDICOMDictionary::Dict Dict461Data = { "INFINITT_FMX", 2, 2, Dict461TagHashTable, Dict461KeyHashTable, Dict461Contents }; // ----- Nautilus Medical ----- const DictEntry Dict462Contents[] = { { 0x0857, 0x0000, 0, VR::LO, VM::M1, "" }, { 0x0857, 0x0001, 0, VR::LO, VM::M1, "" }, { 0x0857, 0x0002, 0, VR::LO, VM::M1, "" }, { 0x0857, 0x0003, 0, VR::LO, VM::M1, "" }, }; const unsigned short Dict462TagHashTable[] = { 5, 8, 11, 14, 0, 1, 2, 2, 1, 3, 3, 1, 0, 0, 1, 1, 1, }; const unsigned short Dict462KeyHashTable[] = { 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345, 2, 1345, 3, 1345, }; vtkDICOMDictionary::Dict Dict462Data = { "Nautilus Medical", 4, 4, Dict462TagHashTable, Dict462KeyHashTable, Dict462Contents }; // ----- SIEMENS MR SDS 01 ----- const DictEntry Dict463Contents[] = { { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0003, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x0004, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0005, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x0006, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0007, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x0008, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0009, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x000A, 0, VR::DS, VM::M1, "SWCorrectionFactor" }, { 0x0021, 0x000B, 0, VR::DS, VM::M1, "RFPowerErrorIndicator" }, { 0x0021, 0x000C, 0, VR::SH, VM::M1, "PositivePCSDirections" }, { 0x0021, 0x000D, 0, VR::US, VM::M1, "ProtocolChangeHistory" }, { 0x0021, 0x000E, 0, VR::LO, VM::M1, "DataFileName" }, { 0x0021, 0x000F, 0, VR::DS, VM::M3, "Stimlim" }, { 0x0021, 0x000a, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x000c, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x000d, 0, VR::US, VM::M1, "" }, { 0x0021, 0x000f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0010, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0011, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0012, 0, VR::FD, VM::M1, "" }, { 0x0021, 0x0013, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0014, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0015, 0, VR::FL, VM::M1, "MeasurementIndex" }, { 0x0021, 0x0016, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0017, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0018, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0019, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x001A, 0, VR::LO, VM::M1, "CoilString" }, { 0x0021, 0x001B, 0, VR::DS, VM::M1, "SliceResolution" }, { 0x0021, 0x001C, 0, VR::DS, VM::M3, "Stimmaxonline" }, { 0x0021, 0x001D, 0, VR::IS, VM::M1, "OperationModeFlag" }, { 0x0021, 0x001E, 0, VR::FL, VM::M16, "AutoAlignMatrix" }, { 0x0021, 0x001F, 0, VR::DS, VM::M2, "CoilTuningReflection" }, { 0x0021, 0x001a, 0, VR::LO, VM::M1, "" }, { 0x0021, 0x001b, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x001c, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x001d, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x001f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0020, 0, VR::UI, VM::M1, "RepresentativeImage" }, { 0x0021, 0x0022, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0023, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0024, 0, VR::LO, VM::M1, "PostProcProtocol" }, { 0x0021, 0x0025, 0, VR::SL, VM::M1TN, "" }, { 0x0021, 0x0026, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0027, 0, VR::US, VM::M1, "" }, { 0x0021, 0x002A, 0, VR::IS, VM::M1TN, "CoilID" }, { 0x0021, 0x002B, 0, VR::ST, VM::M1, "PatReinPattern" }, { 0x0021, 0x002C, 0, VR::DS, VM::M3, "SED" }, { 0x0021, 0x002D, 0, VR::DS, VM::M3, "SARMostCriticalAspect" }, { 0x0021, 0x002E, 0, VR::IS, VM::M1, "StimmOnMode" }, { 0x0021, 0x002F, 0, VR::DS, VM::M3, "GradientDelayTime" }, { 0x0021, 0x002a, 0, VR::IS, VM::M1TN, "" }, { 0x0021, 0x002b, 0, VR::ST, VM::M1, "" }, { 0x0021, 0x002c, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x002d, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x002e, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x002f, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0030, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0031, 0, VR::IS, VM::M1, "" }, { 0x0021, 0x0032, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0033, 0, VR::SH, VM::M1, "" }, { 0x0021, 0x0034, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0035, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0036, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0038, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0039, 0, VR::OB, VM::M1, "" }, { 0x0021, 0x003B, 0, VR::DS, VM::M1, "dBdtLimit" }, { 0x0021, 0x003C, 0, VR::OB, VM::M1, "VFModelInfo" }, { 0x0021, 0x003D, 0, VR::CS, VM::M1, "PhaseSliceOversampling" }, { 0x0021, 0x003E, 0, VR::OB, VM::M1, "VFSettings" }, { 0x0021, 0x003F, 0, VR::UT, VM::M1, "AutoAlignData" }, { 0x0021, 0x003b, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0040, 0, VR::UT, VM::M1, "FMRIModelParameters" }, { 0x0021, 0x0041, 0, VR::UT, VM::M1, "FMRIModelInfo" }, { 0x0021, 0x0042, 0, VR::UT, VM::M1, "FMRIExternalParameters" }, { 0x0021, 0x0043, 0, VR::UT, VM::M1, "FMRIExternalInfo" }, { 0x0021, 0x0044, 0, VR::DS, VM::M1TN, "" }, { 0x0021, 0x0045, 0, VR::CS, VM::M1, "" }, { 0x0021, 0x0046, 0, VR::DS, VM::M1, "" }, { 0x0021, 0x0047, 0, VR::CS, VM::M1, "SafetyStandard" }, { 0x0021, 0x0048, 0, VR::CS, VM::M1, "DICOMImageFlavor" }, { 0x0021, 0x0049, 0, VR::CS, VM::M1, "DICOMAcquisitionContrast" }, { 0x0021, 0x0050, 0, VR::US, VM::M1, "RFEchoTrainLength4MF" }, { 0x0021, 0x0051, 0, VR::US, VM::M1, "GradientEchoTrainLength4MF" }, { 0x0021, 0x0052, 0, VR::LO, VM::M1, "VersionInfo" }, { 0x0021, 0x0053, 0, VR::CS, VM::M1, "Laterality4MF" }, { 0x0021, 0x00FE, 0, VR::SQ, VM::M1, "SiemensMRSDSSequence" }, { 0x0021, 0x00fe, 0, VR::SQ, VM::M1, "" }, }; const unsigned short Dict463TagHashTable[] = { 90, 91, 94, 97, 100, 103, 106, 111, 116, 119, 122, 129, 136, 143, 150, 157, 164, 167, 170, 173, 176, 179, 182, 185, 190, 195, 200, 90, 205, 208, 211, 214, 217, 90, 220, 223, 226, 229, 232, 235, 238, 245, 248, 251, 256, 261, 266, 271, 274, 277, 280, 283, 286, 289, 292, 295, 298, 301, 304, 309, 314, 319, 324, 329, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 1, 40, 32, 1, 42, 35, 1, 41, 34, 1, 44, 37, 1, 43, 36, 2, 46, 39, 74, 64, 2, 45, 38, 75, 65, 1, 76, 66, 1, 77, 67, 3, 48, 43, 54, 43, 78, 68, 3, 47, 42, 53, 42, 79, 69, 3, 50, 45, 56, 45, 80, 70, 3, 49, 44, 55, 44, 81, 71, 3, 52, 47, 58, 47, 82, 72, 3, 51, 46, 57, 46, 83, 73, 1, 60, 49, 1, 59, 48, 1, 62, 51, 1, 61, 50, 1, 64, 53, 1, 63, 52, 1, 84, 80, 2, 65, 54, 85, 81, 2, 67, 57, 86, 82, 2, 66, 56, 87, 83, 2, 68, 59, 73, 59, 1, 70, 61, 1, 69, 60, 1, 72, 63, 1, 71, 62, 1, 0, 1, 1, 2, 3, 1, 1, 2, 1, 4, 5, 1, 3, 4, 1, 6, 7, 1, 5, 6, 3, 8, 9, 88, 254, 89, 254, 1, 7, 8, 1, 10, 11, 2, 9, 10, 15, 10, 2, 12, 13, 17, 13, 2, 11, 12, 16, 12, 2, 14, 15, 18, 15, 1, 13, 14, 1, 20, 17, 1, 19, 16, 1, 22, 19, 1, 21, 18, 1, 24, 21, 1, 23, 20, 1, 26, 23, 1, 25, 22, 1, 28, 25, 1, 27, 24, 2, 30, 27, 36, 27, 2, 29, 26, 35, 26, 2, 32, 29, 38, 29, 2, 31, 28, 37, 28, 2, 34, 31, 39, 31, 1, 33, 30, }; const unsigned short Dict463KeyHashTable[] = { 90, 90, 90, 90, 91, 90, 90, 90, 90, 90, 90, 94, 90, 90, 97, 90, 90, 90, 90, 90, 90, 100, 90, 90, 90, 90, 103, 90, 90, 90, 106, 109, 90, 90, 90, 112, 90, 115, 118, 90, 121, 90, 124, 90, 129, 136, 90, 90, 90, 90, 90, 90, 90, 139, 144, 149, 90, 154, 159, 162, 90, 167, 90, 90, 170, 177, 90, 180, 90, 90, 90, 183, 90, 90, 90, 288, 90, 90, 90, 90, 90, 90, 90, 90, 90, 295, 90, 90, 90, 90, 0, 1, 81, 53979, 1, 52, 34863, 1, 68, 48370, 1, 86, 28293, 1, 77, 10964, 1, 71, 354, 1, 70, 6507, 1, 32, 38253, 1, 47, 60210, 1, 82, 12764, 1, 14, 2470, 2, 34, 62645, 75, 18031, 3, 9, 59505, 48, 49417, 74, 32478, 1, 87, 5505, 2, 29, 39603, 85, 31322, 2, 76, 4514, 83, 14061, 2, 10, 52081, 30, 57821, 2, 31, 10402, 72, 42041, 1, 11, 54172, 2, 49, 52511, 84, 34308, 1, 12, 25581, 3, 13, 15440, 33, 54331, 69, 55819, 1, 24, 18629, 1, 40, 45863, 52, 0, 59, 1, 59, 2, 59, 3, 59, 4, 59, 5, 59, 6, 59, 7, 59, 8, 59, 15, 59, 16, 59, 17, 59, 18, 59, 19, 59, 20, 59, 21, 59, 22, 59, 23, 59, 25, 59, 26, 59, 27, 59, 28, 59, 35, 59, 36, 59, 37, 59, 38, 59, 39, 59, 41, 59, 42, 59, 44, 59, 45, 59, 46, 59, 53, 59, 54, 59, 55, 59, 56, 59, 57, 59, 58, 59, 59, 59, 60, 59, 61, 59, 62, 59, 63, 59, 64, 59, 65, 59, 66, 59, 67, 59, 73, 59, 78, 59, 79, 59, 80, 59, 89, 59, 3, 50, 54723, 51, 64335, 88, 27848, 1, 43, 19302, }; vtkDICOMDictionary::Dict Dict463Data = { "SIEMENS MR SDS 01", 90, 90, Dict463TagHashTable, Dict463KeyHashTable, Dict463Contents }; // ----- GEMS_RELA_01 ----- const DictEntry Dict464Contents[] = { { 0x0021, 0x0003, 0, VR::SS, VM::M1, "SeriesFromWhichPrescribed" }, { 0x0021, 0x0005, 0, VR::SH, VM::M1, "GenesisVersionNow" }, { 0x0021, 0x0007, 0, VR::UL, VM::M1, "SeriesRecordChecksum" }, { 0x0021, 0x0015, 0, VR::US, VM::M1, "" }, { 0x0021, 0x0016, 0, VR::SS, VM::M1, "" }, { 0x0021, 0x0018, 0, VR::SH, VM::M1, "GenesisVersionNow" }, { 0x0021, 0x0019, 0, VR::UL, VM::M1, "AcqReconRecordChecksum" }, { 0x0021, 0x0020, 0, VR::DS, VM::M1, "TableStartLocation" }, { 0x0021, 0x0035, 0, VR::SS, VM::M1, "SeriesFromWhichPrescribed" }, { 0x0021, 0x0036, 0, VR::SS, VM::M1, "ImageFromWhichPrescribed" }, { 0x0021, 0x0037, 0, VR::SS, VM::M1, "ScreenFormat" }, { 0x0021, 0x004a, 0, VR::LO, VM::M1, "AnatomicalReferenceForScout" }, { 0x0021, 0x004e, 0, VR::US, VM::M1, "" }, { 0x0021, 0x004f, 0, VR::SS, VM::M1, "LocationsInAcquisition" }, { 0x0021, 0x0050, 0, VR::SS, VM::M1, "GraphicallyPrescribed" }, { 0x0021, 0x0051, 0, VR::DS, VM::M1, "RotationFromSourceXRot" }, { 0x0021, 0x0052, 0, VR::DS, VM::M1, "RotationFromSourceYRot" }, { 0x0021, 0x0053, 0, VR::DS, VM::M1, "RotationFromSourceZRot" }, { 0x0021, 0x0054, 0, VR::SH, VM::M3, "ImagePosition" }, { 0x0021, 0x0055, 0, VR::SH, VM::M6, "ImageOrientation" }, { 0x0021, 0x0056, 0, VR::SL, VM::M1, "Num3DSlabs" }, { 0x0021, 0x0057, 0, VR::SL, VM::M1, "LocsPer3DSlab" }, { 0x0021, 0x0058, 0, VR::SL, VM::M1, "Overlaps" }, { 0x0021, 0x0059, 0, VR::SL, VM::M1, "ImageFiltering" }, { 0x0021, 0x005a, 0, VR::SL, VM::M1, "DiffusionDirection" }, { 0x0021, 0x005b, 0, VR::DS, VM::M1, "TaggingFlipAngle" }, { 0x0021, 0x005c, 0, VR::DS, VM::M1, "TaggingFlipAngle" }, { 0x0021, 0x005d, 0, VR::DS, VM::M1, "TagSpacing" }, { 0x0021, 0x005e, 0, VR::DS, VM::M1, "RTIATimer" }, { 0x0021, 0x005f, 0, VR::DS, VM::M1, "Fps" }, { 0x0021, 0x0070, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x0071, 0, VR::LT, VM::M1, "" }, { 0x0021, 0x0081, 0, VR::DS, VM::M1, "AutoWindowLevelAlpha" }, { 0x0021, 0x0082, 0, VR::DS, VM::M1, "AutoWindowLevelBeta" }, { 0x0021, 0x0083, 0, VR::DS, VM::M1, "AutoWindowLevelWindow" }, { 0x0021, 0x0084, 0, VR::DS, VM::M1, "AutoWindowLevelLevel" }, { 0x0021, 0x0090, 0, VR::SS, VM::M1, "TubeFocalSpotPosition" }, { 0x0021, 0x0091, 0, VR::SS, VM::M1, "BiopsyPosition" }, { 0x0021, 0x0092, 0, VR::FL, VM::M1, "BiopsyTLocation" }, { 0x0021, 0x0093, 0, VR::FL, VM::M1, "BiopsyRefLocation" }, { 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" }, }; const unsigned short Dict464TagHashTable[] = { 42, 45, 50, 53, 58, 41, 41, 41, 41, 41, 41, 61, 64, 67, 70, 75, 80, 41, 41, 83, 86, 41, 89, 92, 95, 41, 41, 41, 98, 101, 104, 107, 110, 113, 116, 121, 124, 129, 134, 141, 148, 0, 1, 25, 91, 2, 7, 32, 26, 92, 1, 27, 93, 2, 28, 94, 35, 132, 1, 29, 95, 1, 3, 21, 1, 39, 147, 1, 38, 146, 2, 4, 22, 37, 145, 2, 6, 25, 36, 144, 1, 5, 24, 1, 40, 148, 1, 8, 53, 1, 10, 55, 1, 9, 54, 1, 11, 74, 1, 12, 78, 1, 13, 79, 1, 14, 80, 1, 15, 81, 1, 16, 82, 1, 17, 83, 2, 0, 3, 18, 84, 1, 19, 85, 2, 1, 5, 20, 86, 2, 21, 87, 34, 131, 3, 2, 7, 22, 88, 33, 130, 3, 23, 89, 30, 112, 32, 129, 2, 24, 90, 31, 113, }; const unsigned short Dict464KeyHashTable[] = { 42, 41, 41, 47, 50, 41, 41, 41, 41, 53, 56, 71, 41, 76, 79, 82, 85, 90, 93, 41, 96, 101, 41, 106, 111, 41, 114, 119, 41, 41, 122, 125, 41, 128, 131, 41, 138, 41, 41, 141, 146, 0, 2, 6, 17035, 17, 3457, 1, 33, 50575, 1, 32, 1296, 1, 36, 59884, 7, 3, 131, 4, 131, 7, 63226, 12, 131, 21, 33964, 30, 131, 31, 131, 2, 28, 63475, 40, 13543, 1, 27, 26865, 1, 29, 65408, 1, 39, 2674, 2, 0, 5530, 8, 5530, 1, 24, 59260, 1, 2, 22736, 2, 16, 2580, 20, 64101, 2, 14, 4811, 22, 2908, 2, 9, 48003, 11, 9299, 1, 18, 60797, 2, 10, 60020, 23, 57954, 1, 35, 51347, 1, 13, 9275, 1, 37, 31497, 1, 19, 2619, 3, 1, 38803, 5, 38803, 38, 27414, 1, 34, 26866, 2, 25, 65225, 26, 65225, 1, 15, 1703, }; vtkDICOMDictionary::Dict Dict464Data = { "GEMS_RELA_01", 41, 41, Dict464TagHashTable, Dict464KeyHashTable, Dict464Contents }; // ----- SIEMENS MR MRS 05 ----- const DictEntry Dict465Contents[] = { { 0x0021, 0x0001, 0, VR::FD, VM::M1, "TransmitterReferenceAmplitude" }, { 0x0021, 0x0002, 0, VR::US, VM::M1, "HammingFilterWidth" }, { 0x0021, 0x0003, 0, VR::FD, VM::M3, "CSIGridshiftVector" }, { 0x0021, 0x0004, 0, VR::FD, VM::M1, "MixingTime" }, { 0x0021, 0x0040, 0, VR::CS, VM::M1, "SeriesProtocolInstance" }, { 0x0021, 0x0041, 0, VR::CS, VM::M1, "SpectroResultType" }, { 0x0021, 0x0042, 0, VR::CS, VM::M1, "SpectroResultExtendType" }, { 0x0021, 0x0043, 0, VR::CS, VM::M1, "PostProcProtocol" }, { 0x0021, 0x0044, 0, VR::CS, VM::M1, "RescanLevel" }, { 0x0021, 0x0045, 0, VR::OF, VM::M1, "SpectroAlgoResult" }, { 0x0021, 0x0046, 0, VR::OF, VM::M1, "SpectroDisplayParams" }, { 0x0021, 0x0047, 0, VR::IS, VM::M1, "VoxelNumber" }, { 0x0021, 0x0048, 0, VR::SQ, VM::M1, "APRSequence" }, { 0x0021, 0x0049, 0, VR::CS, VM::M1, "SyncData" }, { 0x0021, 0x004A, 0, VR::CS, VM::M1, "PostProcDetailedProtocol" }, { 0x0021, 0x004B, 0, VR::CS, VM::M1, "SpectroResultExtendTypeDetailed" }, }; const unsigned short Dict465TagHashTable[] = { 17, 22, 25, 30, 35, 38, 43, 46, 49, 52, 55, 58, 16, 16, 16, 16, 0, 2, 0, 1, 4, 64, 1, 5, 65, 2, 2, 3, 6, 66, 2, 1, 2, 7, 67, 1, 8, 68, 2, 3, 4, 9, 69, 1, 10, 70, 1, 11, 71, 1, 12, 72, 1, 13, 73, 1, 14, 74, 1, 15, 75, }; const unsigned short Dict465KeyHashTable[] = { 17, 20, 16, 16, 16, 16, 25, 30, 16, 35, 38, 41, 44, 51, 54, 57, 0, 1, 3, 15396, 2, 7, 18467, 12, 19400, 2, 0, 41119, 5, 12810, 2, 4, 61301, 9, 59580, 1, 8, 17751, 1, 15, 47104, 1, 2, 14259, 3, 1, 55796, 11, 33653, 13, 65199, 1, 14, 57592, 1, 6, 16634, 1, 10, 57721, }; vtkDICOMDictionary::Dict Dict465Data = { "SIEMENS MR MRS 05", 16, 16, Dict465TagHashTable, Dict465KeyHashTable, Dict465Contents }; // ----- TOSHIBA_MEC_CT_1.0 ----- const DictEntry Dict466Contents[] = { { 0x0019, 0x0001, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" }, { 0x0019, 0x0003, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0004, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0005, 0, VR::LT, VM::M1, "" }, { 0x0019, 0x0006, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0007, 0, VR::US, VM::M1TN, "" }, { 0x0019, 0x0008, 0, VR::LT, VM::M1, "OrientationHeadFeet" }, { 0x0019, 0x0009, 0, VR::LT, VM::M1, "ViewDirection" }, { 0x0019, 0x000a, 0, VR::LT, VM::M1, "OrientationSupineProne" }, { 0x0019, 0x000b, 0, VR::DS, VM::M1, "Location" }, { 0x0019, 0x000c, 0, VR::CS, VM::M1, "ScanViewDirection" }, { 0x0019, 0x000d, 0, VR::TM, VM::M1, "Time" }, { 0x0019, 0x000e, 0, VR::DS, VM::M1, "" }, { 0x7ff1, 0x0001, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0002, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0003, 0, VR::IS, VM::M1, "" }, { 0x7ff1, 0x0004, 0, VR::IS, VM::M1, "" }, { 0x7ff1, 0x0005, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0007, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0008, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x0009, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x000a, 0, VR::LT, VM::M1, "" }, { 0x7ff1, 0x000b, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x000c, 0, VR::US, VM::M1TN, "" }, { 0x7ff1, 0x000d, 0, VR::US, VM::M1TN, "" }, }; const unsigned short Dict466TagHashTable[] = { 27, 32, 37, 42, 47, 50, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 55, 58, 61, 66, 71, 76, 81, 84, 89, 92, 0, 2, 2, 3, 17, 4, 2, 1, 2, 18, 5, 2, 4, 5, 15, 2, 2, 3, 4, 16, 3, 1, 6, 7, 2, 5, 6, 14, 1, 1, 8, 9, 1, 7, 8, 2, 10, 11, 24, 12, 2, 9, 10, 25, 13, 2, 12, 13, 22, 10, 2, 11, 12, 23, 11, 1, 20, 8, 2, 13, 14, 21, 9, 1, 0, 1, 1, 19, 7, }; const unsigned short Dict466KeyHashTable[] = { 26, 26, 27, 26, 26, 30, 26, 26, 26, 26, 26, 35, 38, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 43, 0, 1, 12, 22493, 2, 7, 60981, 8, 45622, 1, 9, 4971, 2, 10, 20765, 11, 38849, 20, 0, 206, 1, 206, 2, 206, 3, 206, 4, 206, 5, 206, 6, 206, 13, 206, 14, 206, 15, 206, 16, 206, 17, 206, 18, 206, 19, 206, 20, 206, 21, 206, 22, 206, 23, 206, 24, 206, 25, 206, }; vtkDICOMDictionary::Dict Dict466Data = { "TOSHIBA_MEC_CT_1.0", 26, 26, Dict466TagHashTable, Dict466KeyHashTable, Dict466Contents }; // ----- SPI Release 1 ----- const DictEntry Dict467Contents[] = { { 0x0009, 0x0008, 0, VR::CS, VM::M1, "" }, { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" }, { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" }, { 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" }, { 0x0009, 0x0041, 0, VR::SH, VM::M1, "DataObjectSubtype" }, { 0x0011, 0x0010, 0, VR::LO, VM::M1, "Organ" }, { 0x0011, 0x0015, 0, VR::LO, VM::M1, "AllergyIndication" }, { 0x0011, 0x0020, 0, VR::LO, VM::M1, "Pregnancy" }, { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" }, }; const unsigned short Dict467TagHashTable[] = { 10, 15, 9, 9, 24, 9, 9, 29, 9, 0, 2, 3, 64, 8, 96, 4, 0, 8, 2, 21, 4, 65, 5, 16, 2, 6, 21, 7, 32, 1, 1, 16, }; const unsigned short Dict467KeyHashTable[] = { 9, 10, 15, 9, 20, 9, 9, 23, 26, 0, 2, 3, 58111, 5, 27939, 2, 2, 1085, 7, 11418, 1, 4, 49518, 1, 1, 60804, 3, 0, 597, 6, 12183, 8, 36166, }; vtkDICOMDictionary::Dict Dict467Data = { "SPI Release 1", 9, 9, Dict467TagHashTable, Dict467KeyHashTable, Dict467Contents }; vtkDICOMDictionary::Dict *PrivateDictData[] = { &Dict001Data, &Dict002Data, &Dict003Data, &Dict004Data, &Dict005Data, &Dict006Data, &Dict007Data, &Dict008Data, &Dict009Data, &Dict010Data, &Dict011Data, &Dict012Data, &Dict013Data, &Dict014Data, &Dict015Data, &Dict016Data, &Dict017Data, &Dict018Data, &Dict019Data, &Dict020Data, &Dict021Data, &Dict022Data, &Dict023Data, &Dict024Data, &Dict025Data, &Dict026Data, &Dict027Data, &Dict028Data, &Dict029Data, &Dict030Data, &Dict031Data, &Dict032Data, &Dict033Data, &Dict034Data, &Dict035Data, &Dict036Data, &Dict037Data, &Dict038Data, &Dict039Data, &Dict040Data, &Dict041Data, &Dict042Data, &Dict043Data, &Dict044Data, &Dict045Data, &Dict046Data, &Dict047Data, &Dict048Data, &Dict049Data, &Dict050Data, &Dict051Data, &Dict052Data, &Dict053Data, &Dict054Data, &Dict055Data, &Dict056Data, &Dict057Data, &Dict058Data, &Dict059Data, &Dict060Data, &Dict061Data, &Dict062Data, &Dict063Data, &Dict064Data, &Dict065Data, &Dict066Data, &Dict067Data, &Dict068Data, &Dict069Data, &Dict070Data, &Dict071Data, &Dict072Data, &Dict073Data, &Dict074Data, &Dict075Data, &Dict076Data, &Dict077Data, &Dict078Data, &Dict079Data, &Dict080Data, &Dict081Data, &Dict082Data, &Dict083Data, &Dict084Data, &Dict085Data, &Dict086Data, &Dict087Data, &Dict088Data, &Dict089Data, &Dict090Data, &Dict091Data, &Dict092Data, &Dict093Data, &Dict094Data, &Dict095Data, &Dict096Data, &Dict097Data, &Dict098Data, &Dict099Data, &Dict100Data, &Dict101Data, &Dict102Data, &Dict103Data, &Dict104Data, &Dict105Data, &Dict106Data, &Dict107Data, &Dict108Data, &Dict109Data, &Dict110Data, &Dict111Data, &Dict112Data, &Dict113Data, &Dict114Data, &Dict115Data, &Dict116Data, &Dict117Data, &Dict118Data, &Dict119Data, &Dict120Data, &Dict121Data, &Dict122Data, &Dict123Data, &Dict124Data, &Dict125Data, &Dict126Data, &Dict127Data, &Dict128Data, &Dict129Data, &Dict130Data, &Dict131Data, &Dict132Data, &Dict133Data, &Dict134Data, &Dict135Data, &Dict136Data, &Dict137Data, &Dict138Data, &Dict139Data, &Dict140Data, &Dict141Data, &Dict142Data, &Dict143Data, &Dict144Data, &Dict145Data, &Dict146Data, &Dict147Data, &Dict148Data, &Dict149Data, &Dict150Data, &Dict151Data, &Dict152Data, &Dict153Data, &Dict154Data, &Dict155Data, &Dict156Data, &Dict157Data, &Dict158Data, &Dict159Data, &Dict160Data, &Dict161Data, &Dict162Data, &Dict163Data, &Dict164Data, &Dict165Data, &Dict166Data, &Dict167Data, &Dict168Data, &Dict169Data, &Dict170Data, &Dict171Data, &Dict172Data, &Dict173Data, &Dict174Data, &Dict175Data, &Dict176Data, &Dict177Data, &Dict178Data, &Dict179Data, &Dict180Data, &Dict181Data, &Dict182Data, &Dict183Data, &Dict184Data, &Dict185Data, &Dict186Data, &Dict187Data, &Dict188Data, &Dict189Data, &Dict190Data, &Dict191Data, &Dict192Data, &Dict193Data, &Dict194Data, &Dict195Data, &Dict196Data, &Dict197Data, &Dict198Data, &Dict199Data, &Dict200Data, &Dict201Data, &Dict202Data, &Dict203Data, &Dict204Data, &Dict205Data, &Dict206Data, &Dict207Data, &Dict208Data, &Dict209Data, &Dict210Data, &Dict211Data, &Dict212Data, &Dict213Data, &Dict214Data, &Dict215Data, &Dict216Data, &Dict217Data, &Dict218Data, &Dict219Data, &Dict220Data, &Dict221Data, &Dict222Data, &Dict223Data, &Dict224Data, &Dict225Data, &Dict226Data, &Dict227Data, &Dict228Data, &Dict229Data, &Dict230Data, &Dict231Data, &Dict232Data, &Dict233Data, &Dict234Data, &Dict235Data, &Dict236Data, &Dict237Data, &Dict238Data, &Dict239Data, &Dict240Data, &Dict241Data, &Dict242Data, &Dict243Data, &Dict244Data, &Dict245Data, &Dict246Data, &Dict247Data, &Dict248Data, &Dict249Data, &Dict250Data, &Dict251Data, &Dict252Data, &Dict253Data, &Dict254Data, &Dict255Data, &Dict256Data, &Dict257Data, &Dict258Data, &Dict259Data, &Dict260Data, &Dict261Data, &Dict262Data, &Dict263Data, &Dict264Data, &Dict265Data, &Dict266Data, &Dict267Data, &Dict268Data, &Dict269Data, &Dict270Data, &Dict271Data, &Dict272Data, &Dict273Data, &Dict274Data, &Dict275Data, &Dict276Data, &Dict277Data, &Dict278Data, &Dict279Data, &Dict280Data, &Dict281Data, &Dict282Data, &Dict283Data, &Dict284Data, &Dict285Data, &Dict286Data, &Dict287Data, &Dict288Data, &Dict289Data, &Dict290Data, &Dict291Data, &Dict292Data, &Dict293Data, &Dict294Data, &Dict295Data, &Dict296Data, &Dict297Data, &Dict298Data, &Dict299Data, &Dict300Data, &Dict301Data, &Dict302Data, &Dict303Data, &Dict304Data, &Dict305Data, &Dict306Data, &Dict307Data, &Dict308Data, &Dict309Data, &Dict310Data, &Dict311Data, &Dict312Data, &Dict313Data, &Dict314Data, &Dict315Data, &Dict316Data, &Dict317Data, &Dict318Data, &Dict319Data, &Dict320Data, &Dict321Data, &Dict322Data, &Dict323Data, &Dict324Data, &Dict325Data, &Dict326Data, &Dict327Data, &Dict328Data, &Dict329Data, &Dict330Data, &Dict331Data, &Dict332Data, &Dict333Data, &Dict334Data, &Dict335Data, &Dict336Data, &Dict337Data, &Dict338Data, &Dict339Data, &Dict340Data, &Dict341Data, &Dict342Data, &Dict343Data, &Dict344Data, &Dict345Data, &Dict346Data, &Dict347Data, &Dict348Data, &Dict349Data, &Dict350Data, &Dict351Data, &Dict352Data, &Dict353Data, &Dict354Data, &Dict355Data, &Dict356Data, &Dict357Data, &Dict358Data, &Dict359Data, &Dict360Data, &Dict361Data, &Dict362Data, &Dict363Data, &Dict364Data, &Dict365Data, &Dict366Data, &Dict367Data, &Dict368Data, &Dict369Data, &Dict370Data, &Dict371Data, &Dict372Data, &Dict373Data, &Dict374Data, &Dict375Data, &Dict376Data, &Dict377Data, &Dict378Data, &Dict379Data, &Dict380Data, &Dict381Data, &Dict382Data, &Dict383Data, &Dict384Data, &Dict385Data, &Dict386Data, &Dict387Data, &Dict388Data, &Dict389Data, &Dict390Data, &Dict391Data, &Dict392Data, &Dict393Data, &Dict394Data, &Dict395Data, &Dict396Data, &Dict397Data, &Dict398Data, &Dict399Data, &Dict400Data, &Dict401Data, &Dict402Data, &Dict403Data, &Dict404Data, &Dict405Data, &Dict406Data, &Dict407Data, &Dict408Data, &Dict409Data, &Dict410Data, &Dict411Data, &Dict412Data, &Dict413Data, &Dict414Data, &Dict415Data, &Dict416Data, &Dict417Data, &Dict418Data, &Dict419Data, &Dict420Data, &Dict421Data, &Dict422Data, &Dict423Data, &Dict424Data, &Dict425Data, &Dict426Data, &Dict427Data, &Dict428Data, &Dict429Data, &Dict430Data, &Dict431Data, &Dict432Data, &Dict433Data, &Dict434Data, &Dict435Data, &Dict436Data, &Dict437Data, &Dict438Data, &Dict439Data, &Dict440Data, &Dict441Data, &Dict442Data, &Dict443Data, &Dict444Data, &Dict445Data, &Dict446Data, &Dict447Data, &Dict448Data, &Dict449Data, &Dict450Data, &Dict451Data, &Dict452Data, &Dict453Data, &Dict454Data, &Dict455Data, &Dict456Data, &Dict457Data, &Dict458Data, &Dict459Data, &Dict460Data, &Dict461Data, &Dict462Data, &Dict463Data, &Dict464Data, &Dict465Data, &Dict466Data, &Dict467Data, NULL }; } // end anonymous namespace static unsigned int vtkDICOMDictPrivateInitializerCounter; vtkDICOMDictPrivateInitializer::vtkDICOMDictPrivateInitializer() { if (vtkDICOMDictPrivateInitializerCounter++ == 0) { for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++) { vtkDICOMDictionary::AddPrivateDictionary(*dp); } } } vtkDICOMDictPrivateInitializer::~vtkDICOMDictPrivateInitializer() { if (--vtkDICOMDictPrivateInitializerCounter == 0) { for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++) { vtkDICOMDictionary::RemovePrivateDictionary((*dp)->Name); } } } vtk-dicom-0.8.12/Source/vtkDICOMDictPrivate.h000066400000000000000000000016401356440565500206450ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/ #ifndef vtkDICOMDictPrivate_h #define vtkDICOMDictPrivate_h // This must be included before the initializer is declared. #include "vtkDICOMDictionary.h" //! @cond // Initializer to add dict when header included. class VTKDICOM_EXPORT vtkDICOMDictPrivateInitializer { public: vtkDICOMDictPrivateInitializer(); ~vtkDICOMDictPrivateInitializer(); private: vtkDICOMDictPrivateInitializer(const vtkDICOMDictPrivateInitializer&); vtkDICOMDictPrivateInitializer& operator=( const vtkDICOMDictPrivateInitializer&); }; static vtkDICOMDictPrivateInitializer vtkDICOMDictPrivateInitializerInstance; //! @endcond #endif /* vtkDICOMDictPrivate_h */ // VTK-HeaderTest-Exclude: vtkDICOMDictPrivate.h vtk-dicom-0.8.12/Source/vtkDICOMDictionary.cxx000066400000000000000000000201651356440565500211120ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMDictionary.h" #include "vtkDICOMVR.h" #include "vtkDICOMVM.h" #include "vtkDICOMTag.h" #include "vtkDICOMDictEntry.h" // Including this forces the loading of the private dictionaries. #include "vtkDICOMDictPrivate.h" #include //---------------------------------------------------------------------------- struct vtkDICOMDictionary::DictHashEntry { unsigned int Hash; vtkDICOMDictionary::Dict *Dict; }; vtkDICOMDictionary::DictHashEntry * vtkDICOMDictionary::PrivateDictTable[DICT_PRIVATE_TABLE_SIZE]; //---------------------------------------------------------------------------- // A helper class to delete static variables when program exits. static unsigned int vtkDICOMDictionaryInitializerCounter; // Perform initialization of static variables. vtkDICOMDictionaryInitializer::vtkDICOMDictionaryInitializer() { if (vtkDICOMDictionaryInitializerCounter++ == 0) { for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++) { vtkDICOMDictionary::PrivateDictTable[i] = 0; } } } // Perform cleanup of static variables. vtkDICOMDictionaryInitializer::~vtkDICOMDictionaryInitializer() { if (--vtkDICOMDictionaryInitializerCounter == 0) { for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++) { delete [] vtkDICOMDictionary::PrivateDictTable[i]; } } } //---------------------------------------------------------------------------- unsigned int vtkDICOMDictionary::HashLongString( const char *input, char output[64]) { // Compute a string hash based on the function "djb2". // Because DICOM strings are padded with spaces to make their // length even, the pad space is ignored. unsigned int h = 5381; for (int k = 0; k < 64; k += 2) { unsigned char c = input[k]; output[k] = c; if (c == '\0') { break; } h = (h << 5) + h + c; c = input[k+1]; // trim pad space before terminating null if (c == ' ' && input[k+2] == '\0') { c = '\0'; } output[k+1] = c; if (c == '\0') { break; } h = (h << 5) + h + c; } return h; } //---------------------------------------------------------------------------- vtkDICOMDictionary::Dict *vtkDICOMDictionary::FindPrivateDict( const char *name) { unsigned int m = DICT_PRIVATE_TABLE_SIZE - 1; DictHashEntry **htable = vtkDICOMDictionary::PrivateDictTable; DictHashEntry *hptr; // strip trailing spaces and compute the hash char stripname[64]; unsigned int h = vtkDICOMDictionary::HashLongString(name, stripname); unsigned int i = (h & m); if (htable && (hptr = htable[i]) != NULL) { while (hptr->Dict != 0) { if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0) { return hptr->Dict; } hptr++; } } return 0; } //---------------------------------------------------------------------------- vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry( const vtkDICOMTag tag, const char *dictname) { unsigned short group = tag.GetGroup(); unsigned short element = tag.GetElement(); // compute the hash table index unsigned int h = tag.ComputeHash(); unsigned int i = (h & (DICT_HASH_TABLE_SIZE - 1)); // default to the standard dictionary vtkDICOMDictionary::Dict *dict = &vtkDICOMDictionary::DictData; // for odd group number, only search the private dictionary if ((group & 1) != 0 && dictname != 0) { dict = vtkDICOMDictionary::FindPrivateDict(dictname); if (dict == 0) { // private dictionary not found return vtkDICOMDictEntry(); } i = (h % dict->HashSize); } // search the hash table const unsigned short *hptr = &dict->TagHashTable[dict->TagHashTable[i]]; const vtkDICOMDictEntry::Entry *dptr = dict->Contents; for (unsigned short n = *hptr; n != 0; --n) { ++hptr; const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr]; ++hptr; if (*hptr == element && entry->Group == group) { return vtkDICOMDictEntry(entry); } } // not found in dictionary return vtkDICOMDictEntry(); } //---------------------------------------------------------------------------- vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry( const char *key, const char *dictname) { if (key == 0 || key[0] == '\0') { return vtkDICOMDictEntry(); } char stripkey[64]; unsigned int h = vtkDICOMDictionary::HashLongString(key, stripkey); // default to the standard dictionary vtkDICOMDictionary::Dict *dict = &vtkDICOMDictionary::DictData; // for odd group number, only search the private dictionary if (dictname != 0 && dictname[0] != '\0') { dict = vtkDICOMDictionary::FindPrivateDict(dictname); if (dict == 0) { // private dictionary not found return vtkDICOMDictEntry(); } } unsigned short i = static_cast(h % dict->HashSize); unsigned short j = static_cast(h / dict->HashSize); // search the hash table const unsigned short *hptr = &dict->KeyHashTable[dict->KeyHashTable[i]]; const vtkDICOMDictEntry::Entry *dptr = dict->Contents; for (unsigned short n = *hptr; n != 0; --n) { ++hptr; const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr]; ++hptr; if (*hptr == j && strncmp(stripkey, entry->Name, 64) == 0) { return vtkDICOMDictEntry(entry); } } if (dictname != 0 && dictname[0] != '\0') { // brute force search the entire dictionary, if hash lookup failed // (in case people manually changed the key strings in the code, // without re-running makedict.py to re-generate the hash table) for (unsigned short k = 0; k < dict->DataSize; k++) { const vtkDICOMDictEntry::Entry *entry = &dptr[k]; if (strncmp(stripkey, entry->Name, 64) == 0) { return vtkDICOMDictEntry(entry); } } } // not found in dictionary return vtkDICOMDictEntry(); } //---------------------------------------------------------------------------- void vtkDICOMDictionary::AddPrivateDictionary(Dict *dict) { unsigned int m = DICT_PRIVATE_TABLE_SIZE - 1; DictHashEntry **htable = vtkDICOMDictionary::PrivateDictTable; // strip trailing spaces and compute the hash char stripname[64]; unsigned int h = vtkDICOMDictionary::HashLongString(dict->Name, stripname); unsigned int i = (h & m); DictHashEntry *hptr = htable[i]; // create hash table row if it is empty if (hptr == 0) { htable[i] = new DictHashEntry[2]; hptr = htable[i]; hptr->Hash = 0; hptr->Dict = 0; } // go to the end of the row in the hash table int n = 0; while (hptr->Dict != 0) { n++; hptr++; } // if n+1 is a power of two, double allocated space if (n > 0 && (n & (n+1)) == 0) { DictHashEntry *oldptr = htable[i]; hptr = new DictHashEntry[2*(n+1)]; htable[i] = hptr; // copy the old list for (int j = 0; j < n; j++) { *hptr++ = oldptr[j]; } delete [] oldptr; } hptr->Hash = h; hptr->Dict = dict; hptr++; hptr->Hash = 0; hptr->Dict = 0; } //---------------------------------------------------------------------------- void vtkDICOMDictionary::RemovePrivateDictionary(const char *name) { unsigned int m = DICT_PRIVATE_TABLE_SIZE - 1; DictHashEntry **htable = vtkDICOMDictionary::PrivateDictTable; DictHashEntry *hptr; // strip trailing spaces and compute the hash char stripname[64]; unsigned int h = vtkDICOMDictionary::HashLongString(name, stripname); unsigned int i = (h & m); if (htable && (hptr = htable[i]) != NULL) { while (hptr->Dict != 0) { if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0) { break; } hptr++; } // erase while (hptr->Dict != 0) { *hptr = *(hptr + 1); hptr++; } } } vtk-dicom-0.8.12/Source/vtkDICOMDictionary.h000066400000000000000000000103631356440565500205360ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMDictionary_h #define vtkDICOMDictionary_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMDictEntry.h" #include "vtkDICOMDictHash.h" //! The size of the hash table for the dicom dictionary. #define DICT_HASH_TABLE_SIZE 4096 #define DICT_PRIVATE_TABLE_SIZE 512 //! Provide access to the DICOM tag dictionary. class VTKDICOM_EXPORT vtkDICOMDictionary { public: //! A struct to store a DICOM dictionary hash table. struct Dict { const char *Name; unsigned short HashSize; unsigned short DataSize; const unsigned short *TagHashTable; const unsigned short *KeyHashTable; const vtkDICOMDictEntry::Entry *Contents; }; struct DictHashEntry; //@{ //! Find the dictionary entry for the given tag. static vtkDICOMDictEntry FindDictEntry(const vtkDICOMTag tag) { return vtkDICOMDictionary::FindDictEntry(tag, 0); } //! Find the dictionary for the given key. static vtkDICOMDictEntry FindDictEntry(const char *key) { return vtkDICOMDictionary::FindDictEntry(key, 0); } //@} //@{ //! Include a private dictionary when searching for the tag. /*! * This method requires that the creator of the private dictionary * be given as it appears in the creator tag. This method is usually * not called directly, it is best to call vtkDICOMMetaData's * FindDictEntry method because it can automatically identify the * creator of any private tags that are present in the metadata. */ static vtkDICOMDictEntry FindDictEntry( const vtkDICOMTag tag, const char *privateDict); //! Search for a private dictionary entry by key. /*! * Warning: not all private dictionaries have normatively defined keys * associated with the tags they use. Even for those that do, the keys * used by this library might not be accurate because it relies on * information collected from third parties. */ static vtkDICOMDictEntry FindDictEntry( const char *key, const char *privateDict); //@} //@{ //! Add the hash table for a private dictionary. /*! * The name should be the text that appears in the PrivateCreator * element of the data set when this dictionary is used. The value * of "n" is the size of the provided hash table. */ static void AddPrivateDictionary(Dict *dict); //! Remove a private dictionary. static void RemovePrivateDictionary(const char *name); //@} private: friend class vtkDICOMDictionaryInitializer; //! Compute a string hash for a DICOM text value. /*! * The final trailing space will be stripped, if present. The * resulting string will not be terminated if it fills all 64 bytes. */ static unsigned int HashLongString(const char *lo, char stripped[64]); //! Locate a private dictionary, given the name. /*! * This returns the hash table, and also returns the size of the * hash table in the second argument. */ static Dict *FindPrivateDict(const char *name); //! The lookup table for the dictionary. static Dict DictData; //! The lookup table for private dictionaries. static DictHashEntry *PrivateDictTable[DICT_PRIVATE_TABLE_SIZE]; }; //! @cond //! Initializer (Schwarz counter). /*! * This ensures that the vtkDICOMDictionary module is initialized before * any other module that includes this header file. */ class VTKDICOM_EXPORT vtkDICOMDictionaryInitializer { public: vtkDICOMDictionaryInitializer(); ~vtkDICOMDictionaryInitializer(); private: vtkDICOMDictionaryInitializer(const vtkDICOMDictionaryInitializer&); vtkDICOMDictionaryInitializer& operator=( const vtkDICOMDictionaryInitializer&); }; static vtkDICOMDictionaryInitializer vtkDICOMDictionaryInitializerInstance; //! @endcond #endif /* vtkDICOMDictionary_h */ // VTK-HeaderTest-Exclude: vtkDICOMDictionary.h vtk-dicom-0.8.12/Source/vtkDICOMDirectory.cxx000066400000000000000000002314321356440565500207520ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMDirectory.h" #include "vtkDICOMFile.h" #include "vtkDICOMFileDirectory.h" #include "vtkDICOMFilePath.h" #include "vtkDICOMItem.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMParser.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMVR.h" #include "vtkObjectFactory.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkCommand.h" #include "vtkUnsignedShortArray.h" #ifdef DICOM_USE_SQLITE #include #endif #include #include #include #include #include #include #include #include #include vtkStandardNewMacro(vtkDICOMDirectory); //---------------------------------------------------------------------------- // Simple structs to hold directory information. struct vtkDICOMDirectory::SeriesItem { vtkDICOMItem Record; vtkSmartPointer Files; vtkSmartPointer Meta; }; struct vtkDICOMDirectory::StudyItem { vtkDICOMItem Record; vtkDICOMItem PatientRecord; int FirstSeries; int LastSeries; }; struct vtkDICOMDirectory::PatientItem { vtkDICOMItem Record; vtkSmartPointer Studies; }; class vtkDICOMDirectory::SeriesVector : public std::vector {}; class vtkDICOMDirectory::StudyVector : public std::vector {}; class vtkDICOMDirectory::PatientVector : public std::vector {}; class vtkDICOMDirectory::VisitedVector : public std::vector {}; //---------------------------------------------------------------------------- // Information used to sort DICOM files. struct vtkDICOMDirectory::FileInfo { unsigned int InstanceNumber; const char *FileName; vtkDICOMValue ImageUID; vtkDICOMItem ImageRecord; }; struct vtkDICOMDirectory::FileInfoPair { const char *Key; FileInfo *Info; FileInfoPair(const char *key, FileInfo *ptr) : Key(key), Info(ptr) {} }; struct vtkDICOMDirectory::SeriesInfo { // -- PATIENT -- vtkDICOMItem PatientRecord; vtkDICOMValue PatientName; vtkDICOMValue PatientID; // -- STUDY -- vtkDICOMItem StudyRecord; vtkDICOMValue StudyDate; vtkDICOMValue StudyTime; vtkDICOMValue StudyUID; // -- SERIES -- vtkDICOMItem SeriesRecord; vtkDICOMValue SeriesUID; unsigned int SeriesNumber; // -- INSTANCES -- std::list Files; std::vector FilesByUID; bool QueryMatched; }; bool vtkDICOMDirectory::CompareInstanceUIDs( const FileInfoPair& p, const char *uid) { return (vtkDICOMUtilities::CompareUIDs(p.Key, uid) < 0); } bool vtkDICOMDirectory::CompareInstance( const FileInfo &fi1, const FileInfo &fi2) { if (fi1.InstanceNumber != fi2.InstanceNumber) { return (fi1.InstanceNumber < fi2.InstanceNumber); } // fall back to filename comparison if (fi1.FileName != 0 && fi2.FileName != 0) { return (strcmp(fi1.FileName, fi2.FileName) < 0); } // null filename sorts before non-null filename return (fi2.FileName != 0); } bool vtkDICOMDirectory::CompareSeriesUIDs( const SeriesInfo *si, const char *uid) { return (vtkDICOMUtilities::CompareUIDs( si->SeriesUID.GetCharData(), uid) < 0); } bool vtkDICOMDirectory::CompareSeriesIds( const SeriesInfo *si1, const SeriesInfo *si2) { // Compare patient, then study, then series const char *patientID1 = si1->PatientID.GetCharData(); patientID1 = (patientID1 ? patientID1 : ""); const char *patientID2 = si2->PatientID.GetCharData(); patientID2 = (patientID2 ? patientID2 : ""); int c = strcmp(patientID1, patientID2); if (c == 0) { c = vtkDICOMUtilities::CompareUIDs( si1->StudyUID.GetCharData(), si2->StudyUID.GetCharData()); if (c == 0) { c = vtkDICOMUtilities::CompareUIDs( si1->SeriesUID.GetCharData(), si2->SeriesUID.GetCharData()); } } return (c < 0); } bool vtkDICOMDirectory::CompareSeriesInfo( const SeriesInfo &si1, const SeriesInfo &si2) { // Use PatientName to sort the patients const char *patientName1 = si1.PatientName.GetCharData(); patientName1 = (patientName1 ? patientName1 : ""); const char *patientName2 = si2.PatientName.GetCharData(); patientName2 = (patientName2 ? patientName2 : ""); int c = strcmp(patientName1, patientName2); if (c == 0) { // Use StudyDate and StudyTime to sort the studies const char *studyDate1 = si1.StudyDate.GetCharData(); const char *studyDate2 = si2.StudyDate.GetCharData(); if (studyDate1 && studyDate2) { c = strcmp(studyDate1, studyDate2); if (c == 0) { const char *studyTime1 = si1.StudyTime.GetCharData(); const char *studyTime2 = si2.StudyTime.GetCharData(); if (studyTime1 && studyTime2) { c = strcmp(studyTime1, studyTime2); } } } if (c == 0) { // Use SeriesNumber to sort the series c = si1.SeriesNumber - si2.SeriesNumber; } } return (c < 0); } //---------------------------------------------------------------------------- // These are the attributes used for a directory scan namespace { static const DC::EnumType ScanTags[] = { // basic required information DC::SpecificCharacterSet, // 1C // image-level information DC::SOPClassUID, // 1 DC::SOPInstanceUID, // 1 DC::InstanceNumber, // 1 DC::Rows, // 3 DC::Columns, // 3 // series-level information DC::SeriesDate, // 3 DC::SeriesTime, // 3 DC::Modality, // 1 DC::SeriesDescription, // 3 DC::SeriesInstanceUID, // 1 DC::SeriesNumber, // 1 // study-level information DC::StudyDate, // 1 DC::StudyTime, // 1 DC::ReferringPhysicianName, // 3 DC::PatientAge, // 3 DC::StudyInstanceUID, // 1 DC::StudyID, // 1 DC::AccessionNumber, // 2 DC::StudyDescription, // 2 // patient-level information DC::PatientName, // 2 DC::PatientID, // 1 DC::PatientBirthDate, // 3 DC::PatientSex, // 3 // delimiter to mark end of list DC::ItemDelimitationItem }; static const DC::EnumType SeriesTags[] = { DC::SpecificCharacterSet, DC::SeriesDate, DC::SeriesTime, DC::Modality, DC::SeriesDescription, DC::SeriesInstanceUID, DC::SeriesNumber, DC::ItemDelimitationItem }; static const DC::EnumType StudyTags[] = { DC::SpecificCharacterSet, DC::StudyDate, DC::StudyTime, DC::ReferringPhysicianName, DC::PatientAge, DC::StudyInstanceUID, DC::StudyID, DC::AccessionNumber, DC::StudyDescription, DC::ItemDelimitationItem }; static const DC::EnumType PatientTags[] = { DC::SpecificCharacterSet, DC::PatientName, DC::PatientID, DC::PatientBirthDate, DC::PatientSex, DC::ItemDelimitationItem }; } //---------------------------------------------------------------------------- // A temporary container class for use with stl algorithms class vtkDICOMDirectory::SeriesInfoList : public std::list {}; class vtkDICOMDirectory::SeriesInfoVector : public std::vector {}; //---------------------------------------------------------------------------- // A helper class for building a sorted list of unique tags class SortedTags : public std::vector { public: void SetFrom(const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord); }; void SortedTags::SetFrom(const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord) { this->clear(); this->reserve(patientRecord.GetNumberOfDataElements() + studyRecord.GetNumberOfDataElements() + seriesRecord.GetNumberOfDataElements()); const vtkDICOMItem *records[3] = { &patientRecord, &studyRecord, &seriesRecord }; for (int i = 0; i < 3; i++) { vtkDICOMDataElementIterator iter = records[i]->Begin(); vtkDICOMDataElementIterator iterEnd = records[i]->End(); while (iter != iterEnd) { vtkDICOMTag tag = iter->GetTag(); std::vector::iterator pos = std::lower_bound(begin(), end(), tag); if (pos == end() || *pos != tag) { this->insert(pos, tag); } ++iter; } } } //---------------------------------------------------------------------------- vtkDICOMDirectory::vtkDICOMDirectory() { this->DirectoryName = 0; this->InputFileNames = 0; this->FilePattern = 0; this->DefaultCharacterSet = vtkDICOMCharacterSet::GetGlobalDefault(); this->OverrideCharacterSet = vtkDICOMCharacterSet::GetGlobalOverride(); this->Series = new SeriesVector; this->Studies = new StudyVector; this->Patients = new PatientVector; this->Visited = new VisitedVector; this->FileSetID = 0; this->InternalFileName = 0; this->QueryFiles = -1; this->IgnoreDicomdir = 0; this->RequirePixelData = 1; this->FollowSymlinks = 1; this->ShowHidden = 1; this->ScanDepth = 1; this->Query = 0; this->FindLevel = vtkDICOMDirectory::IMAGE; this->UsingOsirixDatabase = false; this->CurrentPatientRecord = 0; this->CurrentStudyRecord = 0; this->CurrentSeriesRecord = 0; this->CurrentImageRecord = 0; } //---------------------------------------------------------------------------- vtkDICOMDirectory::~vtkDICOMDirectory() { if (this->InputFileNames) { this->InputFileNames->Delete(); } delete [] this->DirectoryName; delete [] this->FilePattern; delete [] this->InternalFileName; delete this->Series; delete this->Studies; delete this->Patients; delete this->Visited; delete [] this->FileSetID; delete this->Query; } //---------------------------------------------------------------------------- void vtkDICOMDirectory::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); const char *inputDirectory = this->GetDirectoryName(); os << indent << "DirectoryName: " << (inputDirectory ? inputDirectory : "(NULL)") << "\n"; os << indent << "FilePattern: " << (inputDirectory ? inputDirectory : "(NULL)") << "\n"; os << indent << "FileNames: " << this->InputFileNames << "\n"; os << indent << "ScanDepth: " << this->ScanDepth << "\n"; os << indent << "FindLevel: " << (this->FindLevel == vtkDICOMDirectory::IMAGE ? "IMAGE\n" : "SERIES\n"); os << indent << "QueryFiles: " << (this->QueryFiles == 0 ? "Never\n" : (this->QueryFiles == 1 ? "Always\n" : "Default\n")); os << indent << "IgnoreDicomdir: " << (this->IgnoreDicomdir ? "On\n" : "Off\n"); os << indent << "RequirePixelData: " << (this->RequirePixelData ? "On\n" : "Off\n"); os << indent << "FollowSymlinks: " << (this->FollowSymlinks ? "On\n" : "Off\n"); os << indent << "NumberOfSeries: " << this->GetNumberOfSeries() << "\n"; os << indent << "NumberOfStudies: " << this->GetNumberOfStudies() << "\n"; os << indent << "NumberOfPatients: " << this->GetNumberOfPatients() << "\n"; os << indent << "FileSetID: " << (this->FileSetID ? this->FileSetID : "(NULL)") << "\n"; } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetDirectoryName(const char *name) { if (name == this->DirectoryName || (name && this->DirectoryName && strcmp(name, this->DirectoryName) == 0)) { return; } delete [] this->DirectoryName; this->DirectoryName = 0; if (name) { char *cp = new char[strlen(name) + 1]; strcpy(cp, name); this->DirectoryName = cp; } this->Modified(); } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetFilePattern(const char *name) { if (name == this->FilePattern || (name && this->FilePattern && strcmp(name, this->FilePattern) == 0)) { return; } delete [] this->FilePattern; this->FilePattern = 0; if (name) { char *cp = new char[strlen(name) + 1]; strcpy(cp, name); this->FilePattern = cp; } this->Modified(); } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetInputFileNames(vtkStringArray *sa) { if (sa != this->InputFileNames) { if (!sa) { this->InputFileNames->Delete(); } else { if (!this->InputFileNames) { this->InputFileNames = vtkStringArray::New(); } this->InputFileNames->DeepCopy(sa); } this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::AddInputFileNames(vtkStringArray *sa) { if (sa && sa->GetNumberOfValues() > 0) { if (!this->InputFileNames) { this->InputFileNames = vtkStringArray::New(); } vtkIdType n = sa->GetNumberOfValues(); for (vtkIdType i = 0; i < n; i++) { this->InputFileNames->InsertNextValue(sa->GetValue(i)); } this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetFindQuery(const vtkDICOMItem& item) { if (this->Query != &item) { delete this->Query; this->Query = 0; if (!item.IsEmpty()) { this->Query = new vtkDICOMItem; *(this->Query) = item; } } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetFindLevel(int level) { if (level < vtkDICOMDirectory::SERIES) { level = vtkDICOMDirectory::SERIES; } if (level > vtkDICOMDirectory::IMAGE) { level = vtkDICOMDirectory::IMAGE; } if (level != this->FindLevel) { this->FindLevel = level; this->Modified(); } } //---------------------------------------------------------------------------- int vtkDICOMDirectory::GetNumberOfSeries() { return static_cast(this->Series->size()); } //---------------------------------------------------------------------------- const vtkDICOMItem& vtkDICOMDirectory::GetSeriesRecord(int series) { return (*this->Series)[series].Record; } //---------------------------------------------------------------------------- int vtkDICOMDirectory::GetNumberOfStudies() { return static_cast(this->Studies->size()); } //---------------------------------------------------------------------------- const vtkDICOMItem& vtkDICOMDirectory::GetStudyRecord(int study) { return (*this->Studies)[study].Record; } //---------------------------------------------------------------------------- const vtkDICOMItem& vtkDICOMDirectory::GetPatientRecordForStudy(int study) { return (*this->Studies)[study].PatientRecord; } //---------------------------------------------------------------------------- int vtkDICOMDirectory::GetFirstSeriesForStudy(int study) { return (*this->Studies)[study].FirstSeries; } //---------------------------------------------------------------------------- int vtkDICOMDirectory::GetLastSeriesForStudy(int study) { return (*this->Studies)[study].LastSeries; } //---------------------------------------------------------------------------- int vtkDICOMDirectory::GetNumberOfPatients() { return static_cast(this->Patients->size()); } //---------------------------------------------------------------------------- const vtkDICOMItem& vtkDICOMDirectory::GetPatientRecord(int patient) { return (*this->Patients)[patient].Record; } //---------------------------------------------------------------------------- vtkIntArray *vtkDICOMDirectory::GetStudiesForPatient(int patient) { return (*this->Patients)[patient].Studies; } //---------------------------------------------------------------------------- vtkStringArray *vtkDICOMDirectory::GetFileNamesForSeries(int i) { return (*this->Series)[i].Files; } //---------------------------------------------------------------------------- vtkDICOMMetaData *vtkDICOMDirectory::GetMetaDataForSeries(int i) { return (*this->Series)[i].Meta; } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetDefaultCharacterSet(vtkDICOMCharacterSet cs) { if (this->DefaultCharacterSet != cs) { this->DefaultCharacterSet = cs; this->Modified(); } } //---------------------------------------------------------------------------- // The following code does loose matching to accommodate the way that Osirix // modifies some attributes before storing them in its database namespace { // Perform cleanup of a string according to Osirix rules. std::string OsirixCleanString(const std::string& text) { std::string s; size_t l = text.length(); if (l > 0) { char space = '\0'; for (size_t i = 0; i < l; i++) { char c = text[i]; switch (c) { case ',': case '^': c = '\0'; space = ' '; break; case '/': c = '-'; break; case '\r': case '\n': c = '\0'; break; case '\"': c = '\''; break; case ' ': c = '\0'; space = ' '; break; } if (c) { if (space) { s.push_back(space); space = '\0'; } s.push_back(c); } } } return s; } // Loose matching for checking against Osirix database bool MatchesOsirixDatabase( vtkDICOMTag tag, const vtkDICOMValue& u, const vtkDICOMValue& v) { bool needsCleanCompare = false; unsigned short g = tag.GetGroup(); if (u.GetNumberOfValues() > 0 && v.GetNumberOfValues() > 0 && (g == 0x0008 || g == 0x0010)) { const DC::EnumType tagsToClean[] = { DC::StudyDescription, DC::SeriesDescription, DC::PatientName, DC::InstitutionName, DC::ReferringPhysicianName, DC::PerformingPhysicianName, DC::ItemDelimitationItem }; for (int i = 0; tagsToClean[i] != DC::ItemDelimitationItem; i++) { needsCleanCompare |= (tag == tagsToClean[i]); } } bool matched = false; if (needsCleanCompare) { vtkDICOMValue uclean( u.GetVR(), vtkDICOMCharacterSet::ISO_IR_192, OsirixCleanString(u.AsUTF8String())); vtkDICOMValue vclean( v.GetVR(), vtkDICOMCharacterSet::ISO_IR_192, OsirixCleanString(v.AsUTF8String())); matched = uclean.Matches(vclean); } else { matched = u.Matches(v); } return matched; } #ifdef DICOM_USE_SQLITE // Convert Osirix database times (NSDate) to DICOM DT std::string ConvertOsirixTime(double t) { // Seconds between our time base (00:00:00 UTC Jan 1, 1970) // and Osirix database time base (00:00:00 UTC Jan 1, 2001) const long long timediff = 978307200; long long s = static_cast(t + (t >= 0 ? 0.5 : -0.5)); return vtkDICOMUtilities::GenerateDateTime((s + timediff)*1000000, NULL); } #endif } //---------------------------------------------------------------------------- bool vtkDICOMDirectory::MatchesQuery( const vtkDICOMItem& record, vtkDICOMItem& results) { bool matched = true; if (this->Query) { vtkDICOMDataElementIterator iter; for (iter = record.Begin(); iter != record.End(); ++iter) { vtkDICOMTag tag = iter->GetTag(); if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004) { const vtkDICOMValue& v = this->Query->Get(tag); if (v.IsValid()) { const vtkDICOMValue& u = iter->GetValue(); if (this->UsingOsirixDatabase) { matched = MatchesOsirixDatabase(tag, u, v); } else { matched = u.Matches(v); } if (matched) { results.Set(tag, u); } else { break; } } } } } return matched; } //---------------------------------------------------------------------------- int vtkDICOMDirectory::MatchesImageQuery( const vtkDICOMItem& record, const vtkDICOMItem& results) { bool fullyMatched = true; bool misMatched = false; if (this->Query) { vtkDICOMDataElementIterator iter; for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter) { vtkDICOMTag tag = iter->GetTag(); const vtkDICOMValue& v = iter->GetValue(); if (v.GetVR() == vtkDICOMVR::SQ) { if (v.GetNumberOfValues() > 0 || (!results.Get(tag).IsValid() && !record.Get(tag).IsValid())) { fullyMatched = false; } } else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004) { if (v.GetVL() > 0) { if (!results.Get(tag).IsValid()) { const vtkDICOMValue& u = record.Get(tag); if (!u.IsValid()) { fullyMatched = false; } else if (!u.Matches(v)) { misMatched = true; break; } } } else if (!results.Get(tag).IsValid() && !record.Get(tag).IsValid()) { fullyMatched = false; } } } } int r = 1; if (fullyMatched) { r = 0; } if (misMatched) { r = -1; } return r; } //---------------------------------------------------------------------------- void vtkDICOMDirectory::AddSeriesWithQuery( int patient, int study, vtkStringArray *files, const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord, const vtkDICOMItem *imageRecords[]) { if (this->Query == 0) { this->AddSeriesFileNames( patient, study, files, patientRecord, studyRecord, seriesRecord, imageRecords); return; } // To store results of querying the patient, study, series records vtkDICOMItem results; if (this->MatchesQuery(patientRecord, results) && this->MatchesQuery(studyRecord, results) && this->MatchesQuery(seriesRecord, results)) { // Have we checked all the attributes in the query? bool fullyMatched = true; if (this->QueryFiles == 1) { // Always scan files, even if directory records fulfil the query fullyMatched = false; } else if (this->QueryFiles == -1) { // Check for unfulfilled query elements vtkDICOMDataElementIterator iter; for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter) { vtkDICOMTag tag = iter->GetTag(); const vtkDICOMValue& v = iter->GetValue(); if (v.GetVR() == vtkDICOMVR::SQ) { if (v.GetNumberOfValues() > 0 || !results.Get(tag).IsValid()) { fullyMatched = false; break; } } else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004) { if (!results.Get(tag).IsValid()) { fullyMatched = false; break; } } } } if (fullyMatched) { // All query attributes have been matched! this->AddSeriesFileNames( patient, study, files, patientRecord, studyRecord, seriesRecord, imageRecords); return; } // Need to query against the actual files vtkSmartPointer meta = vtkSmartPointer::New(); vtkSmartPointer parser = vtkSmartPointer::New(); parser->SetDefaultCharacterSet(this->DefaultCharacterSet); parser->SetOverrideCharacterSet(this->OverrideCharacterSet); parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMDirectory::RelayError); parser->SetMetaData(meta); parser->SetQueryItem(*this->Query); vtkSmartPointer a = vtkSmartPointer::New(); vtkIdType n = files->GetNumberOfValues(); // Create a new set of image records for the extra info std::vector storeImageRecords(n); std::vector newImageRecords; if (this->FindLevel < vtkDICOMDirectory::IMAGE) { newImageRecords.resize(n); for (vtkIdType i = 0; i < n; i++) { newImageRecords[i] = &storeImageRecords[i]; } } // Create a list of tags not to include in image record SortedTags skip; if (this->QueryFiles == 1) { // Scan for all attributes, even ones found in DICOMDIR skip.push_back(DC::SpecificCharacterSet); } else { // Skip any attributes that were found in the DICOMDIR skip.SetFrom(patientRecord, studyRecord, seriesRecord); } for (vtkIdType i = 0; i < n; i++) { const std::string& fileName = files->GetValue(i); bool matched = false; int r = this->MatchesImageQuery(*imageRecords[i], results); const vtkDICOMItem *imageRecord = imageRecords[i]; if (r == 0 && this->QueryFiles != 1) { // All remaining queries were matched by image record matched = true; } else if (r >= 0) { // Set info for use by RelayError this->CurrentPatientRecord = &patientRecord; this->CurrentStudyRecord = &studyRecord; this->CurrentSeriesRecord = &seriesRecord; this->CurrentImageRecord = imageRecords[i]; // Read the file metadata meta->Initialize(); this->SetInternalFileName(fileName.c_str()); parser->SetFileName(fileName.c_str()); parser->Update(); // Clear info used by RelayError this->CurrentPatientRecord = 0; this->CurrentStudyRecord = 0; this->CurrentSeriesRecord = 0; this->CurrentImageRecord = 0; if (!parser->GetPixelDataFound()) { if (!this->ErrorCode) { this->ErrorCode = parser->GetErrorCode(); } if (this->ErrorCode || this->RequirePixelData) { continue; } } matched = parser->GetQueryMatched(); this->FillImageRecord(&storeImageRecords[i], meta, &skip[0], skip.size()); imageRecord = &storeImageRecords[i]; } if (matched) { if (this->FindLevel < vtkDICOMDirectory::IMAGE) { // Add all the files if one file matches. a = files; } else { // Add the matched file. a->InsertNextValue(fileName); newImageRecords.push_back(imageRecord); } } } if (a->GetNumberOfValues() > 0) { this->AddSeriesFileNames( patient, study, a, patientRecord, studyRecord, seriesRecord, &newImageRecords[0]); } } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::AddSeriesFileNames( int patient, int study, vtkStringArray *files, const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord, const vtkDICOMItem *imageRecords[]) { int m = static_cast(this->Patients->size()); int n = static_cast(this->Studies->size()); int series = static_cast(this->Series->size()); if (study == n) { this->Studies->push_back(StudyItem()); StudyItem& item = this->Studies->back(); item.Record = studyRecord; item.PatientRecord = patientRecord; item.FirstSeries = series; item.LastSeries = series; } else if (n < 0 || study != n-1) { vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study"); return; } if (patient == m) { this->Patients->push_back(PatientItem()); PatientItem& item = this->Patients->back(); item.Record = patientRecord; item.Studies = vtkSmartPointer::New(); item.Studies->InsertNextValue(study); } else if (m >= 0 && patient <= m-1) { PatientItem& item = (*this->Patients)[patient]; vtkIdType nn = item.Studies->GetMaxId() + 1; vtkIdType ii = 0; for (; ii < nn; ii++) { if (study == item.Studies->GetValue(ii)) { break; } } if (ii == nn) { item.Studies->InsertNextValue(study); } } else { vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing patient"); return; } // create an object to hold the meta data for each series vtkSmartPointer meta = vtkSmartPointer::New(); int ni = static_cast(files->GetNumberOfValues()); meta->SetNumberOfInstances(ni); // add the image-level information for (int ii = 0; ii < ni; ii++) { this->CopyRecord(meta, imageRecords[ii], ii); } // these must be added after the image-level information this->CopyRecord(meta, &seriesRecord, -1); this->CopyRecord(meta, &studyRecord, -1); this->CopyRecord(meta, &patientRecord, -1); (*this->Studies)[study].LastSeries = series++; this->Series->push_back(SeriesItem()); SeriesItem& item = this->Series->back(); item.Record = seriesRecord; item.Files = files; item.Meta = meta; } //---------------------------------------------------------------------------- void vtkDICOMDirectory::CopyRecord( vtkDICOMMetaData *meta, const vtkDICOMItem *item, int instance) { vtkDICOMDataElementIterator iter = item->Begin(); vtkDICOMDataElementIterator iterEnd = item->End(); vtkDICOMDataElementIterator iter2 = meta->Begin(); vtkDICOMDataElementIterator iter2End = meta->End(); for (; iter != iterEnd; ++iter) { vtkDICOMTag tag = iter->GetTag(); if (tag.GetGroup() == 0x0004) { // DICOMDIR-specific tags if (tag == DC::ReferencedSOPClassUIDInFile) { tag = DC::SOPClassUID; } else if (tag == DC::ReferencedSOPInstanceUIDInFile) { tag = DC::SOPInstanceUID; } else if (tag == DC::ReferencedTransferSyntaxUIDInFile) { tag = DC::TransferSyntaxUID; } else { continue; } } if (instance > 0) { // check for elements that are missing for this instance, // and insert NULL values to indicate their absence if (iter2 != iter2End) { do { vtkDICOMTag tag2 = iter2->GetTag(); if (tag2 > tag) { meta->Set(instance, tag, iter->GetValue()); break; } const vtkDICOMValue &v = iter2->GetValue(instance); ++iter2; if (tag2 == tag) { if (v != iter->GetValue()) { meta->Set(instance, tag, iter->GetValue()); } break; } meta->Set(instance, tag2, vtkDICOMValue()); } while (iter2 != iter2End); } else { meta->Set(instance, tag, iter->GetValue()); } } else { meta->Set(tag, iter->GetValue()); } } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::FillImageRecord( vtkDICOMItem *item, vtkDICOMMetaData *meta, const vtkDICOMTag *skip, size_t nskip) { // Add all elements that aren't already in the other records // (but always add SpecificCharacterSet) const vtkDICOMTag *skipEnd = (skip == 0 ? 0 : skip + nskip); vtkDICOMDataElementIterator iter = meta->Begin(); vtkDICOMDataElementIterator iterEnd = meta->End(); // Group 0x0002 should be skipped if not part of query if (!this->Query || this->Query->Begin() == this->Query->End() || this->Query->Begin()->GetTag().GetGroup() > 0x0002) { while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002) { ++iter; } } // Add all other elements unless marked to be skipped while (iter != iterEnd) { vtkDICOMTag tag = iter->GetTag(); while (skip != skipEnd && *skip < tag) { ++skip; } if (skip == skipEnd || *skip > tag || tag == DC::SpecificCharacterSet) { item->Set(tag, iter->GetValue()); } ++iter; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::FillSeriesRecord( vtkDICOMItem *item, vtkDICOMMetaData *meta) { const DC::EnumType *tag = SeriesTags; while (*tag != DC::ItemDelimitationItem) { item->Set(*tag, meta->Get(*tag)); tag++; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::FillStudyRecord( vtkDICOMItem *item, vtkDICOMMetaData *meta) { const DC::EnumType *tag = StudyTags; while (*tag != DC::ItemDelimitationItem) { item->Set(*tag, meta->Get(*tag)); tag++; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::FillPatientRecord( vtkDICOMItem *item, vtkDICOMMetaData *meta) { const DC::EnumType *tag = PatientTags; while (*tag != DC::ItemDelimitationItem) { item->Set(*tag, meta->Get(*tag)); tag++; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SortFiles(vtkStringArray *input) { vtkSmartPointer meta = vtkSmartPointer::New(); vtkSmartPointer query = vtkSmartPointer::New(); vtkSmartPointer parser = vtkSmartPointer::New(); parser->SetDefaultCharacterSet(this->DefaultCharacterSet); parser->SetOverrideCharacterSet(this->OverrideCharacterSet); parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMDirectory::RelayError); parser->SetMetaData(meta); for (const DC::EnumType *tagPtr = ScanTags; *tagPtr != DC::ItemDelimitationItem; ++tagPtr) { vtkDICOMVR vr = query->FindDictVR(0, *tagPtr); query->Set(*tagPtr, vtkDICOMValue(vr)); } if (this->Query) { // add elements that the user requested for the query vtkDICOMDataElementIterator iter = this->Query->Begin(); vtkDICOMDataElementIterator iterEnd = this->Query->End(); while (iter != iterEnd) { query->Set(iter->GetTag(), iter->GetValue()); ++iter; } // use a buffer size equal to one disk block parser->SetBufferSize(4096); } parser->SetQuery(query); // To hold a list of tags to skip at the image level, because they // will be stored at patient, study, or series level instead SortedTags skip; // List of all series that have been found SeriesInfoList seriesList; // in order of discovery SeriesInfoVector seriesByUID; // sorted by UID vtkIdType numberOfStrings = input->GetNumberOfValues(); for (vtkIdType j = 0; j < numberOfStrings; j++) { const std::string& fileName = input->GetValue(j); // Skip anything that does not look like a DICOM file. if (!vtkDICOMUtilities::IsDICOMFile(fileName.c_str())) { int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In); if (code != 0 && vtkDICOMFilePath(fileName.c_str()).IsSymlink()) { if (code == vtkDICOMFile::AccessDenied) { vtkWarningMacro("Permission denied for link: " << fileName.c_str()); } else { vtkWarningMacro("Broken link: " << fileName.c_str()); } } else if (code == vtkDICOMFile::FileNotFound) { vtkWarningMacro("File does not exist: " << fileName.c_str()); } else if (code == vtkDICOMFile::AccessDenied) { vtkWarningMacro("File permission denied: " << fileName.c_str()); } else if (code == vtkDICOMFile::FileIsDirectory) { vtkWarningMacro("File is a directory: " << fileName.c_str()); } else if (code == vtkDICOMFile::ImpossiblePath) { vtkWarningMacro("Bad file path: " << fileName.c_str()); } else if (code != 0) { vtkWarningMacro("Unknown file error: " << fileName.c_str()); } continue; } // Read the file metadata meta->Initialize(); this->SetInternalFileName(fileName.c_str()); parser->SetFileName(fileName.c_str()); parser->Update(); if (!parser->GetPixelDataFound()) { if (!this->ErrorCode) { this->ErrorCode = parser->GetErrorCode(); } if (this->ErrorCode || this->RequirePixelData) { continue; } } // Check for abort and update progress at 1% intervals if (!this->AbortExecute) { double progress = (j + 1.0)/numberOfStrings; if (progress == 1.0 || progress > this->GetProgress() + 0.01) { progress = static_cast(progress*100.0)/100.0; this->UpdateProgress(progress); } } if (this->AbortExecute) { return; } // Check if the file matches the query bool queryMatched = (!this->Query || parser->GetQueryMatched()); if (!queryMatched && this->FindLevel == vtkDICOMDirectory::IMAGE) { continue; } // Create a FileInfo record and find the series it belongs to FileInfo fileInfo; fileInfo.InstanceNumber = meta->Get(DC::InstanceNumber).AsUnsignedInt(); fileInfo.FileName = fileName.c_str(); // stored in input StringArray fileInfo.ImageUID = meta->Get(DC::SOPInstanceUID); const vtkDICOMValue& studyUIDValue = meta->Get(DC::StudyInstanceUID); const vtkDICOMValue& seriesUIDValue = meta->Get(DC::SeriesInstanceUID); unsigned int seriesNumber = meta->Get(DC::SeriesNumber).AsUnsignedInt(); const char *studyUID = studyUIDValue.GetCharData(); const char *seriesUID = seriesUIDValue.GetCharData(); const char *imageUID = fileInfo.ImageUID.GetCharData(); bool sameFile = false; bool foundSeries = false; // Locate the first potential match SeriesInfoVector::iterator vib = std::lower_bound(seriesByUID.begin(), seriesByUID.end(), seriesUID, CompareSeriesUIDs); // Iterate through all possible matches for (SeriesInfoVector::iterator vi = vib; vi != seriesByUID.end() && vtkDICOMUtilities::CompareUIDs((*vi)->SeriesUID.GetCharData(), seriesUID) == 0; ++vi) { SeriesInfo &v = *(*vi); // For files that lack the mandatory SeriesInstanceUID, // we also check whether SeriesNumber is the same if ((seriesUID == 0 || seriesUID[0] == '\0') && seriesNumber != v.SeriesNumber) { continue; } // Ensure that the StudyInstanceUID also matches if (vtkDICOMUtilities::CompareUIDs(v.StudyUID.GetCharData(), studyUID) != 0) { continue; } // Prepare to insert this file into the series std::vector::iterator im = std::lower_bound(v.FilesByUID.begin(), v.FilesByUID.end(), imageUID, CompareInstanceUIDs); if (im != v.FilesByUID.end()) { // Check if this SOPInstanceUID is a duplicate if (vtkDICOMUtilities::CompareUIDs(imageUID, im->Key) == 0) { // Duplicate UID! Check to see if it is the same file // (SameFile() is expensive, so check InstanceNumber first) FileInfo &f = *im->Info; if (f.InstanceNumber == fileInfo.InstanceNumber && vtkDICOMFile::SameFile(f.FileName, fileInfo.FileName)) { // Let's ignore this file sameFile = true; break; } if (imageUID == 0 || imageUID[0] == '\0') { // If SOPInstanceUID is missing, advance iterator to end // (this is necessary to keep the sort stable) do { ++im; } while (im != v.FilesByUID.end() && vtkDICOMUtilities::CompareUIDs( im->Key, imageUID) == 0); } else { // For duplicate UID, continue to the next series continue; } } } // Insert this image into the series and break v.Files.push_back(fileInfo); FileInfo &f = v.Files.back(); v.FilesByUID.insert(im, FileInfoPair(f.ImageUID.GetCharData(), &f)); this->FillImageRecord(&f.ImageRecord, meta, &skip[0], skip.size()); v.QueryMatched |= queryMatched; foundSeries = true; break; } if (sameFile) { // This same file was already encountered, so skip it continue; } if (!foundSeries) { // Use this image to begin a new series seriesList.push_back(SeriesInfo()); SeriesInfo &v = seriesList.back(); seriesByUID.insert(vib, &v); v.PatientName = meta->Get(DC::PatientName); v.PatientID = meta->Get(DC::PatientID); v.StudyDate = meta->Get(DC::StudyDate); v.StudyTime = meta->Get(DC::StudyTime); v.StudyUID = studyUIDValue; v.SeriesUID = seriesUIDValue; v.SeriesNumber = seriesNumber; v.Files.push_back(fileInfo); FileInfo &f = v.Files.back(); v.FilesByUID.push_back(FileInfoPair(f.ImageUID.GetCharData(), &f)); v.QueryMatched = queryMatched; this->FillPatientRecord(&v.PatientRecord, meta); this->FillStudyRecord(&v.StudyRecord, meta); this->FillSeriesRecord(&v.SeriesRecord, meta); skip.SetFrom(v.PatientRecord, v.StudyRecord, v.SeriesRecord); this->FillImageRecord(&f.ImageRecord, meta, &skip[0], skip.size()); } } // Remove any series that do not match the query seriesByUID.clear(); SeriesInfoList::iterator li = seriesList.begin(); while (li != seriesList.end()) { if (!li->QueryMatched) { SeriesInfoList::iterator ci = li; ++li; seriesList.erase(ci); } else { seriesByUID.push_back(&(*li)); ++li; } } SeriesInfo *lastInfo = 0; // Force consistent PatientName, StudyDate, StudyTime keys for sorting std::sort(seriesByUID.begin(), seriesByUID.end(), CompareSeriesIds); for (SeriesInfoVector::iterator vi = seriesByUID.begin(); vi != seriesByUID.end(); ++vi) { SeriesInfo &v = *(*vi); // Is this a new patient or a new study? if (!lastInfo || v.PatientID != lastInfo->PatientID) { const char *cp = v.PatientName.GetCharData(); size_t l = v.PatientName.GetVL(); if (!cp) { // if PatientName key is missing, use PatientID as replacment cp = v.PatientID.GetCharData(); l = v.PatientID.GetVL(); } if (cp) { // Strip padding space while (l > 0 && cp[l-1] == ' ') { --l; } // Make PatientName key lower-case for case-insensitive sorting vtkDICOMCharacterSet cs = v.PatientName.GetCharacterSet(); v.PatientName = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet::ISO_IR_192, cs.CaseFoldedUTF8(cp, l)); } lastInfo = &v; } else if (v.StudyUID != lastInfo->StudyUID) { v.PatientName = lastInfo->PatientName; lastInfo = &v; } else { v.PatientName = lastInfo->PatientName; v.StudyDate = lastInfo->StudyDate; v.StudyTime = lastInfo->StudyTime; } } // Sort by PatientName, StudyDate, StudyTime, and SeriesNumber seriesList.sort(CompareSeriesInfo); // Visit each series and call AddSeriesFileNames int patientCount = this->GetNumberOfPatients(); int studyCount = this->GetNumberOfStudies(); lastInfo = 0; for (li = seriesList.begin(); li != seriesList.end(); ++li) { SeriesInfo &v = *li; // Is this a new patient or a new study? if (!lastInfo || v.PatientID != lastInfo->PatientID) { patientCount++; studyCount++; lastInfo = &v; } else if (v.StudyUID != lastInfo->StudyUID) { studyCount++; lastInfo = &v; } vtkSmartPointer sa = vtkSmartPointer::New(); vtkIdType n = static_cast(v.Files.size()); sa->SetNumberOfValues(n); std::vector imageRecords(n); li->Files.sort(CompareInstance); std::list::iterator fi = li->Files.begin(); for (vtkIdType i = 0; i < n; i++) { sa->SetValue(i, fi->FileName); imageRecords[i] = &fi->ImageRecord; ++fi; } this->AddSeriesFileNames( patientCount-1, studyCount-1, sa, v.PatientRecord, v.StudyRecord, v.SeriesRecord, &imageRecords[0]); } } //---------------------------------------------------------------------------- #ifdef DICOM_USE_SQLITE namespace { // Trivial structs needed by ProcessOsirixDatabase struct StudyRow { vtkVariant col[12]; }; struct SeriesRow { vtkVariant col[9]; }; struct ImageRow { vtkVariant col[7]; }; // Decompress a SOPInstanceUID from an Osirix database std::string DecompressUID(const std::string& s) { char uid[64]; size_t n = s.length(); size_t m = 0; for (size_t i = 0; i < n && i < 32; i++) { unsigned char c = s[i]; c >>= 4; if (c == 0) { break; } c += ('0' - 1); if (c > '9') { c = '.'; } uid[m++] = c; c = s[i]; c &= 0x0f; if (c == 0) { break; } c += ('0' - 1); if (c > '9') { c = '.'; } uid[m++] = c; } return std::string(uid, m); } // A class to simplify SQLite transaction class SimpleSQL { public: SimpleSQL() : DBase(0), Statement(0), InTransaction(false) {} ~SimpleSQL() { this->Close(); } bool Open(const char *fname); void Close(); bool Prepare(const char *query); bool Next(); vtkVariant GetValue(int column); const char *GetError(); private: void Finalize(); sqlite3 *DBase; sqlite3_stmt *Statement; bool InTransaction; }; bool SimpleSQL::Open(const char *fname) { // convert to URI for use with sqlite3_open() const char uri_reserved[] = " !#$%&'()*+,:;=?@[]"; // first, get absolute path vtkDICOMFilePath path(fname); std::string fullpath = path.GetRealPath(); // build the URI using percent encoding std::string uri = "file://"; for (size_t i = 0; i < fullpath.length(); i++) { bool use_percent = false; char c = fullpath[i]; if (c < ' ' || c > '~') { use_percent = true; } else for (size_t j = 0; j < sizeof(uri_reserved); j++) { if (c == uri_reserved[j]) { use_percent = true; break; } } if (use_percent) { char enc[4]; sprintf(enc, "%%%2.2x", static_cast(c)); uri += enc; } else { uri.push_back(c); } } // we need to use "immutable" or else a read-only open will fail // if the .sql-wal file is missing (and we definitely want to open // the file in read-only mode, we never ever wish to modify the file!) uri += "?mode=ro&immutable=1"; int r = sqlite3_open_v2(uri.c_str(), &this->DBase, SQLITE_OPEN_READONLY|SQLITE_OPEN_URI, 0); if (r == SQLITE_OK) { char *errmsg; r = sqlite3_exec(this->DBase, "BEGIN TRANSACTION", NULL, NULL, &errmsg); this->InTransaction = (r == SQLITE_OK); } return (r == SQLITE_OK); } void SimpleSQL::Close() { this->Finalize(); if (this->InTransaction) { char *errmsg; sqlite3_exec(this->DBase, "COMMIT", NULL, NULL, &errmsg); } sqlite3_close(this->DBase); this->DBase = 0; } bool SimpleSQL::Prepare(const char *query) { if (this->Statement) { sqlite3_finalize(this->Statement); this->Statement = 0; } const char *ep; int l = static_cast(strlen(query)); return (sqlite3_prepare_v2(this->DBase, query, l, &this->Statement, &ep) == SQLITE_OK); } bool SimpleSQL::Next() { int result = sqlite3_step(this->Statement); if (result == SQLITE_ROW) { return true; } this->Finalize(); return false; } vtkVariant SimpleSQL::GetValue(int column) { vtkVariant v; switch (sqlite3_column_type(this->Statement, column)) { case SQLITE_INTEGER: { vtkTypeInt64 x = sqlite3_column_int64(this->Statement, column); v = vtkVariant(x); break; } case SQLITE_FLOAT: { double x = sqlite3_column_double(this->Statement, column); v = vtkVariant(x); break; } case SQLITE_TEXT: { const char *x = reinterpret_cast( sqlite3_column_text(this->Statement, column)); v = vtkVariant(x); break; } case SQLITE_BLOB: { const char *x = static_cast( sqlite3_column_blob(this->Statement, column)); size_t l = sqlite3_column_bytes(this->Statement, column); v = vtkVariant(vtkStdString(x, l)); break; } default: break; } return v; } const char *SimpleSQL::GetError() { return sqlite3_errmsg(this->DBase); } void SimpleSQL::Finalize() { if (this->Statement) { sqlite3_finalize(this->Statement); this->Statement = 0; } } } #endif //---------------------------------------------------------------------------- void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname) { #ifdef DICOM_USE_SQLITE SimpleSQL dbase; // Open the database if (!dbase.Open(fname)) { vtkErrorMacro("File " << fname << ": " << dbase.GetError()); return; } // Create the path to DATABASE.noindex, where .dcm files are stored vtkDICOMFilePath path(fname); path.PopBack(); path.PushBack("DATABASE.noindex"); // Indices to columns in the study table enum { ST_PK, ST_DATE, ST_DATEOFBIRTH, ST_MODALITY, ST_NAME, ST_INSTITUTIONNAME, ST_STUDYNAME, ST_ID, ST_STUDYINSTANCEUID, ST_ACCESSIONNUMBER, ST_PATIENTSEX, ST_PATIENTID, ST_NCOLS }; // Indices to columns in the series table enum { SE_PK, SE_ID, SE_NUMBEROFIMAGES, SE_DATE, SE_SERIESSOPCLASSUID, SE_MODALITY, SE_NAME, SE_SERIESDICOMUID, SE_SERIESDESCRIPTION, SE_NCOLS }; // Indices to columns in the image table enum { IM_INSTANCENUMBER, IM_FRAMEID, IM_PATHNUMBER, IM_PATHSTRING, IM_COMPRESSEDSOPINSTANCEUID, IM_STOREDHEIGHT, IM_STOREDWIDTH, IM_NCOLS }; // These vectors will hold the tables std::vector studyTable; std::vector seriesTable; std::vector imageTable; // Read the study table // (Note that any "*NAME*" is slightly mangled, and ZDATE gives the // date/time of the first acquisition, rather than the study date/time) if (!dbase.Prepare("select Z_PK,ZDATE,ZDATEOFBIRTH,ZMODALITY,ZNAME," "ZINSTITUTIONNAME,ZSTUDYNAME,ZID,ZSTUDYINSTANCEUID," "ZACCESSIONNUMBER,ZPATIENTSEX,ZPATIENTID from ZSTUDY" " order by ZDATE")) { vtkErrorMacro("File " << fname << ": " << dbase.GetError()); return; } while (dbase.Next()) { studyTable.push_back(StudyRow()); StudyRow *row = &studyTable.back(); for (int k = 0; k < ST_NCOLS; k++) { row->col[k] = dbase.GetValue(k); } } // Read the series table // (Note that any "*NAME*" is slightly mangled, and ZDATE gives the // date/time of the first acquisition, rather than the series date/time) if (!dbase.Prepare("select Z_PK,ZID,ZNUMBEROFIMAGES,ZDATE," "ZSERIESSOPCLASSUID,ZMODALITY,ZNAME,ZSERIESDICOMUID," "ZSERIESDESCRIPTION,ZSTUDY from ZSERIES" " order by ZSTUDY,ZID")) { vtkErrorMacro("File " << fname << ": " << dbase.GetError()); return; } std::vector zseriesVec; while (dbase.Next()) { seriesTable.push_back(SeriesRow()); SeriesRow *row = &seriesTable.back(); for (int k = 0; k < SE_NCOLS; k++) { row->col[k] = dbase.GetValue(k); } zseriesVec.push_back(dbase.GetValue(SE_NCOLS).ToTypeInt64()); } // Read the image table // (Note that ZSTOREDHEIGHT, ZSTOREDWIDTH are sometimes NULL) if (!dbase.Prepare("select ZINSTANCENUMBER,ZFRAMEID,ZPATHNUMBER," "ZPATHSTRING,ZCOMPRESSEDSOPINSTANCEUID," "ZSTOREDHEIGHT,ZSTOREDWIDTH,ZSERIES" " from ZIMAGE order by" " ZSERIES,ZINSTANCENUMBER")) { vtkErrorMacro("File " << fname << ": " << dbase.GetError()); return; } std::vector zimageVec; while (dbase.Next()) { imageTable.push_back(ImageRow()); ImageRow *row = &imageTable.back(); for (int k = 0; k < IM_NCOLS; k++) { row->col[k] = dbase.GetValue(k); } zimageVec.push_back(dbase.GetValue(IM_NCOLS).ToTypeInt64()); } // Release the database dbase.Close(); // To track progress, count number of images processed. size_t imageCounter = 0; // Check for abort. if (!this->AbortExecute) { this->UpdateProgress(0.0); } if (this->AbortExecute) { return; } // Go through all of the studies for (std::vector::iterator st = studyTable.begin(); st != studyTable.end(); ++st) { vtkDICOMItem patientItem; vtkDICOMItem studyItem; vtkTypeInt64 zstudy = st->col[ST_PK].ToTypeInt64(); std::string name = st->col[ST_NAME].ToString(); std::string patientID = st->col[ST_PATIENTID].ToString(); double studySeconds = st->col[ST_DATE].ToDouble(); double birthSeconds = st->col[ST_DATEOFBIRTH].ToDouble(); std::string studyDT = ConvertOsirixTime(studySeconds); std::string birthDT = ConvertOsirixTime(birthSeconds); patientItem.Set( DC::SpecificCharacterSet, vtkDICOMCharacterSet::ISO_IR_192); patientItem.Set(DC::PatientName, name); patientItem.Set(DC::PatientID, patientID); if (birthSeconds == 0) { patientItem.Set(DC::PatientBirthDate, ""); } else { patientItem.Set(DC::PatientBirthDate, birthDT.substr(0, 8)); } patientItem.Set( DC::PatientSex, st->col[ST_PATIENTSEX].ToString()); studyItem.Set( DC::SpecificCharacterSet, vtkDICOMCharacterSet::ISO_IR_192); std::string studyName = st->col[ST_STUDYNAME].ToString(); if (studyName != "Localizers") { studyItem.Set(DC::StudyDescription, studyName); } studyItem.Set( DC::StudyID, st->col[ST_ID].ToString()); studyItem.Set( DC::StudyInstanceUID, st->col[ST_STUDYINSTANCEUID].ToString()); studyItem.Set( DC::InstitutionName, st->col[ST_INSTITUTIONNAME].ToString()); studyItem.Set( DC::AccessionNumber, st->col[ST_ACCESSIONNUMBER].ToString()); studyItem.Set(DC::StudyDate, studyDT.substr(0,8)); studyItem.Set(DC::StudyTime, studyDT.substr(8,13)); int studyIdx = this->GetNumberOfStudies(); int patientIdx; int firstUnusedPatientIdx = this->GetNumberOfPatients(); // Loop until corrent patientIdx is found for (patientIdx = 0; patientIdx < firstUnusedPatientIdx; patientIdx++) { const vtkDICOMItem& pitem = this->GetPatientRecord(patientIdx); const vtkDICOMValue& vid = pitem.Get(DC::PatientID); if (vid.IsValid() && vid.GetVL() > 0) { if (patientID.length() > 0 && vid.Matches(patientID.c_str())) { break; } } else // Use PatientName if PatientID is empty { const vtkDICOMValue& vna = pitem.Get(DC::PatientName); if (vna.IsValid() && vna.GetVL() > 0) { if (name.length() > 0 && vna.Matches(name.c_str())) { break; } } } } // Search for the first series in the study std::vector::iterator zseriesVecIter = std::lower_bound(zseriesVec.begin(), zseriesVec.end(), zstudy); size_t seIdx = std::distance(zseriesVec.begin(), zseriesVecIter); // Go through all of the series in the study for (std::vector::iterator se = seriesTable.begin() + seIdx; se != seriesTable.end(); ++se) { // Break when we find a series that isn't part of the study if (*zseriesVecIter > zstudy) { break; } ++zseriesVecIter; if (this->RequirePixelData && se->col[SE_NUMBEROFIMAGES].ToTypeInt64() == 0) { // If no images, but pixel data is required, then skip continue; } vtkDICOMItem seriesItem; vtkTypeInt64 zseries = se->col[SE_PK].ToTypeInt64(); double seriesSeconds = se->col[SE_DATE].ToDouble(); std::string seriesDT = ConvertOsirixTime(seriesSeconds); vtkDICOMValue sopClassUID( vtkDICOMVR::UI, se->col[SE_SERIESSOPCLASSUID].ToString()); std::string seriesUID = se->col[SE_SERIESDICOMUID].ToString(); // Remove any text before the UID size_t k = 0; while (k < seriesUID.length() && (seriesUID[k] <= '0' || seriesUID[k] >= '9')) { k++; } if (k > 0) { seriesUID = seriesUID.substr(k, seriesUID.length()-k); } seriesItem.Set( DC::SpecificCharacterSet, vtkDICOMCharacterSet::ISO_IR_192); seriesItem.Set( DC::SeriesDescription, se->col[SE_NAME].ToString()); seriesItem.Set( DC::ProtocolName, se->col[SE_SERIESDESCRIPTION].ToString()); seriesItem.Set(DC::SeriesNumber, se->col[SE_ID].ToString()); seriesItem.Set(DC::SeriesInstanceUID, seriesUID); seriesItem.Set(DC::SeriesDate, seriesDT.substr(0,8)); seriesItem.Set(DC::SeriesTime, seriesDT.substr(8,13)); seriesItem.Set(DC::Modality, se->col[SE_MODALITY].ToString()); vtkSmartPointer fileNames = vtkSmartPointer::New(); vtkDICOMSequence imageRecordSequence; std::string lastpath; // Search for the first image in the series std::vector::iterator zimageVecIter = std::lower_bound(zimageVec.begin(), zimageVec.end(), zseries); size_t imIdx = std::distance(zimageVec.begin(), zimageVecIter); // Go through all of the images in the series for (std::vector::iterator im = imageTable.begin() + imIdx; im != imageTable.end(); ++im) { // Break when we find a series that isn't part of the study if (*zimageVecIter > zseries) { break; } ++zimageVecIter; std::string fpath = im->col[IM_PATHSTRING].ToString(); if (fpath.length() == 0) { // no PATHSTRING, so use PATHNUMBER instead vtkTypeInt64 fnum = im->col[IM_PATHNUMBER].ToTypeInt64(); vtkTypeInt64 dnum = (fnum/10000 + 1)*10000; vtkVariant fv(fnum); vtkVariant dv(dnum); path.PushBack(dv.ToString()); path.PushBack(fv.ToString() + ".dcm"); fpath = path.AsString(); path.PopBack(); path.PopBack(); } else if (fpath[0] != '/') { // PATHSTRING is a local path, not an absolute path vtkTypeInt64 fnum = atol(fpath.c_str()); vtkTypeInt64 dnum = (fnum/10000 + 1)*10000; vtkVariant dv(dnum); path.PushBack(dv.ToString()); path.PushBack(fpath); fpath = path.AsString(); path.PopBack(); path.PopBack(); } if (fpath != lastpath) { // Add the path to the list of filenames vtkDICOMItem imageRecord; imageRecord.Set(DC::SOPClassUID, sopClassUID); imageRecord.Set(DC::SOPInstanceUID, DecompressUID(im->col[IM_COMPRESSEDSOPINSTANCEUID].ToString())); imageRecord.Set(DC::InstanceNumber, im->col[IM_INSTANCENUMBER].ToString()); int rows = im->col[IM_STOREDHEIGHT].ToInt(); if (rows) { imageRecord.Set(DC::Rows, rows); } int cols = im->col[IM_STOREDWIDTH].ToInt(); if (cols) { imageRecord.Set(DC::Columns, cols); } imageRecordSequence.AddItem(imageRecord); fileNames->InsertNextValue(fpath); lastpath = fpath; } // Increment the progress counter. imageCounter++; } // Add the series if it passes the query size_t n = imageRecordSequence.GetNumberOfItems(); if (n > 0) { const vtkDICOMItem *data = imageRecordSequence.GetSequenceData(); std::vector imageRecords(n); for (size_t i = 0; i < n; i++) { imageRecords[i] = &data[i]; } // Set a flag to indicate that loose matching is needed, because // the Osirix database "cleans" certain attribute value strings this->UsingOsirixDatabase = true; this->AddSeriesWithQuery( patientIdx, studyIdx, fileNames, patientItem, studyItem, seriesItem, &imageRecords[0]); this->UsingOsirixDatabase = false; } // Check for abort and update progress at 1% intervals if (!this->AbortExecute) { double progress = (imageCounter + 1.0)/imageTable.size(); if (progress == 1.0 || progress > this->GetProgress() + 0.01) { progress = static_cast(progress*100.0)/100.0; this->UpdateProgress(progress); } } if (this->AbortExecute) { return; } } } #else vtkErrorMacro("File " << fname << ": " << "sqlite was not enabled in the build"); #endif } //---------------------------------------------------------------------------- void vtkDICOMDirectory::ProcessDirectoryFile( const char *dirname, vtkDICOMMetaData *meta) { // Get the ID of this file set (informative only). if (meta->Has(DC::FileSetID)) { std::string fileSetID = meta->Get(DC::FileSetID).AsString(); this->FileSetID = new char[fileSetID.length() + 1]; strcpy(this->FileSetID, fileSetID.c_str()); } // Get the directory as a sequence. const vtkDICOMValue& seq = meta->Get(DC::DirectoryRecordSequence); unsigned int n = static_cast(seq.GetNumberOfValues()); const vtkDICOMItem *items = seq.GetSequenceData(); // The DICOMDIR uses byte offsets to identify items in the sequence. std::map offsetToIndexMap; for (unsigned int i = 0; i < n; i++) { offsetToIndexMap[items[i].GetByteOffset()] = i; } // Get the first entry. unsigned int offset = meta->Get(DC::OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity) .AsUnsignedInt(); // This check is just for insurance. if (offset == 0 && n > 0) { offset = items[0].GetByteOffset(); } // To track progress, count number of items processed. unsigned int itemCounter = 0; // Check for abort. if (!this->AbortExecute) { this->UpdateProgress(0.0); } if (this->AbortExecute) { return; } // A stack to track the directory level. std::vector > offsetStack; int patientIdx = this->GetNumberOfPatients(); int studyIdx = this->GetNumberOfStudies(); unsigned int patientItem = 0; unsigned int studyItem = 0; unsigned int seriesItem = 0; // List of filenames for the current series. vtkSmartPointer fileNames = vtkSmartPointer::New(); std::vector imageRecords; // The entry type that is currently being processed. std::string entryType; // Go through the directory, using the "next" and "child" pointers. while (offset != 0) { unsigned int offsetOfChild = 0; std::map::iterator iter = offsetToIndexMap.find(offset); offset = 0; if (iter != offsetToIndexMap.end() && iter->second != 0xffffffffu) { // Get the item index, mark the item as used. unsigned int j = iter->second; iter->second = 0xffffffffu; offset = items[j].Get( DC::OffsetOfTheNextDirectoryRecord).AsUnsignedInt(); offsetOfChild = items[j].Get( DC::OffsetOfReferencedLowerLevelDirectoryEntity).AsUnsignedInt(); entryType = items[j].Get( DC::DirectoryRecordType).AsString(); if (entryType == "PATIENT") { patientItem = j; } else if (entryType == "STUDY") { studyItem = j; } else if (entryType == "SERIES") { seriesItem = j; } else if (entryType == "IMAGE" || !this->RequirePixelData) { const vtkDICOMValue& fileID = items[j].Get(DC::ReferencedFileID); if (fileID.IsValid()) { size_t m = fileID.GetNumberOfValues(); if (m > 0) { vtkDICOMFilePath path(dirname); for (size_t k = 0; k < m; k++) { path.PushBack(fileID.GetString(k)); } vtkIdType ki = fileNames->InsertNextValue(path.AsString()); imageRecords.push_back(&items[j]); // sort the files by instance number, they will almost always // already be in order so we use a simple algorithm int inst = items[j].Get(DC::InstanceNumber).AsInt(); while (ki > 0) { const vtkDICOMItem *prev = imageRecords[--ki]; int inst2 = prev->Get(DC::InstanceNumber).AsInt(); if (inst < inst2) { std::string s = fileNames->GetValue(ki + 1); fileNames->SetValue(ki + 1, fileNames->GetValue(ki)); fileNames->SetValue(ki, s); std::swap(imageRecords[ki], imageRecords[ki + 1]); } else { // sorting is finished! break; } } } } } } if (offsetOfChild != 0) { // Go up one directory level. offsetStack.push_back(std::make_pair(offset, entryType)); offset = offsetOfChild; } else { // Pop the stack until the next offset is not zero. while (offset == 0 && offsetStack.size() > 0) { // Go down one directory level. offset = offsetStack.back().first; entryType = offsetStack.back().second; offsetStack.pop_back(); if (entryType == "PATIENT") { // Get current max patient index plus one patientIdx = this->GetNumberOfPatients(); } else if (entryType == "STUDY") { // Get current max study index plus one studyIdx = this->GetNumberOfStudies(); } else if (entryType == "SERIES") { if (!imageRecords.empty()) { // Add the series if it passes the query this->AddSeriesWithQuery( patientIdx, studyIdx, fileNames, items[patientItem], items[studyItem], items[seriesItem], &imageRecords[0]); fileNames = vtkSmartPointer::New(); imageRecords.clear(); } } } } // Check for abort and update progress at 1% intervals if (!this->AbortExecute) { double progress = (itemCounter + 1.0)/n; if (progress == 1.0 || progress > this->GetProgress() + 0.01) { progress = static_cast(progress*100.0)/100.0; this->UpdateProgress(progress); } } if (this->AbortExecute) { return; } ++itemCounter; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::ProcessDirectory( const char *dirname, int depth, vtkStringArray *files) { // Check if the directory has been visited yet. This avoids infinite // recursion when following circular links. std::string realname = vtkDICOMFilePath(dirname).GetRealPath(); std::vector::iterator viter = std::lower_bound(this->Visited->begin(), this->Visited->end(), realname); if (viter == this->Visited->end() || *viter != realname) { // Add this directory to the "visited" list. this->Visited->insert(viter, realname); } else { // This directory has already been visited. return; } // Find the path to the directory. vtkDICOMFilePath path(dirname); if (depth == this->ScanDepth && !this->IgnoreDicomdir) { // Build the path to the DICOMDIR file. path.PushBack("DICOMDIR"); std::string dicomdir = path.AsString(); path.PopBack(); // Check to see if the DICOMDIR file exists. if (vtkDICOMFile::Access(dicomdir.c_str(), vtkDICOMFile::In) == 0) { vtkSmartPointer meta = vtkSmartPointer::New(); vtkDICOMParser *parser = vtkDICOMParser::New(); parser->SetDefaultCharacterSet(this->DefaultCharacterSet); parser->SetOverrideCharacterSet(this->OverrideCharacterSet); parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMDirectory::RelayError); parser->SetMetaData(meta); this->SetInternalFileName(dicomdir.c_str()); parser->SetFileName(dicomdir.c_str()); parser->Update(); unsigned long errorCode = parser->GetErrorCode(); parser->Delete(); if (errorCode && depth == 0) { // Only fail if depth is zero. Otherwise, we can ignore the // DICOMDIR and look for the DICOM files directly. this->ErrorCode = errorCode; return; } else if (errorCode == 0) { // Process the DICOMDIR file. this->ProcessDirectoryFile(dirname, meta); return; } } } // If depth is zero, recursion is complete. if (depth <= 0) { return; } // Check for abort. if (!this->AbortExecute) { this->UpdateProgress(0.0); } if (this->AbortExecute) { return; } vtkDICOMFileDirectory d(dirname); if (d.GetError() != 0) { // Only fail at the initial depth. if (depth == this->ScanDepth) { vtkErrorMacro(<< "Could not read directory " << dirname); this->ErrorCode = vtkErrorCode::CannotOpenFileError; return; } } int n = d.GetNumberOfEntries(); for (int i = 0; i < n; i++) { const char *fname = d.GetEntry(i); if ((fname[0] != '.' || (fname[1] != '\0' && (fname[1] != '.' || fname[2] != '\0'))) && strcmp(fname, "DICOMDIR") != 0) { path.PushBack(fname); std::string fileString = path.AsString(); path.PopBack(); if (d.IsSymlink(i) && !this->FollowSymlinks) { // Do nothing unless FollowSymlinks is On } #ifdef _WIN32 else if (!this->ShowHidden && d.IsHidden(i)) #else else if (!this->ShowHidden && (d.IsHidden(i) || fname[0] == '.')) #endif { // Do nothing for hidden files unless ShowHidden is On // (on Linux and OS X, consider "." files to be hidden) } else if (d.IsDirectory(i)) { if (depth > 1) { this->ProcessDirectory(fileString.c_str(), depth-1, files); } } else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' || vtkDICOMUtilities::PatternMatches( this->FilePattern, fileString.c_str())) { if (!d.IsSpecial(i) && !d.IsBroken(i)) { files->InsertNextValue(fileString); } } } } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::Execute() { // Clear the output this->Series->clear(); this->Studies->clear(); this->Patients->clear(); this->Visited->clear(); delete [] this->FileSetID; this->FileSetID = 0; this->ErrorCode = 0; this->InvokeEvent(vtkCommand::StartEvent); vtkSmartPointer files = vtkSmartPointer::New(); if (this->InputFileNames) { for (vtkIdType i = 0; i < this->InputFileNames->GetNumberOfValues(); i++) { const std::string& fname = this->InputFileNames->GetValue(i); int code = vtkDICOMFile::Access(fname.c_str(), vtkDICOMFile::In); if (code == vtkDICOMFile::FileIsDirectory) { this->ProcessDirectory(fname.c_str(), this->ScanDepth, files); } else if (code != 0 && vtkDICOMFilePath(fname.c_str()).IsSymlink()) { if (code == vtkDICOMFile::AccessDenied) { vtkWarningMacro("Permission denied for link: " << fname.c_str()); } else { vtkWarningMacro("Broken link: " << fname.c_str()); } } else if (code == vtkDICOMFile::FileNotFound) { this->ErrorCode = vtkErrorCode::FileNotFoundError; vtkErrorMacro("File or directory not found: " << fname.c_str()); return; } else if (code == vtkDICOMFile::AccessDenied) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Permission denied: " << fname.c_str()); return; } else if (code == vtkDICOMFile::ImpossiblePath) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Bad file path: " << fname.c_str()); return; } else if (code != 0) { this->ErrorCode = vtkErrorCode::UnknownError; vtkErrorMacro("Unknown file error: " << fname.c_str()); return; } else if (vtkDICOMUtilities::PatternMatches("*.sql", fname.c_str())) { this->ProcessOsirixDatabase(fname.c_str()); } else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' || vtkDICOMUtilities::PatternMatches( this->FilePattern, fname.c_str())) { files->InsertNextValue(fname); } } } else { if (this->DirectoryName == 0) { // No directory is a valid input. Return an empty output. return; } int code = vtkDICOMFile::Access(this->DirectoryName, vtkDICOMFile::In); if (code == vtkDICOMFile::FileIsDirectory) { this->ProcessDirectory(this->DirectoryName, this->ScanDepth, files); } else if (code == vtkDICOMFile::FileNotFound) { this->ErrorCode = vtkErrorCode::FileNotFoundError; vtkErrorMacro("Directory not found: " << this->DirectoryName); return; } else if (code == vtkDICOMFile::AccessDenied) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Permission denied: " << this->DirectoryName); return; } else if (code == vtkDICOMFile::ImpossiblePath) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Bad file path: " << this->DirectoryName); return; } else if (code != 0) { this->ErrorCode = vtkErrorCode::UnknownError; vtkErrorMacro("Unknown error: " << this->DirectoryName); return; } else { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Found a file, not a directory: " << this->DirectoryName); return; } } // Check for abort. if (!this->AbortExecute) { this->UpdateProgress(0.0); } if (this->AbortExecute) { return; } if (files->GetNumberOfValues() > 0) { this->SortFiles(files); } this->InvokeEvent(vtkCommand::EndEvent); } //---------------------------------------------------------------------------- void vtkDICOMDirectory::Update(int) { this->AbortExecute = 0; if (this->GetMTime() > this->UpdateTime.GetMTime()) { this->Execute(); this->UpdateTime.Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::SetInternalFileName(const char *name) { if (this->InternalFileName == NULL && name == NULL) { return; } if (this->InternalFileName != 0 && name != 0 && strcmp(this->InternalFileName, name) == 0) { return; } if (this->InternalFileName) { delete [] this->InternalFileName; } if (name) { size_t n = strlen(name) + 1; char *cp1 = new char[n]; const char *cp2 = (name); this->InternalFileName = cp1; do { *cp1++ = *cp2++; } while (--n); } else { this->InternalFileName = 0; } } //---------------------------------------------------------------------------- void vtkDICOMDirectory::RelayError(vtkObject *o, unsigned long e, void *data) { if (e == vtkCommand::ErrorEvent) { vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); if (parser) { this->SetErrorCode(parser->GetErrorCode()); this->SetInternalFileName(parser->GetFileName()); if (this->CurrentPatientRecord && this->CurrentStudyRecord && this->CurrentSeriesRecord && this->CurrentImageRecord) { std::stringstream msg; // print some useful information about the file msg << "RelayError: For this entry:\n"; msg << "StudyInstanceUID=\"" << this->CurrentStudyRecord->Get(DC::StudyInstanceUID).AsString(); msg << "\",\nSeriesInstanceUID=\"" << this->CurrentSeriesRecord->Get(DC::SeriesInstanceUID).AsString(); msg << "\",\nPatientID=\"" << this->CurrentPatientRecord->Get(DC::PatientID).AsString(); msg << "\", StudyDate=\"" << this->CurrentStudyRecord->Get(DC::StudyDate).AsString(); msg << "\", StudyTime=\"" << this->CurrentStudyRecord->Get(DC::StudyTime).AsString(); msg << "\",\nStudyID=\"" << this->CurrentStudyRecord->Get(DC::StudyID).AsString(); msg << "\", SeriesNumber=\"" << this->CurrentSeriesRecord->Get(DC::SeriesNumber).AsString(); msg << "\", InstanceNumber=\"" << this->CurrentImageRecord->Get(DC::InstanceNumber).AsString(); msg << "\"\n"; // strip whitespace from the vtkDICOMParser message const char *cp = static_cast(data); size_t l; for (l = strlen(cp); l > 0; --l) { if (cp[l-1] != '\n' && cp[l-1] != '\r' && cp[l-1] != ' ') { break; } } msg.write(cp, l); vtkErrorMacro(<< msg.str()); return; } } vtkErrorMacro(<< static_cast(data)); } else { this->InvokeEvent(e, data); } } vtk-dicom-0.8.12/Source/vtkDICOMDirectory.h000066400000000000000000000353401356440565500203770ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMDirectory_h #define vtkDICOMDirectory_h #include "vtkAlgorithm.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMCharacterSet.h" // For character sets #include "vtkVersion.h" // For changes to pipeline API class vtkStringArray; class vtkIntArray; class vtkDICOMMetaData; class vtkDICOMItem; class vtkDICOMTag; //! Get information about all DICOM files within a directory. /*! * Given a directory, search for a DICOMDIR file, and if no DICOMDIR is * found, directly search for DICOM files within the directory. Provide * a list of DICOM file names as output, sorted by patient, study, series, * and image. */ class VTKDICOM_EXPORT vtkDICOMDirectory : public vtkAlgorithm { public: vtkTypeMacro(vtkDICOMDirectory,vtkAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; static vtkDICOMDirectory *New(); //! Levels within the DICOM information model. enum { PATIENT, STUDY, SERIES, IMAGE, FRAME }; //@{ //! Set the input directory. /*! * If the directory has a DICOMDIR file, then that file will be scanned * to get information about the DICOM files in the directory. Otherwise, * the directory will be scanned for DICOM files. The depth of the * scan (how many subdirectories deep) can be controlled with the * SetScanDepth() method. */ void SetDirectoryName(const char *name); const char *GetDirectoryName() { return this->DirectoryName; } //@} //@{ //! Set a list of filenames (or files and directories) to read. /*! * This can be used as alternative to setting a single input directory. */ void SetInputFileNames(vtkStringArray *sa); vtkStringArray *GetInputFileNames() { return this->InputFileNames; } //! Add more filenames to be read. /*! * This allows the directory to be updated. The new files can belong to * an existing series or a new series. If any of the new files are * already present in the directory, then nothing will be done for those * files. */ void AddInputFileNames(vtkStringArray *sa); //@} //@{ //! Set a pattern to match for the filenames. /*! * For example "*.dcm" will match files ending with ".dcm". The two * wildcards that are supported are "*" and "?". */ void SetFilePattern(const char *pattern); const char *GetFilePattern() { return this->FilePattern; } //@} //@{ //! Set the scan depth to use when no DICOMDIR is found. /*! * The default scan depth is 1, which scans only the given directory * and no subdirectories. A scan depth of zero means that the directory * will not be scanned unless it contains a DICOMDIR file. */ vtkSetMacro(ScanDepth, int); int GetScanDepth() { return this->ScanDepth; } //@} //@{ //! Specify a find query. void SetFindQuery(const vtkDICOMItem& query); //@} //@{ //! Specify the find level. /*! * If this is Series, then the whole series will be found if a single * file in the series matches the query. Only IMAGE and SERIES are * allowed. Note that IMAGE is inclusive of any single file, whether * or not the contained data is an image. */ void SetFindLevel(int level); void SetFindLevelToImage() { this->SetFindLevel(IMAGE); } void SetFindLevelToSeries() { this->SetFindLevel(SERIES); } int GetFindLevel() { return this->FindLevel; } //@} //@{ //! Update the information about the files. /*! * This method causes the directory to be read. It must be called before * any of the Get methods. */ void Update() VTK_DICOM_OVERRIDE { this->Update(0); } void Update(int) VTK_DICOM_OVERRIDE; #if (VTK_MAJOR_VERSION == 7 && VTK_MINOR_VERSION > 0) || VTK_MAJOR_VERSION > 7 vtkTypeBool Update(vtkInformation *) VTK_DICOM_OVERRIDE { this->Update(); return 1; } vtkTypeBool Update(int i, vtkInformationVector *) VTK_DICOM_OVERRIDE { this->Update(i); return 1; } #endif //@} //@{ //! Get the total number of series that were found. int GetNumberOfSeries(); //! Get the directory attributes for a series. const vtkDICOMItem& GetSeriesRecord(int series); //! Get the number of studies that were found. int GetNumberOfStudies(); //! Get the directory attributes for a study. const vtkDICOMItem& GetStudyRecord(int study); //! Get the patient-related attributes for a specific study. /*! * This returns a patient record, the same as GetPatientRecord(), * except that it returns the patient information as recorded * at the time of the study. */ const vtkDICOMItem& GetPatientRecordForStudy(int study); //! Get the number of patients that were found. int GetNumberOfPatients(); //! Get the directory attributes for a patient. const vtkDICOMItem& GetPatientRecord(int patient); //! Get the studies for this patient. vtkIntArray *GetStudiesForPatient(int patient); //@} //@{ //! Get the first series in a particular study. int GetFirstSeriesForStudy(int study); //! Get the last series in a particular study. int GetLastSeriesForStudy(int study); //! Get the file names for a specific series. vtkStringArray *GetFileNamesForSeries(int i); //! Get the meta data for a specific series. /*! * This provides a subset of the meta data of each file in the series. * To be specific, it contains all the information from the patient, * study, and, at the very minimum, the SOPClassUID, SOPInstanceUID, * and InstanceNumber for each file. */ vtkDICOMMetaData *GetMetaDataForSeries(int i); //@} //! Set when to query the files, rather than just the DICOMDIR index. /*! * If a DICOMDIR file is present, the default behavior is to only * query the other files in the directory if the Query contains * elements that cannot be elucidated from the DICOMDIR file. * For Always, the data returned by GetMetaDataForSeries() will * always be data from the file, not the DICOMDIR (though the * data returned by GetSeriesRecord() etc. will be from DICOMDIR). * For Never, the files will never be scanned if a DICOMDIR is * present, which means that any Query that is applied can only * check attributes that are present in the DICOMDIR. */ void SetQueryFilesToAlways() { this->SetQueryFiles(1); } void SetQueryFilesToNever() { this->SetQueryFiles(0); } void SetQueryFilesToDefault() { this->SetQueryFiles(-1); } vtkSetMacro(QueryFiles, int); int GetQueryFiles() { return this->QueryFiles; } //@{ //! Get the file set ID. This will be NULL unless a DICOMDIR was found. const char *GetFileSetID() { return this->FileSetID; } //@} //@{ //! Get the filename associated with the error code. const char *GetInternalFileName() { return this->InternalFileName; } //@} //@{ //! If On, the DICOMDIR file will be ignored. /*! * This method can be used to ignore the DICOMDIR file if it is present, * instead of using the DICOMDIR file as an index. */ vtkSetMacro(IgnoreDicomdir, int); vtkBooleanMacro(IgnoreDicomdir, int); int GetIgnoreDicomdir() { return this->IgnoreDicomdir; } //@} //@{ //! If this is On, files with no pixel data will be skipped. /*! * This is On by default. Some files, such as dicom directory files, * have metadata but have no images. Usually we want to skip these. */ vtkSetMacro(RequirePixelData, int); vtkBooleanMacro(RequirePixelData, int); int GetRequirePixelData() { return this->RequirePixelData; } //@} //@{ //! If On (the default), symbolic links will be followed. vtkSetMacro(FollowSymlinks, int); vtkBooleanMacro(FollowSymlinks, int); int GetFollowSymlinks() { return this->FollowSymlinks; } //@} //@{ //! If On (the default), hidden files will be listed. /*! * A file is hidden if it has a "hidden" attribute set. On Linux and * OS X, any file that begins with "." will also be considered "hidden". */ vtkSetMacro(ShowHidden, int); vtkBooleanMacro(ShowHidden, int); int GetShowHidden() { return this->ShowHidden; } //@} //@{ //! Set the character set to use if SpecificCharacterSet is missing. /*! * Some DICOM files do not list a SpecificCharacterSet attribute, but * nevertheless use a non-ASCII character encoding. This method can be * used to specify the character set in absence of SpecificCharacterSet. * If SpecificCharacterSet is present, the default will not override it * unless OverrideCharacterSet is true. */ void SetDefaultCharacterSet(vtkDICOMCharacterSet cs); vtkDICOMCharacterSet GetDefaultCharacterSet() { return this->DefaultCharacterSet; } //! Override the value stored in SpecificCharacterSet. /*! * This method can be used if the SpecificCharacterSet attribute of a * file is incorrect. It overrides the SpecificCharacterSet with the * DefaultCharacterSet. */ vtkSetMacro(OverrideCharacterSet, bool); vtkBooleanMacro(OverrideCharacterSet, bool); bool GetOverrideCharacterSet() { return this->OverrideCharacterSet; } //@} protected: vtkDICOMDirectory(); ~vtkDICOMDirectory(); const char *DirectoryName; vtkStringArray *InputFileNames; const char *FilePattern; int QueryFiles; int IgnoreDicomdir; int RequirePixelData; int FollowSymlinks; int ShowHidden; int ScanDepth; vtkDICOMCharacterSet DefaultCharacterSet; bool OverrideCharacterSet; vtkTimeStamp UpdateTime; char *InternalFileName; //! Fill the output filename array. virtual void Execute(); //! Fill image info from image metadata. virtual void FillImageRecord(vtkDICOMItem *item, vtkDICOMMetaData *meta, const vtkDICOMTag *skip, size_t nskip); //! Fill series info from image metadata. virtual void FillSeriesRecord(vtkDICOMItem *item, vtkDICOMMetaData *meta); //! Fill study info from image metadata. virtual void FillStudyRecord(vtkDICOMItem *item, vtkDICOMMetaData *meta); //! Fill patient info from image metadata. virtual void FillPatientRecord(vtkDICOMItem *item, vtkDICOMMetaData *meta); //! Sort the input string array virtual void SortFiles(vtkStringArray *input); //! Add a sorted series to output. /*! * This method is called from SortFiles to provide the files * that make up one series. The study that the files belong * to must also be provided, as a number that starts at zero * and monotonically increases. */ void AddSeriesFileNames( int patient, int study, vtkStringArray *files, const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord, const vtkDICOMItem *imageRecords[]); //! Add files only if they match the query. void AddSeriesWithQuery( int patient, int study, vtkStringArray *files, const vtkDICOMItem& patientRecord, const vtkDICOMItem& studyRecord, const vtkDICOMItem& seriesRecord, const vtkDICOMItem *imageRecords[]); //! Returns false if the record doesn't match the query. /*! * Matching values are placed into the result parameter. */ bool MatchesQuery( const vtkDICOMItem& record, vtkDICOMItem& result); //! Perform query on image record, given results from previous levels. /*! * This method requires that MatchesQuery() was already called on the * patient, study, and series records. It has three possible return * values. If all remaining query attributes were matched by the image * record, then 0 is returned. If any of the remaining query attributes * mis-matches with the image record, then -1 is returned. If the query * contains tags that weren't in the patient, study, series, or image * record, then 1 is returned to indicate that the match is inconclusive. */ int MatchesImageQuery( const vtkDICOMItem& record, const vtkDICOMItem& result); //! Convert parser errors into sorter errors. void RelayError(vtkObject *o, unsigned long e, void *data); //! Set the name of the file currently being operated on. void SetInternalFileName(const char *fname); //! Set the error code. void SetErrorCode(unsigned long e) VTK_DICOM_OVERRIDE { this->ErrorCode = e; } //! Add all of the series listed in a DICOMDIR file. /*! * The provided directory should be the directory that contains * the DICOMDIR file, rather than the DICOMDIR file itself. The * DICOMDIR file should be parsed before this method is called. */ void ProcessDirectoryFile(const char *dirname, vtkDICOMMetaData *meta); //! Process a directory, and subdirs to the specified depth. void ProcessDirectory( const char *dirname, int depth, vtkStringArray *files); //! Process an OsiriX sqlite database file. void ProcessOsirixDatabase(const char *fname); //! Copy attributes into a meta data object. void CopyRecord( vtkDICOMMetaData *meta, const vtkDICOMItem *item, int instance); private: #ifdef VTK_DICOM_DELETE vtkDICOMDirectory(const vtkDICOMDirectory&) VTK_DICOM_DELETE; void operator=(const vtkDICOMDirectory&) VTK_DICOM_DELETE; #else vtkDICOMDirectory(const vtkDICOMDirectory&) = delete; void operator=(const vtkDICOMDirectory&) = delete; #endif struct SeriesItem; struct StudyItem; struct PatientItem; class SeriesVector; class StudyVector; class PatientVector; struct FileInfo; struct FileInfoPair; struct SeriesInfo; class SeriesInfoList; class SeriesInfoVector; class VisitedVector; vtkDICOMItem *Query; int FindLevel; SeriesVector *Series; StudyVector *Studies; PatientVector *Patients; VisitedVector *Visited; char *FileSetID; bool UsingOsirixDatabase; const vtkDICOMItem *CurrentPatientRecord; const vtkDICOMItem *CurrentStudyRecord; const vtkDICOMItem *CurrentSeriesRecord; const vtkDICOMItem *CurrentImageRecord; //! Compare FileInfo entries by instance number static bool CompareInstance(const FileInfo &fi1, const FileInfo &fi2); //! Compare SeriesInfo entries by SeriesUID static bool CompareSeriesUIDs(const SeriesInfo *si, const char *uid); //! Compare SeriesInfo entries by PatientID, StudyUID, and SeriesUID static bool CompareSeriesIds(const SeriesInfo *li1, const SeriesInfo *li2); //! Compare SeriesInfo entries by PatientName, StudyDate, and SeriesNumber static bool CompareSeriesInfo(const SeriesInfo &li1, const SeriesInfo &li2); //! Compare SOPInstanceUID to a FileInfo entry. static bool CompareInstanceUIDs(const FileInfoPair& p, const char *uid); }; #endif vtk-dicom-0.8.12/Source/vtkDICOMFile.cxx000066400000000000000000000314061356440565500176640ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMFile.h" #include "vtkDICOMFilePath.h" #if defined(VTK_DICOM_POSIX_IO) #include #include #include #include #include #elif defined(VTK_DICOM_WIN32_IO) #include #else #ifdef _WIN32 #include #include #define _unlink unlink #else #include #endif #include #include #endif #include //---------------------------------------------------------------------------- vtkDICOMFile::vtkDICOMFile(const char *filename, Mode mode) { #if defined(VTK_DICOM_POSIX_IO) this->Handle = -1; this->Error = 0; this->Eof = false; if (mode == In) { this->Handle = open(filename, O_RDONLY); } else if (mode == Out) { this->Handle = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 000666); } if (this->Handle == -1) { int errorCode = errno; if (errorCode == EACCES) { this->Error = AccessDenied; } else if (errorCode == EISDIR) { this->Error = FileIsDirectory; } else if (errorCode == ENOTDIR) { this->Error = (mode == Out ? ImpossiblePath : FileNotFound); } else if (errorCode == ENOENT) { this->Error = FileNotFound; } else if (errorCode == ENOSPC) { // some systems also have EDQUOT for "quota exceeded" this->Error = OutOfSpace; } else { this->Error = UnknownError; } } #elif defined(VTK_DICOM_WIN32_IO) this->Handle = INVALID_HANDLE_VALUE; this->Error = 0; this->Eof = false; vtkDICOMFilePath fpath(filename); const wchar_t *wideFilename = fpath.Wide(); if (wideFilename) { if (mode == In) { this->Handle = CreateFileW(wideFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } else if (mode == Out) { this->Handle = CreateFileW(wideFilename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); } } if (this->Handle == INVALID_HANDLE_VALUE) { DWORD errorCode = GetLastError(); if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) { this->Error = AccessDenied; if (wideFilename) { DWORD attr = GetFileAttributesW(wideFilename); if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { this->Error = FileIsDirectory; } } } else if (errorCode == ERROR_PATH_NOT_FOUND) { this->Error = (mode == Out ? ImpossiblePath : FileNotFound); } else if (errorCode == ERROR_FILE_NOT_FOUND) { this->Error = FileNotFound; } else if (errorCode == ERROR_DISK_FULL) { this->Error = OutOfSpace; } else { this->Error = UnknownError; } } #else this->Handle = 0; this->Error = 0; this->Eof = false; if (mode == In) { this->Handle = fopen(filename, "rb"); } else if (mode == Out) { this->Handle = fopen(filename, "wb"); } if (this->Handle == 0) { this->Error = UnknownError; } #endif } //---------------------------------------------------------------------------- vtkDICOMFile::~vtkDICOMFile() { this->Close(); } //---------------------------------------------------------------------------- void vtkDICOMFile::Close() { #if defined(VTK_DICOM_POSIX_IO) if (this->Handle) { if (close(this->Handle) == 0) { this->Error = 0; } else if (errno != EINTR) { this->Error = UnknownError; } this->Handle = 0; } #elif defined(VTK_DICOM_WIN32_IO) CloseHandle(this->Handle); this->Handle = INVALID_HANDLE_VALUE; #else if (this->Handle) { fclose(static_cast(this->Handle)); } this->Handle = 0; #endif } //---------------------------------------------------------------------------- size_t vtkDICOMFile::Read(unsigned char *data, size_t len) { #if defined(VTK_DICOM_POSIX_IO) ssize_t n; while ((n = read(this->Handle, data, len)) == -1) { if (errno != EINTR) { break; } errno = 0; } if (n == 0) { this->Eof = true; } else if (n == -1) { this->Error = UnknownError; n = 0; } return n; #elif defined(VTK_DICOM_WIN32_IO) // handle large requests in 1GB chunks const size_t chunksize = 1024*1024*1024; size_t n = 0; while (n < len) { DWORD l = static_cast(len - n < chunksize ? len - n : chunksize); DWORD r = 0; if (ReadFile(this->Handle, &data[n], l, &r, NULL) == FALSE) { this->Error = UnknownError; break; } n += r; if (n == 0) { this->Eof = true; break; } else if (r < l) { break; } } return n; #else size_t n = fread(data, 1, len, static_cast(this->Handle)); if (n != len || len == 0) { this->Eof = (feof(static_cast(this->Handle)) != 0); this->Error = (ferror(static_cast(this->Handle)) == 0 ? 0 : UnknownError); } return n; #endif } //---------------------------------------------------------------------------- size_t vtkDICOMFile::Write(const unsigned char *data, size_t len) { #if defined(VTK_DICOM_POSIX_IO) ssize_t n; while ((n = write(this->Handle, data, len)) == -1) { if (errno != EINTR) { break; } errno = 0; } if (n == -1) { this->Error = UnknownError; n = 0; } return n; #elif defined(VTK_DICOM_WIN32_IO) // handle large requests in 1GB chunks const size_t chunksize = 1024*1024*1024; size_t n = 0; while (n < len) { DWORD l = static_cast(len - n < chunksize ? len - n : chunksize); DWORD r = 0; if (WriteFile(this->Handle, &data[n], l, &r, NULL) == FALSE) { DWORD errorCode = GetLastError(); if (errorCode == ERROR_HANDLE_DISK_FULL) { this->Error = OutOfSpace; } else { this->Error = UnknownError; } break; } n += r; } return n; #else size_t n = fwrite(data, 1, len, static_cast(this->Handle)); if (n != len || len == 0) { this->Error = (ferror(static_cast(this->Handle)) == 0 ? 0 : UnknownError); } return n; #endif } //---------------------------------------------------------------------------- bool vtkDICOMFile::SetPosition(Size offset) { #if defined(VTK_DICOM_POSIX_IO) #if defined(__linux__) && defined(_LARGEFILE64_SOURCE) off64_t pos = lseek64(this->Handle, offset, SEEK_SET); #else off_t pos = lseek(this->Handle, offset, SEEK_SET); #endif if (pos == -1) { this->Error = UnknownError; return false; } return true; #elif defined(VTK_DICOM_WIN32_IO) LONG lowerBits = static_cast(offset); LONG upperBits = static_cast(offset >> 32); DWORD pos = SetFilePointer(this->Handle, lowerBits, &upperBits, FILE_BEGIN); if (pos == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { this->Error = UnknownError; return false; } return true; #else return (fseek(static_cast(this->Handle), offset, SEEK_SET) == 0); #endif } //---------------------------------------------------------------------------- vtkDICOMFile::Size vtkDICOMFile::GetSize() { #if defined(VTK_DICOM_POSIX_IO) struct stat fs; if (fstat(this->Handle, &fs) != 0) { this->Error = UnknownError; return ~0ull; } return fs.st_size; #elif defined(VTK_DICOM_WIN32_IO) DWORD upperBits = 0; DWORD lowerBits = GetFileSize(this->Handle, &upperBits); if (lowerBits == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) { this->Error = UnknownError; return ~0ull; } return lowerBits | (static_cast(upperBits) << 32); #else FILE *fp = static_cast(this->Handle); long long size = -1; fpos_t pos; if (fgetpos(fp, &pos) == 0) { if (fseek(fp, 0, SEEK_END) == 0) { size = ftell(fp); } if (fsetpos(fp, &pos) != 0) { this->Error = UnknownError; } } if (size == -1) { this->Error = UnknownError; return ~0ull; } return static_cast(size); #endif } //---------------------------------------------------------------------------- int vtkDICOMFile::Access(const char *filename, Mode mode) { #ifdef _WIN32 int errorCode = UnknownError; vtkDICOMFilePath fpath(filename); const wchar_t *wideFilename = fpath.Wide(); if (wideFilename) { errorCode = 0; DWORD code = GetFileAttributesW(wideFilename); if (code == INVALID_FILE_ATTRIBUTES) { DWORD lastError = GetLastError(); if (lastError == ERROR_ACCESS_DENIED || lastError == ERROR_SHARING_VIOLATION) { errorCode = AccessDenied; } else if (lastError == ERROR_FILE_NOT_FOUND) { errorCode = FileNotFound; } else if (lastError == ERROR_PATH_NOT_FOUND) { errorCode = (mode == Out ? ImpossiblePath : FileNotFound); } else { errorCode = UnknownError; } } else if (mode == Out && (code & FILE_ATTRIBUTE_READONLY) != 0) { errorCode = AccessDenied; } else if ((code & FILE_ATTRIBUTE_DIRECTORY) != 0) { errorCode = FileIsDirectory; } } return errorCode; #else int errorCode = 0; struct stat fs; if (stat(filename, &fs) != 0 || access(filename, (mode == In ? R_OK : W_OK)) != 0) { int e = errno; if (e == EACCES || e == EPERM) { errorCode = AccessDenied; } else if (e == ENOENT) { errorCode = FileNotFound; } else if (e == ENOTDIR) { errorCode = (mode == Out ? ImpossiblePath : FileNotFound); } else { errorCode = UnknownError; } } else if (S_ISDIR(fs.st_mode)) { errorCode = FileIsDirectory; } return errorCode; #endif } //---------------------------------------------------------------------------- int vtkDICOMFile::Remove(const char *filename) { #if defined(VTK_DICOM_WIN32_IO) int errorCode = 0; vtkDICOMFilePath fpath(filename); const wchar_t *wideFilename = fpath.Wide(); if (wideFilename) { if (!DeleteFileW(wideFilename)) { DWORD lastError = GetLastError(); if (lastError == ERROR_ACCESS_DENIED || lastError == ERROR_SHARING_VIOLATION) { errorCode = AccessDenied; } else if (lastError == ERROR_FILE_NOT_FOUND || lastError == ERROR_PATH_NOT_FOUND) { errorCode = FileNotFound; } else { errorCode = UnknownError; } } } return errorCode; #else int errorCode = 0; if (unlink(filename) != 0) { int e = errno; if (e == EACCES || e == EPERM) { errorCode = AccessDenied; } else if (e == ENOENT || e == ENOTDIR) { errorCode = FileNotFound; } else { errorCode = UnknownError; } } return errorCode; #endif } //---------------------------------------------------------------------------- bool vtkDICOMFile::SameFile(const char *file1, const char *file2) { // Two files are considered to be the same if: // 1) they are on the same device // 2) their index (inode number) is the same bool result = false; #ifdef _WIN32 vtkDICOMFilePath fpath1(file1); const wchar_t *widepath = fpath1.Wide(); HANDLE h1 = CreateFileW(widepath, GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); vtkDICOMFilePath fpath2(file2); widepath = fpath2.Wide(); HANDLE h2 = CreateFileW(widepath, GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (h1 != INVALID_HANDLE_VALUE && h2 != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION buf; GetFileInformationByHandle(h1, &buf); DWORD sn = buf.dwVolumeSerialNumber; DWORD hi = buf.nFileIndexHigh; DWORD li = buf.nFileIndexLow; GetFileInformationByHandle(h2, &buf); result = (buf.dwVolumeSerialNumber == sn); result &= (buf.nFileIndexHigh == hi); result &= (buf.nFileIndexLow == li); } if (h1 != INVALID_HANDLE_VALUE) { CloseHandle(h1); } if (h2 != INVALID_HANDLE_VALUE) { CloseHandle(h2); } #else struct stat st1; struct stat st2; if (stat(file1, &st1) == 0 && stat(file2, &st2) == 0) { result = (memcmp(&st1.st_dev, &st2.st_dev, sizeof(st1.st_dev)) == 0); result &= (memcmp(&st1.st_ino, &st2.st_ino, sizeof(st1.st_ino)) == 0); } #endif return result; } vtk-dicom-0.8.12/Source/vtkDICOMFile.h000066400000000000000000000103551356440565500173110ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMFile_h #define vtkDICOMFile_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #if defined(_WIN32) #define VTK_DICOM_WIN32_IO #else #define VTK_DICOM_POSIX_IO #endif //! A class that provides basic input/output operations. /*! * The purpose of this class is to centralize all of the I/O operations. * It uses system-level I/O calls so that it can eventually be used not * only on files, but on sockets as well. */ class VTKDICOM_EXPORT vtkDICOMFile { public: //! The file mode (input or output). enum Mode { In, Out }; //! Error codes. enum Code { Good, // no error UnknownError, // unspecified error AccessDenied, // file permission error FileIsDirectory, // can't open file: directory with that name exists ImpossiblePath, // part of the path doesn't exist or goes through a file FileNotFound, // requested file (or directory) doesn't exist OutOfSpace // disk full or quota exceeded }; //! Typedef for a file size. typedef unsigned long long Size; //@{ //! Construct the file object. /*! * The Mode can be "In" or "Out" (read or write). */ vtkDICOMFile(const char *filename, Mode mode); //! Destruct the object and close the file. ~vtkDICOMFile(); //@} //@{ //! Close a file. void Close(); //! Read data from the file. /*! * The number of bytes read will be returned. * A return value of zero indicates an error. */ size_t Read(unsigned char *data, size_t size); //! Write data to a file. /*! * The number of bytes written will be returned. * If it is less than the size requested, an error occurred. */ size_t Write(const unsigned char *data, size_t size); //! Go to a specific location in the file. /*! * The return value is false if an error occurred. */ bool SetPosition(Size offset); //! Check the size of the file, returns ULLONG_MAX on error. Size GetSize(); //! Check for the end-of-file indicator. bool EndOfFile() { return this->Eof; } //! Return an error indicator (zero if no error). int GetError() { return this->Error; } //@} //@{ //! Test the specified file for accessibility (static method). /*! * The mode should be "In" or "Out" to indicate how you intend to use * the file. The return value will be zero (for an ordinary file) or * one of the codes returned by GetError. */ static int Access(const char *filename, Mode mode); //! Delete the specified file (static method). /*! * The return value is zero if successful, otherwise an error * code is returned. This can be called on a file that is still * open, in which case the file will be deleted when closed. */ static int Remove(const char *filename); //! Check if two files are the same. /*! * This does not check that the filenames are the same. Instead, * it checks to see if the two filenames point to the same actual * disk file. If either file does not exist or is otherwise not * accessible, then it returns false. */ static bool SameFile(const char *file1, const char *file2); //@} //! @cond // Copy constructor creates a closed file. The copy constructor would // normally be deleted, but that would cause the VTK python wrappers to // skip this class. Once the wrappers are fixed, this can be deleted. vtkDICOMFile(const vtkDICOMFile&) : Handle(0), Error(0), Eof(false) {} //! @endcond private: vtkDICOMFile& operator=(const vtkDICOMFile&); // = delete; #ifdef VTK_DICOM_POSIX_IO int Handle; #else void *Handle; #endif int Error; bool Eof; }; #endif /* vtkDICOMFile_h */ // VTK-HeaderTest-Exclude: vtkDICOMFile.h vtk-dicom-0.8.12/Source/vtkDICOMFileDirectory.cxx000066400000000000000000000336541356440565500215600ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMFileDirectory.h" #include "vtkDICOMFilePath.h" #include "vtkDICOMFile.h" #ifdef _WIN32 #include #else #include #include #include #include #include #include #endif #include #include // for PGI compiler, use dirent64 if readdir is readdir64 #if defined(__PGI) && defined(__GLIBC__) # define redef_dirent_readdir dirent # define redef_dirent_readdir64 dirent64 # define redef_dirent redef_dirent_lookup(readdir) # define redef_dirent_lookup(x) redef_dirent_lookup2(x) # define redef_dirent_lookup2(x) redef_dirent_##x #else # define redef_dirent dirent #endif //---------------------------------------------------------------------------- struct vtkDICOMFileDirectory::Entry { std::string Name; unsigned short Flags; unsigned short Mask; }; //---------------------------------------------------------------------------- vtkDICOMFileDirectory::vtkDICOMFileDirectory(const char *dirname) : Name(dirname), Error(0), NumberOfEntries(0), Entries(0) { #ifdef _WIN32 vtkDICOMFilePath path(dirname); path.PushBack("*"); const wchar_t *widename = path.Wide(); if (widename == 0) { this->Error = UnknownError; } else { WIN32_FIND_DATAW fileData; HANDLE h = FindFirstFileW(widename, &fileData); DWORD code = 0; if (h == INVALID_HANDLE_VALUE) { code = GetLastError(); if (code == ERROR_FILE_NOT_FOUND) { code = ERROR_NO_MORE_FILES; } } else { // each utf-16 wchar converts to three or fewer utf-8 bytes int n = MAX_PATH*3; char name[MAX_PATH*3]; do { WideCharToMultiByte( CP_UTF8, 0, fileData.cFileName, -1, name, n, 0, 0); unsigned int flags = 0; #if (_MSC_VER >= 1400) if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 && fileData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) { flags |= TypeSymlink; } #endif if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0) { flags |= TypeHidden; } if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { flags |= TypeDirectory; } if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) != 0) { flags |= TypeSpecial; } this->AddEntry(name, flags, (TypeSymlink | TypeBroken | TypeDirectory | TypeSpecial | TypeHidden )); } while (FindNextFileW(h, &fileData)); code = GetLastError(); } if (code == ERROR_ACCESS_DENIED) { this->Error = AccessDenied; } else if (code == ERROR_FILE_NOT_FOUND || code == ERROR_PATH_NOT_FOUND) { this->Error = FileNotFound; } else if (code != ERROR_NO_MORE_FILES) { this->Error = UnknownError; } if (h != INVALID_HANDLE_VALUE) { FindClose(h); } } #else errno = 0; DIR* dir = opendir(dirname); if (!dir) { int e = errno; if (e == EACCES || e == EPERM) { this->Error = AccessDenied; } else if (e == ENOENT || e == ENOTDIR) { this->Error = FileNotFound; } else { this->Error = UnknownError; } } else { for (redef_dirent *d = readdir(dir); d; d = readdir(dir)) { if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) { this->AddEntry(d->d_name, 0, 0); } } closedir(dir); } #endif } //---------------------------------------------------------------------------- vtkDICOMFileDirectory::vtkDICOMFileDirectory(const vtkDICOMFileDirectory& o) : Name(o.Name), Error(o.Error), NumberOfEntries(0), Entries(0) { if (o.Entries && o.NumberOfEntries) { for (int i = 0; i < o.NumberOfEntries; i++) { const Entry& e = o.Entries[i]; this->AddEntry(e.Name.c_str(), e.Flags, e.Mask); } } } //---------------------------------------------------------------------------- vtkDICOMFileDirectory& vtkDICOMFileDirectory::operator=( const vtkDICOMFileDirectory& o) { if (this != &o) { delete [] this->Entries; this->Name = o.Name; this->Error = o.Error; this->NumberOfEntries = 0; this->Entries = 0; if (o.Entries && o.NumberOfEntries) { for (int i = 0; i < o.NumberOfEntries; i++) { const Entry& e = o.Entries[i]; this->AddEntry(e.Name.c_str(), e.Flags, e.Mask); } } } return *this; } //---------------------------------------------------------------------------- vtkDICOMFileDirectory::~vtkDICOMFileDirectory() { delete [] this->Entries; } //---------------------------------------------------------------------------- const char *vtkDICOMFileDirectory::GetEntry(int i) { if (i < 0 || i >= this->NumberOfEntries) { return 0; } return this->Entries[i].Name.c_str(); } //---------------------------------------------------------------------------- bool vtkDICOMFileDirectory::IsDirectory(int i) { if (i < 0 || i >= this->NumberOfEntries) { return false; } if ((this->Entries[i].Mask & TypeDirectory) == 0) { this->StatEntry(i); } return ((this->Entries[i].Flags & TypeDirectory) != 0); } //---------------------------------------------------------------------------- bool vtkDICOMFileDirectory::IsSpecial(int i) { if (i < 0 || i >= this->NumberOfEntries) { return false; } if ((this->Entries[i].Mask & TypeSpecial) == 0) { this->StatEntry(i); } return ((this->Entries[i].Flags & TypeSpecial) != 0); } //---------------------------------------------------------------------------- bool vtkDICOMFileDirectory::IsSymlink(int i) { if (i < 0 || i >= this->NumberOfEntries) { return false; } if ((this->Entries[i].Mask & TypeSymlink) == 0) { this->LinkStatEntry(i); } return ((this->Entries[i].Flags & TypeSymlink) != 0); } //---------------------------------------------------------------------------- bool vtkDICOMFileDirectory::IsBroken(int i) { if (i < 0 || i >= this->NumberOfEntries) { return false; } if ((this->Entries[i].Mask & TypeBroken) == 0) { if ((this->Entries[i].Mask & TypeSymlink) == 0) { // first use lstat() to find out if it is a link this->LinkStatEntry(i); } if ((this->Entries[i].Flags & TypeSymlink) != 0) { // then use stat() to find out if link is broken this->StatEntry(i); } } return ((this->Entries[i].Flags & TypeBroken) != 0); } //---------------------------------------------------------------------------- bool vtkDICOMFileDirectory::IsHidden(int i) { if (i < 0 || i >= this->NumberOfEntries) { return false; } if ((this->Entries[i].Mask & TypeHidden) == 0) { #ifdef __APPLE__ // use lstat to check for hidden flag this->LinkStatEntry(i); #else // set the mask bit, but not the flag bit this->Entries[i].Mask |= TypeHidden; #endif } return ((this->Entries[i].Flags & TypeHidden) != 0); } //---------------------------------------------------------------------------- void vtkDICOMFileDirectory::AddEntry( const char *name, unsigned short flags, unsigned short mask) { int n = this->NumberOfEntries; if (this->Entries == 0) { this->Entries = new Entry[4]; } else if (n >= 4 && ((n-1) & n) == 0) { Entry *entries = new Entry[n*2]; for (int i = 0; i < n; i++) { entries[i] = this->Entries[i]; } delete [] this->Entries; this->Entries = entries; } this->Entries[n].Name = name; this->Entries[n].Flags = flags; this->Entries[n].Mask= mask; this->NumberOfEntries++; } //---------------------------------------------------------------------------- #ifndef _WIN32 void vtkDICOMFileDirectory::StatEntry(int i) { if (i >= 0 && i < this->NumberOfEntries) { struct stat fs; vtkDICOMFilePath path(this->Name); path.PushBack(this->Entries[i].Name); if (stat(path.AsString().c_str(), &fs) == 0) { this->Entries[i].Mask |= TypeDirectory; this->Entries[i].Mask |= TypeSpecial; this->Entries[i].Mask |= TypeBroken; if (S_ISDIR(fs.st_mode)) { this->Entries[i].Flags |= TypeDirectory; } else if (!S_ISREG(fs.st_mode)) { this->Entries[i].Flags |= TypeSpecial; } } else if ((this->Entries[i].Mask & TypeSymlink) != 0 && (this->Entries[i].Flags & TypeSymlink) != 0) { this->Entries[i].Mask |= TypeBroken; this->Entries[i].Flags |= TypeBroken; } } } #else /* _WIN32 */ void vtkDICOMFileDirectory::StatEntry(int) { // on Windows, the attributes were collected when the // directory listing was done in the constructor, so // there is no need to run stat on the files } #endif //---------------------------------------------------------------------------- #ifndef _WIN32 void vtkDICOMFileDirectory::LinkStatEntry(int i) { if (i >= 0 && i < this->NumberOfEntries) { struct stat fs; vtkDICOMFilePath path(this->Name); path.PushBack(this->Entries[i].Name); if (lstat(path.AsString().c_str(), &fs) == 0) { this->Entries[i].Mask |= TypeSymlink; if (S_ISLNK(fs.st_mode)) { this->Entries[i].Flags |= TypeSymlink; } else { // if not a link, check if directory or regular file this->Entries[i].Mask |= TypeDirectory; this->Entries[i].Mask |= TypeSpecial; if (S_ISDIR(fs.st_mode)) { this->Entries[i].Flags |= TypeDirectory; } else if (!S_ISREG(fs.st_mode)) { this->Entries[i].Flags |= TypeSpecial; } } this->Entries[i].Mask |= TypeHidden; #ifdef __APPLE__ if ((fs.st_flags & UF_HIDDEN) != 0) { this->Entries[i].Flags |= TypeHidden; } #endif } } } #else /* _WIN32 */ void vtkDICOMFileDirectory::LinkStatEntry(int) { // on Windows, the attributes were collected when the // directory listing was done in the constructor, so // there is no need to run stat on the files } #endif //---------------------------------------------------------------------------- int vtkDICOMFileDirectory::Access(const char *dirname, Mode mode) { #ifdef _WIN32 // The "mode" is not checked on Win32, add AccessCheck()? (void)mode; int errorCode = UnknownError; vtkDICOMFilePath fpath(dirname); const wchar_t *wideFilename = fpath.Wide(); if (wideFilename) { errorCode = 0; DWORD code = GetFileAttributesW(wideFilename); if (code == INVALID_FILE_ATTRIBUTES) { DWORD lastError = GetLastError(); if (lastError == ERROR_ACCESS_DENIED || lastError == ERROR_SHARING_VIOLATION) { errorCode = AccessDenied; } else if (lastError == ERROR_FILE_NOT_FOUND) { errorCode = FileNotFound; } else if (lastError == ERROR_PATH_NOT_FOUND) { errorCode = ImpossiblePath; } else { errorCode = UnknownError; } } else if ((code & FILE_ATTRIBUTE_DIRECTORY) == 0) { errorCode = ImpossiblePath; } } return errorCode; #else int errorCode = 0; struct stat fs; if (stat(dirname, &fs) != 0 || access(dirname, (mode == In ? R_OK : W_OK)) != 0) { int e = errno; if (e == EACCES || e == EPERM) { errorCode = AccessDenied; } else if (e == ENOENT) { errorCode = FileNotFound; } else if (e == ENOTDIR) { errorCode = ImpossiblePath; } else { errorCode = UnknownError; } } else if (!S_ISDIR(fs.st_mode)) { errorCode = ImpossiblePath; } return errorCode; #endif } //---------------------------------------------------------------------------- int vtkDICOMFileDirectory::Create(const char *name) { int result = 0; std::vector dirsToCreate; vtkDICOMFilePath path(name); while (!path.IsRoot() && !path.IsEmpty() && result == 0) { int code = vtkDICOMFile::Access(path.AsString().c_str(), vtkDICOMFile::In); if (code == 0 || code == vtkDICOMFile::AccessDenied) { // The name exists as a file, or there is no permission to use path result = AccessDenied; } else if (code == vtkDICOMFile::FileIsDirectory) { // Found a directory! break; } dirsToCreate.push_back(path.AsString()); path.PopBack(); } while (dirsToCreate.size() > 0 && result == 0) { const std::string& dirname = dirsToCreate.back(); #ifdef _WIN32 vtkDICOMFilePath dirpath(dirname); const wchar_t *widename = dirpath.Wide(); if (widename == 0) { result = UnknownError; } else if (!CreateDirectoryW(widename, NULL)) { DWORD e = GetLastError(); if (e == ERROR_ACCESS_DENIED || e == ERROR_ALREADY_EXISTS) { result = AccessDenied; } else if (e == ERROR_PATH_NOT_FOUND) { result = ImpossiblePath; } else if (e == ERROR_DISK_FULL) { result = OutOfSpace; } else { result = UnknownError; } } #else if (mkdir(dirname.c_str(), 00777) != 0) { int e = errno; if (e == EACCES || e == EPERM) { result = AccessDenied; } else if (e == ENOENT || e == ENOTDIR) { result = ImpossiblePath; } else if (e == ENOSPC) { // some systems also have EDQUOT for "quota exceeded" result = OutOfSpace; } else { result = UnknownError; } } #endif dirsToCreate.pop_back(); } return result; } vtk-dicom-0.8.12/Source/vtkDICOMFileDirectory.h000066400000000000000000000101021356440565500211640ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMFileDirectory_h #define vtkDICOMFileDirectory_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include // Interface type //! A class that provides directory listings. class VTKDICOM_EXPORT vtkDICOMFileDirectory { public: //! The access mode (input or output). enum Mode { In, Out }; //! Error codes. enum Code { Good, // no error UnknownError, // unspecified error AccessDenied, // file permission error Reserved, ImpossiblePath, // part of the path doesn't exist or goes through a file FileNotFound, // requested file (or directory) doesn't exist OutOfSpace // disk full or quota exceeded }; //@{ //! Construct the object from a directory name. /*! * This causes the directory to be read. Use GetError() to check whether * the read was successful. */ vtkDICOMFileDirectory(const char *dirname); //! Copy constructor. vtkDICOMFileDirectory(const vtkDICOMFileDirectory&); //! Destruct the object. ~vtkDICOMFileDirectory(); //@} //@{ //! Return an error indicator (zero if no error). int GetError() { return this->Error; } //@} //@{ //! Get the number of files and subdirectories in the directory. int GetNumberOfEntries() { return this->NumberOfEntries; } //! Get the name of the ith file or subdirectory. /*! * The entries do not include "." or "..". */ const char *GetEntry(int i); //! Check if the list entry is a directory. bool IsDirectory(int i); //! Check if the list entry is special (a device, socket, or pipe). bool IsSpecial(int i); //! Check if the list entry is a symbolic link. bool IsSymlink(int i); //! Check if the list entry is a symbolic link that is broken. /*! * A link is broken if it points to a location that does not exist, * or to a location that is in a directory that cannot be accessed. * IsSymlink() will always be true if IsBroken() is true. */ bool IsBroken(int i); //! Check if the list entry has an attribute that marks it as hidden. bool IsHidden(int i); //@} //@{ //! Test a directory for accessibility (static method). /*! * The mode should be "In" or "Out" to indicate whether you intend to * read from or write to the directory. A return value of zero means * the directory can be accessed, otherwise an error code will be * returned. */ static int Access(const char *dirname, Mode mode); //! Create a new directory with default permissions (static method). /*! * This will create any intermediate directories, as well. The return * value is zero for success. Otherwise, one of the error codes is * returned. */ static int Create(const char *dirname); //@} //@{ //! Assignment operator. vtkDICOMFileDirectory& operator=(const vtkDICOMFileDirectory&); //@} private: //! Add a directory entry. void AddEntry(const char *name, unsigned short flags, unsigned short mask); //! Call stat() on a file to set flags void StatEntry(int i); //! Call lstat() on a file to set flags void LinkStatEntry(int i); struct Entry; static const unsigned int TypeDirectory = 1; static const unsigned int TypeSpecial = 2; static const unsigned int TypeSymlink = 4; static const unsigned int TypeBroken = 8; static const unsigned int TypeHidden = 16; std::string Name; int Error; int NumberOfEntries; Entry *Entries; }; #endif /* vtkDICOMFileDirectory_h */ // VTK-HeaderTest-Exclude: vtkDICOMFileDirectory.h vtk-dicom-0.8.12/Source/vtkDICOMFilePath.cxx000066400000000000000000000471361356440565500205100ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMFilePath.h" #include #ifdef _WIN32 #include #else #include #include #include #endif //---------------------------------------------------------------------------- vtkDICOMFilePath::vtkDICOMFilePath(const std::string& path) : Path(path), Separator('/') { #ifdef _WIN32 size_t l = path.length(); for (size_t i = 0; i < l; i++) { if (IsSeparator(path[i])) { this->Separator = path[i]; break; } } this->WidePath = 0; this->LocalPath = 0; #endif StripTrailingSlash(&this->Path); } //---------------------------------------------------------------------------- #ifdef _WIN32 vtkDICOMFilePath::vtkDICOMFilePath(const std::wstring& path) { char *filename = ConvertToUTF8(path.c_str()); this->Path = filename; this->Separator = '/'; delete [] filename; size_t l = path.length(); for (size_t i = 0; i < l; i++) { if (IsSeparator(path[i])) { this->Separator = path[i]; break; } } this->WidePath = 0; this->LocalPath = 0; StripTrailingSlash(&this->Path); } #endif //---------------------------------------------------------------------------- vtkDICOMFilePath::vtkDICOMFilePath(const vtkDICOMFilePath& other) : Path(other.Path), Separator(other.Separator) { #ifdef _WIN32 this->WidePath = 0; this->LocalPath = 0; #endif } //---------------------------------------------------------------------------- vtkDICOMFilePath::~vtkDICOMFilePath() { #ifdef _WIN32 delete [] this->WidePath; delete [] this->LocalPath; #endif } //---------------------------------------------------------------------------- vtkDICOMFilePath& vtkDICOMFilePath::operator=(const vtkDICOMFilePath& other) { if (this != &other) { this->Path = other.Path; this->Separator = other.Separator; } return *this; } //---------------------------------------------------------------------------- std::string vtkDICOMFilePath::Join(const std::string& second) const { #ifdef _WIN32 std::string path = this->Path; char sep = this->Separator; // if extended prefix is present, then all forward slashes must be // converted into back slashes, and "." and ".." must be removed bool extended = false; if (HasExtendedPrefix(path)) { sep = '\\'; extended = true; } // check whether the second part might be an absolute path size_t pos = 0; size_t r = RootLength(second); if (r > 0) { // if second drive letter mismatches the first, paths can't be joined char drive1 = DriveLetter(path); char drive2 = DriveLetter(second); if (HasExtendedPrefix(second)) { // if second part uses extended prefix, ignore the first part path.resize(0); } else if (drive2 && drive1 == drive2 && r != 3) { // skip the drive letter in the second path pos = 2; } else if (extended && drive2 && r >= 2) { // move the drive letter from the second path to the first pos = 2; path = "\\\\\?\\"; path.append(second, 0, pos); pos += (r >= 3 && IsSeparator(second[pos])); } else if (drive1 && drive2 == 0 && r == 1) { // keep the drive letter, but use absolute path from second part sep = second[0]; path.resize(4*extended + 2); } else if (extended && r >= 2 && IsSeparator(second[0]) && IsSeparator(second[1])) { // create an extended UNC path pos = 2; path = "\\\\\?\\UNC\\"; } else { // ignore the first path completely path.resize(0); } } // append a separator before appending the second part size_t l = path.length(); if (l > 0 && !IsSeparator(path[l-1]) && !(l == 2 && path[1] == ':')) { path.push_back(sep); } // append one part at a time while (pos != second.length()) { if (IsSeparator(second[pos])) { path.push_back(sep); pos++; } size_t endpos = pos; while (endpos != second.length() && !IsSeparator(second[endpos])) { endpos++; } size_t n = endpos - pos; if (n > 0) { if (extended) { if (n == 1 && second[pos] == '.') { // Ignore the '.' and the following slash if (endpos != second.length() && IsSeparator(second[endpos])) { endpos++; } } else if (n == 2 && second[pos] == '.' && second[pos+1] == '.') { // Ignore the '..' and the following slash if (endpos != second.length() && IsSeparator(second[endpos])) { endpos++; } // Remove the preceding part of the path l = path.length(); size_t m = RootLength(path); if (l > m && path[l-1] == sep) { l--; while (l > m && path[l-1] != sep) { l--; } path.resize(l); } } else if (n > 2 && second[pos + 1] == ':') { path.append(second, pos, 2); path.push_back(sep); path.append(second, pos+2, n-2); } else { path.append(second, pos, n); } } else { path.append(second, pos, n); } } pos = endpos; } #else if (this->Path.length() == 0) { // first part is empty, so just return second return second; } if (second.length() > 0 && IsSeparator(second[0])) { // second part is an absolute path return second; } // append the second part to the first std::string path = this->Path; size_t l = path.length(); if (l > 0 && !IsSeparator(path[l-1])) { path.push_back(this->Separator); } path.append(second); #endif StripTrailingSlash(&path); return path; } //---------------------------------------------------------------------------- std::string vtkDICOMFilePath::GetBack() const { size_t l = this->Path.length(); size_t r = RootLength(this->Path); #ifdef _WIN32 if (r >= 4 && HasExtendedPrefix(this->Path)) { while (l > r && this->Path[l-1] != '\\') { --l; } } else #endif { while (l > r && !IsSeparator(this->Path[l-1])) { --l; } } return this->Path.substr(l); } //---------------------------------------------------------------------------- std::string vtkDICOMFilePath::GetExtension() const { size_t i = ExtensionPosition(this->Path); return this->Path.substr(i); } //---------------------------------------------------------------------------- void vtkDICOMFilePath::PopExtension() { size_t i = ExtensionPosition(this->Path); this->Path.resize(i); } //---------------------------------------------------------------------------- void vtkDICOMFilePath::PushExtension(const std::string& ext) { size_t l = ext.length(); if (l == 0 || (l == 1 && ext[0] == '.')) { return; } for (size_t i = 0; i < l; i++) { if (IsSeparator(ext[i])) { return; } } if (l > 0 && ext[0] != '.') { this->Path.push_back('.'); } this->Path.append(ext); } //---------------------------------------------------------------------------- size_t vtkDICOMFilePath::ExtensionPosition(const std::string& path) { size_t l = path.length(); size_t r = RootLength(path); size_t i = l; #ifdef _WIN32 if (r >= 4 && HasExtendedPrefix(path)) { while (l > r && path[l-1] != '\\') { if (path[--l] == '.') { i = l; break; } } } else #endif { while (l > r && !IsSeparator(path[l-1])) { if (path[--l] == '.') { i = l; break; } } } return i; } //---------------------------------------------------------------------------- bool vtkDICOMFilePath::IsRoot() const { size_t l = this->Path.length(); return (l > 0 && l == RootLength(this->Path)); } //---------------------------------------------------------------------------- bool vtkDICOMFilePath::IsDirectory() const { bool result = false; #ifdef _WIN32 wchar_t *widepath = ConvertToWideChar(this->Path.c_str()); if (widepath) { DWORD a = GetFileAttributesW(widepath); delete [] widepath; result = ((a & FILE_ATTRIBUTE_DIRECTORY) != 0); } #else struct stat fs; if (stat(this->Path.c_str(), &fs) == 0 && S_ISDIR(fs.st_mode)) { result = true; } #endif return result; } //---------------------------------------------------------------------------- bool vtkDICOMFilePath::IsSpecial() const { bool result = false; #ifdef _WIN32 wchar_t *widepath = ConvertToWideChar(this->Path.c_str()); if (widepath) { DWORD a = GetFileAttributesW(widepath); delete [] widepath; result = ((a & FILE_ATTRIBUTE_DEVICE) != 0); } #else struct stat fs; if (stat(this->Path.c_str(), &fs) == 0 && !S_ISDIR(fs.st_mode) && !S_ISREG(fs.st_mode)) { result = true; } #endif return result; } //---------------------------------------------------------------------------- bool vtkDICOMFilePath::IsSymlink() const { bool result = false; #ifdef _WIN32 wchar_t *widepath = ConvertToWideChar(this->Path.c_str()); if (widepath && GetFileAttributesW(widepath) != INVALID_FILE_ATTRIBUTES) { WIN32_FIND_DATAW buf; HANDLE h = FindFirstFileW(widepath, &buf); if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); if ((buf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 && buf.dwReserved0 == 0xA000000C) { result = true; } } } delete [] widepath; #else struct stat fs; if (lstat(this->Path.c_str(), &fs) == 0 && S_ISLNK(fs.st_mode)) { result = true; } #endif return result; } //---------------------------------------------------------------------------- std::string vtkDICOMFilePath::GetRealPath() const { #ifdef _WIN32 std::string result; wchar_t *widepath = ConvertToWideChar(this->Path.c_str()); #ifndef DICOM_DEPRECATE_WINXP wchar_t buffer[512]; DWORD m = 512; wchar_t *tmp = buffer; DWORD n = GetFullPathNameW(widepath, m, tmp, NULL); if (n >= m-1) { tmp = new wchar_t[n+3]; n = GetFullPathNameW(widepath, n+3, tmp, NULL); } delete [] widepath; widepath = tmp; #else HANDLE h = CreateFileW(widepath, GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); delete [] widepath; if (h == INVALID_HANDLE_VALUE) { return result; } wchar_t buffer[512]; widepath = buffer; DWORD m = 512; // GetFinalPathNameByHandle() is not supported on Windows XP DWORD n = GetFinalPathNameByHandleW(h, widepath, m, 0); if (n >= m) { widepath = new wchar_t[n+1]; n = GetFinalPathNameByHandleW(h, widepath, n+1, 0); } CloseHandle(h); #endif if (n != 0) { char *path = ConvertToUTF8(widepath); if (widepath != buffer) { delete [] widepath; } if (path == 0) { return result; } #ifndef DICOM_DEPRECATE_WINXP // Add extended prefix if not present if (path[0] == '\0' || strncmp("\\\\?\\", path, 4) == 0 || strncmp("\\\\.\\", path, 4) == 0) { result = path; } else { size_t l = strlen(path); if (l >= 2 && path[0] == '\\' && path[1] == '\\') { result = "\\\\?\\UNC\\"; result.append(&path[2]); } else { result = "\\\\?\\"; result.append(path); } } #else result = path; #endif delete [] path; } return result; #else #if _POSIX_VERSION >= 200809L char *storage = 0; #else char *storage = static_cast(malloc(PATH_MAX)); #endif std::string result; char *path = realpath(this->Path.c_str(), storage); if (path != 0) { result = path; storage = path; } free(storage); return result; #endif } //---------------------------------------------------------------------------- void vtkDICOMFilePath::PushBack(const std::string& second) { if (this->Path.length() == 0 || RootLength(second) == 0) { this->Path = this->Join(second); } #ifdef _WIN32 else if (this->Path.length() == 4 && HasExtendedPrefix(this->Path)) { this->Path = this->Join(second); } else if (RootLength(this->Path) == 2 && DriveLetter(this->Path) && (DriveLetter(this->Path) == DriveLetter(second) || RootLength(second) == 1)) { this->Path = this->Join(second); } // Check if the separator changed, make it sticky. size_t l = this->Path.length(); for (size_t i = 0; i < l; i++) { if (IsSeparator(this->Path[i])) { this->Separator = this->Path[i]; break; } } #endif } //---------------------------------------------------------------------------- void vtkDICOMFilePath::PopBack() { const std::string& path = this->Path; size_t root = RootLength(path); size_t l = path.length(); #ifdef _WIN32 if (l >= 4 && HasExtendedPrefix(path)) { // only allow backslash as a separator with the "\\?\" prefix while (l > root && path[l-1] != '\\') { --l; } // strip all trailing slashes that aren't part of the root while (l > root && path[l-1] == '\\') { --l; } } else #endif { // back up to the last separator while (l > root && !IsSeparator(path[l-1])) { --l; } // strip all trailing slashes that aren't part of the root while (l > root && IsSeparator(path[l-1])) { --l; } } this->Path.resize(l); } //---------------------------------------------------------------------------- void vtkDICOMFilePath::StripTrailingSlash(std::string *path) { size_t l = path->length(); size_t r = RootLength(*path); #ifdef _WIN32 if (r >= 4 && HasExtendedPrefix(*path)) { // remove the trailing slash, if present and not the root while (l > r && (*path)[l-1] == '\\') { path->resize(--l); } } else #endif { // remove the trailing slash, if present and not the root while (l > r && IsSeparator((*path)[l-1])) { path->resize(--l); } } } //---------------------------------------------------------------------------- size_t vtkDICOMFilePath::RootLength(const std::string& path) { size_t root = 0; size_t l = path.length(); #ifdef _WIN32 // Several possible base prefixes exist on Windows: // \ (the root of the current device) // A: (indicates a relative path on a device) // A:\ (the root of a device) // \\server\share\ (a UNC path prefix) // There's also the special "\\?\" prefix, which allows paths to go beyond // the usual 260 char limits, but is only allowed for absolute paths and // does not allows substitutions such as "/" for "\" or "." and "..". // \\?\A:\ (the root of a device) // \\?\UNC\server\share\ (a UNC path prefix) // Finally, the special "\\.\" prefix is used to name system devices: // \\.\DEVICE (name of a special devices) if (l >= 4 && HasExtendedPrefix(path)) { root = 4; if (path[2] == '\?') { if (l >= 7 && path[4] == 'U' && path[5] == 'N' && path[6] == 'C') { if (l == 7) { root = 7; } else if (l > 7 && path[7] == '\\') { root = 8; while (root != l && path[root] != '\\') { root++; } if (root != l && path[root] == '\\') { root++; } while (root != l && path[root] != '\\') { root++; } } } else if (l > 5 && path[5] == ':' && ((path[4] >= 'A' && path[4] <= 'Z') || (path[4] >= 'a' && path[4] <= 'z'))) { root = 6; if (l > 6 && path[6] == '\\') { root = 7; } } } } else { if (l > 0 && IsSeparator(path[0])) { root = 1; if (l > 1 && IsSeparator(path[1])) { // UNC path root = 2; while (root != l && !IsSeparator(path[root])) { root++; } if (root != l && IsSeparator(path[root])) { root++; } while (root != l && !IsSeparator(path[root])) { root++; } } } else if (l >= 2 && path[1] == ':' && ((path[0] >= 'A' && path[0] <= 'Z') || (path[0] >= 'a' && path[0] <= 'z'))) { root = 2; if (l > 2 && IsSeparator(path[2])) { root = 3; } } } #else // For UNIX, the only possible root is "/" if (l > 0 && IsSeparator(path[0])) { root = 1; } #endif return root; } //---------------------------------------------------------------------------- #ifdef _WIN32 const wchar_t *vtkDICOMFilePath::Wide() { delete [] this->WidePath; this->WidePath = ConvertToWideChar(this->Path.c_str()); return this->WidePath; } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 const char *vtkDICOMFilePath::Local() { delete [] this->LocalPath; this->LocalPath = 0; if (this->Wide()) { this->LocalPath = ConvertToLocal(this->WidePath); } return this->LocalPath; } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 bool vtkDICOMFilePath::HasExtendedPrefix(const std::string& path) { // extended prefixes are '\\?\' and '\\.\' return (path.length() >= 4 && path[0] == '\\' && path[1] == '\\' && path[3] == '\\' && (path[2] == '\?' || path[2] == '.')); } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 char vtkDICOMFilePath::DriveLetter(const std::string& path) { char d = '\0'; size_t l = path.length(); size_t pos = 0; if (l >= 4 && HasExtendedPrefix(path)) { pos = 4; } if (l >= pos+2 && path[pos+1] == ':') { char e = path[pos]; if (e >= 'A' && e <= 'Z') { d = e; } else if (e >= 'a' && e <= 'z') { d = e - ('a' - 'A'); } } return d; } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 wchar_t *vtkDICOMFilePath::ConvertToWideChar(const char *filename) { wchar_t *wideFilename = 0; int n = MultiByteToWideChar( CP_UTF8, 0, filename, -1, NULL, 0); if (n > 0) { wideFilename = new wchar_t[n]; n = MultiByteToWideChar( CP_UTF8, 0, filename, -1, wideFilename, n); if (n == 0) { delete [] wideFilename; wideFilename = 0; } } return wideFilename; } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 char *vtkDICOMFilePath::ConvertToUTF8(const wchar_t *wideFilename) { char *filename = 0; int n = WideCharToMultiByte( CP_UTF8, 0, wideFilename, -1, NULL, 0, 0, 0); if (n > 0) { filename = new char[n]; n = WideCharToMultiByte( CP_UTF8, 0, wideFilename, -1, filename, n, 0, 0); if (n == 0) { delete [] filename; filename = 0; } } return filename; } #endif //---------------------------------------------------------------------------- #ifdef _WIN32 char *vtkDICOMFilePath::ConvertToLocal(const wchar_t *wideFilename) { char *filename = 0; int n = WideCharToMultiByte( CP_ACP, 0, wideFilename, -1, NULL, 0, 0, 0); if (n > 0) { filename = new char[n]; n = WideCharToMultiByte( CP_ACP, 0, wideFilename, -1, filename, n, 0, 0); if (n == 0) { delete [] filename; filename = 0; } } return filename; } #endif vtk-dicom-0.8.12/Source/vtkDICOMFilePath.h000066400000000000000000000121611356440565500201230ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMFilePath_h #define vtkDICOMFilePath_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include // Interface type //! A class that provides path manipulation. class VTKDICOM_EXPORT vtkDICOMFilePath { public: //@{ //! Create a new path from the given string. /*! * Trailing slashes will be removed (unless the trailing slash is * the root of the filesystem). */ vtkDICOMFilePath(const std::string& path); #ifdef _WIN32 //! Create a new path from a wide string. /*! * This is to support unicode paths on Windows. */ vtkDICOMFilePath(const std::wstring& path); #endif //! Copy constructor. vtkDICOMFilePath(const vtkDICOMFilePath&); //! Destructor. ~vtkDICOMFilePath(); //@} //@{ //! Get the path as a string. const std::string& AsString() const { return this->Path; } //@} //@{ //! Check if the path is empty. bool IsEmpty() const { return (this->Path.length() == 0); } //! Check if the path is a root path. bool IsRoot() const; //! Check whether the path is an existing directory. bool IsDirectory() const; //! Check whether the path goes to a device, socket, or pipe. bool IsSpecial() const; //! Check whether the path is a symbolic link. bool IsSymlink() const; //@} //@{ //! Return the path joined with the given extra component. std::string Join(const std::string& second) const; //@} //@{ //! Get the final component of the path. std::string GetBack() const; //! Remove a component from the path. void PopBack(); //! Add a new component (or components) to the path. void PushBack(const std::string& path); //@} //@{ //! Get the file extension (the final dot and everything after). std::string GetExtension() const; //! Remove the current file extension, including the dot. void PopExtension(); //! Add a new file extension to the current file path. void PushExtension(const std::string& path); //@} //@{ //! Get the full absolute path (or empty string if file doesn't exist). /*! * This will go to the file system to find the true path to a file, * including exactly the same case as used by the file system. On * Windows, all forward slashes will be converted to back slashes, * and the returned file name will have a \\?\ prefix to indicate * that extended path processing should be used. */ std::string GetRealPath() const; //@} #ifdef _WIN32 //@{ //! Convert the path to a wchar_t pointer for Windows methods. /*! * Call this method if the path is going to be passed to a Windows * method that expects a unicode string. */ const wchar_t *Wide(); //! Convert the path to a local 8-bit string for Windows methods. /*! * Call this method if the path is going to be passed to a Windows * method that expects an 8-bit string with the local encoding. */ const char *Local(); //@} #endif //@{ //! Assignment operator. vtkDICOMFilePath& operator=(const vtkDICOMFilePath&); //@} private: //! Check if the given character is a separator. static bool IsSeparator(char c) { #ifndef __WRAP__ #ifdef _WIN32 return (c == '/' || c == '\\'); #else return (c == '/'); #endif #endif } //! Strip the trailing slash, if present. static void StripTrailingSlash(std::string *path); //! Find the position of the extension (including the dot). static size_t ExtensionPosition(const std::string& path); //! Get the length of the "root device" part of the path. /*! * On UNIX, the root is '/' for absolute paths, and is empty for relative * paths. On Windows, the root includes the device letter plus any slash * that immediately follows it, or the network share path for UNC paths. */ static size_t RootLength(const std::string& path); #ifdef _WIN32 //! Check if an extended path prefix is present. static bool HasExtendedPrefix(const std::string& path); //! Get the drive letter (or zero if none). static char DriveLetter(const std::string& path); //! Convert to WideChar. Returns NULL or new string (free with delete []). static wchar_t *ConvertToWideChar(const char *filename); //! Convert to utf8. Returns NULL or new string (free with delete []). static char *ConvertToUTF8(const wchar_t *filename); //! Convert to local 8-bit. Returns NULL or new string (free with delete []). static char *ConvertToLocal(const wchar_t *filename); #endif std::string Path; char Separator; #ifdef _WIN32 wchar_t *WidePath; char *LocalPath; #endif }; #endif /* vtkDICOMFilePath_h */ // VTK-HeaderTest-Exclude: vtkDICOMFilePath.h vtk-dicom-0.8.12/Source/vtkDICOMFileSorter.cxx000066400000000000000000000421031356440565500210570ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMFileSorter.h" #include "vtkDICOMFile.h" #include "vtkDICOMFileDirectory.h" #include "vtkDICOMFilePath.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMCharacterSet.h" #include "vtkObjectFactory.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkErrorCode.h" #include "vtkCommand.h" #include "vtkUnsignedShortArray.h" #include #include #include #include #include // For compatibility with new VTK generic data arrays #ifdef vtkGenericDataArray_h #define SetTupleValue SetTypedTuple #define GetTupleValue GetTypedTuple #define InsertNextTupleValue InsertNextTypedTuple #endif vtkStandardNewMacro(vtkDICOMFileSorter); //---------------------------------------------------------------------------- // A vector of string arrays class vtkDICOMFileSorter::StringArrayVector : public std::vector > { }; //---------------------------------------------------------------------------- // Information used to sort DICOM files. struct vtkDICOMFileSorter::FileInfo { std::string FileName; vtkDICOMValue StudyUID; vtkDICOMValue SeriesUID; vtkDICOMValue InstanceUID; unsigned int InstanceNumber; }; bool vtkDICOMFileSorter::CompareInstance( const FileInfo &fi1, const FileInfo &fi2) { return (fi1.InstanceNumber < fi2.InstanceNumber); } //---------------------------------------------------------------------------- // A temporary container class for use with stl algorithms class vtkDICOMFileSorter::FileInfoVectorList : public std::list > { }; //---------------------------------------------------------------------------- vtkDICOMFileSorter::vtkDICOMFileSorter() { this->InputFileName = 0; this->InputFileNames = 0; this->OutputFileNames = vtkStringArray::New(); this->Series = new StringArrayVector; this->Studies = vtkIntArray::New(); this->Studies->SetNumberOfComponents(2); this->ErrorCode = 0; this->InternalFileName = 0; this->RequirePixelData = 1; } //---------------------------------------------------------------------------- vtkDICOMFileSorter::~vtkDICOMFileSorter() { if (this->InputFileName) { delete [] this->InputFileName; } if (this->InputFileNames) { this->InputFileNames->Delete(); } if (this->InternalFileName) { delete [] this->InternalFileName; } this->OutputFileNames->Delete(); delete this->Series; this->Studies->Delete(); } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); const char *inputFileName = this->GetInputFileName(); os << indent << "InputFileName: " << (inputFileName ? inputFileName : "(NULL)") << "\n"; os << indent << "InputFileNames: (" << this->GetInputFileNames() << ")\n"; os << indent << "RequirePixelData: " << (this->RequirePixelData ? "On\n" : "Off\n"); os << indent << "NumberOfSeries: " << this->GetNumberOfSeries() << "\n"; os << indent << "NumberOfStudies: " << this->GetNumberOfStudies() << "\n"; os << indent << "OutputFileNames: (" << this->GetOutputFileNames() << ")\n"; } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::SetInputFileName(const char *name) { // mutual exclusion with InputFileNames if (name) { this->SetInputFileNames(0); } if (name == this->InputFileName || (name && this->InputFileName && strcmp(name, this->InputFileName) == 0)) { return; } delete [] this->InputFileName; this->InputFileName = 0; if (name) { char *cp = new char[strlen(name) + 1]; strcpy(cp, name); this->InputFileName = cp; } this->Modified(); } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::SetInputFileNames(vtkStringArray *input) { // mutual exclusion with InputFileName if (input) { this->SetInputFileName(0); } vtkSetObjectBodyMacro(InputFileNames, vtkStringArray, input); } //---------------------------------------------------------------------------- int vtkDICOMFileSorter::GetNumberOfSeries() { return static_cast(this->Series->size()); } //---------------------------------------------------------------------------- int vtkDICOMFileSorter::GetNumberOfStudies() { return this->Studies->GetNumberOfTuples(); } //---------------------------------------------------------------------------- int vtkDICOMFileSorter::GetFirstSeriesForStudy(int study) { int tval[2]; this->Studies->GetTupleValue(study, tval); return tval[0]; } //---------------------------------------------------------------------------- int vtkDICOMFileSorter::GetLastSeriesForStudy(int study) { int tval[2]; this->Studies->GetTupleValue(study, tval); return tval[1]; } //---------------------------------------------------------------------------- vtkStringArray *vtkDICOMFileSorter::GetFileNamesForSeries(int i) { return (*this->Series)[i]; } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::AddSeriesFileNames(int study, vtkStringArray *files) { vtkIdType n = this->Studies->GetNumberOfTuples(); int st[2]; if (study == n) { st[0] = static_cast(this->Series->size()); st[1] = st[0]; this->Studies->InsertNextTupleValue(st); } else if (n >= 0 && study == n-1) { this->Studies->GetTupleValue(study, st); st[1]++; this->Studies->SetTupleValue(study, st); } else { vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study"); } this->Series->push_back(files); } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::SortFiles(vtkStringArray *input) { vtkSmartPointer groups = vtkSmartPointer::New(); vtkSmartPointer meta = vtkSmartPointer::New(); vtkSmartPointer parser = vtkSmartPointer::New(); parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMFileSorter::RelayError); groups->InsertNextValue(0x0008); groups->InsertNextValue(0x0020); parser->SetMetaData(meta); parser->SetGroups(groups); FileInfoVectorList sortedFiles; FileInfoVectorList::iterator li; vtkIdType numberOfStrings = input->GetNumberOfValues(); for (vtkIdType j = 0; j < numberOfStrings; j++) { const std::string& fileName = input->GetValue(j); this->SetInternalFileName(fileName.c_str()); int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In); if (code == vtkDICOMFile::FileIsDirectory) { // Skip anything that is a directory continue; } else if (code != 0) { const char *errText = "Can't open the file "; this->SetErrorCode(vtkErrorCode::CannotOpenFileError); if (code == vtkDICOMFile::AccessDenied) { errText = "No permission to read the file "; } else if (code == vtkDICOMFile::FileNotFound) { errText = "File not found "; } else if (code == vtkDICOMFile::ImpossiblePath) { errText = "Bad file path "; } vtkErrorMacro("SortFiles: " << errText << this->InternalFileName); continue; } // Read the file metadata meta->Initialize(); this->SetInternalFileName(fileName.c_str()); parser->SetFileName(fileName.c_str()); parser->Update(); if (!parser->GetPixelDataFound()) { if (!this->ErrorCode) { this->ErrorCode = parser->GetErrorCode(); } if (this->ErrorCode || this->RequirePixelData) { continue; } } // Insert the file into the sorted list FileInfo fileInfo; fileInfo.FileName = fileName; fileInfo.StudyUID = meta->Get(DC::StudyInstanceUID); fileInfo.SeriesUID = meta->Get(DC::SeriesInstanceUID); fileInfo.InstanceUID = meta->Get(DC::SOPInstanceUID); fileInfo.InstanceNumber = meta->Get(DC::InstanceNumber).AsUnsignedInt(); const char *studyUID = fileInfo.StudyUID.GetCharData(); const char *seriesUID = fileInfo.SeriesUID.GetCharData(); bool foundSeries = false; for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li) { // compare studyId first, then seriesId int c1 = vtkDICOMUtilities::CompareUIDs( studyUID, (*li)[0].StudyUID.GetCharData()); int c2 = 0; if (c1 == 0) { c2 = vtkDICOMUtilities::CompareUIDs( seriesUID, (*li)[0].SeriesUID.GetCharData()); } if (c1 == 0 && c2 == 0 && seriesUID != 0) { (*li).push_back(fileInfo); foundSeries = true; break; } else if (c1 >= 0 || (c1 == 0 && c2 >= 0)) { break; } } if (!foundSeries) { std::vector newSeries; newSeries.push_back(fileInfo); sortedFiles.insert(li, newSeries); } } // Sort each series by InstanceNumber int studyCount = 0; vtkDICOMValue lastStudyUID; for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li) { std::vector &v = *li; std::stable_sort(v.begin(), v.end(), CompareInstance); // Is this a new study? if (studyCount == 0 || v[0].StudyUID != lastStudyUID) { lastStudyUID = v[0].StudyUID; studyCount++; } // Check for duplicate instances, put them into a new series vtkIdType n = static_cast(v.size()); std::vector duplicate(n); std::vector seriesLength; seriesLength.push_back(0); vtkIdType numberOfDuplicates = 0; for (vtkIdType i = 0; i < n; i++) { const vtkDICOMValue& uid = v[i].InstanceUID; vtkIdType count = 0; if (uid.GetVL() > 0) { for (vtkIdType j = 0; j < i; j++) { if (v[j].InstanceUID == uid) { count++; } } } duplicate[i] = count; if (count > numberOfDuplicates) { numberOfDuplicates = count; seriesLength.push_back(0); } seriesLength[count]++; } for (vtkIdType k = 0; k <= numberOfDuplicates; k++) { vtkSmartPointer sa = vtkSmartPointer::New(); sa->SetNumberOfValues(seriesLength[k]); vtkIdType j = 0; for (vtkIdType i = 0; i < n; i++) { if (duplicate[i] == k) { sa->SetValue(j++, v[i].FileName); } } this->AddSeriesFileNames(studyCount - 1, sa); } } } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::Execute() { // Clear the output this->OutputFileNames->Reset(); this->Series->clear(); this->Studies->Reset(); this->SetInternalFileName(0); this->ErrorCode = 0; if (this->InputFileName) // The input was a single file { int code = vtkDICOMFile::Access(this->InputFileName, vtkDICOMFile::In); if (code == vtkDICOMFile::FileNotFound) { this->ErrorCode = vtkErrorCode::FileNotFoundError; vtkErrorMacro("File or directory not found: " << this->InputFileName); return; } else if (code == vtkDICOMFile::FileIsDirectory) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Named file is a directory: " << this->InputFileName); return; } else if (code == vtkDICOMFile::AccessDenied) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Permission denied: " << this->InputFileName); return; } else if (code == vtkDICOMFile::ImpossiblePath) { this->ErrorCode = vtkErrorCode::CannotOpenFileError; vtkErrorMacro("Bad file path: " << this->InputFileName); return; } else if (code != 0) { this->ErrorCode = vtkErrorCode::UnknownError; vtkErrorMacro("Unknown file error: " << this->InputFileName); return; } vtkDICOMParser *parser = vtkDICOMParser::New(); parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMFileSorter::RelayError); this->SetInternalFileName(this->InputFileName); parser->SetFileName(this->InputFileName); parser->Update(); int pixelDataFound = parser->GetPixelDataFound(); unsigned long errorCode = parser->GetErrorCode(); parser->Delete(); if (!pixelDataFound) { if (!errorCode) { this->ErrorCode = vtkErrorCode::FileFormatError; vtkErrorMacro("Not a DICOM image: " << this->InputFileName); } else if (!this->ErrorCode) { this->ErrorCode = errorCode; } return; } // Find the path to the file vtkDICOMFilePath path(this->InputFileName); // Create a glob pattern std::string base = path.GetBack(); std::string ext = path.GetExtension(); std::string pattern = "*"; if (ext == ".dc" || ext == ".dcm" || ext == ".DC" || ext == ".DCM") { pattern += ext; } path.PopBack(); std::string dirname = path.AsString(); // Find all the files that match the pattern vtkDICOMFileDirectory d(dirname.c_str()); // Create a vtkStringArray from the matching files vtkSmartPointer array = vtkSmartPointer::New(); if (d.GetError() == 0) { int n = d.GetNumberOfEntries(); for (int i = 0; i < n; i++) { const char *filename = d.GetEntry(i); if (vtkDICOMUtilities::PatternMatches(pattern.c_str(), filename) && !d.IsDirectory(i)) { path.PushBack(filename); array->InsertNextValue(path.AsString()); path.PopBack(); } } } // Sort the files this->SortFiles(array); // Find the series that the original file belonged to. Do the search // twice, once with case-sensitivity and once without bool done = false; for (int caseless = 0; !done && caseless < 2; caseless++) { if (caseless) { vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192); base = cs.CaseFoldedUTF8(base.data(), base.length()); } for (size_t j = 0; j < this->Series->size() && !done; j++) { vtkStringArray *sa = (*this->Series)[j]; for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++) { std::string tmp = vtkDICOMFilePath(sa->GetValue(k)).GetBack(); if (caseless) { vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192); tmp = cs.CaseFoldedUTF8(tmp.data(), tmp.length()); } if (tmp == base) { this->OutputFileNames->DeepCopy(sa); done = true; break; } } } } // This should never happen if (!done) { vtkErrorMacro("Pattern didn't match original file."); } } else if (this->InputFileNames) // The input was a list of files { this->SortFiles(this->InputFileNames); for (size_t j = 0; j < this->Series->size(); j++) { vtkStringArray *sa = (*this->Series)[j]; for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++) { this->OutputFileNames->InsertNextValue(sa->GetValue(k)); } } } } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::Update() { if (this->GetMTime() > this->UpdateTime.GetMTime() || (this->InputFileNames && this->InputFileNames->GetMTime() > this->UpdateTime.GetMTime())) { this->Execute(); this->UpdateTime.Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::SetInternalFileName(const char *name) { if (this->InternalFileName == NULL && name == NULL) { return; } if (this->InternalFileName != 0 && name != 0 && strcmp(this->InternalFileName, name) == 0) { return; } if (this->InternalFileName) { delete [] this->InternalFileName; } if (name) { size_t n = strlen(name) + 1; char *cp1 = new char[n]; const char *cp2 = (name); this->InternalFileName = cp1; do { *cp1++ = *cp2++; } while (--n); } else { this->InternalFileName = 0; } } //---------------------------------------------------------------------------- void vtkDICOMFileSorter::RelayError(vtkObject *o, unsigned long e, void *data) { if (e == vtkCommand::ErrorEvent) { vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); if (parser) { this->SetErrorCode(parser->GetErrorCode()); this->SetInternalFileName(parser->GetFileName()); } vtkErrorMacro(<< static_cast(data)); } else { this->InvokeEvent(e, data); } } vtk-dicom-0.8.12/Source/vtkDICOMFileSorter.h000066400000000000000000000120111356440565500204770ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMFileSorter_h #define vtkDICOMFileSorter_h #include "vtkObject.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkStringArray; class vtkIntArray; class vtkDICOMMetaData; //! Sort DICOM files and group them by study and series. /*! * If a list of input files is provided via SetInputFileNames(), then * the files will be grouped by study and series, and each series will * be sorted by InstanceNumber. If a single input file is provided via * SetInputFileName(), then other files in the same series will be found, * and the series will be sorted by InstanceNumber. */ class VTKDICOM_EXPORT vtkDICOMFileSorter : public vtkObject { public: vtkTypeMacro(vtkDICOMFileSorter,vtkObject); void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; static vtkDICOMFileSorter *New(); //@{ //! Set one file from the desired series. /*! * When Update() is called, all files that belong to the * same series as the specified file will be identified * and can be retrieved by calling GetOutputFileNames(). */ void SetInputFileName(const char *name); const char *GetInputFileName() { return this->InputFileName; } //@} //@{ //! Set a list of file names to group and sort. /*! * This method is mutually exclusive with SetInputFileName(). * If you call this method, then InputFileName will be set to NULL * and vice versa. */ void SetInputFileNames(vtkStringArray *input); vtkStringArray *GetInputFileNames() { return this->InputFileNames; } //@} //@{ //! Update the information about the files. /*! * This method must be called before any of the Get methods. */ virtual void Update(); //@} //@{ //! Get the total number of series that were found. int GetNumberOfSeries(); //! Get the number of studies that were found. int GetNumberOfStudies(); //! Get the first series for a particular study. int GetFirstSeriesForStudy(int study); //! Get the last series (inclusive) for a particular study. int GetLastSeriesForStudy(int study); //@} //@{ //! Get the full list of sorted filenames. vtkStringArray *GetOutputFileNames() { return this->OutputFileNames; } //! Get the file names for a specific series. vtkStringArray *GetFileNamesForSeries(int i); //@} //@{ //! Get the error code. unsigned long GetErrorCode() { return this->ErrorCode; } //! Get the filename associated with the error code. const char *GetInternalFileName() { return this->InternalFileName; } //@} //@{ //! If this is On, files with no pixel data will be skipped. /*! * This is On by default. Some files, such as dicom directory files, * have metadata but have no images. Usually we want to skip these. */ vtkSetMacro(RequirePixelData, int); vtkBooleanMacro(RequirePixelData, int); int GetRequirePixelData() { return this->RequirePixelData; } //@} protected: vtkDICOMFileSorter(); ~vtkDICOMFileSorter(); const char *InputFileName; vtkStringArray *InputFileNames; vtkStringArray *OutputFileNames; int RequirePixelData; vtkTimeStamp UpdateTime; unsigned long ErrorCode; char *InternalFileName; //! Fill the output filename array. virtual void Execute(); //! Sort the input string array virtual void SortFiles(vtkStringArray *input); //! Add a sorted series to output. /*! * This method is called from SortFiles to provide the files * that make up one series. The study that the files belong * to must also be provided, as a number that starts at zero * and monotonically increases. */ void AddSeriesFileNames(int study, vtkStringArray *files); //! Description: // Convert parser errors into sorter errors. void RelayError(vtkObject *o, unsigned long e, void *data); //! Description: // Set the name of the file currently being operated on. void SetInternalFileName(const char *fname); //! Set the error code. void SetErrorCode(unsigned long e) { this->ErrorCode = e; } private: #ifdef VTK_DICOM_DELETE vtkDICOMFileSorter(const vtkDICOMFileSorter&) VTK_DICOM_DELETE; void operator=(const vtkDICOMFileSorter&) VTK_DICOM_DELETE; #else vtkDICOMFileSorter(const vtkDICOMFileSorter&) = delete; void operator=(const vtkDICOMFileSorter&) = delete; #endif class StringArrayVector; struct FileInfo; class FileInfoVectorList; StringArrayVector *Series; vtkIntArray *Studies; //! Compare FileInfo entries by instance number static bool CompareInstance(const FileInfo &fi1, const FileInfo &fi2); }; #endif vtk-dicom-0.8.12/Source/vtkDICOMGenerator.cxx000066400000000000000000001610721356440565500207360ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMGenerator.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkDICOMMetaDataAdapter.h" #include "vtkDICOMUIDGenerator.h" #include "vtkDICOMUtilities.h" #include "vtkObjectFactory.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkImageData.h" #include "vtkPointData.h" #include "vtkInformation.h" #include "vtkMatrix4x4.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkDataSetAttributes.h" #include "vtkSmartPointer.h" #include #include // For compatibility with new VTK generic data arrays #ifdef vtkGenericDataArray_h #define SetTupleValue SetTypedTuple #endif vtkStandardNewMacro(vtkDICOMGenerator); vtkCxxSetObjectMacro(vtkDICOMGenerator,PatientMatrix,vtkMatrix4x4); vtkCxxSetObjectMacro(vtkDICOMGenerator,SourceMetaData,vtkDICOMMetaData); vtkCxxSetObjectMacro(vtkDICOMGenerator,UIDGenerator,vtkDICOMUIDGenerator); //---------------------------------------------------------------------------- vtkDICOMGenerator::vtkDICOMGenerator() { this->MetaData = 0; this->SourceMetaData = 0; this->UIDGenerator = 0; this->Extended = 0; this->MultiFrame = 0; this->OriginAtBottom = 1; this->ReverseSliceOrder = 0; this->ScalarType = 0; this->AllowedPixelRepresentation = 3; this->AllowedBitsStored = 0xffffffffu; this->NumberOfColorComponents = 1; this->NumberOfFrames = 0; this->TimeAsVector = 0; this->TimeDimension = 0; this->TimeSpacing = 1.0; this->RescaleIntercept = 0.0; this->RescaleSlope = 1.0; this->NumberOfOverlays = 0; this->PatientMatrix = 0; this->SliceIndexArray = vtkIntArray::New(); this->ComponentIndexArray = vtkIntArray::New(); this->SourceInstanceArray = 0; this->RangeArray = 0; this->PixelValueRange[0] = 0; this->PixelValueRange[1] = -1; for (int i = 0; i < 5; i++) { this->Dimensions[i] = 0; this->Spacing[i] = 0; this->Origin[i] = 0; } } //---------------------------------------------------------------------------- vtkDICOMGenerator::~vtkDICOMGenerator() { if (this->RangeArray) { this->RangeArray->Delete(); } if (this->SourceInstanceArray) { this->SourceInstanceArray->Delete(); } if (this->SliceIndexArray) { this->SliceIndexArray->Delete(); } if (this->ComponentIndexArray) { this->ComponentIndexArray->Delete(); } if (this->PatientMatrix) { this->PatientMatrix->Delete(); } if (this->UIDGenerator) { this->UIDGenerator->Delete(); } if (this->SourceMetaData) { this->SourceMetaData->Delete(); } if (this->MetaData) { this->MetaData->Delete(); } } //---------------------------------------------------------------------------- vtkDICOMMetaData *vtkDICOMGenerator::GetMetaData() { return this->MetaData; } //---------------------------------------------------------------------------- vtkDICOMMetaData *vtkDICOMGenerator::GetSourceMetaData() { return this->SourceMetaData; } //---------------------------------------------------------------------------- void vtkDICOMGenerator::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "MetaData: "; if (this->MetaData) { os << this->MetaData << "\n"; } else { os << "(none)\n"; } os << indent << "SourceMetaData: "; if (this->SourceMetaData) { os << this->SourceMetaData << "\n"; } else { os << "(none)\n"; } os << indent << "UIDGenerator: "; if (this->UIDGenerator) { os << this->UIDGenerator << "\n"; } else { os << "(none)\n"; } os << indent << "SliceIndexArray: "; if (this->SliceIndexArray) { os << this->SliceIndexArray << "\n"; } else { os << "(none)\n"; } os << indent << "ComponentIndexArray: "; if (this->ComponentIndexArray) { os << this->ComponentIndexArray << "\n"; } else { os << "(none)\n"; } os << indent << "MultiFrame: " << (this->MultiFrame ? "On\n" : "Off\n"); os << indent << "Extended: " << (this->Extended ? "On\n" : "Off\n"); os << indent << "OriginAtBottom: " << (this->OriginAtBottom ? "On\n" : "Off\n"); os << indent << "ReverseSliceOrder: " << (this->ReverseSliceOrder ? "On\n" : "Off\n"); os << indent << "TimeAsVector: " << (this->TimeAsVector ? "On\n" : "Off\n"); os << indent << "TimeDimension: " << this->TimeDimension << "\n"; os << indent << "TimeSpacing: " << this->TimeSpacing << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "NumberOfOverlays: " << this->NumberOfOverlays << "\n"; os << indent << "PatientMatrix:"; if (this->PatientMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } } //---------------------------------------------------------------------------- vtkDICOMUIDGenerator *vtkDICOMGenerator::GetUIDGenerator() { vtkDICOMUIDGenerator *uidgen = this->UIDGenerator; if (uidgen == 0) { uidgen = vtkDICOMUIDGenerator::GetDefault(); } return uidgen; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateInstance(vtkInformation *info) { this->InitializeMetaData(info); this->CopyAttributes(NULL, this->SourceMetaData); // create new SOP instance and series instance UIDs vtkDICOMMetaData *meta = this->MetaData; int n = meta->GetNumberOfInstances(); vtkSmartPointer uids = vtkSmartPointer::New(); uids->SetNumberOfValues(n); this->GenerateUIDs(DC::SOPInstanceUID, uids); for (int i = 0; i < n; i++) { meta->Set(i, DC::SOPInstanceUID, uids->GetValue(i)); } meta->Set(DC::SeriesInstanceUID, this->GenerateUID(DC::SeriesInstanceUID)); return true; } //---------------------------------------------------------------------------- std::string vtkDICOMGenerator::GenerateUID(vtkDICOMTag tag) { return this->GetUIDGenerator()->GenerateUID(tag); } //---------------------------------------------------------------------------- void vtkDICOMGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids) { return this->GetUIDGenerator()->GenerateUIDs(tag, uids); } //---------------------------------------------------------------------------- void vtkDICOMGenerator::ComputeAspectRatio( const double spacing[2], int aspect[2]) { // compute aspect ratio to within one part in 1000 static const short primes[] = { // include 1 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 0 }; double a = spacing[1]/spacing[0]; int xaspect = 1; int yaspect = 1; double minrem = fabs(a - 1.0); for (int j = 0; primes[j] != 0; j++) { int x = primes[j]; double b = a*x; int y = static_cast(b + 0.5); double r = fabs(b - y); if (r < minrem) { minrem = r; yaspect = y; xaspect = x; } y = x; b = y/a; x = static_cast(b + 0.5); r = fabs(b - x); if (r < minrem) { minrem = r; yaspect = y; xaspect = x; } } aspect[0] = yaspect; aspect[1] = xaspect; } //---------------------------------------------------------------------------- void vtkDICOMGenerator::ComputeAdjustedMatrix( double matrix[16], double origin[3], double spacing[3]) { if (this->PatientMatrix) { vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix); } else { vtkMatrix4x4::Identity(matrix); } spacing[0] = this->Spacing[0]; spacing[1] = this->Spacing[1]; spacing[2] = this->Spacing[2]; origin[0] = this->Origin[0]; origin[1] = this->Origin[1]; origin[2] = this->Origin[2]; if (this->OriginAtBottom) { // move origin to the correct corner origin[1] -= spacing[1]*(this->Dimensions[1] - 1); matrix[1] = -matrix[1]; matrix[5] = -matrix[5]; matrix[9] = -matrix[9]; // also need to do z to keep a right-hand coord transformation spacing[2] = -spacing[2]; matrix[2] = -matrix[2]; matrix[6] = -matrix[6]; matrix[10] = -matrix[10]; } } //---------------------------------------------------------------------------- void vtkDICOMGenerator::ComputePositionAndOrientation( const double origin[3], const double mmat[16], double position[3], double orientation[6]) { // find new offset by multiplying the origin by the matrix double offset[4]; offset[0] = origin[0]; offset[1] = origin[1]; offset[2] = origin[2]; offset[3] = 1.0; vtkMatrix4x4::MultiplyPoint(mmat, offset, offset); position[0] = offset[0]; position[1] = offset[1]; position[2] = offset[2]; orientation[0] = mmat[0]; orientation[1] = mmat[4]; orientation[2] = mmat[8]; orientation[3] = mmat[1]; orientation[4] = mmat[5]; orientation[5] = mmat[9]; } //---------------------------------------------------------------------------- void vtkDICOMGenerator::ComputeDimensions( vtkInformation *info, int *nframes, int dims[5], double spacing[5], double origin[5]) { // get the scalar information vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation( info, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get( vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); // get the dimensions int extent[6]; info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); int numSlices = extent[5] - extent[4] + 1; // time is either in the slices or in the components int numTimeSlots = this->TimeDimension; if (numTimeSlots) { if (this->TimeAsVector) { if (numComponents % numTimeSlots == 0) { numComponents /= numTimeSlots; } else { numTimeSlots = 0; } } else { if (numSlices % numTimeSlots == 0) { numSlices /= numTimeSlots; } else { numTimeSlots = 0; } } } // if unsigned char, assume scalars are colors, not vector components if (scalarType == VTK_UNSIGNED_CHAR) { numComponents /= this->NumberOfColorComponents; if (numComponents < 2) { numComponents = 0; } } dims[0] = extent[1] - extent[0] + 1; dims[1] = extent[3] - extent[2] + 1; dims[2] = numSlices; dims[3] = numTimeSlots; dims[4] = numComponents; info->Get(vtkDataObject::SPACING(), spacing); info->Get(vtkDataObject::ORIGIN(), origin); // compute an adjusted origin origin[0] += extent[0]*spacing[0]; origin[1] += extent[2]*spacing[1]; origin[2] += extent[4]*spacing[2]; origin[3] = 0; origin[4] = 0; // get the dimension spacing if (!this->TimeAsVector && numTimeSlots > 1 && numSlices > 1) { // adjust spacing for multiple temporal positions per spatial position spacing[2] *= (numTimeSlots*numSlices - 1); spacing[2] /= (numSlices - 1); } spacing[3] = this->TimeSpacing; spacing[4] = 0.0; int n = (numSlices ? numSlices : 1); n *= (numTimeSlots ? numTimeSlots : 1); n *= (numComponents ? numComponents : 1); *nframes = n; } //---------------------------------------------------------------------------- void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta) { if (this->SourceInstanceArray) { this->SourceInstanceArray->Delete(); this->SourceInstanceArray = 0; } // make sure there is sourcemeta data to compare with if (!sourcemeta) { return; } // create an adapter to handle enhanced multi-frame source vtkDICOMMetaDataAdapter source(sourcemeta); double spacing[3], origin[3]; double matrix[16]; this->ComputeAdjustedMatrix(matrix, origin, spacing); this->SourceInstanceArray = vtkIntArray::New(); this->SourceInstanceArray->SetNumberOfComponents(1); this->SourceInstanceArray->SetNumberOfTuples( this->MetaData->GetNumberOfInstances()); int timeSlices = 1; if (!this->TimeAsVector && this->Dimensions[3] > 0) { timeSlices = this->Dimensions[3]; } // for keeping track of which source instances have been matched int m = source->GetNumberOfInstances(); bool *usedInstances = new bool[m]; for (int j = 0; j < m; j++) { usedInstances[j] = false; } bool mismatch = false; int n = this->MetaData->GetNumberOfInstances(); double zorigin = origin[2]; for (int i = 0; i < n && !mismatch; i++) { int sliceIdx = this->SliceIndexArray->GetComponent(i, 0); // remove the time from the slice index sliceIdx /= timeSlices; origin[2] = zorigin + sliceIdx*spacing[2]; double position[3], orientation[6]; vtkDICOMGenerator::ComputePositionAndOrientation( origin, matrix, position, orientation); // find the matching input instance, note that this only looks // for matching slice position and is not guaranteed to order // the 4th and 5th dimensions correctly bool foundOne = false; for (int j = 0; j < m; j++) { if (usedInstances[j]) { continue; } const vtkDICOMValue &p = source->Get(j, DC::ImagePositionPatient); const vtkDICOMValue &o = source->Get(j, DC::ImageOrientationPatient); if (p.GetNumberOfValues() == 3 && o.GetNumberOfValues() == 6) { double r[3], uv[6]; p.GetValues(r, 3); o.GetValues(uv, 6); double dd = 0.0; double uu = 0.0; double vv = 0.0; for (int k = 0; k < 3; k++) { double d = r[k] - position[k]; dd += d*d; double u = matrix[4*k] - uv[k]; uu += u*u; double v = matrix[4*k +1] - uv[k + 3]; vv += v*v; } if (dd/(spacing[2]*spacing[2]) < 1e-6 && uu < 1e-8 && vv < 1e-8) { this->SourceInstanceArray->SetComponent(i, 0, j); usedInstances[j] = true; foundOne = true; break; } } } mismatch = !foundOne; } delete [] usedInstances; if (mismatch) { this->SourceInstanceArray->Delete(); this->SourceInstanceArray = 0; } } //---------------------------------------------------------------------------- namespace { template void vtkDICOMGeneratorComputeHistogram( const T *ptr, vtkIdType n, int nComponents, int totalComponents, vtkIdType *histogram) { if (n > 0) { if (nComponents == totalComponents) { do { histogram[*ptr++]++; } while (--n > 0); } else if (nComponents == 1) { do { histogram[*ptr]++; ptr += totalComponents; n -= totalComponents; } while (n > 0); } else { do { int m = nComponents; do { histogram[*ptr++]++; } while (--m > 0); ptr += (totalComponents - nComponents); n -= totalComponents; } while (n > 0); } } } } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMGenerator::ComputePixelValueRange( vtkInformation *info, int seriesRange[2]) { // get the data and compute the range, this is tricky because the // vtkDataArray::GetRange() method computes the min/max for just // one component, but we need min/max over all components double range[2]; vtkImageData *data = vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT())); // if the extent is not the whole extent, then range cannot be computed int extent[6], wholeExtent[6]; data->GetExtent(extent); info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent); for (int i = 0; i < 6; i++) { if (extent[i] != wholeExtent[i]) { seriesRange[0] = 0; seriesRange[1] = -1; return; } } vtkDataArray *a = data->GetPointData()->GetScalars(); vtkIdType nt = a->GetNumberOfTuples(); vtkIdType nc = a->GetNumberOfComponents(); vtkDataArray *newArray = a->NewInstance(); newArray->SetNumberOfTuples(nt*nc); newArray->SetVoidArray(a->GetVoidPointer(0), nt*nc, true); newArray->GetRange(range); newArray->Delete(); seriesRange[0] = static_cast(range[0]); seriesRange[1] = static_cast(range[1]); if (this->RangeArray) { this->RangeArray->Delete(); this->RangeArray = 0; } if (this->ScalarType == VTK_UNSIGNED_SHORT || this->ScalarType == VTK_SHORT || this->ScalarType == VTK_SIGNED_CHAR || this->ScalarType == VTK_UNSIGNED_CHAR) { vtkIdType *h = new vtkIdType[seriesRange[1] - seriesRange[0] + 1]; vtkIdType *histogram = h - seriesRange[0]; int npixels = nt*nc; int npositions = (this->Dimensions[2] > 0 ? this->Dimensions[2] : 1); int ntimes = (this->Dimensions[3] > 0 ? this->Dimensions[3] : 1); int nvector = (this->Dimensions[4] > 0 ? this->Dimensions[4] : 1); int sliceSize = npixels/(npositions*ntimes); if (this->TimeAsVector) { sliceSize = npixels/npositions; } int nframes = this->SliceIndexArray->GetNumberOfComponents(); int ninstances = this->SliceIndexArray->GetNumberOfTuples(); int ntotal = nframes*ninstances; this->RangeArray = vtkIntArray::New(); this->RangeArray->SetNumberOfComponents(4); this->RangeArray->SetNumberOfTuples(ntotal); for (int i = 0; i < ninstances; i++) { for (int j = 0; j < nframes; j++) { int k = i*nframes + j; int idx = 0; int s = this->SliceIndexArray->GetComponent(i, j); int v = this->ComponentIndexArray->GetComponent(i, j); int n = nc/nvector; // ntimes*samplesPerPixel idx += s*sliceSize; if (this->TimeAsVector) { n /= ntimes; // samplesPerPixel int t = v/nvector; v = v % nvector; idx += t*nvector*n; } idx += v*n; void *ptr = a->GetVoidPointer(idx); for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++) { histogram[hi] = 0; } switch (this->ScalarType) { case VTK_UNSIGNED_SHORT: vtkDICOMGeneratorComputeHistogram( static_cast(ptr), sliceSize, n, nc, histogram); break; case VTK_SHORT: vtkDICOMGeneratorComputeHistogram( static_cast(ptr), sliceSize, n, nc, histogram); break; case VTK_UNSIGNED_CHAR: vtkDICOMGeneratorComputeHistogram( static_cast(ptr), sliceSize, n, nc, histogram); break; case VTK_SIGNED_CHAR: vtkDICOMGeneratorComputeHistogram( static_cast(ptr), sliceSize, n, nc, histogram); break; } // compute the min/max from the histogram, // also try to compute window/level as 99th percentile vtkIdType sum = 0; vtkIdType totalSum = (sliceSize/nc)*n; vtkIdType lowSum = static_cast(totalSum*0.01); vtkIdType highSum = static_cast(totalSum*0.99); int lowVal = seriesRange[0]; int highVal = seriesRange[0]; int minVal = seriesRange[0] - 1; int maxVal = seriesRange[0]; for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++) { vtkIdType b = histogram[hi]; sum += b; lowVal = (sum > lowSum ? lowVal : hi); highVal = (sum > highSum ? highVal : hi); minVal = (sum > 0 ? minVal : hi); maxVal = (b == 0 ? maxVal : hi); } if (minVal < maxVal) { minVal++; } // expand the window slightly, but keep within total range int lowExpansion = static_cast((highVal - lowVal)*0.1); int highExpansion = static_cast((highVal - lowVal)*0.1); lowVal -= lowExpansion; highVal += highExpansion; lowVal = (lowVal >= seriesRange[0] ? lowVal : seriesRange[0]); highVal = (highVal <= seriesRange[1] ? highVal : seriesRange[1]); int tp[4]; tp[0] = minVal; tp[1] = maxVal; tp[2] = lowVal; tp[3] = highVal; this->RangeArray->SetTupleValue(k, tp); } } delete [] h; } } //---------------------------------------------------------------------------- void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info) { if (this->MetaData) { this->MetaData->Delete(); } this->MetaData = vtkDICOMMetaData::New(); vtkDICOMMetaData *meta = this->MetaData; // get the scalar type vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation( info, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); this->ScalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); // get dimensions of the data set: x,y,z,t,v int nframes = 1; this->ComputeDimensions( info, &nframes, this->Dimensions, this->Spacing, this->Origin); int numSlices = (this->Dimensions[2] > 0 ? this->Dimensions[2] : 1); int numTimeSlots = (this->Dimensions[3] > 0 ? this->Dimensions[3] : 1); // compute the SliceIndexArray, either use one multi-frame file to save // the data or use a series of non-multi-frame files if (this->MultiFrame) { this->NumberOfFrames = nframes; this->SliceIndexArray->SetNumberOfComponents(nframes); this->SliceIndexArray->SetNumberOfTuples(1); this->ComponentIndexArray->SetNumberOfComponents(nframes); this->ComponentIndexArray->SetNumberOfTuples(1); meta->SetNumberOfInstances(1); } else { this->NumberOfFrames = 0; this->SliceIndexArray->SetNumberOfComponents(1); this->SliceIndexArray->SetNumberOfTuples(nframes); this->ComponentIndexArray->SetNumberOfComponents(1); this->ComponentIndexArray->SetNumberOfTuples(nframes); meta->SetNumberOfInstances(nframes); } // Reversing slice ordering isn't necessary if the ImagePlane module // is present, because then every file has an ImagePositionPatient, // but if only a Location is present then slice ordering is critical. bool reverseSlices = (this->ReverseSliceOrder != 0); // If switchDimensions is true, then the vector dimension (or time // dimension) comes before the slice dimension in the files. bool switchDimensions = false; for (int k = 0; k < 4; k++) { int m = nframes/numSlices; int n = m/numTimeSlots; for (int i = 0; i < nframes; i++) { int componentIdx = (switchDimensions ? i / numSlices : i % m); int sliceIdx = (switchDimensions ? i % numSlices : i / m); sliceIdx = (reverseSlices ? (numSlices - sliceIdx - 1) : sliceIdx); if (!this->TimeAsVector) { int timeIdx = componentIdx / n; componentIdx = componentIdx % n; sliceIdx = sliceIdx*numTimeSlots + timeIdx; } this->SliceIndexArray->SetValue(i, sliceIdx); this->ComponentIndexArray->SetValue(i, componentIdx); } // Try to match each generated slice to an input slice this->MatchInstances(this->SourceMetaData); if (this->SourceInstanceArray) { // If MatchInstances generated a reversed array, try again with // the slices in the opposite order. if (this->SourceInstanceArray->GetComponent(0, 0) > this->SourceInstanceArray->GetComponent(nframes-1, 0)) { reverseSlices = !reverseSlices; continue; } // If MatchInstances generated a shuffled array, try again with // a different dimension ordering. bool switched = false; for (int j = 1; j < nframes; j++) { if (this->SourceInstanceArray->GetComponent(j-1, 0) > this->SourceInstanceArray->GetComponent(j, 0)) { switchDimensions = !switchDimensions; switched = true; break; } } if (switched) { continue; } } break; } if (this->Extended) { // Copy all attributes, not just ones in the IOD modules for this class. // The module attribute values might be overwritten later. this->CopyAttributes(NULL, this->SourceMetaData); } this->ComputePixelValueRange(info, this->PixelValueRange); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::CopyRequiredAttributes( const DC::EnumType *tags, vtkDICOMMetaData *source) { vtkDICOMMetaData *meta = this->MetaData; if (source && source == this->SourceMetaData && this->SourceInstanceArray && source->Has(DC::PerFrameFunctionalGroupsSequence)) { while (*tags != DC::ItemDelimitationItem) { vtkDICOMTag tag = *tags++; vtkDICOMMetaDataAdapter sourceAdapter(source); bool nonevalid = true; int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int j = this->SourceInstanceArray->GetComponent(i, 0); const vtkDICOMValue& v = sourceAdapter->Get(j, tag); if (v.IsValid()) { nonevalid = false; meta->Set(i, tag, v); } } if (nonevalid) { // set the attribute to zero-length value. vtkDICOMVR vr = meta->FindDictVR(0, tag); if (vr != vtkDICOMVR::UN) { meta->Set(tag, vtkDICOMValue(vr)); } } } } else if (source) { while (*tags != DC::ItemDelimitationItem) { vtkDICOMTag tag = *tags++; vtkDICOMDataElementIterator iter = source->Find(tag); if (iter != source->End()) { if (!iter->IsPerInstance()) { meta->Set(tag, iter->GetValue()); } else if (this->SourceInstanceArray && source == this->SourceMetaData) { int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int j = this->SourceInstanceArray->GetComponent(i, 0); meta->Set(i, tag, iter->GetValue(j)); } } } else { // set the attribute to zero-length value. vtkDICOMVR vr = meta->FindDictVR(0, tag); if (vr != vtkDICOMVR::UN) { meta->Set(tag, vtkDICOMValue(vr)); } } } } else { while (*tags != DC::ItemDelimitationItem) { vtkDICOMTag tag = *tags++; vtkDICOMVR vr = meta->FindDictVR(0, tag); if (vr != vtkDICOMVR::UN) { meta->Set(tag, vtkDICOMValue(vr)); } } } return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::CopyOptionalAttributes( const DC::EnumType *tags, vtkDICOMMetaData *source) { vtkDICOMMetaData *meta = this->MetaData; if (source && source == this->SourceMetaData && this->SourceInstanceArray && source->Has(DC::PerFrameFunctionalGroupsSequence)) { while (*tags != DC::ItemDelimitationItem) { vtkDICOMTag tag = *tags++; vtkDICOMMetaDataAdapter sourceAdapter(source); int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int j = this->SourceInstanceArray->GetComponent(i, 0); const vtkDICOMValue& v = sourceAdapter->Get(j, tag); if (v.IsValid()) { meta->Set(i, tag, v); } } } } else if (source) { while (*tags != DC::ItemDelimitationItem) { vtkDICOMTag tag = *tags++; vtkDICOMDataElementIterator iter = source->Find(tag); if (iter != source->End()) { if (!iter->IsPerInstance()) { meta->Set(tag, iter->GetValue()); } else if (this->SourceInstanceArray && source == this->SourceMetaData) { int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int j = this->SourceInstanceArray->GetComponent(i, 0); meta->Set(i, tag, iter->GetValue(j)); } } } } } return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::CopyAttributes( const DC::EnumType *blacklist, vtkDICOMMetaData *source) { vtkDICOMMetaData *meta = this->MetaData; if (source && source == this->SourceMetaData && this->SourceInstanceArray && source->Has(DC::PerFrameFunctionalGroupsSequence)) { // Not implemented for enhanced multi-frame DICOM files } else if (source) { vtkDICOMDataElementIterator iter = source->Begin(); vtkDICOMDataElementIterator iterEnd = source->End(); for (;iter != iterEnd; ++iter) { vtkDICOMTag tag = iter->GetTag(); bool blacklisted = false; if (blacklist) { const DC::EnumType *tags = blacklist; while (*tags != DC::ItemDelimitationItem) { if (static_cast(*tags++) == tag.GetKey()) { blacklisted = true; break; } } } if (!blacklisted) { if (!iter->IsPerInstance()) { meta->Set(tag, iter->GetValue()); } else if (this->SourceInstanceArray && source == this->SourceMetaData) { int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int j = this->SourceInstanceArray->GetComponent(i, 0); meta->Set(i, tag, iter->GetValue(j)); } } } } } return true; } //---------------------------------------------------------------------------- void vtkDICOMGenerator::SetPixelRestrictions( unsigned int pixelRepresentation, unsigned int bitsStored, int colorComponents) { this->AllowedPixelRepresentation = pixelRepresentation; this->AllowedBitsStored = bitsStored; this->NumberOfColorComponents = colorComponents; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateSOPCommonModule( vtkDICOMMetaData *source, const char *SOPClass) { // set the SOP class UID and instance UIDs vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::SOPClassUID, SOPClass); int n = meta->GetNumberOfInstances(); vtkSmartPointer uids = vtkSmartPointer::New(); uids->SetNumberOfValues(n); this->GenerateUIDs(DC::SOPInstanceUID, uids); for (int i = 0; i < n; i++) { meta->Set(i, DC::SOPInstanceUID, uids->GetValue(i)); } // set the InstanceCreationDate and Time const char *tz = 0; if (source) { tz = source->Get(DC::TimezoneOffsetFromUTC).GetCharData(); } std::string dt = vtkDICOMUtilities::GenerateDateTime(tz); meta->Set(DC::InstanceCreationDate, dt.substr(0, 8)); meta->Set(DC::InstanceCreationTime, dt.substr(8, 13)); // These optional attributes should be left alone for now // DC::InstanceCreatorUID // DC::SOPInstanceStatus, // caution // DC::SOPAuthorizationDateTime, // caution // DC::SOPAuthorizationComment, // caution // DC::AuthorizationEquipmentCertificationNumber, // caution // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::SpecificCharacterSet, // 1C DC::RelatedGeneralSOPClassUID, // set to original class if SC DC::OriginalSpecializedSOPClassUID, // set to original class if SC DC::CodingSchemeIdentificationSequence, DC::TimezoneOffsetFromUTC, DC::ContributingEquipmentSequence, DC::InstanceNumber, // will be overwritten by General Image Module DC::EncryptedAttributesSequence, // 1C, per-instance? DC::OriginalAttributesSequence, DC::HL7StructuredDocumentReferenceSequence, // 1C DC::LongitudinalTemporalInformationModified, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GeneratePatientModule(vtkDICOMMetaData *source) { // required items: use simple read/write validation static const DC::EnumType required[] = { DC::PatientName, DC::PatientID, DC::PatientBirthDate, DC::PatientSex, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::ReferencedPatientSequence, DC::PatientBirthTime, DC::OtherPatientIDs, DC::OtherPatientIDsSequence, DC::OtherPatientNames, DC::EthnicGroup, DC::PatientComments, DC::PatientSpeciesDescription, // 1C (veterinary) DC::PatientSpeciesCodeSequence, // 1C (veterinary) DC::PatientBreedDescription, // 2C (veterinary) DC::PatientBreedCodeSequence, // 2C (veterinary) DC::BreedRegistrationSequence, // 2C (veterinary) DC::ResponsiblePerson, // 2C (veterinary) DC::ResponsiblePersonRole, // 1C (veterinary) DC::ResponsibleOrganization, // 2C (veterinary) DC::PatientIdentityRemoved, DC::DeidentificationMethod, DC::DeidentificationMethodCodeSequence, DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateClinicalTrialSubjectModule( vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::ClinicalTrialSponsorName, // 1 DC::ClinicalTrialProtocolID, // 1 DC::ClinicalTrialProtocolName,// 2 DC::ClinicalTrialSiteID, // 2 DC::ClinicalTrialSubjectID, // 1C DC::ClinicalTrialSubjectReadingID, // 1C DC::ClinicalTrialProtocolEthicsCommitteeName, // 1C DC::ClinicalTrialProtocolEthicsCommitteeApprovalNumber, // 3 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateGeneralStudyModule(vtkDICOMMetaData *source) { // The StudyInstanceUID is mandatory. std::string studyUID; if (source) { studyUID = source->Get(DC::StudyInstanceUID).AsString(); } if (studyUID == "") { studyUID = this->GenerateUID(DC::StudyInstanceUID); } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::StudyInstanceUID, studyUID); // required items: use simple read/write validation static const DC::EnumType required[] = { DC::StudyDate, DC::StudyTime, DC::ReferringPhysicianName, DC::StudyID, DC::AccessionNumber, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::ReferringPhysicianIdentificationSequence, DC::IssuerOfAccessionNumberSequence, DC::StudyDescription, DC::PhysiciansOfRecord, DC::PhysiciansOfRecordIdentificationSequence, DC::NameOfPhysiciansReadingStudy, DC::PhysiciansReadingStudyIdentificationSequence, DC::RequestingServiceCodeSequence, DC::ReferencedStudySequence, DC::ProcedureCodeSequence, DC::ReasonForPerformedProcedureCodeSequence, DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GeneratePatientStudyModule( vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::AdmittingDiagnosesDescription, // 3 DC::AdmittingDiagnosesCodeSequence, // 3 DC::PatientAge, // 3 DC::PatientSize, // 3 DC::PatientWeight, // 3 DC::PatientSizeCodeSequence, // 3 DC::Occupation, // 3 DC::AdditionalPatientHistory, // 3 DC::AdmissionID, // 3 DC::IssuerOfAdmissionIDSequence, // 3 DC::ServiceEpisodeID, // 3 DC::IssuerOfServiceEpisodeID, // 3 DC::ServiceEpisodeDescription, // 3 DC::PatientSexNeutered, // 2C DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateClinicalTrialStudyModule( vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::ClinicalTrialTimePointID, // 2 DC::ClinicalTrialTimePointDescription, // 3 DC::ConsentForClinicalTrialUseSequence, // 3 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateGeneralSeriesModule(vtkDICOMMetaData *source) { // The SeriesUID is mandatory and must be unique. vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::SeriesInstanceUID, this->GenerateUID(DC::SeriesInstanceUID)); // The modality is mandatory, it cannot be left blank, // and it must agree with the SOP Class IOD. std::string m; if (source) { m = source->Get(DC::Modality).AsString(); } if (m == "") { m = "OT"; // Other, i.e. unknown } meta->Set(DC::Modality, m); // Set pixel min/max information if (this->ScalarType != VTK_INT && this->ScalarType != VTK_UNSIGNED_INT) { // Get the pixel VR vtkDICOMVR pixelVR = vtkDICOMVR::US; if (this->ScalarType == VTK_SIGNED_CHAR || this->ScalarType == VTK_SHORT) { pixelVR = vtkDICOMVR::SS; } // Force it to conform the VRs allowed by the SOP Class if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0) { pixelVR = vtkDICOMVR::US; } else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0) { pixelVR = vtkDICOMVR::SS; } // These are optional, but very nice to have if (this->PixelValueRange[0] <= this->PixelValueRange[1]) { meta->Set(DC::SmallestPixelValueInSeries, vtkDICOMValue(pixelVR, this->PixelValueRange[0])); meta->Set(DC::LargestPixelValueInSeries, vtkDICOMValue(pixelVR, this->PixelValueRange[1])); } } // required items: use simple read/write validation DC::EnumType required[] = { DC::SeriesNumber, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::Laterality, // 2C DC::SeriesDate, DC::SeriesTime, DC::PerformingPhysicianName, DC::PerformingPhysicianIdentificationSequence, DC::ProtocolName, DC::SeriesDescription, DC::SeriesDescriptionCodeSequence, DC::OperatorsName, DC::OperatorIdentificationSequence, DC::ReferencedPerformedProcedureStepSequence, DC::RelatedSeriesSequence, DC::BodyPartExamined, DC::PatientPosition, // 2C // DC::SmallestPixelValueInSeries, // done above // DC::LargestPixelValueInSeries, // done above DC::RequestAttributesSequence, DC::PerformedProcedureStepID, DC::PerformedProcedureStepStartDate, DC::PerformedProcedureStepStartTime, DC::PerformedProcedureStepDescription, DC::PerformedProtocolCodeSequence, DC::CommentsOnThePerformedProcedureStep, DC::AnatomicalOrientationType, DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateClinicalTrialSeriesModule( vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::ClinicalTrialCoordinatingCenterName, // 2 DC::ClinicalTrialSeriesID, // 3 DC::ClinicalTrialSeriesDescription, // 3 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateFrameOfReferenceModule( vtkDICOMMetaData *source) { // the FrameOfReferenceUID is mandatory, // the PositionReferenceIndicator is required std::string uid; std::string fid; // Note that, depending on how the image has been manipulated, // the frame of reference might have changed. if (source) { uid = source->Get(DC::FrameOfReferenceUID).AsString(); fid = source->Get(DC::PositionReferenceIndicator).AsString(); } if (uid == "") { uid = this->GenerateUID(DC::FrameOfReferenceUID); } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::FrameOfReferenceUID, uid); meta->Set(DC::PositionReferenceIndicator, fid); return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateGeneralEquipmentModule( vtkDICOMMetaData *source) { // required items: use simple read/write validation static const DC::EnumType required[] = { DC::Manufacturer, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::InstitutionName, DC::InstitutionAddress, DC::StationName, DC::InstitutionalDepartmentName, DC::ManufacturerModelName, DC::DeviceSerialNumber, DC::SoftwareVersions, DC::GantryID, DC::SpatialResolution, DC::DateOfLastCalibration, DC::TimeOfLastCalibration, DC::PixelPaddingValue, // 1C, mandatory if PixelPaddingRangeLimit DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateGeneralImageModule( vtkDICOMMetaData *source) { // This module provides per-instance information vtkDICOMMetaData *meta = this->MetaData; int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { unsigned int instance = i + 1; meta->Set(i, DC::InstanceNumber, instance); } // PatientInformation is required if no ImagePlane module is present, // it will be overwritten if a real value is found meta->Set(DC::PatientOrientation, ""); // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::PatientOrientation, // 2C, not set if Patient Matrix exists DC::ContentDate, // 2C, might be per-instance DC::ContentTime, // 2C, might be per-instance, up to the microsecond DC::ImageType, // must change for derived or reformatted images DC::AcquisitionNumber, DC::AcquisitionDate, DC::AcquisitionTime, DC::AcquisitionDateTime, DC::ReferencedImageSequence, DC::DerivationDescription, // must change for re-derived images DC::DerivationCodeSequence, // must change for re-derived images DC::SourceImageSequence, // must change for derived images DC::ReferencedInstanceSequence, // only for non-image instances DC::ImagesInAcquisition, // erase if reformatted? DC::ImageComments, DC::QualityControlImage, DC::BurnedInAnnotation, DC::RecognizableVisualFeatures, DC::LossyImageCompression, DC::LossyImageCompressionRatio, DC::LossyImageCompressionMethod, // DC::IconImageSequence, // obviously must change if present DC::PresentationLUTShape, DC::IrradiationEventUID, DC::RealWorldValueMappingSequence, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source) { double spacing[3], origin[3]; double matrix[16]; this->ComputeAdjustedMatrix(matrix, origin, spacing); int timeSlices = 1; if (!this->TimeAsVector && this->Dimensions[3] > 0) { timeSlices = this->Dimensions[3]; } // remove attributes that conflict with this module vtkDICOMMetaData *meta = this->MetaData; meta->Erase(DC::PixelAspectRatio); meta->Erase(DC::PatientOrientation); // DICOM PixelSpacing is RowSpacing,ColumnSpacing double pixelSize[2] = { spacing[1], spacing[0] }; meta->Set(DC::PixelSpacing, vtkDICOMValue(vtkDICOMVR::DS, pixelSize, 2)); // this will have to account for image flip, if present int n = meta->GetNumberOfInstances(); double zorigin = origin[2]; for (int i = 0; i < n; i++) { int sliceIdx = this->SliceIndexArray->GetComponent(i, 0); // remove the time from the slice index sliceIdx /= timeSlices; origin[2] = zorigin + sliceIdx*spacing[2]; double position[3], orientation[6]; vtkDICOMGenerator::ComputePositionAndOrientation( origin, matrix, position, orientation); meta->Set(i, DC::ImagePositionPatient, vtkDICOMValue(vtkDICOMVR::DS, position, 3)); meta->Set(i, DC::ImageOrientationPatient, vtkDICOMValue(vtkDICOMVR::DS, orientation, 6)); // location is optional, but useful double location = (position[0]*matrix[2] + position[1]*matrix[6] + position[2]*matrix[10]); // keep sign of location the same as the dimension it tracks int li = (fabs(matrix[6]) > fabs(matrix[2]) ? 6 : 2); li = (fabs(matrix[10]) > fabs(matrix[li]) ? 10 : li); location = (matrix[li] < 0 ? -location : location); // use the original value if possible, to avoid surprises if (this->SourceInstanceArray && source == this->SourceMetaData && source) { vtkDICOMMetaDataAdapter sourceAdapter(source); if (sourceAdapter->Has(DC::SliceLocation)) { int j = this->SourceInstanceArray->GetComponent(i, 0); location = sourceAdapter->Get(j, DC::SliceLocation).AsDouble(); } } meta->Set(i, DC::SliceLocation, location); } // the original SliceThickness should be used if it is still valid, // i.e. if the slices are original slices rather than reformatted. double thickness = 0; if (this->SourceInstanceArray && source == this->SourceMetaData && source) { vtkDICOMMetaDataAdapter sourceAdapter(source); thickness = sourceAdapter->Get(0, DC::SliceThickness).AsDouble(); } if (thickness <= 0) { thickness = fabs(spacing[2]); } meta->Set(DC::SliceThickness, thickness); return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source) { int rows = this->Dimensions[1]; int cols = this->Dimensions[0]; // get the DICOM data type: short pixelbits = 0; short pixelrep = 0; switch (this->ScalarType) { case VTK_SIGNED_CHAR: pixelrep = 1; pixelbits = 8; break; case VTK_CHAR: case VTK_UNSIGNED_CHAR: pixelbits = 8; break; case VTK_SHORT: pixelrep = 1; pixelbits = 16; break; case VTK_UNSIGNED_SHORT: pixelbits = 16; break; case VTK_INT: pixelrep = 1; pixelbits = 32; break; case VTK_UNSIGNED_INT: pixelbits = 32; break; default: break; } if (pixelbits == 0) { vtkErrorMacro("Illegal scalar type: " << vtkImageScalarTypeNameMacro(this->ScalarType)); return false; } // modify the type based on what SOP allows int storedbits = pixelbits; if ((this->AllowedPixelRepresentation & (1 << pixelrep)) == 0) { // if data is signed but no negative values are present, // then write as unsigned if SOP Class doesn't allow signed if (pixelrep == 1 && this->PixelValueRange[0] >= 0) { pixelrep = 0; } else { vtkErrorMacro("This SOP class requires unsigned values."); return false; } } if ((this->AllowedBitsStored & (1 << (pixelbits-1))) == 0) { vtkErrorMacro("Illegal scalar type: " << vtkImageScalarTypeNameMacro(this->ScalarType)); } // reduce BitsStored if the SOP class allows unsigned int maxv = static_cast(this->PixelValueRange[1]); for (int bi = pixelbits/2 + 1; bi < pixelbits; bi++) { if ((this->AllowedBitsStored & (1u << bi)) != 0 && (pixelrep == 0 && maxv < (1u << (bi + 1)))) { storedbits = bi + 1; break; } } if (rows > 65535 || cols > 65535) { vtkErrorMacro("Image dimensions " << rows << "x" << cols << " are too large for DICOM"); return false; } vtkDICOMMetaData *meta = this->MetaData; bool paletteColor = false; if (this->NumberOfColorComponents >= 3) { meta->Set(DC::SamplesPerPixel, 3); meta->Set(DC::PlanarConfiguration, 0); meta->Set(DC::PhotometricInterpretation, "RGB"); } else { meta->Set(DC::SamplesPerPixel, 1); std::string pm; if (source) { pm = source->Get(DC::PhotometricInterpretation).AsString(); } if ((pm == "PALETTE COLOR" || pm == "PALETTE_COLOR") && source && source->Has(DC::RedPaletteColorLookupTableData)) { pm = "PALETTE COLOR"; paletteColor = true; } else if (pm != "MONOCHROME1") { pm = "MONOCHROME2"; } meta->Set(DC::PhotometricInterpretation, pm); } if (paletteColor && source) { static const DC::EnumType palette[] = { DC::RedPaletteColorLookupTableDescriptor, DC::GreenPaletteColorLookupTableDescriptor, DC::BluePaletteColorLookupTableDescriptor, DC::RedPaletteColorLookupTableData, DC::GreenPaletteColorLookupTableData, DC::BluePaletteColorLookupTableData, DC::ItemDelimitationItem }; for (int i = 0; palette[i] != DC::ItemDelimitationItem; i++) { meta->Set(palette[i], source->Get(palette[i])); } } meta->Set(DC::Rows, rows); meta->Set(DC::Columns, cols); meta->Set(DC::BitsAllocated, pixelbits); meta->Set(DC::BitsStored, storedbits); meta->Set(DC::HighBit, storedbits-1); meta->Set(DC::PixelRepresentation, pixelrep); // This cannot be set if PixelSpacing is set if (!meta->Has(DC::PixelSpacing)) { int aspect[2]; vtkDICOMGenerator::ComputeAspectRatio(this->Spacing, aspect); meta->Set(DC::PixelAspectRatio, vtkDICOMValue(vtkDICOMVR::IS, aspect, 2)); } // The Smallest/LargestPixelValue are optional, but nice to have if (this->RangeArray) { // Get the pixel VR vtkDICOMVR pixelVR = vtkDICOMVR::US; if (this->ScalarType == VTK_SIGNED_CHAR || this->ScalarType == VTK_SHORT) { pixelVR = vtkDICOMVR::SS; } // Force it to conform the VRs allowed by the SOP Class if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0) { pixelVR = vtkDICOMVR::US; } else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0) { pixelVR = vtkDICOMVR::SS; } int n = meta->GetNumberOfInstances(); for (int i = 0; i < n; i++) { int nframes = (this->NumberOfFrames > 0 ? this->NumberOfFrames : 1); int minVal = VTK_INT_MAX; int maxVal = VTK_INT_MIN; for (int j = 0; j < nframes; j++) { int v = this->RangeArray->GetComponent(i*nframes + j, 0); minVal = (minVal <= v ? minVal : v); v = this->RangeArray->GetComponent(i*nframes + j, 1); maxVal = (maxVal >= v ? maxVal : v); } meta->Set( i, DC::SmallestImagePixelValue, vtkDICOMValue(pixelVR, minVal)); meta->Set( i, DC::LargestImagePixelValue, vtkDICOMValue(pixelVR, maxVal)); } } return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateContrastBolusModule(vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::ContrastBolusAgent, // 2 DC::ContrastBolusAgentSequence, // 3 DC::ContrastBolusRoute, // 3 DC::ContrastBolusAdministrationRouteSequence, // 3 DC::ContrastBolusVolume, // 3 DC::ContrastBolusStartTime, // 3 DC::ContrastBolusStopTime, // 3 DC::ContrastBolusTotalDose, // 3 DC::ContrastFlowRate, // 3 DC::ContrastFlowDuration, // 3 DC::ContrastBolusIngredient, // 3 DC::ContrastBolusIngredientConcentration, // 3 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateMultiFrameModule(vtkDICOMMetaData *) { vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::NumberOfFrames, this->NumberOfFrames); meta->Set(DC::FrameIncrementPointer, vtkDICOMValue(vtkDICOMVR::AT, vtkDICOMTag(DC::FrameTime))); meta->Set(DC::FrameTime, this->Spacing[4]); return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateDeviceModule(vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::DeviceSequence, // 1 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateSpecimenModule(vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType tags[] = { DC::ContainerIdentifier, // 1 DC::IssuerOfTheContainerIdentifierSequence, // 2 DC::AlternateContainerIdentifierSequence, // 3 DC::ContainerTypeCodeSequence, // 2 DC::ContainerDescription, // 3 DC::ContainerComponentSequence, // 3 DC::SpecimenDescriptionSequence, // 1 DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateOverlayPlaneModule(vtkDICOMMetaData *source) { // direct copy of values with no checks static const DC::EnumType basetags[] = { DC::OverlayRows, // 1 DC::OverlayColumns, // 1 DC::OverlayType, // 1 DC::OverlayOrigin, // 1 DC::OverlayBitsAllocated, // 1 DC::OverlayBitPosition, // 1 DC::OverlayData, // 1 DC::OverlayDescription, // 3 DC::OverlaySubtype, // 3 DC::OverlayLabel, // 3 DC::ROIArea, // 3 DC::ROIMean, // 3 DC::ROIStandardDeviation, // 3 DC::ItemDelimitationItem }; // overlay is a repeating group, it repeats 16 times DC::EnumType tags[16]; int n = this->NumberOfOverlays; n = (n < 0 ? 0 : n); n = (n > 16 ? 16 : n); for (int i = 0; i < n; i++) { int j = 0; while (tags[j] != DC::ItemDelimitationItem) { tags[j] = static_cast(basetags[j] + i*0x20000); j++; } tags[j] = DC::ItemDelimitationItem; if (!this->CopyOptionalAttributes(tags, source)) { return false; } } return true; } //---------------------------------------------------------------------------- bool vtkDICOMGenerator::GenerateVOILUTModule(vtkDICOMMetaData *source) { // no support for lookup tables yet, so just Window/Level vtkDICOMMetaData *meta = this->MetaData; if (!meta->Has(DC::RescaleIntercept) && this->RangeArray && (this->ScalarType == VTK_SHORT || this->ScalarType == VTK_UNSIGNED_SHORT)) { int n = meta->GetNumberOfInstances(); int m = static_cast(this->RangeArray->GetNumberOfTuples()/n); for (int i = 0; i < n; i++) { int lowVal = this->RangeArray->GetComponent(i*m, 2); int highVal = this->RangeArray->GetComponent(i*m, 3); // set a limit on how tight the window can be if (highVal - lowVal < 20) { highVal = lowVal + 20; } // make sure that WindowCenter will be an integer if ((highVal - lowVal) % 2 != 0) { if (lowVal > 0) { lowVal--; } else { highVal--; } } meta->Set(i, DC::WindowCenter, 0.5*(highVal + lowVal)); meta->Set(i, DC::WindowWidth, 1.0*(highVal - lowVal)); } return true; } // if data is real-valued like CT, then use original window/level static const DC::EnumType tags[] = { DC::VOILUTSequence, // 1C, mutually exclusive with WindowCenter DC::WindowCenter, // 1C, mutually exclusive with VOILUTSequence DC::WindowWidth, // 1C, mutually exclusive with VOILUTSequence DC::WindowCenterWidthExplanation, DC::VOILUTFunction, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(tags, source); } vtk-dicom-0.8.12/Source/vtkDICOMGenerator.h000066400000000000000000000421771356440565500203670ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMGenerator_h #define vtkDICOMGenerator_h #include "vtkObject.h" #include "vtkStdString.h" // For std::string #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMTag.h" // For method parameter class vtkIntArray; class vtkMatrix4x4; class vtkInformation; class vtkStringArray; class vtkDICOMMetaData; class vtkDICOMItem; class vtkDICOMUIDGenerator; //! Generate DICOM data series for specific IOD classes. /*! * Every DICOM data set must conform to a specific class, where the * properties of all the classes are defined in the DICOM standard. * There are specific IOD classes for MR, CT, ultrasound X-ray, etc., in * fact there are several dozen classes in total. IOD is the acronym * for Information Object Description, and refers to the attributes that * a data set belonging to a particular IOD class can or must have. The * vtkDICOMGenerator is an abstract base class that provides support * for most of the common modules in the DICOM standard (i.e. modules * that are shared between modalities). Subclasses of vtkDICOMGenerator * are concrete classes that provide generation of data sets belonging * to specific modalities. */ class VTKDICOM_EXPORT vtkDICOMGenerator : public vtkObject { public: //! Static method for construction. static vtkDICOMGenerator *New(); vtkTypeMacro(vtkDICOMGenerator, vtkObject); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Generate an instance of one of the supported classes. /*! * This is the primary interface method of this class. Given the * information for a vtkImageData object, it will populate the * attributes of the supplied vtkDICOMMetaData object. */ virtual bool GenerateInstance(vtkInformation *); //@} //@{ //! Get the generated meta data. /*! * Every time GenerateInstance() is called, it will generate a * new meta data object that can be retrieved with this method. */ vtkDICOMMetaData *GetMetaData(); //@} //@{ //! Copy extended attributes from source (default: Off). /*! * If this is off (the default), then only attributes that are part * of the base SOP class will be copied from the source. Otherwise, * all attributes (standard and private) will be copied. No validation * is performed on attributes that aren't part of the base SOP class. */ vtkSetMacro(Extended, int); vtkBooleanMacro(Extended, int); vtkGetMacro(Extended, int); //@} //@{ //! Create a multi-frame object (default: Off). /*! * If this is on, the one multi-frame data set will be created. If * this is off, then each slice will be put into a different data set. * The latter is more likely to be compatible with older software. */ vtkSetMacro(MultiFrame, int); vtkBooleanMacro(MultiFrame, int); vtkGetMacro(MultiFrame, int); //@} //@{ //! Write scalar components as the time dimension (default: Off). /*! * If this is on, then each time slot is stored in a different scalar * component of the image data. If it is off, then each block of N * adjacent slices correspond to the N time slots of the time dimension. */ vtkSetMacro(TimeAsVector, int); vtkBooleanMacro(TimeAsVector, int); vtkGetMacro(TimeAsVector, int); //@} //@{ //! Set the time dimension to use in the DICOM file (or zero if none). /*! * The number of components of the input data must be divisible by the * time dimension if the time dimension is not set to zero. The vector * dimension will be set to the number of components divided by the time * dimension. This will be ignored if the SOP Class IOD does not permit * a time dimension. */ vtkSetMacro(TimeDimension, int); vtkGetMacro(TimeDimension, int); vtkSetMacro(TimeSpacing, double); vtkGetMacro(TimeSpacing, double); //@} //@{ //! Set the rescaling parameters, for example for CT. /*! * CT, PET, and some other modalities require rescaling parameters * so that the integer pixel values can be converted into physical * units. */ vtkSetMacro(RescaleIntercept, double); vtkGetMacro(RescaleIntercept, double); vtkSetMacro(RescaleSlope, double); vtkGetMacro(RescaleSlope, double); //@} //@{ //! Set the number of overlays to generate. /*! * This will cause overlay attributes to be copied from the source * meta data to the output meta data. It is up to the writer to * ensure that the values are consistent with each other. */ vtkSetMacro(NumberOfOverlays, int); vtkGetMacro(NumberOfOverlays, int); //@} //@{ //! Set the matrix that places the image in DICOM patient coords. /*! * The 3x3 portion of the matrix must be orthonormal, and the * last column of the matrix is understood to be in millimetres. */ void SetPatientMatrix(vtkMatrix4x4 *); vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; } //@} //@{ //! Let the generator know how the image is arranged in memory. /*! * The generator needs to know how to interpret the geometry of * the image that is described in the vtkInformation object that * accompanies the image. For example, VTK display coordinates * place the Origin at the lower left corner of the screen, while * DICOM assumes that images will be displayed with the "origin" * at the top left corner. By default, OriginAtBottom is On. */ vtkSetMacro(OriginAtBottom, int); vtkGetMacro(OriginAtBottom, int); //@} //@{ //! Let the generator know how to order the slices. /*! * By default, the generator will try to keep the same slice order * as the meta data set by SetSourceMetaData(), but if no ordering can be * discerned from the meta data, then the slices will be ordered * according to this flag. */ vtkSetMacro(ReverseSliceOrder, int); vtkGetMacro(ReverseSliceOrder, int); //@} //@{ //! Set some meta data for the constructor to use as a source. /*! * The supplied meta data can provide some general properties * of the data set, such as the patient information and study * information. Only portions of the meta data that are permitted * by the generated IOD will be included. */ void SetSourceMetaData(vtkDICOMMetaData *); vtkDICOMMetaData *GetSourceMetaData(); //@} //@{ //! Set the UID generator, for generating unique IDs. /*! * If no UID generator is supplied, then the default UID generator * will be used. */ void SetUIDGenerator(vtkDICOMUIDGenerator *); vtkDICOMUIDGenerator *GetUIDGenerator(); //@} //@{ //! Get an array that maps file and frame to slice. /*! * Once the generator has created the metadata, this array lets the * writer know which slice to write out as which frame in which file. * This will be a 2D array, with the file as the first index and the * frame as the second index. */ vtkIntArray *GetSliceIndexArray() { return this->SliceIndexArray; } //! Get an array that maps file and frame to component. /*! * Once the generator has created the metadata, this array lets the * writer know which component to write out as which frame in which file. * This will be a 2D array, with the file as the first index and the * frame as the second index. */ vtkIntArray *GetComponentIndexArray() { return this->ComponentIndexArray; } //@} protected: //! Enumerated values for restricting pixel values. enum { RepresentationUnsigned = 1u, RepresentationSigned = 2u, BitsStored1 = 1u, BitsStored6 = (1u << 5), BitsStored8 = (1u << 7), BitsStored10 = (1u << 9), BitsStored12 = (1u << 11), BitsStored16 = (1u << 15), BitsStored32 = (1u << 31) }; //@{ //! Protected constructor method. vtkDICOMGenerator(); ~vtkDICOMGenerator(); //@} //@{ //! Generate a UID for the provided tag. /* * The generator uses the tag as a hint when generating the UIDs, * for example the SOPInstanceUID might have a different format from * the FrameOfReferenceUID. */ std::string GenerateUID(vtkDICOMTag tag); //! Generate a series of UIDs, sorted from low to high. /*! * Before passing the string array, call SetNumberOfValues() on * the array to specify the number of UIDs that you want to be * stored in it. The stored UIDs will be sorted, low to high. * Generating a batch of UIDs is more efficient than calling * GenerateUID() repeatedly. */ void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids); //@} //@{ //! Used by subclasses to place restrictions on the pixel type. void SetPixelRestrictions( unsigned int pixelRepresentation, unsigned int bitsStored, int colorComponents); //@} //@{ //! Generate the DICOM SOP Common Module. virtual bool GenerateSOPCommonModule( vtkDICOMMetaData *meta, const char *SOPClass); //! Generate the DICOM Patient Module. virtual bool GeneratePatientModule(vtkDICOMMetaData *source); //! Generate the DICOM Clinical Trial Subject Module. virtual bool GenerateClinicalTrialSubjectModule(vtkDICOMMetaData *source); //! Generate the DICOM General Study Module. virtual bool GenerateGeneralStudyModule(vtkDICOMMetaData *source); //! Generate the DICOM Patient Study Module. virtual bool GeneratePatientStudyModule(vtkDICOMMetaData *source); //! Generate the DICOM Clinical Trial Study Module. virtual bool GenerateClinicalTrialStudyModule(vtkDICOMMetaData *source); //! Generate the DICOM Series Module. virtual bool GenerateGeneralSeriesModule(vtkDICOMMetaData *source); //! Generate the DICOM Clinical Trial Series Module. virtual bool GenerateClinicalTrialSeriesModule(vtkDICOMMetaData *source); //! Generate the DICOM Frame of Reference Module. virtual bool GenerateFrameOfReferenceModule(vtkDICOMMetaData *source); //! Generate the DICOM Equipment Module. virtual bool GenerateGeneralEquipmentModule(vtkDICOMMetaData *source); //! Generate the DICOM Image Module. virtual bool GenerateGeneralImageModule(vtkDICOMMetaData *source); //! Generate the DICOM Plane Module. virtual bool GenerateImagePlaneModule(vtkDICOMMetaData *source); //! Generate the DICOM Pixel Module. virtual bool GenerateImagePixelModule(vtkDICOMMetaData *source); //! Generate The DICOM Contrast/Bolus Module. virtual bool GenerateContrastBolusModule(vtkDICOMMetaData *source); //! Generate The DICOM Multi-frame Module. virtual bool GenerateMultiFrameModule(vtkDICOMMetaData *source); //! Generate The DICOM Device Module. virtual bool GenerateDeviceModule(vtkDICOMMetaData *source); //! Generate The DICOM Specimen Module. virtual bool GenerateSpecimenModule(vtkDICOMMetaData *source); //! Generate the DICOM Overlay Plane Module. virtual bool GenerateOverlayPlaneModule(vtkDICOMMetaData *source); //! Generate the DICOM VOI LUT Module. virtual bool GenerateVOILUTModule(vtkDICOMMetaData *source); //@} //@{ //! Copy required attributes into the meta data. /*! * Required attributes must be set, so if no value is available, * then an empty zero-length attribute will be created for them. * The list of tags must be terminated with DC::ItemDelimitationItem. */ virtual bool CopyRequiredAttributes( const DC::EnumType *tags, vtkDICOMMetaData *source); //! Copy optional attributes into the meta data. /*! * The list of tags must be terminated with DC::ItemDelimitationItem. */ virtual bool CopyOptionalAttributes( const DC::EnumType *tags, vtkDICOMMetaData *source); //@} //! Copy all atributes into the meta data, excluding blacklisted ones. /*! * The blacklist must be terminated with DC::ItemDelimitationItem. * The blacklist may be set to NULL. */ virtual bool CopyAttributes( const DC::EnumType *blacklist, vtkDICOMMetaData *source); //@} //! Compute aspect ratio from spacing. static void ComputeAspectRatio(const double spacing[2], int aspect[2]); //@{ //! Compute the matrix, needed for Position and Orientation. void ComputeAdjustedMatrix( double matrix[16], double origin[3], double spacing[3]); //@} //! Compute the position and orientation for a slice. /*! * Given the origin of a slice (the position of the corner of the slice * in VTK data coordinates), and a 4x4 matrix (which may be NULL), compute * the ImagePositionPatient and the ImageOrientationPatient. */ static void ComputePositionAndOrientation( const double origin[3], const double matrix[16], double position[3], double orientation[6]); //@{ //! Compute the dimensions. /*! * This will compute the dimensions of the data, given the information * supplied by the reader. */ virtual void ComputeDimensions( vtkInformation *info, int *nframes, int dims[5], double spacing[5], double origin[5]); //! Compute the range of the data. /*! * If the image data is present, compute the range of all frames as * well as a suitable window/level for each frame. */ virtual void ComputePixelValueRange( vtkInformation *info, int seriesRange[2]); //@} //@{ //! Attempt to match each slice to a source meta data slice. virtual void MatchInstances(vtkDICOMMetaData *source); //@} //@{ //! Initialize the meta data and compute the slice index array. /*! * This must be done before any of the meta data has been generated. * It creates a mapping between the files and frames that will be written, * and the slices that make up the image data. */ virtual void InitializeMetaData(vtkInformation *info); //@} //! The generated meta data vtkDICOMMetaData *MetaData; //! The source meta data. vtkDICOMMetaData *SourceMetaData; //! The UID generator. vtkDICOMUIDGenerator *UIDGenerator; //! Whether to copy attributes that aren't in the base SOP class. int Extended; //! Whether to prefer multi-frame files over single-frame. int MultiFrame; //! Whether VTK image data is not top-to-bottom yet. int OriginAtBottom; //! Whether to reverse the slices as compared to input data. int ReverseSliceOrder; //! Whether time is stored in slices or in scalar components. int TimeAsVector; //! Time dimension suggested by the writer. int TimeDimension; double TimeSpacing; //! Data rescaling parameters. double RescaleIntercept; double RescaleSlope; //! The number of overlays to generate. int NumberOfOverlays; //! The VTK scalar type of the data, set by InitializeMetaData(). int ScalarType; //! The number of color components, for color scalars. /*! * Scalars of type "unsigned char" are interpreted as colors by VTK * unless there is some indication that they should be interpreted * otherwise. VTK color scalars come in these flavors: grayscale, * greyscale+alpha, RGB, and RGBA. DICOM supports grayscale and * RGB, so alpha will be discarded when VTK images are written as * DICOM. So if NumberOfColorComponents is 2, then only the first * component will be written to the file, and if NumberOfColorComponents * is 4, then only the first three components will be written. */ int NumberOfColorComponents; //! The permitted pixel representation and bits stored, as bitfields. unsigned int AllowedPixelRepresentation; unsigned int AllowedBitsStored; //! The number of frames. /*! * If this is nonzero, then the DICOM file will be a multi-frame * file, overriding the MultiFrame variable. Some SOP classes are * exclusively multi-frame while others are not. The value of this * variable is computed InitializeMetaData(). */ int NumberOfFrames; //! The actual dimensions to write to the file. /*! * The ordering of the dimensions is x,y,z,t followed by a vector * dimension that encompasses everything else. These are set by * the InitializeMetaData() method. The dimension is set to zero * for any dimensions that are not used. */ int Dimensions[5]; double Spacing[5]; double Origin[5]; //! The smallest and largest pixel values in the image data. /*! * This is computed in the InitializeMetaData method. */ int PixelValueRange[2]; //! The orientation matrix for the DICOM file. vtkMatrix4x4 *PatientMatrix; //! The file-and-frame to slice-and-component maps. vtkIntArray *SliceIndexArray; vtkIntArray *ComponentIndexArray; //! Map from output files to input files. vtkIntArray *SourceInstanceArray; //! Map from frame to image min/max. vtkIntArray *RangeArray; private: #ifdef VTK_DICOM_DELETE vtkDICOMGenerator(const vtkDICOMGenerator&) VTK_DICOM_DELETE; void operator=(const vtkDICOMGenerator&) VTK_DICOM_DELETE; #else vtkDICOMGenerator(const vtkDICOMGenerator&) = delete; void operator=(const vtkDICOMGenerator&) = delete; #endif }; #endif // vtkDICOMGenerator_h vtk-dicom-0.8.12/Source/vtkDICOMImageCodec.cxx000066400000000000000000000301561356440565500207660ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMImageCodec.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMUtilities.h" #include //---------------------------------------------------------------------------- const char *vtkDICOMImageCodec::UIDs[21] = { "1.2.840.10008.1.2.1", // LittleEndian "1.2.840.10008.1.2.2", // BigEndian "1.2.840.10008.1.2.5", // RLE "1.2.840.10008.1.2.4.50", // JPEGBaseline "1.2.840.10008.1.2.4.51", // JPEGExtended "1.2.840.10008.1.2.4.57", // JPEGLossless "1.2.840.10008.1.2.4.70", // JPEGPrediction "1.2.840.10008.1.2.4.80", // JPEGLS "1.2.840.10008.1.2.4.81", // JPEGLSConstrained "1.2.840.10008.1.2.4.90", // JPEG2K "1.2.840.10008.1.2.4.91", // JPEG2KLossless "1.2.840.10008.1.2.4.100", // MPEG2ML "1.2.840.10008.1.2.4.101", // MPEG2HL "1.2.840.10008.1.2.4.102", // MPEG4HPL41 "1.2.840.10008.1.2.4.103", // MPEG4HPL41BD "1.2.840.10008.1.2.4.104", // MPEG4HPL42V2D "1.2.840.10008.1.2.4.105", // MPEG4HPL42V3D "1.2.840.10008.1.2.4.106", // MPEG4HPL42Stereo "1.2.840.10008.1.2.4.107", // HEVCMPL51 "1.2.840.10008.1.2.4.108", // HEVCM10PL51 0 }; //---------------------------------------------------------------------------- vtkDICOMImageCodec::ImageFormat::ImageFormat(vtkDICOMMetaData *meta) { this->Rows = meta->Get(DC::Rows).AsInt(); this->Columns = meta->Get(DC::Columns).AsInt(); this->BitsAllocated = meta->Get(DC::BitsAllocated).AsInt(); this->BitsStored = meta->Get(DC::BitsStored).AsInt(); this->PixelRepresentation = meta->Get(DC::PixelRepresentation).AsInt(); this->SamplesPerPixel = meta->Get(DC::SamplesPerPixel).AsInt(); this->PlanarConfiguration = meta->Get(DC::PlanarConfiguration).AsInt(); const char *lossy = meta->Get(DC::AllowLossyCompression).GetCharData(); this->AllowLossyCompression = (lossy && strncmp(lossy, "YES", 3) == 0); } //---------------------------------------------------------------------------- vtkDICOMImageCodec::vtkDICOMImageCodec(const std::string& tsyntax) { int key = 255; const char *ts = tsyntax.c_str(); for (int i = 0; i < NumberOfCodecs; i++) { if (strcmp(ts, vtkDICOMImageCodec::UIDs[i]) == 0) { key = i; break; } } this->Key = static_cast(key); } //---------------------------------------------------------------------------- std::string vtkDICOMImageCodec::GetTransferSyntaxUID() const { const char *result = ""; if (this->Key < NumberOfCodecs) { result = vtkDICOMImageCodec::UIDs[this->Key]; } return result; } //---------------------------------------------------------------------------- int vtkDICOMImageCodec::DecodeRLE( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char *dest, size_t destSize) { const unsigned char *inPtr = source; unsigned char *outPtr = dest; int errorCode = NoError; // get the number of segments and the segment size unsigned int n = vtkDICOMUtilities::UnpackUnsignedInt(inPtr); size_t segmentSize = destSize/n; // get the samples per pixel (spp) and bytes per sample (bps) unsigned int spp = image.SamplesPerPixel; spp = (spp == 0 ? 1 : spp); spp = (n % spp != 0 ? n : spp); unsigned int bps = n/spp; // the amount to advance after each output byte unsigned int outInc = (image.PlanarConfiguration ? bps : n); // the amount to advance advance after each sample size_t segInc = (image.PlanarConfiguration ? segmentSize : 1); segInc *= bps; // this will set endiancheck.s to 1 on little endian architectures union { char c[2]; short s; } endiancheck; endiancheck.c[0] = 1; endiancheck.c[1] = 0; // loop over all RLE segments for (unsigned int i = 0; i < n; i++) { // sample position in pixel unsigned int s = i / bps; // byte position in sample unsigned int b = i % bps; // compute the offset into the output buffer for this segment size_t outOffset = s*segInc + b; // big-endian if (endiancheck.s == 1) // little-endian { outOffset = s*segInc + (bps - b - 1); } // get the offset into the input buffer for this segment unsigned int offset = vtkDICOMUtilities::UnpackUnsignedInt(inPtr + (i+1)*4); if (offset >= sourceSize) { break; } // loop over the segment and decompress it const signed char *cp = reinterpret_cast(inPtr + offset); signed char *dp = reinterpret_cast(outPtr + outOffset); size_t remaining = segmentSize; while (remaining > 0 && offset < sourceSize) { if (++offset == sourceSize) { break; } // check the indicator byte (use short to avoid overflow) short c = *cp++; if (c >= 0) { // do a literal run c = c + 1; if (sourceSize - offset < static_cast(c)) { // safety check: limit to the number available input bytes c = static_cast(sourceSize - offset); } offset += c; if (static_cast(c) > remaining) { // safety check: limit to the size of the output dest c = static_cast(remaining); } remaining -= c; do { *dp = *cp++; dp += outInc; } while (--c); } else if (c > -128) { // do a replication run c = 1 - c; offset += 1; if (static_cast(c) > remaining) { // safety check: limit to the size of the output dest c = static_cast(remaining); } remaining -= c; do { *dp = *cp; dp += outInc; } while (--c); cp++; } } if (remaining > 0) { // short read, clear remainder of dest errorCode = MissingData; do { *dp = 0; dp += outInc; } while (--remaining); } } return errorCode; } //---------------------------------------------------------------------------- int vtkDICOMImageCodec::EncodeRLE( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char **destP, size_t *destSizeP) { int errorCode = NoError; // get the samples per pixel (spp) and bytes per sample (bps) unsigned int spp = image.SamplesPerPixel; spp = (spp == 0 ? 1 : spp); unsigned int bps = (image.BitsAllocated + 7)/8; bps = (bps == 0 ? 1 : bps); // the number of segments unsigned int n = spp*bps; if (n == 0 || n > 15) { *destP = 0; *destSizeP = 0; return BadPixelFormat; } // number of bytes per segment size_t segmentSize = sourceSize/n; // the amount to advance after each input byte unsigned int inInc = (image.PlanarConfiguration ? bps : n); // the amount to advance after each sample size_t segInc = (image.PlanarConfiguration ? segmentSize : 1); segInc *= bps; // allocate the destination buffer size_t destReserve = 4000; unsigned char *dest = new unsigned char[destReserve]; // write the table vtkDICOMUtilities::PackUnsignedInt(n, dest); for (unsigned int i = 0; i < 15; i++) { vtkDICOMUtilities::PackUnsignedInt(0, dest + 4*(i + 1)); } // the offset to the first segment unsigned int offset = 64; unsigned short rowlen = image.Columns; size_t numrows = sourceSize/(n*rowlen); // this will set endiancheck.s to 1 on little endian architectures union { char c[2]; short s; } endiancheck; endiancheck.c[0] = 1; endiancheck.c[1] = 0; // loop over all RLE segments // write the segments for (unsigned int i = 0; i < n; i++) { // write the offset into the table vtkDICOMUtilities::PackUnsignedInt(offset, dest + 4*(i + 1)); // sample position in pixel unsigned int s = i / bps; // byte position in sample unsigned int b = i % bps; // compute the offset into the input buffer for this segment size_t inOffset = s*segInc + b; // big-endian if (endiancheck.s == 1) // little-endian { inOffset = s*segInc + (bps - b - 1); } const signed char *cp = reinterpret_cast(source + inOffset); signed char *dp = reinterpret_cast(dest + offset); for (size_t j = 0; j < numrows; j++) { const signed char *ep = cp + rowlen*inInc; while (cp != ep) { short maxcount = 128; ptrdiff_t remainder = (ep - cp)/inInc; maxcount = (remainder < maxcount ? remainder : maxcount); short counter = maxcount; const signed char *sp = cp; // count repeated characters signed char prev = *cp; do { cp += inInc; } while (--counter != 0 && *cp == prev); if (maxcount - counter > 1) { // negative count for repeating counter = -(maxcount - counter - 1); } else if (counter > 0) { // count non-repeated bytes until a triplicate found signed char pprev; do { pprev = prev; prev = *cp; cp += inInc; } while (--counter != 0 && (*cp != prev || prev != pprev)); // positive count for literal counter = maxcount - counter - 1; // remove repeats at the end that can join with next run if (remainder > counter + 1 && *cp == prev) { short reps = 1 + (prev == pprev); reps = (reps < counter ? reps : counter); counter -= reps; cp -= reps*inInc; } // increment for the next offset into the destination offset += counter; } // at least two bytes are always written to destination offset += 2; // check whether destination buffer is large enough if (offset > destReserve) { destReserve *= 2; unsigned char *newdest = new unsigned char[destReserve]; size_t size = dp-reinterpret_cast(dest); memcpy(newdest, dest, size); delete [] dest; dest = newdest; dp = reinterpret_cast(dest + size); } // write the results *dp++ = counter; do { *dp++ = *sp; sp += inInc; } while (--counter >= 0); } } // add a pad byte to the segment if needed if ((offset & 1) != 0) { offset++; *dp = 0; } } *destP = dest; *destSizeP = offset; #if 0 // check code, to make sure it unpacks into an identical stream unsigned char *check = new unsigned char[sourceSize]; DecodeRLE(image, dest, offset, check, sourceSize); for (size_t k = 0; k < sourceSize; k++) { assert(source[k] == check[k]); } delete [] check; #endif return errorCode; } //---------------------------------------------------------------------------- int vtkDICOMImageCodec::Decode( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char *dest, size_t destSize) const { int code = MissingCodec; if (this->Key == RLE) { code = DecodeRLE(image, source, sourceSize, dest, destSize); } return code; } //---------------------------------------------------------------------------- int vtkDICOMImageCodec::Encode( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char **dest, size_t *destSize) const { int code = MissingCodec; if (this->Key == RLE) { code = EncodeRLE(image, source, sourceSize, dest, destSize); } return code; } //---------------------------------------------------------------------------- ostream& operator<<(ostream& o, const vtkDICOMImageCodec& a) { std::string c = a.GetTransferSyntaxUID(); if (c == "") { c = "Unknown"; } return o << c; } vtk-dicom-0.8.12/Source/vtkDICOMImageCodec.h000066400000000000000000000132041356440565500204060ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMImageCodec_h #define vtkDICOMImageCodec_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include class vtkDICOMMetaData; //! Codecs for encapsulated images. /*! * DICOM supports a wide variety of image compression methods. */ class VTKDICOM_EXPORT vtkDICOMImageCodec { public: enum EnumType { LittleEndian, // 1.2.1 Little endian BigEndian, // 1.2.2 Big endian RLE, // 1.2.5 RLE packbits JPEGBaseline, // 1.2.4.50 JPEG baseline (1) JPEGExtended, // 1.2.4.51 JPEG extended (1,2,4) JPEGLossless, // 1.2.4.57 JPEG lossless (14) JPEGPrediction, // 1.2.4.70 JPEG lossless prediction (14) JPEGLS, // 1.2.4.80 JPEG-LS JPEGLSConstrained, // 1.2.4.81 JPEG-LS constrained error JPEG2K, // 1.2.4.90 JPEG 2000 lossless JPEG2KLossless, // 1.2.4.91 JPEG 2000 lossless/lossy MPEG2ML, // 1.2.4.100 MPEG2 ML MPEG2HL, // 1.2.4.101 MPEG2 HL MPEG4HPL41, // 1.2.4.102 MPEG4 AVC/H.264 High Profile / Level 4.1 MPEG4HPL41BD, // 1.2.4.103 MPEG4 AVC/H.264 BD-compatible MPEG4HPL42V2D, // 1.2.4.104 MPEG4 AVC/H.264 High Profile / 4.2 2D MPEG4HPL42V3D, // 1.2.4.105 MPEG4 AVC/H.264 High Profile / 4.2 3D MPEG4HPL42Stereo, // 1.2.4.106 MPEG4 AVC/H.264 Stereo High Profile / 4.2 HEVCMPL51, // 1.2.4.107 HEVC/H.265 Main Profile / 5.1 HEVCM10PL51, // 1.2.4.108 HEVC/H.265 Main 10 Profile / 5.1 NumberOfCodecs }; enum ErrorCode { NoError, MissingCodec, BadPixelFormat, MissingData, UnknownError }; //! A struct to store basic image information for a codec struct ImageFormat { unsigned short Rows; unsigned short Columns; unsigned short BitsAllocated; unsigned short BitsStored; unsigned short PixelRepresentation; unsigned short SamplesPerPixel; unsigned short PlanarConfiguration; bool AllowLossyCompression; ImageFormat() : Rows(0), Columns(0), BitsAllocated(0), BitsStored(0), PixelRepresentation(0), SamplesPerPixel(0), PlanarConfiguration(0), AllowLossyCompression(false) {} ImageFormat(vtkDICOMMetaData *meta); }; //@{ //! Construct an object for the default codec (little endian uncompressed). vtkDICOMImageCodec() : Key(0) {} //! Construct a codec object from the given code. /*! * The code can be any of the enumerated code values. */ vtkDICOMImageCodec(int k) : Key(static_cast(k)) {} //! Get a codec for the specified transfer syntax UID. /*! * This generates an 8-bit code that uniquely identifies a DICOM * compression method, given the transfer syntax. */ explicit vtkDICOMImageCodec(const std::string& syntax); //@} //@{ //! Get the transfer syntax for this codec. /*! * If the object is invalid, then an empty string is returned. */ std::string GetTransferSyntaxUID() const; //! Get the numerical identifier for this codec. unsigned char GetKey() const { return this->Key; } //@} //@{ //! Decode a compressed image into the given destination buffer. /*! * The length of the source buffer must be provided. The destination * must be large enough to accept the entire decompressed frame. On * error, the error code is returned, and on success, zero is returned. */ int Decode(const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char *dest, size_t destSize) const; //! Encode a compressed image, and return an allocated destination buffer. /*! * The caller has the responsibility of calling "delete []" on the returned * destination buffer. */ int Encode(const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char **dest, size_t *destSize) const; //@} //@{ bool operator==(vtkDICOMImageCodec b) const { return (this->Key == b.Key); } bool operator!=(vtkDICOMImageCodec b) const { return (this->Key != b.Key); } bool operator<=(vtkDICOMImageCodec a) const { return (this->Key <= a.Key); } bool operator>=(vtkDICOMImageCodec a) const { return (this->Key >= a.Key); } bool operator<(vtkDICOMImageCodec a) const { return (this->Key < a.Key); } bool operator>(vtkDICOMImageCodec a) const { return (this->Key > a.Key); } //@} private: unsigned char Key; static const char *UIDs[21]; static int DecodeRLE( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char *dest, size_t destSize); static int EncodeRLE( const ImageFormat& image, const unsigned char *source, size_t sourceSize, unsigned char **dest, size_t *destSize); //! Unpack one little-endian int. static unsigned int UnpackUnsignedInt(const void *source) { const unsigned char *cp = static_cast(source); return cp[0] + (cp[1] << 8) + (cp[2] << 16) + (cp[3] << 24); } }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMImageCodec& a); #endif /* vtkDICOMImageCodec_h */ // VTK-HeaderTest-Exclude: vtkDICOMImageCodec.h vtk-dicom-0.8.12/Source/vtkDICOMItem.cxx000066400000000000000000000370731356440565500177110ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMItem.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMTagPath.h" #include "vtkDICOMMetaData.h" #include //---------------------------------------------------------------------------- // For use by methods that must return an invalid value const vtkDICOMValue vtkDICOMItem::InvalidValue; //---------------------------------------------------------------------------- vtkDICOMItem::vtkDICOMItem(vtkDICOMMetaData *meta) { this->L = new List; this->L->Head.Next = &this->L->Tail; this->L->Tail.Prev = &this->L->Head; if (meta) { const vtkDICOMValue& vcs = meta->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { this->L->CharacterSet = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } const vtkDICOMValue &v = meta->Get(DC::PixelRepresentation); if (v.IsValid()) { this->L->VRForXS = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } } } //---------------------------------------------------------------------------- vtkDICOMItem::vtkDICOMItem( vtkDICOMCharacterSet cs, vtkDICOMVR vrForXS, int delimited, unsigned int byteOffset) { this->L = new List; this->L->Head.Next = &this->L->Tail; this->L->Tail.Prev = &this->L->Head; this->L->ByteOffset = byteOffset; this->L->Delimited = (delimited != 0); this->L->CharacterSet = cs; this->L->VRForXS = vrForXS; } //---------------------------------------------------------------------------- vtkDICOMDataElement *vtkDICOMItem::NewDataElement(vtkDICOMDataElement **iter) { int n = this->L->NumberOfDataElements; // if no data elements yet, then allocate four if (this->L->DataElements == 0) { this->L->DataElements = new vtkDICOMDataElement[4]; } // if n is a power of two, double allocated space else if (n >= 4 && (n & (n-1)) == 0) { // but first check if a free element exists do { --n; } while (n > 0 && this->L->DataElements[n].Next != 0); if (this->L->DataElements[n].Next != 0) { // make a new, larger list n = this->L->NumberOfDataElements; vtkDICOMDataElement *oldptr = this->L->DataElements; this->L->DataElements = new vtkDICOMDataElement[2*n]; vtkDICOMItem::CopyDataElements( this->L->Head.Next, &this->L->Tail, this->L); if (iter) { // fix the address of the provided node, since it was re-alloced vtkDICOMDataElement *tptr = *iter; vtkDICOMDataElement *nptr = &this->L->Tail; do { tptr = tptr->Next; nptr = nptr->Prev; } while (tptr != &this->L->Tail); *iter = nptr; } delete [] oldptr; } } return &this->L->DataElements[n]; } //---------------------------------------------------------------------------- void vtkDICOMItem::FreeList() { delete [] this->L->DataElements; delete this->L; this->L = 0; } //---------------------------------------------------------------------------- void vtkDICOMItem::CopyList(const List *o, List *t) { t->NumberOfDataElements = o->NumberOfDataElements; t->DataElements = 0; t->ByteOffset = o->ByteOffset; t->Delimited = o->Delimited; t->CharacterSet = o->CharacterSet; t->VRForXS = o->VRForXS; t->Head.Next = &t->Tail; t->Tail.Prev = &t->Head; int n = o->NumberOfDataElements; if (n > 0) { // round up to power of two int m = n - 1; m |= m >> 1; m |= m >> 2; m |= m >> 4; m |= m >> 8; m |= m >> 16; m += 1; // allocate a minimum of 4 elements if (m < 4) { m = 4; } t->DataElements = new vtkDICOMDataElement[m]; vtkDICOMItem::CopyDataElements(o->Head.Next, &o->Tail, t); } } //---------------------------------------------------------------------------- void vtkDICOMItem::CopyDataElements( const vtkDICOMDataElement *begin, const vtkDICOMDataElement *end, List *t) { vtkDICOMDataElement *e = t->DataElements; t->Head.Next = e; const vtkDICOMDataElement *ptr = begin; while (ptr != end) { e->Tag = ptr->Tag; e->Value = ptr->Value; e->Next = e + 1; e->Prev = e - 1; ptr = ptr->Next; e++; } t->Tail.Prev = e - 1; t->Head.Next->Prev = &t->Head; t->Tail.Prev->Next = &t->Tail; } //---------------------------------------------------------------------------- vtkDICOMDataElement *vtkDICOMItem::FindDataElementOrInsert(vtkDICOMTag tag) { // make a container if we don't have one yet if (this->L == 0) { this->L = new List; this->L->Head.Next = &this->L->Tail; this->L->Tail.Prev = &this->L->Head; } // if we aren't the sole owner, copy before modifying else if (this->L->ReferenceCount != 1) { List *t = new List; vtkDICOMItem::CopyList(this->L, t); this->Clear(); this->L = t; } // find the insert location in the linked list vtkDICOMDataElement *tptr = &this->L->Tail; do { tptr = tptr->Prev; } while (tag < tptr->GetTag()); if (tag != tptr->GetTag()) { // create a new data element vtkDICOMDataElement *e = this->NewDataElement(&tptr); e->Tag = tag; e->Prev = tptr; e->Next = tptr->Next; e->Prev->Next = e; e->Next->Prev = e; tptr = e; this->L->NumberOfDataElements++; } return tptr; } //---------------------------------------------------------------------------- vtkDICOMItem *vtkDICOMItem::FindItemOrInsert( const vtkDICOMTagPath& tagpath, vtkDICOMTag *tagptr) { vtkDICOMItem *item = 0; if (tagpath.HasTail()) { vtkDICOMTag tag = tagpath.GetHead(); vtkDICOMDataElement *tptr = this->FindDataElementOrInsert(tag); vtkDICOMVR vr = tptr->Value.GetVR(); if (!vr.IsValid()) { vr = this->FindDictVR(tag); if (vr == vtkDICOMVR::UN) { // let it through if it isn't in the dictionary vr = vtkDICOMVR::SQ; } } // add the item to the sequence, or create a sequence if (vr == vtkDICOMVR::SQ) { size_t i = tagpath.GetIndex(); size_t n = i+1; size_t m = 0; const vtkDICOMItem *oldItems = tptr->Value.GetSequenceData(); if (oldItems != 0) { m = tptr->Value.GetNumberOfValues(); n = (n > m ? n : m); } vtkDICOMValue seq; vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n); // copy the old sequence into the new one (shallow copy) for (size_t j = 0; j < m; j++) { items[j] = oldItems[j]; } // Get the character set and default VR for XS vtkDICOMCharacterSet cs = this->L->CharacterSet; vtkDICOMVR vrForXS = this->L->VRForXS; if (n > m) { const vtkDICOMValue& vcs = this->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } const vtkDICOMValue &v = this->Get(DC::PixelRepresentation); if (v.IsValid()) { vrForXS = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } } for (size_t j = m; j < n; j++) { // Inherit properties that originally came from parent data set items[j] = vtkDICOMItem(cs, vrForXS); } tptr->Value = seq; item = items[i].FindItemOrInsert(tagpath.GetTail(), tagptr); } else if (!tptr->Value.IsValid()) { // we just inserted a non-SQ value, remove it tptr->Prev->Next = tptr->Next; tptr->Next->Prev = tptr->Prev; tptr->Next = 0; tptr->Prev = 0; this->L->NumberOfDataElements--; } } else { item = this; *tagptr = tagpath.GetHead(); } return item; } //---------------------------------------------------------------------------- void vtkDICOMItem::Set(vtkDICOMTag tag, const vtkDICOMValue& v) { vtkDICOMDataElement *tptr = this->FindDataElementOrInsert(tag); tptr->Value = v; if (!v.IsValid()) { // setting a value to the invalid value causes deletion tptr->Prev->Next = tptr->Next; tptr->Next->Prev = tptr->Prev; tptr->Next = 0; tptr->Prev = 0; this->L->NumberOfDataElements--; } } //---------------------------------------------------------------------------- void vtkDICOMItem::Set(const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v) { vtkDICOMTag tag; vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag); // if item is NULL, the path was invalid if (item) { item->Set(tag, v); } } //---------------------------------------------------------------------------- void vtkDICOMItem::Set(const vtkDICOMTagPath& tagpath, double v) { vtkDICOMTag tag; vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag); // if item is NULL, the path was invalid if (item) { vtkDICOMVR vr = item->FindDictVR(tag); assert(vr != vtkDICOMVR::UN); if (vr != vtkDICOMVR::UN) { item->Set(tag, vtkDICOMValue(vr, v)); } } } void vtkDICOMItem::Set(const vtkDICOMTagPath& tagpath, const std::string& v) { vtkDICOMTag tag; vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag); // if item is NULL, the path was invalid if (item) { vtkDICOMVR vr = item->FindDictVR(tag); assert(vr != vtkDICOMVR::UN); // note that there is similar code in vtkDICOMMetaData if (vr.HasSpecificCharacterSet() && item->L != 0) { vtkDICOMCharacterSet cs = item->L->CharacterSet; const vtkDICOMValue& vcs = item->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } item->Set(tag, vtkDICOMValue(vr, cs, v)); } else if (vr != vtkDICOMVR::UN) { item->Set(tag, vtkDICOMValue(vr, v)); } } } //---------------------------------------------------------------------------- void vtkDICOMItem::Set(vtkDICOMTag tag, double v) { this->Set(vtkDICOMTagPath(tag), v); } void vtkDICOMItem::Set(vtkDICOMTag tag, const std::string& v) { this->Set(vtkDICOMTagPath(tag), v); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMItem::Get(vtkDICOMTag tag) const { if (this->L) { vtkDICOMDataElement *e = this->L->Head.Next; vtkDICOMDataElement *tail = &this->L->Tail; while (e != tail) { if (e->Tag == tag) { return e->Value; } e = e->Next; } } return vtkDICOMItem::InvalidValue; } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMItem::Get(const vtkDICOMTagPath &tagpath) const { const vtkDICOMValue &v = this->Get(tagpath.GetHead()); if (!tagpath.HasTail()) { return v; } if (v.IsValid()) { size_t i = tagpath.GetIndex(); size_t n = v.GetNumberOfValues(); const vtkDICOMItem *items = v.GetSequenceData(); if (items != 0 && i < n) { return items[i].Get(tagpath.GetTail()); } } return vtkDICOMItem::InvalidValue; } //---------------------------------------------------------------------------- vtkDICOMVR vtkDICOMItem::FindDictVR(vtkDICOMTag tag) const { vtkDICOMVR vr = vtkDICOMVR::UN; vtkDICOMDictEntry e = this->FindDictEntry(tag); if (e.IsValid()) { vr = e.GetVR(); // use the dictionary VR if (vr == vtkDICOMVR::XS) { const vtkDICOMValue &v = this->Get(DC::PixelRepresentation); if (v.IsValid()) { unsigned short r = v.AsUnsignedShort(); vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } else if (this->L) { vr = this->L->VRForXS; } else { vr = vtkDICOMVR::US; } } else if (vr == vtkDICOMVR::OX) { vr = vtkDICOMVR::OW; vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ? DC::WaveformBitsAllocated : DC::BitsAllocated); const vtkDICOMValue& v = this->Get(reftag); if (v.IsValid() && v.AsUnsignedShort() <= 8) { vr = vtkDICOMVR::OB; } } } return vr; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMItem::ResolvePrivateTag( vtkDICOMTag ptag, const std::string& creator) const { unsigned short g = ptag.GetGroup(); if ((g & 0x0001) == 0) { return ptag; } // if not resolved, the result will be (ffff,ffff) vtkDICOMTag otag(0xFFFF, 0xFFFF); vtkDICOMTag ctag(g, 0x0010); vtkDICOMTag etag(g, 0x00FF); vtkDICOMDataElementIterator iter = this->Begin(); vtkDICOMDataElementIterator iterEnd = this->End(); // search for the correct group while (iter != iterEnd && iter->GetTag() < ctag) { ++iter; } // look for private creator elements within the group while (iter != iterEnd && iter->GetTag() <= etag) { ctag = iter->GetTag(); if (iter->GetValue().AsString() == creator) { otag = vtkDICOMTag( g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF)); break; } ++iter; } return otag; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMItem::ResolvePrivateTagForWriting( vtkDICOMTag ptag, const std::string& creator) { vtkDICOMTag otag = this->ResolvePrivateTag(ptag, creator); if (otag == vtkDICOMTag(0xFFFF, 0xFFFF)) { unsigned short g = ptag.GetGroup(); for (unsigned short e = 0x0010; e <= 0x00FF; e++) { vtkDICOMTag ctag(g, e); vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag); if (!d->Value.IsValid()) { // creator elements are LO, which uses SpecificCharacterSet vtkDICOMCharacterSet cs = this->L->CharacterSet; const vtkDICOMValue& vcs = this->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } // if an empty slot was found, use it for this creator d->Tag = ctag; d->Value = vtkDICOMValue(vtkDICOMVR::LO, cs, creator); otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF)); break; } } } return otag; } //---------------------------------------------------------------------------- vtkDICOMDictEntry vtkDICOMItem::FindDictEntry(vtkDICOMTag tag) const { unsigned short group = tag.GetGroup(); unsigned short element = tag.GetElement(); // note that there is similar code in vtkDICOMMetaData const char *dict = 0; if ((group & 1) != 0 && element > 0x00ffu) { unsigned short creatorElement = (element >> 8); element &= 0x00ffu; tag = vtkDICOMTag(group, element); vtkDICOMTag creatorTag(group, creatorElement); dict = this->Get(creatorTag).GetCharData(); } return vtkDICOMDictionary::FindDictEntry(tag, dict); } //---------------------------------------------------------------------------- bool vtkDICOMItem::operator==(const vtkDICOMItem& ob) const { List *t = this->L; List *o = ob.L; bool r = true; if (t != o) { r = false; if (t != 0 && o != 0 && t->NumberOfDataElements == o->NumberOfDataElements) { r = true; int n = t->NumberOfDataElements; if (n > 0) { vtkDICOMDataElement *a = t->Head.Next; vtkDICOMDataElement *b = o->Head.Next; do { r &= (*a == *b); a = a->Next; b = b->Next; } while (r && --n); } } } return r; } vtk-dicom-0.8.12/Source/vtkDICOMItem.h000066400000000000000000000210241356440565500173230ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMItem_h #define vtkDICOMItem_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMDataElement.h" #include "vtkDICOMDictEntry.h" #include "vtkDICOMReferenceCount.h" #include class vtkDICOMTagPath; class vtkDICOMMetaData; //! An item in a DICOM sequence (type SQ). /*! * A DICOM sequence is a list of items, where each item is * essentially a data set of its own. An item consists of * zero or more data elements, each with a tag and value. */ class VTKDICOM_EXPORT vtkDICOMItem { private: //! A reference counted list container class. struct List { vtkDICOMDataElement Head; vtkDICOMDataElement Tail; vtkDICOMReferenceCount ReferenceCount; int NumberOfDataElements; vtkDICOMDataElement *DataElements; unsigned int ByteOffset; bool Delimited; vtkDICOMCharacterSet CharacterSet; vtkDICOMVR VRForXS; List() : Head(), Tail(), ReferenceCount(1), NumberOfDataElements(0), DataElements(0), ByteOffset(0), Delimited(false), CharacterSet(vtkDICOMCharacterSet::ISO_IR_6), VRForXS(vtkDICOMVR::US) {} }; public: //@{ //! Default constructor creates an empty item. vtkDICOMItem() : L(0) {} //! Constructor that takes certain properties from the data set. /*! * Specifically, this checks the values of SpecificCharacterSet (so that * the item knows what character set to use), of PixelRepresentation (so * that the item knows whether to resolve a VR of XS to US or SS, and of * BitsAllocated (so that the item knows whether to resolve a VR of OX * to OB or OW). This is the preferred constructor for vtkDICOMItem. */ explicit vtkDICOMItem(vtkDICOMMetaData *meta); //! Constructor with flag for delimitation and offset. /*! * This constructor is used by the parser to record where the item * was in the file, whether the item was delimited, and what the * character set and default VR for XS are. */ explicit vtkDICOMItem( vtkDICOMCharacterSet cs, vtkDICOMVR vrForXS, int delimited=0, unsigned int byteOffset=0); //! Copy constructor does reference counting. vtkDICOMItem(const vtkDICOMItem &o) : L(o.L) { if (this->L) { ++(this->L->ReferenceCount); } } //! Destructor does reference counting. ~vtkDICOMItem() { this->Clear(); } //@} //@{ //! Clear the data. void Clear() { if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); } else { this->L = 0; } } //! Check if empty. bool IsEmpty() const { return (this->L == 0); } //! Check if this was read as a delimited item. bool IsDelimited() const { return (this->L == 0 || this->L->Delimited != 0); } //@} //@{ //! Add a data element to this item. /*! * If you specify a string, it must either be an ASCII string, or it must * be encoded in the SpecificCharacterSet for this item. */ void Set(vtkDICOMTag tag, const vtkDICOMValue& v); void Set(vtkDICOMTag tag, double v); void Set(vtkDICOMTag tag, const std::string& v); void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v) { this->Set(tag, v); } void SetAttributeValue(vtkDICOMTag tag, double v) { this->Set(tag, v); } void SetAttributeValue(vtkDICOMTag tag, const std::string& v) { this->Set(tag, v); } //@} //@{ //! Add a data element at the specified path. /*! * The data element is inserted at the tail of the given path. If the * path lies within a sequence that does not yet exist, then the sequence * will be created. If an item index in the path points to an item that * does not exist, then that item will be created. */ void Set(const vtkDICOMTagPath& tag, const vtkDICOMValue& v); void Set(const vtkDICOMTagPath& tag, double v); void Set(const vtkDICOMTagPath& tag, const std::string& v); void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v) { this->Set(tag, v); } void SetAttributeValue(const vtkDICOMTagPath& tag, double v) { this->Set(tag, v); } void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v) { this->Set(tag, v); } //@} //@{ //! Get a data element from this item. const vtkDICOMValue &Get(vtkDICOMTag tag) const; const vtkDICOMValue &Get(const vtkDICOMTagPath &tag) const; const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag) const { return this->Get(tag); } const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &tag) const { return this->Get(tag); } //@} //@{ //! Get the offset of this item from the beginning of the file. /*! * Some DICOM files, such as DICOMDIR files, index into sequences via * byte offsets into the file. Because of this, it is necessary to * know the byte offset of each item in the sequence. */ unsigned int GetByteOffset() const { return (this->L == 0 ? 0 : this->L->ByteOffset); } //@} //@{ //! Get the number of data elements. int GetNumberOfDataElements() const { return (this->L ? this->L->NumberOfDataElements : 0); } //! Get an iterator for the list of data elements. vtkDICOMDataElementIterator Begin() const { return (this->L ? this->L->Head.Next : 0); } //! Get an end iterator for the list of data elements. vtkDICOMDataElementIterator End() const { return (this->L ? &this->L->Tail : 0); } //@} //@{ //! Resolve a private tag, or return (ffff,ffff) if not resolved. /*! * Private data elements are mobile, which means that different data * sets might store them at different locations. Given a private * data element which has a tag of (gggg,xxee) according to its * dictionary, the first two element digits "xx" can change from one * data set to the next, and the data set must have a "Creator Element" * at (gggg,00xx) to allow the digits of "xx" to be resolved. Please * read DICOM Part 5 Section 7.8 for additional information. */ vtkDICOMTag ResolvePrivateTag( vtkDICOMTag ptag, const std::string& creator) const; //! Resolve a private tag, and add the creator to the data set. /*! * This method works like ResolvePrivateTag, except that if the creator * is not found in the data set, it will be added. It should be used to * resolve private tags that you plan to write to the data set. The * returned tag will be (ffff,ffff) if there are no empty slots available * for the creator. Every private group has 240 available slots. */ vtkDICOMTag ResolvePrivateTagForWriting( vtkDICOMTag ptag, const std::string& creator); //@} //@{ //! Look up a tag in the DICOM dictionary. /*! * Unlike the method in vtkDICOMDictionary, this method can identify * the implementor of a private tag and look it up in the implementor's * dictionary. */ vtkDICOMDictEntry FindDictEntry(vtkDICOMTag tag) const; //! Use the dictionary to get the VR, returns UN on failure. vtkDICOMVR FindDictVR(vtkDICOMTag tag) const; //@} //@{ bool operator==(const vtkDICOMItem& o) const; bool operator!=(const vtkDICOMItem& o) const { return !(*this == o); } //@} //@{ //! Assignment operator does reference counting. vtkDICOMItem &operator=(const vtkDICOMItem &o) { if (this->L != o.L) { if (o.L) { ++(o.L->ReferenceCount); } if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); } this->L = o.L; } return *this; } //@} private: void FreeList(); vtkDICOMDataElement *NewDataElement(vtkDICOMDataElement **iter); static void CopyList(const List *o, List *t); static void CopyDataElements( const vtkDICOMDataElement *begin, const vtkDICOMDataElement *end, List *t); //! Find a tag, value pair or insert a pair if not found. vtkDICOMDataElement *FindDataElementOrInsert(vtkDICOMTag tag); //! Find a child item for a tag path, or insert if not there. vtkDICOMItem *FindItemOrInsert( const vtkDICOMTagPath& tagpath, vtkDICOMTag *tagptr); //! An invalid value, for when one is needed. static const vtkDICOMValue InvalidValue; //! A linked list to hold the elements. List *L; }; #endif /* vtkDICOMItem_h */ // VTK-HeaderTest-Exclude: vtkDICOMItem.h vtk-dicom-0.8.12/Source/vtkDICOMLookupTable.cxx000066400000000000000000000457361356440565500212410ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMLookupTable.h" #include "vtkDICOMMetaData.h" #include "vtkObjectFactory.h" #include vtkStandardNewMacro(vtkDICOMLookupTable); //---------------------------------------------------------------------------- vtkDICOMLookupTable::vtkDICOMLookupTable() { } //---------------------------------------------------------------------------- vtkDICOMLookupTable::~vtkDICOMLookupTable() { } //---------------------------------------------------------------------------- void vtkDICOMLookupTable::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- void vtkDICOMLookupTable::BuildStandardPalette(const char *cs) { if (cs == 0) { vtkErrorMacro("Null string passed to BuildStandardPalette()!"); } else if (strcmp(cs, "HOT_IRON") == 0) { // use small adjustments to exactly match the DICOM hot iron table, // while still maintaining the ability to create a table of any size int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); if (x < 0.5) { rgba[0] = 2.0*x; } else if (x < 0.5 + 0.5/255.0) { rgba[0] = 1.0; } else if (x < 0.75 - 0.25/255.0) { rgba[0] = 1.0; rgba[1] = 2.0*x - (1.0 + 1.0/255.0); } else if (x < 1.0 - 0.25/255.0) { rgba[0] = 1.0; rgba[1] = 2.0*x - (1.0 + 1.0/255.0); rgba[2] = 4.0*x - (3.0 - 1.0/255.0); } else if (x < 1.0) { rgba[0] = 1.0; rgba[1] = 2.0*x - (1.0 + 1.0/255.0); rgba[2] = 1.0; } else { rgba[0] = 1.0; rgba[1] = 1.0; rgba[2] = 1.0; } cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "PET") == 0) { // algorithmically create the table, this uses linear segments that // have been fit to the numerical data in the standard table int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); if (x < 0.2475252060520769 - 0.5/(n - 1)) { rgba[1] = 2.024199843871975*x - 0.001028608164577255; rgba[2] = 2.0*x - 0.00392156862745098; } else if (x < 0.2475252060520769 + 0.5/(n - 1)) { rgba[1] = 0.5; rgba[2] = 2.0*x - 0.00392156862745098; } else if (x < 0.5019607843137255) { rgba[0] = 1.9792076771653557*x -0.49153398564149964; rgba[1] = -1.9765567765567764*x + 0.9892594986712628; rgba[2] = 2.0*x - 0.00392156862745098; } else if (x < 0.5029411764705882) { rgba[0] = 1.9792076771653557*x -0.49153398564149964; rgba[1] = -1.9765567765567764*x + 0.9892594986712628; rgba[2] = 1.0; } else if (x < 0.7531036189872085) { rgba[0] = 1.9792076771653557*x -0.49153398564149964; rgba[1] = 2.0*x - 1.00392156862745; rgba[2] = -4.0*x + 3.011764705882353; } else if (x < 1.0) { rgba[0] = 1.0; rgba[1] = 2.0*x - 1.00392156862745; rgba[2] = 4.0428344791115824*x - 3.045323047251687; } else { rgba[0] = 1.0; rgba[1] = 1.0; rgba[2] = 1.0; } cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "HOT_METAL_BLUE") == 0) { // algorithmically create the "hot metal blue" table int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); if (x < 0.3333333333333333) { rgba[2] = 1.96*x; } else if (x < 0.4) { rgba[0] = 3.0*x - 1.0; rgba[2] = 1.96*x; } else if (x < 0.4666666666666666) { rgba[0] = 2.25*x - 0.7; rgba[2] = 1.96 - 2.94*x; } else if (x < 0.5333333333333333) { rgba[0] = 3.0*x - 1.05; rgba[1] = 1.875*x - 0.875; rgba[2] = 3.332 - 5.88*x; } else if (x < 0.6) { rgba[0] = 3.0*x - 1.05; rgba[1] = 1.875*x - 0.875; rgba[2] = 1.764 - 2.94*x; } else if (x < 0.6666666666666666) { rgba[0] = 3.75*x - 1.5; rgba[1] = 1.875*x - 0.875; rgba[2] = 0.0; } else if (x < 0.9333333333333333) { rgba[0] = 1.0; rgba[1] = 1.875*x - 0.875; rgba[2] = 2.95*x - 1.9666666666666666; } else if (x < 1.0) { rgba[0] = 1.0; rgba[1] = 1.875*x - 0.875; rgba[2] = 3.2*x - 2.2; } else { rgba[0] = 1.0; rgba[1] = 1.0; rgba[2] = 1.0; } cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "PET_20_STEP") == 0) { // segment the table into 20 steps double values[20][4] = { { 0.0, 0.0, 0.0, 1.0 }, { 0.3764705882352941, 0.0, 0.3137254901960784, 1.0 }, { 0.18823529411764706, 0.18823529411764706, 0.3137254901960784, 1.0 }, { 0.18823529411764706, 0.18823529411764706, 0.4392156862745098, 1.0 }, { 0.3137254901960784, 0.3137254901960784, 0.5019607843137255, 1.0 }, { 0.3764705882352941, 0.3764705882352941, 0.6901960784313725, 1.0 }, { 0.4392156862745098, 0.4392156862745098, 0.7529411764705882, 1.0 }, { 0.5019607843137255, 0.5019607843137255, 0.8784313725490196, 1.0 }, { 0.18823529411764706, 0.3764705882352941, 0.18823529411764706, 1.0 }, { 0.18823529411764706, 0.5647058823529412, 0.18823529411764706, 1.0 }, { 0.3137254901960784, 0.7529411764705882, 0.3137254901960784, 1.0 }, { 0.25098039215686274, 0.8784313725490196, 0.25098039215686274, 1.0 }, { 0.8784313725490196, 0.8784313725490196, 0.3137254901960784, 1.0 }, { 0.8156862745098039, 0.8156862745098039, 0.3764705882352941, 1.0 }, { 0.8156862745098039, 0.6901960784313725, 0.25098039215686274, 1.0 }, { 0.8156862745098039, 0.5647058823529412, 0.0, 1.0 }, { 0.7529411764705882, 0.3764705882352941, 0.0, 1.0 }, { 0.6901960784313725, 0.18823529411764706, 0.0, 1.0 }, { 1.0, 0.0, 0.0, 1.0 }, { 1.0, 1.0, 1.0, 1.0 } }; int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); double *rgba; if (x < 0.05) { rgba = values[0]; } else if (x < 0.10) { rgba = values[1]; } else if (x < 0.15) { rgba = values[2]; } else if (x < 0.20) { rgba = values[3]; } else if (x < 0.25) { rgba = values[4]; } else if (x < 0.30) { rgba = values[5]; } else if (x < 0.35) { rgba = values[6]; } else if (x < 0.40) { rgba = values[7]; } else if (x < 0.45) { rgba = values[8]; } else if (x < 0.50) { rgba = values[9]; } else if (x < 0.55) { rgba = values[10]; } else if (x < 0.60) { rgba = values[11]; } else if (x < 0.65) { rgba = values[12]; } else if (x < 0.70) { rgba = values[13]; } else if (x < 0.75) { rgba = values[14]; } else if (x < 0.80) { rgba = values[15]; } else if (x < 0.85) { rgba = values[16]; } else if (x < 0.90) { rgba = values[17]; } else if (x < 0.95) { rgba = values[18]; } else { rgba = values[19]; } cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "SPRING") == 0) { int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); rgba[0] = 1.0; rgba[1] = x; rgba[2] = 1.0 - x; cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "SUMMER") == 0) { int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); rgba[0] = x; rgba[1] = 0.5 + 0.5*x; rgba[2] = 0.4; cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } } else if (strcmp(cs, "FALL") == 0) { int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); rgba[0] = 1.0; rgba[1] = x; rgba[2] = 0.0; cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } this->Modified(); } else if (strcmp(cs, "WINTER") == 0) { int n = this->GetNumberOfColors(); unsigned char *cptr = this->WritePointer(0, n); double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int i = 0; i < n; i++) { double x = static_cast(i)/(n - 1); rgba[0] = 0.0; rgba[1] = x; rgba[2] = 1.0 - x*0.5; cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } } } //---------------------------------------------------------------------------- void vtkDICOMLookupTable::BuildImagePalette( vtkDICOMMetaData *meta, int fileIndex) { const DC::EnumType descTag[] = { DC::RedPaletteColorLookupTableDescriptor, DC::GreenPaletteColorLookupTableDescriptor, DC::BluePaletteColorLookupTableDescriptor, DC::AlphaPaletteColorLookupTableDescriptor }; const DC::EnumType dataTag[] = { DC::RedPaletteColorLookupTableData, DC::GreenPaletteColorLookupTableData, DC::BluePaletteColorLookupTableData, DC::AlphaPaletteColorLookupTableData }; const DC::EnumType segTag[] = { DC::SegmentedRedPaletteColorLookupTableData, DC::SegmentedGreenPaletteColorLookupTableData, DC::SegmentedBluePaletteColorLookupTableData, DC::SegmentedAlphaPaletteColorLookupTableData }; int isSigned = meta->Get(fileIndex, DC::PixelRepresentation).AsInt(); int minValue = VTK_INT_MAX; int maxValue = VTK_INT_MIN; int firstValue[4] = { 0, 0, 0, 0 }; int lastValue[4] = { 0, 0, 0, 0 }; double divisor[4] = { 255.0, 255.0, 255.0, 255.0 }; const unsigned short *spp[4] = { 0, 0, 0, 0 }; const unsigned char *cpp[4] = { 0, 0, 0, 0 }; const unsigned short *segpp[4] = { 0, 0, 0, 0 }; unsigned int segn[4] = { 0, 0, 0, 0 }; for (int j = 0; j < 4; j++) { const vtkDICOMValue& v = meta->Get(fileIndex, descTag[j]); // Descriptor must have three values if (v.GetNumberOfValues() == 3) { // First value is number of entries in the this int n = v.GetUnsignedShort(0); n = (n == 0 ? 65536 : n); // Second value is the first pixel value that is mapped unsigned short f = v.GetUnsignedShort(1); firstValue[j] = (isSigned ? static_cast(f) : f); // Compute the last pixel value that is mapped lastValue[j] = firstValue[j] + n - 1; minValue = (firstValue[j] < minValue ? firstValue[j] : minValue); maxValue = (lastValue[j] > maxValue ? lastValue[j] : maxValue); // Third value is the number of bits per lookup table entry int nbits = v.GetUnsignedShort(2); divisor[j] = (nbits == 0 ? 1.0 : (1u << nbits) - 1.0); // Get the lookup table data and confirm its size const vtkDICOMValue& d = meta->Get(fileIndex, dataTag[j]); if (d.IsValid()) { if (d.GetVL() >= static_cast(2*n)) { spp[j] = d.GetUnsignedShortData(); } else if (d.GetVL() >= static_cast(n)) { cpp[j] = d.GetUnsignedCharData(); if (cpp[j] == 0) { cpp[j] = reinterpret_cast( d.GetUnsignedShortData()); } } } else { // Search for segmented table data const vtkDICOMValue& s = meta->Get(fileIndex, segTag[j]); segpp[j] = s.GetUnsignedShortData(); segn[j] = s.GetVL()/2; } } } if (maxValue > minValue) { // Generate the lookup table this->SetRange(minValue, maxValue); this->SetNumberOfColors(maxValue - minValue + 1); unsigned char *cptr = this->WritePointer(0, maxValue - minValue + 1); for (int i = minValue; i <= maxValue; i++) { double rgba[4] = { 0.0, 0.0, 0.0, 1.0 }; for (int j = 0; j < 4; j++) { int k = i - firstValue[j]; if (i < firstValue[j]) { k = 0; } if (i > lastValue[j]) { k = lastValue[j] - firstValue[j]; } if (spp[j]) { rgba[j] = spp[j][k] / divisor[j]; } else if (cpp[j]) { rgba[j] = cpp[j][k] / divisor[j]; } } cptr[0] = static_cast(rgba[0]*255.0 + 0.5); cptr[1] = static_cast(rgba[1]*255.0 + 0.5); cptr[2] = static_cast(rgba[2]*255.0 + 0.5); cptr[3] = static_cast(rgba[3]*255.0 + 0.5); cptr += 4; } // Handle segmented lookup tables cptr = this->WritePointer(0, maxValue - minValue + 1); for (int j = 0; j < 4; j++) { if (segpp[j]) { if (!vtkDICOMLookupTable::BuildSegmentedLUT( segpp[j], segn[j], divisor[j], cptr+j, 4, maxValue-minValue+1)) { static const char *names[] = { "Red", "Green", "Blue", "Alpha" }; vtkErrorMacro("Bad data in Segmented " << names[j] << " PaletteColorLookupTableData"); } } } } this->Modified(); } //---------------------------------------------------------------------------- bool vtkDICOMLookupTable::BuildSegmentedLUT( const unsigned short *input, unsigned int n, double divisor, unsigned char *lut, unsigned int stride, unsigned int count) { // i is position in input, j is position in output unsigned int i = 0; unsigned int j = 0; while (i+1 < n) { unsigned char opcode = input[i++]; if (opcode == 0) { // discrete segment unsigned short l = input[i++]; for (unsigned short k = 0; k < l && i < n && j < count; k++, j++, i++) { double y = input[i]/divisor; lut[j*stride] = static_cast(y*255.0 + 0.5); } } else if (opcode == 1) { // linear segment unsigned short l = input[i++]; double y0 = 0.0; if (j > 0) { // start of the ramp y0 = lut[(j - 1)*stride]/255.0; } if (i < n) { // end of the ramp double y1 = input[i++]/divisor; // generate the ramp for (unsigned short k = 0; k < l && j < count; k++, j++) { double y = y0 + (k + 1)*(y1 - y0)/l; lut[j*stride] = static_cast(y*255.0 + 0.5); } } } else if (opcode == 2) { // indirect segment bool failed = true; unsigned short nseg = input[i++]; if (i + 1 < n) { failed = false; // offset to first segment to use unsigned int offset = input[i++]; offset += input[i++] << 16; // m is the number of input elements referred to, and // l is the number of lut entries that will be generated unsigned int m = 0; unsigned int l = 0; // compute m by looking at the segments for (unsigned int k = 0; k < nseg && offset + m + 1 < n; k++) { unsigned short opcode2 = input[offset + m++]; if (opcode2 == 0) { // discrete l += input[offset + m]; m += 1 + input[offset + m]; } else if (opcode2 == 1) { // linear l += input[offset + m]; m += 2; } else { // illegal opcode failed = true; break; } } if (offset + m <= n) { // add the referenced segments via recursion BuildSegmentedLUT( &input[offset], m, divisor, &lut[j*stride], stride, count-j); // increment the position in the output lut if (j + l > count) { l = count - j; } j += l; } } if (failed) { break; } } else { // unrecognized opcode break; } } if (j < count) { // If write was incomplete, fill the remainder of the lookup table // with alternating high and low to visually indicate that a // problem occurred. while (j < count) { lut[j*stride] = (j & 1)*255; j++; } return false; } return true; } vtk-dicom-0.8.12/Source/vtkDICOMLookupTable.h000066400000000000000000000052121356440565500206470ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMLookupTable * \brief Lookup tables from DICOM data. * * This class can create VTK lookup tables from the information in a * DICOM data set. Lookup tables can be created from a palette LUT, * or from standard DICOM LUTs such as HOT_IRON. */ #ifndef vtkDICOMLookupTable_h #define vtkDICOMLookupTable_h #include "vtkLookupTable.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkDICOMMetaData; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMLookupTable : public vtkLookupTable { public: //! Static method for construction. static vtkDICOMLookupTable *New(); vtkTypeMacro(vtkDICOMLookupTable, vtkLookupTable); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //! Build the a standard lookup table, given a code string. /*! * The supported code strings are HOT_IRON, HOT_METAL_BLUE, PET, * PET_20_STEP, SPRING, SUMMER, FALL, and WINTER. This does not * set the range of the table. */ void BuildStandardPalette(const char *name); //! Build the lookup table from the supplied meta data. /*! * An index may be given to specify which data set instance in the * meta data will be used. The range of the table will be set to * the smallest and largest pixel values to be mapped. */ void BuildImagePalette(vtkDICOMMetaData *meta, int idx=0); protected: vtkDICOMLookupTable(); ~vtkDICOMLookupTable(); //! Build a lookup table from compressed data. /*! * This will decompress a segmented lookup table. */ static bool BuildSegmentedLUT( const unsigned short *input, unsigned int n, double divisor, unsigned char *lut, unsigned int stride, unsigned int count); private: #ifdef VTK_DICOM_DELETE vtkDICOMLookupTable(const vtkDICOMLookupTable&) VTK_DICOM_DELETE; void operator=(const vtkDICOMLookupTable&) VTK_DICOM_DELETE; #else vtkDICOMLookupTable(const vtkDICOMLookupTable&) = delete; void operator=(const vtkDICOMLookupTable&) = delete; #endif }; #endif // vtkDICOMLookupTable_h vtk-dicom-0.8.12/Source/vtkDICOMMRGenerator.cxx000066400000000000000000000171701356440565500211740ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMMRGenerator.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkDICOMMetaDataAdapter.h" #include "vtkObjectFactory.h" #include "vtkDataSetAttributes.h" #include "vtkInformation.h" vtkStandardNewMacro(vtkDICOMMRGenerator); //---------------------------------------------------------------------------- vtkDICOMMRGenerator::vtkDICOMMRGenerator() { } //---------------------------------------------------------------------------- vtkDICOMMRGenerator::~vtkDICOMMRGenerator() { } //---------------------------------------------------------------------------- void vtkDICOMMRGenerator::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- bool vtkDICOMMRGenerator::GenerateMRSeriesModule(vtkDICOMMetaData *source) { vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::Modality, "MR"); // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::ReferencedPerformedProcedureStepSequence, // 1C DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source) { // ImageType is specialized from GeneralImageModule, // by adding a third value that is specific to MRI: // MPR, T2 MAP, PHASE MAP, PHASE SUBTRACT, PROJECTION IMAGE, // DIFFUSION MAP, VELOCITY MAP, MODULUS SUBTRACT, T1 MAP, // DENSITY MAP, IMAGE ADDITION, OTHER const char *it = 0; if (source) { it = source->Get(DC::ImageType).GetCharData(); } if (it == 0 || it[0] == '\0') { it = "DERIVED\\SECONDARY\\OTHER"; } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::ImageType, it); // These specialized from ImagePixelModule: // SamplesPerPixel must be 1 // PhotometricInterpretation must be MONOCHROME1 or MONOCHROME2 // BitsAllocated must be 16 // ScanningSequence and SequenceVariant are mandatory: const char *ss = 0; const char *sv = 0; if (source) { ss = source->Get(DC::ScanningSequence).GetCharData(); sv = source->Get(DC::SequenceVariant).GetCharData(); } if (ss == 0 || ss[0] == '\0') { // default to "research mode" ss = "RM"; } if (sv == 0 || sv[0] == '\0') { sv = "NONE"; } meta->Set(DC::ScanningSequence, ss); meta->Set(DC::SequenceVariant, sv); // SpacingBetweenSlices is optional, but everyone uses it meta->Set(DC::SpacingBetweenSlices, this->Spacing[2]); if (source) { // set this to the time dimension if (source->Has(DC::CardiacNumberOfImages)) { meta->Set(DC::CardiacNumberOfImages, this->Dimensions[3]); } // keep this if data was not reformatted if (this->SourceInstanceArray != 0 && source == this->SourceMetaData) { vtkDICOMMetaDataAdapter sourceAdapter(source); const char *ped = sourceAdapter->Get(DC::InPlanePhaseEncodingDirection).GetCharData(); if (ped != 0 && ped[0] != '\0') { meta->Set(DC::InPlanePhaseEncodingDirection, ped); } } } // temporal information if (this->Dimensions[3] > 1) { int n = meta->GetNumberOfInstances(); int nslices = (this->Dimensions[2] > 0 ? this->Dimensions[2] : 1); for (int i = 0; i < n; i++) { int t = (i % (n / nslices)) / (n / (nslices*this->Dimensions[3])); meta->Set(i, DC::TemporalPositionIdentifier, t + 1); } meta->Set( DC::NumberOfTemporalPositions, this->Dimensions[3]); meta->Set( DC::TemporalResolution, this->Spacing[3]); } // required items: use simple read/write validation DC::EnumType required[] = { DC::ScanOptions, DC::MRAcquisitionType, DC::EchoTime, DC::EchoTrainLength, DC::ItemDelimitationItem }; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::RepetitionTime, // 2C, not req'd if EP and not SK DC::InversionTime, // 2C, req'd if ScanningSequence is IR DC::TriggerTime, // 2C, req'd for cardiac gating DC::SequenceName, DC::AngioFlag, DC::NumberOfAverages, DC::ImagingFrequency, DC::ImagedNucleus, DC::EchoNumbers, // can be per-instance DC::MagneticFieldStrength, // DC::SpacingBetweenSlices, // see above DC::NumberOfPhaseEncodingSteps, DC::PercentSampling, DC::PercentPhaseFieldOfView, DC::PixelBandwidth, DC::NominalInterval, DC::BeatRejectionFlag, DC::LowRRValue, DC::HighRRValue, DC::IntervalsAcquired, DC::IntervalsRejected, DC::PVCRejection, DC::SkipBeats, DC::HeartRate, // DC::CardiacNumberOfImages, // see above DC::TriggerWindow, DC::ReconstructionDiameter, DC::ReceiveCoilName, DC::TransmitCoilName, DC::AcquisitionMatrix, // DC::InPlanePhaseEncodingDirection, // see above DC::FlipAngle, DC::SAR, DC::VariableFlipAngleFlag, DC::dBdt, // DC::TemporalPositionIdentifier, // per-instance // DC::NumberOfTemporalPositions, // DC::TemporalResolution, DC::AnatomicRegionSequence, DC::PrimaryAnatomicStructureSequence, DC::ItemDelimitationItem }; return (this->CopyRequiredAttributes(required, source) && this->CopyOptionalAttributes(optional, source)); } //---------------------------------------------------------------------------- bool vtkDICOMMRGenerator::GenerateMRInstance(vtkInformation *info) { this->SetPixelRestrictions( RepresentationSigned | RepresentationUnsigned, BitsStored12 | BitsStored16, 1); const char *SOPClass = "1.2.840.10008.5.1.4.1.1.4"; this->InitializeMetaData(info); vtkDICOMMetaData *source = this->SourceMetaData; if (!this->GenerateSOPCommonModule(source, SOPClass) || !this->GeneratePatientModule(source) || !this->GenerateClinicalTrialSubjectModule(source) || !this->GenerateGeneralStudyModule(source) || !this->GeneratePatientStudyModule(source) || !this->GenerateClinicalTrialStudyModule(source) || !this->GenerateGeneralSeriesModule(source) || !this->GenerateFrameOfReferenceModule(source) || !this->GenerateClinicalTrialSeriesModule(source) || !this->GenerateGeneralEquipmentModule(source) || !this->GenerateGeneralImageModule(source) || !this->GenerateImagePlaneModule(source) || !this->GenerateImagePixelModule(source) || !this->GenerateContrastBolusModule(source) || !this->GenerateDeviceModule(source) || !this->GenerateSpecimenModule(source) || !this->GenerateMRSeriesModule(source) || !this->GenerateMRImageModule(source) || !this->GenerateOverlayPlaneModule(source) || !this->GenerateVOILUTModule(source)) { return false; } return true; } //---------------------------------------------------------------------------- bool vtkDICOMMRGenerator::GenerateInstance(vtkInformation *info) { if (this->MultiFrame) { vtkErrorMacro("Enhanced Multi-Frame MR is not yet supported."); return false; } return this->GenerateMRInstance(info); } vtk-dicom-0.8.12/Source/vtkDICOMMRGenerator.h000066400000000000000000000045141356440565500206170ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMMRGenerator_h #define vtkDICOMMRGenerator_h #include "vtkDICOMGenerator.h" #include "vtkDICOMModule.h" // For export macro //! Generate DICOM data objects for MR images. /*! * Generate a DICOM data set belonging to one of the MR SOP classes. * The assumption is that images have been read into VTK as MR, and * are being written out as derived images after being processed. * The specific IOD classes supported are as follows: * - MR Image, 1.2.840.10008.5.1.4.1.1.4 */ class VTKDICOM_EXPORT vtkDICOMMRGenerator : public vtkDICOMGenerator { public: //! Static method for construction. static vtkDICOMMRGenerator *New(); vtkTypeMacro(vtkDICOMMRGenerator, vtkDICOMGenerator); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //! Generate an instance of one of the supported classes. /*! * This is the primary interface method of this class. Given the * information for a vtkImageData object, it will populate the * attributes of the supplied vtkDICOMMetaData object. */ bool GenerateInstance(vtkInformation *info) VTK_DICOM_OVERRIDE; protected: vtkDICOMMRGenerator(); ~vtkDICOMMRGenerator(); //! Generate the Series Module. virtual bool GenerateMRSeriesModule(vtkDICOMMetaData *source); //! Generate the Image Module. virtual bool GenerateMRImageModule(vtkDICOMMetaData *source); //! Instantiate a DICOM Secondary Capture Image object. virtual bool GenerateMRInstance(vtkInformation *info); private: #ifdef VTK_DICOM_DELETE vtkDICOMMRGenerator(const vtkDICOMMRGenerator&) VTK_DICOM_DELETE; void operator=(const vtkDICOMMRGenerator&) VTK_DICOM_DELETE; #else vtkDICOMMRGenerator(const vtkDICOMMRGenerator&) = delete; void operator=(const vtkDICOMMRGenerator&) = delete; #endif }; #endif // vtkDICOMMRGenerator_h vtk-dicom-0.8.12/Source/vtkDICOMMetaData.cxx000066400000000000000000000755401356440565500204740ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMMetaData.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkObjectFactory.h" #include "vtkMatrix4x4.h" #include "vtkAbstractArray.h" #include "vtkIntArray.h" #include #include #include vtkStandardNewMacro(vtkDICOMMetaData); // The hash table size, must be a power of two #define METADATA_HASH_SIZE 512 //---------------------------------------------------------------------------- // Constructor vtkDICOMMetaData::vtkDICOMMetaData() { this->NumberOfInstances = 1; this->NumberOfDataElements = 0; this->Table = NULL; this->Head.Prev = NULL; this->Head.Next = &this->Tail; this->Tail.Prev = &this->Head; this->Tail.Next = NULL; this->FileIndexArray = NULL; this->FrameIndexArray = NULL; } // Destructor vtkDICOMMetaData::~vtkDICOMMetaData() { this->Clear(); if (this->FileIndexArray) { this->FileIndexArray->Delete(); } if (this->FrameIndexArray) { this->FrameIndexArray->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::Clear() { vtkDICOMDataElement **htable = this->Table; if (htable) { for (unsigned int i = 0; i < METADATA_HASH_SIZE; i++) { delete [] htable[i]; } delete [] htable; } this->NumberOfDataElements = 0; this->Table = NULL; this->Head.Next = &this->Tail; this->Tail.Prev = &this->Head; } //---------------------------------------------------------------------------- void vtkDICOMMetaData::Initialize() { this->Clear(); this->NumberOfInstances = 1; if (this->FileIndexArray) { this->FileIndexArray->Delete(); this->FileIndexArray = 0; } if (this->FrameIndexArray) { this->FrameIndexArray->Delete(); this->FrameIndexArray = 0; } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::SetNumberOfInstances(int n) { if (this->Table != NULL) { vtkErrorMacro("SetNumberOfInstances: Cannot set NumberOfInstances after " "attributes have been added"); } else { this->NumberOfInstances = n; } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::SetFileIndexArray(vtkIntArray *a) { if (this->FileIndexArray != a) { if (this->FileIndexArray) { this->FileIndexArray->Delete(); } this->FileIndexArray = a; if (this->FileIndexArray) { this->FileIndexArray->Register(this); } this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::SetFrameIndexArray(vtkIntArray *a) { if (this->FrameIndexArray != a) { if (this->FrameIndexArray) { this->FrameIndexArray->Delete(); } this->FrameIndexArray = a; if (this->FrameIndexArray) { this->FrameIndexArray->Register(this); } this->Modified(); } } //---------------------------------------------------------------------------- // Erase an element from the hash table void vtkDICOMMetaData::Erase(vtkDICOMTag tag) { unsigned int m = METADATA_HASH_SIZE - 1; unsigned int i = (tag.ComputeHash() & m); vtkDICOMDataElement **htable = this->Table; vtkDICOMDataElement *hptr; if (htable && (hptr = htable[i]) != NULL) { while (hptr->Next != 0) { if (hptr->Tag == tag) { // remove from the linked list hptr->Next->Prev = hptr->Prev; hptr->Prev->Next = hptr->Next; // remove from the hash table hptr[0] = hptr[1]; while (hptr->Next != 0) { // adjust links as necessary hptr->Prev->Next = hptr; hptr->Next->Prev = hptr; hptr++; hptr[0] = hptr[1]; } this->NumberOfDataElements--; break; } hptr++; } } } //---------------------------------------------------------------------------- // Get an element from the hash table. vtkDICOMDataElement *vtkDICOMMetaData::FindDataElement( vtkDICOMTag tag) { unsigned int m = METADATA_HASH_SIZE - 1; unsigned int i = (tag.ComputeHash() & m); vtkDICOMDataElement **htable = this->Table; vtkDICOMDataElement *hptr; if (htable && (hptr = htable[i]) != NULL) { while (hptr->Next != 0) { if (hptr->Tag == tag) { return hptr; } hptr++; } } return NULL; } //---------------------------------------------------------------------------- bool vtkDICOMMetaData::Has(vtkDICOMTag tag) { return (this->FindDataElement(tag) != 0); } //---------------------------------------------------------------------------- const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue( int idx, vtkDICOMTag tag) { vtkDICOMDataElement *a = this->FindDataElement(tag); const vtkDICOMValue *vptr = 0; if (a != 0) { vptr = &a->Value; // is this a sequence of values? const vtkDICOMValue *sptr = vptr->GetMultiplexData(); if (sptr) { size_t n = vptr->GetNumberOfValues(); vptr = 0; if (idx >= 0 && static_cast(idx) < n) { if (sptr[idx].IsValid()) { vptr = &sptr[idx]; } } } } return vptr; } //---------------------------------------------------------------------------- const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue( int idx, const vtkDICOMTagPath& tagpath) { const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath.GetHead()); if (vptr != 0 && tagpath.HasTail()) { size_t i = tagpath.GetIndex(); size_t n = vptr->GetNumberOfValues(); const vtkDICOMItem *items = vptr->GetSequenceData(); vptr = 0; if (items != 0 && i < n) { vptr = &items[i].Get(tagpath.GetTail()); if (!vptr->IsValid()) { vptr = 0; } } } return vptr; } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get(vtkDICOMTag tag) { const vtkDICOMValue *vptr = this->FindAttributeValue(0, tag); return (vptr ? *vptr : this->Tail.Value); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get(int idx, vtkDICOMTag tag) { const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tag); return (vptr ? *vptr : this->Tail.Value); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get(const vtkDICOMTagPath &tagpath) { const vtkDICOMValue *vptr = this->FindAttributeValue(0, tagpath); return (vptr ? *vptr : this->Tail.Value); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get( int idx, const vtkDICOMTagPath &tagpath) { const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath); return (vptr ? *vptr : this->Tail.Value); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get( int idx, int frame, const vtkDICOMTagPath &tagpath) { // if either of these is present in an enhanced DICOM file, then they // will be searched before the root is searched const DC::EnumType fgs[2] = { DC::PerFrameFunctionalGroupsSequence, DC::SharedFunctionalGroupsSequence }; // for temporarily saving location to private value (see below) const vtkDICOMValue *privateValue = 0; // search PerFrame and then Shared functional sequences, if present // (if frame is "-1", then only search SharedFunctionalGroups) int istart = (frame < 0 ? 1 : 0); for (int i = istart; i < 2; i++) { // we only need the frame number for the PerFrame sequence size_t f = (i == 0 ? frame : 0); const vtkDICOMValue *seq = this->FindAttributeValue(idx, fgs[i]); if (seq && f < seq->GetNumberOfValues()) { // search for the item that matches the frame const vtkDICOMItem *items = seq->GetSequenceData(); const vtkDICOMValue &v = items[f].Get(tagpath); if (v.IsValid()) { return v; } // search within all the sequences in the item vtkDICOMDataElementIterator iter = items[f].Begin(); vtkDICOMDataElementIterator iterEnd = items[f].End(); while (iter != iterEnd) { const vtkDICOMValue &u = iter->GetValue(); if (u.GetNumberOfValues() == 1) { const vtkDICOMItem *item = u.GetSequenceData(); if (item) { const vtkDICOMValue &w = item->Get(tagpath); if (w.IsValid()) { if ((iter->GetTag().GetGroup() & 1) == 0) { return w; } else if (privateValue == 0) { // if we found the attribute in a private sequence, // then save but and keep searching to see if it will // eventually be found somewhere public privateValue = &w; } } } } ++iter; } } } // search root last of all const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath); // try private value (see above) if attribute wasn't found vptr = (vptr ? vptr : privateValue); return (vptr ? *vptr : this->Tail.Value); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaData::Get(int idx, int frame, vtkDICOMTag tag) { return this->Get(idx, frame, vtkDICOMTagPath(tag)); } //---------------------------------------------------------------------------- int vtkDICOMMetaData::GetFileIndex(int sliceIdx) { if (this->FileIndexArray == 0 || sliceIdx < 0 || sliceIdx >= this->FileIndexArray->GetNumberOfTuples()) { return -1; } int n = this->FileIndexArray->GetNumberOfComponents(); return this->FileIndexArray->GetValue(sliceIdx*n); } //---------------------------------------------------------------------------- int vtkDICOMMetaData::GetFileIndex(int sliceIdx, int compIdx, int numComp) { if (this->FileIndexArray == 0 || sliceIdx < 0 || sliceIdx >= this->FileIndexArray->GetNumberOfTuples() || compIdx < 0 || compIdx >= numComp) { return -1; } int n = this->FileIndexArray->GetNumberOfComponents(); return this->FileIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp); } //---------------------------------------------------------------------------- int vtkDICOMMetaData::GetFrameIndex(int sliceIdx) { if (this->FrameIndexArray == 0 || sliceIdx < 0 || sliceIdx >= this->FrameIndexArray->GetNumberOfTuples()) { return -1; } int n = this->FrameIndexArray->GetNumberOfComponents(); return this->FrameIndexArray->GetValue(sliceIdx*n); } //---------------------------------------------------------------------------- int vtkDICOMMetaData::GetFrameIndex(int sliceIdx, int compIdx, int numComp) { if (this->FrameIndexArray == 0 || sliceIdx < 0 || sliceIdx >= this->FrameIndexArray->GetNumberOfTuples() || compIdx < 0 || compIdx >= numComp) { return -1; } int n = this->FrameIndexArray->GetNumberOfComponents(); return this->FrameIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp); } //---------------------------------------------------------------------------- // Return a reference to the element within the hash table, which can // be used to insert a new value. vtkDICOMDataElement *vtkDICOMMetaData::FindDataElementOrInsert( vtkDICOMTag tag) { unsigned int m = METADATA_HASH_SIZE - 1; unsigned int i = (tag.ComputeHash() & m); vtkDICOMDataElement **htable = this->Table; vtkDICOMDataElement *hptr; if (htable == NULL) { // allocate the hash table m = METADATA_HASH_SIZE; htable = new vtkDICOMDataElement *[METADATA_HASH_SIZE]; this->Table = htable; do { *htable++ = NULL; } while (--m); htable = this->Table; } hptr = htable[i]; if (hptr == NULL) { hptr = new vtkDICOMDataElement[4]; htable[i] = hptr; } else if (hptr->Next != 0) { // see if item is already there unsigned int n = 0; do { if (hptr->Tag == tag) { return hptr; } n++; hptr++; } while (hptr->Next != 0); // if n+1 is a power of two, double allocated space if (n > 2 && (n & (n+1)) == 0) { vtkDICOMDataElement *oldptr = htable[i]; hptr = new vtkDICOMDataElement[2*(n+1)]; htable[i] = hptr; // copy the old list for (unsigned int j = 0; j < n; j++) { *hptr = oldptr[j]; // link the new element into the list hptr->Next->Prev = hptr; hptr->Prev->Next = hptr; hptr++; } delete [] oldptr; } } // insert into the linked list vtkDICOMDataElement *tptr = &this->Tail; do { tptr = tptr->Prev; } while (tag < tptr->GetTag()); hptr->Prev = tptr; hptr->Next = tptr->Next; hptr->Prev->Next = hptr; hptr->Next->Prev = hptr; this->NumberOfDataElements++; return hptr; } //---------------------------------------------------------------------------- int vtkDICOMMetaData::FindItemsOrInsert( int idx, bool useidx, const vtkDICOMTagPath& tagpath, vtkDICOMItem *itemarray[]) { vtkDICOMTag tag = tagpath.GetHead(); vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag); if (loc == 0) { vtkErrorMacro("SetAttributeValue: tag group number must not be zero."); return 0; } loc->Tag = tag; vtkDICOMValue *vptr = &loc->Value; if (!vptr->IsValid()) { vtkDICOMVR vr = this->FindDictVR(idx, tag); if (vr != vtkDICOMVR::SQ && vr != vtkDICOMVR::UN) { // we just inserted a non-SQ value, remove it this->Erase(tag); return 0; } } else if (vptr->GetVR() != vtkDICOMVR::SQ) { return 0; } // is this a series of values? int count = 1; vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr); if (sptr != 0) { if (useidx) { assert(idx >= 0 && idx < this->NumberOfInstances); sptr = &sptr[idx]; } else { count = this->NumberOfInstances; } } else if (useidx && this->NumberOfInstances > 1) { // create a multiplex assert(idx >= 0 && idx < this->NumberOfInstances); int n = this->NumberOfInstances; vtkDICOMValue l; sptr = l.AllocateMultiplexData(vtkDICOMVR::SQ, n); for (int i = 0; i < n; i++) { if (i != idx) { sptr[i] = *vptr; } } *vptr = l; sptr = &sptr[idx]; } else { sptr = vptr; } size_t i = tagpath.GetIndex(); for (int k = 0; k < count; k++) { size_t n = i+1; size_t m = 0; const vtkDICOMItem *oldItems = sptr[k].GetSequenceData(); if (oldItems != 0) { m = sptr[k].GetNumberOfValues(); n = (n > m ? n : m); } vtkDICOMValue seq; vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n); // copy the old sequence into the new one (shallow copy) for (size_t j = 0; j < m; j++) { items[j] = oldItems[j]; } // Get the character set and default VR for XS vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_6; vtkDICOMVR vrForXS = vtkDICOMVR::US; if (n > m) { const vtkDICOMValue& vcs = this->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } const vtkDICOMValue &v = this->Get(DC::PixelRepresentation); if (v.IsValid()) { vrForXS = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } } for (size_t j = m; j < n; j++) { items[j] = vtkDICOMItem(cs, vrForXS); } sptr[k] = seq; itemarray[k] = &items[i]; } return count; } vtkDICOMItem *vtkDICOMMetaData::FindItemOrInsert( int idx, const vtkDICOMTagPath& tagpath) { vtkDICOMItem *itemptr = 0; this->FindItemsOrInsert(idx, true, tagpath, &itemptr); return itemptr; } //---------------------------------------------------------------------------- // Insert an attribute into the hash table void vtkDICOMMetaData::Set(vtkDICOMTag tag, const vtkDICOMValue& v) { if (v.IsValid()) { vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag); if (loc == 0) { vtkErrorMacro("SetAttributeValue: tag group number must not be zero."); return; } loc->Tag = tag; loc->Value = v; } else { this->Erase(tag); } } void vtkDICOMMetaData::Set(vtkDICOMTag tag, double v) { vtkDICOMVR vr = this->FindDictVR(0, tag); if (vr != vtkDICOMVR::UN) { this->Set(tag, vtkDICOMValue(vr, v)); } else { vtkErrorMacro("SetAttributeValue: could not find tag (" << tag << ") in the dictionary"); } } void vtkDICOMMetaData::Set(vtkDICOMTag tag, const std::string& v) { vtkDICOMVR vr = this->FindDictVR(0, tag); if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet) { this->Set(tag, this->MakeValueWithSpecificCharacterSet(vr, v)); } else if (vr != vtkDICOMVR::UN) { this->Set(tag, vtkDICOMValue(vr, v)); } else { vtkErrorMacro("SetAttributeValue: could not find tag (" << tag << ") in the dictionary"); } } //---------------------------------------------------------------------------- // Insert an attribute for a particular image void vtkDICOMMetaData::Set(int idx, vtkDICOMTag tag, const vtkDICOMValue& v) { vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag); if (loc == 0) { vtkErrorMacro("SetAttributeValue: tag group number must not be zero."); return; } loc->Tag = tag; vtkDICOMValue *vptr = &loc->Value; assert(idx >= 0 && idx < this->NumberOfInstances); // is this a sequence of values? vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr); if (sptr) { sptr[idx] = v; if (!v.IsValid()) { // if invalid value was added, make sure valid values remain bool valid = false; for (int i = 0; i < this->NumberOfInstances; i++) { valid |= sptr[i].IsValid(); } if (!valid) { this->Erase(tag); } } else { // if all values are the same, replace with a single value bool same = true; for (int i = 0; i < this->NumberOfInstances && same; i++) { same = (i == idx || sptr[i] == v); } if (same) { loc->Value = v; } } } else if (v != *vptr) { // differs from other instances, must turn value into a list, // so create a value that is actually a list of values int n = this->NumberOfInstances; vtkDICOMValue l; sptr = l.AllocateMultiplexData(vptr->GetVR(), n); for (int i = 0; i < n; i++) { if (i == idx) { sptr[i] = v; } else { sptr[i] = *vptr; } } *vptr = l; } else if (!vptr->IsValid()) { this->Erase(tag); } } void vtkDICOMMetaData::Set(int idx, vtkDICOMTag tag, double v) { vtkDICOMVR vr = this->FindDictVR(idx, tag); if (vr != vtkDICOMVR::UN) { this->Set(idx, tag, vtkDICOMValue(vr, v)); } else { vtkErrorMacro("SetAttributeValue: could not find tag (" << tag << ") in the dictionary"); } } void vtkDICOMMetaData::Set(int idx, vtkDICOMTag tag, const std::string& v) { vtkDICOMVR vr = this->FindDictVR(idx, tag); if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet) { this->Set(idx, tag, this->MakeValueWithSpecificCharacterSet(vr, v)); } else if (vr != vtkDICOMVR::UN) { this->Set(idx, tag, vtkDICOMValue(vr, v)); } else { vtkErrorMacro("SetAttributeValue: could not find tag (" << tag << ") in the dictionary"); } } //---------------------------------------------------------------------------- // Insert an attribute at a particular path void vtkDICOMMetaData::Set( const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v) { if (tagpath.HasTail()) { vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances]; int n = this->FindItemsOrInsert(0, false, tagpath, items); for (int i = 0; i < n; i++) { items[i]->Set(tagpath.GetTail(), v); } delete [] items; } else { this->Set(tagpath.GetHead(), v); } } void vtkDICOMMetaData::Set(const vtkDICOMTagPath& tagpath, double v) { if (tagpath.HasTail()) { vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances]; int n = this->FindItemsOrInsert(0, false, tagpath, items); for (int i = 0; i < n; i++) { items[i]->Set(tagpath.GetTail(), v); } delete [] items; } else { this->Set(tagpath.GetHead(), v); } } void vtkDICOMMetaData::Set( const vtkDICOMTagPath& tagpath, const std::string& v) { if (tagpath.HasTail()) { vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances]; int n = this->FindItemsOrInsert(0, false, tagpath, items); for (int i = 0; i < n; i++) { items[i]->Set(tagpath.GetTail(), v); } delete [] items; } else { this->Set(tagpath.GetHead(), v); } } //---------------------------------------------------------------------------- // Insert an attribute for a particular image void vtkDICOMMetaData::Set( int idx, const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v) { if (tagpath.HasTail()) { vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath); if (item) { item->Set(tagpath.GetTail(), v); } } else { this->Set(idx, tagpath.GetHead(), v); } } void vtkDICOMMetaData::Set(int idx, const vtkDICOMTagPath& tagpath, double v) { if (tagpath.HasTail()) { vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath); if (item) { item->Set(tagpath.GetTail(), v); } } else { this->Set(idx, tagpath.GetHead(), v); } } void vtkDICOMMetaData::Set( int idx, const vtkDICOMTagPath& tagpath, const std::string& v) { if (tagpath.HasTail()) { vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath); if (item) { item->Set(tagpath.GetTail(), v); } } else { this->Set(idx, tagpath.GetHead(), v); } } //---------------------------------------------------------------------------- vtkDICOMValue vtkDICOMMetaData::MakeValueWithSpecificCharacterSet( vtkDICOMVR vr, const std::string& v) { // note that there is similar code in vtkDICOMItem vtkDICOMCharacterSet cs; // defaults to ASCII const vtkDICOMValue& vcs = this->Get(DC::SpecificCharacterSet); if (vcs.IsValid()) { cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL()); } return vtkDICOMValue(vr, cs, v); } //---------------------------------------------------------------------------- void vtkDICOMMetaData::CopyAttributes(vtkDICOMMetaData *o) { // note: this method does not check for collisions between // private tag blocks, so at most one of the two data sets // can safely have private tags when this method is called. if (o != 0 && o != this) { vtkDICOMDataElement **otable = o->Table; if (otable != 0) { const vtkDICOMDataElement *iter = o->Head.Next; const vtkDICOMDataElement *iterEnd = &o->Tail; while (iter != iterEnd) { // if this is a per-instance element, then make a copy of it const vtkDICOMValue *vptr = iter->Value.GetMultiplexData(); if (vptr == 0) { vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag); e->Tag = iter->Tag; e->Value = iter->Value; } else if (this->NumberOfInstances == o->NumberOfInstances) { vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag); e->Tag = iter->Tag; vtkDICOMValue *nvptr = e->Value.AllocateMultiplexData( iter->Value.GetVR(), this->NumberOfInstances); for (int i = 0; i < this->NumberOfInstances; i++) { nvptr[i] = vptr[i]; } } iter = iter->Next; } } } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::ShallowCopy(vtkDataObject *source) { vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source); if (o != this) { this->Initialize(); if (o != 0) { this->NumberOfInstances = o->NumberOfInstances; this->CopyAttributes(o); this->SetFileIndexArray(o->FileIndexArray); this->SetFrameIndexArray(o->FrameIndexArray); } this->vtkDataObject::ShallowCopy(source); } } //---------------------------------------------------------------------------- void vtkDICOMMetaData::DeepCopy(vtkDataObject *source) { vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source); if (o != this) { this->Initialize(); if (o != 0) { this->NumberOfInstances = o->NumberOfInstances; this->CopyAttributes(o); if (o->FileIndexArray) { this->FileIndexArray = vtkIntArray::New(); this->FileIndexArray->DeepCopy(o->FileIndexArray); } if (o->FrameIndexArray) { this->FrameIndexArray = vtkIntArray::New(); this->FrameIndexArray->DeepCopy(o->FrameIndexArray); } } this->vtkDataObject::DeepCopy(source); } } //---------------------------------------------------------------------------- // should only be called from SetAttributeValue vtkDICOMVR vtkDICOMMetaData::FindDictVR(int idx, vtkDICOMTag tag) { vtkDICOMVR vr = vtkDICOMVR::UN; vtkDICOMDictEntry e = this->FindDictEntry(tag); if (e.IsValid()) { vr = e.GetVR(); // use the dictionary VR if (vr == vtkDICOMVR::XS) { vr = vtkDICOMVR::US; const vtkDICOMValue &v = this->Get(idx, DC::PixelRepresentation); if (v.IsValid()) { unsigned short r = v.AsUnsignedShort(); vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } else if (tag > DC::PixelRepresentation) { vtkErrorMacro("SetAttributeValue: could not look up vr for (" << tag << ") because PixelRepresentation is not set."); } } else if (vr == vtkDICOMVR::OX) { vr = vtkDICOMVR::OW; if (tag.GetGroup() == 0x5400) { const vtkDICOMValue &v = this->Get(idx, DC::WaveformBitsAllocated); if (v.IsValid()) { unsigned short s = v.AsUnsignedShort(); vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB); } else { vtkErrorMacro("SetAttributeValue: could not look up vr for (" << tag << ") because WaveformBitsAllocated is not set."); } } else { const vtkDICOMValue &v = this->Get(idx, DC::BitsAllocated); if (v.IsValid()) { unsigned short s = v.AsUnsignedShort(); vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB); } else { vtkErrorMacro("SetAttributeValue: could not look up vr for (" << tag << ") because BitsAllocated is not set."); } } } } return vr; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag( int idx, vtkDICOMTag ptag, const std::string& creator) { unsigned short g = ptag.GetGroup(); if ((g & 0x0001) == 0) { return ptag; } // if not resolved, the result will be (ffff,ffff) vtkDICOMTag otag(0xFFFF, 0xFFFF); vtkDICOMTag ctag(g, 0x0010); vtkDICOMTag etag(g, 0x00FF); vtkDICOMDataElementIterator iter = this->Begin(); vtkDICOMDataElementIterator iterEnd = this->End(); vtkDICOMDataElement *e = this->FindDataElement(ctag); if (e != 0) { // found (gggg,0010) in the hash table iter = vtkDICOMDataElementIterator(e); } else { // skip through list of elements until group is found while (iter != iterEnd && iter->GetTag() < ctag) { ++iter; } } // look for private creator elements within the group idx = (idx < 0 ? 0 : idx); while (iter != iterEnd && iter->GetTag() <= etag) { ctag = iter->GetTag(); const vtkDICOMValue *vp = (iter->IsPerInstance() ? &iter->GetValue(idx) : &iter->GetValue()); if (vp->AsString() == creator) { otag = vtkDICOMTag( g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF)); break; } ++iter; } return otag; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag( vtkDICOMTag ptag, const std::string& creator) { return this->ResolvePrivateTag(0, ptag, creator); } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTagForWriting( int idx, vtkDICOMTag ptag, const std::string& creator) { vtkDICOMTag otag = this->ResolvePrivateTag(idx, ptag, creator); if (otag == vtkDICOMTag(0xFFFF, 0xFFFF)) { unsigned short g = ptag.GetGroup(); for (unsigned short e = 0x0010; e <= 0x00FF; e++) { vtkDICOMTag ctag(g, e); vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag); if (!d->Value.IsValid()) { // if an empty slot was found, use it for this creator d->Tag = ctag; d->Value = this->MakeValueWithSpecificCharacterSet( vtkDICOMVR::LO, creator); otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF)); break; } } } return otag; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTagForWriting( vtkDICOMTag ptag, const std::string& creator) { return this->ResolvePrivateTagForWriting(0, ptag, creator); } //---------------------------------------------------------------------------- vtkDICOMDictEntry vtkDICOMMetaData::FindDictEntry(vtkDICOMTag tag) { unsigned short group = tag.GetGroup(); unsigned short element = tag.GetElement(); // note that there is similar code in vtkDICOMItem const char *dict = 0; if ((group & 1) != 0 && element > 0x00ffu) { unsigned short creatorElement = (element >> 8); element &= 0x00ffu; tag = vtkDICOMTag(group, element); vtkDICOMTag creatorTag(group, creatorElement); dict = this->Get(creatorTag).GetCharData(); } return vtkDICOMDictionary::FindDictEntry(tag, dict); } //---------------------------------------------------------------------------- void vtkDICOMMetaData::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "NumberOfInstances: " << this->NumberOfInstances << "\n"; os << indent << "NumberOfDataElements: " << this->NumberOfDataElements << "\n"; os << indent << "FileIndexArray: " << this->FileIndexArray << "\n"; os << indent << "FrameIndexArray: " << this->FrameIndexArray << "\n"; } vtk-dicom-0.8.12/Source/vtkDICOMMetaData.h000066400000000000000000000334641356440565500201200ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMMetaData_h #define vtkDICOMMetaData_h #include "vtkDataObject.h" #include "vtkStdString.h" // For std::string #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMDataElement.h" // For method parameter #include "vtkDICOMDictEntry.h" // For method parameter class vtkIntArray; class vtkDICOMTagPath; //! A container class for DICOM metadata. /*! * The vtkDICOMMetaData object stores DICOM metadata in a hash table * for efficient access. One vtkDICOMMetaData object can store the * metadata for a series of DICOM images. */ class VTKDICOM_EXPORT vtkDICOMMetaData : public vtkDataObject { public: //! Create a new vtkDICOMMetaData instance. static vtkDICOMMetaData *New(); //! VTK dynamic type information macro. vtkTypeMacro(vtkDICOMMetaData, vtkDataObject); //! Print a summary of the contents of this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Get the number of instances (i.e. files). /*! * We want to track the metadata from all of the files that * make up the image volume that we have loaded into VTK. * This method gives the number of files used to construct * this meta data. All the files should be from the same * series. */ int GetNumberOfInstances() { return this->NumberOfInstances; } void SetNumberOfInstances(int n); //@} //@{ //! Remove all data elements. void Clear(); //! Remove all data elements and initialize all members. void Initialize() VTK_DICOM_OVERRIDE; //@} //@{ //! Get the number of data elements that are present. int GetNumberOfDataElements() { return this->NumberOfDataElements; } //! Get an iterator for the list of data elements. vtkDICOMDataElementIterator Begin() { return this->Head.Next; } //! Get an end iterator for the list of data elements. vtkDICOMDataElementIterator End() { return &this->Tail; } //@} //@{ //! Get the iterator for a specific data element. /*! * If the element was not found, then End() will be returned. */ vtkDICOMDataElementIterator Find(vtkDICOMTag tag) { vtkDICOMDataElement *e = this->FindDataElement(tag); return (e != 0 ? e : &this->Tail); } //@} //@{ //! Check whether an attribute is present in the metadata. bool Has(vtkDICOMTag tag); bool HasAttribute(vtkDICOMTag tag) { return this->Has(tag); } //! Erase an attribute. void Erase(vtkDICOMTag tag); void RemoveAttribute(vtkDICOMTag tag) { this->Erase(tag); } //@} //@{ //! Get an attribute value. /*! * The tag will usually be specified in one of these two ways: * Get(vtkDICOMTag(0x0008,0x1030)) or, using the dictionary enum type, * Get(DC::StudyDescription). If the attribute is not present, then * the returned value will be invalid, i.e. v.IsValid() will be false. */ const vtkDICOMValue &Get(vtkDICOMTag tag); const vtkDICOMValue &Get(const vtkDICOMTagPath &p); const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag) { return this->Get(tag); } const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &p) { return this->Get(p); } //@} //@{ //! Get an attribute value for the specified file index. /*! * If this meta data object is used to hold the meta data for * multiple image instances, then use this method to get an * attribute value for a specific instance. If the attribute * is not present, the value will be invalid, i.e. v.IsValid() * will be false. */ const vtkDICOMValue &Get(int idx, vtkDICOMTag tag); const vtkDICOMValue &Get(int idx, const vtkDICOMTagPath &p); const vtkDICOMValue &GetAttributeValue(int idx, vtkDICOMTag tag) { return this->Get(idx, tag); } const vtkDICOMValue &GetAttributeValue(int idx, const vtkDICOMTagPath &p) { return this->Get(idx, p); } //@} //@{ //! Get an attribute value for the specified file and frame index. /*! * In order to get the file and frame index for a particular slice * of a volume, use the GetFileIndex() and GetFrameIndex() methods. * For enhanced multi-frame DICOM files, much of the meta data is * stored per-frame. This method will search for the attribute * in the PerFrameFunctionGroupSequence first, then in the * SharedFunctionalGroupsSequence, and finally in the root. * It can be used on either multi-frame or single-frame files. * The frame index is counted from zero to NumberOfFrames-1. */ const vtkDICOMValue &Get(int idx, int frame, vtkDICOMTag tag); const vtkDICOMValue &Get(int idx, int frame, const vtkDICOMTagPath &p); const vtkDICOMValue &GetAttributeValue(int idx, int frame, vtkDICOMTag tag) { return this->Get(idx, frame, tag); } const vtkDICOMValue &GetAttributeValue( int idx, int frame, const vtkDICOMTagPath &p) { return this->Get(idx, frame, p); } //@} //@{ //! Get the file index for the given image slice and component. /*! * This takes into account the way the files were sorted to create * the volume (as given by the FileIndexArray). For multi-component * images, supply both the component of interest, and the total number * of components. The return value will be -1 if an index is out of * range. */ int GetFileIndex(int sliceIdx, int compIdx, int numComps); int GetFileIndex(int sliceIdx); //@} //@{ //! Get the frame index for the given image slice and component. /*! * This takes into account the way the frames were sorted to create * the volume (as given by the FileIndexArray). For multi-component * images, supply both the component of interest, and the total number * of components. The return value will be -1 if an index is out of * range. */ int GetFrameIndex(int sliceIdx, int compIdx, int numComps); int GetFrameIndex(int sliceIdx); //@} //@{ //! Set an attribute value for the image at file index "idx". /*! * Except for the method that takes a vtkDICOMValue, these methods * will use the dictionary to find the VR for the attribute, and will * attempt to convert the input data to the correct VR. Strings and * doubles will be converted to integer values where necessary, and * numeric values will be converted to strings where necessary. * Note that if you specify a string value, it must either be an * ASCII string, or it must be encoded in the SpecificCharacterSet * for this data set. */ void Set(int idx, vtkDICOMTag tag, const vtkDICOMValue& v); void Set(int idx, vtkDICOMTag tag, double v); void Set(int idx, vtkDICOMTag tag, const std::string& v); void SetAttributeValue(int idx, vtkDICOMTag tag, const vtkDICOMValue& v) { this->Set(idx, tag, v); } void SetAttributeValue(int idx, vtkDICOMTag tag, double v) { this->Set(idx, tag, v); } void SetAttributeValue(int idx, vtkDICOMTag tag, const std::string& v) { this->Set(idx, tag, v); } //@} //@{ //! Set the same attribute value for all images. void Set(vtkDICOMTag tag, const vtkDICOMValue& v); void Set(vtkDICOMTag tag, double v); void Set(vtkDICOMTag tag, const std::string& v); void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v) { this->Set(tag, v); } void SetAttributeValue(vtkDICOMTag tag, double v) { this->Set(tag, v); } void SetAttributeValue(vtkDICOMTag tag, const std::string& v) { this->Set(tag, v); } //@} //@{ //! Set the attribute at the specified path. /*! * The data element is inserted at the tail of the given path. If the * path lies within a sequence that does not yet exist, then the sequence * will be created. If an item index in the path points to an item that * does not exist, then that item will be created. */ void Set(int idx, const vtkDICOMTagPath& tag, const vtkDICOMValue& v); void Set(int idx, const vtkDICOMTagPath& tag, double v); void Set(int idx, const vtkDICOMTagPath& tag, const std::string& v); void SetAttributeValue( int idx, const vtkDICOMTagPath& tag, const vtkDICOMValue& v) { this->Set(idx, tag, v); } void SetAttributeValue( int idx, const vtkDICOMTagPath& tag, double v) { this->Set(idx, tag, v); } void SetAttributeValue( int idx, const vtkDICOMTagPath& tag, const std::string& v) { this->Set(idx, tag, v); } //@} //@{ //! Set the attribute value along this path for all images. void Set(const vtkDICOMTagPath& tag, const vtkDICOMValue& v); void Set(const vtkDICOMTagPath& tag, double v); void Set(const vtkDICOMTagPath& tag, const std::string& v); void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v) { this->Set(tag, v); } void SetAttributeValue(const vtkDICOMTagPath& tag, double v) { this->Set(tag, v); } void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v) { this->Set(tag, v); } //@} //@{ //! Resolve a private tag, or return (ffff,ffff) if not resolved. /*! * Private data elements are mobile, which means that different data * sets might store them at different locations. Given a private * data element which has a tag of (gggg,xxee) according to its * dictionary, the first two element digits "xx" can change from one * data set to the next, and the data set must have a "Creator Element" * at (gggg,00xx) to allow the digits of "xx" to be resolved. Please * read DICOM Part 5 Section 7.8 for additional information. */ vtkDICOMTag ResolvePrivateTag(vtkDICOMTag ptag, const std::string& creator); vtkDICOMTag ResolvePrivateTag( int idx, vtkDICOMTag ptag, const std::string& creator); //! Resolve a private tag, and add the creator to the data set. /*! * This method works like ResolvePrivateTag, except that if the creator * is not found in the data set, it will be added. It should be used to * resolve private tags that you plan to write to the data set. The * returned tag will be (ffff,ffff) if there are no empty slots available * for the creator. Every private group has 240 available slots. */ vtkDICOMTag ResolvePrivateTagForWriting( vtkDICOMTag ptag, const std::string& creator); vtkDICOMTag ResolvePrivateTagForWriting( int idx, vtkDICOMTag ptag, const std::string& creator); //@} //@{ //! Look up a tag in the DICOM dictionary. /*! * Unlike the method in vtkDICOMDictionary, this method can identify * the implementor of a private tag and look it up in the implementor's * dictionary. */ vtkDICOMDictEntry FindDictEntry(vtkDICOMTag tag); //! Use the dictionary to get the VR, return UN if not found. vtkDICOMVR FindDictVR(int idx, vtkDICOMTag tag); //@} //@{ //! Create a value from text in a specific character set. vtkDICOMValue MakeValueWithSpecificCharacterSet( vtkDICOMVR vr, const std::string& v); //@} //@{ //! Set the array to convert slice, component indices to file index. void SetFileIndexArray(vtkIntArray *fileArray); vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; } //@} //@{ //! Set the array to convert slice, component indices to frame index. void SetFrameIndexArray(vtkIntArray *frameArray); vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; } //@} //@{ //! Copy all the attributes from another MetaData object. /*! * Copy attributes from the source meta data object into this one. * If the source has the same NumberOfInstances as this, then the * attributes are copied on an instance-by-instance basis. Otherwise, * attributes are only copied from the source if they have the same * value for all instances. */ void CopyAttributes(vtkDICOMMetaData *source); //@} //@{ //! DataObject interface function. void ShallowCopy(vtkDataObject *source) VTK_DICOM_OVERRIDE; void DeepCopy(vtkDataObject *source) VTK_DICOM_OVERRIDE; //@} protected: vtkDICOMMetaData(); ~vtkDICOMMetaData(); //! Find a tag, value pair. vtkDICOMDataElement *FindDataElement(vtkDICOMTag tag); //! Find a tag, value pair or insert a pair if not found. vtkDICOMDataElement *FindDataElementOrInsert(vtkDICOMTag tag); //! Find or create the sequence at the head of the tagpath. int FindItemsOrInsert( int idx, bool useidx, const vtkDICOMTagPath& tagpath, vtkDICOMItem *items[]); //! Find a child item for a tag path, or insert if not there. vtkDICOMItem *FindItemOrInsert(int idx, const vtkDICOMTagPath& tagpath); //! Find the attribute value for the specified image index. const vtkDICOMValue *FindAttributeValue(int idx, vtkDICOMTag tag); //! Find the attribute value for the specified image index. const vtkDICOMValue *FindAttributeValue( int idx, const vtkDICOMTagPath& tagpath); private: //! The number of DICOM files. int NumberOfInstances; //! The lookup table for the metadata. vtkDICOMDataElement **Table; //! Links to the first data element. vtkDICOMDataElement Head; //! Links to the last data element. vtkDICOMDataElement Tail; //! The number of data elements. int NumberOfDataElements; //! An array to map slices and components to files. vtkIntArray *FileIndexArray; //! An array to map slices and components to frames. vtkIntArray *FrameIndexArray; #ifdef VTK_DICOM_DELETE vtkDICOMMetaData(const vtkDICOMMetaData&) VTK_DICOM_DELETE; void operator=(const vtkDICOMMetaData&) VTK_DICOM_DELETE; #else vtkDICOMMetaData(const vtkDICOMMetaData&) = delete; void operator=(const vtkDICOMMetaData&) = delete; #endif }; #endif /* vtkDICOMMetaData_h */ vtk-dicom-0.8.12/Source/vtkDICOMMetaDataAdapter.cxx000066400000000000000000000230331356440565500217630ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMMetaDataAdapter.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" //---------------------------------------------------------------------------- vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta) { this->ConstructionHelper(meta, -1); } //---------------------------------------------------------------------------- vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter( vtkDICOMMetaData *meta, int i) { this->ConstructionHelper(meta, i); } //---------------------------------------------------------------------------- void vtkDICOMMetaDataAdapter::ConstructionHelper( vtkDICOMMetaData *meta, int i) { this->Meta = meta; this->PerFrame = 0; this->Shared = 0; this->NullValue = 0; this->NumberOfInstances = 0; this->MetaInstance = (i >= 0 ? i : 0); if (meta) { meta->Register(0); vtkDICOMDataElementIterator iter; iter = meta->Find(DC::PerFrameFunctionalGroupsSequence); if (iter != meta->End()) { if (iter->IsPerInstance()) { this->PerFrame = &iter->GetValue(this->MetaInstance); } else { this->PerFrame = &iter->GetValue(); } } iter = meta->Find(DC::SharedFunctionalGroupsSequence); if (iter != meta->End()) { if (iter->IsPerInstance()) { this->Shared = &iter->GetValue(this->MetaInstance); } else { this->Shared = &iter->GetValue(); } } } if (this->Shared && this->Shared->IsValid() && this->PerFrame && this->PerFrame->IsValid()) { this->NumberOfInstances = meta->Get( this->MetaInstance, DC::NumberOfFrames).AsInt(); // an invalid value to return when asked for NumberOfFrames this->NullValue = new vtkDICOMValue(); } else if (meta) { this->NumberOfInstances = (i < 0 ? meta->GetNumberOfInstances() : 1); this->Shared = 0; this->PerFrame = 0; } } //---------------------------------------------------------------------------- // Copy constructor vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter( const vtkDICOMMetaDataAdapter& other) : Meta(other.Meta), PerFrame(other.PerFrame), Shared(other.Shared), NullValue(other.NullValue), NumberOfInstances(other.NumberOfInstances), MetaInstance(other.MetaInstance) { if (other.Meta) { this->Meta->Register(0); } if (this->NullValue) { this->NullValue = new vtkDICOMValue(); } } //---------------------------------------------------------------------------- // Destructor vtkDICOMMetaDataAdapter::~vtkDICOMMetaDataAdapter() { if (this->Meta) { this->Meta->Delete(); } delete this->NullValue; } //---------------------------------------------------------------------------- // Assignment vtkDICOMMetaDataAdapter& vtkDICOMMetaDataAdapter::operator=( const vtkDICOMMetaDataAdapter& other) { if (this != &other) { this->Meta = other.Meta; this->PerFrame = other.PerFrame; this->Shared = other.Shared; this->NullValue = other.NullValue; this->NumberOfInstances = other.NumberOfInstances; this->MetaInstance = other.MetaInstance; if (other.Meta) { this->Meta->Register(0); } if (this->NullValue) { this->NullValue = new vtkDICOMValue(); } } return *this; } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaDataAdapter::Get( int idx, vtkDICOMTag tag) const { vtkDICOMMetaData *meta = this->Meta; if (this->PerFrame) { // if asked for NumberOfFrames, pretend that it isn't set if (tag == DC::NumberOfFrames) { return *this->NullValue; } // search PerFrameFunctionalGroupsSequence first, // then search SharedFunctionalGroupsSequence const vtkDICOMValue *privateValue = 0; for (int i = 0; i < 2; i++) { const vtkDICOMValue *seq = this->PerFrame; unsigned int f = idx; if (i == 1) { seq = this->Shared; f = 0; } if (seq && f < seq->GetNumberOfValues()) { // search for the item that matches the frame const vtkDICOMItem *items = seq->GetSequenceData(); const vtkDICOMValue &v = items[f].Get(tag); if (v.IsValid()) { return v; } // search within all the sequences in the item vtkDICOMDataElementIterator iter = items[f].Begin(); vtkDICOMDataElementIterator iterEnd = items[f].End(); while (iter != iterEnd) { const vtkDICOMValue &u = iter->GetValue(); if (u.GetNumberOfValues() == 1) { const vtkDICOMItem *item = u.GetSequenceData(); if (item) { const vtkDICOMValue &w = item->Get(tag); if (w.IsValid()) { if ((iter->GetTag().GetGroup() & 1) == 0) { return w; } else if (privateValue == 0) { // if we found the attribute in a private sequence, // then save but and keep searching to see if it will // eventually be found somewhere public privateValue = &w; } } } } ++iter; } } } // if it wasn't in a PerFrame or Shared functional group const vtkDICOMValue& v = meta->Get(this->MetaInstance, tag); if (privateValue && !v.IsValid()) { // attributes found in private parts of the PerFrame or Shared are // only returned if the attribute could not be found elsewhere return *privateValue; } return v; } // if no per-frame data, use file instance return meta->Get(idx + this->MetaInstance, tag); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMMetaDataAdapter::Get(vtkDICOMTag tag) const { return this->Get(0, tag); } //---------------------------------------------------------------------------- bool vtkDICOMMetaDataAdapter::Has(vtkDICOMTag tag) const { const vtkDICOMValue& v = this->Get(0, tag); return v.IsValid(); } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaDataAdapter::ResolvePrivateTag( int idx, vtkDICOMTag ptag, const std::string& creator) { vtkDICOMMetaData *meta = this->Meta; if (this->PerFrame) { // search PerFrameFunctionalGroupsSequence first, // then search SharedFunctionalGroupsSequence vtkDICOMTag tagFromPrivSeq(0xFFFF,0xFFFF); for (int i = 0; i < 2; i++) { const vtkDICOMValue *seq = this->PerFrame; unsigned int f = idx; if (i == 1) { seq = this->Shared; f = 0; } if (seq && f < seq->GetNumberOfValues()) { // search for the item that matches the frame const vtkDICOMItem *items = seq->GetSequenceData(); vtkDICOMTag tag = items[f].ResolvePrivateTag(ptag, creator); if (tag != vtkDICOMTag(0xFFFF, 0xFFFF)) { const vtkDICOMValue &v = items[f].Get(tag); if (v.IsValid()) { return tag; } } // search within all the sequences in the item vtkDICOMDataElementIterator iter = items[f].Begin(); vtkDICOMDataElementIterator iterEnd = items[f].End(); while (iter != iterEnd) { const vtkDICOMValue &u = iter->GetValue(); if (u.GetNumberOfValues() == 1) { const vtkDICOMItem *item = u.GetSequenceData(); if (item) { tag = item->ResolvePrivateTag(ptag, creator); if (tag != vtkDICOMTag(0xFFFF, 0xFFFF)) { const vtkDICOMValue &v = item->Get(tag); if (v.IsValid()) { if ((iter->GetTag().GetGroup() & 1) == 0) { return tag; } else if (tagFromPrivSeq == vtkDICOMTag(0xFFFF, 0xFFFF)) { // if desired attribute was found within a private // sequence, we want to keep searching in case it // later appears within a public sequence (this matches // the behavior of GetAttributeValue) tagFromPrivSeq = tag; } } } } } ++iter; } } } // if it wasn't in a PerFrame or Shared functional group vtkDICOMTag tag = meta->ResolvePrivateTag( this->MetaInstance, ptag, creator); if (tag == vtkDICOMTag(0xFFFF, 0xFFFF)) { tag = tagFromPrivSeq; } return tag; } // if no per-frame data, use file instance return meta->ResolvePrivateTag(idx + this->MetaInstance, ptag, creator); } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMMetaDataAdapter::ResolvePrivateTag( vtkDICOMTag ptag, const std::string& creator) { return this->ResolvePrivateTag(0, ptag, creator); } vtk-dicom-0.8.12/Source/vtkDICOMMetaDataAdapter.h000066400000000000000000000107461356440565500214170ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMMetaDataAdapter_h #define vtkDICOMMetaDataAdapter_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMTag.h" class vtkDICOMMetaData; class vtkDICOMValue; //! An adapter to make multi-frame data look like multi-file data. /*! * The vtkDICOMMetaDataAdapter object makes an enhanced multi-frame * DICOM data set appear to be a series of data sets. Whenever the * caller requests and attribute from a specific instance, the attribute * is instead pulled from the PerFrame item for a specific frame. * If constructed from a metadata object that is not an enhanced * multi-frame dataset, it simply acts as a pass-through. */ class VTKDICOM_EXPORT vtkDICOMMetaDataAdapter { public: //@{ //! Construct an adapter for the given meta data object. /*! * If the provided meta-data is from an enhanced multi-frame data set, * then the adapter will make it look like a series of data sets. If * the provided meta-data is from a series of non-enhanced data sets, * the adapter will act as a simple pass-through. */ vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta); //! Construct an adapter for one DICOM object instance. /*! * If instance i of the provided meta-data is an enhanced multi-frame * data set, make it look like a series. */ vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta, int i); //! Copy constructor. vtkDICOMMetaDataAdapter(const vtkDICOMMetaDataAdapter&); //! Destructor release the reference to the meta data. ~vtkDICOMMetaDataAdapter(); //@} //@{ //! Get the number of instances (i.e. files). /*! * For an enhanced multi-frame data set, this will return the * number of frames. For a non-enhanced data set, it returns * the number of instances in the series. */ int GetNumberOfInstances() const { return this->NumberOfInstances; } //@} //@{ //! Check whether an attribute is present in the metadata. /*! * For an enhanced multi-frame data set, this will search the Shared * and PerFrameFunctionGroupSequence in addition to searching the basic * data set attributes. */ bool Has(vtkDICOMTag tag) const; bool HasAttribute(vtkDICOMTag tag) const { return this->Has(tag); } //! Get an attribute value. /*! * For an enhanced multi-frame data set, this will first try to * retrieve the attribute from the SharedFunctionalGroupSequence. */ const vtkDICOMValue &Get(vtkDICOMTag tag) const; const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag) const { return this->Get(tag); } //! Get an attribute value for the specified file index. /*! * For an enhanced multi-frame data set, this will search the PerFrame * attributes, then the Shared attributes, and finally the basic * data set attributes. */ const vtkDICOMValue &Get(int idx, vtkDICOMTag tag) const; const vtkDICOMValue &GetAttributeValue(int idx, vtkDICOMTag tag) const { return this->Get(idx, tag); } //! Resolve a private tag. /*! * For an enhanced multi-frame data set, this will search the PerFrame * attributes, then the Shared attributes, and finally the basic * data set attributes. */ vtkDICOMTag ResolvePrivateTag(vtkDICOMTag ptag, const std::string& creator); vtkDICOMTag ResolvePrivateTag( int idx, vtkDICOMTag ptag, const std::string& creator); //@} //@{ //! Make the adapter look like a pointer (for convenience). const vtkDICOMMetaDataAdapter* operator->() const { return this; } vtkDICOMMetaDataAdapter* operator->() { return this; } //@} //! Copy constructor. vtkDICOMMetaDataAdapter& operator=(const vtkDICOMMetaDataAdapter&); protected: //! Helper function for the constructors. Set all members. void ConstructionHelper(vtkDICOMMetaData *meta, int i); private: vtkDICOMMetaData *Meta; const vtkDICOMValue *PerFrame; const vtkDICOMValue *Shared; vtkDICOMValue *NullValue; int NumberOfInstances; int MetaInstance; }; #endif /* vtkDICOMMetaDataAdapter_h */ // VTK-HeaderTest-Exclude: vtkDICOMMetaDataAdapter.h vtk-dicom-0.8.12/Source/vtkDICOMParser.cxx000066400000000000000000002134431356440565500202440ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMParser.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMFile.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkObjectFactory.h" #include "vtkUnsignedShortArray.h" #include "vtkErrorCode.h" #include #include #include #include #include vtkStandardNewMacro(vtkDICOMParser); vtkCxxSetObjectMacro(vtkDICOMParser, MetaData, vtkDICOMMetaData); vtkCxxSetObjectMacro(vtkDICOMParser, Query, vtkDICOMMetaData); vtkCxxSetObjectMacro(vtkDICOMParser, Groups, vtkUnsignedShortArray); /*---------------------------------------------------------------------------- The top section of this file defines "Decoder" classes that parse the DICOM tags and decode the values. The decoder class hierarchy is as follows: DecoderBase (the base class) Decoder (template specialization for little-endian decoding) DefaultDecoder (decoder for implicit little-endian syntax) LittleEndianDecoder (decoder for explicit little-endian syntax) Decoder (template specialization for big-endian decoding) BigEndianDecoder (decoder for explicit big-endian syntax) The vtkDICOMParser utilizes the DefaultDecoder, LittleEndianDecoder, or the BigEndianDecoder depending on the transfer syntax. ----------------------------------------------------------------------------*/ class vtkDICOMParserInternalFriendship { public: static bool FillBuffer(vtkDICOMParser *parser, const unsigned char* &cp, const unsigned char* &ep) { return parser->FillBuffer(cp, ep); } static bool SeekBuffer(vtkDICOMParser *parser, const unsigned char* &cp, const unsigned char* &ep, vtkTypeInt64 offset) { return parser->SeekBuffer(cp, ep, offset); } static vtkTypeInt64 GetBytesRemaining(vtkDICOMParser *parser, const unsigned char *cp, const unsigned char *ep) { return parser->GetBytesRemaining(cp, ep); } static vtkTypeInt64 GetBytesProcessed(vtkDICOMParser *parser, const unsigned char *cp, const unsigned char *ep) { return parser->GetBytesProcessed(cp, ep); } static void ParseError(vtkDICOMParser *parser, const unsigned char *cp, const unsigned char *ep, const char *message) { return parser->ParseError(cp, ep, message); } }; namespace { // Useful constants to replace commonly-used literals. const unsigned short HxFFFE = 0xFFFE; // sequence group const unsigned short HxE000 = 0xE000; // item start const unsigned short HxE00D = 0xE00D; // item end const unsigned short HxE0DD = 0xE0DD; // sequence end const unsigned int HxFFFFFFFF = 0xFFFFFFFF; // unknown length // The decoder has two specializations: little-endian, big-endian. const int LE = 0; const int BE = 1; // The decoder types that are available. class DefaultDecoder; class LittleEndianDecoder; class BigEndianDecoder; //---------------------------------------------------------------------------- // Class that caches info about the current sequence item class DecoderContext { public: // Construct the base info from the meta data. DecoderContext(vtkDICOMMetaData *meta, int index, vtkDICOMCharacterSet dcs, bool ocs) : Prev(0), Item(0), MetaData(meta), Index(index), CurrentTag(0,0), DefaultCharacterSet(dcs), CharacterSet(ocs ? dcs : vtkDICOMCharacterSet(vtkDICOMCharacterSet::Unknown)), VRForXS(vtkDICOMVR::XX) {} // Construct from the current item. DecoderContext(vtkDICOMItem *item, vtkDICOMCharacterSet dcs, bool ocs) : Prev(0), Item(item), MetaData(0), Index(0), CurrentTag(0,0), DefaultCharacterSet(dcs), CharacterSet(ocs ? dcs : vtkDICOMCharacterSet(vtkDICOMCharacterSet::Unknown)), VRForXS(vtkDICOMVR::XX) {} // Find an element within the current context. This is used // by FindDictVR() to disambiguate VRs that could be either US // or SS, or that could be either OB or OW. const vtkDICOMValue& Get(vtkDICOMTag tag); // Get the dictionary VR (for implicit VR elements). // If the tag is not found, UN (unknown) will be returned. vtkDICOMVR FindDictVR(vtkDICOMTag tag); // Get the character set that is currently active. vtkDICOMCharacterSet GetCharacterSet(); // Get the VR to use for XS by checking PixelRepresentation. vtkDICOMVR GetVRForXS(); // Set the previous context. void SetPrev(DecoderContext *context) { this->Prev = context; } DecoderContext *GetPrev() { return this->Prev; } // Get the current item. vtkDICOMItem *GetItem() { return this->Item; } // Set the current tag position for the context. void SetCurrentTag(vtkDICOMTag tag) { this->CurrentTag = tag; } private: DecoderContext *Prev; vtkDICOMItem *Item; vtkDICOMMetaData *MetaData; int Index; vtkDICOMTag CurrentTag; vtkDICOMCharacterSet DefaultCharacterSet; vtkDICOMCharacterSet CharacterSet; vtkDICOMVR VRForXS; }; //---------------------------------------------------------------------------- const vtkDICOMValue& DecoderContext::Get(vtkDICOMTag tag) { if (this->Item) { return this->Item->Get(tag); } else { int idx = (this->Index == -1 ? 0 : this->Index); return this->MetaData->Get(idx, tag); } } //---------------------------------------------------------------------------- vtkDICOMCharacterSet DecoderContext::GetCharacterSet() { vtkDICOMCharacterSet cs = this->CharacterSet; if (cs == vtkDICOMCharacterSet::Unknown) { const vtkDICOMValue& v = this->Get(DC::SpecificCharacterSet); if (v.IsValid()) { cs = vtkDICOMCharacterSet(v.GetCharData(), v.GetVL()); } else if (this->Prev) { cs = this->Prev->GetCharacterSet(); } else { cs = this->DefaultCharacterSet; } if (this->CurrentTag > DC::SpecificCharacterSet) { this->CharacterSet = cs; } } return cs; } //---------------------------------------------------------------------------- vtkDICOMVR DecoderContext::GetVRForXS() { vtkDICOMVR vr = this->VRForXS; if (vr == vtkDICOMVR::XX) { const vtkDICOMValue& v = this->Get(DC::PixelRepresentation); if (v.IsValid()) { vr = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS); } else if (this->Prev) { vr = this->Prev->GetVRForXS(); } else { vr = vtkDICOMVR::US; } if (this->CurrentTag > DC::PixelRepresentation) { this->VRForXS = vr; } } return vr; } //---------------------------------------------------------------------------- vtkDICOMVR DecoderContext::FindDictVR(vtkDICOMTag tag) { vtkDICOMVR vr = vtkDICOMVR::UN; if (tag.GetElement() == 0x0000) { // this is a group length element, which has VR of "UL" vr = vtkDICOMVR::UL; } else if ((tag.GetGroup() & 0x1) != 0 && tag.GetElement() >= 0x0010 && tag.GetElement() < 0x0100) { // this is a private creator tag vr = vtkDICOMVR::LO; } else { vtkDICOMDictEntry de; if ((tag.GetGroup() & 0x1) == 0) { de = vtkDICOMDictionary::FindDictEntry(tag); } else if (this->Item) { de = this->Item->FindDictEntry(tag); } else if (this->MetaData) { de = this->MetaData->FindDictEntry(tag); } if (de.IsValid()) { vr = de.GetVR(); if (vr == vtkDICOMVR::XS) { // disambiguate tags that may be either "US" or "SS" this->CurrentTag = tag; vr = this->GetVRForXS(); } else if (vr == vtkDICOMVR::OX) { // disambiguate tags that may be either "OB" or "OW" vr = vtkDICOMVR::OW; vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ? DC::WaveformBitsAllocated : DC::BitsAllocated); const vtkDICOMValue& v = this->Get(reftag); if (v.IsValid() && v.AsUnsignedShort() <= 8) { vr = vtkDICOMVR::OB; } } } } return vr; } //---------------------------------------------------------------------------- // The base class for the decoder classes. class DecoderBase { public: // Virtual destructor for completeness. virtual ~DecoderBase() {} // Whether to use implicit VRs (default: explicit VRs). void SetImplicitVR(bool i) { this->ImplicitVR = i; } // Set the current item context. void PushContext(DecoderContext *context, vtkDICOMTag tag); // Pop the current item context. void PopContext(); // The query with which to filter the data. void SetQuery( const vtkDICOMDataElementIterator& iter, const vtkDICOMDataElementIterator& iterEnd); // Read l bytes of data, or until delimiter tag found. // Set l to 0xffffffff to ignore length completely. // If the delimiter is of the form (0xgggg,0x0000), ie. if the // "element" part is zero, then the reading will stop before // the first element that is not in the specified group. virtual bool ReadElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter) = 0; // Skip l bytes of data, or until delimiter tag found. // Set l to 0xffffffff to ignore length completely. // If the delimiter is of the form (0xgggg,0x0000), ie. if the // "element" part is zero, then the skip will stop before // the first element that is not in the specified group. virtual bool SkipElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter) = 0; // Peek ahead to see what the next element is. virtual vtkDICOMTag Peek( const unsigned char* &cp, const unsigned char* &ep) = 0; // Copy bytes from sp to end marker cp into the value "v". // If the parameter "v" is NULL, then it will be ignored. void CopyBuffer( vtkDICOMValue *v, const unsigned char *sp, const unsigned char *cp); // If there are fewer than "n" bytes left in the buffer, then move // any data that hasn't yet been parsed to the start of the buffer, // and then read new data into the remainder of the buffer. bool CheckBuffer( const unsigned char* &cp, const unsigned char* &ep, size_t n); // This overload of CheckBuffer is used within SkipElements to // automatically copy the skipped bytes into the value "v". // If the parameter "v" is NULL, then it will be ignored. bool CheckBuffer( const unsigned char* &cp, const unsigned char* &ep, size_t n, vtkDICOMValue *v, const unsigned char* &sp); // Get the current byte offset from the start of the file. size_t GetByteOffset( const unsigned char *cp, const unsigned char *ep); // Get the last tag that was read. vtkDICOMTag GetLastTag() { return this->LastTag; } // Get the VR of the last data element (invalid if implicit) vtkDICOMVR GetLastVR() { return this->LastVR; } // Get the VL of the last data element. unsigned int GetLastVL() { return this->LastVL; } // Check for attributes missing from this instance, that were present // for instances in the series that were already parsed. void HandleMissingAttributes(vtkDICOMTag tag); // Advance the query iterator (this->Query) to the given tag, // and set this->QueryMatched to false if any unmatched query keys // were found, unless the keys support universal matching (i.e. the // key has no value), or unless the keys are private void AdvanceQueryIterator(vtkDICOMTag tag); // Returns true if the query contains the given tag. bool QueryContains(vtkDICOMTag tag); // Returns true if the value matches the query. bool QueryMatches(const vtkDICOMValue& v); // Returns true if all queries have matched so far. bool GetQueryMatched() { return this->QueryMatched; } // Check whether the query is finished. bool GetQueryFinished() { return this->Query == this->QueryEnd; } // Finish the query (check for unused keys that must match). bool FinishQuery(); protected: // Constructor that initializes all of the members. DecoderBase(vtkDICOMParser *parser, vtkDICOMMetaData *data, int idx) : Parser(parser), BaseContext(data,idx,parser->GetDefaultCharacterSet(), parser->GetOverrideCharacterSet()), Item(0), MetaData(data), Index(idx), ImplicitVR(false), HasQuery(false), QueryMatched(false), LastVL(0) { this->Context = &this->BaseContext; } // an internal implicit little-endian decoder DefaultDecoder *ImplicitLE; // the vtkDICOMParser::FillBuffer method is used to refill the buffer vtkDICOMParser *Parser; // the current context (info about the current item being parsed) DecoderContext *Context; // the base context. DecoderContext BaseContext; // the sequence item to read the data into while parsing a sequence vtkDICOMItem *Item; // the metadata object to read the data into vtkDICOMMetaData *MetaData; // the instance index to use with the meta data int Index; // if this is set, then VRs are implicit bool ImplicitVR; // the query to apply while reading the data bool HasQuery; bool QueryMatched; vtkDICOMDataElementIterator Query; vtkDICOMDataElementIterator QueryEnd; vtkDICOMDataElementIterator QuerySave; // this is set to the last tag that was read. vtkDICOMTag LastTag; vtkDICOMVR LastVR; unsigned int LastVL; // this is set to the last tag written to this->MetaData vtkDICOMTag LastWrittenTag; }; //---------------------------------------------------------------------------- template class Decoder : public DecoderBase { public: // Decode two, four, or eight bytes as unsigned integers. static unsigned short GetInt16(const unsigned char* ip); static unsigned int GetInt32(const unsigned char* ip); static unsigned long long GetInt64(const unsigned char* ip); // Read from "ip" and write "n" decoded values into "v". static void GetValues(const unsigned char *ip, char *v, size_t n); static void GetValues(const unsigned char *ip, unsigned char *v, size_t n); static void GetValues(const unsigned char *ip, short *v, size_t n); static void GetValues(const unsigned char *ip, unsigned short *v, size_t n); static void GetValues(const unsigned char *ip, int *v, size_t n); static void GetValues(const unsigned char *ip, unsigned int *v, size_t n); static void GetValues(const unsigned char *ip, long long *v, size_t n); static void GetValues( const unsigned char *ip, unsigned long long *v, size_t n); static void GetValues(const unsigned char *ip, float *v, size_t n); static void GetValues(const unsigned char *ip, double *v, size_t n); static void GetValues(const unsigned char *ip, vtkDICOMTag *v, size_t n); // Read "n" values from the buffer into the provided pointer. // The number of bytes that were read from the buffer will be returned. // The buffer will be refilled as necessary. template size_t ReadData( const unsigned char* &cp, const unsigned char* &ep, T *ptr, size_t n); // Skip forward by "n" bytes. The number of bytes skipped will be // returned. If the end of the file is reached before the operation, // is complete, then the return value will be less than "n". size_t SkipData( const unsigned char* &cp, const unsigned char* &ep, size_t n); // Read l bytes of data, or until delimiter tag found. // Set l to 0xffffffff to ignore length completely. // If the delimiter is of the form (0xgggg,0x0000), ie. if the // "element" part is zero, then the reading will stop before // the first element that is not in the specified group. bool ReadElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter) { size_t bytesRead; return ReadElements(cp, ep, l, delimiter, bytesRead); } // Skip l bytes of data, or until delimiter tag found. // Set l to 0xffffffff to ignore length completely. // If the delimiter is of the form (0xgggg,0x0000), ie. if the // "element" part is zero, then the skip will stop before // the first element that is not in the specified group. bool SkipElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter) { return SkipElements(cp, ep, l, delimiter, 0); } // A ReadElements that returns the number of bytes read. bool ReadElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, size_t &bytesRead); // Query the elements of one item within a sequence. bool QueryOneItem( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, size_t &bytesRead); // A SkipElements that copies skipped bytes into value "v". // This method is used when parsing encapsulated data, it simply // reads the encapsulated data into the value as raw bytes. // If the parameter "v" is NULL, then it will be ignored. bool SkipElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, vtkDICOMValue *v); // Read the vr and vl and return the number of bytes read // (will return zero if an error occurred) size_t ReadElementHead( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMTag tag, vtkDICOMVR &vr, unsigned int &vl); // Read a value, given the vr and vl, where vl can be 0xffffffff // for SQ, UN, or OB to indicate tag-delimited data. // The number of bytes that were read will be returned. size_t ReadElementValue( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMVR vr, unsigned int vl, vtkDICOMValue &v); // Peek ahead to see what the next element is. vtkDICOMTag Peek( const unsigned char* &cp, const unsigned char* &ep) { unsigned short g = 0; unsigned short e = 0; if (this->CheckBuffer(cp, ep, 4)) { g = Decoder::GetInt16(cp); e = Decoder::GetInt16(cp + 2); } return vtkDICOMTag(g, e); } protected: Decoder(vtkDICOMParser *parser, vtkDICOMMetaData *data, int idx) : DecoderBase(parser, data, idx) {} private: Decoder() {}; }; //---------------------------------------------------------------------------- // The little-endian implicit-vr decoder. class DefaultDecoder : public Decoder { public: DefaultDecoder(vtkDICOMParser *parser, vtkDICOMMetaData *data, int idx) : Decoder(parser, data, idx) { this->ImplicitVR = true; this->ImplicitLE = this; } }; // The little-endian explicit-vr decoder. class LittleEndianDecoder : public Decoder { public: LittleEndianDecoder(vtkDICOMParser *parser, vtkDICOMMetaData *data, int idx) : Decoder(parser, data, idx), ExtraDecoder(parser, data, idx) { this->ImplicitLE = &this->ExtraDecoder; } private: // an internal implicit little-endian decoder. DefaultDecoder ExtraDecoder; }; // The big-endian explicit-vr decoder. class BigEndianDecoder : public Decoder { public: BigEndianDecoder(vtkDICOMParser *parser, vtkDICOMMetaData *data, int idx) : Decoder(parser, data, idx), ExtraDecoder(parser, data, idx) { this->ImplicitLE = &this->ExtraDecoder; } private: // an internal implicit little-endian decoder. DefaultDecoder ExtraDecoder; }; //---------------------------------------------------------------------------- inline void DecoderBase::PushContext(DecoderContext *context, vtkDICOMTag tag) { // ensure that "Item" is set for the ImplicitLE decoder, too this->Item = context->GetItem(); this->ImplicitLE->Item = context->GetItem(); // save the current position in the current context this->Context->SetCurrentTag(tag); // push the new context context->SetPrev(this->Context); this->Context = context; } //---------------------------------------------------------------------------- inline void DecoderBase::PopContext() { this->Context = this->Context->GetPrev(); this->Item = this->Context->GetItem(); this->ImplicitLE->Item = this->Context->GetItem(); } //---------------------------------------------------------------------------- void DecoderBase::SetQuery( const vtkDICOMDataElementIterator& iter, const vtkDICOMDataElementIterator& iterEnd) { if (iter != iterEnd) { this->HasQuery = true; this->QueryMatched = true; this->Query = iter; this->QueryEnd = iterEnd; this->QuerySave = iter; } else { this->HasQuery = false; this->QueryMatched = false; } } //---------------------------------------------------------------------------- inline void DecoderBase::CopyBuffer( vtkDICOMValue *v, const unsigned char *sp, const unsigned char *cp) { // append bytes from sp to cp into the supplied value "v" if (v && cp != sp) { size_t m = cp - sp; size_t n = v->GetNumberOfValues(); unsigned char *ptr = v->ReallocateUnsignedCharData(n + m) + n; do { *ptr++ = *sp++; } while (--m); } } //---------------------------------------------------------------------------- inline bool DecoderBase::CheckBuffer( const unsigned char* &cp, const unsigned char* &ep, size_t n) { bool r = true; if (n > static_cast(ep - cp)) { r = vtkDICOMParserInternalFriendship::FillBuffer( this->Parser, cp, ep); r &= (n <= static_cast(ep - cp)); } return r; } inline bool DecoderBase::CheckBuffer( const unsigned char* &cp, const unsigned char* &ep, size_t n, vtkDICOMValue *v, const unsigned char* &sp) { bool r = true; if (n > static_cast(ep - cp)) { this->CopyBuffer(v, sp, cp); r = vtkDICOMParserInternalFriendship::FillBuffer( this->Parser, cp, ep); r &= (n <= static_cast(ep - cp)); sp = cp; } return r; } //---------------------------------------------------------------------------- inline size_t DecoderBase::GetByteOffset( const unsigned char *cp, const unsigned char *ep) { return vtkDICOMParserInternalFriendship::GetBytesProcessed( this->Parser, cp, ep); } //---------------------------------------------------------------------------- void DecoderBase::HandleMissingAttributes(vtkDICOMTag tag) { // insert null values for any attributes that were present for other // instances in this series but not present for this instance vtkDICOMDataElementIterator iter = this->MetaData->Find(tag); --iter; if (iter->GetTag() != this->LastWrittenTag && iter->GetTag().GetGroup() != 0x0002) { int count = 0; do { count++; --iter; } while (iter->GetTag() != this->LastWrittenTag && iter->GetTag().GetGroup() != 0x0002); vtkDICOMTag *missing = new vtkDICOMTag[count]; for (int i = 0; i < count; i++) { missing[i] = (++iter)->GetTag(); } for (int i = 0; i < count; i++) { this->MetaData->Set(this->Index, missing[i], vtkDICOMValue()); } delete [] missing; } this->LastWrittenTag = tag; } //---------------------------------------------------------------------------- void DecoderBase::AdvanceQueryIterator(vtkDICOMTag tag) { // advance the query iterator to the given tag while (this->Query != this->QueryEnd && this->Query->GetTag() < tag) { // for query keys that weren't in the data set, only match if: // 1) the key is SpecificCharacterSet (not used for matching), or // 2) the key is a group length element (gggg,0000) // 3) the key is a private creator tag, or // 4) the key supports universal matching, i.e. will even match null vtkDICOMTag qtag = this->Query->GetTag(); if (qtag != DC::SpecificCharacterSet && qtag.GetElement() != 0 && ((qtag.GetGroup() & 1) == 0 || qtag.GetElement() > 0x00ff)) { vtkDICOMValue nullValue; bool matched = nullValue.Matches(this->Query->GetValue()); // if query tag is private, need additional checks if (!matched && (qtag.GetGroup() & 1) != 0) { // compute creator tag, and search for it vtkDICOMTag ctag = vtkDICOMTag(qtag.GetGroup(), qtag.GetElement() >> 8); vtkDICOMDataElementIterator iter = this->QuerySave; while (iter != this->QueryEnd && iter->GetTag() < ctag) { ++iter; } if (iter != this->QueryEnd && iter->GetTag() == ctag) { // if we already read the element, we already checked whether it // but if we didn't read it, then it doesn't exist, so don't match if (this->Item) { vtkDICOMTag ptag = this->Item->ResolvePrivateTag( qtag, iter->GetValue().AsString()); matched = (ptag != vtkDICOMTag(0xffff,0xffff) && this->Item->Get(ptag).IsValid()); } else if (this->Index < 0) { vtkDICOMTag ptag = this->MetaData->ResolvePrivateTag( qtag, iter->GetValue().AsString()); matched = (ptag != vtkDICOMTag(0xffff,0xffff) && this->MetaData->Has(ptag)); } else { vtkDICOMTag ptag = this->MetaData->ResolvePrivateTag( this->Index, qtag, iter->GetValue().AsString()); matched = (ptag != vtkDICOMTag(0xffff,0xffff) && this->MetaData->Get(this->Index, ptag).IsValid()); } } else { // query has a private tag with no creator! if (this->Item) { matched = this->Item->Get(qtag).Matches( this->Query->GetValue()); } else { matched = this->MetaData->Get(qtag).Matches( this->Query->GetValue()); } } } this->QueryMatched &= matched; } ++this->Query; } } //---------------------------------------------------------------------------- bool DecoderBase::QueryContains(vtkDICOMTag tag) { // if the tag isn't private if ((tag.GetGroup() & 1) == 0) { // advance the query iterator until the tag is found in the query this->AdvanceQueryIterator(tag); // return true if the tag exists in the query return (this->Query != this->QueryEnd && this->Query->GetTag() == tag); } // the remainder of this function handles private tags unsigned short g = tag.GetGroup(); unsigned short e = tag.GetElement(); // first, make sure this private group is present in the query, // and ignore any elements before (gggg,0010) vtkDICOMTag gtag = vtkDICOMTag(g, 0x0010); this->AdvanceQueryIterator(gtag); // save the query iterator if (this->QuerySave->GetTag() < gtag) { this->QuerySave = this->Query; } // if query doesn't contain any more keys in this group, return vtkDICOMDataElementIterator iter = this->Query; if (iter == this->QueryEnd || iter->GetTag().GetGroup() != g) { return false; } // if this is a creator element (e is 0x00XX), return true if (e >= 0x0010 && e <= 0x00FF) { return true; } // search for the creator element within the query vtkDICOMTag ctag = vtkDICOMTag(g, e >> 8); vtkDICOMValue creator = this->Context->Get(ctag); if (creator.IsValid()) { // maximum possible creator element is (gggg,00FF) gtag = vtkDICOMTag(g, 0x00FF); while (iter != this->QueryEnd && iter->GetTag() <= gtag) { if (iter->GetValue().Matches(creator)) { tag = vtkDICOMTag( g, (iter->GetTag().GetElement() << 8) | (e & 0x00FF)); break; } ++iter; } // if creator not found in query, tag obviously won't be found if (iter == this->QueryEnd || iter->GetTag() > gtag) { return false; } } // finally, look for the private tag at its resolved location while (iter != this->QueryEnd && iter->GetTag() < tag) { ++iter; } if (iter != this->QueryEnd && iter->GetTag() == tag) { this->Query = iter; return true; } return false; } //---------------------------------------------------------------------------- bool DecoderBase::QueryMatches(const vtkDICOMValue& v) { bool matched = true; vtkDICOMTag tag = this->Query->GetTag(); if (v.GetVR() != vtkDICOMVR::SQ) { // a query match is always true for SpecificCharacterSet, because this // element exists to describe the character encoding of the query, not // because it is to be matched. if (tag != DC::SpecificCharacterSet && tag.GetElement() != 0 && ((tag.GetGroup() & 1) == 0 || tag.GetElement() > 0x00ff)) { // if above conditions don't apply, check if the query key matches matched = v.Matches(this->Query->GetValue()); } } else { // if VR is SQ, then the matching was done when the sequence items were // parsed, and we just have to return the current value of QueryMatched matched = this->QueryMatched; } if ((tag.GetGroup() & 1) == 0) { // advance the query iterator ++this->Query; } else { // if private, restore to the start of the private group this->Query = this->QuerySave; } return matched; } //---------------------------------------------------------------------------- bool DecoderBase::FinishQuery() { if (this->HasQuery) { this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff)); } return this->QueryMatched; } //---------------------------------------------------------------------------- template<> inline unsigned short Decoder::GetInt16(const unsigned char *ip) { return ip[0] + (ip[1] << 8); } template<> inline unsigned int Decoder::GetInt32(const unsigned char *ip) { return ip[0] + (ip[1] << 8) + ((ip[2] + (ip[3] << 8)) << 16); } template<> inline unsigned long long Decoder::GetInt64(const unsigned char *ip) { unsigned int a = ip[0] + (ip[1] << 8) + ((ip[2] + (ip[3] << 8)) << 16); unsigned int b = ip[4] + (ip[5] << 8) + ((ip[6] + (ip[7] << 8)) << 16); return (static_cast(b) << 32) + a; } template<> inline unsigned short Decoder::GetInt16(const unsigned char *ip) { return (ip[0] << 8) + ip[1]; } template<> inline unsigned int Decoder::GetInt32(const unsigned char *ip) { return (((((ip[0] << 8) + ip[1]) << 8) + ip[2]) << 8) + ip[3]; } template<> inline unsigned long long Decoder::GetInt64(const unsigned char *ip) { unsigned int a = (((((ip[0] << 8) + ip[1]) << 8) + ip[2]) << 8) + ip[3]; unsigned int b = (((((ip[4] << 8) + ip[5]) << 8) + ip[6]) << 8) + ip[7]; return (static_cast(a) << 32) + b; } //---------------------------------------------------------------------------- template void Decoder::GetValues( const unsigned char *ip, char *op, size_t n) { do { *op++ = static_cast(*ip++); } while (--n); } template void Decoder::GetValues( const unsigned char *ip, unsigned char *op, size_t n) { do { *op++ = *ip++; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, short *op, size_t n) { do { *op++ = static_cast(Decoder::GetInt16(ip)); ip += 2; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, unsigned short *op, size_t n) { do { *op++ = Decoder::GetInt16(ip); ip += 2; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, int *op, size_t n) { do { *op++ = static_cast(Decoder::GetInt32(ip)); ip += 4; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, unsigned int *op, size_t n) { do { *op++ = Decoder::GetInt32(ip); ip += 4; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, long long *op, size_t n) { do { *op++ = static_cast(Decoder::GetInt64(ip)); ip += 8; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, unsigned long long *op, size_t n) { do { *op++ = Decoder::GetInt64(ip); ip += 8; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, float *op, size_t n) { union { float f; unsigned int i; } u; do { u.i = Decoder::GetInt32(ip); *op++ = u.f; ip += 4; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, double *op, size_t n) { union { double d; unsigned long long l; } u; do { u.l = Decoder::GetInt64(ip); *op++ = u.d; ip += 8; } while (--n); } template void Decoder::GetValues( const unsigned char *ip, vtkDICOMTag *op, size_t n) { do { unsigned short g = Decoder::GetInt16(ip); unsigned short e = Decoder::GetInt16(ip + 2); *op++ = vtkDICOMTag(g, e); ip += 4; } while (--n); } //---------------------------------------------------------------------------- // Read "n" elements of type "T" into the supplied array pointer. template template size_t Decoder::ReadData( const unsigned char* &cp, const unsigned char* &ep, T *ptr, size_t n) { size_t l = n*sizeof(T); while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T))) { size_t m = (ep - cp)/sizeof(T); if (m > n) { m = n; } Decoder::GetValues(cp, ptr, m); cp += m*sizeof(T); ptr += m; n -= m; } return l - n*sizeof(T); } //---------------------------------------------------------------------------- // Skip "l" bytes in the buffer, return the number of bytes actually skipped template size_t Decoder::SkipData( const unsigned char* &cp, const unsigned char* &ep, size_t l) { // if the number of bytes to skip is larger than the buffer size if (l >= static_cast(this->Parser->GetBufferSize())) { // seek forward within the file vtkTypeInt64 m = static_cast(l); vtkTypeInt64 n = vtkDICOMParserInternalFriendship::GetBytesRemaining( this->Parser, cp, ep); m = (m <= n ? m : n); vtkDICOMParserInternalFriendship::SeekBuffer(this->Parser, cp, ep, m); return static_cast(m); } // otherwise, read and ignore the specified number of bytes size_t n = l; while (n != 0 && this->CheckBuffer(cp, ep, 2)) { size_t m = ep - cp; if (m > n) { m = n; } cp += m; n -= m; } return l - n; } //---------------------------------------------------------------------------- template size_t Decoder::ReadElementHead( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMTag tag, vtkDICOMVR &vr, unsigned int &vl) { // basic size is 4 bytes size_t l = 4; // sequence and item delimiters are always decoded as implicit if (this->ImplicitVR || tag.GetGroup() == HxFFFE) { // implicit VR vl = Decoder::GetInt32(cp); // ignore vl in group length tags, it is corrupt in some files // and we know that it should always have a value of "4". if (tag.GetElement() == 0x0000) { vl = 4; } cp += 4; } else { // explicit VR bool implicit = false; vr = vtkDICOMVR(cp); vl = Decoder::GetInt16(cp + 2); cp += 4; if (!vr.IsValid()) { // invalid vr, try to get VR from dictionary instead vr = this->Context->FindDictVR(tag); // check that vr was composed of reasonable chars if (cp[-4] < 0x20 || cp[-4] >= 0x7f || cp[-3] < 0x20 || cp[-3] >= 0x7f) { // if VR is not a printable character within the default character // set, assume implicit encoding for this particular element implicit = true; vl = Decoder::GetInt32(cp - 4); } } if (!implicit && vr.HasLongVL()) { // for OB, OD, OF, OL, OW, SQ, UC, UN, UR, UT, and unrecognized // check that buffer has 4 bytes for 32-bit VL if (!this->CheckBuffer(cp, ep, 4)) { vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep, "Unexpected end of file."); return 0; } vl = Decoder::GetInt32(cp); cp += 4; l += 4; } } return l; } //---------------------------------------------------------------------------- template size_t Decoder::ReadElementValue( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMVR vr, unsigned int vl, vtkDICOMValue &v) { size_t l = 0; // handle elements of unknown length if (vl == HxFFFFFFFF) { if (vr == vtkDICOMVR::UN) { // if VR is UN then it is a sequence encoded as implicit LE // (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation v.AllocateUnsignedCharData(vr, 0); this->ImplicitLE->SkipElements( cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v); return v.GetNumberOfValues(); } else if (vr == vtkDICOMVR::OB) { // make sure unknown length data is properly encapsulated if (!this->CheckBuffer(cp, ep, 8)) { vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep, "Unexpected end of file."); return 0; } unsigned short g1 = Decoder::GetInt16(cp); unsigned short e1 = Decoder::GetInt16(cp + 2); if (g1 != HxFFFE || (e1 != HxE000 && e1 != HxE0DD)) { vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep, "Encapsulated object is missing (FFFE,E000) tag."); return 0; } v.AllocateUnsignedCharData(vr, 0); this->SkipElements( cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v); return v.GetNumberOfValues(); } else if (vr != vtkDICOMVR::SQ) { // only UN, OB, and SQ can have unknown length vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep, "Illegal item length FFFFFFFF encountered."); return 0; } } else if (static_cast(ep - cp) < static_cast(vl)) { // value is larger than what remains in buffer, // make sure there are enough bytes left in file vtkTypeInt64 bytesRemaining = vtkDICOMParserInternalFriendship::GetBytesRemaining( this->Parser, cp, ep); if (static_cast(vl) > bytesRemaining) { vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep, "Item length exceeds the bytes remaining in file."); return 0; } } switch (vr.GetType()) { case VTK_CHAR: { char *ptr; if (vr.HasSpecificCharacterSet() && this->LastTag > DC::SpecificCharacterSet) { ptr = v.AllocateCharData(vr, this->Context->GetCharacterSet(), vl); } else { ptr = v.AllocateCharData(vr, vl); } l = this->ReadData(cp, ep, ptr, vl); // AllocateCharData makes room for terminal null if (l == 0 || ptr[l-1] != '\0') { ptr[l] = '\0'; } v.ComputeNumberOfValuesForCharData(); break; } case VTK_UNSIGNED_CHAR: { unsigned char *ptr = v.AllocateUnsignedCharData(vr, vl); l = this->ReadData(cp, ep, ptr, vl); break; } case VTK_SHORT: { unsigned int n = vl/sizeof(short); short *ptr = v.AllocateShortData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_UNSIGNED_SHORT: { unsigned int n = vl/sizeof(unsigned short); unsigned short *ptr = v.AllocateUnsignedShortData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_INT: { unsigned int n = vl/sizeof(int); int *ptr = v.AllocateIntData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_UNSIGNED_INT: { unsigned int n = vl/sizeof(unsigned int); unsigned int *ptr = v.AllocateUnsignedIntData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_LONG_LONG: { unsigned long long n = vl/sizeof(long long); long long *ptr = v.AllocateInt64Data(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_UNSIGNED_LONG_LONG: { unsigned long long n = vl/sizeof(unsigned long long); unsigned long long *ptr = v.AllocateUnsignedInt64Data(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_FLOAT: { unsigned int n = vl/sizeof(float); float *ptr = v.AllocateFloatData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_DOUBLE: { unsigned int n = vl/sizeof(double); double *ptr = v.AllocateDoubleData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_DICOM_TAG: { unsigned int n = vl/sizeof(vtkDICOMTag); vtkDICOMTag *ptr = v.AllocateTagData(vr, n); l = this->ReadData(cp, ep, ptr, n); break; } case VTK_DICOM_ITEM: { vtkDICOMTag tag = this->LastTag; vtkDICOMSequence seq; bool queryMatched = false; l = 0; while (l < static_cast(vl) || vl == HxFFFFFFFF) { if (!this->CheckBuffer(cp, ep, 8)) { return l; } unsigned short g = Decoder::GetInt16(cp); unsigned short e = Decoder::GetInt16(cp + 2); unsigned int il = Decoder::GetInt32(cp + 4); cp += 8; l += 8; if (g == HxFFFE && e == HxE000) { // read one item size_t offset = this->GetByteOffset(cp, ep) - 8; bool delimited = (il == HxFFFFFFFF); vtkDICOMTag endtag(HxFFFE, HxE00D); vtkDICOMItem item(this->Context->GetCharacterSet(), this->Context->GetVRForXS(), delimited, static_cast(offset)); DecoderContext context(&item, this->Parser->GetDefaultCharacterSet(), this->Parser->GetOverrideCharacterSet()); this->PushContext(&context, tag); if (this->HasQuery) { if (this->QueryOneItem(cp, ep, il, endtag, l)) { queryMatched = true; seq.AddItem(item); } } else { this->ReadElements(cp, ep, il, endtag, l); seq.AddItem(item); } this->PopContext(); } else if (g == HxFFFE && e == HxE0DD) { // sequence delimiter found break; } else { // non-item tag found, skip to end if vl is known if (vl != HxFFFFFFFF) { l += this->SkipData(cp, ep, static_cast(vl) - l); } break; } } if (vl != HxFFFFFFFF) { // if vl != 0xffffffff, then the sequence was fixed-size rather // than delimited, so let's make our own fixed-size sequence and // copy all of the items into it unsigned int n = static_cast(seq.GetNumberOfItems()); vtkDICOMSequence seq2(n); for (unsigned int i = 0; i < n; i++) { seq2.SetItem(i, seq.GetItem(i)); } seq = seq2; } v = seq; // save whether query matched for any of the items if (this->HasQuery) { this->QueryMatched = queryMatched; } // reset the tag and VR as we step out of the sequence this->LastTag = tag; this->LastVR = vr; this->LastVL = vl; break; } } return l; } //---------------------------------------------------------------------------- template bool Decoder::ReadElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, size_t &bytesRead) { size_t tl = 0; // does delimiter specify a single group to read? unsigned short group = delimiter.GetGroup(); bool readGroup = (delimiter.GetElement() == 0x0000); while (tl < static_cast(l) || l == HxFFFFFFFF) { // read the tag if (!this->CheckBuffer(cp, ep, 8)) { break; } unsigned short g = Decoder::GetInt16(cp); unsigned short e = Decoder::GetInt16(cp + 2); vtkDICOMTag tag(g,e); // break if element is not in the chosen group if (readGroup && group != g) { break; } // read the VR and VL cp += 4; vtkDICOMVR vr; unsigned int vl; size_t hl = this->ReadElementHead(cp, ep, tag, vr, vl); tl += 4 + hl; // return false if could not read element if (hl == 0) { return false; } // if VR wasn't in the element head (e.g. implicit), use dictionary if (!vr.IsValid()) { vr = this->Context->FindDictVR(tag); } // save this as the most recent tag this->LastTag = tag; this->LastVR = vr; this->LastVL = vl; // break if delimiter found if (!readGroup && tag == delimiter) { break; } // skip the value if this tag is not in the query if (this->HasQuery && !this->QueryContains(tag)) { if (vl != HxFFFFFFFF) { // constant length item size_t sl = this->SkipData(cp, ep, vl); tl += sl; if (sl != static_cast(vl)) { return false; } } else { // if vl == 0xffffffff, the value is delimited vtkDICOMTag newdelim(HxFFFE, HxE0DD); if (tag == vtkDICOMTag(HxFFFE, HxE000)) { // if tag is item tag, use item delimiter newdelim = vtkDICOMTag(HxFFFE, HxE00D); } if (vr != vtkDICOMVR::UN) { // Value is either a sequence or is encapsulated data if (!this->SkipElements(cp, ep, vl, newdelim, NULL)) { return false; } } else { // VR of UN indicates the value is an implicit LE sequence if (!this->ImplicitLE->SkipElements(cp, ep, vl, newdelim, NULL)) { return false; } } } continue; } // read the value vtkDICOMValue v; size_t rl = 0; if (vr == vtkDICOMVR::UN && !this->ImplicitVR) { // if it was explicitly labeled 'UN' then check dictionary vr = this->Context->FindDictVR(tag); this->LastVR = vr; // save true VR, rather than recorded VR rl = this->ImplicitLE->ReadElementValue(cp, ep, vr, vl, v); } else { rl = this->ReadElementValue(cp, ep, vr, vl, v); } // was it a short read? if (rl < static_cast(vl) && vl != HxFFFFFFFF) { size_t dl = static_cast(vl) - rl; // is the difference small, and not due to buffer underrun? if (dl <= 8 && this->CheckBuffer(cp, ep, dl)) { // treat the difference as if it is padding cp += dl; rl = vl; } else { return false; } } tl += rl; // store the value if (this->Item) { this->Item->Set(tag, v); } else if (this->Index < 0) { this->MetaData->Set(tag, v); } else { this->MetaData->Set(this->Index, tag, v); this->HandleMissingAttributes(tag); } /* cout << tag << " " << vr << " " << vl << " " << v; vtkDICOMDictEntry entry; if (this->MetaData->FindDictEntry(tag, entry)) { cout << " \"" << entry.GetName() << "\""; } cout << "\n"; */ // check if the value matches the query if (this->HasQuery && !this->QueryMatches(v)) { this->QueryMatched = false; } } // if reading by group, advance the query to the next group if (readGroup && this->HasQuery && this->QueryMatched) { this->AdvanceQueryIterator(vtkDICOMTag(group+1, 0x0000)); } bytesRead += tl; return true; } //---------------------------------------------------------------------------- template bool Decoder::QueryOneItem( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, size_t &bytesRead) { assert(this->Query != this->QueryEnd); // save the current query state before going one level deeper bool queryMatched = this->QueryMatched; vtkDICOMDataElementIterator query = this->Query; vtkDICOMDataElementIterator queryEnd = this->QueryEnd; vtkDICOMDataElementIterator querySave = this->QuerySave; // if query element is empty, then use universal matching: // set default HasQuery to 'false' to match everything this->HasQuery = false; // if query sequence isn't empty, set HasQuery to 'true' and // use the sequence item as the new data set query if (query->GetValue().GetNumberOfValues() > 0) { const vtkDICOMItem *qitems = query->GetValue().GetSequenceData(); if (qitems != 0 && qitems[0].GetNumberOfDataElements() != 0) { this->HasQuery = true; this->QueryMatched = true; this->Query = qitems[0].Begin(); this->QueryEnd = qitems[0].End(); this->QuerySave = this->Query; } } this->ReadElements(cp, ep, l, delimiter, bytesRead); // check query keys up to the end of the item if (this->HasQuery) { this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff)); } bool matched = (this->QueryMatched & queryMatched); // restore the query state this->HasQuery = true; this->QueryMatched = queryMatched; this->Query = query; this->QueryEnd = queryEnd; this->QuerySave = querySave; return matched; } //---------------------------------------------------------------------------- template bool Decoder::SkipElements( const unsigned char* &cp, const unsigned char* &ep, unsigned int l, vtkDICOMTag delimiter, vtkDICOMValue *v) { if (l == HxFFFFFFFF) { // save the current buffer position const unsigned char *sp = cp; // does delimiter specify a single group to read? unsigned short group = delimiter.GetGroup(); bool readGroup = (delimiter.GetElement() == 0x0000); // skip until delimiter found for (;;) { if (!this->CheckBuffer(cp, ep, 8, v, sp)) { return false; } unsigned short g = Decoder::GetInt16(cp); unsigned short e = Decoder::GetInt16(cp + 2); // break if element is not in the chosen group if (readGroup && group != g) { break; } cp += 4; vtkDICOMTag tag(g, e); unsigned int vl = 0; vtkDICOMVR vr; if (this->ReadElementHead(cp, ep, tag, vr, vl) == 0) { return false; } // save this as the most recent tag this->LastTag = tag; this->LastVR = vr; this->LastVL = vl; // break if delimiter found if (!readGroup && this->LastTag == delimiter) { break; } if (vl == HxFFFFFFFF) { // copy data up to current buffer position this->CopyBuffer(v, sp, cp); sp = cp; // use sequence delimiter vtkDICOMTag newdelim(HxFFFE, HxE0DD); if (g == HxFFFE && e == HxE000) { // use item delimiter newdelim = vtkDICOMTag(HxFFFE, HxE00D); } // skip internal segment until new delimiter found if (vr != vtkDICOMVR::UN) { if (!this->SkipElements(cp, ep, vl, newdelim, v)) { return false; } } // if VR is explicit UN, sequence is implicit LE // (see DICOM Part 5, Section 6.2.2) else if (!this->ImplicitLE->SkipElements( cp, ep, vl, newdelim, v)) { return false; } sp = cp; } else { // fixed length element (vl != 0xffffffff) if (v != 0 && static_cast(vl) > static_cast(ep - cp)) { // if vl is larger than number of bytes left in buffer, // then copy data from save point "sp" up to "cp" into v, // and read the value into "v". size_t m = cp - sp; size_t n = v->GetNumberOfValues(); unsigned char *ptr = v->ReallocateUnsignedCharData(n + vl + m) + n; if (m) { do { *ptr++ = *sp++; } while (--m); } size_t tl = this->ReadData(cp, ep, ptr, vl); sp = cp; if (tl != static_cast(vl)) { return false; } } else { size_t tl = this->SkipData(cp, ep, vl); if (tl != static_cast(vl)) { return false; } } } } // the for(;;) loop is done, copy data from the save point sp // up to current position cp into the value v this->CopyBuffer(v, sp, cp); } else if (l != 0) // l != 0xffffffff { // skipped a fixed number of bytes size_t tl; if (v != 0) { // read bytes into the value "v" size_t n = v->GetNumberOfValues(); unsigned char *ptr = v->ReallocateUnsignedCharData(n + l) + n; tl = this->ReadData(cp, ep, ptr, l); if (tl != static_cast(l)) { return false; } } else { // simply skip "l" bytes tl = this->SkipData(cp, ep, l); if (tl != static_cast(l)) { return false; } } } return true; } } // end anonymous namespace //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // Constructor vtkDICOMParser::vtkDICOMParser() { this->FileName = NULL; this->MetaData = NULL; this->Query = NULL; this->QueryItem = NULL; this->Groups = NULL; this->InputFile = NULL; this->BytesRead = 0; this->FileOffset = 0; this->FileSize = 0; this->Buffer = NULL; this->BufferSize = 8192; this->ChunkSize = 0; this->Index = -1; this->PixelDataVL = 0; this->PixelDataFound = false; this->QueryMatched = false; this->DefaultCharacterSet = vtkDICOMCharacterSet::GetGlobalDefault(); this->OverrideCharacterSet = vtkDICOMCharacterSet::GetGlobalOverride(); this->ErrorCode = 0; } // Destructor vtkDICOMParser::~vtkDICOMParser() { delete [] this->FileName; delete this->QueryItem; if (this->MetaData) { this->MetaData->Delete(); } if (this->Query) { this->Query->Delete(); } if (this->Groups) { this->Groups->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMParser::SetQueryItem(const vtkDICOMItem& query) { if (this->Query) { this->Query->Delete(); this->Query = 0; } delete this->QueryItem; this->QueryItem = 0; if (query.GetNumberOfDataElements() > 0) { this->QueryItem = new vtkDICOMItem(query); } } //---------------------------------------------------------------------------- void vtkDICOMParser::SetDefaultCharacterSet(vtkDICOMCharacterSet cs) { if (this->DefaultCharacterSet != cs) { this->DefaultCharacterSet = cs; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMParser::SetOverrideCharacterSet(bool b) { if (this->OverrideCharacterSet != b) { this->OverrideCharacterSet = b; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMParser::SetBufferSize(int size) { if (this->BufferSize != size) { if (size < 256) { size = 256; } if (size > (2147483647 - 8)) { size = (2147483647 - 8); } this->BufferSize = size; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMParser::Update() { int idx = -1; // Use default idx of -1 if we are writing to the meta data object for // the first time, or if the meta data is for only a single image. if (this->MetaData && this->MetaData->GetNumberOfDataElements() > 0 && this->MetaData->GetNumberOfInstances() > 1) { idx = this->Index; } this->ReadFile(this->MetaData, idx); if (this->MetaData) { this->MetaData->Modified(); } } //---------------------------------------------------------------------------- bool vtkDICOMParser::ReadFile(vtkDICOMMetaData *data, int idx) { // Mark pixel data as not found yet this->PixelDataFound = false; this->QueryMatched = (this->Query != 0 || this->QueryItem != 0); this->FileOffset = 0; this->FileSize = 0; // Check that the file name has been set. if (!this->FileName) { this->SetErrorCode(vtkErrorCode::NoFileNameError); vtkErrorMacro("ReadFile: No file name has been set"); return false; } // Make sure that the file is readable. vtkDICOMFile infile(this->FileName, vtkDICOMFile::In); if (infile.GetError()) { this->SetErrorCode(vtkErrorCode::CannotOpenFileError); const char *errText = "Can't open the file "; if (infile.GetError() == vtkDICOMFile::AccessDenied) { errText = "No permission to read the file "; } else if (infile.GetError() == vtkDICOMFile::FileIsDirectory) { errText = "The selected file is a directory "; } vtkErrorMacro("ReadFile: " << errText << this->FileName); return false; } this->InputFile = &infile; this->FileSize = infile.GetSize(); this->Buffer = new unsigned char [this->BufferSize + 8]; this->BytesRead = 0; // guard against anyone changing BufferSize while reading this->ChunkSize = this->BufferSize; const unsigned char *cp = NULL; const unsigned char *ep = NULL; this->FillBuffer(cp, ep); if (ep - cp >= 132 && cp[128] == 'D' && cp[129] == 'I' && cp[130] == 'C' && cp[131] == 'M') { // DICM magic number at offset 128, where it belongs in DICOM cp += 132; } else if (ep - cp >= 4 && cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M') { // DICM magic number at beginning of file, where it doesn't belong cp += 4; } this->ReadMetaHeader(cp, ep, data, idx); this->ReadMetaData(cp, ep, data, idx); delete [] this->Buffer; infile.Close(); this->InputFile = NULL; return true; } //---------------------------------------------------------------------------- bool vtkDICOMParser::ReadMetaHeader( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMMetaData *meta, int idx) { // get the meta information group length unsigned short g = Decoder::GetInt16(cp); unsigned short e = Decoder::GetInt16(cp + 2); vtkDICOMVR vr = vtkDICOMVR(cp + 4); unsigned int vl = Decoder::GetInt16(cp + 6); // verify that this is the right tag if (g == 0x0002) { // make a temporary MetaData object if none was provided bool tempMeta = false; if (meta == 0) { meta = vtkDICOMMetaData::New(); tempMeta = true; } LittleEndianDecoder decoder(this, meta, idx); // check for strange files with implicit VR meta header decoder.SetImplicitVR(!vr.IsValid()); unsigned int l = HxFFFFFFFF; if (e == 0x0000 && vl == 4) { // get length from tag 0x0002,0x0000 l = Decoder::GetInt32(cp + 8) + 12; } decoder.ReadElements(cp, ep, l, vtkDICOMTag(g,0)); int i = (idx == -1 ? 0 : idx); this->TransferSyntax = meta->Get(i, DC::TransferSyntaxUID).AsString(); if (tempMeta) { meta->Delete(); } } else { this->TransferSyntax = ""; } this->FileOffset = this->GetBytesProcessed(cp, ep); return true; } //---------------------------------------------------------------------------- bool vtkDICOMParser::ReadMetaData( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMMetaData *meta, int idx) { // the decoders to choose from LittleEndianDecoder decoderLE(this, meta, idx); BigEndianDecoder decoderBE(this, meta, idx); DecoderBase *decoder = &decoderLE; // make sure there is at least one data element if (ep - cp < 8) { this->FillBuffer(cp, ep); if (ep - cp < 8) { return false; } } std::string &tsyntax = this->TransferSyntax; if (tsyntax == "") // try to guess the syntax { if (!decoder->CheckBuffer(cp, ep, 8)) { return false; } if (cp[0] == 0x00 && cp[1] == 0x08) { tsyntax = "1.2.840.10008.1.2.2"; decoder = &decoderBE; } decoder->SetImplicitVR(!vtkDICOMVR(cp + 4).IsValid()); } else if (tsyntax == "1.2.840.10008.1.2" || // Implicit LE tsyntax == "1.2.840.10008.1.20" || // Papyrus Implicit LE tsyntax == "1.2.840.113619.5.2") // GE Implicit LE { decoder->SetImplicitVR(true); } else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE { decoder = &decoderBE; } // get the Query vtkDICOMDataElementIterator iter; vtkDICOMDataElementIterator iterEnd; bool hasQuery = false; if (this->Query) { hasQuery = true; iter = this->Query->Begin(); iterEnd = this->Query->End(); } else if (this->QueryItem) { hasQuery = true; iter = this->QueryItem->Begin(); iterEnd = this->QueryItem->End(); } if (hasQuery) { // skip any elements in groups less than 0002 while (iter != iterEnd && iter->GetTag().GetGroup() < 0x0002) { ++iter; } if (iter->GetTag() == vtkDICOMTag(0x0002,0x0000)) { // if FileMetaInformationGroupLength is set, assume that the // query was read from a file and that we don't actually want // to query the meta header while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002) { ++iter; } } else { // check the query against the meta header, which was already read bool matched = true; vtkDICOMDataElementIterator metaIter = meta->Begin(); vtkDICOMDataElementIterator metaEnd = meta->End(); while (metaIter != metaEnd && iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002) { if (metaIter->GetTag() == iter->GetTag()) { matched &= metaIter->GetValue(this->Index).Matches(iter->GetValue()); ++iter; ++metaIter; } else if (metaIter->GetTag() < iter->GetTag()) { ++metaIter; } else { // this is a mismatch unless the query key is for universal matching vtkDICOMValue nullValue; matched &= nullValue.Matches(iter->GetValue()); ++iter; } } this->QueryMatched &= matched; } // set the query for the decoder so it can scan the rest of the file decoder->SetQuery(iter, iterEnd); } // make a list of the groups of interest std::vector groups; if (hasQuery) { unsigned short lastg = 0; while (iter != iterEnd) { unsigned short g = iter->GetTag().GetGroup(); if (g > lastg) { lastg = g; groups.push_back(g); } ++iter; } } else if (this->Groups) { vtkIdType n = this->Groups->GetNumberOfTuples(); for (vtkIdType i = 0; i < n; i++) { groups.push_back(this->Groups->GetValue(i)); } std::sort(groups.begin(),groups.end()); groups.erase(std::unique(groups.begin(),groups.end()), groups.end()); } // iterator for going through the groups to read std::vector::iterator giter = groups.begin(); // read group-by-group bool readFailure = false; while (!readFailure) { // peek ahead to get the next tag vtkDICOMTag nextTag = decoder->Peek(cp, ep); // if there is no data left to decode, then break if (cp == ep) { break; } // do we want to read or skip this group? bool skipGroup = false; if (!groups.empty()) { while (giter != groups.end() && *giter < nextTag.GetGroup()) { ++giter; } skipGroup = (giter == groups.end() || *giter != nextTag.GetGroup()); } // create a delimiter to read/skip only this group vtkDICOMTag delimiter(nextTag.GetGroup(), 0); // check for PixelData group 0x7fe0, or obsolete 0x7fxx, but do not // accept private groups like 7fe1 unsigned int l = HxFFFFFFFF; if ((nextTag.GetGroup() & 0xff01) == 0x7f00) { if (nextTag.GetElement() == 0x0000) { // this is a "group length" tag, we want to read exactly // 12 bytes to get to the next element (the pixel data) l = 12; } else { // this tag is pixel data, so we want to read the data // element header for this tag and then stop delimiter = nextTag; } } // read or skip this group of data elements if (meta && !skipGroup) { readFailure = !decoder->ReadElements(cp, ep, l, delimiter); } else { readFailure = !decoder->SkipElements(cp, ep, l, delimiter); } // check whether a PixelData element was found vtkDICOMTag lastTag = decoder->GetLastTag(); if (!readFailure && lastTag == delimiter && lastTag.GetElement() != 0x0000) { if (lastTag.GetGroup() == 0x7fe0) { this->FileOffset = this->GetBytesProcessed(cp, ep); this->PixelDataFound = true; this->PixelDataVL = decoder->GetLastVL(); } if (meta) { // add PixelData as an empty attribute, since we did not read its // value (the FileOffset was saved so it can be read later) vtkDICOMVR lastVR = decoder->GetLastVR(); if (!lastVR.IsValid()) { lastVR = vtkDICOMVR::OW; const vtkDICOMValue& ba = meta->Get(idx, DC::BitsAllocated); if (ba.IsValid() && ba.AsUnsignedInt() <= 8) { lastVR = vtkDICOMVR::OB; } } if (idx >= 0) { meta->Set(idx, lastTag, vtkDICOMValue(lastVR)); decoder->HandleMissingAttributes(lastTag); } else { meta->Set(lastTag, vtkDICOMValue(lastVR)); } } // if all attributes in the query have been scanned, then break now // to avoid seeking through the pixel data fragments if (hasQuery && this->PixelDataFound) { decoder->AdvanceQueryIterator(lastTag); if (decoder->GetQueryFinished()) { break; } } // skip over the PixelData unsigned int vl = decoder->GetLastVL(); vtkTypeInt64 r = this->GetBytesRemaining(cp, ep); if (vl != 0xFFFFFFFF && r == static_cast(vl)) { // end of pixel data is end of file break; } if ((vl != 0xFFFFFFFF && r < static_cast(vl)) || !this->SkipValue(cp, ep, vl)) { this->ParseError(cp, ep, "Premature end of file while reading PixelData."); readFailure = true; } } } this->QueryMatched &= decoder->FinishQuery(); if (!this->PixelDataFound) { // if no pixel data, set FileOffset to current file position this->FileOffset = this->GetBytesProcessed(cp, ep); } return true; } //---------------------------------------------------------------------------- bool vtkDICOMParser::FillBuffer( const unsigned char* &ucp, const unsigned char* &ep) { unsigned char *dp = this->Buffer; size_t n = ep - ucp; const unsigned char *cp = ucp; // number of bytes to read size_t nbytes = this->ChunkSize; if (n != 0) { // make sure read will not overflow the buffer if (n > 8) { nbytes -= (n - 8); } // recycle unused buffer chars to head of buffer do { *dp++ = *cp++; } while (--n); } else if (this->InputFile->GetError()) { this->SetErrorCode(vtkErrorCode::UnknownError); vtkErrorMacro("FillBuffer: error reading from file " << this->FileName); return false; } else if (this->InputFile->EndOfFile()) { // if buffer is drained, and eof, then done return false; } // read at most n bytes n = this->InputFile->Read(dp, nbytes); // get number of chars read this->BytesRead += n; // ep is recycled chars plus newly read chars ep = dp + n; ucp = this->Buffer; return true; } //---------------------------------------------------------------------------- bool vtkDICOMParser::SeekBuffer( const unsigned char* &ucp, const unsigned char* &ep, vtkTypeInt64 offset) { // if we can advance within the buffer, then do so if (offset > 0 && static_cast(ep - ucp) >= offset) { ucp += offset; return true; } // otherwise, seek within the file vtkTypeInt64 pos = this->GetBytesProcessed(ucp, ep); if (!this->InputFile->GetError() && this->InputFile->SetPosition(pos + offset)) { // read just 8 bytes at the new position, i.e. enough to take a peek // at the next element size_t n = this->InputFile->Read(this->Buffer, 8); ucp = this->Buffer; ep = ucp + n; this->BytesRead = pos + offset + n; return true; } return false; } //---------------------------------------------------------------------------- bool vtkDICOMParser::SkipValue( const unsigned char* &cp, const unsigned char* &ep, unsigned int vl) { if (vl != 0xFFFFFFFF) { // reset buffer to new file position return this->SeekBuffer(cp, ep, vl); } // skip encapsulated data while ((ep - cp) >= 8 || this->FillBuffer(cp, ep)) { unsigned int t = Decoder::GetInt32(cp); unsigned int l = Decoder::GetInt32(cp + 4); cp += 8; if (t == 0xE0DDFFFE) { return true; } if (t != 0xE000FFFE || !this->SkipValue(cp, ep, l)) { break; } } return false; } //---------------------------------------------------------------------------- vtkTypeInt64 vtkDICOMParser::GetBytesRemaining( const unsigned char *cp, const unsigned char *ep) { return static_cast( this->FileSize - this->BytesRead + (ep - cp)); } //---------------------------------------------------------------------------- vtkTypeInt64 vtkDICOMParser::GetBytesProcessed( const unsigned char* cp, const unsigned char* ep) { // the offset is the number of bytes read minus // the number of bytes remaining in the buffer. return this->BytesRead - (ep - cp); } //---------------------------------------------------------------------------- void vtkDICOMParser::ParseError( const unsigned char* cp, const unsigned char* ep, const char* message) { this->FileOffset = this->GetBytesProcessed(cp, ep); this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("At byte offset " << this->FileOffset << " in file " << this->FileName << ": " << message); } //---------------------------------------------------------------------------- void vtkDICOMParser::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "FileName: " << (this->FileName ? this->FileName : "(NULL)") << "\n"; os << indent << "DefaultCharacterSet: " << this->DefaultCharacterSet << "\n"; os << indent << "OverrideCharacterSet: " << (this->OverrideCharacterSet ? "On\n" : "Off\n"); os << indent << "PixelDataFound: " << (this->PixelDataFound ? "True\n" : "False\n"); os << indent << "PixelDataVL: " << this->PixelDataVL << "\n"; os << indent << "FileOffset: " << this->FileOffset << "\n"; os << indent << "FileSize: " << this->FileSize << "\n"; os << indent << "MetaData: " << this->MetaData << "\n"; os << indent << "Index: " << this->Index << "\n"; os << indent << "BufferSize: " << this->BufferSize << "\n"; os << indent << "Query: " << this->Query << "\n"; os << indent << "QueryItem: " << this->QueryItem << "\n"; os << indent << "QueryMatched: " << (this->QueryMatched ? "True\n" : "False\n"); os << indent << "Groups: " << this->Groups << "\n"; } vtk-dicom-0.8.12/Source/vtkDICOMParser.h000066400000000000000000000202771356440565500176720ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMParser_h #define vtkDICOMParser_h #include "vtkObject.h" #include "vtkStdString.h" // For std::string #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMCharacterSet.h" // For character sets class vtkDICOMFile; class vtkDICOMItem; class vtkDICOMMetaData; class vtkUnsignedShortArray; class vtkDICOMParserInternalFriendship; //! A meta data reader for DICOM data. /*! * This class provides routines for parsing a DICOM file * and creating a vtkDICOMMetaData object. It stops parsing * the file as soon as it finds the PixelData, and the byte * offset of the PixelData within the file can be retrieved * with GetFileOffset(). */ class VTKDICOM_EXPORT vtkDICOMParser : public vtkObject { public: //! Create a new vtkDICOMParser instance. static vtkDICOMParser *New(); //! VTK dynamic type information macro. vtkTypeMacro(vtkDICOMParser, vtkObject); //! Print a summary of the contents of this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set the file name. vtkSetStringMacro(FileName); vtkGetStringMacro(FileName); //@} //@{ //! Set the metadata object for storing the data elements. void SetMetaData(vtkDICOMMetaData *); vtkDICOMMetaData *GetMetaData() { return this->MetaData; } //@} //@{ //! Set the instance index to use when storing metadata. vtkSetMacro(Index, int); int GetIndex() { return this->Index; } //@} //@{ //! Set the character set to use if SpecificCharacterSet is missing. /*! * Some DICOM files do not list a SpecificCharacterSet attribute, but * nevertheless use a non-ASCII character encoding. This method can be * used to specify the character set in absence of SpecificCharacterSet. * If SpecificCharacterSet is present, the default will not override it * unless OverrideCharacterSet is true. */ void SetDefaultCharacterSet(vtkDICOMCharacterSet cs); vtkDICOMCharacterSet GetDefaultCharacterSet() { return this->DefaultCharacterSet; } //! Override the value stored in SpecificCharacterSet. /*! * This method can be used if the SpecificCharacterSet attribute of a * file is incorrect. It overrides the SpecificCharacterSet with the * DefaultCharacterSet. */ void SetOverrideCharacterSet(bool b); void OverrideCharacterSetOn() { this->SetOverrideCharacterSet(true); } void OverrideCharacterSetOff() { this->SetOverrideCharacterSet(false); } bool GetOverrideCharacterSet() { return this->OverrideCharacterSet; } //@} //@{ //! Set a query. Only matching data will be retrieved. /*! * This can be used to scan a file for data that matches a given * query. For more information on how matching is done, see the * vtkDICOMValue::Matches() method. */ void SetQuery(vtkDICOMMetaData *query); vtkDICOMMetaData *GetQuery() { return this->Query; } //@} //@{ //! Set a query, using an item instead of vtkDICOMMetaData. /*! * This can be used to scan a file for data that matches a given * query. For more information on how matching is done, see the * vtkDICOMValue::Matches() method. To clear the query, pass an * empty item. */ void SetQueryItem(const vtkDICOMItem& query); //@} //@{ //! Set specific metadata groups to read (obsolete). /*! * This method is obsolete, the SetQuery() method should be used instead. */ void SetGroups(vtkUnsignedShortArray *groups); vtkUnsignedShortArray *GetGroups() { return this->Groups; } //@} //@{ //! This is true only if the file matched the query. bool GetQueryMatched() { return this->QueryMatched; } //! This is true only if PixelData was found in the file. bool GetPixelDataFound() { return this->PixelDataFound; } //! Get the VL for the PixelData, will be 0xffffffff if compressed. unsigned int GetPixelDataVL() { return this->PixelDataVL; } //@} //@{ //! Get the byte offset to the end of the metadata. /*! * After the metadata has been read, the file offset * will be set to the position of the pixel data. */ vtkTypeInt64 GetFileOffset() { return this->FileOffset; } //! Get the total file length (only valid after Update). vtkTypeInt64 GetFileSize() { return this->FileSize; } //@{ //! Set the buffer size, the default is 8192 (8k). /*! * A larger buffer size results in fewer IO calls. The * minimum buffer size is 256 bytes. */ void SetBufferSize(int size); int GetBufferSize() { return this->BufferSize; } //@} //@{ //! Read the metadata from the file. virtual void Update(); //! Get the error code. unsigned long GetErrorCode() { return this->ErrorCode; } //@} protected: vtkDICOMParser(); ~vtkDICOMParser(); //! Internal method for filling the buffer. /*! * This is an internal method that refills the buffer * by reading data from the file. The pointers cp and * ep mark the region of the buffer that has not been * parsed yet. The call to FillBuffer will move this * region to the beginning of the buffer, and will then * fill the remainder of the buffer with new data from * the file. The values of cp and ep will be set to the * beginning and end of the buffer. */ virtual bool FillBuffer( const unsigned char* &cp, const unsigned char* &ep); //! Internal method to advance the buffer to a new file position. /*! * This will move to a new position within the file. */ virtual bool SeekBuffer( const unsigned char* &cp, const unsigned char* &ep, vtkTypeInt64 offset); //! Internal method for skipping over a value. /*! * This is for skipping over bulk data (such as PixelData). * If vl is 0xffffffff, then the value will be assumed to be * delimited (e.g. encapsulated pixel data). */ virtual bool SkipValue( const unsigned char* &cp, const unsigned char* &ep, unsigned int vl); //! Get the bytes remaining in the file. virtual vtkTypeInt64 GetBytesRemaining( const unsigned char *cp, const unsigned char *ep); //! Report an error while parsing the file. virtual void ParseError( const unsigned char *cp, const unsigned char *ep, const char *message); //! Set the error code. void SetErrorCode(unsigned long e) { this->ErrorCode = e; } //! Read the file into the provided metadata object. virtual bool ReadFile(vtkDICOMMetaData *data, int idx); //! Read just the meta header (group 0x0002). bool ReadMetaHeader( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMMetaData *data, int idx); //! Read the meta data following the meta header. bool ReadMetaData( const unsigned char* &cp, const unsigned char* &ep, vtkDICOMMetaData *data, int idx); //! Compute the file offset to the current position. vtkTypeInt64 GetBytesProcessed( const unsigned char* cp, const unsigned char* ep); char *FileName; std::string TransferSyntax; vtkDICOMMetaData *MetaData; vtkDICOMMetaData *Query; vtkDICOMItem *QueryItem; vtkUnsignedShortArray *Groups; vtkDICOMFile *InputFile; vtkTypeInt64 BytesRead; vtkTypeInt64 FileOffset; vtkTypeInt64 FileSize; unsigned char *Buffer; int BufferSize; int ChunkSize; int Index; unsigned int PixelDataVL; bool PixelDataFound; bool QueryMatched; vtkDICOMCharacterSet DefaultCharacterSet; bool OverrideCharacterSet; unsigned long ErrorCode; // used to share FillBuffer with internal classes friend class vtkDICOMParserInternalFriendship; private: #ifdef VTK_DICOM_DELETE vtkDICOMParser(const vtkDICOMParser&) VTK_DICOM_DELETE; void operator=(const vtkDICOMParser&) VTK_DICOM_DELETE; #else vtkDICOMParser(const vtkDICOMParser&) = delete; void operator=(const vtkDICOMParser&) = delete; #endif }; #endif /* vtkDICOMParser_h */ vtk-dicom-0.8.12/Source/vtkDICOMReader.cxx000066400000000000000000002242731356440565500202150ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMReader.h" #include "vtkDICOMAlgorithm.h" #include "vtkDICOMFile.h" #include "vtkDICOMFilePath.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMParser.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkDICOMImageCodec.h" #include "vtkDICOMSliceSorter.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMConfig.h" #include "vtkObjectFactory.h" #include "vtkImageData.h" #include "vtkPointData.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkIntArray.h" #include "vtkTypeInt64Array.h" #include "vtkByteSwap.h" #include "vtkMatrix4x4.h" #include "vtkMedicalImageProperties.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkStringArray.h" #include "vtkMath.h" #include "vtkVariant.h" #include "vtkCommand.h" #include "vtkErrorCode.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" #include "vtkTemplateAliasMacro.h" #include "vtkTypeTraits.h" #if defined(DICOM_USE_DCMTK) #ifndef _WIN32 #define HAVE_CONFIG_H #endif #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcrledrg.h" #include "dcmtk/dcmjpeg/djdecode.h" #include "dcmtk/dcmjpls/djdecode.h" #ifndef _WIN32 #undef HAVE_CONFIG_H #endif #elif defined(DICOM_USE_GDCM) #include "gdcmImageReader.h" #endif #include #include #include #include // For compatibility with new VTK generic data arrays #ifdef vtkGenericDataArray_h #define SetTupleValue SetTypedTuple #define GetTupleValue GetTypedTuple #endif vtkStandardNewMacro(vtkDICOMReader); vtkCxxSetObjectMacro(vtkDICOMReader,Sorter,vtkDICOMSliceSorter); //---------------------------------------------------------------------------- vtkDICOMReader::vtkDICOMReader() { this->AutoYBRToRGB = 1; this->NeedsYBRToRGB = 0; this->AutoRescale = 1; this->NeedsRescale = 0; this->FileScalarType = 0; this->OutputScalarType = -1; this->RescaleSlope = 1.0; this->RescaleIntercept = 0.0; this->DefaultCharacterSet = vtkDICOMCharacterSet::GetGlobalDefault(); this->OverrideCharacterSet = vtkDICOMCharacterSet::GetGlobalOverride(); this->Parser = 0; this->Sorter = vtkDICOMSliceSorter::New(); this->FileIndexArray = vtkIntArray::New(); this->FrameIndexArray = vtkIntArray::New(); this->StackIDs = vtkStringArray::New(); this->FileOffsetArray = 0; this->MetaData = vtkDICOMMetaData::New(); this->PatientMatrix = vtkMatrix4x4::New(); this->MemoryRowOrder = vtkDICOMReader::BottomUp; this->NumberOfPackedComponents = 1; this->NumberOfPlanarComponents = 1; this->Sorting = 1; this->TimeAsVector = 0; this->DesiredTimeIndex = -1; this->TimeDimension = 0; this->TimeSpacing = 1.0; this->DesiredStackID[0] = '\0'; this->OverlayBitfield = 0; this->UpdateOverlayFlag = false; this->DataScalarType = VTK_SHORT; this->NumberOfScalarComponents = 1; this->FileLowerLeft = 0; this->FileDimensionality = 2; #ifdef VTK_WORDS_BIGENDIAN this->SwapBytes = 1; #else this->SwapBytes = 0; #endif this->MedicalImageProperties = 0; #ifdef DICOM_USE_DCMTK DJDecoderRegistration::registerCodecs(); DJLSDecoderRegistration::registerCodecs(); DcmRLEDecoderRegistration::registerCodecs(); #endif // the main image and the overlay are the two outputs this->SetNumberOfOutputPorts(2); } //---------------------------------------------------------------------------- vtkDICOMReader::~vtkDICOMReader() { #ifdef DICOM_USE_DCMTK DcmRLEDecoderRegistration::cleanup(); DJLSDecoderRegistration::cleanup(); DJDecoderRegistration::cleanup(); #endif if (this->Parser) { this->Parser->Delete(); } if (this->Sorter) { this->Sorter->Delete(); } if (this->FileOffsetArray) { this->FileOffsetArray->Delete(); } if (this->FileIndexArray) { this->FileIndexArray->Delete(); } if (this->FrameIndexArray) { this->FrameIndexArray->Delete(); } if (this->StackIDs) { this->StackIDs->Delete(); } if (this->MetaData) { this->MetaData->Delete(); } if (this->PatientMatrix) { this->PatientMatrix->Delete(); } if (this->MedicalImageProperties) { this->MedicalImageProperties->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "MetaData: "; if (this->MetaData) { os << this->MetaData << "\n"; } else { os << "(none)\n"; } os << indent << "MedicalImageProperties: "; if (this->MedicalImageProperties) { os << this->MedicalImageProperties << "\n"; } else { os << "(none)\n"; } os << indent << "Sorter: "; if (this->Sorter) { os << this->Sorter << "\n"; } else { os << "(none)\n"; } os << indent << "DesiredStackID: " << (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n"; os << indent << "StackIDs: " << this->StackIDs << "\n"; os << indent << "FileIndexArray: " << this->FileIndexArray << "\n"; os << indent << "FrameIndexArray: " << this->FrameIndexArray << "\n"; os << indent << "Sorting: " << (this->Sorting ? "On\n" : "Off\n"); os << indent << "TimeAsVector: " << (this->TimeAsVector ? "On\n" : "Off\n"); os << indent << "TimeDimension: " << this->TimeDimension << "\n"; os << indent << "TimeSpacing: " << this->TimeSpacing << "\n"; os << indent << "DesiredTimeIndex: " << this->DesiredTimeIndex << "\n"; os << indent << "AutoRescale: " << (this->AutoRescale ? "On\n" : "Off\n"); os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "PatientMatrix:"; if (this->PatientMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "MemoryRowOrder: " << this->GetMemoryRowOrderAsString() << "\n"; os << indent << "OutputScalarType: " << this->OutputScalarType << "\n"; os << indent << "OverlayBitfield: 0b"; for (int i = 16; i >= 0; --i) { os << ((this->OverlayBitfield >> i) & 1); } os << "\n"; } //---------------------------------------------------------------------------- void vtkDICOMReader::SetDesiredStackID(const char *stackId) { if (stackId == 0) { stackId = ""; } // the maximum length of a stackId is 16 if (strncmp(this->DesiredStackID, stackId, 16) != 0) { strncpy(this->DesiredStackID, stackId, 16); this->DesiredStackID[17] = '\0'; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMReader::SetDefaultCharacterSet(vtkDICOMCharacterSet cs) { if (this->DefaultCharacterSet != cs) { this->DefaultCharacterSet = cs; this->Modified(); } } //---------------------------------------------------------------------------- namespace { // This silences error printing when CanReadFile is testing a file. class vtkDICOMErrorSilencer : public vtkCommand { public: static vtkDICOMErrorSilencer *New() { return new vtkDICOMErrorSilencer; } vtkTypeMacro(vtkDICOMErrorSilencer,vtkCommand); void Execute(vtkObject *caller, unsigned long eventId, void *callData) VTK_DICOM_OVERRIDE; protected: vtkDICOMErrorSilencer() {}; vtkDICOMErrorSilencer(const vtkDICOMErrorSilencer& c) : vtkCommand(c) {} void operator=(const vtkDICOMErrorSilencer&) {} }; void vtkDICOMErrorSilencer::Execute(vtkObject *, unsigned long, void *) { } } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMReader::SetMemoryRowOrder(int order) { if (order >= 0 && order <= vtkDICOMReader::BottomUp) { if (order != this->MemoryRowOrder) { this->MemoryRowOrder = order; this->Modified(); } } } //---------------------------------------------------------------------------- const char *vtkDICOMReader::GetMemoryRowOrderAsString() { const char *text = ""; switch (this->MemoryRowOrder) { case vtkDICOMReader::FileNative: text = "FileNative"; break; case vtkDICOMReader::TopDown: text = "TopDown"; break; case vtkDICOMReader::BottomUp: text = "BottomUp"; break; } return text; } //---------------------------------------------------------------------------- int vtkDICOMReader::CanReadFile(const char *filename) { vtkDebugMacro("Opening DICOM file " << filename); vtkDICOMErrorSilencer *command = vtkDICOMErrorSilencer::New(); vtkSmartPointer parser = vtkSmartPointer::New(); // add a dummy observer to silence errors unsigned long cid = parser->AddObserver(vtkCommand::ErrorEvent, command); parser->SetFileName(filename); parser->Update(); parser->RemoveObserver(cid); command->Delete(); // if an pixel data was found, the file is DICOM image return parser->GetPixelDataFound(); } //---------------------------------------------------------------------------- namespace { // a simple struct to provide info for each frame to be read struct vtkDICOMReaderFrameInfo { int FrameIndex; int SliceIndex; int ComponentIndex; vtkDICOMReaderFrameInfo(int i, int j, int k) : FrameIndex(i), SliceIndex(j), ComponentIndex(k) {} }; // a simple struct to provide info for each file to be read struct vtkDICOMReaderFileInfo { int FileIndex; int FramesInFile; // total frames in file std::vector Frames; // the frames to read vtkDICOMReaderFileInfo(int i, int n) : FileIndex(i), FramesInFile(n) {} }; } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMReader::SortFiles(vtkIntArray *files, vtkIntArray *frames) { vtkDICOMSliceSorter *sorter = this->Sorter; sorter->SetMetaData(this->MetaData); sorter->SetDesiredStackID(this->DesiredStackID); sorter->SetTimeAsVector(this->TimeAsVector); sorter->SetDesiredTimeIndex(this->DesiredTimeIndex); sorter->SetReverseSlices(this->MemoryRowOrder == vtkDICOMReader::BottomUp); sorter->Update(); files->DeepCopy(sorter->GetFileIndexArray()); frames->DeepCopy(sorter->GetFrameIndexArray()); this->StackIDs->DeepCopy(sorter->GetStackIDs()); // save the slice spacing and time information this->DataSpacing[2] = sorter->GetSliceSpacing(); this->TimeDimension = sorter->GetTimeDimension(); this->TimeSpacing = sorter->GetTimeSpacing(); } //---------------------------------------------------------------------------- void vtkDICOMReader::NoSortFiles(vtkIntArray *files, vtkIntArray *frames) { vtkDICOMMetaData *meta = this->MetaData; int numFiles = meta->GetNumberOfInstances(); files->Initialize(); frames->Initialize(); files->SetNumberOfComponents(1); frames->SetNumberOfComponents(1); for (int i = 0; i < numFiles; i++) { int numFrames = meta->Get(i, DC::NumberOfFrames).AsInt(); numFrames = (numFrames > 0 ? numFrames : 1); for (int j = 0; j < numFrames; j++) { files->InsertNextValue(i); frames->InsertNextValue(j); } } } //---------------------------------------------------------------------------- bool vtkDICOMReader::ValidateStructure( vtkIntArray *fileArray, vtkIntArray *frameArray) { vtkDICOMMetaData *meta = this->MetaData; int numFiles = meta->GetNumberOfInstances(); std::vector usedFiles(numFiles); std::fill(usedFiles.begin(), usedFiles.end(), static_cast(0)); // Validate the range of indexes the sorted arrays int numComponents = fileArray->GetNumberOfComponents(); vtkIdType numSlices = fileArray->GetNumberOfTuples(); if (numSlices != frameArray->GetNumberOfTuples() || numComponents != fileArray->GetNumberOfComponents()) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("Critical failure in file sorting!"); return false; } for (vtkIdType i = 0; i < numSlices; i++) { for (int j = 0; j < numComponents; j++) { int fileIndex = fileArray->GetComponent(i, j); int frameIndex = frameArray->GetComponent(i, j); if (fileIndex < 0 || fileIndex >= numFiles) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("File index " << fileIndex << " is out of range!"); return false; } usedFiles[fileIndex]++; int numFrames = meta->Get(fileIndex, DC::NumberOfFrames).AsInt(); numFrames = (numFrames == 0 ? 1 : numFrames); if (frameIndex < 0 || frameIndex >= numFrames) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("Frame index " << frameIndex << " is out of range!"); return false; } } } // The reader requires the following mandatory attributes static const DC::EnumType imagePixelAttribs[] = { DC::SamplesPerPixel, // missing in old ACR-NEMA files DC::Rows, DC::Columns, DC::BitsAllocated, DC::ItemDelimitationItem }; for (const DC::EnumType *tags = imagePixelAttribs; *tags != DC::ItemDelimitationItem; tags++) { int firstValue = 0; for (int fileIndex = 0; fileIndex < numFiles; fileIndex++) { if (usedFiles[fileIndex] == 0) { continue; } const char *errorText = 0; vtkDICOMValue v = meta->Get(fileIndex, *tags); int i = 1; if (v.IsValid()) { i = v.AsInt(); } else if (*tags != DC::SamplesPerPixel) { // Some ACR-NEMA files do not contain SamplesPerPixel, all // other tags must be present errorText = "Missing pixel info "; } if (firstValue == 0) { firstValue = i; } else if (firstValue != i) { errorText = "Inconsistent pixel info "; } if (i <= 0 || (*tags == DC::BitsAllocated && i != 1 && i != 8 && i != 12 && i != 16 && i != 32 && i != 64)) { errorText = "Illegal value "; } if (errorText) { this->ComputeInternalFileName(this->DataExtent[4] + fileIndex); this->Parser->SetFileName(this->InternalFileName); vtkDICOMDictEntry de = meta->FindDictEntry(*tags); this->SetErrorCode(vtkErrorCode::FileFormatError); if (v.IsValid()) { vtkErrorMacro(<< errorText << i << " for " << de.GetTag() << " \"" << de.GetName() << "\" in " << this->InternalFileName); } else { vtkErrorMacro(<< errorText << "for " << de.GetTag() << " \"" << de.GetName() << "\" in" << this->InternalFileName); } return false; } } } return true; } //---------------------------------------------------------------------------- int vtkDICOMReader::ComputeRescaledScalarType( int scalarType, int bitsStored, int pixelRepresentation) { // use BitsStored to get the potential input range unsigned long long l = 1; if (bitsStored > 0) { l <<= bitsStored - 1; } double pMin = 0; double pMax = 2.0*l - 1.0; if (pixelRepresentation) { pMin = -1.0*l; pMax = l - 1.0; } // loop through all images to get the rescaled range double vMin = VTK_DOUBLE_MAX; double vMax = VTK_DOUBLE_MIN; bool needsRescale = false; bool outputFloat = (scalarType == VTK_FLOAT || scalarType == VTK_DOUBLE); vtkIdType numSlices = this->FileIndexArray->GetNumberOfTuples(); for (vtkIdType iSlice = 0; iSlice < numSlices; iSlice++) { int numComp = this->FileIndexArray->GetNumberOfComponents(); for (int iComp = 0; iComp < numComp; iComp++) { int iFile = this->FileIndexArray->GetComponent(iSlice, iComp); int iFrame = this->FrameIndexArray->GetComponent(iSlice, iComp); double m = this->MetaData->Get( iFile, iFrame, DC::RescaleSlope).AsDouble(); double b = this->MetaData->Get( iFile, iFrame, DC::RescaleIntercept).AsDouble(); // sanity check if (m == 0.0) { m = 1.0; } // check if rescale will be needed if (m != 1.0 || b != 0.0) { needsRescale = true; // check if slope and intercept are integers if (m != floor(m) || b != floor(b)) { outputFloat = true; } } // compute the min, max output values for one image double iMin = pMin*m + b; double iMax = pMax*m + b; // modify the global min, max output values vMin = (iMin < vMin ? iMin : vMin); vMax = (iMax > vMax ? iMax : vMax); } } // check if the data type has to be changed if (!outputFloat && (vMin < vtkDataArray::GetDataTypeMin(scalarType) || vMax > vtkDataArray::GetDataTypeMax(scalarType))) { int byteSize = vtkDataArray::GetDataTypeSize(scalarType); if (byteSize <= 2) { scalarType = (vMin < 0.0 ? VTK_SHORT : VTK_UNSIGNED_SHORT); } else if (byteSize <= 4) { scalarType = (vMin < 0.0 ? VTK_INT : VTK_UNSIGNED_INT); } else { scalarType = (vMin < 0.0 ? VTK_TYPE_INT64 : VTK_TYPE_UINT64); } } if (outputFloat && scalarType != VTK_FLOAT && scalarType != VTK_DOUBLE) { // use float if data is 24 bits or less if (bitsStored <= 24) { scalarType = VTK_FLOAT; } else { scalarType = VTK_DOUBLE; } } this->NeedsRescale = needsRescale; return scalarType; } //---------------------------------------------------------------------------- int vtkDICOMReader::RequestInformation( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) { // Clear the error indicator. this->SetErrorCode(vtkErrorCode::NoError); // How many files are to be loaded? if (this->FileNames) { vtkIdType numFileNames = this->FileNames->GetNumberOfValues(); this->DataExtent[4] = 0; this->DataExtent[5] = static_cast(numFileNames - 1); } else if (this->FileName) { this->DataExtent[4] = 0; this->DataExtent[5] = 0; } int numFiles = this->DataExtent[5] - this->DataExtent[4] + 1; if (numFiles <= 0) { this->SetErrorCode(vtkErrorCode::FileFormatError); if (this->FileNames) { vtkErrorMacro("No filenames were provided for reader."); } else { vtkErrorMacro("Bad DataExtent " << this->DataExtent[4] << "," << this->DataExtent[5] << "."); } // Reset the data extent to legal values this->DataExtent[4] = 0; this->DataExtent[5] = 0; } // Reset the time information this->TimeDimension = 0; this->TimeSpacing = 1.0; // Clear the meta data, prepare the parser. this->MetaData->Initialize(); if (numFiles > 0) { this->MetaData->SetNumberOfInstances(numFiles); } if (this->Parser) { this->Parser->Delete(); this->FileOffsetArray->Delete(); } // Parser reads just the meta data, not the pixel data. this->Parser = vtkDICOMParser::New(); this->Parser->SetDefaultCharacterSet(this->DefaultCharacterSet); this->Parser->SetOverrideCharacterSet(this->OverrideCharacterSet); this->Parser->SetMetaData(this->MetaData); this->Parser->AddObserver( vtkCommand::ErrorEvent, this, &vtkDICOMReader::RelayError); // First component is offset to pixel data, 2nd component is file size. this->FileOffsetArray = vtkTypeInt64Array::New(); this->FileOffsetArray->SetNumberOfComponents(2); this->FileOffsetArray->SetNumberOfTuples(numFiles); for (int idx = 0; idx < numFiles; idx++) { this->ComputeInternalFileName(this->DataExtent[4] + idx); this->Parser->SetFileName(this->InternalFileName); this->Parser->SetIndex(idx); this->Parser->Update(); if (this->Parser->GetErrorCode()) { break; } // save the offset to the pixel data vtkTypeInt64 offset[2]; offset[0] = this->Parser->GetFileOffset(); offset[1] = this->Parser->GetFileSize(); this->FileOffsetArray->SetTupleValue(idx, offset); } // Files are read in the order provided, but they might have // to be re-sorted to create a proper volume. The FileIndexArray // holds the sorted order of the files. this->StackIDs->Initialize(); if (this->GetErrorCode() == vtkErrorCode::NoError) { if (this->Sorting && this->Sorter) { this->SortFiles(this->FileIndexArray, this->FrameIndexArray); } else { this->NoSortFiles(this->FileIndexArray, this->FrameIndexArray); } // Verify the consistency of the data, e.g. verify that the dimensions // and data type are the same for all files. this->ValidateStructure(this->FileIndexArray, this->FrameIndexArray); } if (this->GetErrorCode() != vtkErrorCode::NoError) { // Last chance to bail out return false; } // Set the indexing arrays for the meta data this->MetaData->SetFileIndexArray(this->FileIndexArray); this->MetaData->SetFrameIndexArray(this->FrameIndexArray); // Get the file and frame for the first slice int fileIndex = this->FileIndexArray->GetComponent(0, 0); int frameIndex = this->FrameIndexArray->GetComponent(0, 0); // image dimensions int columns = this->MetaData->Get(fileIndex, DC::Columns).AsInt(); int rows = this->MetaData->Get(fileIndex, DC::Rows).AsInt(); int slices = static_cast(this->FileIndexArray->GetNumberOfTuples()); int extent[6]; extent[0] = 0; extent[1] = columns - 1; extent[2] = 0; extent[3] = rows - 1; extent[4] = 0; extent[5] = slices - 1; // set the x and y dimensions of the DataExtent this->DataExtent[0] = extent[0]; this->DataExtent[1] = extent[1]; this->DataExtent[2] = extent[2]; this->DataExtent[3] = extent[3]; // DICOM images are usually stored one-slice-per-file, // with the exception of nuclear medicine and ultrasound // (the DataExtent gives the number of files) this->FileDimensionality = 2; if (slices > this->DataExtent[5] - this->DataExtent[4] + 1) { this->FileDimensionality = 3; } // DICOM uses a upper-left origin this->FileLowerLeft = 0; // DataSpacing[2] was set in SortFiles, but pixel spacing is set here. this->DataSpacing[0] = 1.0; this->DataSpacing[1] = 1.0; // Set spacing from PixelAspectRatio double ratio = 1.0; vtkDICOMValue pixelAspectRatio = this->MetaData->Get(fileIndex, frameIndex, DC::PixelAspectRatio); if (pixelAspectRatio.GetNumberOfValues() == 2) { // use double, even though data is stored as integer strings double ya = pixelAspectRatio.GetDouble(0); double xa = pixelAspectRatio.GetDouble(1); if (xa > 0) { ratio = ya/xa; } } else if (pixelAspectRatio.GetNumberOfValues() == 1) { // ratio should be expressed as two values, // so this is only to support incorrect files ratio = pixelAspectRatio.AsDouble(); } if (ratio > 0) { this->DataSpacing[0] = this->DataSpacing[1]/ratio; } // Set spacing from PixelSpacing vtkDICOMValue pixelSpacing = this->MetaData->Get(fileIndex, frameIndex, DC::PixelSpacing); if (pixelSpacing.GetNumberOfValues() == 2) { double pixelSize[2]; pixelSpacing.GetValues(pixelSize, 2); if (pixelSize[0] > 0 && pixelSize[1] > 0) { // PixelSpacing in DICOM is RowSpacing,ColumnSpacing this->DataSpacing[0] = pixelSize[1]; this->DataSpacing[1] = pixelSize[0]; } } // offset is part of the transform, so set origin to zero this->DataOrigin[0] = 0.0; this->DataOrigin[1] = 0.0; this->DataOrigin[2] = 0.0; // get information related to the data type int bitsAllocated = this->MetaData->Get(fileIndex, DC::BitsAllocated).AsInt(); int pixelRepresentation = this->MetaData->Get(fileIndex, DC::PixelRepresentation).AsInt(); int numComponents = this->MetaData->Get(fileIndex, DC::SamplesPerPixel).AsInt(); int planarConfiguration = this->MetaData->Get(fileIndex, DC::PlanarConfiguration).AsInt(); int bitsStored = this->MetaData->Get(fileIndex, DC::BitsStored).AsInt(); if (bitsStored > bitsAllocated || bitsStored <= 0) { bitsStored = bitsAllocated; } // datatype int scalarType = 0; if (bitsAllocated <= 8) { scalarType = (pixelRepresentation ? VTK_SIGNED_CHAR : VTK_UNSIGNED_CHAR); } else if (bitsAllocated <= 16) { scalarType = (pixelRepresentation ? VTK_SHORT : VTK_UNSIGNED_SHORT); } else if (bitsAllocated <= 32) { if (this->MetaData->Get(fileIndex, DC::FloatPixelData).IsValid()) { scalarType = VTK_FLOAT; } else { scalarType = (pixelRepresentation ? VTK_INT : VTK_UNSIGNED_INT); } } else if (bitsAllocated <= 64) { if (this->MetaData->Get(fileIndex, DC::DoubleFloatPixelData).IsValid()) { scalarType = VTK_DOUBLE; } else { scalarType = (pixelRepresentation ? VTK_TYPE_INT64: VTK_TYPE_UINT64); } } this->RescaleSlope = 1.0; this->RescaleIntercept = 0.0; this->NeedsRescale = false; this->FileScalarType = scalarType; const vtkDICOMValue& slopeValue = this->MetaData->Get(fileIndex, frameIndex, DC::RescaleSlope); const vtkDICOMValue& interceptValue = this->MetaData->Get(fileIndex, frameIndex, DC::RescaleIntercept); if (slopeValue.IsValid() && interceptValue.IsValid()) { if (this->AutoRescale) { // set NeedsRescale if any rescaling will be necessary, // and provide the new output type that will be needed scalarType = this->ComputeRescaledScalarType( scalarType, bitsStored, pixelRepresentation); } else { this->RescaleSlope = slopeValue.AsDouble(); this->RescaleIntercept = interceptValue.AsDouble(); if (this->RescaleSlope == 0.0) { this->RescaleSlope = 1.0; } } } // apply requested scalar type if (this->OutputScalarType != -1) { switch (this->OutputScalarType) { case VTK_SIGNED_CHAR: case VTK_UNSIGNED_CHAR: case VTK_SHORT: case VTK_UNSIGNED_SHORT: case VTK_INT: case VTK_UNSIGNED_INT: case VTK_FLOAT: case VTK_DOUBLE: scalarType = this->OutputScalarType; if (scalarType != this->FileScalarType) { this->NeedsRescale = true; } break; default: vtkWarningMacro("Illegal OutputScalarType: " << this->OutputScalarType); break; } } // number of components if (numComponents <= 0) { numComponents = 1; } this->DataScalarType = scalarType; this->NumberOfPackedComponents = (planarConfiguration ? 1 : numComponents); this->NumberOfPlanarComponents = (planarConfiguration ? numComponents : 1); this->NumberOfScalarComponents = (numComponents * this->FileIndexArray->GetNumberOfComponents()); // photometric interpretation // "MONOCHROME1" "MONOCHROME2" // "PALETTE COLOR" "RGB" (convert palette color to RGB) // "HSV" "ARGB" "CMYK" (all three are retired) // "YBR_FULL" "YBR_FULL_422" (use CCIR 601-2 to convert to RGB) // "YBR_PARTIAL_422" "YBR_PARTIAL_420" (use CCIR 601-2 to convert to RGB) // "YBR_ICT" "YBR_RCT" (use ISO 10918-1 to convert to RGB) // See DICOM Ch. 3 Appendix C 7.6.3.1.2 for equations // endianness std::string transferSyntax = this->MetaData->Get(fileIndex, DC::TransferSyntaxUID).AsString(); bool bigEndian = (transferSyntax == "1.2.840.10008.1.2.2" || transferSyntax == "1.2.840.113619.5.2"); #ifdef VTK_WORDS_BIGENDIAN this->SwapBytes = !bigEndian; #else this->SwapBytes = bigEndian; #endif // === Image Orientation in DICOM files === // // The vtkImageData class does not provide a way of storing image // orientation. So when we read a DICOM file, we should also provide // the user with a 4x4 matrix that can transform VTK's data coordinates // into DICOM's patient coordinates, as defined in the DICOM standard // Part 3 Appendix C 7.6.2 "Image Plane Module". vtkIdType numSlices = this->FileIndexArray->GetNumberOfTuples(); std::vector points; double centroid[3] = { 0.0, 0.0, 0.0 }; double orient[6] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 }; double point[3] = { 0.0, 0.0, 0.0 }; double normal[3] = { 0.0, 0.0, 1.0 }; // go through the slices in reverse order, so we end on the first for (vtkIdType iSlice = numSlices-1; iSlice >= 0; --iSlice) { int iFile = this->FileIndexArray->GetComponent(iSlice, 0); int iFrame = this->FrameIndexArray->GetComponent(iSlice, 0); vtkDICOMValue pv = this->MetaData->Get(iFile, iFrame, DC::ImagePositionPatient); vtkDICOMValue ov = this->MetaData->Get(fileIndex, frameIndex, DC::ImageOrientationPatient); if (pv.GetNumberOfValues() == 3 && ov.GetNumberOfValues() == 6) { pv.GetValues(point, 3); ov.GetValues(orient, 6); vtkMath::Cross(&orient[0], &orient[3], normal); if (vtkMath::Normalize(normal) < 1e-10) { orient[0] = 1.0; orient[1] = 0.0; orient[2] = 0.0; orient[3] = 0.0; orient[4] = 1.0; orient[5] = 0.0; normal[0] = 0.0; normal[1] = 0.0; normal[2] = 1.0; } // re-orthogonalize x vector (improve precision) vtkMath::Cross(&orient[3], normal, &orient[0]); vtkMath::Normalize(&orient[0]); vtkMath::Normalize(&orient[3]); if (this->MemoryRowOrder == vtkDICOMReader::BottomUp) { // calculate position of point at lower left double yspacing = this->DataSpacing[1]; point[0] = point[0] + orient[3]*yspacing*(rows - 1); point[1] = point[1] + orient[4]*yspacing*(rows - 1); point[2] = point[2] + orient[5]*yspacing*(rows - 1); // switch from "top down" to "bottom up" orient[3] = -orient[3]; orient[4] = -orient[4]; orient[5] = -orient[5]; // fix normal (cross product of orientation vectors) normal[0] = -normal[0]; normal[1] = -normal[1]; normal[2] = -normal[2]; } size_t ip = points.size(); points.resize(ip + 3); for (int ii = 0; ii < 3; ii++) { centroid[ii] += point[ii]; points[ip+ii] = point[ii]; } } } // compute Z vector by fitting points to a line double vector[3] = { normal[0], normal[1], normal[2] }; size_t nPoints = points.size()/3; if (nPoints > 0) { centroid[0] /= nPoints; centroid[1] /= nPoints; centroid[2] /= nPoints; // use Jacobi to compute line of best fit double storage[18] = {}; double *A[3] = { &storage[0], &storage[3], &storage[6] }; double *E[3] = { &storage[9], &storage[12], &storage[15] }; for (size_t iPoint = 0; iPoint < nPoints; iPoint++) { for (int ii = 0; ii < 3; ii++) { for (int jj = 0; jj < 3; jj++) { A[ii][jj] = ((points[3*iPoint + ii] - centroid[ii]) * (points[3*iPoint + jj] - centroid[jj])); } } } double eigenvalues[3]; vtkMath::Jacobi(A, eigenvalues, E); // only use eigenvector if the points fit a line very precisely if (eigenvalues[1]*eigenvalues[1] + eigenvalues[2]*eigenvalues[2] < 1e-6*eigenvalues[0]*eigenvalues[0]) { // create the vector, dot(vector,normal) should be unity double vdn = E[0][0]*normal[0] + E[1][0]*normal[1] + E[2][0]*normal[2]; if (vdn > 0) { vector[0] = E[0][0]/vdn; vector[1] = E[1][0]/vdn; vector[2] = E[2][0]/vdn; // check difference between this vector and the normal double vcn[3]; vtkMath::Cross(vector, normal, vcn); if (vtkMath::Norm(vcn) < 1e-4) { // use normal (more precise) if they are the same vector[0] = normal[0]; vector[1] = normal[1]; vector[2] = normal[2]; } } } // build the patient matrix double pm[16]; pm[0] = orient[0]; pm[1] = orient[3]; pm[2] = vector[0]; pm[3] = point[0]; pm[4] = orient[1]; pm[5] = orient[4]; pm[6] = vector[1]; pm[7] = point[1]; pm[8] = orient[2]; pm[9] = orient[5]; pm[10] = vector[2]; pm[11] = point[2]; pm[12] = 0.0; pm[13] = 0.0; pm[14] = 0.0; pm[15] = 1.0; this->PatientMatrix->DeepCopy(pm); } else { this->PatientMatrix->Identity(); } // Set the medical image properties if (this->MedicalImageProperties) { this->UpdateMedicalImageProperties(); } // Set the output information. vtkInformation* outInfo = outputVector->GetInformationObject(0); outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6); outInfo->Set(vtkDataObject::SPACING(), this->DataSpacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), this->DataOrigin, 3); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, this->DataScalarType, this->NumberOfScalarComponents); outInfo->Set(vtkDICOMAlgorithm::META_DATA(), this->MetaData); outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), *this->PatientMatrix->Element, 16); // Check for OverlayData (60xx,3000) this->OverlayBitfield = 0; for (unsigned short i = 0; i < 16; i++) { unsigned short g = 0x6000 + 2*i; if (this->MetaData->Has(vtkDICOMTag(g, 0x3000))) { this->OverlayBitfield |= (1 << i); } } // Set the information for the overlay vtkInformation* oInfo = outputVector->GetInformationObject(1); oInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6); oInfo->Set(vtkDataObject::SPACING(), this->DataSpacing, 3); oInfo->Set(vtkDataObject::ORIGIN(), this->DataOrigin, 3); int overlayType = (this->OverlayBitfield <= 255 ? VTK_UNSIGNED_CHAR : VTK_UNSIGNED_SHORT); int overlayComponents = this->FileIndexArray->GetNumberOfComponents(); vtkDataObject::SetPointDataActiveScalarInfo( oInfo, overlayType, overlayComponents); oInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), *this->PatientMatrix->Element, 16); return 1; } namespace { //---------------------------------------------------------------------------- // templated bit masking functions template void vtkDICOMMaskBits(T *ptr, size_t n, int bits, int pixelRepr) { if (n > 0) { T bitmask = (1 << bits) - 1; if (pixelRepr == 0) { // unsigned: simply apply mask do { *ptr &= bitmask; ptr++; } while (--n); } else { // signed: apply mask and sign extend T highbit = (1 << (bits - 1)); do { *ptr = ((*ptr & bitmask) ^ highbit) - highbit; ptr++; } while (--n); } } } //---------------------------------------------------------------------------- // templated conversion functions, for converting to and from floating point template void vtkDICOMConvertBuffer(const T1 *ip, T2 *op, int im, int om, size_t n) { if (n > 0) { T1 minval = vtkTypeTraits::Min(); T1 maxval = vtkTypeTraits::Max(); do { T1 v = *ip; v = (v > minval ? v : minval); v = (v < maxval ? v : maxval); *op = static_cast(v); ip += im; op += om; } while (--n); } } template void vtkDICOMConvertBuffer(const T *ip, float *op, int im, int om, size_t n) { if (n > 0) { do { *op = *ip; ip += im; op += om; } while (--n); } } template void vtkDICOMConvertBuffer(const T *ip, double *op, int im, int om, size_t n) { if (n > 0) { do { *op = *ip; ip += im; op += om; } while (--n); } } } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMReader::RescaleBuffer( int fileIdx, int frameIdx, int fileType, int outputType, int fileNumComponents, int numComponents, void *fileBuffer, void *outputBuffer, vtkIdType bufferSize) { vtkDICOMMetaData *meta = this->MetaData; double m = meta->Get(fileIdx, frameIdx, DC::RescaleSlope).AsDouble(); double b = meta->Get(fileIdx, frameIdx, DC::RescaleIntercept).AsDouble(); if (m == 0.0) { m = 1.0; } int inSize = vtkDataArray::GetDataTypeSize(fileType); int outSize = vtkDataArray::GetDataTypeSize(outputType); size_t numPixels = bufferSize/(inSize*fileNumComponents); for (int c = 0; c < fileNumComponents; c++) { void *filePtr = static_cast(fileBuffer) + inSize*c; void *outputPtr = static_cast(outputBuffer) + outSize*c; size_t n = numPixels; while (n > 0) { double temp[64]; size_t nn = (n < 64 ? n : 64); n -= nn; switch (fileType) { vtkTemplateAliasMacro( vtkDICOMConvertBuffer( static_cast(filePtr), temp, fileNumComponents, 1, nn)); } if (this->AutoRescale) { for (size_t ii = 0; ii < nn; ii++) { temp[ii] = temp[ii]*m + b; } } switch (outputType) { vtkTemplateAliasMacro( vtkDICOMConvertBuffer( temp, static_cast(outputPtr), 1, numComponents, nn)); } filePtr = static_cast(filePtr) + inSize*fileNumComponents*nn; outputPtr = static_cast(outputPtr) + outSize*numComponents*nn; } } } //---------------------------------------------------------------------------- void vtkDICOMReader::YBRToRGB( int fileIdx, int, void *buffer, vtkIdType bufferSize) { // digital luminance levels and color levels from Rec. 601 const int ylevels = 220; const int clevels = 225; // the digital black level from Rec. 601 double ymin = 16.0; // the color constants from Rec. 601 const double Kb = 0.114; const double Kr = 0.299; double Kg = 1.0 - Kb - Kr; // compute the matrix for YPbPr to RGB conversion double matrix[3][3] = { { 1.0, 0.0, 2.0*(1.0-Kr) }, { 1.0, -2.0*Kb*(1.0-Kb)/Kg, -2.0*Kr*(1.0-Kr)/Kg }, { 1.0, 2.0*(1.0-Kb), 0.0 } }; // get information from the meta data vtkDICOMMetaData *meta = this->MetaData; const vtkDICOMValue& photometric = meta->Get(fileIdx, DC::PhotometricInterpretation); const vtkDICOMValue& transferSyntax = meta->Get(fileIdx, DC::TransferSyntaxUID); // catch JPEG baseline images with incorrect PhotometricInterpretation if (transferSyntax.Matches("1.2.840.10008.1.2.4.50") || photometric.Matches("YBR_FULL*")) { // use full-range, therefore black level is zero ymin = 0.0; } else if (photometric.Matches("YBR_PARTIAL*")) { // stretch the matrix so that full-range RGB is produced for (int i = 0; i < 3; i++) { matrix[i][0] *= 255.0/(ylevels - 1); matrix[i][1] *= 255.0/(clevels - 1); matrix[i][2] *= 255.0/(clevels - 1); } } else { // no YBR here, so exit! return; } if (bufferSize >= 3) { unsigned char *cp = static_cast(buffer); vtkIdType n = bufferSize/3; double ybr[3]; double rgb[3]; do { ybr[0] = cp[0] - ymin; ybr[1] = cp[1] - 128.0; ybr[2] = cp[2] - 128.0; vtkMath::Multiply3x3(matrix, ybr, rgb); rgb[0] = (rgb[0] >= 0.0 ? rgb[0] : 0.0); rgb[0] = (rgb[0] <= 255.0 ? rgb[0] : 255.0); rgb[1] = (rgb[1] >= 0.0 ? rgb[1] : 0.0); rgb[1] = (rgb[1] <= 255.0 ? rgb[1] : 255.0); rgb[2] = (rgb[2] >= 0.0 ? rgb[2] : 0.0); rgb[2] = (rgb[2] <= 255.0 ? rgb[2] : 255.0); cp[0] = static_cast(vtkMath::Floor(rgb[0] + 0.5)); cp[1] = static_cast(vtkMath::Floor(rgb[1] + 0.5)); cp[2] = static_cast(vtkMath::Floor(rgb[2] + 0.5)); cp += 3; } while (--n); } } //---------------------------------------------------------------------------- void vtkDICOMReader::UnpackYBR422( const void *filePtr, void *buffer, vtkIdType bufferSize, vtkIdType rowlen) { const unsigned char *readPtr = static_cast(filePtr); unsigned char *writePtr = static_cast(buffer); vtkIdType n = bufferSize/3; for (vtkIdType j = n; j > 0; j -= rowlen) { rowlen = std::min(rowlen, j); for (int i = rowlen; i > 0; i -= 2) { // read one macropixel unsigned char y1 = readPtr[0]; unsigned char y2 = readPtr[1]; unsigned char b = readPtr[2]; unsigned char r = readPtr[3]; readPtr += 4; // write an even pixel writePtr[0] = y1; writePtr[1] = b; writePtr[2] = r; writePtr += 3; // break early if rowlen is odd if (i < 2) { break; } // filter color for odd pixels if (i > 2) { b = (b + readPtr[2])/2; r = (r + readPtr[3])/2; } // write an odd pixel writePtr[0] = y2; writePtr[1] = b; writePtr[2] = r; writePtr += 3; } } } //---------------------------------------------------------------------------- void vtkDICOMReader::MaskBits( void *buffer, vtkIdType bufferSize, int scalarSize, int bitsStored, int pixelRepresentation) { size_t n = bufferSize/scalarSize; if (scalarSize == 1) { vtkDICOMMaskBits(static_cast(buffer), n, bitsStored, pixelRepresentation); } else if (scalarSize == 2) { vtkDICOMMaskBits(static_cast(buffer), n, bitsStored, pixelRepresentation); } else if (scalarSize == 4) { vtkDICOMMaskBits(static_cast(buffer), n, bitsStored, pixelRepresentation); } } //---------------------------------------------------------------------------- void vtkDICOMReader::UnpackBits( const void *filePtr, void *buffer, vtkIdType bufferSize, int bits) { if (bits == 12) { const unsigned char *readPtr = static_cast(filePtr); unsigned char *writePtr = static_cast(buffer); for (vtkIdType n = bufferSize/2; n > 0; n -= 2) { unsigned int a1 = readPtr[0]; unsigned int a2 = readPtr[1]; unsigned int b1 = (a1 << 4) | (a2 & 0x0f); writePtr[0] = static_cast(b1); writePtr[1] = static_cast(b1 >> 8); if (n == 1) { break; } unsigned int a3 = readPtr[2]; unsigned int b2 = ((a3 & 0x0f) << 8) | (a2 & 0xf0) | (a3 >> 4); writePtr[2] = static_cast(b2); writePtr[3] = static_cast(b2 >> 8); readPtr += 3; writePtr += 4; } } else if (bits == 1) { const unsigned char *readPtr = static_cast(filePtr); unsigned char *writePtr = static_cast(buffer); for (vtkIdType n = bufferSize/8; n > 0; n--) { unsigned int a = *readPtr; for (int i = 0; i < 8; i++) { writePtr[i] = (a & 1); a >>= 1; } readPtr++; writePtr += 8; } size_t r = (bufferSize % 8); if (r > 0) { unsigned int a = *readPtr; for (size_t j = 0; j < r; j++) { writePtr[j] = static_cast(a & 1); a >>= 1; } } } } //---------------------------------------------------------------------------- void vtkDICOMReader::UnpackOverlay( const void *filePtr, vtkIdType bitskip, vtkIdType count, void *buffer, vtkIdType incr, int bit) { const unsigned char *readPtr = static_cast(filePtr); unsigned char *writePtr = static_cast(buffer); readPtr += bitskip/8; int r = (bitskip % 8); if (r > 0) { unsigned char a = *readPtr; a >>= r; for (int i = r; i < 8; i++) { *writePtr |= (a & 1) << bit; a >>= 1; writePtr += incr; } count -= (8 - r); readPtr++; } for (vtkIdType n = count/8; n > 0; n--) { unsigned char a = *readPtr; for (int i = 0; i < 8; i++) { *writePtr |= (a & 1) << bit; a >>= 1; writePtr += incr; } readPtr++; } count = (count % 8); if (count > 0) { unsigned char a = *readPtr; for (int i = 0; i < count; i++) { *writePtr |= (a & 1) << bit; a >>= 1; writePtr += incr; } } } //---------------------------------------------------------------------------- bool vtkDICOMReader::ReadFileNative( const char *filename, int fileIdx, unsigned char *buffer, vtkIdType bufferSize) { // get the offset to the PixelData in the file vtkTypeInt64 offsetAndSize[2]; this->FileOffsetArray->GetTupleValue(fileIdx, offsetAndSize); vtkTypeInt64 offset = offsetAndSize[0]; vtkDebugMacro("Opening DICOM file " << filename); vtkDICOMFile infile(filename, vtkDICOMFile::In); if (infile.GetError()) { this->SetErrorCode(vtkErrorCode::CannotOpenFileError); vtkErrorMacro("ReadFile: Can't read the file " << filename); return false; } if (!infile.SetPosition(offset)) { this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError); vtkErrorMacro("DICOM file is truncated, some data is missing."); infile.Close(); return false; } std::string transferSyntax = this->MetaData->Get(fileIdx, DC::TransferSyntaxUID).AsString(); // this will set endiancheck.s to 1 on big endian architectures union { char c[2]; short s; } endianCheck = { { 0, 1 } }; bool memoryBigEndian = (endianCheck.s == 1); bool fileBigEndian = (transferSyntax == "1.2.840.10008.1.2.2" || transferSyntax == "1.2.840.113619.5.2"); int bitsAllocated = this->MetaData->Get(fileIdx, DC::BitsAllocated).AsInt(); size_t readSize = bufferSize; size_t resultSize = 0; if (transferSyntax == "1.2.840.10008.1.2.5") { vtkDICOMImageCodec codec(transferSyntax); unsigned int numFrames = this->MetaData->Get(fileIdx, DC::NumberOfFrames).AsUnsignedInt(); numFrames = (numFrames == 0 ? 1 : numFrames); // assume the remainder of the file is all pixel data readSize = static_cast( offsetAndSize[1] - offsetAndSize[0]); if (readSize < 8) { readSize = 8; } unsigned char *rleBuffer = new unsigned char[readSize]; unsigned char *filePtr = rleBuffer; resultSize = infile.Read(filePtr, readSize); size_t bytesRemaining = resultSize; vtkIdType bufferPos = 0; vtkIdType frameSize = bufferSize/numFrames; bool isOffsetTable = true; while (bytesRemaining >= 8 && bufferPos < bufferSize) { // get the item header unsigned int tagkey = vtkDICOMUtilities::UnpackUnsignedInt(filePtr); unsigned int length = vtkDICOMUtilities::UnpackUnsignedInt(filePtr + 4); filePtr += 8; bytesRemaining -= 8; // make sure the tag is valid if (tagkey != 0xE000FFFE) { break; } if (length > bytesRemaining) { // actual file size should have been at least this much larger readSize += length - bytesRemaining; length = static_cast(bytesRemaining); } // first item is the offset table if (!isOffsetTable) { // unpack an RLE fragment codec.Decode(this->MetaData, filePtr, length, buffer + bufferPos, frameSize); bufferPos += frameSize; } filePtr += length; bytesRemaining -= length; isOffsetTable = false; } delete [] rleBuffer; } else if (bitsAllocated == 12) { // unpack 12 bits little endian into 16 bits little endian, // the result will have to be swapped if machine is BE (the // swapping is done at the end of this function) readSize = bufferSize/2 + (bufferSize+3)/4; unsigned char *filePtr = buffer + (bufferSize - readSize); resultSize = infile.Read(filePtr, readSize); vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated); } else if (bitsAllocated == 1) { // unpack 1 bit into 8 bits, source assumed to be either OB // or little endian OW, never big endian OW readSize = (bufferSize + 7)/8; unsigned char *filePtr = buffer + (bufferSize - readSize); resultSize = infile.Read(filePtr, readSize); vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated); } else if (this->MetaData->GetAttributeValue(fileIdx, DC::PhotometricInterpretation).Matches("YBR_*_422")) { // the data uses 422 color compression vtkIdType rowlen = this->MetaData->Get(fileIdx, DC::Columns).AsInt(); vtkIdType nrows = bufferSize/(rowlen*3); readSize = (rowlen + 1)/2*nrows*4; // make rowlen even for reading unsigned char *filePtr = buffer + (bufferSize - readSize); resultSize = infile.Read(filePtr, readSize); vtkDICOMReader::UnpackYBR422(filePtr, buffer, bufferSize, rowlen); } else { resultSize = infile.Read(buffer, readSize); } bool success = true; if (infile.EndOfFile() || resultSize != readSize) { this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError); vtkErrorMacro("DICOM file is truncated, " << (readSize - resultSize) << " bytes are missing."); success = false; } else if (infile.GetError()) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("Error in DICOM file, cannot read."); success = false; } else if (fileBigEndian != memoryBigEndian) { int scalarSize = vtkDataArray::GetDataTypeSize(this->DataScalarType); vtkByteSwap::SwapVoidRange(buffer, bufferSize/scalarSize, scalarSize); } infile.Close(); return success; } //---------------------------------------------------------------------------- bool vtkDICOMReader::ReadFileDelegated( const char *filename, int fileIdx, unsigned char *buffer, vtkIdType bufferSize) { #if defined(DICOM_USE_DCMTK) // For JPEG, DCMTK will do the YBR to RGB this->NeedsYBRToRGB = false; #ifdef _WIN32 // Convert utf8 filename to local character set for dcmtk vtkDICOMFilePath filePath(filename); filename = filePath.Local(); #endif DcmFileFormat *fileformat = new DcmFileFormat(); fileformat->loadFile(filename); OFCondition status = fileformat->getDataset()->chooseRepresentation( EXS_LittleEndianExplicit, NULL); if (!status.good()) { vtkErrorMacro("DCMTK error: " << status.text()); this->SetErrorCode(vtkErrorCode::FileFormatError); delete fileformat; return false; } unsigned long count; const Uint8 *pixelData; status = fileformat->getDataset()->findAndGetUint8Array( DCM_PixelData, pixelData, &count, OFTrue); vtkIdType imageSize = static_cast(count); int bitsAllocated = this->MetaData->Get(fileIdx, DC::BitsAllocated).AsInt(); if (bitsAllocated == 12 && imageSize >= bufferSize/2 + (bufferSize+3)/4) { vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated); } else if (bitsAllocated == 1 && imageSize >= (bufferSize + 7)/8) { vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated); } else if (imageSize >= bufferSize) { memcpy(buffer, pixelData, bufferSize); } else { vtkErrorMacro(<< filename << ": The uncompressed image size is " << imageSize << " bytes, expected " << bufferSize << " bytes."); delete fileformat; return false; } delete fileformat; return true; #elif defined(DICOM_USE_GDCM) (void)fileIdx; #ifdef _WIN32 // Convert utf8 filename to local character set for gdcm vtkDICOMFilePath filePath(filename); filename = filePath.Local(); #endif gdcm::ImageReader reader; reader.SetFileName(filename); if(!reader.Read()) { vtkErrorMacro("The GDCM ImageReader could not read the image."); this->SetErrorCode(vtkErrorCode::FileFormatError); return false; } gdcm::Image &image = reader.GetImage(); if (static_cast(image.GetBufferLength()) < bufferSize) { vtkErrorMacro(<< filename << ": The uncompressed image size is " << image.GetBufferLength() << " bytes, expected " << bufferSize << " bytes."); this->SetErrorCode(vtkErrorCode::FileFormatError); return false; } image.GetBuffer(reinterpret_cast(buffer)); return true; #else /* no DCMTK or GDCM, so no file decompression */ (void)filename; (void)fileIdx; (void)buffer; (void)bufferSize; this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("DICOM file is compressed, cannot read."); return false; #endif } //---------------------------------------------------------------------------- bool vtkDICOMReader::ReadOneFile( const char *filename, int fileIdx, unsigned char *buffer, vtkIdType bufferSize) { std::string transferSyntax = this->MetaData->Get(fileIdx, DC::TransferSyntaxUID).AsString(); if (transferSyntax == "1.2.840.10008.1.2" || // Implicit LE transferSyntax == "1.2.840.10008.1.20" || // Papyrus Implicit LE transferSyntax == "1.2.840.10008.1.2.1" || // Explicit LE transferSyntax == "1.2.840.10008.1.2.2" || // Explicit BE transferSyntax == "1.2.840.10008.1.2.5" || // RLE compressed transferSyntax == "1.2.840.113619.5.2" || // GE LE with BE data transferSyntax == "") { return this->ReadFileNative(filename, fileIdx, buffer, bufferSize); } return this->ReadFileDelegated(filename, fileIdx, buffer, bufferSize); } //---------------------------------------------------------------------------- void vtkDICOMReader::Update() { // if user didn't specify a port, also update the overlay if present this->UpdateOverlayFlag = true; this->Superclass::Update(); this->UpdateOverlayFlag = false; } //---------------------------------------------------------------------------- vtkTypeBool vtkDICOMReader::ProcessRequest( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { if (request->Has(vtkDemandDrivenPipeline::REQUEST_DATA_NOT_GENERATED())) { // which output port did the request come from int outputPort = request->Get(vtkDemandDrivenPipeline::FROM_OUTPUT_PORT()); int n = outputVector->GetNumberOfInformationObjects(); // set DATA_NOT_GENERATED on other ports, otherwise executive will // initialize them before RequestData is called for (int i = 0; i < n; i++) { if (i != outputPort && !(this->UpdateOverlayFlag && this->OverlayBitfield && outputPort == 1)) { vtkInformation *outputInfo = outputVector->GetInformationObject(i); outputInfo->Set(vtkDemandDrivenPipeline::DATA_NOT_GENERATED(), 1); } } } return this->Superclass::ProcessRequest(request, inputVector, outputVector); } //---------------------------------------------------------------------------- int vtkDICOMReader::RequestData( vtkInformation* request, vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) { // check whether the reader is in an error state if (this->GetErrorCode() != vtkErrorCode::NoError) { return false; } // which output port did the request come from int outputPort = request->Get(vtkDemandDrivenPipeline::FROM_OUTPUT_PORT()); // check for the overlay output if (outputPort == 1 || (this->UpdateOverlayFlag && this->OverlayBitfield)) { vtkInformation* outInfo = outputVector->GetInformationObject(1); int uExtent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uExtent); // get the overlay data object, allocate memory vtkImageData *data = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); #if VTK_MAJOR_VERSION >= 6 this->AllocateOutputData(data, outInfo, uExtent); #else data->SetExtent(uExtent); data->AllocateScalars(); #endif this->ReadOverlays(data); } // if output port 0 was not requested, then return if (outputPort > 0) { return true; } // do the main output vtkInformation* outInfo = outputVector->GetInformationObject(0); int extent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); if (this->FileDimensionality == 2) { // limit the number of slices to the requested update extent int uExtent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uExtent); extent[4] = uExtent[4]; extent[5] = uExtent[5]; } // make a list of all the files inside the update extent std::vector files; int nComp = this->FileIndexArray->GetNumberOfComponents(); for (int sIdx = extent[4]; sIdx <= extent[5]; sIdx++) { for (int cIdx = 0; cIdx < nComp; cIdx++) { int fileIdx = this->FileIndexArray->GetComponent(sIdx, cIdx); int frameIdx = this->FrameIndexArray->GetComponent(sIdx, cIdx); std::vector::iterator iter = files.begin(); while (iter != files.end() && iter->FileIndex != fileIdx) { ++iter; } if (iter == files.end()) { int n = this->MetaData->Get(fileIdx, DC::NumberOfFrames).AsInt(); n = (n > 0 ? n : 1); files.push_back(vtkDICOMReaderFileInfo(fileIdx, n)); iter = files.end(); --iter; } iter->Frames.push_back(vtkDICOMReaderFrameInfo(frameIdx, sIdx, cIdx)); } } // get the data object, allocate memory vtkImageData *data = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); #if VTK_MAJOR_VERSION >= 6 this->AllocateOutputData(data, outInfo, extent); #else data->SetExtent(extent); data->AllocateScalars(); #endif // label the scalars as "PixelData" data->GetPointData()->GetScalars()->SetName("PixelData"); // add the meta data to the data set vtkInformation *dataInfo = data->GetInformation(); dataInfo->Set(vtkDICOMAlgorithm::META_DATA(), this->MetaData); dataInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), *this->PatientMatrix->Element, 16); unsigned char *dataPtr = static_cast(data->GetScalarPointer()); int scalarType = data->GetScalarType(); int scalarSize = data->GetScalarSize(); int numComponents = data->GetNumberOfScalarComponents(); int numFileComponents = this->NumberOfPackedComponents; int numPlanes = this->NumberOfPlanarComponents; vtkIdType pixelSize = numComponents*scalarSize; vtkIdType rowSize = pixelSize*(extent[1] - extent[0] + 1); vtkIdType sliceSize = rowSize*(extent[3] - extent[2] + 1); int fileScalarSize = vtkDataArray::GetDataTypeSize(this->FileScalarType); vtkIdType filePixelSize = numFileComponents*fileScalarSize; vtkIdType fileRowSize = filePixelSize*(extent[1] - extent[0] + 1); vtkIdType filePlaneSize = fileRowSize*(extent[3] - extent[2] + 1); vtkIdType fileFrameSize = filePlaneSize*numPlanes; this->InvokeEvent(vtkCommand::StartEvent); bool flipImage = (this->MemoryRowOrder == vtkDICOMReader::BottomUp); bool planarToPacked = (numFileComponents != numComponents); unsigned char *rowBuffer = 0; if (flipImage) { rowBuffer = new unsigned char[fileRowSize]; } unsigned char *fileBuffer = 0; int framesInPreviousFile = -1; // loop through all files in the update extent for (size_t idx = 0; idx < files.size(); idx++) { if (this->AbortExecute) { break; } // get the index for this file int fileIdx = files[idx].FileIndex; this->ComputeInternalFileName(fileIdx); this->SetProgressText(this->InternalFileName); this->UpdateProgress(static_cast(idx)/ static_cast(files.size())); // get the number of frames contained in this file int framesInFile = files[idx].FramesInFile; std::vector& frames = files[idx].Frames; int numFrames = static_cast(frames.size()); // we need a file buffer if input frames don't match output slices, // or if input data type doesn't match output data type bool needBuffer = (planarToPacked || numFrames != framesInFile || scalarSize != fileScalarSize); for (int sIdx = 0; sIdx < numFrames && !needBuffer; sIdx++) { needBuffer = (sIdx != frames[sIdx].FrameIndex); } // this will point to the memory the file will be read into unsigned char *bufferPtr = 0; if (needBuffer) { // allocate a buffer for format or datatype conversion if (numFrames != framesInPreviousFile) { delete [] fileBuffer; fileBuffer = new unsigned char[fileFrameSize*framesInFile]; framesInPreviousFile = numFrames; } bufferPtr = fileBuffer; } else { // read directly into the output int sliceIdx = frames[0].SliceIndex; int componentIdx = frames[0].ComponentIndex; bufferPtr = (dataPtr + (sliceIdx - extent[4])*sliceSize + componentIdx*filePixelSize*numPlanes); } // ReadOneFile will set NeedsYBRToRGB to false if it does YBR->RGB itself // (note: NeedsYBRToRGB will is ignored unless PhotometricInterpretation // is YBR_FULL* or YBR_PARTIAL*) this->NeedsYBRToRGB = (this->AutoYBRToRGB && numComponents == 3 && scalarSize == 1); // this is the method that actually reads the file this->ReadOneFile(this->InternalFileName, fileIdx, bufferPtr, framesInFile*fileFrameSize); // clear or sign-extend any unused bits int bitsStored = this->MetaData->Get(fileIdx, DC::BitsStored).AsInt(); if (bitsStored > 0 && bitsStored < fileScalarSize*8) { int pixelRepresentation = this->MetaData->Get(fileIdx, DC::PixelRepresentation).AsInt(); vtkDICOMReader::MaskBits(bufferPtr, framesInFile*fileFrameSize, fileScalarSize, bitsStored, pixelRepresentation); } // iterate through all frames contained in the file for (int sIdx = 0; sIdx < numFrames; sIdx++) { int frameIdx = frames[sIdx].FrameIndex; int sliceIdx = frames[sIdx].SliceIndex; int componentIdx = frames[sIdx].ComponentIndex; // go to the correct position in the input unsigned char *framePtr = bufferPtr + frameIdx*fileFrameSize; // go to the correct position in the output unsigned char *slicePtr = (dataPtr + (sliceIdx - extent[4])*sliceSize + componentIdx*scalarSize*numFileComponents*numPlanes); // iterate through all color planes in the slice unsigned char *planePtr = framePtr; for (int pIdx = 0; pIdx < numPlanes; pIdx++) { // flip the data if necessary if (flipImage) { int numRows = extent[3] - extent[2] + 1; int halfRows = numRows/2; for (int yIdx = 0; yIdx < halfRows; yIdx++) { unsigned char *row1 = planePtr + yIdx*fileRowSize; unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize; memcpy(rowBuffer, row1, fileRowSize); memcpy(row1, row2, fileRowSize); memcpy(row2, rowBuffer, fileRowSize); } } // convert planes into vector components if (this->NeedsRescale) { this->RescaleBuffer( fileIdx, frameIdx, this->FileScalarType, scalarType, numFileComponents, numComponents, planePtr, slicePtr, filePlaneSize); } else if (planarToPacked) { const unsigned char *tmpInPtr = planePtr; unsigned char *tmpOutPtr = slicePtr; int m = sliceSize/pixelSize; for (int i = 0; i < m; i++) { vtkIdType n = filePixelSize; do { *tmpOutPtr++ = *tmpInPtr++; } while (--n); tmpOutPtr += pixelSize - filePixelSize; } slicePtr += filePixelSize; } else if (slicePtr != planePtr) { memcpy(slicePtr, planePtr, filePlaneSize); } planePtr += filePlaneSize; } // convert to RGB if data was read from file as YUV if (this->NeedsYBRToRGB) { this->YBRToRGB(fileIdx, frameIdx, slicePtr, sliceSize); } } } delete [] rowBuffer; delete [] fileBuffer; this->UpdateProgress(1.0); this->SetProgressText(0); this->InvokeEvent(vtkCommand::EndEvent); return 1; } //---------------------------------------------------------------------------- bool vtkDICOMReader::ReadOverlays(vtkImageData *data) { bool success = true; int extent[6]; data->GetExtent(extent); int nComp = this->FileIndexArray->GetNumberOfComponents(); unsigned char *ptr = static_cast(data->GetScalarPointer()); int scalarSize = data->GetScalarSize(); memset(ptr, 0, scalarSize*data->GetNumberOfPoints()); for (int sIdx = extent[4]; sIdx <= extent[5]; sIdx++) { for (int cIdx = 0; cIdx < nComp; cIdx++) { int fileIdx = this->FileIndexArray->GetComponent(sIdx, cIdx); int frameIdx = this->FrameIndexArray->GetComponent(sIdx, cIdx); int rows = this->MetaData->Get(fileIdx, DC::Rows).AsInt(); // loop through all possible overlays int maxOverlay = (scalarSize > 1 ? 15 : 7); for (int i = 0; i <= maxOverlay; i++) { // compute group number for this overlay unsigned short g = 0x6000 + 2*i; const vtkDICOMValue& overlayData = this->MetaData->Get(fileIdx, vtkDICOMTag(g, 0x3000)); unsigned int vl = overlayData.GetVL(); const unsigned char *bptr = overlayData.GetUnsignedCharData(); if (bptr == 0) { bptr = reinterpret_cast( overlayData.GetUnsignedShortData()); } if (bptr == 0) { continue; } int sizeX = this->MetaData->Get(fileIdx, vtkDICOMTag(g,0x0011)).AsInt(); int sizeY = this->MetaData->Get(fileIdx, vtkDICOMTag(g,0x0010)).AsInt(); int startX = 0; int startY = 0; const vtkDICOMValue& ov = this->MetaData->Get(fileIdx, vtkDICOMTag(g,0x0050)); if (ov.GetNumberOfValues() >= 2) { startX = ov.GetInt(1) - 1; startY = ov.GetInt(0) - 1; } int numFrames = this->MetaData->Get(fileIdx, vtkDICOMTag(g,0x0015)).AsInt(); int frameOrigin = this->MetaData->Get(fileIdx, vtkDICOMTag(g,0x0051)).AsInt(); frameOrigin = (frameOrigin > 0 ? frameOrigin-1 : 0); // make sure this frame exists in the overlay if (numFrames && (frameIdx < frameOrigin || frameIdx > frameOrigin+numFrames-1)) { continue; } size_t bitsNeeded = (numFrames == 0 ? 1 : numFrames); bitsNeeded = bitsNeeded*sizeX*sizeY; if ((bitsNeeded + 7)/8 > vl) { this->SetErrorCode(vtkErrorCode::FileFormatError); vtkErrorMacro("OverlayData length " << vl << " too small for size " << sizeX << "x" << sizeY << " (frames=" << numFrames << ")"); success = false; continue; } // compute the number of frames to skip when reading the file vtkIdType inSkip = static_cast(frameIdx - frameOrigin)*sizeX*sizeY; // compute the initial offset into the output vtkIdType outSkip = static_cast(sIdx - extent[4])* (extent[3] - extent[2] + 1)*(extent[1] - extent[0] + 1)* nComp*scalarSize; outSkip += cIdx*scalarSize; #ifdef VTK_WORDS_BIGENDIAN outSkip += (scalarSize == 2 && i <= 7); #else outSkip += (scalarSize == 2 && i > 7); #endif vtkIdType outRowInc = static_cast(extent[1] - extent[0] + 1)*scalarSize*nComp; int extentY[2] = { extent[2], extent[3] }; if (this->MemoryRowOrder == vtkDICOMReader::BottomUp) { outSkip += outRowInc*(extent[3]-extent[2]); outRowInc = -outRowInc; extentY[0] = rows - extent[3] - 1; extentY[1] = rows - extent[2] - 1; } // find the number of rows to read from the file int countY = sizeY; if (extentY[0] < startY) { outSkip += (startY - extentY[0])*outRowInc; } else { inSkip += static_cast(extentY[0] - startY)*sizeX; countY -= extentY[0] - startY; } if (startY + countY - 1 > extentY[1]) { countY = extentY[1] - startY + 1; } // find the number of pixels per row to read from the file int countX = sizeX; if (extent[0] < startX) { outSkip += static_cast(startX - extent[0])*scalarSize*nComp; } else { inSkip += extent[0] - startX; countX -= extent[0] - startX; } if (startX + countX - 1 > extent[1]) { countX = extent[1] - startX + 1; } // make sure there is something to do if (countX <= 0 || countY <= 0) { continue; } for (int j = 0; j < countY; j++) { vtkDICOMReader::UnpackOverlay( bptr, inSkip, countX, ptr + outSkip, nComp*scalarSize, (i & 0x7)); inSkip += sizeX; outSkip += outRowInc; } } } } return success; } //---------------------------------------------------------------------------- void vtkDICOMReader::RelayError(vtkObject *o, unsigned long e, void *data) { if (e == vtkCommand::ErrorEvent) { vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o); if (parser && parser->GetErrorCode()) { this->SetErrorCode(parser->GetErrorCode()); } else { this->SetErrorCode(vtkErrorCode::UnknownError); } if (data) { vtkErrorMacro(<< static_cast(data)); } else { vtkErrorMacro(<< "An unknown error occurred!"); } } else { this->InvokeEvent(e, data); } } //---------------------------------------------------------------------------- vtkImageData *vtkDICOMReader::GetOverlayOutput() { return this->GetOutput(1); } //---------------------------------------------------------------------------- vtkAlgorithmOutput *vtkDICOMReader::GetOverlayOutputPort() { return this->GetOutputPort(1); } //---------------------------------------------------------------------------- void vtkDICOMReader::SetOverlayOutput(vtkImageData *data) { this->GetExecutive()->SetOutputData(1, data); } //---------------------------------------------------------------------------- vtkMedicalImageProperties *vtkDICOMReader::GetMedicalImageProperties() { if (this->MedicalImageProperties == 0) { this->MedicalImageProperties = vtkMedicalImageProperties::New(); this->UpdateMedicalImageProperties(); } return this->MedicalImageProperties; } //---------------------------------------------------------------------------- void vtkDICOMReader::UpdateMedicalImageProperties() { vtkDICOMMetaData *meta = this->MetaData; vtkMatrix4x4 *matrix = this->PatientMatrix; vtkMedicalImageProperties *properties = this->MedicalImageProperties; const vtkDICOMValue *vptr; vptr = &meta->Get(DC::PatientName); properties->SetPatientName(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::PatientID); properties->SetPatientID(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); properties->SetPatientAge(meta->Get(DC::PatientAge).GetCharData()); properties->SetPatientSex(meta->Get(DC::PatientSex).GetCharData()); properties->SetPatientBirthDate( meta->Get(DC::PatientBirthDate).GetCharData()); properties->SetStudyDate(meta->Get(DC::StudyDate).GetCharData()); properties->SetAcquisitionDate(meta->Get(DC::AcquisitionDate).GetCharData()); properties->SetStudyTime(meta->Get(DC::StudyTime).GetCharData()); properties->SetAcquisitionTime(meta->Get(DC::AcquisitionTime).GetCharData()); properties->SetImageDate(meta->Get(DC::ContentDate).GetCharData()); properties->SetImageTime(meta->Get(DC::ContentTime).GetCharData()); properties->SetImageNumber(meta->Get(DC::InstanceNumber).GetCharData()); properties->SetSeriesNumber(meta->Get(DC::SeriesNumber).GetCharData()); vptr = &meta->Get(DC::SeriesDescription); properties->SetSeriesDescription(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::StudyID); properties->SetStudyID(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::StudyDescription); properties->SetStudyDescription(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); properties->SetModality(meta->Get(DC::Modality).GetCharData()); vptr = &meta->Get(DC::Manufacturer); properties->SetManufacturer(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::ManufacturerModelName); properties->SetManufacturerModelName(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::StationName); properties->SetStationName(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::InstitutionName); properties->SetInstitutionName(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); vptr = &meta->Get(DC::ConvolutionKernel); properties->SetConvolutionKernel(vptr->IsValid() ? vptr->AsUTF8String().c_str() : NULL); properties->SetSliceThickness(meta->Get(DC::SliceThickness).GetCharData()); properties->SetKVP(meta->Get(DC::KVP).GetCharData()); properties->SetGantryTilt(meta->Get(DC::GantryAngle).GetCharData()); properties->SetEchoTime(meta->Get(DC::EchoTime).GetCharData()); properties->SetEchoTrainLength(meta->Get(DC::EchoTrainLength).GetCharData()); properties->SetRepetitionTime(meta->Get(DC::RepetitionTime).GetCharData()); properties->SetExposureTime(meta->Get(DC::ExposureTime).GetCharData()); properties->SetXRayTubeCurrent(meta->Get(DC::XRayTubeCurrent).GetCharData()); properties->SetExposure(meta->Get(DC::Exposure).GetCharData()); const vtkDICOMValue& center = meta->Get(DC::WindowCenter); const vtkDICOMValue& width = meta->Get(DC::WindowWidth); int n = static_cast(center.GetNumberOfValues()); int m = static_cast(width.GetNumberOfValues()); n = (m < n ? m : n); properties->RemoveAllWindowLevelPresets(); for (int i = 0; i < n; i++) { properties->AddWindowLevelPreset( center.GetDouble(i), width.GetDouble(i)); } const vtkDICOMValue& comment = meta->Get(DC::WindowCenterWidthExplanation); m = static_cast(comment.GetNumberOfValues()); m = (n < m ? n : m); for (int j = 0; j < m; j++) { properties->SetNthWindowLevelPresetComment( j, comment.GetString(j).c_str()); } double dircos[6] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 }; if (matrix) { for (int jj = 0; jj < 2; jj++) { for (int ii = 0; ii < 3; ii++) { dircos[ii + 3*jj] = matrix->GetElement(ii, jj); } } } properties->SetDirectionCosine(dircos); } vtk-dicom-0.8.12/Source/vtkDICOMReader.h000066400000000000000000000411221356440565500176300ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMReader * \brief Read DICOM image files. * * This class reads a series of DICOM files into a vtkImageData object, * and also provides access to the DICOM meta data for each file. */ #ifndef vtkDICOMReader_h #define vtkDICOMReader_h #include "vtkImageReader2.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMCharacterSet.h" // For character sets class vtkIntArray; class vtkTypeInt64Array; class vtkStringArray; class vtkMatrix4x4; class vtkMedicalImageProperties; class vtkDICOMMetaData; class vtkDICOMParser; class vtkDICOMSliceSorter; // For compatibility with VTK 7.0 and earlier #ifndef VTK_TYPE_BOOL_TYPEDEFED #define VTK_TYPE_BOOL_TYPEDEFED typedef int vtkTypeBool; #endif //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMReader : public vtkImageReader2 { public: vtkTypeMacro(vtkDICOMReader, vtkImageReader2); //! Static method for construction. static vtkDICOMReader *New(); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Valid extensions for this file type. const char* GetFileExtensions() VTK_DICOM_OVERRIDE { return ".dcm .dc"; } //! Return a descriptive name that might be useful in a GUI. const char* GetDescriptiveName() VTK_DICOM_OVERRIDE { return "DICOM"; } //! Return true if this reader can read the given file. int CanReadFile(const char* filename) VTK_DICOM_OVERRIDE; //@} //@{ //! Set the Stack ID of the stack to load, for named stacks. /*! * If the series has multiple stacks, then by default the reader * will only load the first stack. This method allows you to select * a different stack, if you know the DICOM StackID for the stack. */ void SetDesiredStackID(const char *stackId); const char *GetDesiredStackID() { return this->DesiredStackID; } //! Get a list of the stacks that are present in the input files. /*! * A stack is a contiguous array of slices that form a volume. */ vtkStringArray *GetStackIDs() { return this->StackIDs; } //@} //@{ //! Get an array that converts slice index to input file index. /*! * If the reader has generated scalar components, then this will * be a two-dimensional array and calling array->GetComponent(i,j) * will return the file index for slice i and scalar component j * for monochrome images, or for slice i and scalar component 3*j * for RGB images (or more precisely, at scalar component N*j where * N is the SamplesPerPixel value from the DICOM metadata). If the * data has just one component, then use j=0. If you used SetFileNames() * to provide a list of files to the reader, then use this array to * find out which file provided which slice, or to index into the * MetaData object to get the metadata for a particular slice. */ vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; } //! Get an array that converts slice index to frame index. /*! * The purpose of this array is to identify individual frames in * multi-frame DICOM files. The dimensions of this array are identical * to the FileIndexArray. Use FileIndexArray to identify the file, * then use FrameIndexArray to identify the frame within that file. */ vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; } //@} //@{ //! Get the meta data for the DICOM files. /*! * The Get() method of vtkDICOMMataData takes optional file and frame * indices, which specify the file and the frame within that file to * get the attribute from. If you have a slice index rather than a * file index and frame index, then use the FileIndexArray and * FrameIndexArray to convert the slice index into file and frame indices. */ vtkDICOMMetaData *GetMetaData() { return this->MetaData; } //@} //@{ //! Set the character set to use if SpecificCharacterSet is missing. /*! * Some DICOM files do not list a SpecificCharacterSet attribute, but * nevertheless use a non-ASCII character encoding. This method can be * used to specify the character set in absence of SpecificCharacterSet. * This method will not take effect unless is is called before the image * is read. If SpecificCharacterSet is present, the default will not * override it unless OverrideCharacterSet is true. */ void SetDefaultCharacterSet(vtkDICOMCharacterSet cs); vtkDICOMCharacterSet GetDefaultCharacterSet() { return this->DefaultCharacterSet; } //! Override the value stored in SpecificCharacterSet. /*! * This method can be used if the SpecificCharacterSet attribute of a * file is incorrect. It overrides the SpecificCharacterSet with the * DefaultCharacterSet. */ vtkSetMacro(OverrideCharacterSet, bool); vtkBooleanMacro(OverrideCharacterSet, bool); bool GetOverrideCharacterSet() { return this->OverrideCharacterSet; } //@} //@{ //! If the files have been pre-sorted, the sorting can be disabled. vtkGetMacro(Sorting, int); vtkSetMacro(Sorting, int); vtkBooleanMacro(Sorting, int); //@} //@{ //! Set a custom sorter to be used to sort files and frames into slices. /*! * The default sorter uses the attributes "ImagePositionPatient" and * "ImageOrientationPatient" to spatially arrange the slices. */ void SetSorter(vtkDICOMSliceSorter *sorter); vtkDICOMSliceSorter *GetSorter() { return this->Sorter; } //@} //@{ //! Read the time dimension as scalar components (default: Off). /*! * If this is on, then each time point will be stored as a scalar * component in the image data. If the data has both a time dimension * and a vector dimension, then the number of components will be the * product of these two dimensions, i.e. the components will store * a sequence of vectors, one vector for each time point. */ vtkGetMacro(TimeAsVector, int); vtkSetMacro(TimeAsVector, int); vtkBooleanMacro(TimeAsVector, int); //@} //@{ //! Get the time dimension if the DICOM series has one. int GetTimeDimension() { return this->TimeDimension; } double GetTimeSpacing() { return this->TimeSpacing; } //@} //@{ //! Set the desired time index (set to -1 for all). vtkSetMacro(DesiredTimeIndex, int); vtkGetMacro(DesiredTimeIndex, int); //@} //@{ //! Turn off automatic conversion of YBR images to RGB. /*! * By default, YBR images are always converted to RGB (though the * photometric interpretation in the metadata will remain the same). */ vtkGetMacro(AutoYBRToRGB, int); vtkSetMacro(AutoYBRToRGB, int); vtkBooleanMacro(AutoYBRToRGB, int); //@} //@{ //! Turn off automatic rescaling of stored pixel values. /*! * By default, if the RescaleSlope and RescaleIntercept attributes * are present in the DICOM data set, they will be used to rescale * stored pixel values according to the DICOM modality LUT operation. * The resulting values will be stored as 16-bit integers if possible, * but single-precision floats will be used if the potential output * range is greater than can be stored in 16 bits, or if either the * RescaleSlope or the RescaleIntercept is not an integer. * If AutoRescale is off, then the data is not rescaled. */ vtkGetMacro(AutoRescale, int); vtkSetMacro(AutoRescale, int); vtkBooleanMacro(AutoRescale, int); //@} //@{ //! Get the slope and intercept for rescaling the scalar values. /*! * If AutoRescale in On (which is the default), then GetRescaleSlope() * will return 1 and GetRescaleIntercept() will return zero. Otherwise, * they will return the RescaleSlope and RescaleIntercept for the data * set. Use the equation v = u*RescaleSlope + RescaleIntercept. * * Note that the returned values might not be valid if these attributes * are not the same for all slices in the series. Use the meta data to * retrieve the per-slice slope and intercept. */ double GetRescaleSlope() { return this->RescaleSlope; } double GetRescaleIntercept() { return this->RescaleIntercept; } //@} //@{ //! Get a matrix to place the image within DICOM patient coords. /*! * This matrix is constructed from the ImageOrientationPatient * and ImagePositionPatient meta data attributes. See the * SetMemoryRowOrder method for additional information. */ vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; } //@} //@{ //! Get the overlay. /*! * The extent of the overlay will be the same as the main image. * For multiple overlays, each overlay will be stored in a different * bit. An 8-bit image will be used if there are eight or fewer * overlays, and an unsigned 16-bit image will be used if there are * more than eight overlays. */ vtkImageData *GetOverlayOutput(); vtkAlgorithmOutput *GetOverlayOutputPort(); void SetOverlayOutput(vtkImageData *data); //! Returns true if any overlays are present. bool HasOverlay() { return (this->OverlayBitfield != 0); } //! Returns a bitfield that indicates which overlays are present. unsigned short GetOverlayBitfield() { return this->OverlayBitfield; } //@} //@{ //! Get a MedicalImageProperties object for this file. vtkMedicalImageProperties *GetMedicalImageProperties(); //@} //! Enumeration for top-down vs. bottom-up ordering. enum RowOrder { FileNative, TopDown, BottomUp }; //@{ //! Set the ordering of the image rows in memory. /*! * If the order is BottomUp (which is the default) then * the images will be flipped when they are read from disk. * The native orientation of DICOM images is top-to-bottom. */ void SetMemoryRowOrder(int order); void SetMemoryRowOrderToFileNative() { this->SetMemoryRowOrder(FileNative); } void SetMemoryRowOrderToTopDown() { this->SetMemoryRowOrder(TopDown); } void SetMemoryRowOrderToBottomUp() { this->SetMemoryRowOrder(BottomUp); } int GetMemoryRowOrder() { return this->MemoryRowOrder; } const char *GetMemoryRowOrderAsString(); //@} //@{ //! Set the scalar type of the output. /*! * The default value is -1, which means that the input scalar type will * be used to set the output scalar type (accounting for any type * changes required by AutoRescale). Allowed output scalar types are * VTK_SIGNED_CHAR, VTK_UNSIGNED_CHAR, VTK_SHORT, VTK_UNSIGNED_SHORT, * VTK_INT, VTK_UNSIGNED_INT, VTK_FLOAT, or VTK_DOUBLE. The output * data values will be clamped to the limits of the output type. */ vtkSetMacro(OutputScalarType, int); vtkGetMacro(OutputScalarType, int); //@} #ifndef __WRAP__ //@{ using Superclass::Update; //! Update both the image and, if present, the overlay void Update() VTK_DICOM_OVERRIDE; //@} #endif protected: vtkDICOMReader(); ~vtkDICOMReader(); //@{ //! Entry point for all pipeline requests. vtkTypeBool ProcessRequest( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Read the header information. int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Read the voxel data. int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //@} //@{ //! Read the overlays into an allocated vtkImageData object. virtual bool ReadOverlays(vtkImageData *data); //! Unpack overlay bits to build the overlay image. void UnpackOverlay( const void *filePtr, vtkIdType bitskip, vtkIdType count, void *buffer, vtkIdType incr, int bit); //@} //@{ //! Read one file. Specify the offset to the PixelData. virtual bool ReadOneFile( const char *filename, int idx, unsigned char *buffer, vtkIdType bufferSize); //! Clear or sign-extend any bits beyond BitsStored. void MaskBits(void *buffer, vtkIdType bufferSize, int scalarSize, int bitsStored, int pixelRepresentation); //! Unpack 1 bit to 8 bits or 12 bits to 16 bits. void UnpackBits( const void *source, void *buffer, vtkIdType bufferSize, int bits); //! Unpack 4:2:2 color data. void UnpackYBR422( const void *source, void *buffer, vtkIdType bufferSize, vtkIdType rowlen); //! Read an DICOM file directly. virtual bool ReadFileNative( const char *filename, int idx, unsigned char *buffer, vtkIdType bufferSize); //! Read a DICOM file via DCMTK or GDCM. virtual bool ReadFileDelegated( const char *filename, int idx, unsigned char *buffer, vtkIdType bufferSize); //@} //@{ //! Check if rescaling will change scalar type. virtual int ComputeRescaledScalarType( int scalarType, int bitsStored, int pixelRepresentation); //! Rescale the data in the buffer. virtual void RescaleBuffer( int fileIdx, int frameIdx, int fileType, int outputType, int numFileComponents, int numComponents, void *fileBuffer, void *outputBuffer, vtkIdType bufferSize); //! Convert buffer from YUV to RGB. virtual void YBRToRGB( int fileIdx, int frameIdx, void *buffer, vtkIdType bufferSize); //@} //@{ //! Convert parser errors into reader errors. void RelayError(vtkObject *o, unsigned long e, void *data); //@} //@{ //! Verify that the files can be composed into a volume. /*! * This is called after SortFiles has been called. It should invoke an * error event and return zero upon failure. */ virtual bool ValidateStructure( vtkIntArray *fileArray, vtkIntArray *frameArray); //! Sort the input files, put the sort in the supplied arrays. virtual void SortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray); //! Do not sort the files, just build the arrays. void NoSortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray); //@} //@{ //! Update the medical image properties; virtual void UpdateMedicalImageProperties(); //@} //! Select whether to sort the files. int Sorting; //! Information for rescaling data to quantitative units. double RescaleIntercept; double RescaleSlope; //! The orientation matrix for the DICOM file. vtkMatrix4x4 *PatientMatrix; //! The meta data for the image. vtkDICOMMetaData *MetaData; //! The MedicalImageProperties, for compatibility with other readers. vtkMedicalImageProperties *MedicalImageProperties; //! The default character set to use while parsing the file. vtkDICOMCharacterSet DefaultCharacterSet; //! Whether the default should override SpecificCharacterSet. bool OverrideCharacterSet; //! The parser that is used to read the file. vtkDICOMParser *Parser; //! The sorter that orders the slices within the volume. vtkDICOMSliceSorter *Sorter; //! The offsets to the pixel data in each file. vtkTypeInt64Array *FileOffsetArray; //! An array to convert slice indices to input files vtkIntArray *FileIndexArray; //! An array to convert slice indices to input frames vtkIntArray *FrameIndexArray; //! An array that holds the stack IDs. vtkStringArray *StackIDs; //! The row order to use when storing the data in memory. int MemoryRowOrder; //! This indicates that the data must be rescaled. int NeedsRescale; int AutoRescale; int FileScalarType; int OutputScalarType; //! This indicates that the data must be converted to RGB. int NeedsYBRToRGB; int AutoYBRToRGB; //! The number of packed pixel components in the input file. /*! * This is for packed, rather than planar, components. */ int NumberOfPackedComponents; //! The number of color planes in the file. int NumberOfPlanarComponents; //! Time dimension variables. int TimeAsVector; int TimeDimension; int DesiredTimeIndex; double TimeSpacing; //! The stack to load. char DesiredStackID[20]; //! Bitfield that says what overlays are present. unsigned short OverlayBitfield; bool UpdateOverlayFlag; private: #ifdef VTK_DICOM_DELETE vtkDICOMReader(const vtkDICOMReader&) VTK_DICOM_DELETE; void operator=(const vtkDICOMReader&) VTK_DICOM_DELETE; #else vtkDICOMReader(const vtkDICOMReader&) = delete; void operator=(const vtkDICOMReader&) = delete; #endif }; #endif // vtkDICOMReader_h vtk-dicom-0.8.12/Source/vtkDICOMReferenceCount.cxx000066400000000000000000000016741356440565500217200ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMReferenceCount.h" #include "vtkWindows.h" #if defined(_WIN32) unsigned int vtkDICOMReferenceCount::operator--() { return static_cast( InterlockedDecrement(reinterpret_cast(&this->Counter))); } #endif #if defined(_WIN32) unsigned int vtkDICOMReferenceCount::operator++() { return static_cast( InterlockedIncrement(reinterpret_cast(&this->Counter))); } #endif vtk-dicom-0.8.12/Source/vtkDICOMReferenceCount.h000066400000000000000000000034611356440565500213410ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMReferenceCount_h #define vtkDICOMReferenceCount_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro //! An object for holding an atomic reference count. /*! * The vtkDICOMValue class is a reference-counted container. * In order to safely access values from multiple threads, all * operations that modify the reference count must be atomic. */ class VTKDICOM_EXPORT vtkDICOMReferenceCount { public: vtkDICOMReferenceCount(unsigned int i) : Counter(i) {} vtkDICOMReferenceCount() : Counter(0) {} unsigned int operator--(); unsigned int operator++(); bool operator==(unsigned int x) const { return this->Counter == x; } bool operator!=(unsigned int x) const { return this->Counter != x; } private: unsigned int Counter; }; #if !defined(_WIN32) inline unsigned int vtkDICOMReferenceCount::operator--() { #if defined(VTK_HAVE_SYNC_BUILTINS) return __sync_sub_and_fetch(&this->Counter, 1); #else return --this->Counter; #endif } #endif #if !defined(_WIN32) inline unsigned int vtkDICOMReferenceCount::operator++() { #if defined(VTK_HAVE_SYNC_BUILTINS) return __sync_add_and_fetch(&this->Counter, 1); #else return ++this->Counter; #endif } #endif #endif /* vtkDICOMReferenceCount_h */ // VTK-HeaderTest-Exclude: vtkDICOMReferenceCount.h vtk-dicom-0.8.12/Source/vtkDICOMSCGenerator.cxx000066400000000000000000000230571356440565500211640ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMSCGenerator.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkObjectFactory.h" #include "vtkDataSetAttributes.h" #include "vtkInformation.h" vtkStandardNewMacro(vtkDICOMSCGenerator); //---------------------------------------------------------------------------- vtkDICOMSCGenerator::vtkDICOMSCGenerator() { } //---------------------------------------------------------------------------- vtkDICOMSCGenerator::~vtkDICOMSCGenerator() { } //---------------------------------------------------------------------------- void vtkDICOMSCGenerator::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateSCMultiFrameImageModule( vtkDICOMMetaData *source) { // The BurnedInAnnotation attribute is mandatory std::string bia; if (source) { bia = source->Get(DC::BurnedInAnnotation).AsString(); } if (bia != "YES") { bia = "NO"; } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::BurnedInAnnotation, bia); // These are mandatory, and must be set to these values if (meta->Get(DC::BitsStored).AsInt() != 1) { meta->Set(DC::PresentationLUTShape, "IDENTITY"); meta->Set(DC::RescaleIntercept, 0.0); meta->Set(DC::RescaleSlope, 1.0); meta->Set(DC::RescaleType, "US"); } // get dimensions of the data set: x,y,z,t,v int nframes = this->NumberOfFrames; int *dims = this->Dimensions; double *spacing = this->Spacing; // set multi-frame information meta->Set(DC::NumberOfFrames, nframes); // build the FrameIncrementPointer and the vectors vtkDICOMTag pointers[2]; int npointers = 0; double *zvector = new double[nframes]; double *tvector = new double[nframes]; int vdim = (dims[4] > 0 ? dims[4] : 1); int tdim = (dims[3] > 0 ? dims[3] : 1); for (int f = 0; f < nframes; f++) { int t = (f / vdim) % tdim; int z = f / (vdim * tdim); zvector[f] = z*spacing[2]; tvector[f] = (t == 0 ? 0.0 : spacing[3]); } if (dims[3] > 0 || (dims[2] == 0 && nframes == 1)) { pointers[npointers++] = DC::FrameTimeVector; meta->Set(DC::FrameTimeVector, vtkDICOMValue(vtkDICOMVR::DS, tvector, nframes)); } if (dims[2] > 0) { pointers[npointers++] = DC::SliceLocationVector; meta->Set(DC::SliceLocationVector, vtkDICOMValue(vtkDICOMVR::DS, zvector, nframes)); } meta->Erase(DC::FrameTime); meta->Set(DC::FrameIncrementPointer, vtkDICOMValue(vtkDICOMVR::AT, pointers, npointers)); meta->Erase(DC::PixelAspectRatio); double pixelSize[2] = { spacing[1], spacing[0] }; meta->Set(DC::PixelSpacing, vtkDICOMValue(vtkDICOMVR::DS, pixelSize, 2)); delete [] zvector; delete [] tvector; // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::RecognizableVisualFeatures, DC::Illumination, DC::ReflectedAmbientLight, DC::NominalScannedPixelSpacing, // 1C (mandatory if ConversionType is DF) DC::PixelSpacingCalibrationType, DC::PixelSpacingCalibrationDescription, // 1C DC::DigitizingDeviceTransportDirection, DC::RotationOfScannedFilm, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateSCImageModule(vtkDICOMMetaData *source) { // These are not set, because AspectRatio is used instead // DC::PixelSpacing, // 1C // DC::PixelSpacingCalibrationType, // DC::PixelSpacingCalibrationDescription, // 1C // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::DateOfSecondaryCapture, DC::TimeOfSecondaryCapture, DC::NominalScannedPixelSpacing, DC::DocumentClassCodeSequence, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateSCEquipmentModule(vtkDICOMMetaData *source) { // ConversionType is a mandatory attribute std::string ct; if (source) { ct = source->Get(DC::ConversionType).AsString(); } if (ct == "") { ct = "WSD"; // workstation } vtkDICOMMetaData *meta = this->MetaData; meta->Set(DC::ConversionType, ct); // Modality is optional for Secondary Capture std::string m = meta->Get(DC::Modality).AsString(); if (m == "" || m == "OT") { meta->Erase(DC::Modality); } // optional and conditional: direct copy of values with no checks static const DC::EnumType optional[] = { DC::Modality, DC::SecondaryCaptureDeviceID, DC::SecondaryCaptureDeviceManufacturer, DC::SecondaryCaptureDeviceManufacturerModelName, DC::SecondaryCaptureDeviceSoftwareVersions, DC::VideoImageFormatAcquired, DC::DigitalImageFormatAcquired, DC::ItemDelimitationItem }; return this->CopyOptionalAttributes(optional, source); } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateSCMultiFrameInstance(vtkInformation *info) { // get the scalar information vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation( info, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get( vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); const char *SOPClass = 0; if (scalarType == VTK_UNSIGNED_CHAR) { this->SetPixelRestrictions( RepresentationUnsigned, BitsStored8, numComponents); if (numComponents < 3) { SOPClass = "1.2.840.10008.5.1.4.1.1.7.2"; } else { SOPClass = "1.2.840.10008.5.1.4.1.1.7.4"; } } else { this->SetPixelRestrictions( RepresentationUnsigned, BitsStored10 | BitsStored12 | BitsStored16, 1); SOPClass = "1.2.840.10008.5.1.4.1.1.7.3"; } this->InitializeMetaData(info); vtkDICOMMetaData *source = this->SourceMetaData; if (!this->GenerateSOPCommonModule(source, SOPClass) || !this->GeneratePatientModule(source) || !this->GenerateClinicalTrialSubjectModule(source) || !this->GenerateGeneralStudyModule(source) || !this->GeneratePatientStudyModule(source) || !this->GenerateClinicalTrialStudyModule(source) || !this->GenerateGeneralSeriesModule(source) || !this->GenerateClinicalTrialSeriesModule(source) || // optional General Equipment Module intentionally omitted !this->GenerateSCEquipmentModule(source) || !this->GenerateGeneralImageModule(source) || !this->GenerateImagePixelModule(source) || // the Cine Module is added by GenerateSCMultiFrameImageModule !this->GenerateDeviceModule(source) || !this->GenerateSpecimenModule(source) || !this->GenerateSCMultiFrameImageModule(source)) { return false; } return true; } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info) { // get the scalar information vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation( info, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get( vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); int samplesPerPixel = 1; if (scalarType == VTK_UNSIGNED_CHAR) { samplesPerPixel = numComponents; } this->SetPixelRestrictions( RepresentationUnsigned | RepresentationSigned, BitsStored8 | BitsStored10 | BitsStored12 | BitsStored16, samplesPerPixel); const char *SOPClass = "1.2.840.10008.5.1.4.1.1.7"; this->InitializeMetaData(info); vtkDICOMMetaData *source = this->SourceMetaData; if (!this->GenerateSOPCommonModule(source, SOPClass) || !this->GeneratePatientModule(source) || !this->GenerateClinicalTrialSubjectModule(source) || !this->GenerateGeneralStudyModule(source) || !this->GeneratePatientStudyModule(source) || !this->GenerateClinicalTrialStudyModule(source) || !this->GenerateGeneralSeriesModule(source) || !this->GenerateClinicalTrialSeriesModule(source) || // optional GeneralEquipmentModule intentionally omitted !this->GenerateSCEquipmentModule(source) || !this->GenerateGeneralImageModule(source) || !this->GenerateImagePixelModule(source) || !this->GenerateDeviceModule(source) || !this->GenerateSpecimenModule(source) || !this->GenerateSCImageModule(source) || !this->GenerateOverlayPlaneModule(source)) { return false; } return true; } //---------------------------------------------------------------------------- bool vtkDICOMSCGenerator::GenerateInstance(vtkInformation *info) { if (this->MultiFrame == 0) { return this->GenerateSCInstance(info); } return this->GenerateSCMultiFrameInstance(info); } vtk-dicom-0.8.12/Source/vtkDICOMSCGenerator.h000066400000000000000000000055571356440565500206160ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMSCGenerator_h #define vtkDICOMSCGenerator_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMGenerator.h" //! Generate DICOM data objects for Secondary Capture images. /*! * Generate a DICOM data set belonging to one of the Secondary Capture * classes. This is for images that were not directly captured by * medical imaging equipment. For example, a screen capture or a * digital film scan should be considered to be a secondary capture. * The specific IOD classes supported are as follows: * - Secondary Capture, 1.2.840.10008.5.1.4.1.1.7 * - Multi-frame Grayscale Byte SC, 1.2.840.10008.5.1.4.1.1.7.2 * - Multi-frame Grayscale Word SC, 1.2.840.10008.5.1.4.1.1.7.3 * - Multi-frame True Color SC, 1.2.840.10008.5.1.4.1.1.7.4 */ class VTKDICOM_EXPORT vtkDICOMSCGenerator : public vtkDICOMGenerator { public: //! Static method for construction. static vtkDICOMSCGenerator *New(); vtkTypeMacro(vtkDICOMSCGenerator, vtkDICOMGenerator); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //! Generate an instance of one of the supported classes. /*! * This is the primary interface method of this class. Given the * information for a vtkImageData object, it will populate the * attributes of the supplied vtkDICOMMetaData object. */ bool GenerateInstance(vtkInformation *info) VTK_DICOM_OVERRIDE; protected: vtkDICOMSCGenerator(); ~vtkDICOMSCGenerator(); //! Generate the SC Equipment Module. virtual bool GenerateSCEquipmentModule(vtkDICOMMetaData *source); //! Generate the SC Image Module. virtual bool GenerateSCImageModule(vtkDICOMMetaData *source); //! Generate the SC Multi-Frame Image Module. virtual bool GenerateSCMultiFrameImageModule(vtkDICOMMetaData *source); //! Instantiate a DICOM Secondary Capture Image object. virtual bool GenerateSCInstance(vtkInformation *info); //! Instantiate a DICOM Secondary Capture Image object. virtual bool GenerateSCMultiFrameInstance(vtkInformation *info); private: #ifdef VTK_DICOM_DELETE vtkDICOMSCGenerator(const vtkDICOMSCGenerator&) VTK_DICOM_DELETE; void operator=(const vtkDICOMSCGenerator&) VTK_DICOM_DELETE; #else vtkDICOMSCGenerator(const vtkDICOMSCGenerator&) = delete; void operator=(const vtkDICOMSCGenerator&) = delete; #endif }; #endif // vtkDICOMSCGenerator_h vtk-dicom-0.8.12/Source/vtkDICOMSequence.cxx000066400000000000000000000064421356440565500205570ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include // provide extern declarations for all the template methods we use #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700) extern template void vtkDICOMValue::AppendInit(vtkDICOMVR); extern template void vtkDICOMValue::AppendValue(const vtkDICOMItem&); extern template void vtkDICOMValue::SetValue(size_t, const vtkDICOMItem&); #endif //---------------------------------------------------------------------------- // For use by methods that must return an invalid value const vtkDICOMValue vtkDICOMSequence::InvalidValue; // For use by methods that must return an empty item const vtkDICOMItem vtkDICOMSequence::EmptyItem; //---------------------------------------------------------------------------- vtkDICOMSequence::vtkDICOMSequence() { this->V.AppendInit(vtkDICOMVR::SQ); } //---------------------------------------------------------------------------- vtkDICOMSequence::vtkDICOMSequence(unsigned int n) { this->V.AllocateSequenceData(vtkDICOMVR::SQ, n); } //---------------------------------------------------------------------------- void vtkDICOMSequence::Clear() { this->V.AppendInit(vtkDICOMVR::SQ); } //---------------------------------------------------------------------------- void vtkDICOMSequence::AddItem(const vtkDICOMItem& item) { this->V.AppendValue(item); } //---------------------------------------------------------------------------- void vtkDICOMSequence::SetItem(size_t i, const vtkDICOMItem& item) { this->V.SetValue(i, item); } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMSequence::Get(size_t i, vtkDICOMTag tag) const { const vtkDICOMItem *ptr = this->V.GetSequenceData(); if (ptr != 0 && i < this->V.GetNumberOfValues()) { return ptr[i].Get(tag); } return vtkDICOMSequence::InvalidValue; } //---------------------------------------------------------------------------- const vtkDICOMValue &vtkDICOMSequence::Get( size_t i, const vtkDICOMTagPath &tagpath) const { const vtkDICOMItem *ptr = this->V.GetSequenceData(); if (ptr != 0 && i < this->V.GetNumberOfValues()) { return ptr[i].Get(tagpath); } return vtkDICOMSequence::InvalidValue; } //---------------------------------------------------------------------------- const vtkDICOMItem &vtkDICOMSequence::GetItem(size_t i) const { const vtkDICOMItem *ptr = this->V.GetSequenceData(); if (ptr != 0 && i < this->V.GetNumberOfValues()) { return ptr[i]; } return vtkDICOMSequence::EmptyItem; } //---------------------------------------------------------------------------- ostream& operator<<(ostream& os, const vtkDICOMSequence& v) { return os << vtkDICOMValue(v); } vtk-dicom-0.8.12/Source/vtkDICOMSequence.h000066400000000000000000000075001356440565500202000ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMSequence_h #define vtkDICOMSequence_h #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMValue.h" class vtkDICOMItem; class vtkDICOMTagPath; //! A sequence of items according to the SQ representation. /*! * This class is for constructing and decoding sequences. * There are two ways that sequences can be constructed: * A fixed-size sequence can be created and then its items * filled in with the SetItem() method, or, you can start * with an empty sequence and use AddItem() to append items. */ class VTKDICOM_EXPORT vtkDICOMSequence { public: //@{ //! Construct a growable sequence with no items. vtkDICOMSequence(); //! Construct a sequence of fixed size. explicit vtkDICOMSequence(unsigned int n); //@} //@{ //! Clear a sequence, remove its contents and make it empty. void Clear(); //@} //@{ //! Get a value from an item in the sequence. const vtkDICOMValue &Get(size_t i, vtkDICOMTag tag) const; const vtkDICOMValue &Get(size_t i, const vtkDICOMTagPath &p) const; const vtkDICOMValue &GetAttributeValue( size_t i, vtkDICOMTag tag) const { return this->Get(i, tag); } const vtkDICOMValue &GetAttributeValue( size_t i, const vtkDICOMTagPath &p) const { return this->Get(i, p); } //@} //@{ //! Add an item to the sequence. /*! * After calling this method, GetNumberOfItems() will report * the number of items in the sequence, but GetVL() will return * the special value 0xffffffff to indicate that this is a delimited * sequence rather than a fixed-size sequence. */ void AddItem(const vtkDICOMItem& item); //! Get the number of items in the sequence. size_t GetNumberOfItems() const { return this->V.GetNumberOfValues(); } //@} //@{ //! Set an item in the sequence. /*! * This method can only be used if space as been allocated within * the sequence by specifying a size when calling the constructor. */ void SetItem(size_t i, const vtkDICOMItem& item); //! Get an item from the sequence. const vtkDICOMItem& GetItem(size_t i) const; //! Get a pointer to the items in the sequence. const vtkDICOMItem *GetSequenceData() const { return this->V.GetSequenceData(); } //@} //@{ //! Copy constructor. vtkDICOMSequence(const vtkDICOMSequence& o) : V(o.V) {} //! Conversion from value to sequence is type checked. vtkDICOMSequence(const vtkDICOMValue& o) : V(o) { if (o.GetVR() != vtkDICOMVR::SQ) { this->V.Clear(); } } //! Check that the sequence was constructed from a valid value. bool IsValid() const { return this->V.IsValid(); } //@} //@{ //! Assignment operator. vtkDICOMSequence& operator=(const vtkDICOMSequence& o) { this->V = o.V; return *this; } //! Assignment from value to sequence is type checked. vtkDICOMSequence& operator=(const vtkDICOMValue& o) { if (o.GetVR() == vtkDICOMVR::SQ) { this->V = o; } else { this->V.Clear(); } return *this; } //@} private: friend class vtkDICOMValue; vtkDICOMValue V; //! An invalid value, for when one is needed. static const vtkDICOMValue InvalidValue; //! An empty item, for when one is needed. static const vtkDICOMItem EmptyItem; }; VTKDICOM_EXPORT ostream& operator<<(ostream& os, const vtkDICOMSequence& v); #endif /* vtkDICOMSequence_h */ // VTK-HeaderTest-Exclude: vtkDICOMSequence.h vtk-dicom-0.8.12/Source/vtkDICOMSliceSorter.cxx000066400000000000000000000770641356440565500212550ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMSliceSorter.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMTagPath.h" #include "vtkObjectFactory.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkIntArray.h" #include "vtkMath.h" #include #include #include vtkStandardNewMacro(vtkDICOMSliceSorter); //---------------------------------------------------------------------------- vtkDICOMSliceSorter::vtkDICOMSliceSorter() { this->FileIndexArray = vtkIntArray::New(); this->FrameIndexArray = vtkIntArray::New(); this->StackIDs = vtkStringArray::New(); this->MetaData = 0; this->RepeatsAsTime = 0; this->TimeAsVector = 0; this->DesiredTimeIndex = -1; this->TimeDimension = 0; this->TimeSpacing = 1.0; this->SliceSpacing = 1.0; this->DesiredStackID[0] = '\0'; this->ReverseSlices = 0; } //---------------------------------------------------------------------------- vtkDICOMSliceSorter::~vtkDICOMSliceSorter() { if (this->FileIndexArray) { this->FileIndexArray->Delete(); } if (this->FrameIndexArray) { this->FrameIndexArray->Delete(); } if (this->StackIDs) { this->StackIDs->Delete(); } if (this->MetaData) { this->MetaData->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "MetaData: "; if (this->MetaData) { os << this->MetaData << "\n"; } else { os << "(none)\n"; } os << indent << "DesiredStackID: " << (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n"; os << "StackIDs: " << this->StackIDs << "\n"; os << indent << "FileIndexArray: " << this->FileIndexArray << "\n"; os << indent << "FrameIndexArray: " << this->FrameIndexArray << "\n"; os << indent << "ReverseSlices: " << (this->ReverseSlices ? "On\n" : "Off\n"); os << indent << "SliceSpacing: " << this->SliceSpacing << "\n"; os << indent << "RepeatsAsTime: " << (this->RepeatsAsTime ? "On\n" : "Off\n"); os << indent << "TimeAsVector: " << (this->TimeAsVector ? "On\n" : "Off\n"); os << indent << "TimeDimension: " << this->TimeDimension << "\n"; os << indent << "TimeSpacing: " << this->TimeSpacing << "\n"; os << indent << "DesiredTimeIndex: " << this->DesiredTimeIndex << "\n"; os << indent << "TimeTag: " << this->TimeTag << "\n"; os << indent << "TimeSequence: " << this->TimeSequence << "\n"; } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::SetMetaData(vtkDICOMMetaData *meta) { if (this->MetaData != meta) { if (this->MetaData) { this->MetaData->Delete(); } if (meta) { meta->Register(this); } this->MetaData = meta; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::SetDesiredStackID(const char *stackId) { if (stackId == 0) { stackId = ""; } // the maximum length of a stackId is 16 if (strncmp(this->DesiredStackID, stackId, 16) != 0) { strncpy(this->DesiredStackID, stackId, 16); this->DesiredStackID[17] = '\0'; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::SetTimeTag(vtkDICOMTag tag) { if (tag != this->TimeTag) { this->TimeTag = tag; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::SetTimeSequence(vtkDICOMTag tag) { if (tag != this->TimeSequence) { this->TimeSequence = tag; this->Modified(); } } //---------------------------------------------------------------------------- namespace { // a class and methods for sorting the files struct vtkDICOMSliceSorterSortInfo { int FileNumber; int FrameNumber; int InstanceNumber; int PositionNumber; double ComputedLocation; double Time; vtkDICOMSliceSorterSortInfo() : FileNumber(0), FrameNumber(0), InstanceNumber(0), PositionNumber(0), ComputedLocation(0.0), Time(0.0) {} vtkDICOMSliceSorterSortInfo(int i, int j, int k, int s, double l, double t) : FileNumber(i), FrameNumber(j), InstanceNumber(k), PositionNumber(s), ComputedLocation(l), Time(t) {} vtkDICOMSliceSorterSortInfo(int i, int k) : FileNumber(i), FrameNumber(0), InstanceNumber(k), PositionNumber(0), ComputedLocation(0), Time(0) {} // for sorting by by instance number static bool CompareInstance( const vtkDICOMSliceSorterSortInfo &si1, const vtkDICOMSliceSorterSortInfo &si2) { return (si1.InstanceNumber < si2.InstanceNumber); } // for sorting by position number static bool ComparePosition( const vtkDICOMSliceSorterSortInfo &si1, const vtkDICOMSliceSorterSortInfo &si2) { return (si1.PositionNumber < si2.PositionNumber); } // for sorting by spatial location static bool CompareLocation( const vtkDICOMSliceSorterSortInfo &si1, const vtkDICOMSliceSorterSortInfo &si2) { // locations must differ by at least the tolerance const double locationTolerance = 1e-3; return (si1.ComputedLocation + locationTolerance < si2.ComputedLocation); } }; // get an attribute value for a particular frame const vtkDICOMValue& vtkDICOMSliceSorterGetFrame( const vtkDICOMSequence& frameSeq, const vtkDICOMSequence& sharedSeq, unsigned int i, vtkDICOMTag stag, vtkDICOMTag vtag) { const vtkDICOMValue& v = frameSeq.Get(i, vtkDICOMTagPath(stag, 0, vtag)); if (v.IsValid()) { return v; } return sharedSeq.Get(0, vtkDICOMTagPath(stag, 0, vtag)); } // compute spatial location from position and orientation double vtkDICOMSliceSorterComputeLocation( const vtkDICOMValue& pv, const vtkDICOMValue& ov, double checkOrientation[14], bool *checkPtr) { double location = 0.0; if (pv.GetNumberOfValues() != 3 || ov.GetNumberOfValues() != 6) { *checkPtr = false; } else { double orientation[6], normal[3], position[3]; pv.GetValues(position, 3); ov.GetValues(orientation, 6); // compute the cross product to get the slice normal vtkMath::Cross(&orientation[0], &orientation[3], normal); vtkMath::Normalize(normal); location = vtkMath::Dot(normal, position); if (checkOrientation[9] == 0) { // save the orientation and position for later checks for (int i = 0; i < 3; i++) { checkOrientation[i] = orientation[i]; checkOrientation[3+i] = orientation[3+i]; checkOrientation[6+i] = position[i]; checkOrientation[10+i] = normal[i]; } // indicate that checkOrientation has been set checkOrientation[9] = 1.0; } else { const double directionTolerance = 1e-4; const double positionTolerance = 1e-3; for (int i = 0; i < 2; i++) { // make sure the orientation vectors stay the same double *vec = &orientation[3*i]; double *checkVec = &checkOrientation[3*i]; double a = vtkMath::Dot(vec, checkVec); double b = vtkMath::Dot(vec, vec); double c = vtkMath::Dot(checkVec, checkVec); // compute the sine of the angle between the normals // (actually compute the square of the sine, it's easier) double d = 1.0; if (b > 0 && c > 0) { d = 1.0 - (a*a)/(b*c); } // the tolerance is in radians (small angle approximation) if (d > directionTolerance*directionTolerance) { // not all slices have the same orientation *checkPtr = false; } } // make sure the positions line up double *checkPosition = &checkOrientation[6]; double v[3]; v[0] = position[0] - checkPosition[0]; v[1] = position[1] - checkPosition[1]; v[2] = position[2] - checkPosition[2]; double vdir = (vtkMath::Dot(v, normal) < 0 ? -1.0 : 1.0); // set the check vector if it isn't set yet if (checkOrientation[13] == 0 && v[0]*v[0] + v[1]*v[1] + v[2]*v[2] > positionTolerance*positionTolerance) { for (int i = 0; i < 3; i++) { checkOrientation[10+i] = vdir*v[i]; } vtkMath::Normalize(&checkOrientation[10]); } // compare vector to check vector double w = vtkMath::Norm(&checkOrientation[10]); double t = vtkMath::Dot(v, &checkOrientation[10])/w; double dv[3]; dv[0] = v[0] - t*checkOrientation[10]; dv[1] = v[1] - t*checkOrientation[11]; dv[2] = v[2] - t*checkOrientation[12]; double d = dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]; // the position tolerance is in millimetres if (d > (positionTolerance*positionTolerance + t*t*directionTolerance*directionTolerance)) { // positions don't line up along the normal *checkPtr = false; } else if (checkOrientation[13] != 0 && vtkMath::Norm(v) > w) { // use new vector as check vector if it is longer for (int i = 0; i < 3; i++) { checkOrientation[10+i] = vdir*v[i]; } } } if (*checkPtr == false) { // re-set the check orientation to the current stack for (int i = 0; i < 3; i++) { checkOrientation[i] = orientation[i]; checkOrientation[3+i] = orientation[3+i]; checkOrientation[6+i] = position[i]; checkOrientation[10+i] = normal[i]; } // mark the check vector as unset checkOrientation[13] = 0; } } return location; } // compute the spacing between slices double vtkDICOMSliceSorterComputeSpacing( const std::vector& info, int *missing) { double a = 0; double v = VTK_DOUBLE_MAX; size_t m = VTK_UNSIGNED_INT_MAX; int o = 0; while (m != 0) { // compute the mean spacing and the variance in spacing double s1 = 0.0; double s2 = 0.0; size_t n = 0; o = 0; for (size_t i = 1; i < info.size(); i++) { // first verify that locations aren't identical if (vtkDICOMSliceSorterSortInfo::CompareLocation(info[i-1], info[i])) { // compute the offset double d = info[i].ComputedLocation - info[i-1].ComputedLocation; double dd = (d - a)*(d - a); // make sure offset is within 3 sigma or 10% of average offset if (dd < 0.01*a*a || dd < 9*v) { s1 += d; s2 += d*d; n++; } else { o++; } } } // no results! if (n == 0) { break; } // compute the mean and variance a = s1 / n; v = s2/n - a*a; // break if within tolerance or if results haven't changed if (v/(a*a) < 1e-6 || n == m) { break; } // save count to use as check m = n; } *missing = o; return a; } } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames) { // This function assumes that the meta data has already been read, // and that all files have the same StudyUID and SeriesUID. // // It tries two strategies to sort the DICOM files. // // First, it simply sorts the files by instance number. // // Next, if the Image Plane Module is present (DICOM Part 3 C.7.6.2) // then the images are sorted by ImagePositionPatient, so that the // position increases along the direction given by cross product of // the ImageOrientationPatient vectors. // For cardiac images, time sorting can be done with this tag: // - TriggerTime (0018,1060) // - CardiacNumberOfImages (0018,1090) // For relaxometry, time sorting can be done with this tag: // - EchoTime (0018,0091) // For functional images, the following tags can be used: // - NumberOfTemporalPositions (0020,0105) // - TemporalPositionIdentifier (0020,0100) // - TemporalResolution (0020,0110) // If the image has a StackID, then dimensional sorting // might be possible with these tags: // - TemporalPositionIndex (0020,9128) if present // - StackID (0020,9056) // - InStackPositionNumber (0020,9057) // If the multi-frame module is present, each file might have more than // one slice. See DICOM Part 3 Appendix C 7.6.6 for details. // To identify the multi-frame module, look for these attributes: // - NumberOfFrames (0028,0008) // - FrameIncrementPointer (0028,0009) // Usually frames are used for cine, but in nuclear medicine (NM) they // are used to describe multi-dimensional files (Part 3 Appendix C 8.4.8): // - NumberOfSlices (0054,0081) // - NumberOfTimeSlots (0054,0071) // - NumberOfRRIntervals (0054,0061) // - NumberOfRotations (0054,0051) // - NumberOfPhases (0054,0031) // - NumberOfDetectors (0054,0021) // - NumberOfEnergyWindows (0054,0011) vtkDICOMMetaData *meta = this->MetaData; int numFiles = meta->GetNumberOfInstances(); std::vector info; // sort by instance first for (int i = 0; i < numFiles; i++) { int inst = meta->Get(i, DC::InstanceNumber).AsInt(); info.push_back(vtkDICOMSliceSorterSortInfo(i, inst)); } std::stable_sort(info.begin(), info.end(), vtkDICOMSliceSorterSortInfo::CompareInstance); std::vector fileOrder(info.size()); for (int i = 0; i < numFiles; i++) { fileOrder[i] = info[i].FileNumber; } info.clear(); // important position-related variables std::vector volumeBreaks; double checkOrientation[14] = {}; bool canSortByLocation = true; double spacingBetweenSlices = meta->Get(DC::SpacingBetweenSlices).AsDouble(); double spacingSign = 1.0; if (spacingBetweenSlices == 0) { spacingBetweenSlices = 1.0; } else if (spacingBetweenSlices < 0) { spacingBetweenSlices = -spacingBetweenSlices; spacingSign = -1.0; } // important time-related variables double temporalSpacing = 1.0; if (meta->Has(DC::SharedFunctionalGroupsSequence)) { // a special stackInfo for the desired stack std::vector stackInfo; vtkDICOMValue firstStackId; vtkDICOMValue desiredStackId = vtkDICOMValue(vtkDICOMVR::SH, this->DesiredStackID); double stackCheckNormal[14] = {}; bool canSortStackByIPP = true; // files have enhanced frame information for (int ii = 0; ii < numFiles; ii++) { int i = fileOrder[ii]; int inst = meta->Get(i, DC::InstanceNumber).AsInt(); int numberOfFrames = meta->Get(i, DC::NumberOfFrames).AsInt(); // from the MultiFrameFunctionalGroups module vtkDICOMSequence frameSeq = meta->Get(i, DC::PerFrameFunctionalGroupsSequence); vtkDICOMSequence sharedSeq = meta->Get(i, DC::SharedFunctionalGroupsSequence); if (numberOfFrames == 0 && frameSeq.GetNumberOfItems() > 0) { numberOfFrames = 1; } if (ii == 0 && numberOfFrames > 0) { firstStackId = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, DC::FrameContentSequence, DC::StackID); } // attributes for getting time information vtkDICOMTag timeSequence; vtkDICOMTag timeTag; if (numberOfFrames > 0) { // search for time information in the functional groups if (this->TimeSequence.GetGroup() != 0 && this->TimeTag.GetGroup() != 0 && vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, this->TimeSequence, this->TimeTag).IsValid()) { timeSequence = this->TimeSequence; timeTag = this->TimeTag; } else if (vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, DC::CardiacSynchronizationSequence, DC::NominalCardiacTriggerDelayTime).IsValid()) { timeSequence = DC::CardiacSynchronizationSequence; timeTag = DC::NominalCardiacTriggerDelayTime; } else if (vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, DC::TemporalPositionSequence, DC::TemporalPositionTimeOffset).IsValid()) { timeSequence = DC::TemporalPositionSequence; timeTag = DC::TemporalPositionTimeOffset; temporalSpacing = 1000.0; // convert seconds to milliseconds } else if (vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, DC::FrameContentSequence, DC::TemporalPositionIndex).IsValid()) { timeSequence = DC::FrameContentSequence; timeTag = DC::TemporalPositionIndex; } else if (vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, 0, DC::MREchoSequence, DC::EffectiveEchoTime).IsValid()) { timeSequence = DC::MREchoSequence; timeTag = DC::EffectiveEchoTime; } } // position counter int position = 0; double lastTime = 0.0; for (int k = 0; k < numberOfFrames; k++) { // time: use chosen time tag, if present double t = 0.0; if (timeTag.GetGroup() != 0) { t = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, k, timeSequence, timeTag).AsDouble(); } // adjust position only if time did not change if (fabs(t - lastTime) < 1e-3 || k == 0) { position = k; lastTime = t; } // get the StackID vtkDICOMValue stackId = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, k, DC::FrameContentSequence, DC::StackID); if (stackId.IsValid()) { // append new StackIDs to this->StackIDs vtkIdType stacksFound = this->StackIDs->GetNumberOfValues(); std::string stackName = stackId.AsString(); vtkIdType si; for (si = 0; si < stacksFound; si++) { if (stackName == this->StackIDs->GetValue(si)) { break; } } if (si == stacksFound) { this->StackIDs->InsertNextValue(stackName); } // position: look for InStackPositionNumber position = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, k, DC::FrameContentSequence, DC::InStackPositionNumber).AsInt(); } // check for valid Image Plane Module information vtkDICOMValue pv = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, k, DC::PlanePositionSequence, DC::ImagePositionPatient); vtkDICOMValue ov = vtkDICOMSliceSorterGetFrame( frameSeq, sharedSeq, k, DC::PlaneOrientationSequence, DC::ImageOrientationPatient); // check if the StackId is the one the user specified if (stackId == desiredStackId) { // compute location from orientation and IPP double location = vtkDICOMSliceSorterComputeLocation( pv, ov, stackCheckNormal, &canSortStackByIPP); location /= spacingBetweenSlices; stackInfo.push_back( vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t)); } else if (stackId == firstStackId) { // compute location from orientation and IPP double location = vtkDICOMSliceSorterComputeLocation( pv, ov, checkOrientation, &canSortByLocation); location /= spacingBetweenSlices; // force output of one single volume if ((ii > 0 || k > 0) && !firstStackId.IsValid() && pv.IsValid() && !canSortByLocation) { canSortByLocation = true; volumeBreaks.push_back(info.size()); } info.push_back( vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t)); } } } // if frames with the desired stack ID were found, use them if (stackInfo.size() > 0) { canSortByLocation = canSortStackByIPP; info = stackInfo; } } else { // ways to get time information vtkDICOMTag timeTag; if (this->TimeTag.GetGroup() != 0 && meta->Get(this->TimeTag).IsValid()) { timeTag = this->TimeTag; } else if (meta->Get(DC::CardiacNumberOfImages).AsInt() > 1) { timeTag = DC::TriggerTime; } else if (meta->Get(DC::NumberOfTemporalPositions).AsInt() > 1) { timeTag = DC::TemporalPositionIdentifier; temporalSpacing = meta->Get(DC::TemporalResolution).AsDouble(); } else if (meta->Has(DC::TemporalPositionIndex)) { timeTag = DC::TemporalPositionIndex; } else if (meta->Has(DC::EchoTime)) { timeTag = DC::EchoTime; } // position counter int position = 0; double lastTime = 0.0; for (int ii = 0; ii < numFiles; ii++) { int i = fileOrder[ii]; // get the instance number int inst = meta->Get(i, DC::InstanceNumber).AsInt(); // check for valid Image Plane Module information // (for NM this information is per-detector and is put in // the Detector Information Sequence) double location = 0; vtkDICOMValue pv = meta->Get(i, DC::ImagePositionPatient); vtkDICOMValue ov = meta->Get(i, DC::ImageOrientationPatient); location = vtkDICOMSliceSorterComputeLocation( pv, ov, checkOrientation, &canSortByLocation); location /= spacingBetweenSlices; // force output of one single rectilinear volume if (ii > 0 && !canSortByLocation && pv.IsValid()) { canSortByLocation = true; volumeBreaks.push_back(info.size()); } int numberOfFrames = meta->Get(i, DC::NumberOfFrames).AsInt(); if (numberOfFrames <= 1) { double t = 0.0; if (timeTag.GetGroup() != 0) { t = meta->Get(i, timeTag).AsDouble(); } // adjust position only if time did not change if (fabs(t - lastTime) < 1e-3 || ii == 0) { position = inst; lastTime = t; } info.push_back( vtkDICOMSliceSorterSortInfo(i, 0, inst, position, location, t)); } else { // multi-frame image double frameTimeSpacing = 0; vtkDICOMValue timeVector; vtkDICOMValue timeSlotVector; vtkDICOMValue sliceVector; vtkDICOMValue locationVector; vtkDICOMValue fip = meta->Get(i, DC::FrameIncrementPointer); size_t n = fip.GetNumberOfValues(); for (size_t j = 0; j < n; j++) { vtkDICOMTag tag = fip.GetTag(j); if (tag == DC::FrameTime) { // for CINE frameTimeSpacing = meta->Get(i, tag).AsDouble(); } else if (tag == DC::FrameTimeVector) { // for CINE timeVector = meta->Get(i, tag); } else if (tag == DC::SliceLocationVector) { // generic locationVector = meta->Get(i, tag); canSortByLocation = true; } else if (tag == DC::TimeSlotVector) { // for NM timeSlotVector = meta->Get(i, tag); } else if (tag == DC::SliceVector) { // for NM sliceVector = meta->Get(i, tag); } // in dynamic NM, the total number of time frames is the // sum of the number of frames in all collected phases, // we do not support dynamic NM yet } if (timeSlotVector.IsValid() || sliceVector.IsValid()) { // tomographic NM for (int k = 0; k < numberOfFrames; k++) { double t = 0.0; double frameloc = location; if (k < static_cast(timeSlotVector.GetNumberOfValues())) { t = (timeSlotVector.GetDouble(k) - 1.0)*frameTimeSpacing; } if (k < static_cast(sliceVector.GetNumberOfValues())) { position = sliceVector.GetInt(k) - 1; frameloc += position*spacingSign; } info.push_back( vtkDICOMSliceSorterSortInfo(i, k, inst, position, frameloc, t)); } } else { // CINE double t = 0.0; for (int k = 0; k < numberOfFrames; k++) { if (k > 0) { if (k < static_cast(timeVector.GetNumberOfValues())) { frameTimeSpacing = timeVector.GetDouble(k); } t += frameTimeSpacing; } if (k < static_cast(locationVector.GetNumberOfValues())) { location = locationVector.GetDouble(k); location /= spacingBetweenSlices; } info.push_back( vtkDICOMSliceSorterSortInfo(i, k, inst, inst, location, t)); } } } } } // orientation changes suggest that multiple volumes are present if (volumeBreaks.size() > 0) { // count the number of unique positions size_t pcount = 0; for (size_t j = 0; j < info.size(); j++) { int p = info[j].PositionNumber; size_t k; for (k = 0; k < j; k++) { if (info[k].PositionNumber == p) { break; } } pcount += (k == j); } if (volumeBreaks.size() + 1 > pcount/2) { // too many unique volumes would be created, assume // that the acquisition was not rectilinear. canSortByLocation = false; } else { // breaks will be used to indicate new stacks volumeBreaks.push_back(info.size()); size_t stt = 0; size_t sttlen = volumeBreaks[0]; for (size_t k = 0; k < volumeBreaks.size(); k++) { // build the list of StackIDs vtkVariant var(k); this->StackIDs->InsertNextValue(var.ToString()); size_t len = volumeBreaks[k] - (k == 0 ? 0 : volumeBreaks[k-1]); // identify the first stack with multiple images if (sttlen == 1 && len > sttlen) { stt = k; sttlen = len; } } // if DesiredStackID is set, use it if (this->DesiredStackID[0] != '\0') { stt = strtoul(this->DesiredStackID, 0, 10); } // load just one of the rectilinear stacks that are present if (stt >= volumeBreaks.size()) { stt = 0; } info.erase(info.begin() + volumeBreaks[stt], info.end()); if (stt > 0) { info.erase(info.begin(), info.begin() + volumeBreaks[stt-1]); } } } // sort by position, count the number of slices per location int slicesPerLocation = 0; int numSlices = static_cast(info.size()); if (numSlices == 0) { numSlices = 1; } else if (numSlices > 1) { if (canSortByLocation) { std::stable_sort(info.begin(), info.end(), vtkDICOMSliceSorterSortInfo::CompareLocation); } else { std::stable_sort(info.begin(), info.end(), vtkDICOMSliceSorterSortInfo::ComparePosition); } // look for slices at the same location std::vector::iterator iter = info.begin(); int slicesAtThisLocation = 0; while (iter != info.end()) { std::vector::iterator nextIter = iter + 1; slicesAtThisLocation++; bool positionIncreased = false; if (nextIter != info.end()) { // use the tolerance built into CompareLocation if (canSortByLocation) { positionIncreased = vtkDICOMSliceSorterSortInfo::CompareLocation(*iter, *nextIter); } else { positionIncreased = vtkDICOMSliceSorterSortInfo::ComparePosition(*iter, *nextIter); } } if (nextIter == info.end() || positionIncreased) { if (slicesPerLocation == 0) { slicesPerLocation = slicesAtThisLocation; } else if (slicesPerLocation != slicesAtThisLocation) { slicesPerLocation = -1; } slicesAtThisLocation = 0; } iter = nextIter; } } if (slicesPerLocation == 0) { slicesPerLocation = 1; } else if (slicesPerLocation == -1) { slicesPerLocation = 1; vtkWarningMacro("Multidimensional series appears to be missing slices," " representation will be inaccurate."); } // count number of unique time points int temporalPositions = 0; double tMin = VTK_DOUBLE_MAX; double tMax = VTK_DOUBLE_MIN; for (int i = 0; i < slicesPerLocation; i++) { double d = info[i].Time; tMin = (d > tMin ? tMin : d); tMax = (d < tMax ? tMax : d); int u = 1; for (int j = 0; j < i; j++) { u &= !(fabs(info[j].Time - d) < 1e-3); } temporalPositions += u; } // compute temporalSpacing from the apparent time spacing if (temporalPositions > 1) { temporalSpacing *= (tMax - tMin)/(temporalPositions - 1); } else if (this->RepeatsAsTime) { temporalPositions = slicesPerLocation; } // compute the number of slices in the output image int spatialLocations = numSlices/slicesPerLocation; int locations = spatialLocations; if (temporalPositions > 0 && this->TimeAsVector == 0 && this->DesiredTimeIndex < 0) { locations *= temporalPositions; } // recompute slice spacing from position info if (canSortByLocation) { double locDiff = 0; if (locations > 1) { int missing = 0; locDiff = vtkDICOMSliceSorterComputeSpacing(info, &missing); if (missing > 0) { vtkWarningMacro("Series has " << missing << " gaps due to missing slices."); } if (locations > spatialLocations) { // squeeze time slices between spatial slices locDiff *= spatialLocations*1.0/locations; } } if (locDiff > 0) { spacingBetweenSlices *= locDiff; } } // write out the sorted indices bool flipOrder = (this->ReverseSlices != 0); int filesPerOutputSlice = numSlices/locations; int locationsPerSpatialLocation = locations/spatialLocations; int numberOfComponents = filesPerOutputSlice; int desiredTimeIndex = this->DesiredTimeIndex; if (desiredTimeIndex < 0) { desiredTimeIndex = 0; } else { desiredTimeIndex %= temporalPositions; numberOfComponents /= temporalPositions; } files->SetNumberOfComponents(numberOfComponents); files->SetNumberOfTuples(locations); frames->SetNumberOfComponents(numberOfComponents); frames->SetNumberOfTuples(locations); for (int loc = 0; loc < locations; loc++) { int l = loc/locationsPerSpatialLocation; int j = loc - l*locationsPerSpatialLocation; if (flipOrder) { l = spatialLocations - l - 1; } for (int k = 0; k < numberOfComponents; k++) { int i = ((l*locationsPerSpatialLocation + j)*filesPerOutputSlice + desiredTimeIndex*numberOfComponents + k); files->SetComponent(loc, k, info[i].FileNumber); frames->SetComponent(loc, k, info[i].FrameNumber); } } // save the slice spacing and time information this->SliceSpacing = spacingBetweenSlices; this->TimeDimension = temporalPositions; this->TimeSpacing = temporalSpacing; } //---------------------------------------------------------------------------- void vtkDICOMSliceSorter::Update() { this->StackIDs->Initialize(); this->SortFiles(this->FileIndexArray, this->FrameIndexArray); } vtk-dicom-0.8.12/Source/vtkDICOMSliceSorter.h000066400000000000000000000171341356440565500206720ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMSliceSorter_h #define vtkDICOMSliceSorter_h #include "vtkObject.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMTag.h" // For vtkDICOMTag class vtkIntArray; class vtkStringArray; class vtkDICOMMetaData; //! Index a DICOM series to allow proper dimensional ordering. /*! * Given a vtkDICOMMetaData object for a DICOM series, this class will * index the files and frames in the series so that they can be sorted * into a multi-dimensional volume. */ class VTKDICOM_EXPORT vtkDICOMSliceSorter : public vtkObject { public: vtkTypeMacro(vtkDICOMSliceSorter,vtkObject); void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; static vtkDICOMSliceSorter *New(); //@{ //! Set the Stack ID of the stack to use, for named stacks. /*! * If the series has multiple stacks, then by default only the * first stack will be used. This method allows you to select * a different stack, if you know the DICOM StackID for the stack. */ void SetDesiredStackID(const char *stackId); const char *GetDesiredStackID() { return this->DesiredStackID; } //! Get a list of the stacks that are present. /*! * A stack is a contiguous array of slices that form a volume. */ vtkStringArray *GetStackIDs() { return this->StackIDs; } //@} //@{ //! Get an array that converts slice index to input file index. /*! * The array can be two-dimensional and calling array->GetComponent(i,j) * will return the file index for slice i and scalar component j * for monochrome images, or for slice i and scalar component 3*j * for RGB images (or more precisely, at scalar component N*j where * N is the SamplesPerPixel value from the DICOM metadata). If the * data has just one component, then use j=0. Use this array to index * into the MetaData object to get the metadata for a particular slice. */ vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; } //! Get an array that converts slice index to frame index. /*! * The purpose of this array is to identify individual frames in * multi-frame DICOM files. The dimensions of this array are identical * to the FileIndexArray. Use FileIndexArray to identify the file, * then use FrameIndexArray to identify the frame within that file. */ vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; } //@} //@{ //! Set the meta data for the DICOM files. /*! * The Get() method of vtkDICOMMetaData takes optional file and frame * indices, which specify the file and the frame within that file to * get the attribute from. If you have a slice index rather than a file * file index and frame index, then use the FileIndexArray and * FrameIndexArray to convert the slice index into file and frame indices. */ void SetMetaData(vtkDICOMMetaData *meta); vtkDICOMMetaData *GetMetaData() { return this->MetaData; } //@} //@{ //! Force repeated slices to be at different times (default: Off). /*! * If this is on, then repeated slices at the same spatial position * will always be considered to be at different time points. If this * is off, then the repeated slices will either become the temporal * dimension or the vector dimension, depending on the presence of * temporal attributes in the meta data. */ vtkGetMacro(RepeatsAsTime, int); vtkSetMacro(RepeatsAsTime, int); vtkBooleanMacro(RepeatsAsTime, int); //@} //@{ //! Read the time dimension as scalar components (default: Off). /*! * If this is on, then each time point will be stored as a scalar * component in the image data. If the data has both a time dimension * and a vector dimension, then the number of components will be the * product of these two dimensions, i.e. the components will store * a sequence of vectors, one vector for each time point. */ vtkGetMacro(TimeAsVector, int); vtkSetMacro(TimeAsVector, int); vtkBooleanMacro(TimeAsVector, int); //@} //@{ //! Get the time dimension if the DICOM series has one. int GetTimeDimension() { return this->TimeDimension; } double GetTimeSpacing() { return this->TimeSpacing; } //@} //@{ //! Set the desired time index (set to -1 for all). vtkSetMacro(DesiredTimeIndex, int); vtkGetMacro(DesiredTimeIndex, int); //@} //@{ //! Set the DICOM tag to use for time measurement. /*! * This method can be used to explicitly set the tag to use for temporal * sorting. By default (i.e. if this method is not used), the sorter * will search the meta-data for the following temporal tags and will * automatically apply them if present: * - TriggerTime (for cardiac images) * - EchoTime (for relaxometry) * - TemporalPositionIdentifier (fMRI) */ void SetTimeTag(vtkDICOMTag tag); vtkDICOMTag GetTimeTag() { return this->TimeTag; } //@} //@{ //! Set the DICOM sequence to use for timing information. /*! * This is only used for enhanced multi-frame images. If used, then * SetTimeTag() must also be used to specify which tag in the sequence * to use for temporal sorting. By default, the following sequence/tag * conbinations are automatically detected and applied: * - CardiacSynchronizationSequence/NominalCardiacTriggerDelayTime * - TemporalPositionSequence/TemporalPositionTimeOffset * - FrameContentSequence/TemporalPositionIndex * - MREchoSequence/EffectiveEchoTime */ void SetTimeSequence(vtkDICOMTag tag); vtkDICOMTag GetTimeSequence() { return this->TimeSequence; } //@{ //! Set whether to reverse the slice order. /*! * This is desired if the images are to be flipped. */ vtkGetMacro(ReverseSlices, int); vtkSetMacro(ReverseSlices, int); vtkBooleanMacro(ReverseSlices, int); //@} //@{ //! Get the slice spacing for the volume. double GetSliceSpacing() { return this->SliceSpacing; } //@} //@{ //! Update the arrays. void Update(); //@} protected: vtkDICOMSliceSorter(); ~vtkDICOMSliceSorter(); // Sort the input files, put the sort in the supplied arrays. virtual void SortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray); // The meta data for the image. vtkDICOMMetaData *MetaData; // An array to convert slice indices to input files vtkIntArray *FileIndexArray; // An array to convert slice indices to input frames vtkIntArray *FrameIndexArray; // An array that holds the stack IDs. vtkStringArray *StackIDs; // Time dimension variables. int RepeatsAsTime; int TimeAsVector; int TimeDimension; int DesiredTimeIndex; double TimeSpacing; // The stack to load. char DesiredStackID[20]; // Whether to reverse the slice order. int ReverseSlices; double SliceSpacing; // The tags to use for time information. vtkDICOMTag TimeTag; vtkDICOMTag TimeSequence; private: #ifdef VTK_DICOM_DELETE vtkDICOMSliceSorter(const vtkDICOMSliceSorter&) VTK_DICOM_DELETE; void operator=(const vtkDICOMSliceSorter&) VTK_DICOM_DELETE; #else vtkDICOMSliceSorter(const vtkDICOMSliceSorter&) = delete; void operator=(const vtkDICOMSliceSorter&) = delete; #endif }; #endif vtk-dicom-0.8.12/Source/vtkDICOMSorter.cxx000066400000000000000000000026671356440565500202720ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMSorter.h" #include "vtkObjectFactory.h" vtkStandardNewMacro(vtkDICOMSorter); //---------------------------------------------------------------------------- vtkDICOMSorter::vtkDICOMSorter() { } //---------------------------------------------------------------------------- vtkDICOMSorter::~vtkDICOMSorter() { } //---------------------------------------------------------------------------- void vtkDICOMSorter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- int vtkDICOMSorter::GetFirstSeriesInStudy(int study) { return this->GetFirstSeriesForStudy(study); } //---------------------------------------------------------------------------- int vtkDICOMSorter::GetNumberOfSeriesInStudy(int study) { return (this->GetLastSeriesForStudy(study) - this->GetFirstSeriesForStudy(study) + 1); } vtk-dicom-0.8.12/Source/vtkDICOMSorter.h000066400000000000000000000026341356440565500177110ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMSorter_h #define vtkDICOMSorter_h #include "vtkDICOMFileSorter.h" //! Deprecated class, please use vtkDICOMFileSorter instead. class VTKDICOM_EXPORT vtkDICOMSorter : public vtkDICOMFileSorter { public: //@{ vtkTypeMacro(vtkDICOMSorter,vtkDICOMFileSorter); void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; static vtkDICOMSorter *New(); //@} //@{ //! Get the first series in a particular study. int GetFirstSeriesInStudy(int study); //! Get the number of series in a particular study. int GetNumberOfSeriesInStudy(int study); //@} protected: vtkDICOMSorter(); ~vtkDICOMSorter(); private: #ifdef VTK_DICOM_DELETE vtkDICOMSorter(const vtkDICOMSorter&) VTK_DICOM_DELETE; void operator=(const vtkDICOMSorter&) VTK_DICOM_DELETE; #else vtkDICOMSorter(const vtkDICOMSorter&) = delete; void operator=(const vtkDICOMSorter&) = delete; #endif }; #endif vtk-dicom-0.8.12/Source/vtkDICOMTag.cxx000066400000000000000000000021621356440565500175150ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMTag.h" ostream& operator<<(ostream& o, const vtkDICOMTag& a) { // This is easier than saving the stream state, changing it to write // hexadecimal, and then restoring the state, and it also doesn't // require including iomanip.h char text[12]; int t[2]; t[0] = a.GetGroup(); t[1] = a.GetElement(); char *cp = text; *cp++ = '('; for (int j = 0; j < 2; j++) { for (int i = 12; i >= 0; i -= 4) { char d = ((t[j] >> i) & 0x000F); *cp++ = (d < 10 ? '0' + d : 'A' - 10 + d); } *cp++ = ','; } cp[-1] = ')'; *cp = '\0'; o << text; return o; } vtk-dicom-0.8.12/Source/vtkDICOMTag.h000066400000000000000000000047611356440565500171510ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMTag_h #define vtkDICOMTag_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMDictHash.h" //! A (group,element) identifier tag for DICOM attributes. class VTKDICOM_EXPORT vtkDICOMTag { public: //! A struct that provides static storage for a DICOM tag. struct StaticTag { unsigned int Key; }; //@{ vtkDICOMTag() : Key(0) {} //! Construct a tag from group, element numbers. vtkDICOMTag(int group, int element) : Key((group << 16) | element) {} //! Construct a tag from an identifier from the DICOM dictionary. vtkDICOMTag(DC::EnumType tag) : Key(tag) {} //! Construct a tag object from a static tag. vtkDICOMTag(StaticTag tag) : Key(tag.Key) {} //@} //@{ //! Get the 16-bit group identifier. unsigned short GetGroup() const { return static_cast(this->Key >> 16); } //! Get the 16-bit element identifier. unsigned short GetElement() const { return static_cast(this->Key); } //@} //@{ //! Get the tag as a 32-bit key. unsigned int GetKey() const { return this->Key; } //! Compute a hash value, used for accelerating lookups. unsigned int ComputeHash() const { unsigned int h = (((this->Key >> 6) & 0x03FF03FF) ^ this->Key); return (h ^ (h << 16)) >> 16; } //@} //@{ bool operator==(const vtkDICOMTag& b) const { return (this->Key == b.Key); } bool operator!=(const vtkDICOMTag& b) const { return (this->Key != b.Key); } bool operator<=(const vtkDICOMTag& b) const { return (this->Key <= b.Key); } bool operator>=(const vtkDICOMTag& b) const { return (this->Key >= b.Key); } bool operator<(const vtkDICOMTag& b) const { return (this->Key < b.Key); } bool operator>(const vtkDICOMTag& b) const { return (this->Key > b.Key); } //@} private: unsigned int Key; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMTag& a); #endif /* vtkDICOMTag_h */ // VTK-HeaderTest-Exclude: vtkDICOMTag.h vtk-dicom-0.8.12/Source/vtkDICOMTagPath.cxx000066400000000000000000000150011356440565500203260ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMTagPath.h" //---------------------------------------------------------------------------- ostream& operator<<(ostream& o, const vtkDICOMTagPath& a) { o << "["; unsigned int n = a.GetSize(); if (n > 0) { o << a.GetHead(); for (unsigned int i = 1; i < n; i++) { o << ","; o << a.GetIndex(i-1); o << ","; o << a.GetTag(i); } } o << "]"; return o; } //---------------------------------------------------------------------------- vtkDICOMTagPath::vtkDICOMTagPath( const vtkDICOMTagPath& p, unsigned int i, vtkDICOMTag tag) : Size(p.Size+1), Head(p.Head), Index(p.Index), Tail(p.Tail), List(0) { if (this->Size == 1) { this->Head = tag; } else if (this->Size == 2) { this->Index = i; this->Tail = tag; } else if (this->Size == 3) { this->Last.Index = i; this->Last.Tag.Key = tag.GetKey(); } else if (this->Size == 4) { Pair *l = new Pair[2]; l[0] = p.Last; l[1].Index = i; l[1].Tag.Key = tag.GetKey(); this->List = l; } else { unsigned int n = this->Size - 3; Pair *l = new Pair[n + 1]; for (unsigned int j = 0; j < n; j++) { l[j] = p.List[j]; } l[n].Index = i; l[n].Tag.Key = tag.GetKey(); this->List = l; } } //---------------------------------------------------------------------------- vtkDICOMTagPath& vtkDICOMTagPath::operator=(const vtkDICOMTagPath& o) { if (this != &o) { this->Size = o.Size; this->Head = o.Head; this->Index = o.Index; this->Tail = o.Tail; if (o.Size <= 3) { this->Last = o.Last; } else { this->List = vtkDICOMTagPath::CopyList(o.List, o.Size - 2); } } return *this; } //---------------------------------------------------------------------------- vtkDICOMTagPath::Pair *vtkDICOMTagPath::CopyList(const Pair *o, unsigned int n) { Pair *l = new Pair[n]; for (unsigned int i = 0; i < n; i++) { l[i] = o[i]; } return l; } //---------------------------------------------------------------------------- vtkDICOMTagPath vtkDICOMTagPath::GetTail() const { if (this->Size < 2) { return vtkDICOMTagPath(); } if (this->Size == 2) { return vtkDICOMTagPath(this->Tail); } else if (this->Size == 3) { return vtkDICOMTagPath(this->Tail, this->Last.Index, this->Last.Tag); } else if (this->Size == 4) { return vtkDICOMTagPath(this->Tail, this->List[0].Index, this->List[0].Tag, this->List[1].Index, this->List[1].Tag); } unsigned int n = this->Size - 3; Pair *t = this->List; Pair *l = vtkDICOMTagPath::CopyList(&this->List[1], n); return vtkDICOMTagPath(this->Tail, t->Index, t->Tag, n, l); } //---------------------------------------------------------------------------- unsigned int vtkDICOMTagPath::GetIndex(unsigned int i) const { if (i == 0) { return this->Index; } if (i == 1 && this->Size <= 3) { return this->Last.Index; } if (this->Size > 0 && i < this->Size - 1) { return this->List[i-1].Index; } return 0; } //---------------------------------------------------------------------------- vtkDICOMTag vtkDICOMTagPath::GetTag(unsigned int i) const { if (i == 0) { return this->Head; } if (i == 1) { return this->Tail; } if (i == 2 && this->Size <= 3) { return this->Last.Tag; } if (i < this->Size) { return this->List[i-2].Tag; } return vtkDICOMTag(); } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator==(const vtkDICOMTagPath& b) const { if (this->Size != b.Size) { return false; } if (this->Size > 0) { if (this->Head != b.Head) { return false; } if (this->Size > 1) { if (this->Index != b.Index || this->Tail != b.Tail) { return false; } if (this->Size == 3) { return (this->Last.Index == b.Last.Index && this->Last.Tag.Key == b.Last.Tag.Key); } unsigned int n = this->Size - 2; for (unsigned int i = 0; i < n; i++) { if (this->List[i].Index != b.List[i].Index || this->List[i].Tag.Key != b.List[i].Tag.Key) { return false; } } } } return true; } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator!=(const vtkDICOMTagPath& b) const { return !(*this == b); } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator<(const vtkDICOMTagPath& b) const { if (this->Size == 0 || b.Size == 0) { return (this->Size < b.Size); } if (this->Head != b.Head) { return (this->Head < b.Head); } unsigned int n = (this->Size < b.Size ? this->Size : b.Size); if (n > 1) { if (this->Index != b.Index) { return (this->Index < b.Index); } if (this->Tail != b.Tail) { return (this->Tail < b.Tail); } } if (n > 2) { Pair p1 = (this->Size == 3 ? this->Last : this->List[0]); Pair p2 = (b.Size == 3 ? b.Last : b.List[0]); unsigned int m = n-2; unsigned int i = 0; for (;;) { if (p1.Index != p2.Index) { return (p1.Index < p2.Index); } if (p1.Tag.Key != p2.Tag.Key) { return (p1.Tag.Key < p2.Tag.Key); } if (++i == m) { break; } p1 = this->List[i]; p2 = b.List[i]; } } return (this->Size < b.Size); } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator>(const vtkDICOMTagPath& b) const { return !(*this < b || *this == b); } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator<=(const vtkDICOMTagPath& b) const { return (*this < b || *this == b); } //---------------------------------------------------------------------------- bool vtkDICOMTagPath::operator>=(const vtkDICOMTagPath& b) const { return !(*this < b); } vtk-dicom-0.8.12/Source/vtkDICOMTagPath.h000066400000000000000000000076001356440565500177610ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMTagPath_h #define vtkDICOMTagPath_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMTag.h" //! A tag path for digging values out of sequence items. /*! * The tag path makes it easier to access data elements that are * buried within sequences. */ class VTKDICOM_EXPORT vtkDICOMTagPath { public: //@{ //! Construct a tag path with an empty head and tail. vtkDICOMTagPath() : Size(0), Head(), Index(0), Tail(), List(0) {} //! Construct a tag path from a sequence tag, item index, and item tag. vtkDICOMTagPath(vtkDICOMTag seqTag, unsigned int i, vtkDICOMTag tag) : Size(2), Head(seqTag), Index(i), Tail(tag), List(0) {} //! Construct a tag path that goes two levels deep. vtkDICOMTagPath(vtkDICOMTag seqTag, unsigned int i, vtkDICOMTag tag, unsigned int j, vtkDICOMTag tag2) : Size(3), Head(seqTag), Index(i), Tail(tag) { Last.Index = j; Last.Tag.Key = tag2.GetKey(); } //! Construct a tag path by adding to an existing tag path. vtkDICOMTagPath(const vtkDICOMTagPath& path, unsigned int i, vtkDICOMTag tag); //! Construct a tag path from just a single tag. explicit vtkDICOMTagPath(vtkDICOMTag tag) : Size(1), Head(tag), Index(0), Tail(), List(0) {} //! Copy constructor. vtkDICOMTagPath(const vtkDICOMTagPath& o) : Size(o.Size), Head(o.Head), Index(o.Index), Tail(o.Tail) { if (o.Size <= 3) { this->Last = o.Last; } else { this->List = vtkDICOMTagPath::CopyList(o.List, o.Size - 2); } } //@} //@{ //! Destructor. ~vtkDICOMTagPath() { if (this->Size > 3) { delete [] this->List; } } //@} //@{ //! Assignment operator. vtkDICOMTagPath& operator=(const vtkDICOMTagPath& o); //@} //@{ //! If there is no tail, then Head is the end of the path. bool HasTail() const { return (this->Size > 1); } //! Get the path head, which should be a sequence if HasTail() is true. vtkDICOMTag GetHead() const { return this->Head; } //! Get the index of the item within the sequence. unsigned int GetIndex() const { return this->Index; } //! Get the nth index in the path. unsigned int GetIndex(unsigned int i) const; //! Get the nth tag in the path. vtkDICOMTag GetTag(unsigned int i) const; //! Get the number of tags in the path. unsigned int GetSize() const { return this->Size; } //! Get the remainder of the path (after Head and Index). vtkDICOMTagPath GetTail() const; //@} //@{ bool operator==(const vtkDICOMTagPath& b) const; bool operator!=(const vtkDICOMTagPath& b) const; bool operator<=(const vtkDICOMTagPath& b) const; bool operator>=(const vtkDICOMTagPath& b) const; bool operator<(const vtkDICOMTagPath& b) const; bool operator>(const vtkDICOMTagPath& b) const; //@} private: struct Pair { unsigned int Index; vtkDICOMTag::StaticTag Tag; }; vtkDICOMTagPath(vtkDICOMTag seqTag, unsigned int i, vtkDICOMTag tag, unsigned int n, Pair *l) : Size(n+2), Head(seqTag), Index(i), Tail(tag), List(l) {} static Pair *CopyList(const Pair *o, unsigned int n); unsigned int Size; vtkDICOMTag Head; unsigned int Index; vtkDICOMTag Tail; union { Pair Last; Pair *List; }; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMTagPath& a); #endif /* vtkDICOMTagPath_h */ // VTK-HeaderTest-Exclude: vtkDICOMTagPath.h vtk-dicom-0.8.12/Source/vtkDICOMToRAS.cxx000066400000000000000000000401141356440565500177310ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMToRAS.h" #include "vtkDICOMAlgorithm.h" #include "vtkImageData.h" #include "vtkMatrix4x4.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkObjectFactory.h" #include "vtkSmartPointer.h" #include "vtkTemplateAliasMacro.h" vtkStandardNewMacro(vtkDICOMToRAS); vtkCxxSetObjectMacro(vtkDICOMToRAS, PatientMatrix, vtkMatrix4x4); vtkCxxSetObjectMacro(vtkDICOMToRAS, RASMatrix, vtkMatrix4x4); //---------------------------------------------------------------------------- vtkDICOMToRAS::vtkDICOMToRAS() { this->PatientMatrix = vtkMatrix4x4::New(); this->RASMatrix = vtkMatrix4x4::New(); this->RASToDICOM = 0; this->RASMatrixHasPosition = 1; this->AllowColumnReordering = 1; this->AllowRowReordering = 1; this->ReorderRows = 1; this->ReorderColumns = 1; for (int i = 0; i < 16; i++) { this->Matrix[i] = 0.0; } } //---------------------------------------------------------------------------- vtkDICOMToRAS::~vtkDICOMToRAS() { if (this->RASMatrix) { this->RASMatrix->Delete(); } if (this->PatientMatrix) { this->PatientMatrix->Delete(); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "PatientMatrix:"; if (this->PatientMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "RASMatrix:"; if (this->RASMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->RASMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "RASToDICOM: " << this->RASToDICOM << "\n"; os << indent << "RASMatrixHasPosition: " << this->RASMatrixHasPosition << "\n"; os << indent << "AllowColumnReordering: " << this->AllowColumnReordering << "\n"; os << indent << "AllowRowReordering: " << this->AllowRowReordering << "\n"; } //---------------------------------------------------------------------------- void vtkDICOMToRAS::SetRASToDICOM(int val) { val = (val != 0); if (val != this->RASToDICOM) { this->RASToDICOM = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::SetRASMatrixHasPosition(int val) { val = (val != 0); if (val != this->RASMatrixHasPosition) { this->RASMatrixHasPosition = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::SetAllowColumnReordering(int val) { val = (val != 0); if (val != this->AllowColumnReordering) { this->AllowColumnReordering = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::SetAllowRowReordering(int val) { val = (val != 0); if (val != this->AllowRowReordering) { this->AllowRowReordering = val; this->Modified(); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::CheckNeedToReorder() { double hdir[4] = { 1.0, 0.0, 0.0, 0.0 }; double vdir[4] = { 0.0, 1.0, 0.0, 0.0 }; // convert row, column vectors into patient coords vtkMatrix4x4 *inputMatrix = (this->RASToDICOM == 0 ? this->PatientMatrix : this->RASMatrix); if (inputMatrix) { inputMatrix->MultiplyPoint(hdir, hdir); inputMatrix->MultiplyPoint(vdir, vdir); } // do the DICOM-to-RAS sign changes hdir[0] = -hdir[0]; hdir[1] = -hdir[1]; vdir[0] = -vdir[0]; vdir[1] = -vdir[1]; if (this->RASToDICOM) { // for DICOM, hdir should be left (+x) or posterior (+y) this->ReorderColumns = (this->AllowColumnReordering && hdir[0] + hdir[1] < 0); // for RAS, vdir should be inferior (-z) or posterior (+y) this->ReorderRows = (this->AllowRowReordering && vdir[1] - vdir[2] < 0); } else { // for RAS, hdir should be right (+x) or anterior (+y) this->ReorderColumns = (this->AllowColumnReordering && hdir[0] + hdir[1] < 0); // for RAS, vdir should be superior (+z) or anterior (+y) this->ReorderRows = (this->AllowRowReordering && vdir[1] + vdir[2] < 0); } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::ComputeMatrix( int extent[6], double spacing[3], double origin[3]) { double *matrix = this->Matrix; if (this->PatientMatrix && this->RASToDICOM == 0) { vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix); } else if (this->RASMatrix && this->RASToDICOM != 0) { vtkMatrix4x4::DeepCopy(matrix, this->RASMatrix); } else { vtkMatrix4x4::Identity(matrix); } // what corner of the input image will become the (0,0,0) corner // of the output image? int flip[3]; flip[0] = this->ReorderColumns; flip[1] = this->ReorderRows; flip[2] = flip[0] ^ flip[1]; double bounds[6]; for (int i = 0; i < 3; i++) { bounds[2*i] = extent[2*i]*spacing[i] + origin[i]; bounds[2*i + 1] = extent[2*i + 1]*spacing[i] + origin[i]; origin[i] = bounds[2*i + flip[i]]; extent[2*i+1] -= extent[2*i]; extent[2*i] = 0; if (flip[i]) { // reverse along columns for flips origin[i] = -origin[i]; matrix[i] = -matrix[i]; matrix[4 + i] = -matrix[4 + i]; matrix[8 + i] = -matrix[8 + i]; } if (i == 0 || i == 1) { // reverse along rows for LPS to RAS conversion matrix[4*i] = -matrix[4*i]; matrix[4*i + 1] = -matrix[4*i + 1]; matrix[4*i + 2] = -matrix[4*i + 2]; matrix[4*i + 3] = -matrix[4*i + 3]; } } if (this->RASMatrixHasPosition || this->RASToDICOM) { // origin moves into position (last column of matrix) double offset[4]; offset[0] = origin[0]; offset[1] = origin[1]; offset[2] = origin[2]; offset[3] = 1.0; vtkMatrix4x4::MultiplyPoint(matrix, offset, offset); matrix[3] = offset[0]; matrix[7] = offset[1]; matrix[11] = offset[2]; origin[0] = 0.0; origin[1] = 0.0; origin[2] = 0.0; } else { // position moves into origin double offset[4]; offset[0] = matrix[3]; offset[1] = matrix[7]; offset[2] = matrix[11]; offset[3] = 1.0; matrix[3] = 0.0; matrix[7] = 0.0; matrix[11] = 0.0; double inverse[16]; vtkMatrix4x4::Invert(matrix, inverse); vtkMatrix4x4::MultiplyPoint(inverse, offset, offset); origin[0] += offset[0]; origin[1] += offset[1]; origin[2] += offset[2]; } } //---------------------------------------------------------------------------- void vtkDICOMToRAS::UpdateMatrix() { // This calls RequestInformation, which calls ComputeMatrix this->UpdateInformation(); vtkMatrix4x4 *outMatrix; if (this->RASToDICOM == 0) { if (this->RASMatrix == 0) { this->RASMatrix = vtkMatrix4x4::New(); } outMatrix = this->RASMatrix; } else { if (this->PatientMatrix == 0) { this->PatientMatrix = vtkMatrix4x4::New(); } outMatrix = this->PatientMatrix; } const double *inElements = this->Matrix; double *outElements = *outMatrix->Element; bool changed = false; for (int i = 0; i < 16; i++) { changed |= (inElements[i] != outElements[i]); } // this ensures that the timestamp isn't changed unless values changed if (changed) { outMatrix->DeepCopy(this->Matrix); } } //---------------------------------------------------------------------------- int vtkDICOMToRAS::RequestInformation( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // RequestInformation must compute the new matrix and set the origin // if RASMatrixHasPosition was off vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); int extent[6]; double spacing[3], origin[3]; inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); inInfo->Get(vtkDataObject::SPACING(), spacing); inInfo->Get(vtkDataObject::ORIGIN(), origin); // check reordering for the benefit of all later Requests this->CheckNeedToReorder(); this->ComputeMatrix(extent, spacing, origin); // if converting to DICOM, add patient matrix to information if (this->RASToDICOM && this->RASMatrix) { outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), this->Matrix, 16); } outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6); outInfo->Set(vtkDataObject::SPACING(), spacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), origin, 3); return 1; } //---------------------------------------------------------------------------- int vtkDICOMToRAS::RequestUpdateExtent( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // RequestUpdateExtent must check whether row or column reordering // will occur, and adjust the update extent as necessary. vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); int wholeExt[6], inExt[6], outExt[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), outExt); inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExt); int flip[3]; flip[0] = this->ReorderColumns; flip[1] = this->ReorderRows; flip[2] = flip[0] ^ flip[1]; for (int i = 0; i < 3; i++) { int offset = outExt[2*i]; int size = outExt[2*i + 1] - outExt[2*i] + 1; int wholeSize = wholeExt[2*i + 1] - wholeExt[2*i] + 1; if (flip[i]) { offset = wholeSize - size - offset; } inExt[2*i] = wholeExt[2*i] + offset; inExt[2*i + 1] = inExt[2*i] + size - 1; } inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), outExt, 6); return 1; } //---------------------------------------------------------------------------- int vtkDICOMToRAS::RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // output the matrix that goes with the image vtkMatrix4x4 *outMatrix = 0; if (this->RASToDICOM == 0) { if (this->RASMatrix == 0) { this->RASMatrix = vtkMatrix4x4::New(); } outMatrix = this->RASMatrix; } else { if (this->PatientMatrix == 0) { this->PatientMatrix = vtkMatrix4x4::New(); } outMatrix = this->PatientMatrix; // copy the supplied matrix to the data information vtkInformation *outInfo = outputVector->GetInformationObject(0); vtkDataObject *outData = outInfo->Get(vtkDataObject::DATA_OBJECT()); vtkInformation *dataInfo = outData->GetInformation(); dataInfo->CopyEntry(outInfo, vtkDICOMAlgorithm::PATIENT_MATRIX()); } const double *inElements = this->Matrix; double *outElements = *outMatrix->Element; bool changed = false; for (int i = 0; i < 16; i++) { changed |= (inElements[i] != outElements[i]); } // this ensures that the timestamp isn't changed unless values changed if (changed) { outMatrix->DeepCopy(this->Matrix); } return this->Superclass::RequestData(request, inputVector, outputVector); } //---------------------------------------------------------------------------- namespace { template void vtkDICOMToRASExecute( const T *inPtr, T *outPtr, const int flip[3], int numComponents, const int inExt[6], const int outExt[6], const int outExecuteExt[6], vtkAlgorithm *progress) { // size of region to execute over int sizeX = outExecuteExt[1] - outExecuteExt[0] + 1; int sizeY = outExecuteExt[3] - outExecuteExt[2] + 1; int sizeZ = outExecuteExt[5] - outExecuteExt[4] + 1; // output increments vtkIdType outIncX = numComponents; vtkIdType outIncY = outIncX*(outExt[1] - outExt[0] + 1); vtkIdType outSkipY = outIncX*(outExt[1] - outExt[0] + 1 - sizeX); vtkIdType outSkipZ = outIncY*(outExt[3] - outExt[2] + 1 - sizeY); // input increments vtkIdType inIncX = numComponents; vtkIdType inIncY = inIncX*(inExt[1] - inExt[0] + 1); vtkIdType inIncZ = inIncY*(inExt[3] - inExt[2] + 1); if (flip[0]) { inPtr += inIncX*(sizeX - 1); inIncX = -inIncX; } if (flip[1]) { inPtr += inIncY*(sizeY - 1); inIncY = -inIncY; } if (flip[2]) { inPtr += inIncZ*(sizeZ - 1); inIncZ = -inIncZ; } // progress tracking vtkIdType progressGoal = static_cast(sizeZ)*sizeY; vtkIdType progressStep = (progressGoal + 49)/50; vtkIdType progressCount = 0; // loop through the data and rearrange it const T *inPtrZ = inPtr; for (int k = 0; k < sizeZ; k++) { const T *inPtrY = inPtrZ; for (int j = 0; j < sizeY; j++) { if (progress != NULL && (progressCount % progressStep) == 0) { progress->UpdateProgress(progressCount*1.0/progressGoal); } progressCount++; const T *inPtrX = inPtrY; if (numComponents == 1) { for (int i = 0; i < sizeX; i++) { *outPtr++ = *inPtrX; inPtrX += inIncX; } } else { for (int i = 0; i < sizeX; i++) { int c = numComponents; const T *inPtrC = inPtrX; do { *outPtr++ = *inPtrC++; } while (--c); inPtrX += inIncX; } } inPtrY += inIncY; outPtr += outSkipY; } inPtrZ += inIncZ; outPtr += outSkipZ; } } } // end anonymous namespace //---------------------------------------------------------------------------- void vtkDICOMToRAS::ThreadedRequestData( vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *vtkNotUsed(outputVector), vtkImageData ***inData, vtkImageData **outData, int outExecuteExt[6], int threadId) { vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); int inWholeExt[6]; inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), inWholeExt); vtkImageData *input = inData[0][0]; vtkImageData *output = outData[0]; int inExt[6], outExt[6]; input->GetExtent(inExt); output->GetExtent(outExt); int flip[3]; flip[0] = this->ReorderColumns; flip[1] = this->ReorderRows; flip[2] = flip[0] ^ flip[1]; int inExecuteExt[6]; for (int i = 0; i < 3; i++) { int offset = outExecuteExt[2*i]; int size = outExecuteExt[2*i + 1] - outExecuteExt[2*i] + 1; int wholeSize = inWholeExt[2*i + 1] - inWholeExt[2*i] + 1; if (flip[i]) { offset = wholeSize - size - offset; } inExecuteExt[2*i] = inWholeExt[2*i] + offset; inExecuteExt[2*i + 1] = inExecuteExt[2*i] + size - 1; } int numComponents = input->GetNumberOfScalarComponents(); void *inPtr = input->GetScalarPointerForExtent(inExecuteExt); void *outPtr = output->GetScalarPointerForExtent(outExecuteExt); int inScalarType = input->GetScalarType(); int outScalarType = output->GetScalarType(); // progress object if main thread vtkAlgorithm *progress = ((threadId == 0) ? this : NULL); // call the execute method if (outScalarType == inScalarType) { switch (inScalarType) { vtkTemplateAliasMacro( vtkDICOMToRASExecute( static_cast(inPtr), static_cast(outPtr), flip, numComponents, inExt, outExt, outExecuteExt, progress)); default: vtkErrorMacro("Execute: Unknown ScalarType"); } } else { vtkErrorMacro("ThreadedRequestData: output scalar type does not match " "input scalar type"); } } vtk-dicom-0.8.12/Source/vtkDICOMToRAS.h000066400000000000000000000151421356440565500173610ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMToRAS * \brief Convert DICOM orientation to RAS orientation * * This class will modify an image and its position-and-orientation matrix * so that the patient coordinate system follows the conventions of NIFTI * and MINC, i.e. the x, y, and z axes will point in the right, anterior, * and superior directions respectively. Optionally, the row and column * ordering of the image will also be modified so that the row direction * preferentially points right or anterior, and the column direction * preferentially points superior or anterior. */ #ifndef vtkDICOMToRAS_h #define vtkDICOMToRAS_h #include "vtkThreadedImageAlgorithm.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkMatrix4x4; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkDICOMToRAS : public vtkThreadedImageAlgorithm { public: //! Static method for construction. static vtkDICOMToRAS *New(); vtkTypeMacro(vtkDICOMToRAS, vtkThreadedImageAlgorithm); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Reverse the filter: do RAS to DICOM instead of DICOM to RAS. void SetRASToDICOM(int v); void RASToDICOMOn() { this->SetRASToDICOM(1); } void RASToDICOMOff() { this->SetRASToDICOM(0); } int GetRASToDICOM() { return this->RASToDICOM; } //@} //@{ //! Set a matrix that places the image in DICOM patient coords. /*! * This matrix is constructed from the ImageOrientationPatient * and ImagePositionPatient meta data attributes. See the * SetMemoryRowOrder method for additional information. */ void SetPatientMatrix(vtkMatrix4x4 *matrix); vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; } //@} //@{ //! Get a matrix that places the image in RAS coordinates. /*! * This matrix is meant to be used with the output image (unless * the method RASToDICOMOn() has been called to reverse the operation * of the filter). */ vtkMatrix4x4 *GetRASMatrix() { return this->RASMatrix; } void SetRASMatrix(vtkMatrix4x4 *matrix); //@} //@{ //! Update the matrix without updating the output data. /*! * This requires that an input has been set, because the origin, * spacing, and extent of the input data must be known in order * to compute the matrix. */ void UpdateMatrix(); //@} //@{ //! Set whether the RAS matrix should hava a non-zero final column. /*! * By default, the RAS matrix produced by this filter will have a * position coordinate in its final column (NIfTI style). * Alternatively, this filter can set the final column to zero and * use the position to compute a new Origin for the output image. * If this option is On, then the Origin of the output image will * be (0,0,0), and if it is Off, then the final column of the matrix * will be (0,0,0). */ void SetRASMatrixHasPosition(int v); void RASMatrixHasPositionOn() { this->SetRASMatrixHasPosition(1); } void RASMatrixHasPositionOff() { this->SetRASMatrixHasPosition(0); } int GetRASMatrixHasPosition() { return this->RASMatrixHasPosition; } //@} //@{ //! Allow the columns of the image to be reordered. /*! * The columns can be reordered so that columns with higher indices * are further to the right or further anterior. Note that if you turn * this option on, then you are implicitly allowing slice reordering to * occur as well. If you turn both ColumnReordering and SliceReordering * off, then the input data will be directly passed to the output. */ void SetAllowColumnReordering(int v); void AllowColumnReorderingOn() { this->SetAllowColumnReordering(1); } void AllowColumnReorderingOff() { this->SetAllowColumnReordering(0); } int GetAllowColumnReordering() { return this->AllowColumnReordering; } //@} //@{ //! Allow the rows of the image to be reordered. /*! * The rows can be reordered so that rows with higher indices * are further superior or further anterior. Note that if you turn * this option on, then you are implicitly allowing slice reordering to * occur as well. If you turn both ColumnReordering and SliceReordering * off, then the input data will be directly passed to the output. */ void SetAllowRowReordering(int v); void AllowRowReorderingOn() { this->SetAllowRowReordering(1); } void AllowRowReorderingOff() { this->SetAllowRowReordering(0); } int GetAllowRowReordering() { return this->AllowRowReordering; } //@} protected: vtkDICOMToRAS(); ~vtkDICOMToRAS(); //! Check whether the data will be reordered in cols or rows. void CheckNeedToReorder(); //! Compute the RAS matrix and store it in this->Matrix. /*! * If extent doesn't start at zero, make it so that it does. * Also change the origin if RASMatrixHasPosition is Off. */ void ComputeMatrix(int extent[6], double spacing[3], double origin[3]); int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestUpdateExtent( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; void ThreadedRequestData( vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector, vtkImageData ***inData, vtkImageData **outData, int ext[6], int id) VTK_DICOM_OVERRIDE; vtkMatrix4x4 *PatientMatrix; vtkMatrix4x4 *RASMatrix; int RASToDICOM; int AllowColumnReordering; int AllowRowReordering; int RASMatrixHasPosition; int ReorderColumns; int ReorderRows; double Matrix[16]; private: #ifdef VTK_DICOM_DELETE vtkDICOMToRAS(const vtkDICOMToRAS&) VTK_DICOM_DELETE; void operator=(const vtkDICOMToRAS&) VTK_DICOM_DELETE; #else vtkDICOMToRAS(const vtkDICOMToRAS&) = delete; void operator=(const vtkDICOMToRAS&) = delete; #endif }; #endif // vtkDICOMToRAS_h vtk-dicom-0.8.12/Source/vtkDICOMUIDGenerator.cxx000066400000000000000000000316131356440565500212750ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMUIDGenerator.h" #include "vtkDICOMFile.h" #include "vtkDICOMUtilities.h" #include "vtkObjectFactory.h" #include "vtkStringArray.h" #include // needed for random number generation and time #ifdef _WIN32 #include #ifndef DICOM_DEPRECATE_WINXP #include #else #include #endif #endif vtkStandardNewMacro(vtkDICOMUIDGenerator); vtkDICOMUIDGenerator *vtkDICOMUIDGenerator::Default; //---------------------------------------------------------------------------- // A helper class to delete static variables when program exits. static unsigned int vtkDICOMUIDGeneratorInitializerCounter; // Perform initialization of static variables. vtkDICOMUIDGeneratorInitializer::vtkDICOMUIDGeneratorInitializer() { if (vtkDICOMUIDGeneratorInitializerCounter++ == 0) { vtkDICOMUIDGenerator::Default = vtkDICOMUIDGenerator::New(); } } // Perform cleanup of static variables. vtkDICOMUIDGeneratorInitializer::~vtkDICOMUIDGeneratorInitializer() { if (--vtkDICOMUIDGeneratorInitializerCounter == 0) { if (vtkDICOMUIDGenerator::Default) { vtkDICOMUIDGenerator::Default->Delete(); } } } //---------------------------------------------------------------------------- vtkDICOMUIDGenerator::vtkDICOMUIDGenerator() { this->UIDPrefix = NULL; } //---------------------------------------------------------------------------- vtkDICOMUIDGenerator::~vtkDICOMUIDGenerator() { } //---------------------------------------------------------------------------- void vtkDICOMUIDGenerator::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "UIDPrefix: " << (this->UIDPrefix ? this->UIDPrefix : "(NULL)") << "\n"; } //---------------------------------------------------------------------------- const char *vtkDICOMUIDGenerator::GetUIDPrefix() { const char *prefix = this->UIDPrefix; if (prefix == NULL) { prefix = vtkDICOMUtilities::GetUIDPrefix(); } return prefix; } //---------------------------------------------------------------------------- void vtkDICOMUIDGenerator::SetUIDPrefix(const char *uid) { if (uid) { this->UIDPrefix = this->UIDPrefixStore; strncpy(this->UIDPrefix, uid, 63); this->UIDPrefix[63] = '\0'; } else { this->UIDPrefix = NULL; } } //---------------------------------------------------------------------------- namespace { // divide a hexdecimal string by 10 and return the remainder, // this is a helper function for converting a long hex string // (a uuid) into a decimal string (for a uid) int vtkDivideHexStringBy10(char *value) { char *cp = value; // convert hex string to binary unsigned int x = 0; while (*cp != '\0') { // skip any hyphens if (*cp == '-') { cp++; continue; } // convert hex digit to a nibble unsigned int d = *cp; if ((d -= '0') > 9) { if ((d -= ('A' - '0' - 10)) > 15) { d -= ('a' - 'A'); } } // append the nibble x <<= 4; x += d; // divide by 10 unsigned int y = (10 << 3); unsigned int z = 0; int i; for (i = 0; i < 4; i++) { z <<= 1; int nx = x - y; if (nx >= 0) { x = nx; z++; } y >>= 1; } // convert quotient to new hex digit if ((z += '0') > '9') { z += ('A' - '0' - 10); } *cp++ = static_cast(z); } // return the remainder return static_cast(x); } // convert a hex uuid string to a decimal uid string, the // supplied uid will be at most 1.5 times as long as the uuid void vtkConvertHexToDecimal(const char *uuid, char *uid) { // max characters in a uuid and uid const unsigned int uuidlen = 36; const unsigned int uidlen = 64; char x[uuidlen + 4]; char y[uidlen + 4]; if (uuid[0] == '0' && uuid[1] == 'x') { uuid += 2; } strncpy(x, uuid, uuidlen); x[uuidlen] = '\0'; char *cp = y + uidlen; *cp = '\0'; char *dp = x; do { *(--cp) = vtkDivideHexStringBy10(x) + '0'; // remove any leading zeros while (*dp == '0' || *dp == '-') { dp++; } } while (*dp != '\0'); // copy out the result strcpy(uid, cp); } // convert a byte into two hexadecimal digits, used to convert raw // binary into a hexadecimal string one byte at a time inline void vtkGenerateHexDigits(unsigned char y, char cp[2]) { unsigned int z = (y >> 4); for (int j = 0; j < 2; j++) { if ((z += '0') > '9') { z += ('A' - '0' - 10); } cp[j] = static_cast(z); z = (y & 0x0F); } } // convert n raw bytes into 2*n hexadecimal digits void vtkConvertBytesToHex(const unsigned char *bytes, size_t n, char *cp) { for (size_t i = 0; i < n; i++) { vtkGenerateHexDigits(*bytes, cp); bytes++; cp += 2; } *cp = '\0'; } // generate a 36-character uuid from a 128-bit random number // (the supplied uuid pointer must have 37 bytes of available space) void vtkConvertRandomToUUID(const unsigned char bytes[16], char *uuid) { // copy it so that we can modify it char r[16]; for (int j = 0; j < 16; j++) { r[j] = bytes[j]; } // set bits to show that this is a version 4 uuid r[6] = ((r[6] & 0x0f) | 0x40); // set the uuid variant to "0b10" (0b == binary) r[8] = ((r[8] & 0x3f) | 0x80); // convert the uuid into hexadecimal text char *cp = uuid; for (unsigned int i = 0; i < 16; i++) { // add hyphens to the uuid (just to be pedantic) if (i == 4 || i == 6 || i == 8 || i == 10) { *cp++ = '-'; } vtkGenerateHexDigits(r[i], cp); cp += 2; } *cp = '\0'; } // convert a 36-character uuid to a 44-character uid void vtkConvertUUIDToUID(const char *uuid, char *uid) { memcpy(uid, "2.25.", 5); vtkConvertHexToDecimal(uuid, uid + 5); } // read from the random number generator, cryptographic quality random // numbers are needed to ensure uniqueness of the generated uids void vtkGenerateRandomBytes(unsigned char *bytes, vtkIdType n) { int r = 0; #ifdef _WIN32 #ifndef DICOM_DEPRECATE_WINXP // legacy interface (Windows XP and later) HCRYPTPROV hProv; r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT | CRYPT_VERIFYCONTEXT); if (r == 0 && GetLastError() == NTE_BAD_KEYSET) { r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT | CRYPT_NEWKEYSET); } if (r != 0) { r = CryptGenRandom(hProv, n, reinterpret_cast(bytes)); CryptReleaseContext(hProv, 0); } #else // modern interface (Windows Vista and later), requires bcrypt.lib BCRYPT_ALG_HANDLE hProv; ULONG dwFlags = 0; if (BCryptOpenAlgorithmProvider(&hProv, BCRYPT_RNG_ALGORITHM, NULL, 0) != 0) { // couldn't open algorithm, fall back to default hProv = 0; dwFlags = BCRYPT_USE_SYSTEM_PREFERRED_RNG; } if (BCryptGenRandom(hProv, reinterpret_cast(bytes), n, dwFlags) == 0) { // success! r = 1; } if (dwFlags == 0) { BCryptCloseAlgorithmProvider(hProv, 0); } #endif #else // use /dev/urandom, because /dev/random is too slow vtkDICOMFile infile("/dev/urandom", vtkDICOMFile::In); if (infile.GetError() == 0) { size_t m = infile.Read(bytes, n); r = (m == static_cast(n)); infile.Close(); } #endif if (r == 0) { memset(bytes, '\0', n); vtkGenericWarningMacro( "vtkDICOMUIDGenerator::GenerateUID() failed to read from " "the random number generator"); } } // generate a single-digit numerical prefix for UIDs that identifies the // purpose of the uid (this is just for convenience in recognizing the // uid types, it is not suggested by the DICOM standard) char vtkDICOMTagToDigit(vtkDICOMTag tag) { char d = '1'; if (tag == DC::SOPInstanceUID || tag == DC::MediaStorageSOPInstanceUID) { d = '2'; } else if (tag == DC::SeriesInstanceUID || tag == DC::ConcatenationUID) { d = '3'; } else if (tag == DC::StudyInstanceUID) { d = '4'; } else if (tag == DC::FrameOfReferenceUID || tag == DC::VolumeFrameOfReferenceUID || tag == DC::SourceFrameOfReferenceUID || tag == DC::SynchronizationFrameOfReferenceUID || tag == DC::TableFrameOfReferenceUID) { d = '5'; } return d; } // get the number of random bytes to generate after this prefix, // to ensure that we don't go over the 64 byte limit for UID length vtkIdType vtkRandomBytesForPrefix(const char *prefix) { size_t n = strlen(prefix); if (n > 0 && prefix[n-1] != '.') { n++; } n = 64 - n; vtkIdType m = 0; if (n > 40) { m = 16; // use 128 bit random number } else { m = 12; // use 96 bit random number } return m; } // generate a prefixed UID using the provided random bytes void vtkGeneratePrefixedUID( const unsigned char *r, vtkIdType m, const char *prefix, char d, char uid[64]) { size_t i = 0; while (*prefix != '\0' && i < 62) { uid[i++] = *prefix++; } if (i > 0 && i < 62 && uid[i-1] != '.') { uid[i++] = '.'; } char hexs[36]; vtkConvertBytesToHex(r, m, hexs); char decs[40]; vtkConvertHexToDecimal(hexs, decs); // generate the leading digit as the UID type if (d >= '1' && d <= '9') { // decimal digits required to store an integer with N-1 bytes static const int maxDigits[16] = { 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39 }; uid[i++] = d; // add zeros so all uids will be the same length size_t n = maxDigits[(m-1) & 0x0f]; for (size_t l = strlen(decs); l < n && i < 63; l++) { uid[i++] = '0'; } } const char *cp = decs; while (i < 63 && *cp != '\0') { uid[i++] = *cp++; } while (i < 64) { uid[i++] = '\0'; } } } // end anonymous namespace //---------------------------------------------------------------------------- std::string vtkDICOMUIDGenerator::GenerateUID(vtkDICOMTag tag) { const char *prefix = this->GetUIDPrefix(); char uid[64]; if (prefix[0] == '\0' || (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' && prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0'))) { // generate a 128-bit random number unsigned char r[16]; vtkGenerateRandomBytes(r, 16); // convert to a hexadecimal uuid char uuid[40]; vtkConvertRandomToUUID(r, uuid); // convert the hexadedimal uuid into a DICOM UID with root 2.25 vtkConvertUUIDToUID(uuid, uid); } else { // after prefix, add a "UID type" digit followed by random digits unsigned char r[16]; vtkIdType m = vtkRandomBytesForPrefix(prefix); vtkGenerateRandomBytes(r, m); char d = vtkDICOMTagToDigit(tag); vtkGeneratePrefixedUID(r, m, prefix, d, uid); } return uid; } //---------------------------------------------------------------------------- void vtkDICOMUIDGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids) { const char *prefix = this->GetUIDPrefix(); bool useUUIDForUID = (prefix[0] == '\0' || (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' && prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0'))); vtkIdType m = 16; char d = '0'; if (!useUUIDForUID) { m = vtkRandomBytesForPrefix(prefix); d = vtkDICOMTagToDigit(tag); } // read from random number generator vtkIdType n = uids->GetNumberOfValues(); unsigned char *r = new unsigned char[n*m]; vtkGenerateRandomBytes(r, n*m); for (vtkIdType i = 0; i < n; i++) { char uid[64]; if (useUUIDForUID) { char uuid[40]; vtkConvertRandomToUUID(r + i*m, uuid); vtkConvertUUIDToUID(uuid, uid); } else { vtkGeneratePrefixedUID(r + i*m, m, prefix, d, uid); } // put uids into the array in order (simple insertion sort) vtkIdType j = 0; for (; j < i; j++) { if (vtkDICOMUtilities::CompareUIDs(uids->GetValue(j), uid) > 0) { break; } } for (vtkIdType k = i; k > j; --k) { uids->SetValue(k, uids->GetValue(k - 1)); } uids->SetValue(j, uid); } delete [] r; } //---------------------------------------------------------------------------- void vtkDICOMUIDGenerator::SetDefault(vtkDICOMUIDGenerator *uidgen) { if (uidgen != vtkDICOMUIDGenerator::Default) { if (vtkDICOMUIDGenerator::Default) { vtkDICOMUIDGenerator::Default->Delete(); } if (uidgen) { uidgen->Register(NULL); } else { uidgen = vtkDICOMUIDGenerator::New(); } vtkDICOMUIDGenerator::Default = uidgen; } } vtk-dicom-0.8.12/Source/vtkDICOMUIDGenerator.h000066400000000000000000000110641356440565500207200ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMUIDGenerator_h #define vtkDICOMUIDGenerator_h #include "vtkObject.h" #include "vtkStdString.h" // For std::string #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMTag.h" // For method parameter class vtkStringArray; //! Generate UIDs for written DICOM files. /*! * This class generates UIDs that begin with a specified prefix, and are * are followed by a sequence of digits that are sufficiently random that * the possibility of UID collisions is vanishingly small. The default * prefix 2.25. (which can be used by anyone) is followed by a 128-bit * random number. Other prefixes (which can only be used by a designated * organization) are followed by a 128-bit random number if the prefix is * shorter than 24 chars, or a 96-bit random number if the prefix is 24 * chars or longer. */ class VTKDICOM_EXPORT vtkDICOMUIDGenerator : public vtkObject { public: //! Static method for construction. //@{ static vtkDICOMUIDGenerator *New(); vtkTypeMacro(vtkDICOMUIDGenerator, vtkObject); //@} //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set a UID prefix to use when generating UIDs. /*! * If this is not set, or if it is set to NULL, then the default * prefix set via vtkDICOMUtilities::SetUIDPrefix() will be used. * Its default is the 2.25. prefix. */ void SetUIDPrefix(const char *prefix); //! Get the current UID prefix. /*! * If no prefix was set, then this will return the same value as * vtkDICOMUtilities::GetUIDPrefix(). */ const char *GetUIDPrefix(); //@} //@{ //! Generate a UID for the provided tag. /* * The generator uses the tag as a hint when generating the UIDs, * for example the SOPInstanceUID might have a different format from * the FrameOfReferenceUID. */ virtual std::string GenerateUID(vtkDICOMTag tag); //! Generate a series of UIDs, sorted from low to high. /*! * Before passing the string array, call SetNumberOfValues() on * the array to specify the number of UIDs that you want to be * stored in it. The stored UIDs will be sorted, low to high. * Generating a batch of UIDs is more efficient than calling * GenerateUID() repeatedly. */ virtual void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids); //@} //@{ //! Set the default UID generator. /*! * This can be used to set an application-wide UID generator. */ static void SetDefault(vtkDICOMUIDGenerator *uidgen); //! Get the default UID generator. static vtkDICOMUIDGenerator *GetDefault() { return vtkDICOMUIDGenerator::Default; } //@} protected: vtkDICOMUIDGenerator(); ~vtkDICOMUIDGenerator(); char *UIDPrefix; char UIDPrefixStore[64]; static vtkDICOMUIDGenerator *Default; private: friend class vtkDICOMUIDGeneratorInitializer; #ifdef VTK_DICOM_DELETE vtkDICOMUIDGenerator(const vtkDICOMUIDGenerator&) VTK_DICOM_DELETE; void operator=(const vtkDICOMUIDGenerator&) VTK_DICOM_DELETE; #else vtkDICOMUIDGenerator(const vtkDICOMUIDGenerator&) = delete; void operator=(const vtkDICOMUIDGenerator&) = delete; #endif }; //! @cond //! Initializer (Schwarz counter). /*! * This ensures that the vtkDICOMUIDGenerator module is initialized before * any other module that includes this header file. */ class VTKDICOM_EXPORT vtkDICOMUIDGeneratorInitializer { public: vtkDICOMUIDGeneratorInitializer(); ~vtkDICOMUIDGeneratorInitializer(); private: #ifdef VTK_DICOM_DELETE vtkDICOMUIDGeneratorInitializer( const vtkDICOMUIDGeneratorInitializer&) VTK_DICOM_DELETE; vtkDICOMUIDGeneratorInitializer& operator=( const vtkDICOMUIDGeneratorInitializer&) VTK_DICOM_DELETE; #else vtkDICOMUIDGeneratorInitializer( const vtkDICOMUIDGeneratorInitializer&) = delete; vtkDICOMUIDGeneratorInitializer& operator=( const vtkDICOMUIDGeneratorInitializer&) = delete; #endif }; static vtkDICOMUIDGeneratorInitializer vtkDICOMUIDGeneratorInitializerInstance; //! @endcond #endif // vtkDICOMUIDGenerator_h vtk-dicom-0.8.12/Source/vtkDICOMUtilities.cxx000066400000000000000000000423511356440565500207610ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkSystemIncludes.h" #include "vtkStringArray.h" #include "vtkObjectFactory.h" #include "vtkDICOMUtilities.h" #include "vtkDICOMUIDGenerator.h" #include "vtkDICOMFile.h" #include "vtkDICOMConfig.h" #include #include #include // needed for gettimeofday #ifndef _WIN32 #include #include #endif // needed for random number generation and time #ifdef _WIN32 #include #include #endif vtkStandardNewMacro(vtkDICOMUtilities); //---------------------------------------------------------------------------- std::string vtkDICOMUtilities::GenerateUID(vtkDICOMTag tag) { vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault(); return uidgen->GenerateUID(tag); } //---------------------------------------------------------------------------- void vtkDICOMUtilities::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids) { vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault(); uidgen->GenerateUIDs(tag, uids); } //---------------------------------------------------------------------------- int vtkDICOMUtilities::CompareUIDs(const char *u1, const char *u2) { int r = 0; if (u1 == 0 || u2 == 0) { // if one or both are null r = (u2 == 0 ? r : -1); r = (u1 == 0 ? r : 1); } else { while (r == 0 && *u1 != 0 && *u2 != 0) { int i1 = 0; int i2 = 0; do { i1++; } while (u1[i1] >= '0' && u1[i1] <= '9'); do { i2++; } while (u2[i2] >= '0' && u2[i2] <= '9'); r = i1 - i2; // longer number wins if (r == 0) { // lexically compare numbers of the same length do { r = *u1++ - *u2++; } while (r == 0 && --i1 != 0); } } if (r == 0) { // uid with remaining parts wins r = (*u2 == 0 ? r : -1); r = (*u1 == 0 ? r : 1); } else { // convert r to sgn(r) r = (r >= 0 ? r : -1); r = (r <= 0 ? r : 1); } } return r; } //---------------------------------------------------------------------------- long long vtkDICOMUtilities::GetUniversalTime() { #ifdef _WIN32 FILETIME ft; GetSystemTimeAsFileTime(&ft); long long t1 = ((static_cast(ft.dwHighDateTime) << 32) + static_cast(ft.dwLowDateTime)); // convert file time to unix time return t1/10 - 11644473600000000ll; #else struct timeval tv; gettimeofday(&tv, 0); return (tv.tv_sec*1000000ll + tv.tv_usec); #endif } //---------------------------------------------------------------------------- long long vtkDICOMUtilities::GetUTC(long long *offset) { long long t = vtkDICOMUtilities::GetUniversalTime(); if (offset) { *offset = vtkDICOMUtilities::GetLocalOffset(t); } return t; } //---------------------------------------------------------------------------- long long vtkDICOMUtilities::GetLocalOffset(long long microsecs) { #ifdef _WIN32 // convert unix time to file time long long t1 = microsecs*10 + 11644473600000000ll; ULARGE_INTEGER li; li.QuadPart = t1; FILETIME ft; ft.dwLowDateTime = li.LowPart; ft.dwHighDateTime = li.HighPart; // get the current timezone offset by subtracting UTC from local time TIME_ZONE_INFORMATION tzi; GetTimeZoneInformation(&tzi); SYSTEMTIME st; FileTimeToSystemTime(&ft, &st); SYSTEMTIME lst; SystemTimeToTzSpecificLocalTime(&tzi, &st, &lst); FILETIME lft; SystemTimeToFileTime(&lst, &lft); // round to the nearest second, since result has a bit of numerical error li.LowPart = lft.dwLowDateTime; li.HighPart = lft.dwHighDateTime; long long tzo = static_cast(li.QuadPart) - t1; if (tzo >= 0) { tzo = (tzo + 5000000)/10000000; } else { tzo = -((-tzo + 5000000)/10000000); } return tzo*1000000; #else // tzset() is needed, at least on some systems, to set timezone info // from the TZ environment variable prior to the call to localtime_r() static bool once = false; if (!once) { once = true; tzset(); } // use localtime to get the offset from utc struct tm tmv; time_t tod = static_cast(microsecs/1000000); localtime_r(&tod, &tmv); return tmv.tm_gmtoff*1000000ll; #endif } //---------------------------------------------------------------------------- std::string vtkDICOMUtilities::GenerateDateTime(const char *z) { long long t = vtkDICOMUtilities::GetUniversalTime(); return vtkDICOMUtilities::GenerateDateTime(t, z); } //---------------------------------------------------------------------------- // If "t" is VTK_LONG_LONG_MIN, this uses the current time instead of "t" std::string vtkDICOMUtilities::GenerateDateTime( long long t, const char *z) { char tzs[6] = { '+', '0', '0', '0', '0', '\0' }; long long zs; // offset for local time in microseconds // get any timezone info that was supplied by the caller, if a timezone // was already generated for the data set we want to use it for generating // all time stamps for the data set if (z && (z[0] == '+' || z[0] == '-') && (z[1] >= '0' && z[1] <= '9') && (z[2] >= '0' && z[2] <= '9') && (z[3] >= '0' && z[3] <= '9') && (z[4] >= '0' && z[4] <= '9')) { int zh = (z[1] - '0')*10 + (z[2] - '0'); int zm = (z[3] - '0')*10 + (z[4] - '0'); zs = (zh*3600 + zm*60) * (z[0] == '-' ? -1 : +1) * 1000000ll; } else { // use the local time zone zs = vtkDICOMUtilities::GetLocalOffset(t); long long zst = zs/1000000ll; tzs[0] = (zst < 0 ? '-' : '+'); zst = (zst < 0 ? -zst : zst); sprintf(&tzs[1], "%02d%02d", static_cast((zst/3600)%24), static_cast((zst%3600)/60)); z = tzs; } // add the time zone offset (in microseconds) t += zs; // separate time into days and seconds int td = static_cast(t/86400000000ll); long long tus = t - td*86400000000ll; if (tus < 0) { td -= 1; tus += 86400000000ll; } // use algorithm from Henry F. Fliegel and Thomas C. Van Flandern, // computes the current date according to Gregorian calendar int ell = td + 2509157; int n = (4 * ell) / 146097; ell = ell - (146097 * n + 3) / 4; int i = (4000 * (ell + 1)) / 1461001; ell = ell - (1461 * i) / 4 + 31; int j = (80 * ell) / 2447; int d = ell - (2447 * j) / 80; ell = j / 11; int m = j + 2 - (12 * ell); int y = 100 * (n - 49) + i + ell; if (y > 9999) { y = 9999; } // convert microseconds to hours/minutes/seconds.microseconds int S = static_cast(tus/1000000ll); int us = static_cast(tus - S*1000000ll); int H = S/3600; S -= H*3600; int M = S/60; S -= M*60; // create a DICOM datetime string char dt[84]; sprintf(dt, "%04d%02d%02d%02d%02d%02d.%06d%s", y, m, d, H, M, S, us, z); return dt; } //---------------------------------------------------------------------------- long long vtkDICOMUtilities::ConvertDateTime(const char *datetime) { // first normalize the datetime string into the following format const char *epoch = "19700101000000.000000+0000"; char normalized[27]; for (int i = 0; i < 27; i++) { normalized[i] = epoch[i]; } char *tp = normalized; const char *cp = datetime; while (*tp != 0 && *cp >= '0' && *cp <= '9') { *tp++ = *cp++; } if (*tp == '.' && *cp == '.') { *tp++ = *cp++; while (*tp != 0 && *cp >= '0' && *cp <= '9') { *tp++ = *cp++; } } long long zs = -1; if (*cp == '-' || *cp == '+') { tp = normalized + 21; *tp++ = *cp++; while (*tp != 0 && *cp >= '0' && *cp <= '9') { *tp++ = *cp++; } tp = normalized + 21; zs = ((tp[1] - '0')*600 + (tp[2] - '0')*60 + (tp[3] - '0')*10 + (tp[4] - '0'))*60*1000000ll; if (tp[0] == '-') { zs = -zs; } } // convert normalized datetime to year, month, day etc. // first, convert all digits (and only digits) to binary values tp = normalized; normalized[14] += '0'; normalized[21] += '0'; for (int i = 0; i < 26; i++) { normalized[i] -= '0'; } int y = tp[0]*1000 + tp[1]*100 + tp[2]*10 + tp[3]; int m = tp[4]*10 + tp[5]; int d = tp[6]*10 + tp[7]; int H = tp[8]*10 + tp[9]; int M = tp[10]*10 + tp[11]; int S = tp[12]*10 + tp[13]; int us = tp[15]*100 + tp[16]*10 + tp[17]; us = us*1000 + tp[18]*100 + tp[19]*10 + tp[20]; // use algorithm from Henry F. Fliegel and Thomas C. Van Flandern // to compute the day according to Gregorian calendar long long jd = (1461 * (y + 4800 + (m - 14) / 12)) / 4 + (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 - (3 * ((y + 4900 + (m - 14) / 12) / 100)) / 4 + d - 32075; // compute time (the UNIX epoch began on Julian day 2440588) long long t = (jd - 2440588)*86400 + H*3600 + M*60 + S; t = t*1000000 + us; // if no time zone given, find local offset if (zs == -1) { zs = vtkDICOMUtilities::GetLocalOffset(t); // repeat in case we were pushed to opposite side of DST zs = vtkDICOMUtilities::GetLocalOffset(t - zs); } return t - zs; } //---------------------------------------------------------------------------- bool vtkDICOMUtilities::IsDICOMFile(const char *filename) { unsigned char buffer[256]; if (filename == 0) { return false; } vtkDICOMFile infile(filename, vtkDICOMFile::In); if (infile.GetError() != 0) { return false; } // valid file should be at least 256 chars long (probably longer) size_t size = infile.GetSize(); if (size < sizeof(buffer)) { return 0; } size = sizeof(buffer); size_t rsize = infile.Read(buffer, size); infile.Close(); if (rsize != static_cast(size)) { return false; } const unsigned char *cp = buffer; // Look for the magic number and the first meta header tag. size_t skip = 128; for (int i = 0; i < 2; i++) { if (size > skip + 8) { cp = &buffer[skip]; if (cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M' && cp[4] == 2 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0) { return true; } } // Some non-standard files have DICM at the beginning. skip = 0; } // File must be a reasonable size. if (size < 256) { return false; } cp = buffer; // If no magic number found, look for a valid meta header. if (cp[0] == 2 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 && cp[4] == 'U' && cp[5] == 'L' && cp[6] == 4 && cp[7] == 0) { return true; } // Look for two valid implicitly-encoded data elements in Group 0x0008, // where the first element must be (0008,0016) or less (e.g. SOPClassUID) // with a size of 64 or less, and the second element must be (0008,0018) // or less (e.g. SOPInstanceUID) with a size of 64 or less. if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x16 && cp[3] == 0x00 && cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00) { unsigned char e = cp[2]; cp += (cp[4] + 8); if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x18 && cp[3] == 0x00 && cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00 && cp[2] > e) { return true; } } return false; } //---------------------------------------------------------------------------- char vtkDICOMUtilities::UIDPrefix[64] = "2.25."; const char *vtkDICOMUtilities::GetUIDPrefix() { return vtkDICOMUtilities::UIDPrefix; } //---------------------------------------------------------------------------- void vtkDICOMUtilities::SetUIDPrefix(const char *uid) { strncpy(vtkDICOMUtilities::UIDPrefix, uid, 63); vtkDICOMUtilities::UIDPrefix[63] = '\0'; } //---------------------------------------------------------------------------- char vtkDICOMUtilities::ImplementationClassUID[65] = "2.25.190146791043182537444806132342625375407"; const char *vtkDICOMUtilities::GetImplementationClassUID() { return vtkDICOMUtilities::ImplementationClassUID; } //---------------------------------------------------------------------------- void vtkDICOMUtilities::SetImplementationClassUID(const char *uid) { strncpy(vtkDICOMUtilities::ImplementationClassUID, uid, 64); vtkDICOMUtilities::ImplementationClassUID[64] = '\0'; } //---------------------------------------------------------------------------- #define VTK_DICOM_VERSION_CREATOR2(name, x, y, z) \ name "_" #x "_" #y "_" #z #define VTK_DICOM_VERSION_CREATOR(name, x, y, z) \ VTK_DICOM_VERSION_CREATOR2(name, x, y, z) char vtkDICOMUtilities::ImplementationVersionName[17] = VTK_DICOM_VERSION_CREATOR("VTK_DICOM", DICOM_MAJOR_VERSION, DICOM_MINOR_VERSION, DICOM_PATCH_VERSION); const char *vtkDICOMUtilities::GetImplementationVersionName() { return vtkDICOMUtilities::ImplementationVersionName; } //---------------------------------------------------------------------------- void vtkDICOMUtilities::SetImplementationVersionName(const char *name) { strncpy(vtkDICOMUtilities::ImplementationVersionName, name, 16); vtkDICOMUtilities::ImplementationVersionName[16] = '\0'; } //---------------------------------------------------------------------------- bool vtkDICOMUtilities::PatternMatches( const char *pattern, size_t pl, const char *val, size_t vl) { // This performs simple ASCII or UTF8 case-sensitive matching. // It uses the following simplified definition of UTF8: // 0b1xxxxxxx [0b10xxxxxx...] // In other words, a byte with its high bit set, followed by // zero or more bytes with the high bit set and the next bit clear, // are taken as one unicode codepoint. const char *cp = pattern; const char *ep = pattern + pl; const char *dp = val; const char *fp = val + vl; while (cp != ep && dp != fp) { if (*cp == '*') { cp++; // if '*' is the final character, it matches the remainder of val if (cp == ep) { dp = fp; } else { while (dp != fp) { if (*cp == '?' || *dp == *cp) { // check if the remainder of val matches remainder of pattern if (PatternMatches(cp, ep-cp, dp, fp-dp)) { break; } } // else let the "*" eat one more codepoint of "val" if (static_cast(*dp++) < 0) { while (dp != fp && (*dp & 0xC0) == 0x80) { dp++; } } } } } else if (*cp == '?') { // the '?' matches a whole codepoint, not just one byte cp++; if (static_cast(*dp++) < 0) { while (dp != fp && (*dp & 0xC0) == 0x80) { dp++; } } } else if (*cp == *dp) { // make sure the entire codepoint matches cp++; if (static_cast(*dp++) < 0) { while (cp != ep && dp != fp && ((*cp & 0xC0) == 0x80 || (*dp & 0xC0) == 0x80)) { if (*dp != *cp) { return false; } cp++; dp++; } } } else { return false; } } // skip over any remaining '*' wildcards while (cp != ep && *cp == '*') { cp++; } // make sure we've reached the end of both the pattern and the value return (cp == ep && dp == fp); } //---------------------------------------------------------------------------- bool vtkDICOMUtilities::PatternMatches(const char *pattern, const char *val) { return vtkDICOMUtilities::PatternMatches( pattern, strlen(pattern), val, strlen(val)); } //---------------------------------------------------------------------------- bool vtkDICOMUtilities::IsValidUTF8(const char *text, size_t l) { const char *cp = text; const char *ep = cp + l; while (cp != ep) { if (cp[0] != '\0') { if ((cp[0] & 0x80) == 0) // U+0001 to U+007F { cp++; continue; } // check for trailing bytes in utf-8 sequence if (cp+1 != ep && (cp[1] & 0xC0) == 0x80) { // combine the first two bytes for faster checking unsigned short x = (((unsigned char)(cp[0]) << 8) | (unsigned char)(cp[1])); if (x >= 0xC280 && x < 0xE000) // U+0080 to U+07FF { cp += 2; continue; } else if (cp+2 != ep && (cp[2] & 0xC0) == 0x80) { if ((x >= 0xE0A0 && x < 0xEDA0) || // U+0800 to U+D7FF (x >= 0xEE80 && x < 0xF000)) // U+E000 to U+FFFF { cp += 3; continue; } else if (cp+3 != ep && (cp[3] & 0xC0) == 0x80) { if (x >= 0xF090 && x < 0xF490) // U+10000 to U+10FFFF { cp += 4; continue; } } } } } // utf-8 decoding error occurred at position "cp" return false; } return true; } //---------------------------------------------------------------------------- void vtkDICOMUtilities::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } vtk-dicom-0.8.12/Source/vtkDICOMUtilities.h000066400000000000000000000166511356440565500204120ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMUtilities_h #define vtkDICOMUtilities_h #include "vtkObject.h" #include "vtkStdString.h" // For std::string #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details #include "vtkDICOMTag.h" // For method parameter class vtkStringArray; //! Utility functions for use with DICOM classes. class VTKDICOM_EXPORT vtkDICOMUtilities : public vtkObject { public: //@{ //! VTK new method (for Java and Tcl wrappers) static vtkDICOMUtilities *New(); //! VTK dynamic type information macro. vtkTypeMacro(vtkDICOMUtilities, vtkObject); //! Print a summary of the contents of this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@} //@{ //! Set a UID prefix to use when generating UIDs. /*! * This is optional, if you do not own a UID prefix then the publicly * available 2.25 prefix will be used. */ static void SetUIDPrefix(const char *prefix); static const char *GetUIDPrefix(); //@} //@{ //! Generate a UID for the provided tag. static std::string GenerateUID(vtkDICOMTag tag); //! Generate a series of UIDs, sorted from low to high. /*! * Before passing the string array, call SetNumberOfValues() on * the array to specify the number of UIDs that you want to be * stored in it. The stored UIDs will be sorted, low to high. * Generating a batch of UIDs is more efficient than calling * GenerateUID() repeatedly. */ static void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids); //! Numerically compare two UIDs, returns -1, 0, or +1. static int CompareUIDs(const char *u1, const char *u2); //@} //@{ //! Generate a DICOM date time string in the given timezone. /*! * The time zone is to be given in the DICOM format of * +HHMM or -HHMM where HH is the hour offset and MM is the * minute offset. If no time zone is given, then local time * is used (according to the computer's time zone preferences). */ static std::string GenerateDateTime(const char *zone); //! Generate a DICOM date time string from long integer. /*! * Given an integer number of microseconds since the UNIX epoch * (00:00:00 UTC on 1 Jan 1970), return a DICOM date time string * for the given time zone. The time zone should be given in the * format +HHMM or -HHMM. If no time zone is given, then the local * zone is used (according to the computer's time zone preferences). */ static std::string GenerateDateTime(long long microsecs, const char *zone); //! Convert a DICOM data time string into a long integer. /*! * Given a DICOM date time string, generate a long integer that counts * microseconds since the UNIX epoch (00:00:00 UTC on 1 Jan 1970). * If the datetime string contains a timezone offset, then that timezone * is used to convert the time to UTC. Otherwise, the local timezone * (according to the computer's timezone preferences) is used to * convert the time to UTC. The return value is always intended to be * interpreted as a UTC time. */ static long long ConvertDateTime(const char *datetime); //! Get the current time in microseconds. /*! * The time is in microseconds since the UNIX epoch (00:00:00 UTC on * 1 Jan 1970). */ static long long GetUniversalTime(); //@} //! Deprecated method, do not use. static long long GetUTC(long long *offset); //@{ //! Check if the specified file is a DICOM file. /*! * This will return true if the file exists, is readable, and * if it has the DICM magic number or if the first few bytes of * the file look like DICOM data elements. */ static bool IsDICOMFile(const char *filename); //@} //@{ //! Get the UID for this DICOM implementation. static const char *GetImplementationClassUID(); //! Set the UID for this DICOM implementation. /*! * The supplied UID will be copied into a static storage area, * and used for all future calls to GetImplementationClassUID. * The ImplementationClassUID appears in the DICOM meta header. */ static void SetImplementationClassUID(const char *uid); //! Get the versioned name for this DICOM implementation. static const char *GetImplementationVersionName(); //! Set the versioned name for this DICOM implementation. /*! * The supplied name will be copied into a static storage area, * and used for all future calls to GetImplementationVersionName. * The ImplementationVersionName appears in the DICOM meta header. */ static void SetImplementationVersionName(const char *name); //@} //@{ //! Unpack one little-endian int from a stream of bytes. /*! * This is a very common operation that is required in many different * classes, so the code is centralized here. */ static unsigned int UnpackUnsignedInt(const unsigned char *cp) { return cp[0] + (cp[1] << 8) + (cp[2] << 16) + (cp[3] << 24); } //! Pack one little-endian int into a stream of bytes. /*! * This is a very common operation that is required in many different * classes, so the code is centralized here. */ static void PackUnsignedInt(unsigned int i, unsigned char *cp) { cp[0] = static_cast(i); cp[1] = static_cast(i >> 8); cp[2] = static_cast(i >> 16); cp[3] = static_cast(i >> 24); } //@} //@{ //! Return true if the pattern matches the given string (utf-8). /*! * This performs simple matching with "*" and "?" as the only wildcard. * The input must either be ASCII or utf-8, and if it is utf-8, then * matching will be done codepoint by codepoint. */ static bool PatternMatches(const char *pattern, const char *val); //! Match patterns on non-terminated strings. static bool PatternMatches( const char *pattern, size_t pl, const char *val, size_t vl); //@} //@{ //! Check that a string is valid utf-8. /*! * The string is valid if it contains no NULL bytes and if it contains * only valid 1-byte, 2-byte, 3-byte, or 4-byte utf-8 sequences. Any * overlength sequences or sequences that encode values above U+10FFFF * or between U+D800 and U+DFFF are considered invalid. */ static bool IsValidUTF8(const char *text, size_t l); //@} //@{ //! Get the name associated with the given UID. static const char *GetUIDName(const char *uid); //! Get the CID from the UID. unsigned short GetCIDFromUID(const char *uid); //@} protected: vtkDICOMUtilities() {} ~vtkDICOMUtilities() {} static long long GetLocalOffset(long long t); static char UIDPrefix[64]; static char ImplementationClassUID[65]; static char ImplementationVersionName[17]; private: #ifdef VTK_DICOM_DELETE vtkDICOMUtilities(const vtkDICOMUtilities&) VTK_DICOM_DELETE; void operator=(const vtkDICOMUtilities&) VTK_DICOM_DELETE; #else vtkDICOMUtilities(const vtkDICOMUtilities&) = delete; void operator=(const vtkDICOMUtilities&) = delete; #endif }; #endif /* vtkDICOMUtilities_h */ vtk-dicom-0.8.12/Source/vtkDICOMUtilitiesUIDTable.cxx000066400000000000000000004561141356440565500223010ustar00rootroot00000000000000/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/ #include "vtkDICOMUtilitiesUIDTable.h" namespace { struct UIDTableEntry { unsigned short Next; unsigned short Size; unsigned short First; unsigned short CID; const char *Name; }; const UIDTableEntry UIDTable[] = { { 1, 15, 1, 0, 0 }, { 16, 42, 1, 0, 0 }, { 169, 11, 6, 0, 0 }, { 192, 1, 1, 0, 0 }, { 218, 1, 2, 0, 0 }, { 219, 1, 1, 0, 0 }, { 1265, 1, 1, 0, 0 }, { 2571, 1, 1, 0, 0 }, { 2574, 1, 1, 0, 0 }, { 2576, 24, 1, 0, 0 }, { 2600, 4, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 2604, 2, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.1 "Verification SOP Class" }, { 58, 7, 1, 0, // 1.2.840.10008.1.2 "Implicit VR Little Endian" }, { 130, 1, 10, 0, 0 }, { 131, 3, 1, 0, 0 }, { 155, 8, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.9 (Retired) "Basic Study Content Notification SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 163, 2, 1, 0, // 1.2.840.10008.1.20 (Retired) "Papyrus 3 Implicit VR Little Endian" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 167, 1, 1, 0, // 1.2.840.10008.1.40 "Procedural Event Logging SOP Class" }, { 0, 0, 0, 0, 0 }, { 168, 1, 1, 0, // 1.2.840.10008.1.42 "Substance Administration Logging SOP Class" }, { 65, 1, 99, 0, // 1.2.840.10008.1.2.1 "Explicit VR Little Endian" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.2 (Retired) "Explicit VR Big Endian" }, { 0, 0, 0, 0, 0 }, { 66, 59, 50, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.5 "RLE Lossless" }, { 125, 2, 1, 0, 0 }, { 127, 3, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.1.99 "Deflated Explicit VR Little Endian" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.50 "JPEG Baseline (Process 1)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.51 "JPEG Extended (Process 2 & 4)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.52 (Retired) "JPEG Extended (Process 3 & 5)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.53 (Retired) "JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.54 (Retired) "JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.55 (Retired) "JPEG Full Progression, Non-Hierarchical (Process 10 & 12)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.56 (Retired) "JPEG Full Progression, Non-Hierarchical (Process 11 & 13)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.57 "JPEG Lossless, Non-Hierarchical (Process 14)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.58 (Retired) "JPEG Lossless, Non-Hierarchical (Process 15)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.59 (Retired) "JPEG Extended, Hierarchical (Process 16 & 18)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.60 (Retired) "JPEG Extended, Hierarchical (Process 17 & 19)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.61 (Retired) "JPEG Spectral Selection, Hierarchical (Process 20 & 22)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.62 (Retired) "JPEG Spectral Selection, Hierarchical (Process 21 & 23)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.63 (Retired) "JPEG Full Progression, Hierarchical (Process 24 & 26)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.64 (Retired) "JPEG Full Progression, Hierarchical (Process 25 & 27)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.65 (Retired) "JPEG Lossless, Hierarchical (Process 28)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.66 (Retired) "JPEG Lossless, Hierarchical (Process 29)" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.70 "JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.80 "JPEG-LS Lossless Image Compression" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.81 "JPEG-LS Lossy (Near-Lossless) Image Compression" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.90 "JPEG 2000 Image Compression (Lossless Only)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.91 "JPEG 2000 Image Compression" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.92 "JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.93 "JPEG 2000 Part 2 Multi-component Image Compression" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.94 "JPIP Referenced" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.95 "JPIP Referenced Deflate" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.100 "MPEG2 Main Profile / Main Level" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.101 "MPEG2 Main Profile / High Level" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.102 "MPEG-4 AVC/H.264 High Profile / Level 4.1" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.103 "MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.104 "MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.105 "MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.106 "MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.107 "HEVC/H.265 Main Profile / Level 5.1" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.108 "HEVC/H.265 Main 10 Profile / Level 5.1" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.6.1 (Retired) "RFC 2557 MIME encapsulation" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.6.2 (Retired) "XML Encoding" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.7.1 "SMPTE ST 2110-20 Uncompressed Progressive Active Video" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.7.2 "SMPTE ST 2110-20 Uncompressed Interlaced Active Video" }, { 0, 0, 0, 0, // 1.2.840.10008.1.2.7.3 "SMPTE ST 2110-30 PCM Digital Audio" }, { 0, 0, 0, 0, // 1.2.840.10008.1.3.10 "Media Storage Directory Storage" }, { 134, 18, 1, 0, 0 }, { 152, 2, 1, 0, 0 }, { 154, 1, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.1 "Talairach Brain Atlas Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.2 "SPM2 T1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.3 "SPM2 T2 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.4 "SPM2 PD Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.5 "SPM2 EPI Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.6 "SPM2 FIL T1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.7 "SPM2 PET Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.8 "SPM2 TRANSM Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.9 "SPM2 SPECT Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.10 "SPM2 GRAY Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.11 "SPM2 WHITE Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.12 "SPM2 CSF Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.13 "SPM2 BRAINMASK Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.14 "SPM2 AVG305T1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.15 "SPM2 AVG152T1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.16 "SPM2 AVG152T2 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.17 "SPM2 AVG152PD Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.18 "SPM2 SINGLESUBJT1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.2.1 "ICBM 452 T1 Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.2.2 "ICBM Single Subject MRI Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.4.3.1 "IEC 61217 Fixed Coordinate System Frame of Reference" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.1 "Hot Iron Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.2 "PET Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.3 "Hot Metal Blue Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.4 "PET 20 Step Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.5 "Spring Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.6 "Summer Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.7 "Fall Color Palette SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.5.8 "Winter Color Palette SOP Instance" }, { 165, 1, 1, 0, // 1.2.840.10008.1.20.1 "Storage Commitment Push Model SOP Class" }, { 166, 1, 1, 0, // 1.2.840.10008.1.20.2 (Retired) "Storage Commitment Pull Model SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.1.20.1.1 "Storage Commitment Push Model SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.20.2.1 (Retired) "Storage Commitment Pull Model SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.40.1 "Procedural Event Logging SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.1.42.1 "Substance Administration Logging SOP Instance" }, { 180, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 181, 11, 4, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.2.6.1 "DICOM UID Registry" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.4 "DICOM Controlled Terminology" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.5 "Adult Mouse Anatomy Ontology" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.6 "Uberon Ontology" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.7 "Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.8 "Mouse Genome Initiative (MGI)" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.9 "PubChem Compound CID" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.10 "ICD-11" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.11 "New York University Melanoma Clinical Cooperative Group" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.12 "Mayo Clinic Non-radiological Images Specific Body Structure Anatomical Surface Region Guide" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.13 "Image Biomarker Standardisation Initiative" }, { 0, 0, 0, 0, // 1.2.840.10008.2.16.14 "Radiomics Ontology" }, { 193, 2, 1, 0, 0 }, { 195, 1, 1, 0, 0 }, { 196, 6, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.1.1 "DICOM Application Context Name" }, { 202, 4, 1, 0, 0 }, { 206, 1, 1, 0, 0 }, { 207, 5, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 212, 5, 1, 0, 0 }, { 217, 1, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.1.1 (Retired) "Detached Patient Management SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.1.4 (Retired) "Detached Patient Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.2.1 (Retired) "Detached Visit Management SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.3.1 (Retired) "Detached Study Management SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.3.2 (Retired) "Study Component Management SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.3.3 "Modality Performed Procedure Step SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.3.4 "Modality Performed Procedure Step Retrieve SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.3.5 "Modality Performed Procedure Step Notification SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.5.1 (Retired) "Detached Results Management SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.5.4 (Retired) "Detached Results Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.5.5 (Retired) "Detached Study Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.6.1 (Retired) "Detached Interpretation Management SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.4.2 "Storage Service Class" }, { 220, 4, 1, 0, 0 }, { 224, 40, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 272, 45, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.1 "Basic Film Session SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.2 "Basic Film Box SOP Class" }, { 0, 0, 0, 0, 0 }, { 264, 2, 1, 0, // 1.2.840.10008.5.1.1.4 "Basic Grayscale Image Box SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 266, 1, 1, 0, // 1.2.840.10008.5.1.1.9 "Basic Grayscale Print Management Meta SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.14 "Print Job SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.15 "Basic Annotation Box SOP Class" }, { 267, 1, 376, 0, // 1.2.840.10008.5.1.1.16 "Printer SOP Class" }, { 268, 1, 376, 0, // 1.2.840.10008.5.1.1.17 "Printer SOP Instance" }, { 269, 1, 1, 0, // 1.2.840.10008.5.1.1.18 "Basic Color Print Management Meta SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.22 "VOI LUT Box SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.23 "Presentation LUT SOP Class" }, { 270, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired) "Image Overlay Box SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.25 (Retired) "Print Queue SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.26 (Retired) "Print Queue Management SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.27 (Retired) "Stored Print Storage SOP Class" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.29 (Retired) "Hardcopy Grayscale Image Storage SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.30 (Retired) "Hardcopy Color Image Storage SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.31 (Retired) "Pull Print Request SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.32 (Retired) "Pull Stored Print Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.33 "Media Creation Management SOP Class UID" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 271, 1, 1, 0, // 1.2.840.10008.5.1.1.40 "Display System SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.4.1 "Basic Color Image Box SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.4.2 (Retired) "Referenced Image Box SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.9.1 (Retired) "Referenced Grayscale Print Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.16.376 "Printer Configuration Retrieval SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.17.376 "Printer Configuration Retrieval SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.18.1 (Retired) "Referenced Color Print Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.24.1 (Retired) "Basic Print Image Overlay Box SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.40.1 "Display System SOP Instance" }, { 317, 2, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1217, 3, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.31 "Modality Worklist Information Model - FIND" }, { 1220, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired) "General Purpose Worklist Management Meta SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.33 "Instance Availability Notification SOP Class" }, { 1223, 10, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1242, 3, 1, 0, 0 }, { 1245, 4, 1, 0, 0 }, { 1249, 4, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.41 "Product Characteristics Query" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.42 "Substance Approval Query" }, { 1253, 4, 1, 0, 0 }, { 1257, 4, 1, 0, 0 }, { 1261, 4, 1, 0, 0 }, { 319, 601, 1, 0, 0 }, { 1200, 5, 1, 0, 0 }, { 920, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1 "Computed Radiography Image Storage" }, { 926, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2 "CT Image Storage" }, { 928, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired) "Ultrasound Multi-frame Image Storage" }, { 929, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4 "MR Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.5 (Retired) "Nuclear Medicine Image Storage" }, { 933, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired) "Ultrasound Image Storage" }, { 935, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7 "Secondary Capture Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.8 (Retired) "Standalone Overlay Storage" }, { 939, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired) "Standalone Curve Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.10 (Retired) "Standalone Modality LUT Storage" }, { 954, 11, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired) "Standalone VOI LUT Storage" }, { 965, 77, 1, 0, 0 }, { 1044, 1, 1, 0, 0 }, { 1050, 2, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.20 "Nuclear Medicine Image Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.30 "Parametric Map Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.40 (Retired) "1.2.840.10008.5.1.4.1.1.40" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1052, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66 "Raw Data Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.67 "Real World Value Mapping Storage" }, { 1058, 2, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1060, 2, 1, 0, 0 }, { 1079, 8, 1, 0, 0 }, { 1087, 1, 1, 0, 0 }, { 1088, 1, 1, 0, 0 }, { 1089, 1, 1, 0, 0 }, { 1090, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1091, 75, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1166, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1167, 3, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1170, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128 "Positron Emission Tomography Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.129 (Retired) "Standalone PET Curve Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.130 "Enhanced PET Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.131 "Basic Structured Display Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1171, 6, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1177, 13, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1190, 6, 1, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 1198, 2, 1, 0, 0 }, { 923, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1 "Digital X-Ray Image Storage - For Presentation" }, { 924, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2 "Digital Mammography X-Ray Image Storage - For Presentation" }, { 925, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3 "Digital Intra-Oral X-Ray Image Storage - For Presentation" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.1.1.1 "Digital X-Ray Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.1.2.1 "Digital Mammography X-Ray Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.1.3.1 "Digital Intra-Oral X-Ray Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.2.1 "Enhanced CT Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.2.2 "Legacy Converted Enhanced CT Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.3.1 "Ultrasound Multi-frame Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.4.1 "Enhanced MR Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.4.2 "MR Spectroscopy Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.4.3 "Enhanced MR Color Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.4.4 "Legacy Converted Enhanced MR Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.6.1 "Ultrasound Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.6.2 "Enhanced US Volume Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.1 "Multi-frame Single Bit Secondary Capture Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.2 "Multi-frame Grayscale Byte Secondary Capture Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.3 "Multi-frame Grayscale Word Secondary Capture Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.4 "Multi-frame True Color Secondary Capture Image Storage" }, { 945, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired) "Waveform Storage - Trial" }, { 948, 1, 1, 0, 0 }, { 949, 1, 1, 0, 0 }, { 950, 2, 1, 0, 0 }, { 952, 1, 1, 0, 0 }, { 953, 1, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.1 "12-lead ECG Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.2 "General ECG Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.3 "Ambulatory ECG Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.2.1 "Hemodynamic Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.3.1 "Cardiac Electrophysiology Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.4.1 "Basic Voice Audio Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.4.2 "General Audio Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.5.1 "Arterial Pulse Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.6.1 "Respiratory Waveform Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.1 "Grayscale Softcopy Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.2 "Color Softcopy Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.3 "Pseudo-Color Softcopy Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.4 "Blending Softcopy Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.5 "XA/XRF Grayscale Softcopy Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.6 "Grayscale Planar MPR Volumetric Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.7 "Compositing Planar MPR Volumetric Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.8 "Advanced Blending Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.9 "Volume Rendering Volumetric Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.10 "Segmented Volume Rendering Volumetric Presentation State Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.11 "Multiple Volume Rendering Volumetric Presentation State Storage" }, { 1042, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1 "X-Ray Angiographic Image Storage" }, { 1043, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2 "X-Ray Radiofluoroscopic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.3 (Retired) "X-Ray Angiographic Bi-Plane Image Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.77 (Retired) "1.2.840.10008.5.1.4.1.1.12.77" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.1.1 "Enhanced XA Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.2.1 "Enhanced XRF Image Storage" }, { 1045, 5, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.1 "X-Ray 3D Angiographic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.2 "X-Ray 3D Craniofacial Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.3 "Breast Tomosynthesis Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.4 "Breast Projection X-Ray Image Storage - For Presentation" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.5 "Breast Projection X-Ray Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.14.1 "Intravascular Optical Coherence Tomography Image Storage - For Presentation" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.14.2 "Intravascular Optical Coherence Tomography Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.1 "Spatial Registration Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.2 "Spatial Fiducials Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.3 "Deformable Spatial Registration Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.4 "Segmentation Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.5 "Surface Segmentation Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.6 "Tractography Results Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.1 "Surface Scan Mesh Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.2 "Surface Scan Point Cloud Storage" }, { 1062, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired) "VL Image Storage - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.2 (Retired) "VL Multi-frame Image Storage - Trial" }, { 1068, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1 "VL Endoscopic Image Storage" }, { 1069, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2 "VL Microscopic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.3 "VL Slide-Coordinates Microscopic Image Storage" }, { 1070, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4 "VL Photographic Image Storage" }, { 1071, 8, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.6 "VL Whole Slide Microscopy Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1.1 "Video Endoscopic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2.1 "Video Microscopic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4.1 "Video Photographic Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.1 "Ophthalmic Photography 8 Bit Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.2 "Ophthalmic Photography 16 Bit Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.3 "Stereometric Relationship Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.4 "Ophthalmic Tomography Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.5 "Wide Field Ophthalmic Photography Stereographic Projection Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.6 "Wide Field Ophthalmic Photography 3D Coordinates Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.7 "Ophthalmic Optical Coherence Tomography En Face Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.5.8 "Ophthalmic Optical Coherence Tomography B-scan Volume Analysis Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.1 "Lensometry Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.2 "Autorefraction Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.3 "Keratometry Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.4 "Subjective Refraction Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.5 "Visual Acuity Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.6 "Spectacle Prescription Report Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.7 "Ophthalmic Axial Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.78.8 "Intraocular Lens Calculations Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.79.1 "Macular Grid Thickness and Volume Report Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.80.1 "Ophthalmic Visual Field Static Perimetry Measurements Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.81.1 "Ophthalmic Thickness Map Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.82.1 "Corneal Topography Map Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.1 (Retired) "Text SR Storage - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.2 (Retired) "Audio SR Storage - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.3 (Retired) "Detail SR Storage - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.4 (Retired) "Comprehensive SR Storage - Trial" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.11 "Basic Text SR Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.22 "Enhanced SR Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.33 "Comprehensive SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.34 "Comprehensive 3D SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.35 "Extensible SR Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.40 "Procedure Log Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.50 "Mammography CAD SR Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.59 "Key Object Selection Document Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.65 "Chest CAD SR Storage" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.67 "X-Ray Radiation Dose SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.68 "Radiopharmaceutical Radiation Dose SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.69 "Colon CAD SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.70 "Implantation Plan SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.71 "Acquisition Context SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.72 "Simplified Adult Echo SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.73 "Patient Radiation Dose SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.74 "Planned Imaging Agent Administration SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.75 "Performed Imaging Agent Administrator SR Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.90.1 "Content Assessment Results Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.1 "Encapsulated PDF Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.2 "Encapsulated CDA Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.3 "Encapsulated STL Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.128.1 "Legacy Converted Enhanced PET Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.1 "CT Defined Procedure Protocol Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.2 "CT Performed Procedure Protocol Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.3 "Protocol Approval Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.4 "Protocol Approval Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.5 "Protocol Approval Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.200.6 "Protocol Approval Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.1 "RT Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.2 "RT Dose Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.3 "RT Structure Set Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.4 "RT Beams Treatment Record Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.5 "RT Plan Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.6 "RT Brachy Treatment Record Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.7 "RT Treatment Summary Record Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.8 "RT Ion Plan Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.9 "RT Ion Beams Treatment Record Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.10 "RT Physician Intent Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.11 "RT Segment Annotation Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.12 "RT Radiation Set Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.13 "C-Arm Photon-Electron Radiation Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.1 "DICOS CT Image Storage" }, { 1196, 2, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.3 "DICOS Threat Detection Report Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.4 "DICOS 2D AIT Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.5 "DICOS 3D AIT Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.6 "DICOS Quadrupole Resonance (QR) Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.2.1 "DICOS Digital X-Ray Image Storage - For Presentation" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.2.2 "DICOS Digital X-Ray Image Storage - For Processing" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.601.1 "Eddy Current Image Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.601.2 "Eddy Current Multi-frame Image Storage" }, { 1205, 3, 1, 0, 0 }, { 1208, 3, 1, 0, 0 }, { 1211, 3, 1, 0, 0 }, { 1214, 2, 2, 0, 0 }, { 1216, 1, 3, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.1 "Patient Root Query/Retrieve Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.2 "Patient Root Query/Retrieve Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.3 "Patient Root Query/Retrieve Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.2.1 "Study Root Query/Retrieve Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.2.2 "Study Root Query/Retrieve Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.2.3 "Study Root Query/Retrieve Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.3.1 (Retired) "Patient/Study Only Query/Retrieve Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.3.2 (Retired) "Patient/Study Only Query/Retrieve Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.3.3 (Retired) "Patient/Study Only Query/Retrieve Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.4.2 "Composite Instance Root Retrieve - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.4.3 "Composite Instance Root Retrieve - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.5.3 "Composite Instance Retrieve Without Bulk Data - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.20.1 "Defined Procedure Protocol Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.20.2 "Defined Procedure Protocol Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.20.3 "Defined Procedure Protocol Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.32.1 (Retired) "General Purpose Worklist Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.32.2 (Retired) "General Purpose Scheduled Procedure Step SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.32.3 (Retired) "General Purpose Performed Procedure Step SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.1 (Retired) "RT Beams Delivery Instruction Storage - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.2 (Retired) "RT Conventional Machine Verification - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.3 (Retired) "RT Ion Machine Verification - Trial" }, { 1233, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired) "Unified Worklist and Procedure Step Service Class - Trial" }, { 1237, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5 "UPS Global Subscription SOP Instance" }, { 1238, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6 "Unified Worklist and Procedure Step Service Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.7 "RT Beams Delivery Instruction Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.8 "RT Conventional Machine Verification" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.9 "RT Ion Machine Verification" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.10 "RT Brachy Application Setup Delivery Instruction Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.1 (Retired) "Unified Procedure Step - Push SOP Class - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.2 (Retired) "Unified Procedure Step - Watch SOP Class - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.3 (Retired) "Unified Procedure Step - Pull SOP Class - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.4 (Retired) "Unified Procedure Step - Event SOP Class - Trial" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.5.1 "UPS Filtered Global Subscription SOP Instance" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.6.1 "Unified Procedure Step - Push SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.6.2 "Unified Procedure Step - Watch SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.6.3 "Unified Procedure Step - Pull SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.6.4 "Unified Procedure Step - Event SOP Class" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.37.1 "General Relevant Patient Information Query" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.37.2 "Breast Imaging Relevant Patient Information Query" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.37.3 "Cardiac Relevant Patient Information Query" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.38.1 "Hanging Protocol Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.38.2 "Hanging Protocol Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.38.3 "Hanging Protocol Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.38.4 "Hanging Protocol Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.39.1 "Color Palette Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.39.2 "Color Palette Query/Retrieve Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.39.3 "Color Palette Query/Retrieve Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.39.4 "Color Palette Query/Retrieve Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.43.1 "Generic Implant Template Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.43.2 "Generic Implant Template Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.43.3 "Generic Implant Template Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.43.4 "Generic Implant Template Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.44.1 "Implant Assembly Template Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.44.2 "Implant Assembly Template Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.44.3 "Implant Assembly Template Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.44.4 "Implant Assembly Template Information Model - GET" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.1 "Implant Template Group Storage" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.2 "Implant Template Group Information Model - FIND" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.3 "Implant Template Group Information Model - MOVE" }, { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.4 "Implant Template Group Information Model - GET" }, { 1266, 1305, 1, 0, 0 }, { 0, 0, 0, 2, // 1.2.840.10008.6.1.1 "Anatomic Modifier" }, { 0, 0, 0, 4, // 1.2.840.10008.6.1.2 "Anatomic Region" }, { 0, 0, 0, 5, // 1.2.840.10008.6.1.3 "Transducer Approach" }, { 0, 0, 0, 6, // 1.2.840.10008.6.1.4 "Transducer Orientation" }, { 0, 0, 0, 7, // 1.2.840.10008.6.1.5 "Ultrasound Beam Path" }, { 0, 0, 0, 8, // 1.2.840.10008.6.1.6 "Angiographic Interventional Devices" }, { 0, 0, 0, 9, // 1.2.840.10008.6.1.7 "Image Guided Therapeutic Procedures" }, { 0, 0, 0, 10, // 1.2.840.10008.6.1.8 "Interventional Drug" }, { 0, 0, 0, 11, // 1.2.840.10008.6.1.9 "Route of Administration" }, { 0, 0, 0, 12, // 1.2.840.10008.6.1.10 "Radiographic Contrast Agent" }, { 0, 0, 0, 13, // 1.2.840.10008.6.1.11 "Radiographic Contrast Agent Ingredient" }, { 0, 0, 0, 18, // 1.2.840.10008.6.1.12 "Isotopes in Radiopharmaceuticals" }, { 0, 0, 0, 19, // 1.2.840.10008.6.1.13 "Patient Orientation" }, { 0, 0, 0, 20, // 1.2.840.10008.6.1.14 "Patient Orientation Modifier" }, { 0, 0, 0, 21, // 1.2.840.10008.6.1.15 "Patient Equipment Relationship" }, { 0, 0, 0, 23, // 1.2.840.10008.6.1.16 "Cranio-Caudad Angulation" }, { 0, 0, 0, 25, // 1.2.840.10008.6.1.17 "Radiopharmaceuticals" }, { 0, 0, 0, 26, // 1.2.840.10008.6.1.18 "Nuclear Medicine Projections" }, { 0, 0, 0, 29, // 1.2.840.10008.6.1.19 "Acquisition Modality" }, { 0, 0, 0, 30, // 1.2.840.10008.6.1.20 "DICOM Devices" }, { 0, 0, 0, 31, // 1.2.840.10008.6.1.21 "Abstract Priors" }, { 0, 0, 0, 42, // 1.2.840.10008.6.1.22 "Numeric Value Qualifier" }, { 0, 0, 0, 82, // 1.2.840.10008.6.1.23 "Units of Measurement" }, { 0, 0, 0, 83, // 1.2.840.10008.6.1.24 "Units for Real World Value Mapping" }, { 0, 0, 0, 220, // 1.2.840.10008.6.1.25 "Level of Significance" }, { 0, 0, 0, 221, // 1.2.840.10008.6.1.26 "Measurement Range Concepts" }, { 0, 0, 0, 222, // 1.2.840.10008.6.1.27 "Normality Codes" }, { 0, 0, 0, 223, // 1.2.840.10008.6.1.28 "Normal Range Values" }, { 0, 0, 0, 224, // 1.2.840.10008.6.1.29 "Selection Method" }, { 0, 0, 0, 225, // 1.2.840.10008.6.1.30 "Measurement Uncertainty Concepts" }, { 0, 0, 0, 226, // 1.2.840.10008.6.1.31 "Population Statistical Descriptors" }, { 0, 0, 0, 227, // 1.2.840.10008.6.1.32 "Sample Statistical Descriptors" }, { 0, 0, 0, 228, // 1.2.840.10008.6.1.33 "Equation or Table" }, { 0, 0, 0, 230, // 1.2.840.10008.6.1.34 "Yes-No" }, { 0, 0, 0, 240, // 1.2.840.10008.6.1.35 "Present-Absent" }, { 0, 0, 0, 242, // 1.2.840.10008.6.1.36 "Normal-Abnormal" }, { 0, 0, 0, 244, // 1.2.840.10008.6.1.37 "Laterality" }, { 0, 0, 0, 250, // 1.2.840.10008.6.1.38 "Positive-Negative" }, { 0, 0, 0, 251, // 1.2.840.10008.6.1.39 "Severity of Complication" }, { 0, 0, 0, 270, // 1.2.840.10008.6.1.40 "Observer Type" }, { 0, 0, 0, 271, // 1.2.840.10008.6.1.41 "Observation Subject Class" }, { 0, 0, 0, 3000, // 1.2.840.10008.6.1.42 "Audio Channel Source" }, { 0, 0, 0, 3001, // 1.2.840.10008.6.1.43 "ECG Leads" }, { 0, 0, 0, 3003, // 1.2.840.10008.6.1.44 "Hemodynamic Waveform Sources" }, { 0, 0, 0, 3010, // 1.2.840.10008.6.1.45 "Cardiovascular Anatomic Locations" }, { 0, 0, 0, 3011, // 1.2.840.10008.6.1.46 "Electrophysiology Anatomic Locations" }, { 0, 0, 0, 3014, // 1.2.840.10008.6.1.47 "Coronary Artery Segments" }, { 0, 0, 0, 3015, // 1.2.840.10008.6.1.48 "Coronary Arteries" }, { 0, 0, 0, 3019, // 1.2.840.10008.6.1.49 "Cardiovascular Anatomic Location Modifiers" }, { 0, 0, 0, 3082, // 1.2.840.10008.6.1.50 (Retired) "Cardiology Units of Measurement" }, { 0, 0, 0, 3090, // 1.2.840.10008.6.1.51 "Time Synchronization Channel Types" }, { 0, 0, 0, 3101, // 1.2.840.10008.6.1.52 "Cardiac Procedural State Values" }, { 0, 0, 0, 3240, // 1.2.840.10008.6.1.53 "Electrophysiology Measurement Functions and Techniques" }, { 0, 0, 0, 3241, // 1.2.840.10008.6.1.54 "Hemodynamic Measurement Techniques" }, { 0, 0, 0, 3250, // 1.2.840.10008.6.1.55 "Catheterization Procedure Phase" }, { 0, 0, 0, 3254, // 1.2.840.10008.6.1.56 "Electrophysiology Procedure Phase" }, { 0, 0, 0, 3261, // 1.2.840.10008.6.1.57 "Stress Protocols" }, { 0, 0, 0, 3262, // 1.2.840.10008.6.1.58 "ECG Patient State Values" }, { 0, 0, 0, 3263, // 1.2.840.10008.6.1.59 "Electrode Placement Values" }, { 0, 0, 0, 3264, // 1.2.840.10008.6.1.60 (Retired) "XYZ Electrode Placement Values" }, { 0, 0, 0, 3271, // 1.2.840.10008.6.1.61 "Hemodynamic Physiological Challenges" }, { 0, 0, 0, 3335, // 1.2.840.10008.6.1.62 "ECG Annotations" }, { 0, 0, 0, 3337, // 1.2.840.10008.6.1.63 "Hemodynamic Annotations" }, { 0, 0, 0, 3339, // 1.2.840.10008.6.1.64 "Electrophysiology Annotations" }, { 0, 0, 0, 3400, // 1.2.840.10008.6.1.65 "Procedure Log Titles" }, { 0, 0, 0, 3401, // 1.2.840.10008.6.1.66 "Types of Log Notes" }, { 0, 0, 0, 3402, // 1.2.840.10008.6.1.67 "Patient Status and Events" }, { 0, 0, 0, 3403, // 1.2.840.10008.6.1.68 "Percutaneous Entry" }, { 0, 0, 0, 3404, // 1.2.840.10008.6.1.69 "Staff Actions" }, { 0, 0, 0, 3405, // 1.2.840.10008.6.1.70 "Procedure Action Values" }, { 0, 0, 0, 3406, // 1.2.840.10008.6.1.71 "Non-coronary Transcatheter Interventions" }, { 0, 0, 0, 3407, // 1.2.840.10008.6.1.72 "Purpose of Reference to Object" }, { 0, 0, 0, 3408, // 1.2.840.10008.6.1.73 "Actions With Consumables" }, { 0, 0, 0, 3409, // 1.2.840.10008.6.1.74 "Administration of Drugs/Contrast" }, { 0, 0, 0, 3410, // 1.2.840.10008.6.1.75 "Numeric Parameters of Drugs/Contrast" }, { 0, 0, 0, 3411, // 1.2.840.10008.6.1.76 "Intracoronary Devices" }, { 0, 0, 0, 3412, // 1.2.840.10008.6.1.77 "Intervention Actions and Status" }, { 0, 0, 0, 3413, // 1.2.840.10008.6.1.78 "Adverse Outcomes" }, { 0, 0, 0, 3414, // 1.2.840.10008.6.1.79 "Procedure Urgency" }, { 0, 0, 0, 3415, // 1.2.840.10008.6.1.80 "Cardiac Rhythms" }, { 0, 0, 0, 3416, // 1.2.840.10008.6.1.81 "Respiration Rhythms" }, { 0, 0, 0, 3418, // 1.2.840.10008.6.1.82 "Lesion Risk" }, { 0, 0, 0, 3419, // 1.2.840.10008.6.1.83 "Findings Titles" }, { 0, 0, 0, 3421, // 1.2.840.10008.6.1.84 "Procedure Action" }, { 0, 0, 0, 3422, // 1.2.840.10008.6.1.85 "Device Use Actions" }, { 0, 0, 0, 3423, // 1.2.840.10008.6.1.86 "Numeric Device Characteristics" }, { 0, 0, 0, 3425, // 1.2.840.10008.6.1.87 "Intervention Parameters" }, { 0, 0, 0, 3426, // 1.2.840.10008.6.1.88 "Consumables Parameters" }, { 0, 0, 0, 3427, // 1.2.840.10008.6.1.89 "Equipment Events" }, { 0, 0, 0, 3428, // 1.2.840.10008.6.1.90 "Imaging Procedures" }, { 0, 0, 0, 3429, // 1.2.840.10008.6.1.91 "Catheterization Devices" }, { 0, 0, 0, 3430, // 1.2.840.10008.6.1.92 "DateTime Qualifiers" }, { 0, 0, 0, 3440, // 1.2.840.10008.6.1.93 "Peripheral Pulse Locations" }, { 0, 0, 0, 3441, // 1.2.840.10008.6.1.94 "Patient Assessments" }, { 0, 0, 0, 3442, // 1.2.840.10008.6.1.95 "Peripheral Pulse Methods" }, { 0, 0, 0, 3446, // 1.2.840.10008.6.1.96 "Skin Condition" }, { 0, 0, 0, 3448, // 1.2.840.10008.6.1.97 "Airway Assessment" }, { 0, 0, 0, 3451, // 1.2.840.10008.6.1.98 "Calibration Objects" }, { 0, 0, 0, 3452, // 1.2.840.10008.6.1.99 "Calibration Methods" }, { 0, 0, 0, 3453, // 1.2.840.10008.6.1.100 "Cardiac Volume Methods" }, { 0, 0, 0, 3455, // 1.2.840.10008.6.1.101 "Index Methods" }, { 0, 0, 0, 3456, // 1.2.840.10008.6.1.102 "Sub-segment Methods" }, { 0, 0, 0, 3458, // 1.2.840.10008.6.1.103 "Contour Realignment" }, { 0, 0, 0, 3460, // 1.2.840.10008.6.1.104 "Circumferential Extent" }, { 0, 0, 0, 3461, // 1.2.840.10008.6.1.105 "Regional Extent" }, { 0, 0, 0, 3462, // 1.2.840.10008.6.1.106 "Chamber Identification" }, { 0, 0, 0, 3465, // 1.2.840.10008.6.1.107 "QA Reference Methods" }, { 0, 0, 0, 3466, // 1.2.840.10008.6.1.108 "Plane Identification" }, { 0, 0, 0, 3467, // 1.2.840.10008.6.1.109 "Ejection Fraction" }, { 0, 0, 0, 3468, // 1.2.840.10008.6.1.110 "ED Volume" }, { 0, 0, 0, 3469, // 1.2.840.10008.6.1.111 "ES Volume" }, { 0, 0, 0, 3470, // 1.2.840.10008.6.1.112 "Vessel Lumen Cross-sectional Area Calculation Methods" }, { 0, 0, 0, 3471, // 1.2.840.10008.6.1.113 "Estimated Volumes" }, { 0, 0, 0, 3472, // 1.2.840.10008.6.1.114 "Cardiac Contraction Phase" }, { 0, 0, 0, 3480, // 1.2.840.10008.6.1.115 "IVUS Procedure Phases" }, { 0, 0, 0, 3481, // 1.2.840.10008.6.1.116 "IVUS Distance Measurements" }, { 0, 0, 0, 3482, // 1.2.840.10008.6.1.117 "IVUS Area Measurements" }, { 0, 0, 0, 3483, // 1.2.840.10008.6.1.118 "IVUS Longitudinal Measurements" }, { 0, 0, 0, 3484, // 1.2.840.10008.6.1.119 "IVUS Indices and Ratios" }, { 0, 0, 0, 3485, // 1.2.840.10008.6.1.120 "IVUS Volume Measurements" }, { 0, 0, 0, 3486, // 1.2.840.10008.6.1.121 "Vascular Measurement Sites" }, { 0, 0, 0, 3487, // 1.2.840.10008.6.1.122 "Intravascular Volumetric Regions" }, { 0, 0, 0, 3488, // 1.2.840.10008.6.1.123 "Min/Max/Mean" }, { 0, 0, 0, 3489, // 1.2.840.10008.6.1.124 "Calcium Distribution" }, { 0, 0, 0, 3491, // 1.2.840.10008.6.1.125 "IVUS Lesion Morphologies" }, { 0, 0, 0, 3492, // 1.2.840.10008.6.1.126 "Vascular Dissection Classifications" }, { 0, 0, 0, 3493, // 1.2.840.10008.6.1.127 "IVUS Relative Stenosis Severities" }, { 0, 0, 0, 3494, // 1.2.840.10008.6.1.128 "IVUS Non Morphological Findings" }, { 0, 0, 0, 3495, // 1.2.840.10008.6.1.129 "IVUS Plaque Composition" }, { 0, 0, 0, 3496, // 1.2.840.10008.6.1.130 "IVUS Fiducial Points" }, { 0, 0, 0, 3497, // 1.2.840.10008.6.1.131 "IVUS Arterial Morphology" }, { 0, 0, 0, 3500, // 1.2.840.10008.6.1.132 "Pressure Units" }, { 0, 0, 0, 3502, // 1.2.840.10008.6.1.133 "Hemodynamic Resistance Units" }, { 0, 0, 0, 3503, // 1.2.840.10008.6.1.134 "Indexed Hemodynamic Resistance Units" }, { 0, 0, 0, 3510, // 1.2.840.10008.6.1.135 "Catheter Size Units" }, { 0, 0, 0, 3515, // 1.2.840.10008.6.1.136 "Specimen Collection" }, { 0, 0, 0, 3520, // 1.2.840.10008.6.1.137 "Blood Source Type" }, { 0, 0, 0, 3524, // 1.2.840.10008.6.1.138 "Blood Gas Pressures" }, { 0, 0, 0, 3525, // 1.2.840.10008.6.1.139 "Blood Gas Content" }, { 0, 0, 0, 3526, // 1.2.840.10008.6.1.140 "Blood Gas Saturation" }, { 0, 0, 0, 3527, // 1.2.840.10008.6.1.141 "Blood Base Excess" }, { 0, 0, 0, 3528, // 1.2.840.10008.6.1.142 "Blood pH" }, { 0, 0, 0, 3529, // 1.2.840.10008.6.1.143 "Arterial / Venous Content" }, { 0, 0, 0, 3530, // 1.2.840.10008.6.1.144 "Oxygen Administration Actions" }, { 0, 0, 0, 3531, // 1.2.840.10008.6.1.145 "Oxygen Administration" }, { 0, 0, 0, 3550, // 1.2.840.10008.6.1.146 "Circulatory Support Actions" }, { 0, 0, 0, 3551, // 1.2.840.10008.6.1.147 "Ventilation Actions" }, { 0, 0, 0, 3552, // 1.2.840.10008.6.1.148 "Pacing Actions" }, { 0, 0, 0, 3553, // 1.2.840.10008.6.1.149 "Circulatory Support" }, { 0, 0, 0, 3554, // 1.2.840.10008.6.1.150 "Ventilation" }, { 0, 0, 0, 3555, // 1.2.840.10008.6.1.151 "Pacing" }, { 0, 0, 0, 3560, // 1.2.840.10008.6.1.152 "Blood Pressure Methods" }, { 0, 0, 0, 3600, // 1.2.840.10008.6.1.153 "Relative Times" }, { 0, 0, 0, 3602, // 1.2.840.10008.6.1.154 "Hemodynamic Patient State" }, { 0, 0, 0, 3604, // 1.2.840.10008.6.1.155 "Arterial Lesion Locations" }, { 0, 0, 0, 3606, // 1.2.840.10008.6.1.156 "Arterial Source Locations" }, { 0, 0, 0, 3607, // 1.2.840.10008.6.1.157 "Venous Source Locations" }, { 0, 0, 0, 3608, // 1.2.840.10008.6.1.158 "Atrial Source Locations" }, { 0, 0, 0, 3609, // 1.2.840.10008.6.1.159 "Ventricular Source Locations" }, { 0, 0, 0, 3610, // 1.2.840.10008.6.1.160 "Gradient Source Locations" }, { 0, 0, 0, 3611, // 1.2.840.10008.6.1.161 "Pressure Measurements" }, { 0, 0, 0, 3612, // 1.2.840.10008.6.1.162 "Blood Velocity Measurements" }, { 0, 0, 0, 3613, // 1.2.840.10008.6.1.163 "Hemodynamic Time Measurements" }, { 0, 0, 0, 3614, // 1.2.840.10008.6.1.164 "Valve Areas, Non-mitral" }, { 0, 0, 0, 3615, // 1.2.840.10008.6.1.165 "Valve Areas" }, { 0, 0, 0, 3616, // 1.2.840.10008.6.1.166 "Hemodynamic Period Measurements" }, { 0, 0, 0, 3617, // 1.2.840.10008.6.1.167 "Valve Flows" }, { 0, 0, 0, 3618, // 1.2.840.10008.6.1.168 "Hemodynamic Flows" }, { 0, 0, 0, 3619, // 1.2.840.10008.6.1.169 "Hemodynamic Resistance Measurements" }, { 0, 0, 0, 3620, // 1.2.840.10008.6.1.170 "Hemodynamic Ratios" }, { 0, 0, 0, 3621, // 1.2.840.10008.6.1.171 "Fractional Flow Reserve" }, { 0, 0, 0, 3627, // 1.2.840.10008.6.1.172 "Measurement Type" }, { 0, 0, 0, 3628, // 1.2.840.10008.6.1.173 "Cardiac Output Methods" }, { 0, 0, 0, 3629, // 1.2.840.10008.6.1.174 "Procedure Intent" }, { 0, 0, 0, 3630, // 1.2.840.10008.6.1.175 "Cardiovascular Anatomic Locations" }, { 0, 0, 0, 3640, // 1.2.840.10008.6.1.176 "Hypertension" }, { 0, 0, 0, 3641, // 1.2.840.10008.6.1.177 "Hemodynamic Assessments" }, { 0, 0, 0, 3642, // 1.2.840.10008.6.1.178 "Degree Findings" }, { 0, 0, 0, 3651, // 1.2.840.10008.6.1.179 "Hemodynamic Measurement Phase" }, { 0, 0, 0, 3663, // 1.2.840.10008.6.1.180 "Body Surface Area Equations" }, { 0, 0, 0, 3664, // 1.2.840.10008.6.1.181 "Oxygen Consumption Equations and Tables" }, { 0, 0, 0, 3666, // 1.2.840.10008.6.1.182 "P50 Equations" }, { 0, 0, 0, 3667, // 1.2.840.10008.6.1.183 "Framingham Scores" }, { 0, 0, 0, 3668, // 1.2.840.10008.6.1.184 "Framingham Tables" }, { 0, 0, 0, 3670, // 1.2.840.10008.6.1.185 "ECG Procedure Types" }, { 0, 0, 0, 3671, // 1.2.840.10008.6.1.186 "Reason for ECG Exam" }, { 0, 0, 0, 3672, // 1.2.840.10008.6.1.187 "Pacemakers" }, { 0, 0, 0, 3673, // 1.2.840.10008.6.1.188 (Retired) "Diagnosis" }, { 0, 0, 0, 3675, // 1.2.840.10008.6.1.189 (Retired) "Other Filters" }, { 0, 0, 0, 3676, // 1.2.840.10008.6.1.190 "Lead Measurement Technique" }, { 0, 0, 0, 3677, // 1.2.840.10008.6.1.191 "Summary Codes ECG" }, { 0, 0, 0, 3678, // 1.2.840.10008.6.1.192 "QT Correction Algorithms" }, { 0, 0, 0, 3679, // 1.2.840.10008.6.1.193 (Retired) "ECG Morphology Descriptions" }, { 0, 0, 0, 3680, // 1.2.840.10008.6.1.194 "ECG Lead Noise Descriptions" }, { 0, 0, 0, 3681, // 1.2.840.10008.6.1.195 (Retired) "ECG Lead Noise Modifiers" }, { 0, 0, 0, 3682, // 1.2.840.10008.6.1.196 (Retired) "Probability" }, { 0, 0, 0, 3683, // 1.2.840.10008.6.1.197 (Retired) "Modifiers" }, { 0, 0, 0, 3684, // 1.2.840.10008.6.1.198 (Retired) "Trend" }, { 0, 0, 0, 3685, // 1.2.840.10008.6.1.199 (Retired) "Conjunctive Terms" }, { 0, 0, 0, 3686, // 1.2.840.10008.6.1.200 (Retired) "ECG Interpretive Statements" }, { 0, 0, 0, 3687, // 1.2.840.10008.6.1.201 "Electrophysiology Waveform Durations" }, { 0, 0, 0, 3688, // 1.2.840.10008.6.1.202 "Electrophysiology Waveform Voltages" }, { 0, 0, 0, 3700, // 1.2.840.10008.6.1.203 "Cath Diagnosis" }, { 0, 0, 0, 3701, // 1.2.840.10008.6.1.204 "Cardiac Valves and Tracts" }, { 0, 0, 0, 3703, // 1.2.840.10008.6.1.205 "Wall Motion" }, { 0, 0, 0, 3704, // 1.2.840.10008.6.1.206 "Myocardium Wall Morphology Findings" }, { 0, 0, 0, 3705, // 1.2.840.10008.6.1.207 "Chamber Size" }, { 0, 0, 0, 3706, // 1.2.840.10008.6.1.208 "Overall Contractility" }, { 0, 0, 0, 3707, // 1.2.840.10008.6.1.209 "VSD Description" }, { 0, 0, 0, 3709, // 1.2.840.10008.6.1.210 "Aortic Root Description" }, { 0, 0, 0, 3710, // 1.2.840.10008.6.1.211 "Coronary Dominance" }, { 0, 0, 0, 3711, // 1.2.840.10008.6.1.212 "Valvular Abnormalities" }, { 0, 0, 0, 3712, // 1.2.840.10008.6.1.213 "Vessel Descriptors" }, { 0, 0, 0, 3713, // 1.2.840.10008.6.1.214 "TIMI Flow Characteristics" }, { 0, 0, 0, 3714, // 1.2.840.10008.6.1.215 "Thrombus" }, { 0, 0, 0, 3715, // 1.2.840.10008.6.1.216 "Lesion Margin" }, { 0, 0, 0, 3716, // 1.2.840.10008.6.1.217 "Severity" }, { 0, 0, 0, 3717, // 1.2.840.10008.6.1.218 "Myocardial Wall Segments" }, { 0, 0, 0, 3718, // 1.2.840.10008.6.1.219 "Myocardial Wall Segments in Projection" }, { 0, 0, 0, 3719, // 1.2.840.10008.6.1.220 "Canadian Clinical Classification" }, { 0, 0, 0, 3720, // 1.2.840.10008.6.1.221 (Retired) "Cardiac History Dates" }, { 0, 0, 0, 3721, // 1.2.840.10008.6.1.222 "Cardiovascular Surgeries" }, { 0, 0, 0, 3722, // 1.2.840.10008.6.1.223 "Diabetic Therapy" }, { 0, 0, 0, 3723, // 1.2.840.10008.6.1.224 "MI Types" }, { 0, 0, 0, 3724, // 1.2.840.10008.6.1.225 "Smoking History" }, { 0, 0, 0, 3726, // 1.2.840.10008.6.1.226 "Indications for Coronary Intervention" }, { 0, 0, 0, 3727, // 1.2.840.10008.6.1.227 "Indications for Catheterization" }, { 0, 0, 0, 3728, // 1.2.840.10008.6.1.228 "Cath Findings" }, { 0, 0, 0, 3729, // 1.2.840.10008.6.1.229 "Admission Status" }, { 0, 0, 0, 3730, // 1.2.840.10008.6.1.230 "Insurance Payor" }, { 0, 0, 0, 3733, // 1.2.840.10008.6.1.231 "Primary Cause of Death" }, { 0, 0, 0, 3735, // 1.2.840.10008.6.1.232 "Acute Coronary Syndrome Time Period" }, { 0, 0, 0, 3736, // 1.2.840.10008.6.1.233 "NYHA Classification" }, { 0, 0, 0, 3737, // 1.2.840.10008.6.1.234 "Non-invasive Test - Ischemia" }, { 0, 0, 0, 3738, // 1.2.840.10008.6.1.235 "Pre-Cath Angina Type" }, { 0, 0, 0, 3739, // 1.2.840.10008.6.1.236 "Cath Procedure Type" }, { 0, 0, 0, 3740, // 1.2.840.10008.6.1.237 "Thrombolytic Administration" }, { 0, 0, 0, 3741, // 1.2.840.10008.6.1.238 "Medication Administration, Lab Visit" }, { 0, 0, 0, 3742, // 1.2.840.10008.6.1.239 "Medication Administration, PCI" }, { 0, 0, 0, 3743, // 1.2.840.10008.6.1.240 "Clopidogrel/Ticlopidine Administration" }, { 0, 0, 0, 3744, // 1.2.840.10008.6.1.241 "EF Testing Method" }, { 0, 0, 0, 3745, // 1.2.840.10008.6.1.242 "Calculation Method" }, { 0, 0, 0, 3746, // 1.2.840.10008.6.1.243 "Percutaneous Entry Site" }, { 0, 0, 0, 3747, // 1.2.840.10008.6.1.244 "Percutaneous Closure" }, { 0, 0, 0, 3748, // 1.2.840.10008.6.1.245 "Angiographic EF Testing Method" }, { 0, 0, 0, 3749, // 1.2.840.10008.6.1.246 "PCI Procedure Result" }, { 0, 0, 0, 3750, // 1.2.840.10008.6.1.247 "Previously Dilated Lesion" }, { 0, 0, 0, 3752, // 1.2.840.10008.6.1.248 "Guidewire Crossing" }, { 0, 0, 0, 3754, // 1.2.840.10008.6.1.249 "Vascular Complications" }, { 0, 0, 0, 3755, // 1.2.840.10008.6.1.250 "Cath Complications" }, { 0, 0, 0, 3756, // 1.2.840.10008.6.1.251 "Cardiac Patient Risk Factors" }, { 0, 0, 0, 3757, // 1.2.840.10008.6.1.252 "Cardiac Diagnostic Procedures" }, { 0, 0, 0, 3758, // 1.2.840.10008.6.1.253 "Cardiovascular Family History" }, { 0, 0, 0, 3760, // 1.2.840.10008.6.1.254 "Hypertension Therapy" }, { 0, 0, 0, 3761, // 1.2.840.10008.6.1.255 "Antilipemic Agents" }, { 0, 0, 0, 3762, // 1.2.840.10008.6.1.256 "Antiarrhythmic Agents" }, { 0, 0, 0, 3764, // 1.2.840.10008.6.1.257 "Myocardial Infarction Therapies" }, { 0, 0, 0, 3769, // 1.2.840.10008.6.1.258 "Concern Types" }, { 0, 0, 0, 3770, // 1.2.840.10008.6.1.259 "Problem Status" }, { 0, 0, 0, 3772, // 1.2.840.10008.6.1.260 "Health Status" }, { 0, 0, 0, 3773, // 1.2.840.10008.6.1.261 "Use Status" }, { 0, 0, 0, 3774, // 1.2.840.10008.6.1.262 "Social History" }, { 0, 0, 0, 3777, // 1.2.840.10008.6.1.263 "Implanted Devices" }, { 0, 0, 0, 3802, // 1.2.840.10008.6.1.264 "Plaque Structures" }, { 0, 0, 0, 3804, // 1.2.840.10008.6.1.265 "Stenosis Measurement Methods" }, { 0, 0, 0, 3805, // 1.2.840.10008.6.1.266 "Stenosis Types" }, { 0, 0, 0, 3806, // 1.2.840.10008.6.1.267 "Stenosis Shape" }, { 0, 0, 0, 3807, // 1.2.840.10008.6.1.268 "Volume Measurement Methods" }, { 0, 0, 0, 3808, // 1.2.840.10008.6.1.269 "Aneurysm Types" }, { 0, 0, 0, 3809, // 1.2.840.10008.6.1.270 "Associated Conditions" }, { 0, 0, 0, 3810, // 1.2.840.10008.6.1.271 "Vascular Morphology" }, { 0, 0, 0, 3813, // 1.2.840.10008.6.1.272 "Stent Findings" }, { 0, 0, 0, 3814, // 1.2.840.10008.6.1.273 "Stent Composition" }, { 0, 0, 0, 3815, // 1.2.840.10008.6.1.274 "Source of Vascular Finding" }, { 0, 0, 0, 3817, // 1.2.840.10008.6.1.275 "Vascular Sclerosis Types" }, { 0, 0, 0, 3820, // 1.2.840.10008.6.1.276 "Non-invasive Vascular Procedures" }, { 0, 0, 0, 3821, // 1.2.840.10008.6.1.277 "Papillary Muscle Included/Excluded" }, { 0, 0, 0, 3823, // 1.2.840.10008.6.1.278 "Respiratory Status" }, { 0, 0, 0, 3826, // 1.2.840.10008.6.1.279 "Heart Rhythm" }, { 0, 0, 0, 3827, // 1.2.840.10008.6.1.280 "Vessel Segments" }, { 0, 0, 0, 3829, // 1.2.840.10008.6.1.281 "Pulmonary Arteries" }, { 0, 0, 0, 3831, // 1.2.840.10008.6.1.282 "Stenosis Length" }, { 0, 0, 0, 3832, // 1.2.840.10008.6.1.283 "Stenosis Grade" }, { 0, 0, 0, 3833, // 1.2.840.10008.6.1.284 "Cardiac Ejection Fraction" }, { 0, 0, 0, 3835, // 1.2.840.10008.6.1.285 "Cardiac Volume Measurements" }, { 0, 0, 0, 3836, // 1.2.840.10008.6.1.286 "Time-based Perfusion Measurements" }, { 0, 0, 0, 3837, // 1.2.840.10008.6.1.287 "Fiducial Feature" }, { 0, 0, 0, 3838, // 1.2.840.10008.6.1.288 "Diameter Derivation" }, { 0, 0, 0, 3839, // 1.2.840.10008.6.1.289 "Coronary Veins" }, { 0, 0, 0, 3840, // 1.2.840.10008.6.1.290 "Pulmonary Veins" }, { 0, 0, 0, 3843, // 1.2.840.10008.6.1.291 "Myocardial Subsegment" }, { 0, 0, 0, 4005, // 1.2.840.10008.6.1.292 "Partial View Section for Mammography" }, { 0, 0, 0, 4009, // 1.2.840.10008.6.1.293 "DX Anatomy Imaged" }, { 0, 0, 0, 4010, // 1.2.840.10008.6.1.294 "DX View" }, { 0, 0, 0, 4011, // 1.2.840.10008.6.1.295 "DX View Modifier" }, { 0, 0, 0, 4012, // 1.2.840.10008.6.1.296 "Projection Eponymous Name" }, { 0, 0, 0, 4013, // 1.2.840.10008.6.1.297 "Anatomic Region for Mammography" }, { 0, 0, 0, 4014, // 1.2.840.10008.6.1.298 "View for Mammography" }, { 0, 0, 0, 4015, // 1.2.840.10008.6.1.299 "View Modifier for Mammography" }, { 0, 0, 0, 4016, // 1.2.840.10008.6.1.300 "Anatomic Region for Intra-oral Radiography" }, { 0, 0, 0, 4017, // 1.2.840.10008.6.1.301 "Anatomic Region Modifier for Intra-oral Radiography" }, { 0, 0, 0, 4018, // 1.2.840.10008.6.1.302 "Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth)" }, { 0, 0, 0, 4019, // 1.2.840.10008.6.1.303 "Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth)" }, { 0, 0, 0, 4020, // 1.2.840.10008.6.1.304 "PET Radionuclide" }, { 0, 0, 0, 4021, // 1.2.840.10008.6.1.305 "PET Radiopharmaceutical" }, { 0, 0, 0, 4028, // 1.2.840.10008.6.1.306 "Craniofacial Anatomic Regions" }, { 0, 0, 0, 4030, // 1.2.840.10008.6.1.307 "CT, MR and PET Anatomy Imaged" }, { 0, 0, 0, 4031, // 1.2.840.10008.6.1.308 "Common Anatomic Regions" }, { 0, 0, 0, 4032, // 1.2.840.10008.6.1.309 "MR Spectroscopy Metabolites" }, { 0, 0, 0, 4033, // 1.2.840.10008.6.1.310 "MR Proton Spectroscopy Metabolites" }, { 0, 0, 0, 4040, // 1.2.840.10008.6.1.311 "Endoscopy Anatomic Regions" }, { 0, 0, 0, 4042, // 1.2.840.10008.6.1.312 "XA/XRF Anatomy Imaged" }, { 0, 0, 0, 4050, // 1.2.840.10008.6.1.313 "Drug or Contrast Agent Characteristics" }, { 0, 0, 0, 4051, // 1.2.840.10008.6.1.314 "General Devices" }, { 0, 0, 0, 4052, // 1.2.840.10008.6.1.315 "Phantom Devices" }, { 0, 0, 0, 4200, // 1.2.840.10008.6.1.316 "Ophthalmic Imaging Agent" }, { 0, 0, 0, 4201, // 1.2.840.10008.6.1.317 "Patient Eye Movement Command" }, { 0, 0, 0, 4202, // 1.2.840.10008.6.1.318 "Ophthalmic Photography Acquisition Device" }, { 0, 0, 0, 4203, // 1.2.840.10008.6.1.319 "Ophthalmic Photography Illumination" }, { 0, 0, 0, 4204, // 1.2.840.10008.6.1.320 "Ophthalmic Filter" }, { 0, 0, 0, 4205, // 1.2.840.10008.6.1.321 "Ophthalmic Lens" }, { 0, 0, 0, 4206, // 1.2.840.10008.6.1.322 "Ophthalmic Channel Description" }, { 0, 0, 0, 4207, // 1.2.840.10008.6.1.323 "Ophthalmic Image Position" }, { 0, 0, 0, 4208, // 1.2.840.10008.6.1.324 "Mydriatic Agent" }, { 0, 0, 0, 4209, // 1.2.840.10008.6.1.325 "Ophthalmic Anatomic Structure Imaged" }, { 0, 0, 0, 4210, // 1.2.840.10008.6.1.326 "Ophthalmic Tomography Acquisition Device" }, { 0, 0, 0, 4211, // 1.2.840.10008.6.1.327 "Ophthalmic OCT Anatomic Structure Imaged" }, { 0, 0, 0, 5000, // 1.2.840.10008.6.1.328 "Languages" }, { 0, 0, 0, 5001, // 1.2.840.10008.6.1.329 "Countries" }, { 0, 0, 0, 6000, // 1.2.840.10008.6.1.330 "Overall Breast Composition" }, { 0, 0, 0, 6001, // 1.2.840.10008.6.1.331 "Overall Breast Composition from BI-RADS(R)" }, { 0, 0, 0, 6002, // 1.2.840.10008.6.1.332 "Change Since Last Mammogram or Prior Surgery" }, { 0, 0, 0, 6003, // 1.2.840.10008.6.1.333 "Change Since Last Mammogram or Prior Surgery from BI-RADS(R)" }, { 0, 0, 0, 6004, // 1.2.840.10008.6.1.334 "Mammography Characteristics of Shape" }, { 0, 0, 0, 6005, // 1.2.840.10008.6.1.335 "Characteristics of Shape from BI-RADS(R)" }, { 0, 0, 0, 6006, // 1.2.840.10008.6.1.336 "Mammography Characteristics of Margin" }, { 0, 0, 0, 6007, // 1.2.840.10008.6.1.337 "Characteristics of Margin from BI-RADS(R)" }, { 0, 0, 0, 6008, // 1.2.840.10008.6.1.338 "Density Modifier" }, { 0, 0, 0, 6009, // 1.2.840.10008.6.1.339 "Density Modifier from BI-RADS(R)" }, { 0, 0, 0, 6010, // 1.2.840.10008.6.1.340 "Mammography Calcification Types" }, { 0, 0, 0, 6011, // 1.2.840.10008.6.1.341 "Calcification Types from BI-RADS(R)" }, { 0, 0, 0, 6012, // 1.2.840.10008.6.1.342 "Calcification Distribution Modifier" }, { 0, 0, 0, 6013, // 1.2.840.10008.6.1.343 "Calcification Distribution Modifier from BI-RADS(R)" }, { 0, 0, 0, 6014, // 1.2.840.10008.6.1.344 "Mammography Single Image Finding" }, { 0, 0, 0, 6015, // 1.2.840.10008.6.1.345 "Single Image Finding from BI-RADS(R)" }, { 0, 0, 0, 6016, // 1.2.840.10008.6.1.346 "Mammography Composite Feature" }, { 0, 0, 0, 6017, // 1.2.840.10008.6.1.347 "Composite Feature from BI-RADS(R)" }, { 0, 0, 0, 6018, // 1.2.840.10008.6.1.348 "Clockface Location or Region" }, { 0, 0, 0, 6019, // 1.2.840.10008.6.1.349 "Clockface Location or Region from BI-RADS(R)" }, { 0, 0, 0, 6020, // 1.2.840.10008.6.1.350 "Quadrant Location" }, { 0, 0, 0, 6021, // 1.2.840.10008.6.1.351 "Quadrant Location from BI-RADS(R)" }, { 0, 0, 0, 6022, // 1.2.840.10008.6.1.352 "Side" }, { 0, 0, 0, 6023, // 1.2.840.10008.6.1.353 "Side from BI-RADS(R)" }, { 0, 0, 0, 6024, // 1.2.840.10008.6.1.354 "Depth" }, { 0, 0, 0, 6025, // 1.2.840.10008.6.1.355 "Depth from BI-RADS(R)" }, { 0, 0, 0, 6026, // 1.2.840.10008.6.1.356 "Mammography Assessment" }, { 0, 0, 0, 6027, // 1.2.840.10008.6.1.357 "Assessment from BI-RADS(R)" }, { 0, 0, 0, 6028, // 1.2.840.10008.6.1.358 "Mammography Recommended Follow-up" }, { 0, 0, 0, 6029, // 1.2.840.10008.6.1.359 "Recommended Follow-up from BI-RADS(R)" }, { 0, 0, 0, 6030, // 1.2.840.10008.6.1.360 "Mammography Pathology Codes" }, { 0, 0, 0, 6031, // 1.2.840.10008.6.1.361 "Benign Pathology Codes from BI-RADS(R)" }, { 0, 0, 0, 6032, // 1.2.840.10008.6.1.362 "High Risk Lesions Pathology Codes from BI-RADS(R)" }, { 0, 0, 0, 6033, // 1.2.840.10008.6.1.363 "Malignant Pathology Codes from BI-RADS(R)" }, { 0, 0, 0, 6034, // 1.2.840.10008.6.1.364 "Intended Use of CAD Output" }, { 0, 0, 0, 6035, // 1.2.840.10008.6.1.365 "Composite Feature Relations" }, { 0, 0, 0, 6036, // 1.2.840.10008.6.1.366 "Scope of Feature" }, { 0, 0, 0, 6037, // 1.2.840.10008.6.1.367 "Mammography Quantitative Temporal Difference Type" }, { 0, 0, 0, 6038, // 1.2.840.10008.6.1.368 "Mammography Qualitative Temporal Difference Type" }, { 0, 0, 0, 6039, // 1.2.840.10008.6.1.369 "Nipple Characteristic" }, { 0, 0, 0, 6040, // 1.2.840.10008.6.1.370 "Non-lesion Object Type" }, { 0, 0, 0, 6041, // 1.2.840.10008.6.1.371 "Mammography Image Quality Finding" }, { 0, 0, 0, 6042, // 1.2.840.10008.6.1.372 "Status of Results" }, { 0, 0, 0, 6043, // 1.2.840.10008.6.1.373 "Types of Mammography CAD Analysis" }, { 0, 0, 0, 6044, // 1.2.840.10008.6.1.374 "Types of Image Quality Assessment" }, { 0, 0, 0, 6045, // 1.2.840.10008.6.1.375 "Mammography Types of Quality Control Standard" }, { 0, 0, 0, 6046, // 1.2.840.10008.6.1.376 "Units of Follow-up Interval" }, { 0, 0, 0, 6047, // 1.2.840.10008.6.1.377 "CAD Processing and Findings Summary" }, { 0, 0, 0, 6048, // 1.2.840.10008.6.1.378 "CAD Operating Point Axis Label" }, { 0, 0, 0, 6050, // 1.2.840.10008.6.1.379 "Breast Procedure Reported" }, { 0, 0, 0, 6051, // 1.2.840.10008.6.1.380 "Breast Procedure Reason" }, { 0, 0, 0, 6052, // 1.2.840.10008.6.1.381 "Breast Imaging Report Section Title" }, { 0, 0, 0, 6053, // 1.2.840.10008.6.1.382 "Breast Imaging Report Elements" }, { 0, 0, 0, 6054, // 1.2.840.10008.6.1.383 "Breast Imaging Findings" }, { 0, 0, 0, 6055, // 1.2.840.10008.6.1.384 "Breast Clinical Finding or Indicated Problem" }, { 0, 0, 0, 6056, // 1.2.840.10008.6.1.385 "Associated Findings for Breast" }, { 0, 0, 0, 6057, // 1.2.840.10008.6.1.386 "Ductography Findings for Breast" }, { 0, 0, 0, 6058, // 1.2.840.10008.6.1.387 "Procedure Modifiers for Breast" }, { 0, 0, 0, 6059, // 1.2.840.10008.6.1.388 "Breast Implant Types" }, { 0, 0, 0, 6060, // 1.2.840.10008.6.1.389 "Breast Biopsy Techniques" }, { 0, 0, 0, 6061, // 1.2.840.10008.6.1.390 "Breast Imaging Procedure Modifiers" }, { 0, 0, 0, 6062, // 1.2.840.10008.6.1.391 "Interventional Procedure Complications" }, { 0, 0, 0, 6063, // 1.2.840.10008.6.1.392 "Interventional Procedure Results" }, { 0, 0, 0, 6064, // 1.2.840.10008.6.1.393 "Ultrasound Findings for Breast" }, { 0, 0, 0, 6065, // 1.2.840.10008.6.1.394 "Instrument Approach" }, { 0, 0, 0, 6066, // 1.2.840.10008.6.1.395 "Target Confirmation" }, { 0, 0, 0, 6067, // 1.2.840.10008.6.1.396 "Fluid Color" }, { 0, 0, 0, 6068, // 1.2.840.10008.6.1.397 "Tumor Stages From AJCC" }, { 0, 0, 0, 6069, // 1.2.840.10008.6.1.398 "Nottingham Combined Histologic Grade" }, { 0, 0, 0, 6070, // 1.2.840.10008.6.1.399 "Bloom-Richardson Histologic Grade" }, { 0, 0, 0, 6071, // 1.2.840.10008.6.1.400 "Histologic Grading Method" }, { 0, 0, 0, 6072, // 1.2.840.10008.6.1.401 "Breast Implant Findings" }, { 0, 0, 0, 6080, // 1.2.840.10008.6.1.402 "Gynecological Hormones" }, { 0, 0, 0, 6081, // 1.2.840.10008.6.1.403 "Breast Cancer Risk Factors" }, { 0, 0, 0, 6082, // 1.2.840.10008.6.1.404 "Gynecological Procedures" }, { 0, 0, 0, 6083, // 1.2.840.10008.6.1.405 "Procedures for Breast" }, { 0, 0, 0, 6084, // 1.2.840.10008.6.1.406 "Mammoplasty Procedures" }, { 0, 0, 0, 6085, // 1.2.840.10008.6.1.407 "Therapies for Breast" }, { 0, 0, 0, 6086, // 1.2.840.10008.6.1.408 "Menopausal Phase" }, { 0, 0, 0, 6087, // 1.2.840.10008.6.1.409 "General Risk Factors" }, { 0, 0, 0, 6088, // 1.2.840.10008.6.1.410 "OB-GYN Maternal Risk Factors" }, { 0, 0, 0, 6089, // 1.2.840.10008.6.1.411 "Substances" }, { 0, 0, 0, 6090, // 1.2.840.10008.6.1.412 "Relative Usage, Exposure Amount" }, { 0, 0, 0, 6091, // 1.2.840.10008.6.1.413 "Relative Frequency of Event Values" }, { 0, 0, 0, 6092, // 1.2.840.10008.6.1.414 "Quantitative Concepts for Usage, Exposure" }, { 0, 0, 0, 6093, // 1.2.840.10008.6.1.415 "Qualitative Concepts for Usage, Exposure Amount" }, { 0, 0, 0, 6094, // 1.2.840.10008.6.1.416 "Qualitative Concepts for Usage, Exposure Frequency" }, { 0, 0, 0, 6095, // 1.2.840.10008.6.1.417 "Numeric Properties of Procedures" }, { 0, 0, 0, 6096, // 1.2.840.10008.6.1.418 "Pregnancy Status" }, { 0, 0, 0, 6097, // 1.2.840.10008.6.1.419 "Side of Family" }, { 0, 0, 0, 6100, // 1.2.840.10008.6.1.420 "Chest Component Categories" }, { 0, 0, 0, 6101, // 1.2.840.10008.6.1.421 "Chest Finding or Feature" }, { 0, 0, 0, 6102, // 1.2.840.10008.6.1.422 "Chest Finding or Feature Modifier" }, { 0, 0, 0, 6103, // 1.2.840.10008.6.1.423 "Abnormal Lines Finding or Feature" }, { 0, 0, 0, 6104, // 1.2.840.10008.6.1.424 "Abnormal Opacity Finding or Feature" }, { 0, 0, 0, 6105, // 1.2.840.10008.6.1.425 "Abnormal Lucency Finding or Feature" }, { 0, 0, 0, 6106, // 1.2.840.10008.6.1.426 "Abnormal Texture Finding or Feature" }, { 0, 0, 0, 6107, // 1.2.840.10008.6.1.427 "Width Descriptor" }, { 0, 0, 0, 6108, // 1.2.840.10008.6.1.428 "Chest Anatomic Structure Abnormal Distribution" }, { 0, 0, 0, 6109, // 1.2.840.10008.6.1.429 "Radiographic Anatomy Finding or Feature" }, { 0, 0, 0, 6110, // 1.2.840.10008.6.1.430 "Lung Anatomy Finding or Feature" }, { 0, 0, 0, 6111, // 1.2.840.10008.6.1.431 "Bronchovascular Anatomy Finding or Feature" }, { 0, 0, 0, 6112, // 1.2.840.10008.6.1.432 "Pleura Anatomy Finding or Feature" }, { 0, 0, 0, 6113, // 1.2.840.10008.6.1.433 "Mediastinum Anatomy Finding or Feature" }, { 0, 0, 0, 6114, // 1.2.840.10008.6.1.434 "Osseous Anatomy Finding or Feature" }, { 0, 0, 0, 6115, // 1.2.840.10008.6.1.435 "Osseous Anatomy Modifiers" }, { 0, 0, 0, 6116, // 1.2.840.10008.6.1.436 "Muscular Anatomy" }, { 0, 0, 0, 6117, // 1.2.840.10008.6.1.437 "Vascular Anatomy" }, { 0, 0, 0, 6118, // 1.2.840.10008.6.1.438 "Size Descriptor" }, { 0, 0, 0, 6119, // 1.2.840.10008.6.1.439 "Chest Border Shape" }, { 0, 0, 0, 6120, // 1.2.840.10008.6.1.440 "Chest Border Definition" }, { 0, 0, 0, 6121, // 1.2.840.10008.6.1.441 "Chest Orientation Descriptor" }, { 0, 0, 0, 6122, // 1.2.840.10008.6.1.442 "Chest Content Descriptor" }, { 0, 0, 0, 6123, // 1.2.840.10008.6.1.443 "Chest Opacity Descriptor" }, { 0, 0, 0, 6124, // 1.2.840.10008.6.1.444 "Location in Chest" }, { 0, 0, 0, 6125, // 1.2.840.10008.6.1.445 "General Chest Location" }, { 0, 0, 0, 6126, // 1.2.840.10008.6.1.446 "Location in Lung" }, { 0, 0, 0, 6127, // 1.2.840.10008.6.1.447 "Segment Location in Lung" }, { 0, 0, 0, 6128, // 1.2.840.10008.6.1.448 "Chest Distribution Descriptor" }, { 0, 0, 0, 6129, // 1.2.840.10008.6.1.449 "Chest Site Involvement" }, { 0, 0, 0, 6130, // 1.2.840.10008.6.1.450 "Severity Descriptor" }, { 0, 0, 0, 6131, // 1.2.840.10008.6.1.451 "Chest Texture Descriptor" }, { 0, 0, 0, 6132, // 1.2.840.10008.6.1.452 "Chest Calcification Descriptor" }, { 0, 0, 0, 6133, // 1.2.840.10008.6.1.453 "Chest Quantitative Temporal Difference Type" }, { 0, 0, 0, 6134, // 1.2.840.10008.6.1.454 "Chest Qualitative Temporal Difference Type" }, { 0, 0, 0, 6135, // 1.2.840.10008.6.1.455 "Image Quality Finding" }, { 0, 0, 0, 6136, // 1.2.840.10008.6.1.456 "Chest Types of Quality Control Standard" }, { 0, 0, 0, 6137, // 1.2.840.10008.6.1.457 "Types of CAD Analysis" }, { 0, 0, 0, 6138, // 1.2.840.10008.6.1.458 "Chest Non-lesion Object Type" }, { 0, 0, 0, 6139, // 1.2.840.10008.6.1.459 "Non-lesion Modifiers" }, { 0, 0, 0, 6140, // 1.2.840.10008.6.1.460 "Calculation Methods" }, { 0, 0, 0, 6141, // 1.2.840.10008.6.1.461 "Attenuation Coefficient Measurements" }, { 0, 0, 0, 6142, // 1.2.840.10008.6.1.462 "Calculated Value" }, { 0, 0, 0, 6143, // 1.2.840.10008.6.1.463 "Lesion Response" }, { 0, 0, 0, 6144, // 1.2.840.10008.6.1.464 "RECIST Defined Lesion Response" }, { 0, 0, 0, 6145, // 1.2.840.10008.6.1.465 "Baseline Category" }, { 0, 0, 0, 6151, // 1.2.840.10008.6.1.466 "Background Echotexture" }, { 0, 0, 0, 6152, // 1.2.840.10008.6.1.467 "Orientation" }, { 0, 0, 0, 6153, // 1.2.840.10008.6.1.468 "Lesion Boundary" }, { 0, 0, 0, 6154, // 1.2.840.10008.6.1.469 "Echo Pattern" }, { 0, 0, 0, 6155, // 1.2.840.10008.6.1.470 "Posterior Acoustic Features" }, { 0, 0, 0, 6157, // 1.2.840.10008.6.1.471 "Vascularity" }, { 0, 0, 0, 6158, // 1.2.840.10008.6.1.472 "Correlation to Other Findings" }, { 0, 0, 0, 6159, // 1.2.840.10008.6.1.473 "Malignancy Type" }, { 0, 0, 0, 6160, // 1.2.840.10008.6.1.474 "Breast Primary Tumor Assessment From AJCC" }, { 0, 0, 0, 6161, // 1.2.840.10008.6.1.475 "Clinical Regional Lymph Node Assessment for Breast" }, { 0, 0, 0, 6162, // 1.2.840.10008.6.1.476 "Assessment of Metastasis for Breast" }, { 0, 0, 0, 6163, // 1.2.840.10008.6.1.477 "Menstrual Cycle Phase" }, { 0, 0, 0, 6164, // 1.2.840.10008.6.1.478 "Time Intervals" }, { 0, 0, 0, 6165, // 1.2.840.10008.6.1.479 "Breast Linear Measurements" }, { 0, 0, 0, 6166, // 1.2.840.10008.6.1.480 "CAD Geometry Secondary Graphical Representation" }, { 0, 0, 0, 7000, // 1.2.840.10008.6.1.481 "Diagnostic Imaging Report Document Titles" }, { 0, 0, 0, 7001, // 1.2.840.10008.6.1.482 "Diagnostic Imaging Report Headings" }, { 0, 0, 0, 7002, // 1.2.840.10008.6.1.483 "Diagnostic Imaging Report Elements" }, { 0, 0, 0, 7003, // 1.2.840.10008.6.1.484 "Diagnostic Imaging Report Purposes of Reference" }, { 0, 0, 0, 7004, // 1.2.840.10008.6.1.485 "Waveform Purposes of Reference" }, { 0, 0, 0, 7005, // 1.2.840.10008.6.1.486 "Contributing Equipment Purposes of Reference" }, { 0, 0, 0, 7006, // 1.2.840.10008.6.1.487 "SR Document Purposes of Reference" }, { 0, 0, 0, 7007, // 1.2.840.10008.6.1.488 "Signature Purpose" }, { 0, 0, 0, 7008, // 1.2.840.10008.6.1.489 "Media Import" }, { 0, 0, 0, 7010, // 1.2.840.10008.6.1.490 "Key Object Selection Document Title" }, { 0, 0, 0, 7011, // 1.2.840.10008.6.1.491 "Rejected for Quality Reasons" }, { 0, 0, 0, 7012, // 1.2.840.10008.6.1.492 "Best in Set" }, { 0, 0, 0, 7020, // 1.2.840.10008.6.1.493 "Document Titles" }, { 0, 0, 0, 7100, // 1.2.840.10008.6.1.494 "RCS Registration Method Type" }, { 0, 0, 0, 7101, // 1.2.840.10008.6.1.495 "Brain Atlas Fiducials" }, { 0, 0, 0, 7150, // 1.2.840.10008.6.1.496 "Segmentation Property Categories" }, { 0, 0, 0, 7151, // 1.2.840.10008.6.1.497 "Segmentation Property Types" }, { 0, 0, 0, 7152, // 1.2.840.10008.6.1.498 "Cardiac Structure Segmentation Types" }, { 0, 0, 0, 7153, // 1.2.840.10008.6.1.499 "CNS Tissue Segmentation Types" }, { 0, 0, 0, 7154, // 1.2.840.10008.6.1.500 "Abdominal Organ Segmentation Types" }, { 0, 0, 0, 7155, // 1.2.840.10008.6.1.501 "Thoracic Tissue Segmentation Types" }, { 0, 0, 0, 7156, // 1.2.840.10008.6.1.502 "Vascular Tissue Segmentation Types" }, { 0, 0, 0, 7157, // 1.2.840.10008.6.1.503 "Device Segmentation Types" }, { 0, 0, 0, 7158, // 1.2.840.10008.6.1.504 "Artifact Segmentation Types" }, { 0, 0, 0, 7159, // 1.2.840.10008.6.1.505 "Lesion Segmentation Types" }, { 0, 0, 0, 7160, // 1.2.840.10008.6.1.506 "Pelvic Organ Segmentation Types" }, { 0, 0, 0, 7161, // 1.2.840.10008.6.1.507 "Physiology Segmentation Types" }, { 0, 0, 0, 7201, // 1.2.840.10008.6.1.508 "Referenced Image Purposes of Reference" }, { 0, 0, 0, 7202, // 1.2.840.10008.6.1.509 "Source Image Purposes of Reference" }, { 0, 0, 0, 7203, // 1.2.840.10008.6.1.510 "Image Derivation" }, { 0, 0, 0, 7205, // 1.2.840.10008.6.1.511 "Purpose of Reference to Alternate Representation" }, { 0, 0, 0, 7210, // 1.2.840.10008.6.1.512 "Related Series Purposes of Reference" }, { 0, 0, 0, 7250, // 1.2.840.10008.6.1.513 "Multi-Frame Subset Type" }, { 0, 0, 0, 7450, // 1.2.840.10008.6.1.514 "Person Roles" }, { 0, 0, 0, 7451, // 1.2.840.10008.6.1.515 "Family Member" }, { 0, 0, 0, 7452, // 1.2.840.10008.6.1.516 "Organizational Roles" }, { 0, 0, 0, 7453, // 1.2.840.10008.6.1.517 "Performing Roles" }, { 0, 0, 0, 7454, // 1.2.840.10008.6.1.518 "Animal Taxonomic Rank Values" }, { 0, 0, 0, 7455, // 1.2.840.10008.6.1.519 "Sex" }, { 0, 0, 0, 7456, // 1.2.840.10008.6.1.520 "Units of Measure for Age" }, { 0, 0, 0, 7460, // 1.2.840.10008.6.1.521 "Units of Linear Measurement" }, { 0, 0, 0, 7461, // 1.2.840.10008.6.1.522 "Units of Area Measurement" }, { 0, 0, 0, 7462, // 1.2.840.10008.6.1.523 "Units of Volume Measurement" }, { 0, 0, 0, 7470, // 1.2.840.10008.6.1.524 "Linear Measurements" }, { 0, 0, 0, 7471, // 1.2.840.10008.6.1.525 "Area Measurements" }, { 0, 0, 0, 7472, // 1.2.840.10008.6.1.526 "Volume Measurements" }, { 0, 0, 0, 7473, // 1.2.840.10008.6.1.527 "General Area Calculation Methods" }, { 0, 0, 0, 7474, // 1.2.840.10008.6.1.528 "General Volume Calculation Methods" }, { 0, 0, 0, 7480, // 1.2.840.10008.6.1.529 "Breed" }, { 0, 0, 0, 7481, // 1.2.840.10008.6.1.530 "Breed Registry" }, { 0, 0, 0, 9231, // 1.2.840.10008.6.1.531 "Workitem Definition" }, { 0, 0, 0, 9232, // 1.2.840.10008.6.1.532 (Retired) "Non-DICOM Output Types" }, { 0, 0, 0, 9300, // 1.2.840.10008.6.1.533 "Procedure Discontinuation Reasons" }, { 0, 0, 0, 10000, // 1.2.840.10008.6.1.534 "Scope of Accumulation" }, { 0, 0, 0, 10001, // 1.2.840.10008.6.1.535 "UID Types" }, { 0, 0, 0, 10002, // 1.2.840.10008.6.1.536 "Irradiation Event Types" }, { 0, 0, 0, 10003, // 1.2.840.10008.6.1.537 "Equipment Plane Identification" }, { 0, 0, 0, 10004, // 1.2.840.10008.6.1.538 "Fluoro Modes" }, { 0, 0, 0, 10006, // 1.2.840.10008.6.1.539 "X-Ray Filter Materials" }, { 0, 0, 0, 10007, // 1.2.840.10008.6.1.540 "X-Ray Filter Types" }, { 0, 0, 0, 10008, // 1.2.840.10008.6.1.541 "Dose Related Distance Measurements" }, { 0, 0, 0, 10009, // 1.2.840.10008.6.1.542 "Measured/Calculated" }, { 0, 0, 0, 10010, // 1.2.840.10008.6.1.543 "Dose Measurement Devices" }, { 0, 0, 0, 10011, // 1.2.840.10008.6.1.544 "Effective Dose Evaluation Method" }, { 0, 0, 0, 10013, // 1.2.840.10008.6.1.545 "CT Acquisition Type" }, { 0, 0, 0, 10014, // 1.2.840.10008.6.1.546 "Contrast Imaging Technique" }, { 0, 0, 0, 10015, // 1.2.840.10008.6.1.547 "CT Dose Reference Authorities" }, { 0, 0, 0, 10016, // 1.2.840.10008.6.1.548 "Anode Target Material" }, { 0, 0, 0, 10017, // 1.2.840.10008.6.1.549 "X-Ray Grid" }, { 0, 0, 0, 12001, // 1.2.840.10008.6.1.550 "Ultrasound Protocol Types" }, { 0, 0, 0, 12002, // 1.2.840.10008.6.1.551 "Ultrasound Protocol Stage Types" }, { 0, 0, 0, 12003, // 1.2.840.10008.6.1.552 "OB-GYN Dates" }, { 0, 0, 0, 12004, // 1.2.840.10008.6.1.553 "Fetal Biometry Ratios" }, { 0, 0, 0, 12005, // 1.2.840.10008.6.1.554 "Fetal Biometry Measurements" }, { 0, 0, 0, 12006, // 1.2.840.10008.6.1.555 "Fetal Long Bones Biometry Measurements" }, { 0, 0, 0, 12007, // 1.2.840.10008.6.1.556 "Fetal Cranium" }, { 0, 0, 0, 12008, // 1.2.840.10008.6.1.557 "OB-GYN Amniotic Sac" }, { 0, 0, 0, 12009, // 1.2.840.10008.6.1.558 "Early Gestation Biometry Measurements" }, { 0, 0, 0, 12011, // 1.2.840.10008.6.1.559 "Ultrasound Pelvis and Uterus" }, { 0, 0, 0, 12012, // 1.2.840.10008.6.1.560 "OB Equations and Tables" }, { 0, 0, 0, 12013, // 1.2.840.10008.6.1.561 "Gestational Age Equations and Tables" }, { 0, 0, 0, 12014, // 1.2.840.10008.6.1.562 "OB Fetal Body Weight Equations and Tables" }, { 0, 0, 0, 12015, // 1.2.840.10008.6.1.563 "Fetal Growth Equations and Tables" }, { 0, 0, 0, 12016, // 1.2.840.10008.6.1.564 "Estimated Fetal Weight Percentile Equations and Tables" }, { 0, 0, 0, 12017, // 1.2.840.10008.6.1.565 "Growth Distribution Rank" }, { 0, 0, 0, 12018, // 1.2.840.10008.6.1.566 "OB-GYN Summary" }, { 0, 0, 0, 12019, // 1.2.840.10008.6.1.567 "OB-GYN Fetus Summary" }, { 0, 0, 0, 12101, // 1.2.840.10008.6.1.568 "Vascular Summary" }, { 0, 0, 0, 12102, // 1.2.840.10008.6.1.569 "Temporal Periods Relating to Procedure or Therapy" }, { 0, 0, 0, 12103, // 1.2.840.10008.6.1.570 "Vascular Ultrasound Anatomic Location" }, { 0, 0, 0, 12104, // 1.2.840.10008.6.1.571 "Extracranial Arteries" }, { 0, 0, 0, 12105, // 1.2.840.10008.6.1.572 "Intracranial Cerebral Vessels" }, { 0, 0, 0, 12106, // 1.2.840.10008.6.1.573 "Intracranial Cerebral Vessels (Unilateral)" }, { 0, 0, 0, 12107, // 1.2.840.10008.6.1.574 "Upper Extremity Arteries" }, { 0, 0, 0, 12108, // 1.2.840.10008.6.1.575 "Upper Extremity Veins" }, { 0, 0, 0, 12109, // 1.2.840.10008.6.1.576 "Lower Extremity Arteries" }, { 0, 0, 0, 12110, // 1.2.840.10008.6.1.577 "Lower Extremity Veins" }, { 0, 0, 0, 12111, // 1.2.840.10008.6.1.578 "Abdominal Arteries (Lateral)" }, { 0, 0, 0, 12112, // 1.2.840.10008.6.1.579 "Abdominal Arteries (Unilateral)" }, { 0, 0, 0, 12113, // 1.2.840.10008.6.1.580 "Abdominal Veins (Lateral)" }, { 0, 0, 0, 12114, // 1.2.840.10008.6.1.581 "Abdominal Veins (Unilateral)" }, { 0, 0, 0, 12115, // 1.2.840.10008.6.1.582 "Renal Vessels" }, { 0, 0, 0, 12116, // 1.2.840.10008.6.1.583 "Vessel Segment Modifiers" }, { 0, 0, 0, 12117, // 1.2.840.10008.6.1.584 "Vessel Branch Modifiers" }, { 0, 0, 0, 12119, // 1.2.840.10008.6.1.585 "Vascular Ultrasound Property" }, { 0, 0, 0, 12120, // 1.2.840.10008.6.1.586 "Blood Velocity Measurements by Ultrasound" }, { 0, 0, 0, 12121, // 1.2.840.10008.6.1.587 "Vascular Indices and Ratios" }, { 0, 0, 0, 12122, // 1.2.840.10008.6.1.588 "Other Vascular Properties" }, { 0, 0, 0, 12123, // 1.2.840.10008.6.1.589 "Carotid Ratios" }, { 0, 0, 0, 12124, // 1.2.840.10008.6.1.590 "Renal Ratios" }, { 0, 0, 0, 12140, // 1.2.840.10008.6.1.591 "Pelvic Vasculature Anatomical Location" }, { 0, 0, 0, 12141, // 1.2.840.10008.6.1.592 "Fetal Vasculature Anatomical Location" }, { 0, 0, 0, 12200, // 1.2.840.10008.6.1.593 "Echocardiography Left Ventricle" }, { 0, 0, 0, 12201, // 1.2.840.10008.6.1.594 "Left Ventricle Linear" }, { 0, 0, 0, 12202, // 1.2.840.10008.6.1.595 "Left Ventricle Volume" }, { 0, 0, 0, 12203, // 1.2.840.10008.6.1.596 "Left Ventricle Other" }, { 0, 0, 0, 12204, // 1.2.840.10008.6.1.597 "Echocardiography Right Ventricle" }, { 0, 0, 0, 12205, // 1.2.840.10008.6.1.598 "Echocardiography Left Atrium" }, { 0, 0, 0, 12206, // 1.2.840.10008.6.1.599 "Echocardiography Right Atrium" }, { 0, 0, 0, 12207, // 1.2.840.10008.6.1.600 "Echocardiography Mitral Valve" }, { 0, 0, 0, 12208, // 1.2.840.10008.6.1.601 "Echocardiography Tricuspid Valve" }, { 0, 0, 0, 12209, // 1.2.840.10008.6.1.602 "Echocardiography Pulmonic Valve" }, { 0, 0, 0, 12210, // 1.2.840.10008.6.1.603 "Echocardiography Pulmonary Artery" }, { 0, 0, 0, 12211, // 1.2.840.10008.6.1.604 "Echocardiography Aortic Valve" }, { 0, 0, 0, 12212, // 1.2.840.10008.6.1.605 "Echocardiography Aorta" }, { 0, 0, 0, 12214, // 1.2.840.10008.6.1.606 "Echocardiography Pulmonary Veins" }, { 0, 0, 0, 12215, // 1.2.840.10008.6.1.607 "Echocardiography Vena Cavae" }, { 0, 0, 0, 12216, // 1.2.840.10008.6.1.608 "Echocardiography Hepatic Veins" }, { 0, 0, 0, 12217, // 1.2.840.10008.6.1.609 "Echocardiography Cardiac Shunt" }, { 0, 0, 0, 12218, // 1.2.840.10008.6.1.610 "Echocardiography Congenital" }, { 0, 0, 0, 12219, // 1.2.840.10008.6.1.611 "Pulmonary Vein Modifiers" }, { 0, 0, 0, 12220, // 1.2.840.10008.6.1.612 "Echocardiography Common Measurements" }, { 0, 0, 0, 12221, // 1.2.840.10008.6.1.613 "Flow Direction" }, { 0, 0, 0, 12222, // 1.2.840.10008.6.1.614 "Orifice Flow Properties" }, { 0, 0, 0, 12223, // 1.2.840.10008.6.1.615 "Echocardiography Stroke Volume Origin" }, { 0, 0, 0, 12224, // 1.2.840.10008.6.1.616 "Ultrasound Image Modes" }, { 0, 0, 0, 12226, // 1.2.840.10008.6.1.617 "Echocardiography Image View" }, { 0, 0, 0, 12227, // 1.2.840.10008.6.1.618 "Echocardiography Measurement Method" }, { 0, 0, 0, 12228, // 1.2.840.10008.6.1.619 "Echocardiography Volume Methods" }, { 0, 0, 0, 12229, // 1.2.840.10008.6.1.620 "Echocardiography Area Methods" }, { 0, 0, 0, 12230, // 1.2.840.10008.6.1.621 "Gradient Methods" }, { 0, 0, 0, 12231, // 1.2.840.10008.6.1.622 "Volume Flow Methods" }, { 0, 0, 0, 12232, // 1.2.840.10008.6.1.623 "Myocardium Mass Methods" }, { 0, 0, 0, 12233, // 1.2.840.10008.6.1.624 "Cardiac Phase" }, { 0, 0, 0, 12234, // 1.2.840.10008.6.1.625 "Respiration State" }, { 0, 0, 0, 12235, // 1.2.840.10008.6.1.626 "Mitral Valve Anatomic Sites" }, { 0, 0, 0, 12236, // 1.2.840.10008.6.1.627 "Echo Anatomic Sites" }, { 0, 0, 0, 12237, // 1.2.840.10008.6.1.628 "Echocardiography Anatomic Site Modifiers" }, { 0, 0, 0, 12238, // 1.2.840.10008.6.1.629 "Wall Motion Scoring Schemes" }, { 0, 0, 0, 12239, // 1.2.840.10008.6.1.630 "Cardiac Output Properties" }, { 0, 0, 0, 12240, // 1.2.840.10008.6.1.631 "Left Ventricle Area" }, { 0, 0, 0, 12241, // 1.2.840.10008.6.1.632 "Tricuspid Valve Finding Sites" }, { 0, 0, 0, 12242, // 1.2.840.10008.6.1.633 "Aortic Valve Finding Sites" }, { 0, 0, 0, 12243, // 1.2.840.10008.6.1.634 "Left Ventricle Finding Sites" }, { 0, 0, 0, 12244, // 1.2.840.10008.6.1.635 "Congenital Finding Sites" }, { 0, 0, 0, 7162, // 1.2.840.10008.6.1.636 "Surface Processing Algorithm Families" }, { 0, 0, 0, 3207, // 1.2.840.10008.6.1.637 "Stress Test Procedure Phases" }, { 0, 0, 0, 3778, // 1.2.840.10008.6.1.638 "Stages" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 252, // 1.2.840.10008.6.1.735 "S-M-L Size Descriptor" }, { 0, 0, 0, 3016, // 1.2.840.10008.6.1.736 "Major Coronary Arteries" }, { 0, 0, 0, 3083, // 1.2.840.10008.6.1.737 "Units of Radioactivity" }, { 0, 0, 0, 3102, // 1.2.840.10008.6.1.738 "Rest-Stress" }, { 0, 0, 0, 3106, // 1.2.840.10008.6.1.739 "PET Cardiology Protocols" }, { 0, 0, 0, 3107, // 1.2.840.10008.6.1.740 "PET Cardiology Radiopharmaceuticals" }, { 0, 0, 0, 3108, // 1.2.840.10008.6.1.741 "NM/PET Procedures" }, { 0, 0, 0, 3110, // 1.2.840.10008.6.1.742 "Nuclear Cardiology Protocols" }, { 0, 0, 0, 3111, // 1.2.840.10008.6.1.743 "Nuclear Cardiology Radiopharmaceuticals" }, { 0, 0, 0, 3112, // 1.2.840.10008.6.1.744 "Attenuation Correction" }, { 0, 0, 0, 3113, // 1.2.840.10008.6.1.745 "Types of Perfusion Defects" }, { 0, 0, 0, 3114, // 1.2.840.10008.6.1.746 "Study Quality" }, { 0, 0, 0, 3115, // 1.2.840.10008.6.1.747 "Stress Imaging Quality Issues" }, { 0, 0, 0, 3116, // 1.2.840.10008.6.1.748 "NM Extracardiac Findings" }, { 0, 0, 0, 3117, // 1.2.840.10008.6.1.749 "Attenuation Correction Methods" }, { 0, 0, 0, 3118, // 1.2.840.10008.6.1.750 "Level of Risk" }, { 0, 0, 0, 3119, // 1.2.840.10008.6.1.751 "LV Function" }, { 0, 0, 0, 3120, // 1.2.840.10008.6.1.752 "Perfusion Findings" }, { 0, 0, 0, 3121, // 1.2.840.10008.6.1.753 "Perfusion Morphology" }, { 0, 0, 0, 3122, // 1.2.840.10008.6.1.754 "Ventricular Enlargement" }, { 0, 0, 0, 3200, // 1.2.840.10008.6.1.755 "Stress Test Procedure" }, { 0, 0, 0, 3201, // 1.2.840.10008.6.1.756 "Indications for Stress Test" }, { 0, 0, 0, 3202, // 1.2.840.10008.6.1.757 "Chest Pain" }, { 0, 0, 0, 3203, // 1.2.840.10008.6.1.758 "Exerciser Device" }, { 0, 0, 0, 3204, // 1.2.840.10008.6.1.759 "Stress Agents" }, { 0, 0, 0, 3205, // 1.2.840.10008.6.1.760 "Indications for Pharmacological Stress Test" }, { 0, 0, 0, 3206, // 1.2.840.10008.6.1.761 "Non-invasive Cardiac Imaging Procedures" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 3208, // 1.2.840.10008.6.1.763 "Summary Codes Exercise ECG" }, { 0, 0, 0, 3209, // 1.2.840.10008.6.1.764 "Summary Codes Stress Imaging" }, { 0, 0, 0, 3210, // 1.2.840.10008.6.1.765 "Speed of Response" }, { 0, 0, 0, 3211, // 1.2.840.10008.6.1.766 "BP Response" }, { 0, 0, 0, 3212, // 1.2.840.10008.6.1.767 "Treadmill Speed" }, { 0, 0, 0, 3213, // 1.2.840.10008.6.1.768 "Stress Hemodynamic Findings" }, { 0, 0, 0, 3215, // 1.2.840.10008.6.1.769 "Perfusion Finding Method" }, { 0, 0, 0, 3217, // 1.2.840.10008.6.1.770 "Comparison Finding" }, { 0, 0, 0, 3220, // 1.2.840.10008.6.1.771 "Stress Symptoms" }, { 0, 0, 0, 3221, // 1.2.840.10008.6.1.772 "Stress Test Termination Reasons" }, { 0, 0, 0, 3227, // 1.2.840.10008.6.1.773 "QTc Measurements" }, { 0, 0, 0, 3228, // 1.2.840.10008.6.1.774 "ECG Timing Measurements" }, { 0, 0, 0, 3229, // 1.2.840.10008.6.1.775 "ECG Axis Measurements" }, { 0, 0, 0, 3230, // 1.2.840.10008.6.1.776 "ECG Findings" }, { 0, 0, 0, 3231, // 1.2.840.10008.6.1.777 "ST Segment Findings" }, { 0, 0, 0, 3232, // 1.2.840.10008.6.1.778 "ST Segment Location" }, { 0, 0, 0, 3233, // 1.2.840.10008.6.1.779 "ST Segment Morphology" }, { 0, 0, 0, 3234, // 1.2.840.10008.6.1.780 "Ectopic Beat Morphology" }, { 0, 0, 0, 3235, // 1.2.840.10008.6.1.781 "Perfusion Comparison Findings" }, { 0, 0, 0, 3236, // 1.2.840.10008.6.1.782 "Tolerance Comparison Findings" }, { 0, 0, 0, 3237, // 1.2.840.10008.6.1.783 "Wall Motion Comparison Findings" }, { 0, 0, 0, 3238, // 1.2.840.10008.6.1.784 "Stress Scoring Scales" }, { 0, 0, 0, 3239, // 1.2.840.10008.6.1.785 "Perceived Exertion Scales" }, { 0, 0, 0, 3463, // 1.2.840.10008.6.1.786 "Ventricle Identification" }, { 0, 0, 0, 6200, // 1.2.840.10008.6.1.787 "Colon Overall Assessment" }, { 0, 0, 0, 6201, // 1.2.840.10008.6.1.788 "Colon Finding or Feature" }, { 0, 0, 0, 6202, // 1.2.840.10008.6.1.789 "Colon Finding or Feature Modifier" }, { 0, 0, 0, 6203, // 1.2.840.10008.6.1.790 "Colon Non-lesion Object Type" }, { 0, 0, 0, 6204, // 1.2.840.10008.6.1.791 "Anatomic Non-colon Findings" }, { 0, 0, 0, 6205, // 1.2.840.10008.6.1.792 "Clockface Location for Colon" }, { 0, 0, 0, 6206, // 1.2.840.10008.6.1.793 "Recumbent Patient Orientation for Colon" }, { 0, 0, 0, 6207, // 1.2.840.10008.6.1.794 "Colon Quantitative Temporal Difference Type" }, { 0, 0, 0, 6208, // 1.2.840.10008.6.1.795 "Colon Types of Quality Control Standard" }, { 0, 0, 0, 6209, // 1.2.840.10008.6.1.796 "Colon Morphology Descriptor" }, { 0, 0, 0, 6210, // 1.2.840.10008.6.1.797 "Location in Intestinal Tract" }, { 0, 0, 0, 6211, // 1.2.840.10008.6.1.798 "Colon CAD Material Description" }, { 0, 0, 0, 6212, // 1.2.840.10008.6.1.799 "Calculated Value for Colon Findings" }, { 0, 0, 0, 4214, // 1.2.840.10008.6.1.800 "Ophthalmic Horizontal Directions" }, { 0, 0, 0, 4215, // 1.2.840.10008.6.1.801 "Ophthalmic Vertical Directions" }, { 0, 0, 0, 4216, // 1.2.840.10008.6.1.802 "Ophthalmic Visual Acuity Type" }, { 0, 0, 0, 3004, // 1.2.840.10008.6.1.803 "Arterial Pulse Waveform" }, { 0, 0, 0, 3005, // 1.2.840.10008.6.1.804 "Respiration Waveform" }, { 0, 0, 0, 12030, // 1.2.840.10008.6.1.805 "Ultrasound Contrast/Bolus Agents" }, { 0, 0, 0, 12031, // 1.2.840.10008.6.1.806 "Protocol Interval Events" }, { 0, 0, 0, 12032, // 1.2.840.10008.6.1.807 "Transducer Scan Pattern" }, { 0, 0, 0, 12033, // 1.2.840.10008.6.1.808 "Ultrasound Transducer Geometry" }, { 0, 0, 0, 12034, // 1.2.840.10008.6.1.809 "Ultrasound Transducer Beam Steering" }, { 0, 0, 0, 12035, // 1.2.840.10008.6.1.810 "Ultrasound Transducer Application" }, { 0, 0, 0, 50, // 1.2.840.10008.6.1.811 "Instance Availability Status" }, { 0, 0, 0, 9301, // 1.2.840.10008.6.1.812 "Modality PPS Discontinuation Reasons" }, { 0, 0, 0, 9302, // 1.2.840.10008.6.1.813 "Media Import PPS Discontinuation Reasons" }, { 0, 0, 0, 7482, // 1.2.840.10008.6.1.814 "DX Anatomy Imaged for Animals" }, { 0, 0, 0, 7483, // 1.2.840.10008.6.1.815 "Common Anatomic Regions for Animals" }, { 0, 0, 0, 7484, // 1.2.840.10008.6.1.816 "DX View for Animals" }, { 0, 0, 0, 7030, // 1.2.840.10008.6.1.817 "Institutional Departments, Units and Services" }, { 0, 0, 0, 7009, // 1.2.840.10008.6.1.818 "Purpose of Reference to Predecessor Report" }, { 0, 0, 0, 4220, // 1.2.840.10008.6.1.819 "Visual Fixation Quality During Acquisition" }, { 0, 0, 0, 4221, // 1.2.840.10008.6.1.820 "Visual Fixation Quality Problem" }, { 0, 0, 0, 4222, // 1.2.840.10008.6.1.821 "Ophthalmic Macular Grid Problem" }, { 0, 0, 0, 5002, // 1.2.840.10008.6.1.822 "Organizations" }, { 0, 0, 0, 7486, // 1.2.840.10008.6.1.823 "Mixed Breeds" }, { 0, 0, 0, 7040, // 1.2.840.10008.6.1.824 "Broselow-Luten Pediatric Size Categories" }, { 0, 0, 0, 7042, // 1.2.840.10008.6.1.825 "Calcium Scoring Patient Size Categories" }, { 0, 0, 0, 12245, // 1.2.840.10008.6.1.826 "Cardiac Ultrasound Report Titles" }, { 0, 0, 0, 12246, // 1.2.840.10008.6.1.827 "Cardiac Ultrasound Indication for Study" }, { 0, 0, 0, 12247, // 1.2.840.10008.6.1.828 "Pediatric, Fetal and Congenital Cardiac Surgical Interventions" }, { 0, 0, 0, 12248, // 1.2.840.10008.6.1.829 "Cardiac Ultrasound Summary Codes" }, { 0, 0, 0, 12249, // 1.2.840.10008.6.1.830 "Cardiac Ultrasound Fetal Summary Codes" }, { 0, 0, 0, 12250, // 1.2.840.10008.6.1.831 "Cardiac Ultrasound Common Linear Measurements" }, { 0, 0, 0, 12251, // 1.2.840.10008.6.1.832 "Cardiac Ultrasound Linear Valve Measurements" }, { 0, 0, 0, 12252, // 1.2.840.10008.6.1.833 "Cardiac Ultrasound Cardiac Function" }, { 0, 0, 0, 12253, // 1.2.840.10008.6.1.834 "Cardiac Ultrasound Area Measurements" }, { 0, 0, 0, 12254, // 1.2.840.10008.6.1.835 "Cardiac Ultrasound Hemodynamic Measurements" }, { 0, 0, 0, 12255, // 1.2.840.10008.6.1.836 "Cardiac Ultrasound Myocardium Measurements" }, { 0, 0, 0, 0, // 1.2.840.10008.6.1.837 "1.2.840.10008.6.1.838" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 12258, // 1.2.840.10008.6.1.839 "Cardiac Ultrasound Right Ventricle" }, { 0, 0, 0, 12259, // 1.2.840.10008.6.1.840 "Cardiac Ultrasound Ventricles Measurements" }, { 0, 0, 0, 12260, // 1.2.840.10008.6.1.841 "Cardiac Ultrasound Pulmonary Artery" }, { 0, 0, 0, 12261, // 1.2.840.10008.6.1.842 "Cardiac Ultrasound Pulmonary Vein" }, { 0, 0, 0, 12262, // 1.2.840.10008.6.1.843 "Cardiac Ultrasound Pulmonary Valve" }, { 0, 0, 0, 12263, // 1.2.840.10008.6.1.844 "Cardiac Ultrasound Venous Return Pulmonary Measurements" }, { 0, 0, 0, 12264, // 1.2.840.10008.6.1.845 "Cardiac Ultrasound Venous Return Systemic Measurements" }, { 0, 0, 0, 12265, // 1.2.840.10008.6.1.846 "Cardiac Ultrasound Atria and Atrial Septum Measurements" }, { 0, 0, 0, 12266, // 1.2.840.10008.6.1.847 "Cardiac Ultrasound Mitral Valve" }, { 0, 0, 0, 12267, // 1.2.840.10008.6.1.848 "Cardiac Ultrasound Tricuspid Valve" }, { 0, 0, 0, 12268, // 1.2.840.10008.6.1.849 "Cardiac Ultrasound Atrioventricular Valves Measurements" }, { 0, 0, 0, 12269, // 1.2.840.10008.6.1.850 "Cardiac Ultrasound Interventricular Septum Measurements" }, { 0, 0, 0, 12270, // 1.2.840.10008.6.1.851 "Cardiac Ultrasound Aortic Valve" }, { 0, 0, 0, 12271, // 1.2.840.10008.6.1.852 "Cardiac Ultrasound Outflow Tracts Measurements" }, { 0, 0, 0, 12272, // 1.2.840.10008.6.1.853 "Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Measurements" }, { 0, 0, 0, 12273, // 1.2.840.10008.6.1.854 "Cardiac Ultrasound Aortic Sinotubular Junction" }, { 0, 0, 0, 12274, // 1.2.840.10008.6.1.855 "Cardiac Ultrasound Aorta Measurements" }, { 0, 0, 0, 12275, // 1.2.840.10008.6.1.856 "Cardiac Ultrasound Coronary Arteries Measurements" }, { 0, 0, 0, 12276, // 1.2.840.10008.6.1.857 "Cardiac Ultrasound Aorto Pulmonary Connections Measurements" }, { 0, 0, 0, 12277, // 1.2.840.10008.6.1.858 "Cardiac Ultrasound Pericardium and Pleura Measurements" }, { 0, 0, 0, 12279, // 1.2.840.10008.6.1.859 "Cardiac Ultrasound Fetal General Measurements" }, { 0, 0, 0, 12280, // 1.2.840.10008.6.1.860 "Cardiac Ultrasound Target Sites" }, { 0, 0, 0, 12281, // 1.2.840.10008.6.1.861 "Cardiac Ultrasound Target Site Modifiers" }, { 0, 0, 0, 12282, // 1.2.840.10008.6.1.862 "Cardiac Ultrasound Venous Return Systemic Finding Sites" }, { 0, 0, 0, 12283, // 1.2.840.10008.6.1.863 "Cardiac Ultrasound Venous Return Pulmonary Finding Sites" }, { 0, 0, 0, 12284, // 1.2.840.10008.6.1.864 "Cardiac Ultrasound Atria and Atrial Septum Finding Sites" }, { 0, 0, 0, 12285, // 1.2.840.10008.6.1.865 "Cardiac Ultrasound Atrioventricular Valves Finding Sites" }, { 0, 0, 0, 12286, // 1.2.840.10008.6.1.866 "Cardiac Ultrasound Interventricular Septum Finding Sites" }, { 0, 0, 0, 12287, // 1.2.840.10008.6.1.867 "Cardiac Ultrasound Ventricles Finding Sites" }, { 0, 0, 0, 12288, // 1.2.840.10008.6.1.868 "Cardiac Ultrasound Outflow Tracts Finding Sites" }, { 0, 0, 0, 12289, // 1.2.840.10008.6.1.869 "Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites" }, { 0, 0, 0, 12290, // 1.2.840.10008.6.1.870 "Cardiac Ultrasound Pulmonary Arteries Finding Sites" }, { 0, 0, 0, 12291, // 1.2.840.10008.6.1.871 "Cardiac Ultrasound Aorta Finding Sites" }, { 0, 0, 0, 12292, // 1.2.840.10008.6.1.872 "Cardiac Ultrasound Coronary Arteries Finding Sites" }, { 0, 0, 0, 12293, // 1.2.840.10008.6.1.873 "Cardiac Ultrasound Aortopulmonary Connections Finding Sites" }, { 0, 0, 0, 12294, // 1.2.840.10008.6.1.874 "Cardiac Ultrasound Pericardium and Pleura Finding Sites" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 4230, // 1.2.840.10008.6.1.876 "Ophthalmic Ultrasound Axial Measurements Type" }, { 0, 0, 0, 4231, // 1.2.840.10008.6.1.877 "Lens Status" }, { 0, 0, 0, 4232, // 1.2.840.10008.6.1.878 "Vitreous Status" }, { 0, 0, 0, 4233, // 1.2.840.10008.6.1.879 "Ophthalmic Axial Length Measurements Segment Names" }, { 0, 0, 0, 4234, // 1.2.840.10008.6.1.880 "Refractive Surgery Types" }, { 0, 0, 0, 4235, // 1.2.840.10008.6.1.881 "Keratometry Descriptors" }, { 0, 0, 0, 4236, // 1.2.840.10008.6.1.882 "IOL Calculation Formula" }, { 0, 0, 0, 4237, // 1.2.840.10008.6.1.883 "Lens Constant Type" }, { 0, 0, 0, 4238, // 1.2.840.10008.6.1.884 "Refractive Error Types" }, { 0, 0, 0, 4239, // 1.2.840.10008.6.1.885 "Anterior Chamber Depth Definition" }, { 0, 0, 0, 4240, // 1.2.840.10008.6.1.886 "Ophthalmic Measurement or Calculation Data Source" }, { 0, 0, 0, 4241, // 1.2.840.10008.6.1.887 "Ophthalmic Axial Length Selection Method" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 4243, // 1.2.840.10008.6.1.889 "Ophthalmic Quality Metric Type" }, { 0, 0, 0, 4244, // 1.2.840.10008.6.1.890 "Ophthalmic Agent Concentration Units" }, { 0, 0, 0, 91, // 1.2.840.10008.6.1.891 "Functional Condition Present During Acquisition" }, { 0, 0, 0, 92, // 1.2.840.10008.6.1.892 "Joint Position During Acquisition" }, { 0, 0, 0, 93, // 1.2.840.10008.6.1.893 "Joint Positioning Method" }, { 0, 0, 0, 94, // 1.2.840.10008.6.1.894 "Physical Force Applied During Acquisition" }, { 0, 0, 0, 3690, // 1.2.840.10008.6.1.895 "ECG Control Variables Numeric" }, { 0, 0, 0, 3691, // 1.2.840.10008.6.1.896 "ECG Control Variables Text" }, { 0, 0, 0, 8120, // 1.2.840.10008.6.1.897 "WSI Referenced Image Purposes of Reference" }, { 0, 0, 0, 8121, // 1.2.840.10008.6.1.898 "Microscopy Lens Type" }, { 0, 0, 0, 8122, // 1.2.840.10008.6.1.899 "Microscopy Illuminator and Sensor Color" }, { 0, 0, 0, 8123, // 1.2.840.10008.6.1.900 "Microscopy Illumination Method" }, { 0, 0, 0, 8124, // 1.2.840.10008.6.1.901 "Microscopy Filter" }, { 0, 0, 0, 8125, // 1.2.840.10008.6.1.902 "Microscopy Illuminator Type" }, { 0, 0, 0, 400, // 1.2.840.10008.6.1.903 "Audit Event ID" }, { 0, 0, 0, 401, // 1.2.840.10008.6.1.904 "Audit Event Type Code" }, { 0, 0, 0, 402, // 1.2.840.10008.6.1.905 "Audit Active Participant Role ID Code" }, { 0, 0, 0, 403, // 1.2.840.10008.6.1.906 "Security Alert Type Code" }, { 0, 0, 0, 404, // 1.2.840.10008.6.1.907 "Audit Participant Object ID Type Code" }, { 0, 0, 0, 405, // 1.2.840.10008.6.1.908 "Media Type Code" }, { 0, 0, 0, 4250, // 1.2.840.10008.6.1.909 "Visual Field Static Perimetry Test Patterns" }, { 0, 0, 0, 4251, // 1.2.840.10008.6.1.910 "Visual Field Static Perimetry Test Strategies" }, { 0, 0, 0, 4252, // 1.2.840.10008.6.1.911 "Visual Field Static Perimetry Screening Test Modes" }, { 0, 0, 0, 4253, // 1.2.840.10008.6.1.912 "Visual Field Static Perimetry Fixation Strategy" }, { 0, 0, 0, 4254, // 1.2.840.10008.6.1.913 "Visual Field Static Perimetry Test Analysis Results" }, { 0, 0, 0, 4255, // 1.2.840.10008.6.1.914 "Visual Field Illumination Color" }, { 0, 0, 0, 4256, // 1.2.840.10008.6.1.915 "Visual Field Procedure Modifier" }, { 0, 0, 0, 4257, // 1.2.840.10008.6.1.916 "Visual Field Global Index Name" }, { 0, 0, 0, 7180, // 1.2.840.10008.6.1.917 "Abstract Multi-dimensional Image Model Component Semantics" }, { 0, 0, 0, 7181, // 1.2.840.10008.6.1.918 "Abstract Multi-dimensional Image Model Component Units" }, { 0, 0, 0, 7182, // 1.2.840.10008.6.1.919 "Abstract Multi-dimensional Image Model Dimension Semantics" }, { 0, 0, 0, 7183, // 1.2.840.10008.6.1.920 "Abstract Multi-dimensional Image Model Dimension Units" }, { 0, 0, 0, 7184, // 1.2.840.10008.6.1.921 "Abstract Multi-dimensional Image Model Axis Direction" }, { 0, 0, 0, 7185, // 1.2.840.10008.6.1.922 "Abstract Multi-dimensional Image Model Axis Orientation" }, { 0, 0, 0, 7186, // 1.2.840.10008.6.1.923 "Abstract Multi-dimensional Image Model Qualitative Dimension Sample Semantics" }, { 0, 0, 0, 7320, // 1.2.840.10008.6.1.924 "Planning Methods" }, { 0, 0, 0, 7050, // 1.2.840.10008.6.1.925 "De-identification Method" }, { 0, 0, 0, 12118, // 1.2.840.10008.6.1.926 "Measurement Orientation" }, { 0, 0, 0, 3689, // 1.2.840.10008.6.1.927 "ECG Global Waveform Durations" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 3692, // 1.2.840.10008.6.1.930 "ICDs" }, { 0, 0, 0, 9241, // 1.2.840.10008.6.1.931 "Radiotherapy General Workitem Definition" }, { 0, 0, 0, 9242, // 1.2.840.10008.6.1.932 "Radiotherapy Acquisition Workitem Definition" }, { 0, 0, 0, 9243, // 1.2.840.10008.6.1.933 "Radiotherapy Registration Workitem Definition" }, { 0, 0, 0, 3850, // 1.2.840.10008.6.1.934 "Intravascular OCT Flush Agent" }, { 0, 0, 0, 10022, // 1.2.840.10008.6.1.935 "Label Types" }, { 0, 0, 0, 4260, // 1.2.840.10008.6.1.936 "Ophthalmic Mapping Units for Real World Value Mapping" }, { 0, 0, 0, 4261, // 1.2.840.10008.6.1.937 "Ophthalmic Mapping Acquisition Method" }, { 0, 0, 0, 4262, // 1.2.840.10008.6.1.938 "Retinal Thickness Definition" }, { 0, 0, 0, 4263, // 1.2.840.10008.6.1.939 "Ophthalmic Thickness Map Value Type" }, { 0, 0, 0, 4264, // 1.2.840.10008.6.1.940 "Ophthalmic Map Purposes of Reference" }, { 0, 0, 0, 4265, // 1.2.840.10008.6.1.941 "Ophthalmic Thickness Deviation Categories" }, { 0, 0, 0, 4266, // 1.2.840.10008.6.1.942 "Ophthalmic Anatomic Structure Reference Point" }, { 0, 0, 0, 3104, // 1.2.840.10008.6.1.943 "Cardiac Synchronization Technique" }, { 0, 0, 0, 8130, // 1.2.840.10008.6.1.944 "Staining Protocols" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 10023, // 1.2.840.10008.6.1.947 "Size Specific Dose Estimation Method for CT" }, { 0, 0, 0, 8131, // 1.2.840.10008.6.1.948 "Pathology Imaging Protocols" }, { 0, 0, 0, 8132, // 1.2.840.10008.6.1.949 "Magnification Selection" }, { 0, 0, 0, 8133, // 1.2.840.10008.6.1.950 "Tissue Selection" }, { 0, 0, 0, 7464, // 1.2.840.10008.6.1.951 "General Region of Interest Measurement Modifiers" }, { 0, 0, 0, 7465, // 1.2.840.10008.6.1.952 "Measurements Derived From Multiple ROI Measurements" }, { 0, 0, 0, 8201, // 1.2.840.10008.6.1.953 "Surface Scan Acquisition Types" }, { 0, 0, 0, 8202, // 1.2.840.10008.6.1.954 "Surface Scan Mode Types" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 8203, // 1.2.840.10008.6.1.956 "Surface Scan Registration Method Types" }, { 0, 0, 0, 27, // 1.2.840.10008.6.1.957 "Basic Cardiac Views" }, { 0, 0, 0, 10033, // 1.2.840.10008.6.1.958 "CT Reconstruction Algorithm" }, { 0, 0, 0, 10030, // 1.2.840.10008.6.1.959 "Detector Types" }, { 0, 0, 0, 10031, // 1.2.840.10008.6.1.960 "CR/DR Mechanical Configuration" }, { 0, 0, 0, 10032, // 1.2.840.10008.6.1.961 "Projection X-Ray Acquisition Device Types" }, { 0, 0, 0, 7165, // 1.2.840.10008.6.1.962 "Abstract Segmentation Types" }, { 0, 0, 0, 7166, // 1.2.840.10008.6.1.963 "Common Tissue Segmentation Types" }, { 0, 0, 0, 7167, // 1.2.840.10008.6.1.964 "Peripheral Nervous System Segmentation Types" }, { 0, 0, 0, 4267, // 1.2.840.10008.6.1.965 "Corneal Topography Mapping Units for Real World Value Mapping" }, { 0, 0, 0, 4268, // 1.2.840.10008.6.1.966 "Corneal Topography Map Value Type" }, { 0, 0, 0, 7140, // 1.2.840.10008.6.1.967 "Brain Structures for Volumetric Measurements" }, { 0, 0, 0, 7220, // 1.2.840.10008.6.1.968 "RT Dose Derivation" }, { 0, 0, 0, 7221, // 1.2.840.10008.6.1.969 "RT Dose Purpose of Reference" }, { 0, 0, 0, 7215, // 1.2.840.10008.6.1.970 "Spectroscopy Purpose of Reference" }, { 0, 0, 0, 9250, // 1.2.840.10008.6.1.971 "Scheduled Processing Parameter Concept Codes for RT Treatment" }, { 0, 0, 0, 10040, // 1.2.840.10008.6.1.972 "Radiopharmaceutical Organ Dose Reference Authority" }, { 0, 0, 0, 10041, // 1.2.840.10008.6.1.973 "Source of Radioisotope Activity Information" }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 10043, // 1.2.840.10008.6.1.975 "Intravenous Extravasation Symptoms" }, { 0, 0, 0, 10044, // 1.2.840.10008.6.1.976 "Radiosensitive Organs" }, { 0, 0, 0, 10045, // 1.2.840.10008.6.1.977 "Radiopharmaceutical Patient State" }, { 0, 0, 0, 10046, // 1.2.840.10008.6.1.978 "GFR Measurements" }, { 0, 0, 0, 10047, // 1.2.840.10008.6.1.979 "GFR Measurement Methods" }, { 0, 0, 0, 8300, // 1.2.840.10008.6.1.980 "Visual Evaluation Methods" }, { 0, 0, 0, 8301, // 1.2.840.10008.6.1.981 "Test Pattern Codes" }, { 0, 0, 0, 8302, // 1.2.840.10008.6.1.982 "Measurement Pattern Codes" }, { 0, 0, 0, 8303, // 1.2.840.10008.6.1.983 "Display Device Type" }, { 0, 0, 0, 85, // 1.2.840.10008.6.1.984 "SUV Units" }, { 0, 0, 0, 4100, // 1.2.840.10008.6.1.985 "T1 Measurement Methods" }, { 0, 0, 0, 4101, // 1.2.840.10008.6.1.986 "Tracer Kinetic Models" }, { 0, 0, 0, 4102, // 1.2.840.10008.6.1.987 "Perfusion Measurement Methods" }, { 0, 0, 0, 4103, // 1.2.840.10008.6.1.988 "Arterial Input Function Measurement Methods" }, { 0, 0, 0, 4104, // 1.2.840.10008.6.1.989 "Bolus Arrival Time Derivation Methods" }, { 0, 0, 0, 4105, // 1.2.840.10008.6.1.990 "Perfusion Analysis Methods" }, { 0, 0, 0, 4106, // 1.2.840.10008.6.1.991 "Quantitative Methods used for Perfusion And Tracer Kinetic Models" }, { 0, 0, 0, 4107, // 1.2.840.10008.6.1.992 "Tracer Kinetic Model Parameters" }, { 0, 0, 0, 4108, // 1.2.840.10008.6.1.993 "Perfusion Model Parameters" }, { 0, 0, 0, 4109, // 1.2.840.10008.6.1.994 "Model-Independent Dynamic Contrast Analysis Parameters" }, { 0, 0, 0, 4110, // 1.2.840.10008.6.1.995 "Tracer Kinetic Modeling Covariates" }, { 0, 0, 0, 4111, // 1.2.840.10008.6.1.996 "Contrast Characteristics" }, { 0, 0, 0, 7021, // 1.2.840.10008.6.1.997 "Measurement Report Document Titles" }, { 0, 0, 0, 100, // 1.2.840.10008.6.1.998 "Quantitative Diagnostic Imaging Procedures" }, { 0, 0, 0, 7466, // 1.2.840.10008.6.1.999 "PET Region of Interest Measurements" }, { 0, 0, 0, 7467, // 1.2.840.10008.6.1.1000 "Grey Level Co-occurrence Matrix Measurements" }, { 0, 0, 0, 7468, // 1.2.840.10008.6.1.1001 "Texture Measurements" }, { 0, 0, 0, 6146, // 1.2.840.10008.6.1.1002 "Time Point Types" }, { 0, 0, 0, 7469, // 1.2.840.10008.6.1.1003 "Generic Intensity and Size Measurements" }, { 0, 0, 0, 6147, // 1.2.840.10008.6.1.1004 "Response Criteria" }, { 0, 0, 0, 12020, // 1.2.840.10008.6.1.1005 "Fetal Biometry Anatomic Sites" }, { 0, 0, 0, 12021, // 1.2.840.10008.6.1.1006 "Fetal Long Bone Anatomic Sites" }, { 0, 0, 0, 12022, // 1.2.840.10008.6.1.1007 "Fetal Cranium Anatomic Sites" }, { 0, 0, 0, 12023, // 1.2.840.10008.6.1.1008 "Pelvis and Uterus Anatomic Sites" }, { 0, 0, 0, 7222, // 1.2.840.10008.6.1.1009 "Parametric Map Derivation Image Purpose of Reference" }, { 0, 0, 0, 9000, // 1.2.840.10008.6.1.1010 "Physical Quantity Descriptors" }, { 0, 0, 0, 7600, // 1.2.840.10008.6.1.1011 "Lymph Node Anatomic Sites" }, { 0, 0, 0, 7601, // 1.2.840.10008.6.1.1012 "Head and Neck Cancer Anatomic Sites" }, { 0, 0, 0, 7701, // 1.2.840.10008.6.1.1013 "Fiber Tracts In Brainstem" }, { 0, 0, 0, 7702, // 1.2.840.10008.6.1.1014 "Projection and Thalamic Fibers" }, { 0, 0, 0, 7703, // 1.2.840.10008.6.1.1015 "Association Fibers" }, { 0, 0, 0, 7704, // 1.2.840.10008.6.1.1016 "Limbic System Tracts" }, { 0, 0, 0, 7705, // 1.2.840.10008.6.1.1017 "Commissural Fibers" }, { 0, 0, 0, 7706, // 1.2.840.10008.6.1.1018 "Cranial Nerves" }, { 0, 0, 0, 7707, // 1.2.840.10008.6.1.1019 "Spinal Cord Fibers" }, { 0, 0, 0, 7710, // 1.2.840.10008.6.1.1020 "Tractography Anatomic Sites" }, { 0, 0, 0, 4025, // 1.2.840.10008.6.1.1021 "Primary Anatomic Structure for Intra-oral Radiography" }, { 0, 0, 0, 4026, // 1.2.840.10008.6.1.1022 "Primary Anatomic Structure for Intra-oral and Craniofacial Radiography" }, { 0, 0, 0, 9401, // 1.2.840.10008.6.1.1023 "IEC61217 Device Position Parameters" }, { 0, 0, 0, 9402, // 1.2.840.10008.6.1.1024 "IEC61217 Gantry Position Parameters" }, { 0, 0, 0, 9403, // 1.2.840.10008.6.1.1025 "IEC61217 Patient Support Position Parameters" }, { 0, 0, 0, 7035, // 1.2.840.10008.6.1.1026 "Actionable Finding Classification" }, { 0, 0, 0, 7036, // 1.2.840.10008.6.1.1027 "Image Quality Assessment" }, { 0, 0, 0, 10050, // 1.2.840.10008.6.1.1028 "Summary Radiation Exposure Quantities" }, { 0, 0, 0, 4245, // 1.2.840.10008.6.1.1029 "Wide Field Ophthalmic Photography Transformation Method" }, { 0, 0, 0, 84, // 1.2.840.10008.6.1.1030 "PET Units" }, { 0, 0, 0, 7300, // 1.2.840.10008.6.1.1031 "Implant Materials" }, { 0, 0, 0, 7301, // 1.2.840.10008.6.1.1032 "Intervention Types" }, { 0, 0, 0, 7302, // 1.2.840.10008.6.1.1033 "Implant Templates View Orientations" }, { 0, 0, 0, 7303, // 1.2.840.10008.6.1.1034 "Implant Templates Modified View Orientations" }, { 0, 0, 0, 7304, // 1.2.840.10008.6.1.1035 "Implant Target Anatomy" }, { 0, 0, 0, 7305, // 1.2.840.10008.6.1.1036 "Implant Planning Landmarks" }, { 0, 0, 0, 7306, // 1.2.840.10008.6.1.1037 "Human Hip Implant Planning Landmarks" }, { 0, 0, 0, 7307, // 1.2.840.10008.6.1.1038 "Implant Component Types" }, { 0, 0, 0, 7308, // 1.2.840.10008.6.1.1039 "Human Hip Implant Component Types" }, { 0, 0, 0, 7309, // 1.2.840.10008.6.1.1040 "Human Trauma Implant Component Types" }, { 0, 0, 0, 7310, // 1.2.840.10008.6.1.1041 "Implant Fixation Method" }, { 0, 0, 0, 7445, // 1.2.840.10008.6.1.1042 "Device Participating Roles" }, { 0, 0, 0, 8101, // 1.2.840.10008.6.1.1043 "Container Types" }, { 0, 0, 0, 8102, // 1.2.840.10008.6.1.1044 "Container Component Types" }, { 0, 0, 0, 8103, // 1.2.840.10008.6.1.1045 "Anatomic Pathology Specimen Types" }, { 0, 0, 0, 8104, // 1.2.840.10008.6.1.1046 "Breast Tissue Specimen Types" }, { 0, 0, 0, 8109, // 1.2.840.10008.6.1.1047 "Specimen Collection Procedure" }, { 0, 0, 0, 8110, // 1.2.840.10008.6.1.1048 "Specimen Sampling Procedure" }, { 0, 0, 0, 8111, // 1.2.840.10008.6.1.1049 "Specimen Preparation Procedure" }, { 0, 0, 0, 8112, // 1.2.840.10008.6.1.1050 "Specimen Stains" }, { 0, 0, 0, 8113, // 1.2.840.10008.6.1.1051 "Specimen Preparation Steps" }, { 0, 0, 0, 8114, // 1.2.840.10008.6.1.1052 "Specimen Fixatives" }, { 0, 0, 0, 8115, // 1.2.840.10008.6.1.1053 "Specimen Embedding Media" }, { 0, 0, 0, 10020, // 1.2.840.10008.6.1.1054 "Source of Projection X-Ray Dose Information" }, { 0, 0, 0, 10021, // 1.2.840.10008.6.1.1055 "Source of CT Dose Information" }, { 0, 0, 0, 10025, // 1.2.840.10008.6.1.1056 "Radiation Dose Reference Points" }, { 0, 0, 0, 501, // 1.2.840.10008.6.1.1057 "Volumetric View Description" }, { 0, 0, 0, 502, // 1.2.840.10008.6.1.1058 "Volumetric View Modifier" }, { 0, 0, 0, 7260, // 1.2.840.10008.6.1.1059 "Diffusion Acquisition Value Types" }, { 0, 0, 0, 7261, // 1.2.840.10008.6.1.1060 "Diffusion Model Value Types" }, { 0, 0, 0, 7262, // 1.2.840.10008.6.1.1061 "Diffusion Tractography Algorithm Families" }, { 0, 0, 0, 7263, // 1.2.840.10008.6.1.1062 "Diffusion Tractography Measurement Types" }, { 0, 0, 0, 7490, // 1.2.840.10008.6.1.1063 "Research Animal Source Registries" }, { 0, 0, 0, 231, // 1.2.840.10008.6.1.1064 "Yes-No Only" }, { 0, 0, 0, 601, // 1.2.840.10008.6.1.1065 "Biosafety Levels" }, { 0, 0, 0, 602, // 1.2.840.10008.6.1.1066 "Biosafety Control Reasons" }, { 0, 0, 0, 7457, // 1.2.840.10008.6.1.1067 "Sex - Male Female or Both" }, { 0, 0, 0, 603, // 1.2.840.10008.6.1.1068 "Animal Room Types" }, { 0, 0, 0, 604, // 1.2.840.10008.6.1.1069 "Device Reuse" }, { 0, 0, 0, 605, // 1.2.840.10008.6.1.1070 "Animal Bedding Material" }, { 0, 0, 0, 606, // 1.2.840.10008.6.1.1071 "Animal Shelter Types" }, { 0, 0, 0, 607, // 1.2.840.10008.6.1.1072 "Animal Feed Types" }, { 0, 0, 0, 608, // 1.2.840.10008.6.1.1073 "Animal Feed Sources" }, { 0, 0, 0, 609, // 1.2.840.10008.6.1.1074 "Animal Feeding Methods" }, { 0, 0, 0, 610, // 1.2.840.10008.6.1.1075 "Water Types" }, { 0, 0, 0, 611, // 1.2.840.10008.6.1.1076 "Anesthesia Category Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 612, // 1.2.840.10008.6.1.1077 "Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 613, // 1.2.840.10008.6.1.1078 "Anesthesia Induction Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 614, // 1.2.840.10008.6.1.1079 "Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 615, // 1.2.840.10008.6.1.1080 "Anesthesia Maintenance Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 616, // 1.2.840.10008.6.1.1081 "Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 617, // 1.2.840.10008.6.1.1082 "Airway Management Method Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 618, // 1.2.840.10008.6.1.1083 "Airway Management Method Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 619, // 1.2.840.10008.6.1.1084 "Airway Management Sub-Method Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 620, // 1.2.840.10008.6.1.1085 "Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 621, // 1.2.840.10008.6.1.1086 "Medication Type Code Type for Small Animal Anesthesia" }, { 0, 0, 0, 622, // 1.2.840.10008.6.1.1087 "Medication Type Code Type from Anesthesia Quality Initiative (AQI)" }, { 0, 0, 0, 623, // 1.2.840.10008.6.1.1088 "Medication for Small Animal Anesthesia" }, { 0, 0, 0, 624, // 1.2.840.10008.6.1.1089 "Inhalational Anesthesia Agents for Small Animal Anesthesia" }, { 0, 0, 0, 625, // 1.2.840.10008.6.1.1090 "Injectable Anesthesia Agents for Small Animal Anesthesia" }, { 0, 0, 0, 626, // 1.2.840.10008.6.1.1091 "Premedication Agents for Small Animal Anesthesia" }, { 0, 0, 0, 627, // 1.2.840.10008.6.1.1092 "Neuromuscular Blocking Agents for Small Animal Anesthesia" }, { 0, 0, 0, 628, // 1.2.840.10008.6.1.1093 "Ancillary Medications for Small Animal Anesthesia" }, { 0, 0, 0, 629, // 1.2.840.10008.6.1.1094 "Carrier Gases for Small Animal Anesthesia" }, { 0, 0, 0, 630, // 1.2.840.10008.6.1.1095 "Local Anesthetics for Small Animal Anesthesia" }, { 0, 0, 0, 631, // 1.2.840.10008.6.1.1096 "Phase of Procedure Requiring Anesthesia" }, { 0, 0, 0, 632, // 1.2.840.10008.6.1.1097 "Phase of Surgical Procedure Requiring Anesthesia" }, { 0, 0, 0, 633, // 1.2.840.10008.6.1.1098 "Phase of Imaging Procedure Requiring Anesthesia" }, { 0, 0, 0, 634, // 1.2.840.10008.6.1.1099 "Phase of Animal Handling" }, { 0, 0, 0, 635, // 1.2.840.10008.6.1.1100 "Heating Method" }, { 0, 0, 0, 636, // 1.2.840.10008.6.1.1101 "Temperature Sensor Device Component Type for Small Animal Procedures" }, { 0, 0, 0, 637, // 1.2.840.10008.6.1.1102 "Exogenous Substance Types" }, { 0, 0, 0, 638, // 1.2.840.10008.6.1.1103 "Exogenous Substance" }, { 0, 0, 0, 639, // 1.2.840.10008.6.1.1104 "Tumor Graft Histologic Type" }, { 0, 0, 0, 640, // 1.2.840.10008.6.1.1105 "Fibrils" }, { 0, 0, 0, 641, // 1.2.840.10008.6.1.1106 "Viruses" }, { 0, 0, 0, 642, // 1.2.840.10008.6.1.1107 "Cytokines" }, { 0, 0, 0, 643, // 1.2.840.10008.6.1.1108 "Toxins" }, { 0, 0, 0, 644, // 1.2.840.10008.6.1.1109 "Exogenous Substance Administration Sites" }, { 0, 0, 0, 645, // 1.2.840.10008.6.1.1110 "Exogenous Substance Tissue of Origin" }, { 0, 0, 0, 646, // 1.2.840.10008.6.1.1111 "Preclinical Small Animal Imaging Procedures" }, { 0, 0, 0, 647, // 1.2.840.10008.6.1.1112 "Position Reference Indicator for Frame of Reference" }, { 0, 0, 0, 241, // 1.2.840.10008.6.1.1113 "Present-Absent Only" }, { 0, 0, 0, 10024, // 1.2.840.10008.6.1.1114 "Water Equivalent Diameter Method" }, { 0, 0, 0, 7022, // 1.2.840.10008.6.1.1115 "Radiotherapy Purposes of Reference" }, { 0, 0, 0, 701, // 1.2.840.10008.6.1.1116 "Content Assessment Types" }, { 0, 0, 0, 702, // 1.2.840.10008.6.1.1117 "RT Content Assessment Types" }, { 0, 0, 0, 703, // 1.2.840.10008.6.1.1118 "Basis of Assessment" }, { 0, 0, 0, 7449, // 1.2.840.10008.6.1.1119 "Reader Specialty" }, { 0, 0, 0, 9233, // 1.2.840.10008.6.1.1120 "Requested Report Types" }, { 0, 0, 0, 1000, // 1.2.840.10008.6.1.1121 "CT Transverse Plane Reference Basis" }, { 0, 0, 0, 1001, // 1.2.840.10008.6.1.1122 "Anatomical Reference Basis" }, { 0, 0, 0, 1002, // 1.2.840.10008.6.1.1123 "Anatomical Reference Basis - Head" }, { 0, 0, 0, 1003, // 1.2.840.10008.6.1.1124 "Anatomical Reference Basis - Spine" }, { 0, 0, 0, 1004, // 1.2.840.10008.6.1.1125 "Anatomical Reference Basis - Chest" }, { 0, 0, 0, 1005, // 1.2.840.10008.6.1.1126 "Anatomical Reference Basis - Abdomen/Pelvis" }, { 0, 0, 0, 1006, // 1.2.840.10008.6.1.1127 "Anatomical Reference Basis - Extremities" }, { 0, 0, 0, 1010, // 1.2.840.10008.6.1.1128 "Reference Geometry - Planes" }, { 0, 0, 0, 1011, // 1.2.840.10008.6.1.1129 "Reference Geometry - Points" }, { 0, 0, 0, 1015, // 1.2.840.10008.6.1.1130 "Patient Alignment Methods" }, { 0, 0, 0, 1200, // 1.2.840.10008.6.1.1131 "Contraindications For CT Imaging" }, { 0, 0, 0, 7110, // 1.2.840.10008.6.1.1132 "Fiducials Categories" }, { 0, 0, 0, 7111, // 1.2.840.10008.6.1.1133 "Fiducials" }, { 0, 0, 0, 7013, // 1.2.840.10008.6.1.1134 "Source Instance Purposes of Reference" }, { 0, 0, 0, 7023, // 1.2.840.10008.6.1.1135 "RT Process Output" }, { 0, 0, 0, 7024, // 1.2.840.10008.6.1.1136 "RT Process Input" }, { 0, 0, 0, 7025, // 1.2.840.10008.6.1.1137 "RT Process Input Used" }, { 0, 0, 0, 6300, // 1.2.840.10008.6.1.1138 "Prostate Sector Anatomy" }, { 0, 0, 0, 6301, // 1.2.840.10008.6.1.1139 "Prostate Sector Anatomy from PI-RADS v2" }, { 0, 0, 0, 6302, // 1.2.840.10008.6.1.1140 "Prostate Sector Anatomy from European Concensus 16 Sector (Minimal) Model" }, { 0, 0, 0, 6303, // 1.2.840.10008.6.1.1141 "Prostate Sector Anatomy from European Concensus 27 Sector (Optimal) Model" }, { 0, 0, 0, 12301, // 1.2.840.10008.6.1.1142 "Measurement Selection Reasons" }, { 0, 0, 0, 12302, // 1.2.840.10008.6.1.1143 "Echo Finding Observation Types" }, { 0, 0, 0, 12303, // 1.2.840.10008.6.1.1144 "Echo Measurement Types" }, { 0, 0, 0, 12304, // 1.2.840.10008.6.1.1145 "Echo Measured Properties" }, { 0, 0, 0, 12305, // 1.2.840.10008.6.1.1146 "Basic Echo Anatomic Sites" }, { 0, 0, 0, 12306, // 1.2.840.10008.6.1.1147 "Echo Flow Directions" }, { 0, 0, 0, 12307, // 1.2.840.10008.6.1.1148 "Cardiac Phases and Time Points" }, { 0, 0, 0, 12300, // 1.2.840.10008.6.1.1149 "Core Echo Measurements" }, { 0, 0, 0, 4270, // 1.2.840.10008.6.1.1150 "OCT-A Processing Algorithm Families" }, { 0, 0, 0, 4271, // 1.2.840.10008.6.1.1151 "En Face Image Types" }, { 0, 0, 0, 4272, // 1.2.840.10008.6.1.1152 "Opt Scan Pattern Types" }, { 0, 0, 0, 4273, // 1.2.840.10008.6.1.1153 "Retinal Segmentation Surfaces" }, { 0, 0, 0, 10060, // 1.2.840.10008.6.1.1154 "Organs for Radiation Dose Estimates" }, { 0, 0, 0, 10061, // 1.2.840.10008.6.1.1155 "Absorbed Radiation Dose Types" }, { 0, 0, 0, 10062, // 1.2.840.10008.6.1.1156 "Equivalent Radiation Dose Types" }, { 0, 0, 0, 10063, // 1.2.840.10008.6.1.1157 "Radiation Dose Estimate Distribution Representation" }, { 0, 0, 0, 10064, // 1.2.840.10008.6.1.1158 "Patient Model Type" }, { 0, 0, 0, 10065, // 1.2.840.10008.6.1.1159 "Radiation Transport Model Type" }, { 0, 0, 0, 10066, // 1.2.840.10008.6.1.1160 "Attenuator Category" }, { 0, 0, 0, 10067, // 1.2.840.10008.6.1.1161 "Radiation Attenuator Materials" }, { 0, 0, 0, 10068, // 1.2.840.10008.6.1.1162 "Estimate Method Types" }, { 0, 0, 0, 10069, // 1.2.840.10008.6.1.1163 "Radiation Dose Estimation Parameter" }, { 0, 0, 0, 10070, // 1.2.840.10008.6.1.1164 "Radiation Dose Types" }, { 0, 0, 0, 7270, // 1.2.840.10008.6.1.1165 "MR Diffusion Component Semantics" }, { 0, 0, 0, 7271, // 1.2.840.10008.6.1.1166 "MR Diffusion Anisotropy Indices" }, { 0, 0, 0, 7272, // 1.2.840.10008.6.1.1167 "MR Diffusion Model Parameters" }, { 0, 0, 0, 7273, // 1.2.840.10008.6.1.1168 "MR Diffusion Models" }, { 0, 0, 0, 7274, // 1.2.840.10008.6.1.1169 "MR Diffusion Model Fitting Methods" }, { 0, 0, 0, 7275, // 1.2.840.10008.6.1.1170 "MR Diffusion Model Specific Methods" }, { 0, 0, 0, 7276, // 1.2.840.10008.6.1.1171 "MR Diffusion Model Inputs" }, { 0, 0, 0, 7277, // 1.2.840.10008.6.1.1172 "Units of Diffusion Rate Area Over Time" }, { 0, 0, 0, 7039, // 1.2.840.10008.6.1.1173 "Pediatric Size Categories" }, { 0, 0, 0, 7041, // 1.2.840.10008.6.1.1174 "Calcium Scoring Patient Size Categories" }, { 0, 0, 0, 10034, // 1.2.840.10008.6.1.1175 "Reason for Repeating Acquisition" }, { 0, 0, 0, 800, // 1.2.840.10008.6.1.1176 "Protocol Assertion Codes" }, { 0, 0, 0, 7026, // 1.2.840.10008.6.1.1177 "Radiotherapeutic Dose Measurement Devices" }, { 0, 0, 0, 7014, // 1.2.840.10008.6.1.1178 "Export Additional Information Document Titles" }, { 0, 0, 0, 7015, // 1.2.840.10008.6.1.1179 "Export Delay Reasons" }, { 0, 0, 0, 7016, // 1.2.840.10008.6.1.1180 "Level of Difficulty" }, { 0, 0, 0, 7017, // 1.2.840.10008.6.1.1181 "Category of Teaching Material - Imaging" }, { 0, 0, 0, 7018, // 1.2.840.10008.6.1.1182 "Miscellaneous Document Titles" }, { 0, 0, 0, 7019, // 1.2.840.10008.6.1.1183 "Segmentation Non-Image Source Purposes of Reference" }, { 0, 0, 0, 280, // 1.2.840.10008.6.1.1184 "Longitudinal Temporal Event Types" }, { 0, 0, 0, 6401, // 1.2.840.10008.6.1.1185 "Non-lesion Object Type - Physical Objects" }, { 0, 0, 0, 6402, // 1.2.840.10008.6.1.1186 "Non-lesion Object Type - Substances" }, { 0, 0, 0, 6403, // 1.2.840.10008.6.1.1187 "Non-lesion Object Type - Tissues" }, { 0, 0, 0, 6404, // 1.2.840.10008.6.1.1188 "Chest Non-lesion Object Type - Physical Objects" }, { 0, 0, 0, 6405, // 1.2.840.10008.6.1.1189 "Chest Non-lesion Object Type - Tissues" }, { 0, 0, 0, 7191, // 1.2.840.10008.6.1.1190 "Tissue Segmentation Property Types" }, { 0, 0, 0, 7192, // 1.2.840.10008.6.1.1191 "Anatomical Structure Segmentation Property Types" }, { 0, 0, 0, 7193, // 1.2.840.10008.6.1.1192 "Physical Object Segmentation Property Types" }, { 0, 0, 0, 7194, // 1.2.840.10008.6.1.1193 "Morphologically Abnormal Structure Segmentation Property Types" }, { 0, 0, 0, 7195, // 1.2.840.10008.6.1.1194 "Function Segmentation Property Types" }, { 0, 0, 0, 7196, // 1.2.840.10008.6.1.1195 "Spatial and Relational Concept Segmentation Property Types" }, { 0, 0, 0, 7197, // 1.2.840.10008.6.1.1196 "Body Substance Segmentation Property Types" }, { 0, 0, 0, 7198, // 1.2.840.10008.6.1.1197 "Substance Segmentation Property Types" }, { 0, 0, 0, 9303, // 1.2.840.10008.6.1.1198 "Interpretation Request Discontinuation Reasons" }, { 0, 0, 0, 7475, // 1.2.840.10008.6.1.1199 "Gray Level Run Length Based Features" }, { 0, 0, 0, 7476, // 1.2.840.10008.6.1.1200 "Gray Level Size Zone Based Features" }, { 0, 0, 0, 7060, // 1.2.840.10008.6.1.1201 "Encapsulated Document Source Purposes of Reference" }, { 0, 0, 0, 7061, // 1.2.840.10008.6.1.1202 "Model Document Titles" }, { 0, 0, 0, 7062, // 1.2.840.10008.6.1.1203 "Purpose of Reference to Predecessor 3D Model" }, { 0, 0, 0, 7063, // 1.2.840.10008.6.1.1204 "Model Scale Units" }, { 0, 0, 0, 7064, // 1.2.840.10008.6.1.1205 "Model Usage" }, { 0, 0, 0, 10071, // 1.2.840.10008.6.1.1206 "Radiation Dose Units" }, { 0, 0, 0, 7112, // 1.2.840.10008.6.1.1207 "Radiotherapy Fiducials" }, { 0, 0, 0, 300, // 1.2.840.10008.6.1.1208 "Multi-energy Relevant Materials" }, { 0, 0, 0, 301, // 1.2.840.10008.6.1.1209 "Multi-energy Material Units" }, { 0, 0, 0, 9500, // 1.2.840.10008.6.1.1210 "Dosimetric Objective Types" }, { 0, 0, 0, 9501, // 1.2.840.10008.6.1.1211 "Prescription Anatomy Categories" }, { 0, 0, 0, 9502, // 1.2.840.10008.6.1.1212 "RT Segment Annotation Categories" }, { 0, 0, 0, 9503, // 1.2.840.10008.6.1.1213 "Radiotherapy Therapeutic Role Categories" }, { 0, 0, 0, 9504, // 1.2.840.10008.6.1.1214 "RT Geometric Information" }, { 0, 0, 0, 9505, // 1.2.840.10008.6.1.1215 "Fixation or Positioning Devices" }, { 0, 0, 0, 9506, // 1.2.840.10008.6.1.1216 "Brachytherapy Devices" }, { 0, 0, 0, 9507, // 1.2.840.10008.6.1.1217 "External Body Models" }, { 0, 0, 0, 9508, // 1.2.840.10008.6.1.1218 "Non-specific Volumes" }, { 0, 0, 0, 9509, // 1.2.840.10008.6.1.1219 "Purpose of Reference For RT Physician Intent Input" }, { 0, 0, 0, 9510, // 1.2.840.10008.6.1.1220 "Purpose of Reference For RT Treatment Planning Input" }, { 0, 0, 0, 9511, // 1.2.840.10008.6.1.1221 "General External Radiotherapy Procedure Techniques" }, { 0, 0, 0, 9512, // 1.2.840.10008.6.1.1222 "Tomotherapeutic Radiotherapy Procedure Techniques" }, { 0, 0, 0, 9513, // 1.2.840.10008.6.1.1223 "Fixation Devices" }, { 0, 0, 0, 9514, // 1.2.840.10008.6.1.1224 "Anatomical Structures For Radiotherapy" }, { 0, 0, 0, 9515, // 1.2.840.10008.6.1.1225 "RT Patient Support Devices" }, { 0, 0, 0, 9516, // 1.2.840.10008.6.1.1226 "Radiotherapy Bolus Device Types" }, { 0, 0, 0, 9517, // 1.2.840.10008.6.1.1227 "Radiotherapy Block Device Types" }, { 0, 0, 0, 9518, // 1.2.840.10008.6.1.1228 "Radiotherapy Accessory No-slot Holder Device Types" }, { 0, 0, 0, 9519, // 1.2.840.10008.6.1.1229 "Radiotherapy Accessory Slot Holder Device Types" }, { 0, 0, 0, 9520, // 1.2.840.10008.6.1.1230 "Segmented RT Accessory Devices" }, { 0, 0, 0, 9521, // 1.2.840.10008.6.1.1231 "Radiotherapy Treatment Energy Unit" }, { 0, 0, 0, 9522, // 1.2.840.10008.6.1.1232 "Multi-source Radiotherapy Procedure Techniques" }, { 0, 0, 0, 9523, // 1.2.840.10008.6.1.1233 "Robotic Radiotherapy Procedure Techniques" }, { 0, 0, 0, 9524, // 1.2.840.10008.6.1.1234 "Radiotherapy Procedure Techniques" }, { 0, 0, 0, 9525, // 1.2.840.10008.6.1.1235 "Radiation Therapy Particle" }, { 0, 0, 0, 9526, // 1.2.840.10008.6.1.1236 "Ion Therapy Particle" }, { 0, 0, 0, 9527, // 1.2.840.10008.6.1.1237 "Teletherapy Isotope" }, { 0, 0, 0, 9528, // 1.2.840.10008.6.1.1238 "Brachytherapy Isotope" }, { 0, 0, 0, 9529, // 1.2.840.10008.6.1.1239 "Single Dose Dosimetric Objectives" }, { 0, 0, 0, 9530, // 1.2.840.10008.6.1.1240 "Percentage and Dose Dosimetric Objectives" }, { 0, 0, 0, 9531, // 1.2.840.10008.6.1.1241 "Volume and Dose Dosimetric Objectives" }, { 0, 0, 0, 9532, // 1.2.840.10008.6.1.1242 "No-Parameter Dosimetric Objectives" }, { 0, 0, 0, 9533, // 1.2.840.10008.6.1.1243 "Delivery Time Structure" }, { 0, 0, 0, 9534, // 1.2.840.10008.6.1.1244 "Radiotherapy Targets" }, { 0, 0, 0, 9535, // 1.2.840.10008.6.1.1245 "Radiotherapy Dose Calculation Roles" }, { 0, 0, 0, 9536, // 1.2.840.10008.6.1.1246 "Radiotherapy Prescribing and Segmenting Person Roles" }, { 0, 0, 0, 9537, // 1.2.840.10008.6.1.1247 "Effective Dose Calculation Method Categories" }, { 0, 0, 0, 9538, // 1.2.840.10008.6.1.1248 "Radiation Transport-based Effective Dose Method Modifiers" }, { 0, 0, 0, 9539, // 1.2.840.10008.6.1.1249 "Fractionation-based Effective Dose Method Modifiers" }, { 0, 0, 0, 60, // 1.2.840.10008.6.1.1250 "Imaging Agent Administration Adverse Events" }, { 0, 0, 0, 61, // 1.2.840.10008.6.1.1251 "Time Relative to Procedure" }, { 0, 0, 0, 62, // 1.2.840.10008.6.1.1252 "Imaging Agent Administration Phase Type" }, { 0, 0, 0, 63, // 1.2.840.10008.6.1.1253 "Imaging Agent Administration Mode" }, { 0, 0, 0, 64, // 1.2.840.10008.6.1.1254 "Imaging Agent Administration Patient State" }, { 0, 0, 0, 65, // 1.2.840.10008.6.1.1255 "Pre-medication For Imaging Agent Administration" }, { 0, 0, 0, 66, // 1.2.840.10008.6.1.1256 "Medication For Imaging Agent Administration" }, { 0, 0, 0, 67, // 1.2.840.10008.6.1.1257 "Imaging Agent Administration Completion Status" }, { 0, 0, 0, 68, // 1.2.840.10008.6.1.1258 "Imaging Agent Administration Pharmaceutical Unit of Presentation" }, { 0, 0, 0, 69, // 1.2.840.10008.6.1.1259 "Imaging Agent Administration Consumables" }, { 0, 0, 0, 70, // 1.2.840.10008.6.1.1260 "Flush" }, { 0, 0, 0, 71, // 1.2.840.10008.6.1.1261 "Imaging Agent Administration Injector Event Type" }, { 0, 0, 0, 72, // 1.2.840.10008.6.1.1262 "Imaging Agent Administration Step Type" }, { 0, 0, 0, 73, // 1.2.840.10008.6.1.1263 "Bolus Shaping Curves" }, { 0, 0, 0, 74, // 1.2.840.10008.6.1.1264 "Imaging Agent Administration Consumable Catheter Type" }, { 0, 0, 0, 75, // 1.2.840.10008.6.1.1265 "Low-high-equal" }, { 0, 0, 0, 76, // 1.2.840.10008.6.1.1266 "Type of Pre-medication" }, { 0, 0, 0, 245, // 1.2.840.10008.6.1.1267 "Laterality with Median" }, { 0, 0, 0, 4029, // 1.2.840.10008.6.1.1268 "Dermatology Anatomic Sites" }, { 0, 0, 0, 218, // 1.2.840.10008.6.1.1269 "Quantitative Image Features" }, { 0, 0, 0, 7477, // 1.2.840.10008.6.1.1270 "Global Shape Descriptors" }, { 0, 0, 0, 7478, // 1.2.840.10008.6.1.1271 "Intensity Histogram Features" }, { 0, 0, 0, 7479, // 1.2.840.10008.6.1.1272 "Grey Level Distance Zone Based Features" }, { 0, 0, 0, 7500, // 1.2.840.10008.6.1.1273 "Neighbourhood Grey Tone Difference Based Features" }, { 0, 0, 0, 7501, // 1.2.840.10008.6.1.1274 "Neighbouring Grey Level Dependence Based Features" }, { 0, 0, 0, 4242, // 1.2.840.10008.6.1.1275 "Cornea Measurement Method Descriptors" }, { 0, 0, 0, 7027, // 1.2.840.10008.6.1.1276 "Segmented Radiotherapeutic Dose Measurement Devices" }, { 0, 0, 0, 6098, // 1.2.840.10008.6.1.1277 "Clinical Course of Disease" }, { 0, 0, 0, 6099, // 1.2.840.10008.6.1.1278 "Racial Group" }, { 0, 0, 0, 246, // 1.2.840.10008.6.1.1279 "Relative Laterality" }, { 0, 0, 0, 7168, // 1.2.840.10008.6.1.1280 "Brain Lesion Segmentation Types With Necrosis" }, { 0, 0, 0, 7169, // 1.2.840.10008.6.1.1281 "Brain Lesion Segmentation Types Without Necrosis" }, { 0, 0, 0, 32, // 1.2.840.10008.6.1.1282 "Non-Acquisition Modality" }, { 0, 0, 0, 33, // 1.2.840.10008.6.1.1283 "Modality" }, { 0, 0, 0, 247, // 1.2.840.10008.6.1.1284 "Laterality Left-Right Only" }, { 0, 0, 0, 210, // 1.2.840.10008.6.1.1285 "Qualitative Evaluation Modifier Types" }, { 0, 0, 0, 211, // 1.2.840.10008.6.1.1286 "Qualitative Evaluation Modifier Values" }, { 0, 0, 0, 212, // 1.2.840.10008.6.1.1287 "Generic Anatomic Location Modifiers" }, { 0, 0, 0, 9541, // 1.2.840.10008.6.1.1288 "Beam Limiting Device Types" }, { 0, 0, 0, 9542, // 1.2.840.10008.6.1.1289 "Compensator Device Types" }, { 0, 0, 0, 9543, // 1.2.840.10008.6.1.1290 "Radiotherapy Treatment Machine Modes" }, { 0, 0, 0, 9544, // 1.2.840.10008.6.1.1291 "Radiotherapy Distance Reference Locations" }, { 0, 0, 0, 9545, // 1.2.840.10008.6.1.1292 "Fixed Beam Limiting Device Types" }, { 0, 0, 0, 9546, // 1.2.840.10008.6.1.1293 "Radiotherapy Wedge Types" }, { 0, 0, 0, 9547, // 1.2.840.10008.6.1.1294 "RT Beam Limiting Device Orientation Labels" }, { 0, 0, 0, 9548, // 1.2.840.10008.6.1.1295 "General Accessory Device Types" }, { 0, 0, 0, 9549, // 1.2.840.10008.6.1.1296 "Radiation Generation Mode Types" }, { 0, 0, 0, 9550, // 1.2.840.10008.6.1.1297 "C-Arm Photon-Electron Delivery Rate Units" }, { 0, 0, 0, 9551, // 1.2.840.10008.6.1.1298 "Treatment Delivery Device Types" }, { 0, 0, 0, 9552, // 1.2.840.10008.6.1.1299 "C-Arm Photon-Electron Dosimeter Units" }, { 0, 0, 0, 9553, // 1.2.840.10008.6.1.1300 "Treatment Points" }, { 0, 0, 0, 9554, // 1.2.840.10008.6.1.1301 "Equipment Reference Points" }, { 0, 0, 0, 9555, // 1.2.840.10008.6.1.1302 "Radiotherapy Treatment Planning Person Roles" }, { 0, 0, 0, 7070, // 1.2.840.10008.6.1.1303 "Real Time Video Rendition Titles" }, { 0, 0, 0, 219, // 1.2.840.10008.6.1.1304 "Geometry Graphical Representation" }, { 0, 0, 0, 217, // 1.2.840.10008.6.1.1305 "Visual Explanation" }, { 2572, 2, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.7.1.1 "Native DICOM Model" }, { 0, 0, 0, 0, // 1.2.840.10008.7.1.2 "Abstract Multi-Dimensional Image Model" }, { 2575, 1, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.8.1.1 "DICOM Content Mapping Resource" }, { 0, 0, 0, 0, // 1.2.840.10008.9.1 "Imaging Report" }, { 0, 0, 0, 0, // 1.2.840.10008.9.2 "Clinical Information" }, { 0, 0, 0, 0, // 1.2.840.10008.9.3 "Imaging Procedure Description" }, { 0, 0, 0, 0, // 1.2.840.10008.9.4 "Comparison Study" }, { 0, 0, 0, 0, // 1.2.840.10008.9.5 "Impression" }, { 0, 0, 0, 0, // 1.2.840.10008.9.6 "Addendum" }, { 0, 0, 0, 0, // 1.2.840.10008.9.7 "Request" }, { 0, 0, 0, 0, // 1.2.840.10008.9.8 "Radiation Exposure and Protection Information" }, { 0, 0, 0, 0, // 1.2.840.10008.9.9 "Fetus Findings" }, { 0, 0, 0, 0, // 1.2.840.10008.9.10 "Labeled Subsection" }, { 0, 0, 0, 0, // 1.2.840.10008.9.11 "Communication of Actionable Findings" }, { 0, 0, 0, 0, // 1.2.840.10008.9.12 "Recommendation" }, { 0, 0, 0, 0, // 1.2.840.10008.9.13 "Procedural Medication" }, { 0, 0, 0, 0, // 1.2.840.10008.9.14 "Procedure Technique" }, { 0, 0, 0, 0, // 1.2.840.10008.9.15 "Image Quality" }, { 0, 0, 0, 0, // 1.2.840.10008.9.16 "Study Act" }, { 0, 0, 0, 0, // 1.2.840.10008.9.17 "Series Act" }, { 0, 0, 0, 0, // 1.2.840.10008.9.18 "SOP Instance Observation" }, { 0, 0, 0, 0, // 1.2.840.10008.9.19 "Section Text" }, { 0, 0, 0, 0, // 1.2.840.10008.9.20 "General Header" }, { 0, 0, 0, 0, // 1.2.840.10008.9.21 "Imaging Header" }, { 0, 0, 0, 0, // 1.2.840.10008.9.22 "Parent Document" }, { 0, 0, 0, 0, // 1.2.840.10008.9.23 "General Section Entries" }, { 0, 0, 0, 0, // 1.2.840.10008.9.24 "Imaging Addendum Report" }, { 0, 0, 0, 0, // 1.2.840.10008.10.1 "Video Endoscopic Image Real-Time Communication" }, { 0, 0, 0, 0, // 1.2.840.10008.10.2 "Video Photographic Image Real-Time Communication" }, { 0, 0, 0, 0, // 1.2.840.10008.10.3 "Audio Waveform Real-Time Communication" }, { 0, 0, 0, 0, // 1.2.840.10008.10.4 "Rendition Selection Document Real-Time Communication" }, { 2606, 2, 3, 0, 0 }, { 2647, 1, 1, 0, 0 }, { 2608, 31, 1, 0, 0 }, { 2639, 8, 1, 0, 0 }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.1 "dicomDeviceName" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.2 "dicomDescription" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.3 "dicomManufacturer" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.4 "dicomManufacturerModelName" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.5 "dicomSoftwareVersion" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.6 "dicomVendorData" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.7 "dicomAETitle" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.8 "dicomNetworkConnectionReference" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.9 "dicomApplicationCluster" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.10 "dicomAssociationInitiator" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.11 "dicomAssociationAcceptor" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.12 "dicomHostname" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.13 "dicomPort" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.14 "dicomSOPClass" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.15 "dicomTransferRole" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.16 "dicomTransferSyntax" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.17 "dicomPrimaryDeviceType" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.18 "dicomRelatedDeviceReference" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.19 "dicomPreferredCalledAETitle" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.20 "dicomTLSCyphersuite" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.21 "dicomAuthorizedNodeCertificateReference" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.22 "dicomThisNodeCertificateReference" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.23 "dicomInstalled" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.24 "dicomStationName" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.25 "dicomDeviceSerialNumber" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.26 "dicomInstitutionName" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.27 "dicomInstitutionAddress" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.28 "dicomInstitutionDepartmentName" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.29 "dicomIssuerOfPatientID" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.30 "dicomPreferredCallingAETitle" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.31 "dicomSupportedCharacterSet" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.1 "dicomConfigurationRoot" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.2 "dicomDevicesRoot" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.3 "dicomUniqueAETitlesRegistryRoot" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.4 "dicomDevice" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.5 "dicomNetworkAE" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.6 "dicomNetworkConnection" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.7 "dicomUniqueAETitle" }, { 0, 0, 0, 0, // 1.2.840.10008.15.0.4.8 "dicomTransferCapability" }, { 0, 0, 0, 0, // 1.2.840.10008.15.1.1 "Universal Coordinated Time" }, }; const UIDTableEntry *GetUIDTableEntry(const char *uid) { if (uid == 0) { return 0; } const char *prefix = "1.2.840.10008."; while (*prefix != '\0' && *uid != '\0' && *prefix == *uid) { prefix++; uid++; } if (*prefix != '\0') { return 0; } const UIDTableEntry *table = UIDTable; while (*uid != '\0') { int i = -1; if (*uid >= '0' && *uid <= '9') { if (uid[0] != '0' || uid[1] != '0') { i = 0; do { i *= 10; i += (*uid - '0'); uid++; } while (*uid >= '0' && *uid <= '9' && i < 214748364); } } if (*uid == '.') { uid++; if (*uid == '\0') { table = 0; break; } } else if (*uid != '\0') { table = 0; break; } i -= table->First; if (i < 0 || i >= static_cast(table->Size)) { table = 0; break; } table = &UIDTable[table->Next + i]; } return table; } } // anonymous namespace const char *vtkDICOMUtilities::GetUIDName(const char *uid) { const char *result = ""; const UIDTableEntry *table = GetUIDTableEntry(uid); if (table) { if (table->Name) { result = table->Name; } } return result; } unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid) { unsigned short result = 0; const UIDTableEntry *table = GetUIDTableEntry(uid); if (table) { result = table->CID; } return result; } vtk-dicom-0.8.12/Source/vtkDICOMUtilitiesUIDTable.h000066400000000000000000000015651356440565500217220ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMUtilitiesUIDTable_h #define vtkDICOMUtilitiesUIDTable_h #include "vtkDICOMUtilities.h" // The vtkDICOMUtilitiesUIDTable module contains auto-generated // code for the vtkDICOMUtilities class. As such, it does not // provide any classes of its own. #endif /* vtkDICOMUtilitiesUIDTable_h */ // VTK-HeaderTest-Exclude: vtkDICOMUtilitiesUIDTable.h vtk-dicom-0.8.12/Source/vtkDICOMVM.cxx000066400000000000000000000015301356440565500173220ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMVM.h" ostream& operator<<(ostream& o, const vtkDICOMVM& a) { int n = a.GetMin(); int m = a.GetMax(); int s = a.GetStep(); o << n; if (m > n || m < 0) { o << "-"; if (s > 1) { o << s; } if (m > 0) { o << m; } else { o << "n"; } } return o; } vtk-dicom-0.8.12/Source/vtkDICOMVM.h000066400000000000000000000242351356440565500167560ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMVM_h #define vtkDICOMVM_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro //! VMs (Value Multiplicities) class VTKDICOM_EXPORT vtkDICOMVM { public: enum EnumType { M0 = 0x0000, M0T1 = 0x0001, M0T2 = 0x0002, M0T3 = 0x0003, M0T4 = 0x0004, M0T5 = 0x0005, M0T6 = 0x0006, M0T7 = 0x0007, M0T8 = 0x0008, M0T9 = 0x0009, M0T10 = 0x000A, M0T11 = 0x000B, M0T12 = 0x000C, M0T13 = 0x000D, M0T14 = 0x000E, M0T15 = 0x000F, M0T16 = 0x0010, M0T17 = 0x0011, M0T18 = 0x0012, M0T19 = 0x0013, M0T20 = 0x0014, M0T21 = 0x0015, M0T22 = 0x0016, M0T23 = 0x0017, M0T24 = 0x0018, M0T25 = 0x0019, M0T26 = 0x001A, M0T27 = 0x001B, M0T28 = 0x001C, M0T29 = 0x001D, M0T30 = 0x001E, M0T31 = 0x001F, M0T32 = 0x0020, M0T63 = 0x003F, M0T64 = 0x0040, M0T99 = 0x0063, M0T4N = 0x00FC, M0T3N = 0x00FD, M0T2N = 0x00FE, M0TN = 0x00FF, M1 = 0x0101, M1T2 = 0x0102, M1T3 = 0x0103, M1T4 = 0x0104, M1T5 = 0x0105, M1T6 = 0x0106, M1T7 = 0x0107, M1T8 = 0x0108, M1T9 = 0x0109, M1T10 = 0x010A, M1T11 = 0x010B, M1T12 = 0x010C, M1T13 = 0x010D, M1T14 = 0x010E, M1T15 = 0x010F, M1T16 = 0x0110, M1T17 = 0x0111, M1T18 = 0x0112, M1T19 = 0x0113, M1T20 = 0x0114, M1T21 = 0x0115, M1T22 = 0x0116, M1T23 = 0x0117, M1T24 = 0x0118, M1T25 = 0x0119, M1T26 = 0x011A, M1T27 = 0x011B, M1T28 = 0x011C, M1T29 = 0x011D, M1T30 = 0x011E, M1T31 = 0x011F, M1T32 = 0x0120, M1T63 = 0x013F, M1T64 = 0x0140, M1T99 = 0x0163, M1TN = 0x01FF, M2 = 0x0202, M2T3 = 0x0203, M2T4 = 0x0204, M2T5 = 0x0205, M2T6 = 0x0206, M2T7 = 0x0207, M2T8 = 0x0208, M2T9 = 0x0209, M2T10 = 0x020A, M2T11 = 0x020B, M2T12 = 0x020C, M2T13 = 0x020D, M2T14 = 0x020E, M2T15 = 0x020F, M2T16 = 0x0210, M2T17 = 0x0211, M2T18 = 0x0212, M2T19 = 0x0213, M2T20 = 0x0214, M2T21 = 0x0215, M2T22 = 0x0216, M2T23 = 0x0217, M2T24 = 0x0218, M2T25 = 0x0219, M2T26 = 0x021A, M2T27 = 0x021B, M2T28 = 0x021C, M2T29 = 0x021D, M2T30 = 0x021E, M2T31 = 0x021F, M2T32 = 0x0220, M2T63 = 0x023F, M2T64 = 0x0240, M2T99 = 0x0263, M2T2N = 0x02FE, M2TN = 0x02FF, M3 = 0x0303, M3T4 = 0x0304, M3T5 = 0x0305, M3T6 = 0x0306, M3T7 = 0x0307, M3T8 = 0x0308, M3T9 = 0x0309, M3T10 = 0x030A, M3T11 = 0x030B, M3T12 = 0x030C, M3T13 = 0x030D, M3T14 = 0x030E, M3T15 = 0x030F, M3T16 = 0x0310, M3T17 = 0x0311, M3T18 = 0x0312, M3T19 = 0x0313, M3T20 = 0x0314, M3T21 = 0x0315, M3T22 = 0x0316, M3T23 = 0x0317, M3T24 = 0x0318, M3T25 = 0x0319, M3T26 = 0x031A, M3T27 = 0x031B, M3T28 = 0x031C, M3T29 = 0x031D, M3T30 = 0x031E, M3T31 = 0x031F, M3T32 = 0x0320, M3T63 = 0x033F, M3T64 = 0x0340, M3T99 = 0x0363, M3T3N = 0x03FD, M3TN = 0x03FF, M4 = 0x0404, M4T5 = 0x0405, M4T6 = 0x0406, M4T7 = 0x0407, M4T8 = 0x0408, M4T9 = 0x0409, M4T10 = 0x040A, M4T11 = 0x040B, M4T12 = 0x040C, M4T13 = 0x040D, M4T14 = 0x040E, M4T15 = 0x040F, M4T16 = 0x0410, M4T17 = 0x0411, M4T18 = 0x0412, M4T19 = 0x0413, M4T20 = 0x0414, M4T21 = 0x0415, M4T22 = 0x0416, M4T23 = 0x0417, M4T24 = 0x0418, M4T25 = 0x0419, M4T26 = 0x041A, M4T27 = 0x041B, M4T28 = 0x041C, M4T29 = 0x041D, M4T30 = 0x041E, M4T31 = 0x041F, M4T32 = 0x0420, M4T63 = 0x043F, M4T64 = 0x0440, M4T99 = 0x0463, M4T4N = 0x04FC, M4TN = 0x04FF, M5 = 0x0505, M5T6 = 0x0506, M5T7 = 0x0507, M5T8 = 0x0508, M5T9 = 0x0509, M5T10 = 0x050A, M5T11 = 0x050B, M5T12 = 0x050C, M5T13 = 0x050D, M5T14 = 0x050E, M5T15 = 0x050F, M5T16 = 0x0510, M5T17 = 0x0511, M5T18 = 0x0512, M5T19 = 0x0513, M5T20 = 0x0514, M5T21 = 0x0515, M5T22 = 0x0516, M5T23 = 0x0517, M5T24 = 0x0518, M5T25 = 0x0519, M5T26 = 0x051A, M5T27 = 0x051B, M5T28 = 0x051C, M5T29 = 0x051D, M5T30 = 0x051E, M5T31 = 0x051F, M5T32 = 0x0520, M5T63 = 0x053F, M5T64 = 0x0540, M5T99 = 0x0563, M5T5N = 0x05FB, M5TN = 0x05FF, M6 = 0x0606, M6T7 = 0x0607, M6T8 = 0x0608, M6T9 = 0x0609, M6T10 = 0x060A, M6T11 = 0x060B, M6T12 = 0x060C, M6T13 = 0x060D, M6T14 = 0x060E, M6T15 = 0x060F, M6T16 = 0x0610, M6T17 = 0x0611, M6T18 = 0x0612, M6T19 = 0x0613, M6T20 = 0x0614, M6T21 = 0x0615, M6T22 = 0x0616, M6T23 = 0x0617, M6T24 = 0x0618, M6T25 = 0x0619, M6T26 = 0x061A, M6T27 = 0x061B, M6T28 = 0x061C, M6T29 = 0x061D, M6T30 = 0x061E, M6T31 = 0x061F, M6T32 = 0x0620, M6T63 = 0x063F, M6T64 = 0x0640, M6T99 = 0x0663, M6T6N = 0x06FA, M6TN = 0x06FF, M7 = 0x0707, M7T8 = 0x0708, M7T9 = 0x0709, M7T10 = 0x070A, M7T11 = 0x070B, M7T12 = 0x070C, M7T13 = 0x070D, M7T14 = 0x070E, M7T15 = 0x070F, M7T16 = 0x0710, M7T17 = 0x0711, M7T18 = 0x0712, M7T19 = 0x0713, M7T20 = 0x0714, M7T21 = 0x0715, M7T22 = 0x0716, M7T23 = 0x0717, M7T24 = 0x0718, M7T25 = 0x0719, M7T26 = 0x071A, M7T27 = 0x071B, M7T28 = 0x071C, M7T29 = 0x071D, M7T30 = 0x071E, M7T31 = 0x071F, M7T32 = 0x0720, M7T63 = 0x073F, M7T64 = 0x0740, M7T99 = 0x0763, M7T7N = 0x07F9, M7TN = 0x07FF, M8 = 0x0808, M8T9 = 0x0809, M8T10 = 0x080A, M8T11 = 0x080B, M8T12 = 0x080C, M8T13 = 0x080D, M8T14 = 0x080E, M8T15 = 0x080F, M8T16 = 0x0810, M8T17 = 0x0811, M8T18 = 0x0812, M8T19 = 0x0813, M8T20 = 0x0814, M8T21 = 0x0815, M8T22 = 0x0816, M8T23 = 0x0817, M8T24 = 0x0818, M8T25 = 0x0819, M8T26 = 0x081A, M8T27 = 0x081B, M8T28 = 0x081C, M8T29 = 0x081D, M8T30 = 0x081E, M8T31 = 0x081F, M8T32 = 0x0820, M8T63 = 0x083F, M8T64 = 0x0840, M8T99 = 0x0863, M8T8N = 0x08F8, M8TN = 0x08FF, M9 = 0x0909, M9T10 = 0x090A, M9T11 = 0x090B, M9T12 = 0x090C, M9T13 = 0x090D, M9T14 = 0x090E, M9T15 = 0x090F, M9T16 = 0x0910, M9T17 = 0x0911, M9T18 = 0x0912, M9T19 = 0x0913, M9T20 = 0x0914, M9T21 = 0x0915, M9T22 = 0x0916, M9T23 = 0x0917, M9T24 = 0x0918, M9T25 = 0x0919, M9T26 = 0x091A, M9T27 = 0x091B, M9T28 = 0x091C, M9T29 = 0x091D, M9T30 = 0x091E, M9T31 = 0x091F, M9T32 = 0x0920, M9T63 = 0x093F, M9T64 = 0x0940, M9T99 = 0x0963, M9T9N = 0x09F7, M9TN = 0x09FF, M10 = 0x0A0A, M10TN = 0x0AFF, M11 = 0x0B0B, M11TN = 0x0BFF, M12 = 0x0C0C, M12TN = 0x0CFF, M13 = 0x0D0D, M13TN = 0x0DFF, M14 = 0x0E0E, M14TN = 0x0EFF, M15 = 0x0F0F, M15TN = 0x0FFF, M16 = 0x1010, M16TN = 0x10FF, M17 = 0x1111, M17TN = 0x11FF, M18 = 0x1212, M18TN = 0x12FF, M19 = 0x1313, M19TN = 0x13FF, M20 = 0x1414, M20TN = 0x14FF, M21 = 0x1515, M21TN = 0x15FF, M22 = 0x1616, M22TN = 0x16FF, M23 = 0x1717, M23TN = 0x17FF, M24 = 0x1818, M24TN = 0x18FF, M25 = 0x1919, M25TN = 0x19FF, M26 = 0x1A1A, M26TN = 0x1AFF, M27 = 0x1B1B, M27TN = 0x1BFF, M28 = 0x1C1C, M28TN = 0x1CFF, M29 = 0x1D1D, M29TN = 0x1DFF, M30 = 0x1E1E, M30TN = 0x1EFF, M30T30N = 0x1EE2, M31 = 0x1F1F, M31TN = 0x1FFF, M32 = 0x2020, M32TN = 0x20FF, M35 = 0x2323, M35TN = 0x23FF, M47 = 0x2F2F, M47TN = 0x2FFF, M47T47N = 0x2FD1, M63 = 0x3F3F, M63TN = 0x3FFF, M64 = 0x4040, M64TN = 0x40FF, M99 = 0x6363, M99TN = 0x63FF, M100 = 0x6464, M110 = 0x6E6E, M127 = 0x7F7F, M128 = 0x8080, M255 = 0x80FF, M256 = 0x8100, M511 = 0x81FF, M512 = 0x8200, M768 = 0x8300, M1024 = 0x8400, M2048 = 0x8800, M4096 = 0x9000, M8192 = 0xA000 }; //@{ //! Construct an empty, invalid VM. vtkDICOMVM() : Key(0) {} //! Construct a VM from a VM enum constant. vtkDICOMVM(EnumType vm) : Key(static_cast(vm)) {} //@} //@{ //! Check validity of this VM. bool IsValid() const { return (this->Key != 0); } //! Get the minimum allowed number of values int GetMin() const { if ((this->Key & 0x8000) != 0) { return (this->Key & 0x7fff); } else { return (this->Key >> 8); } } //! Get the maximum allowed number of values, -1 if unlimited int GetMax() const { if ((this->Key & 0x8000) != 0) { return (this->Key & 0x7fff); } else { return ((this->Key & 0x80) == 0 ? (this->Key & 0xff) : -1); } } //! Get the step between allowed values. int GetStep() const { if ((this->Key & 0x8000) != 0) { return 1; } else { return ((this->Key & 0x80) == 0 ? 1 : ((-this->Key) & 0xff)); } } //@} //@{ bool operator==(vtkDICOMVM b) const { return (this->Key == b.Key); } bool operator!=(vtkDICOMVM b) const { return (this->Key != b.Key); } bool operator<=(vtkDICOMVM a) const { return (this->Key <= a.Key); } bool operator>=(vtkDICOMVM a) const { return (this->Key >= a.Key); } bool operator<(vtkDICOMVM a) const { return (this->Key < a.Key); } bool operator>(vtkDICOMVM a) const { return (this->Key > a.Key); } //@} private: unsigned short Key; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMVM& a); #endif /* vtkDICOMVM_h */ // VTK-HeaderTest-Exclude: vtkDICOMVM.h vtk-dicom-0.8.12/Source/vtkDICOMVR.cxx000066400000000000000000000307631356440565500173410ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMVR.h" #include "vtkDICOMValue.h" ostream& operator<<(ostream& o, const vtkDICOMVR& a) { o << a.GetText(); return o; } namespace { typedef vtkDICOMVR VR; const unsigned char AXT[256] = { // AE AS AT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, VR::AE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, VR::AS, VR::AT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char CXT[256] = { // CS 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, VR::CS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char DXT[256] = { // DA DS DT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, VR::DA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, VR::DS, VR::DT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char FXT[256] = { // FD FL 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, VR::FD, 0, 0, 0, 0, 0, 0, 0, VR::FL, 0, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char IXT[256] = { // IS 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, VR::IS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char LXT[256] = { // LO LT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VR::LO, // ABCDEFGHIJKLMNO 0, 0, 0, 0, VR::LT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char OXT[256] = { // OB OF OL OV OW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,VR::OB,0,VR::OD,0,VR::OF,0,0,0,0,0,VR::OL,0,0,0, // ABCDEFGHIJKLMNO 0, 0, 0, 0, 0, 0, VR::OV, VR::OW, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char PXT[256] = { // PN 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VR::PN, 0, // ABCDEFGHIJKLMNO 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char SXT[256] = { // SH SL SQ SS ST SV 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, VR::SH, 0, 0, 0, VR::SL, 0, 0, 0, // ABCDEFGHIJKLMNO 0, VR::SQ, 0, VR::SS, VR::ST, 0, VR::SV, 0,0,0,0,0,0,0,0,0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char TXT[256] = { // TM 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VR::TM, 0, 0, // ABCDEFGHIJKLMNO 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; const unsigned char UXT[256] = { // UI UL UN US UT UV 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,VR::UC,0,0,0,0,0,VR::UI,0,0,VR::UL,0,VR::UN,0, // ABCDEFGHIJKLMNO 0, 0, VR::UR,VR::US,VR::UT, 0, VR::UV, 0,0,0,0,0,0,0,0,0, // PQRSTUVWXYZ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; const unsigned char XXT[256] = { // Invalid VR 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; } // end anonymous namespace const unsigned char *vtkDICOMVR::VRTable[256] = { XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,AXT,XXT,CXT,DXT,XXT,FXT,XXT,XXT,IXT,XXT,XXT,LXT,XXT,XXT,OXT, PXT,XXT,XXT,SXT,TXT,UXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT,XXT, }; const unsigned char vtkDICOMVR::TypeTable[37] = { VTK_VOID, // Invalid VTK_CHAR, // AE Application Entity VTK_CHAR, // AS Age String VTK_DICOM_TAG, // AT Attribute Tag VTK_CHAR, // CS Code String VTK_CHAR, // DA Date VTK_CHAR, // DS Decimal String VTK_CHAR, // DT Date Time VTK_DOUBLE, // FD Double VTK_FLOAT, // FL Float VTK_CHAR, // IS Integer String VTK_CHAR, // LO Long String VTK_CHAR, // LT Long Text VTK_UNSIGNED_CHAR, // OB Other Byte VTK_DOUBLE, // OD Other Double VTK_FLOAT, // OF Other Float VTK_UNSIGNED_INT, // OL Other Long VTK_UNSIGNED_SHORT, // OW Other Word VTK_CHAR, // PN Personal Name VTK_CHAR, // SH Short String VTK_INT, // SL Signed Long VTK_DICOM_ITEM, // SQ Sequence VTK_SHORT, // SS Signed Short VTK_CHAR, // ST Short Text VTK_CHAR, // TM Time VTK_CHAR, // UC Unlimited Characters VTK_CHAR, // UI UID VTK_UNSIGNED_INT, // UL Unsigned Long VTK_UNSIGNED_CHAR, // UN Unknown VTK_CHAR, // UR URI or URL VTK_UNSIGNED_SHORT, // US Unsigned Short VTK_CHAR, // UT Unlimited Text VTK_VOID, // Invalid VTK_VOID, // Invalid VTK_UNSIGNED_LONG_LONG, // OV Other Very Long VTK_LONG_LONG, // SV Signed Very Long VTK_UNSIGNED_LONG_LONG, // UV Unsigned Very Long }; const char vtkDICOMVR::TextTable[37][4] = { { 0, 0, 0, 0 }, // Invalid { 'A', 'E', 0, 0 }, // AE Application Entity { 'A', 'S', 0, 0 }, // AS Age String { 'A', 'T', 0, 0 }, // AT Attribute Tag { 'C', 'S', 0, 0 }, // CS Code String { 'D', 'A', 0, 0 }, // DA Date { 'D', 'S', 0, 0 }, // DS Decimal String { 'D', 'T', 0, 0 }, // DT Date Time { 'F', 'D', 0, 0 }, // FD Double { 'F', 'L', 0, 0 }, // FL Float { 'I', 'S', 0, 0 }, // IS Integer String { 'L', 'O', 0, 0 }, // LO Long String { 'L', 'T', 0, 0 }, // LT Long Text { 'O', 'B', 0, 0 }, // OB Other Byte { 'O', 'D', 0, 0 }, // OD Other Double { 'O', 'F', 0, 0 }, // OF Other Float { 'O', 'L', 0, 0 }, // OL Other Long { 'O', 'W', 0, 0 }, // OW Other Word { 'P', 'N', 0, 0 }, // PN Personal Name { 'S', 'H', 0, 0 }, // SH Short String { 'S', 'L', 0, 0 }, // SL Signed Long { 'S', 'Q', 0, 0 }, // SQ Sequence { 'S', 'S', 0, 0 }, // SS Signed Short { 'S', 'T', 0, 0 }, // ST Short Text { 'T', 'M', 0, 0 }, // TM Time { 'U', 'C', 0, 0 }, // UC Unlimited Characters { 'U', 'I', 0, 0 }, // UI UID { 'U', 'L', 0, 0 }, // UL Unsigned Long { 'U', 'N', 0, 0 }, // UN Unknown { 'U', 'R', 0, 0 }, // UR URI or URL { 'U', 'S', 0, 0 }, // US Unsigned Short { 'U', 'T', 0, 0 }, // UT Unlimited Text { 'O', 'X', 0, 0 }, // Invalid { 'X', 'S', 0, 0 }, // Invalid { 'O', 'V', 0, 0 }, // OV Other Very Long { 'S', 'V', 0, 0 }, // SV Signed Very Long { 'U', 'V', 0, 0 }, // UV Unsigned Very Long }; vtk-dicom-0.8.12/Source/vtkDICOMVR.h000066400000000000000000000114341356440565500167600ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMVR_h #define vtkDICOMVR_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro //! VRs (Value Representations) class VTKDICOM_EXPORT vtkDICOMVR { public: //! The VR enum constants. /*! * Sorting the constants numerically will sort the VRs alphabetically. */ enum EnumType { XX = 0x00, //!< Null (No Value) AE = 0x01, //!< Application Entity AS = 0x02, //!< Age String AT = 0x03, //!< Attribute Tag CS = 0x04, //!< Code String DA = 0x05, //!< Date DS = 0x06, //!< Decimal String DT = 0x07, //!< Date Time FD = 0x08, //!< Floating Point Double FL = 0x09, //!< Floating Point Single IS = 0x0a, //!< Integer String LO = 0x0b, //!< Long String LT = 0x0c, //!< Long Text OB = 0x0d, //!< Other Byte OD = 0x0e, //!< Other Double OF = 0x0f, //!< Other Float OL = 0x10, //!< Other Long OW = 0x11, //!< Other Word PN = 0x12, //!< Personal Name SH = 0x13, //!< Short String SL = 0x14, //!< Signed Long SQ = 0x15, //!< Sequence of Items SS = 0x16, //!< Signed Short ST = 0x17, //!< Short Text TM = 0x18, //!< Time UC = 0x19, //!< Unlimited Characters UI = 0x1a, //!< Unique Identifier UL = 0x1b, //!< Unsigned Long UN = 0x1c, //!< Unknown UR = 0x1d, //!< URI or URL US = 0x1e, //!< Unsigned Short UT = 0x1f, //!< Unlimited Text OX = 0x20, //!< Either OB or OW (for dict entries, not data elements) XS = 0x21, //!< Either SS or US (for dict entries, not data elements) OV = 0x22, //!< Other Very Long SV = 0x23, //!< Signed Very Long UV = 0x24, //!< Unsigned Very Long }; //@{ //! Construct an empty, invalid VR. vtkDICOMVR() : Key(0) {} //! Construct a VR from a VR enum constant. vtkDICOMVR(EnumType vr) : Key(static_cast(vr)) {} //! Attempt to construct a VR from a two-byte string. vtkDICOMVR(const char *vr) : Key(VRTable[static_cast(vr[0])] [static_cast(vr[1])]) {} //! Attempt to construct a VR from a two unsigned bytes. vtkDICOMVR(const unsigned char vr[2]) : Key(VRTable[vr[0]][vr[1]]) {} //@} //@{ //! Check validity of this VR. bool IsValid() const { return (this->Key != 0); } //! Get the data type for this VR. int GetType() const { return TypeTable[this->Key]; } //! Get the two-character text for this VR. const char *GetText() const { return TextTable[this->Key]; } //@} //@{ //! The VRs OB, OD, OF, OL, OW, OV, SQ, UC, UN, UR, UT require a 32-bit VL. bool HasLongVL() const { return (((1ull << this->Key) & 0x1cb223e001ull) != 0); } //! The VRs SH, LO, PN, ST, LT, UC, and UT use SpecificCharacterSet. bool HasSpecificCharacterSet() const { return (((1ull << this->Key) & 0x828c1800ull) != 0); } //! This is true for all VRs whose value is stored as text. bool HasTextValue() const { return (((1ull << this->Key) & 0xa78c1cf6ull) != 0); } //! This is true for for all VRs that store numbers. /*! * The VRs included are IS, DS, US, UL, UV, SS, SL, SV, FL, FD. The VRs * OB, OW, OL, OV, OF, and OD are not included. */ bool HasNumericValue() const { return (((1ull << this->Key) & 0x1848500740ull) != 0); } //! The VRs ST, LT, and UT carry only one value. /*! * Specifically, this means that a backslash is not interpreted as a * value separator in these VRs. UR is not included, because backslash * is an illegal character in UR. */ bool HasSingleValue() const { return (((1ull << this->Key) & 0x80801000ull) != 0); } //@} //@{ bool operator==(vtkDICOMVR a) const { return (this->Key == a.Key); } bool operator!=(vtkDICOMVR a) const { return (this->Key != a.Key); } bool operator<=(vtkDICOMVR a) const { return (this->Key <= a.Key); } bool operator>=(vtkDICOMVR a) const { return (this->Key >= a.Key); } bool operator<(vtkDICOMVR a) const { return (this->Key < a.Key); } bool operator>(vtkDICOMVR a) const { return (this->Key > a.Key); } //@} private: unsigned char Key; static const unsigned char *VRTable[256]; static const unsigned char TypeTable[37]; static const char TextTable[37][4]; }; VTKDICOM_EXPORT ostream& operator<<(ostream& o, const vtkDICOMVR& a); #endif /* vtkDICOMVR_h */ // VTK-HeaderTest-Exclude: vtkDICOMVR.h vtk-dicom-0.8.12/Source/vtkDICOMValue.cxx000066400000000000000000002320271356440565500200630ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMValue.h" #include "vtkDICOMItem.h" #include "vtkDICOMSequence.h" #include "vtkDICOMUtilities.h" #include "vtkMath.h" #include "vtkTypeTraits.h" #include #include #include #include #include #include #include #include #include // For use by methods that must return an empty item const vtkDICOMItem vtkDICOMValue::EmptyItem; //---------------------------------------------------------------------------- // Use anonymous namespace to limit function scope to this file only namespace { // Cast an array of "n" values from type "IT" to type "OT". template void NumericalConversion(IT *u, OT *v, size_t n) { if (n != 0) { do { *v++ = static_cast(*u++); } while (--n); } } // Check for hexadecimal digits, plain ASCII (don't use locale) bool IsHexDigit(char c) { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); } // Buffer for reading from character string class InputString : public std::streambuf { public: InputString(const char *ccp, size_t l) { char *cp = const_cast(ccp); setg(cp, cp, cp+l); } }; // Buffer for writing to a character string class OutputString : public std::streambuf { public: OutputString(char *cp, size_t l) { setp(cp, cp+l); } size_t length() const { return pptr() - pbase(); } void adjust(int n) { pbump(n); } }; // The input is a list of one or more numerical string values separated // by backslashes, for example "1.23435\85234.0\2345.22". Convert "n" // values to type OT, starting at the "i"th backslash-separated value. template void StringConversion( const char *cp, vtkDICOMVR vr, OT *v, size_t i, size_t n) { if (vr == vtkDICOMVR::IS || vr == vtkDICOMVR::DS) { // create a stream for conversion with "C" locale InputString sb(cp, strlen(cp)); std::istream sbs(&sb); sbs.imbue(std::locale::classic()); for (size_t j = 0; j < i && !sbs.eof(); j++) { sbs.ignore(std::numeric_limits::max(), '\\'); } for (size_t k = 0; k < n && !sbs.eof(); k++) { if (vr == vtkDICOMVR::DS) { double d = 0.0; sbs >> d; *v++ = static_cast(d); } else { OT d = 0; sbs >> d; *v++ = d; } if (k + 1 < n) { sbs.ignore(std::numeric_limits::max(), '\\'); } } } else if (n > 0) { do { *v++ = 0; } while (--n); } } // specialize conversion for vtkDICOMTag void StringConversionAT(const char *cp, vtkDICOMTag *v, size_t n) { for (size_t k = 0; k < n && *cp != '\0'; k++) { unsigned short tag[2] = { 0, 0 }; for (int j = 0; j < 2; j++) { while (!IsHexDigit(*cp) && *cp != '\\' && *cp != '\0') { cp++; } for (int i = 0; i < 4; i++) { unsigned short d; if (*cp >= '0' && *cp <= '9') { d = *cp - '0'; } else if (*cp >= 'A' && *cp <= 'F') { d = *cp - ('A' - 10); } else if (*cp >= 'a' && *cp <= 'f') { d = *cp - ('a' - 10); } else { break; } tag[j] = tag[j]*16 + d; cp++; } } *v++ = vtkDICOMTag(tag[0], tag[1]); bool bk = false; do { bk = (*cp == '\\'); cp++; } while (!bk && *cp != '\0'); } } // custom allocator void *ValueMalloc(size_t size) { void *vp = 0; while ((vp = malloc(size)) == 0) { // for C++11, get_new_handler is preferred std::new_handler global_handler = std::set_new_handler(0); std::set_new_handler(global_handler); if (global_handler) { global_handler(); } else { throw std::bad_alloc(); } } return vp; } // custom deallocator void ValueFree(void *vp) { free(vp); } } // end anonymous namespace #ifdef VTK_DICOM_USE_OVERFLOW_BYTE #define OVERFLOW_BYTE(vn) static_cast(vn >> 32) #else #define OVERFLOW_BYTE(vn) 0 #endif //---------------------------------------------------------------------------- // Construct a numerical value. template vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { this->Type = static_cast(vtkTypeTraits::VTKTypeID()); this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; this->VL = static_cast(vn*sizeof(T)); this->NumberOfValues = static_cast(vn); } // Construct a string value. template<> vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { vn += (vn & 1); // pad VL to make it even this->Type = VTK_CHAR; this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; this->VL = static_cast(vn); this->NumberOfValues = (vn > 0); } // Construct a "bytes" value. template<> vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { this->Type = VTK_UNSIGNED_CHAR; this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; // pad VL to make it even this->VL = static_cast(vn + (vn & 1)); this->NumberOfValues = static_cast(vn); } // Construct a list of attribute tags. template<> vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { this->Type = VTK_DICOM_TAG; this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; this->VL = static_cast(4*vn); this->NumberOfValues = static_cast(vn); vtkDICOMTag *dp = this->Data; for (size_t i = 0; i < vn; i++) { // call constructor manually with placement new new(dp) vtkDICOMTag(); dp++; } } // Construct a sequence of items. template<> vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { this->Type = VTK_DICOM_ITEM; this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; // better be SQ this->VL = 0; this->NumberOfValues = static_cast(vn); vtkDICOMItem *dp = this->Data; for (size_t i = 0; i < vn; i++) { // call constructor manually with placement new new(dp) vtkDICOMItem(); dp++; } } // Construct a list of values. template<> vtkDICOMValue::ValueT::ValueT(vtkDICOMVR vr, size_t vn) { this->Type = VTK_DICOM_VALUE; this->CharacterSet = 0; this->Overflow = OVERFLOW_BYTE(vn); this->VR = vr; this->VL = 0; this->NumberOfValues = static_cast(vn); vtkDICOMValue *dp = this->Data; for (size_t i = 0; i < vn; i++) { // call constructor manually with placement new new(dp) vtkDICOMValue(); dp++; } } //---------------------------------------------------------------------------- vtkDICOMValue::vtkDICOMValue(const vtkDICOMSequence &s) { this->V = s.V.V; if (this->V) { ++(this->V->ReferenceCount); } } vtkDICOMValue& vtkDICOMValue::operator=(const vtkDICOMSequence& o) { *this = o.V; return *this; } template T *vtkDICOMValue::Allocate(vtkDICOMVR vr, size_t vn) { this->Clear(); // Use C++ "placement new" to allocate a single block of memory that // includes both the Value struct and the array of values. size_t n = vn + !vn; // add one if zero void *vp = ValueMalloc(sizeof(Value) + n*sizeof(T)); ValueT *v = new(vp) ValueT(vr, vn); // Test the assumption that Data is at an offset of sizeof(Value) assert(static_cast(static_cast(v->Data)) == static_cast(vp) + sizeof(Value)); this->V = v; return v->Data; } template<> unsigned char *vtkDICOMValue::Allocate(vtkDICOMVR vr, size_t vn) { this->Clear(); // Use C++ "placement new" to allocate a single block of memory that // includes both the Value struct and the array of values. size_t n = vn + !vn; // add one if zero void *vp = ValueMalloc(sizeof(Value) + n); ValueT *v = new(vp) ValueT(vr, vn); // Test the assumption that Data is at an offset of sizeof(Value) assert(static_cast(static_cast(v->Data)) == static_cast(vp) + sizeof(Value)); this->V = v; return v->Data; } template<> char *vtkDICOMValue::Allocate(vtkDICOMVR vr, size_t vn) { this->Clear(); // Strings of any type other than UI will be padded with spaces to // give an even number of chars. All strings (including UI) need one // extra char for the null terminator to make them valid C strings. size_t pad = (vn & static_cast(vr != vtkDICOMVR::UI)); // Use C++ "placement new" to allocate a single block of memory that // includes both the Value struct and the array of values. void *vp = ValueMalloc(sizeof(Value) + vn + pad + 1); ValueT *v = new(vp) ValueT(vr, vn); // Test the assumption that Data is at an offset of sizeof(Value) assert(v->Data == static_cast(vp) + sizeof(Value)); this->V = v; return v->Data; } char *vtkDICOMValue::AllocateCharData(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } char *vtkDICOMValue::AllocateCharData( vtkDICOMVR vr, vtkDICOMCharacterSet cs, size_t vn) { char *data = this->Allocate(vr, vn); if (vr.HasSpecificCharacterSet() && this->V) { this->V->CharacterSet = cs.GetKey(); } return data; } unsigned char *vtkDICOMValue::AllocateUnsignedCharData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } short *vtkDICOMValue::AllocateShortData(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } unsigned short *vtkDICOMValue::AllocateUnsignedShortData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } int *vtkDICOMValue::AllocateIntData(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } unsigned int *vtkDICOMValue::AllocateUnsignedIntData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } long long *vtkDICOMValue::AllocateInt64Data(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } unsigned long long *vtkDICOMValue::AllocateUnsignedInt64Data( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } float *vtkDICOMValue::AllocateFloatData(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } double *vtkDICOMValue::AllocateDoubleData(vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } vtkDICOMTag *vtkDICOMValue::AllocateTagData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } vtkDICOMItem *vtkDICOMValue::AllocateSequenceData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } vtkDICOMValue *vtkDICOMValue::AllocateMultiplexData( vtkDICOMVR vr, size_t vn) { return this->Allocate(vr, vn); } //---------------------------------------------------------------------------- void vtkDICOMValue::ComputeNumberOfValuesForCharData() { if (this->V && this->V->Type == VTK_CHAR) { if (this->V->VL == 0) { this->V->NumberOfValues = 0; } else if (this->V->VR.HasSingleValue()) { this->V->NumberOfValues = 1; } else { const char *ptr = static_cast *>(this->V)->Data; unsigned int n = 1; size_t vl = this->V->VL; if (this->V->CharacterSet == 0) { do { n += (*ptr++ == '\\'); } while (--vl); } else { vtkDICOMCharacterSet cs = this->GetCharacterSet(); n += cs.CountBackslashes(ptr, vl); } this->V->NumberOfValues = n; } } } //---------------------------------------------------------------------------- unsigned char *vtkDICOMValue::ReallocateUnsignedCharData(size_t vn) { assert(this->V != 0); assert(this->V->VR == vtkDICOMVR::OB || this->V->VR == vtkDICOMVR::UN); assert(vn < 0xffffffffu); size_t n = this->GetNumberOfValues(); unsigned char *ptr = static_cast *>(this->V)->Data; Value *v = this->V; const unsigned char *cptr = ptr; // increment ref count before reallocating ++(v->ReferenceCount); ptr = this->AllocateUnsignedCharData(v->VR, vn); n = (n < vn ? n : vn); if (n > 0) { memcpy(ptr, cptr, n); } // indicate encapsulated contents this->V->VL = 0xffffffff; // decrement the refcount of the old V if (--(v->ReferenceCount) == 0) { vtkDICOMValue::FreeValue(v); } return ptr; } //---------------------------------------------------------------------------- template void vtkDICOMValue::CreateValue(vtkDICOMVR vr, const T *data, size_t n) { typedef vtkDICOMVR VR; // shorthand assert(n*sizeof(T) < 0xffffffffu); int vt = vtkTypeTraits::VTKTypeID(); this->V = 0; if (vr == VR::OX) { // OX means "OB or OW", use type to find out which vr = (vt == VTK_UNSIGNED_CHAR ? VR::OB : VR::OW); } else if (vr == VR::XS) { // XS means "SS or US", use type to find out which vr = (vt == VTK_UNSIGNED_SHORT ? VR::US : VR::SS); } // use VR to set data type, then convert input to that type if (vr == VR::FD) { double *ptr = this->AllocateDoubleData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::FL) { float *ptr = this->AllocateFloatData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::UV) { unsigned long long *ptr = this->AllocateUnsignedInt64Data(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::SV) { long long *ptr = this->AllocateInt64Data(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::UL) { unsigned int *ptr = this->AllocateUnsignedIntData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::SL) { int *ptr = this->AllocateIntData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::US) { unsigned short *ptr = this->AllocateUnsignedShortData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::SS) { short *ptr = this->AllocateShortData(vr, n); NumericalConversion(data, ptr, n); } else if (vr == VR::DS) { char *cp = this->AllocateCharData(vr, 17*n); OutputString sb(cp, 17*n); std::ostream sbs(&sb); sbs.imbue(std::locale::classic()); sbs.precision(10); for (size_t i = 0; i < n; i++) { double d = static_cast(data[i]); // clamp to the range allowed for DICOM decimal strings if (d > 9.999999999e+99) { d = 9.999999999e+99; } else if (d < -9.999999999e+99) { d = -9.999999999e+99; } else if (fabs(d) < 1e-99 || vtkMath::IsNan(d)) { d = 0.0; } sbs << d; size_t dl = sb.length(); // look for superfluous leading zero on 3-digit exponent, // this occurs for MSVC prior to MSVC 2015, and possibly // for compilers that mimic MSVC behavior if (dl >= 5 && (cp[dl-5] == 'e' || cp[dl-5] =='E') && cp[dl-3] == '0' && cp[dl-2] >= '0' && cp[dl-2] <= '9' && cp[dl-1] >= '0' && cp[dl-1] <= '9') { cp[dl-3] = cp[dl-2]; cp[dl-2] = cp[dl-1]; sb.adjust(-1); } if (i + 1 < n) { sbs.put('\\'); } } // pad to even length and terminate if (sb.length() & 1) { sbs.put(' '); } sbs.put('\0'); this->V->NumberOfValues = static_cast(n); this->V->VL = static_cast(sb.length()-1); } else if (vr == VR::IS) { char *cp = this->AllocateCharData(vr, 13*n); OutputString sb(cp, 13*n); std::ostream sbs(&sb); sbs.imbue(std::locale::classic()); for (size_t i = 0; i < n; i++) { sbs << static_cast(data[i]);; if (i + 1 < n) { sbs.put('\\'); } } // pad to even length and terminate if (sb.length() & 1) { sbs.put(' '); } sbs.put('\0'); this->V->NumberOfValues = static_cast(n); this->V->VL = static_cast(sb.length()-1); } else if (vr == VR::OB || vr == VR::UN) { size_t m = n*sizeof(T); int pad = (m & 1); unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad); memcpy(ptr, data, m); if (pad) { ptr[m] = 0; } // pad to even this->V->NumberOfValues = static_cast(m); } else if (vr == VR::OW) { if (vt == VTK_SHORT) { short *ptr = this->AllocateShortData(vr, n); memcpy(ptr, data, n*2); } else { unsigned short *ptr = this->AllocateUnsignedShortData(vr, n*sizeof(T)/2); memcpy(ptr, data, n*sizeof(T)); } } else if (vr == VR::OL) { if (vt == VTK_INT) { int *ptr = this->AllocateIntData(vr, n); memcpy(ptr, data, n*4); } else { unsigned int *ptr = this->AllocateUnsignedIntData(vr, n*sizeof(T)/4); memcpy(ptr, data, n*sizeof(T)); } } else if (vr == VR::OV) { if (vt == VTK_LONG_LONG) { long long *ptr = this->AllocateInt64Data(vr, n); memcpy(ptr, data, n*4); } else { unsigned long long *ptr = this->AllocateUnsignedInt64Data(vr, n*sizeof(T)/4); memcpy(ptr, data, n*sizeof(T)); } } else if (vr == VR::OF) { float *ptr = this->AllocateFloatData(vr, n*sizeof(T)/4); memcpy(ptr, data, n*sizeof(T)); } else if (vr == VR::OD) { double *ptr = this->AllocateDoubleData(vr, n*sizeof(T)/8); memcpy(ptr, data, n*sizeof(T)); } else if (vr == VR::AT) { if (sizeof(T) > 2) { // subsequent values represent 32-bit keys vtkDICOMTag *ptr = this->AllocateTagData(vr, n); for (size_t i = 0; i < n; i++) { unsigned int k = static_cast(data[i]); unsigned short g = static_cast(k >> 16); unsigned short e = static_cast(k); ptr[i] = vtkDICOMTag(g,e); } } else { // subsequent values represent group,element pairs vtkDICOMTag *ptr = this->AllocateTagData(vr, n/2); for (size_t i = 0; i < n; i += 2) { unsigned short g = static_cast(data[i]); unsigned short e = static_cast(data[i+1]); ptr[i/2] = vtkDICOMTag(g,e); } } } } template<> void vtkDICOMValue::CreateValue( vtkDICOMVR vr, const vtkDICOMTag *data, size_t n) { typedef vtkDICOMVR VR; // shorthand assert(n*4 < 0xffffffffu); this->V = 0; if (vr == VR::AT) { vtkDICOMTag *ptr = this->AllocateTagData(vr, n); for (size_t i = 0; i < n; i++) { ptr[i] = data[i]; } } } template<> void vtkDICOMValue::CreateValue( vtkDICOMVR vr, const vtkDICOMItem *data, size_t n) { typedef vtkDICOMVR VR; // shorthand assert(n*4 < 0xffffffffu); this->V = 0; if (vr == VR::SQ) { vtkDICOMItem *ptr = this->AllocateSequenceData(vr, n); for (size_t i = 0; i < n; i++) { ptr[i] = data[i]; } } } template<> void vtkDICOMValue::CreateValue( vtkDICOMVR vr, const char *data, size_t m) { typedef vtkDICOMVR VR; assert(m < 0xffffffffu); this->V = 0; // directly copy data into these VRs without conversion if (vr.HasSingleValue()) { int pad = (m & 1); char *ptr = this->AllocateCharData(vr, m + pad); memcpy(ptr, data, m); // pad to even length with a space if (pad) { ptr[m++] = ' '; } ptr[m] = '\0'; this->V->NumberOfValues = 1; } else if (vr == VR::OW) { unsigned short *ptr = this->AllocateUnsignedShortData(vr, m/2); memcpy(ptr, data, m); } else if (vr == VR::OL) { unsigned int *ptr = this->AllocateUnsignedIntData(vr, m/4); memcpy(ptr, data, m); } else if (vr == VR::OV) { unsigned long long *ptr = this->AllocateUnsignedInt64Data(vr, m/4); memcpy(ptr, data, m); } else if (vr == VR::OF) { float *ptr = this->AllocateFloatData(vr, m/4); memcpy(ptr, data, m); } else if (vr == VR::OD) { double *ptr = this->AllocateDoubleData(vr, m/8); memcpy(ptr, data, m); } else if (vr == VR::UN || vr == VR::OB || vr == VR::OX) { int pad = (m & 1); unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad); memcpy(ptr, data, m); // pad to even length with a null if (pad != 0) { ptr[m] = 0; } } if (this->V) { return; } // count the number of backslash-separated values size_t n = (m > 0); for (size_t i = 0; i < m; i++) { n += (data[i] == '\\'); } // convert input string to the specified VR if (vr.HasTextValue()) { int pad = (m & 1); char *cp = this->AllocateCharData(vr, m); memcpy(cp, data, m); // if not UI, then pad to even length with a space if (pad && vr != VR::UI) { cp[m++] = ' '; } cp[m] = '\0'; this->V->NumberOfValues = static_cast(n); } else if (vr == VR::FD) { double *ptr = this->AllocateDoubleData(vr, n); StringConversion(data, VR::DS, ptr, 0, n); } else if (vr == VR::FL) { float *ptr = this->AllocateFloatData(vr, n); StringConversion(data, VR::DS, ptr, 0, n); } else if (vr == VR::UV) { unsigned long long *ptr = this->AllocateUnsignedInt64Data(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::SV) { long long *ptr = this->AllocateInt64Data(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::UL) { unsigned int *ptr = this->AllocateUnsignedIntData(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::SL) { int *ptr = this->AllocateIntData(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::US) { unsigned short *ptr = this->AllocateUnsignedShortData(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::SS || vr == VR::XS) { short *ptr = this->AllocateShortData(vr, n); StringConversion(data, VR::IS, ptr, 0, n); } else if (vr == VR::AT) { vtkDICOMTag *ptr = this->AllocateTagData(vr, n); StringConversionAT(data, ptr, n); } } //---------------------------------------------------------------------------- // Constructor methods call the factory to create the right internal type. vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr, double v) { this->CreateValue(vr, &v, 1); } vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr, const std::string& v) { this->CreateValue(vr, v.data(), v.size()); } vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr, vtkDICOMTag v) { this->CreateValue(vr, &v, 1); } vtkDICOMValue::vtkDICOMValue(vtkDICOMTag v) { this->CreateValue(vtkDICOMVR::AT, &v, 1); } vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMItem& v) { this->CreateValue(vr, &v, 1); } vtkDICOMValue::vtkDICOMValue(const vtkDICOMItem& v) { this->CreateValue(vtkDICOMVR::SQ, &v, 1); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const char *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const unsigned char *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const short *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const unsigned short *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const int *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const unsigned int *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const long long *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const unsigned long long *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const float *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const double *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const vtkDICOMTag *data, size_t count) { this->CreateValue(vr, data, count); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, const vtkDICOMItem *data, size_t count) { this->CreateValue(vr, data, count); } //---------------------------------------------------------------------------- void vtkDICOMValue::CreateValueWithSpecificCharacterSet( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *data, size_t l) { this->CreateValue(vr, data, l); if (vr.HasSpecificCharacterSet() && this->V) { this->V->CharacterSet = cs.GetKey(); // character set might change interpretation of backslashes if (l > 0 && !vr.HasSingleValue()) { this->ComputeNumberOfValuesForCharData(); } } } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *data, size_t l) { this->CreateValueWithSpecificCharacterSet(vr, cs, data, l); } vtkDICOMValue::vtkDICOMValue( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const std::string& v) { this->CreateValueWithSpecificCharacterSet(vr, cs, v.data(), v.size()); } //---------------------------------------------------------------------------- size_t vtkDICOMValue::CreateValueFromUTF8( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *text, size_t l) { if (vr.HasSpecificCharacterSet()) { std::string s; if (vr.HasSingleValue()) { s = cs.FromUTF8(text, l, &l); } else { // convert each value separately const char *cp = text; const char *ep = cp + l; while (cp != ep && *cp != '\0') { const char *dp = cp; if (vr == vtkDICOMVR::PN) { for (; dp != ep && *cp != '\0'; dp++) { if (*dp == '\\' || *dp == '=' || *dp == '^') { break; } } } else { for (; dp != ep && *cp != '\0'; dp++) { if (*dp == '\\') { break; } } } size_t n = dp - cp; if (n > 0) { size_t i; size_t j = s.length(); s.append(cs.FromUTF8(cp, n, &i)); if (i < n) { // an encoding error occurred, record 1st occurrence i += cp - text; l = (i > l) ? l : i; } size_t k = s.length(); while (j < k) { // it is an error for conversion to add a backslash j += cs.NextBackslash(&s[j], &s[k]); if (j < k && s[j] == '\\') { s[j] = '?'; // remove the backslash l = (j > l) ? l : j; j++; } } cp += n; } if (cp != ep && *cp != '\0') { s.append(cp, 1); cp++; } } } this->CreateValueWithSpecificCharacterSet(vr, cs, s.data(), s.size()); return l; } char checkAscii = 0; for (size_t i = 0; i < l; i++) { checkAscii |= text[i]; } if ((checkAscii & 0x80) != 0) { vtkDICOMCharacterSet csa(vtkDICOMCharacterSet::ISO_IR_6); std::string s = csa.FromUTF8(text, l, &l); this->CreateValue(vr, s.data(), s.size()); return l; } this->CreateValue(vr, text, l); return l; } vtkDICOMValue vtkDICOMValue::FromUTF8String( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const std::string& s) { vtkDICOMValue v; v.CreateValueFromUTF8(vr, cs, s.data(), s.length()); return v; } //---------------------------------------------------------------------------- vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr) { typedef vtkDICOMVR VR; this->V = 0; if (vr.HasTextValue()) { this->AllocateCharData(vr, 0); } else if (vr == VR::OW || vr == VR::OX) { this->AllocateUnsignedShortData(VR::OW, 0); } else if (vr == VR::OF || vr == VR::FL) { this->AllocateFloatData(vr, 0); } else if (vr == VR::OD || vr == VR::FD) { this->AllocateDoubleData(vr, 0); } else if (vr == VR::OB || vr == VR::UN) { this->AllocateUnsignedCharData(vr, 0); } else if (vr == VR::OV || vr == VR::UV) { this->AllocateUnsignedInt64Data(vr, 0); } else if (vr == VR::SV) { this->AllocateInt64Data(vr, 0); } else if (vr == VR::OL || vr == VR::UL) { this->AllocateUnsignedIntData(vr, 0); } else if (vr == VR::SL) { this->AllocateIntData(vr, 0); } else if (vr == VR::US) { this->AllocateUnsignedShortData(vr, 0); } else if (vr == VR::SS || vr == VR::XS) { this->AllocateShortData(VR::SS, 0); } else if (vr == VR::AT) { this->AllocateTagData(vr, 0); } else if (vr == VR::SQ) { this->AllocateSequenceData(vr, 0); } } //---------------------------------------------------------------------------- // It is necessary to check the Type so that the correct information can // be freed. The constructor guarantees that Type is always set correctly. void vtkDICOMValue::FreeValue(Value *v) { if (v) { if (v->Type == VTK_DICOM_ITEM) { vtkDICOMItem *dp = static_cast *>(v)->Data; for (size_t i = 0; i < v->NumberOfValues; i++) { // placement new was used, so destructor must be called manually dp->~vtkDICOMItem(); dp++; } } else if (v->Type == VTK_DICOM_VALUE) { vtkDICOMValue *dp = static_cast *>(v)->Data; for (size_t i = 0; i < v->NumberOfValues; i++) { // placement new was used, so destructor must be called manually dp->~vtkDICOMValue(); dp++; } } ValueFree(v); } } //---------------------------------------------------------------------------- template void vtkDICOMValue::AppendInit(vtkDICOMVR vr) { this->Clear(); this->Allocate(vr, 2); // mark as empty but growable this->V->NumberOfValues = 0; this->V->VL = 0xffffffff; } template void vtkDICOMValue::AppendInit(vtkDICOMVR vr); //---------------------------------------------------------------------------- template void vtkDICOMValue::AppendValue(const T &item) { // do nothing if not initialized yet if (this->V == 0) { return; } T *ptr = static_cast *>(this->V)->Data; size_t n = this->V->NumberOfValues; size_t nn = 0; // reallocate if not unique reference, or not yet growable if (this->V->ReferenceCount != 1 || this->V->VL != 0xffffffff) { // get next power of two that is greater than n nn = 1; do { nn <<= 1; } while (nn <= n); } // reallocate if n is a power of two else if (n > 1 && ((n - 1) & n) == 0) { nn = 2*n; } // reallocate the array if (nn != 0) { vtkDICOMValue::Value *v = this->V; ++(v->ReferenceCount); const T *cptr = ptr; ptr = this->Allocate(v->VR, nn); this->V->NumberOfValues = static_cast(n); for (size_t i = 0; i < n; i++) { ptr[i] = cptr[i]; } if (--(v->ReferenceCount) == 0) { vtkDICOMValue::FreeValue(v); } } // mark as growable this->V->VL = 0xffffffff; // add the item ptr[this->V->NumberOfValues++] = item; } template void vtkDICOMValue::AppendValue( const vtkDICOMItem& item); //---------------------------------------------------------------------------- template void vtkDICOMValue::SetValue(size_t i, const T &item) { assert(this->V != 0); assert(i < this->V->NumberOfValues); T *ptr = static_cast *>(this->V)->Data; // reallocate the array if we aren't the sole owner assert(this->V->ReferenceCount == 1); if (this->V->ReferenceCount != 1) { size_t m = this->V->NumberOfValues; const T *cptr = ptr; ptr = this->Allocate(this->V->VR, m); for (size_t j = 0; j < m; j++) { ptr[j] = cptr[j]; } } ptr[i] = item; } template void vtkDICOMValue::SetValue( size_t i, const vtkDICOMItem& item); //---------------------------------------------------------------------------- const char *vtkDICOMValue::GetCharData() const { const char *ptr = 0; if (this->V && this->V->Type == VTK_CHAR) { ptr = static_cast *>(this->V)->Data; } return ptr; } const unsigned char *vtkDICOMValue::GetUnsignedCharData() const { const unsigned char *ptr = 0; if (this->V && this->V->Type == VTK_UNSIGNED_CHAR) { ptr = static_cast *>(this->V)->Data; } return ptr; } const short *vtkDICOMValue::GetShortData() const { const short *ptr = 0; if (this->V) { if (this->V->Type == VTK_SHORT) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_UNSIGNED_SHORT && this->V->VR == vtkDICOMVR::OW) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const unsigned short *vtkDICOMValue::GetUnsignedShortData() const { const unsigned short *ptr = 0; if (this->V) { if (this->V->Type == VTK_UNSIGNED_SHORT) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_SHORT && this->V->VR == vtkDICOMVR::OW) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const int *vtkDICOMValue::GetIntData() const { const int *ptr = 0; if (this->V) { if (this->V->Type == VTK_INT) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_UNSIGNED_INT && this->V->VR == vtkDICOMVR::OL) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const unsigned int *vtkDICOMValue::GetUnsignedIntData() const { const unsigned int *ptr = 0; if (this->V) { if (this->V->Type == VTK_UNSIGNED_INT) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_INT && this->V->VR == vtkDICOMVR::OL) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const long long *vtkDICOMValue::GetInt64Data() const { const long long *ptr = 0; if (this->V) { if (this->V->Type == VTK_LONG_LONG) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_UNSIGNED_LONG_LONG && this->V->VR == vtkDICOMVR::OV) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const unsigned long long *vtkDICOMValue::GetUnsignedInt64Data() const { const unsigned long long *ptr = 0; if (this->V) { if (this->V->Type == VTK_UNSIGNED_LONG_LONG) { ptr = static_cast *>(this->V)->Data; } else if (this->V->Type == VTK_LONG_LONG && this->V->VR == vtkDICOMVR::OV) { ptr = reinterpret_cast( static_cast *>(this->V)->Data); } } return ptr; } const float *vtkDICOMValue::GetFloatData() const { const float *ptr = 0; if (this->V && this->V->Type == VTK_FLOAT) { ptr = static_cast *>(this->V)->Data; } return ptr; } const double *vtkDICOMValue::GetDoubleData() const { const double *ptr = 0; if (this->V && this->V->Type == VTK_DOUBLE) { ptr = static_cast *>(this->V)->Data; } return ptr; } const vtkDICOMTag *vtkDICOMValue::GetTagData() const { const vtkDICOMTag *ptr = 0; if (this->V && this->V->Type == VTK_DICOM_TAG) { ptr = static_cast *>(this->V)->Data; } return ptr; } const vtkDICOMItem *vtkDICOMValue::GetSequenceData() const { const vtkDICOMItem *ptr = 0; if (this->V && this->V->Type == VTK_DICOM_ITEM) { ptr = static_cast *>(this->V)->Data; } return ptr; } const vtkDICOMValue *vtkDICOMValue::GetMultiplexData() const { const vtkDICOMValue *ptr = 0; if (this->V && this->V->Type == VTK_DICOM_VALUE) { ptr = static_cast *>(this->V)->Data; } return ptr; } vtkDICOMValue *vtkDICOMValue::GetMultiplex() { vtkDICOMValue *ptr = 0; if (this->V && this->V->Type == VTK_DICOM_VALUE) { ptr = static_cast *>(this->V)->Data; } return ptr; } //---------------------------------------------------------------------------- template void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const { switch (this->V->Type) { case VTK_CHAR: StringConversion( static_cast *>(this->V)->Data, this->V->VR, v, s, c); break; case VTK_UNSIGNED_CHAR: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_SHORT: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_UNSIGNED_SHORT: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_INT: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_UNSIGNED_INT: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_LONG_LONG: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_UNSIGNED_LONG_LONG: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_FLOAT: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_DOUBLE: NumericalConversion( static_cast *>(this->V)->Data+s, v, c); break; case VTK_DICOM_TAG: { const vtkDICOMTag *tptr = static_cast *>(this->V)->Data + s; for (size_t i = 0; i < c; i += 2) { v[i] = tptr[i/2].GetGroup(); v[i+1] = tptr[i/2].GetElement(); } } break; } } template<> void vtkDICOMValue::GetValuesT( std::string *v, size_t c, size_t s) const { for (size_t i = 0; i < c; i++) { v->clear(); this->AppendValueToString(*v++, s++); } } template<> void vtkDICOMValue::GetValuesT( vtkDICOMTag *v, size_t c, size_t s) const { if (this->V->Type == VTK_DICOM_TAG) { const vtkDICOMTag *ptr = static_cast *>(this->V)->Data + s; for (size_t i = 0; i < c; i++) { *v++ = *ptr++; } } } //---------------------------------------------------------------------------- // These are interface methods that call the templated internal methods. void vtkDICOMValue::GetValues(unsigned char *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(short *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(unsigned short *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(int *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(unsigned int *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(long long *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(unsigned long long *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(float *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(double *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(std::string *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } void vtkDICOMValue::GetValues(vtkDICOMTag *v, size_t c, size_t s) const { assert((s + c) <= this->V->NumberOfValues); this->GetValuesT(v, c, s); } //---------------------------------------------------------------------------- unsigned char vtkDICOMValue::GetUnsignedChar(size_t i) const { unsigned char v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } short vtkDICOMValue::GetShort(size_t i) const { short v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } unsigned short vtkDICOMValue::GetUnsignedShort(size_t i) const { unsigned short v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } int vtkDICOMValue::GetInt(size_t i) const { int v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } unsigned int vtkDICOMValue::GetUnsignedInt(size_t i) const { unsigned int v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } long long vtkDICOMValue::GetInt64(size_t i) const { long long v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } unsigned long long vtkDICOMValue::GetUnsignedInt64(size_t i) const { unsigned long long v = 0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } float vtkDICOMValue::GetFloat(size_t i) const { float v = 0.0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } double vtkDICOMValue::GetDouble(size_t i) const { double v = 0.0; if (this->V && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } std::string vtkDICOMValue::GetUTF8String(size_t i) const { if (this->V && this->V->CharacterSet != 0) { if (this->V && i < this->V->NumberOfValues) { std::string v; this->AppendValueToUTF8String(v, i); return v; } } return this->GetString(i); } std::string vtkDICOMValue::GetString(size_t i) const { std::string v; if (this->V && i < this->V->NumberOfValues) { this->AppendValueToString(v, i); } return v; } vtkDICOMTag vtkDICOMValue::GetTag(size_t i) const { vtkDICOMTag v; if (this->V && this->V->VR == vtkDICOMVR::AT && i < this->V->NumberOfValues) { this->GetValuesT(&v, 1, i); } return v; } const vtkDICOMItem& vtkDICOMValue::GetItem(size_t i) const { if (this->V && this->V->Type == VTK_DICOM_ITEM && i < this->V->NumberOfValues) { const vtkDICOMItem *ptr = static_cast *>(this->V)->Data; return ptr[i]; } return vtkDICOMValue::EmptyItem; } //---------------------------------------------------------------------------- unsigned char vtkDICOMValue::AsUnsignedChar() const { unsigned char v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } short vtkDICOMValue::AsShort() const { short v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } unsigned short vtkDICOMValue::AsUnsignedShort() const { unsigned short v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } int vtkDICOMValue::AsInt() const { int v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } unsigned int vtkDICOMValue::AsUnsignedInt() const { unsigned int v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } long long vtkDICOMValue::AsInt64() const { long long v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } unsigned long long vtkDICOMValue::AsUnsignedInt64() const { unsigned long long v = 0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } float vtkDICOMValue::AsFloat() const { float v = 0.0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } double vtkDICOMValue::AsDouble() const { double v = 0.0; if (this->V && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } std::string vtkDICOMValue::AsUTF8String() const { const char *cp = this->GetCharData(); if (cp) { vtkDICOMCharacterSet cs(this->V->CharacterSet); size_t l = this->V->VL; while (l > 0 && cp[l-1] == '\0') { l--; } if (this->V->VR.HasSingleValue()) { while (l > 0 && cp[l-1] == ' ') { l--; } return cs.ToUTF8(cp, l); } else { // convert each value separately const char *ep = cp + l; std::string s; while (cp != ep && *cp != '\0') { size_t n = cs.NextBackslash(cp, ep); while (n > 0 && *cp == ' ') { cp++; n--; } size_t m = n; while (m > 0 && cp[m-1] == ' ') { m--; } s.append(cs.ToUTF8(cp, m)); cp += n; if (cp != ep && *cp == '\\') { s.append(cp, 1); cp++; } } return s; } } return this->AsString(); } std::string vtkDICOMValue::AsString() const { const char *cp = this->GetCharData(); if (cp) { size_t l = this->V->VL; while (l > 0 && cp[l-1] == '\0') { l--; } if (this->V->VR.HasSingleValue()) { while (l > 0 && cp[l-1] == ' ') { l--; } return std::string(cp, l); } else { // convert each value separately vtkDICOMCharacterSet cs(this->V->CharacterSet); const char *ep = cp + l; std::string s; while (cp != ep && *cp != '\0') { size_t n = cs.NextBackslash(cp, ep); while (n > 0 && *cp == ' ') { cp++; n--; } size_t m = n; while (m > 0 && cp[m-1] == ' ') { m--; } s.append(cp, m); cp += n; if (cp != ep && *cp == '\\') { s.append(cp, 1); cp++; } } return s; } } std::string v; if (this->V && this->V->VR != vtkDICOMVR::UN && this->V->VR != vtkDICOMVR::SQ && this->V->VR != vtkDICOMVR::OW && this->V->VR != vtkDICOMVR::OB && this->V->VR != vtkDICOMVR::OL && this->V->VR != vtkDICOMVR::OV && this->V->VR != vtkDICOMVR::OF && this->V->VR != vtkDICOMVR::OD) { size_t n = this->V->NumberOfValues; for (size_t i = 0; i < n; i++) { if (i > 0) { v.append("\\"); } this->AppendValueToString(v, i); } } return v; } vtkDICOMTag vtkDICOMValue::AsTag() const { vtkDICOMTag v; if (this->V && this->V->VR == vtkDICOMVR::AT && this->V->NumberOfValues >= 1) { this->GetValuesT(&v, 1, 0); } return v; } const vtkDICOMItem& vtkDICOMValue::AsItem() const { return this->GetItem(0); } //---------------------------------------------------------------------------- // Get one of the backslash-separated substrings, requires a text value. void vtkDICOMValue::Substring( size_t i, const char *&start, const char *&end) const { const char *cp = static_cast *>(this->V)->Data; const char *ep = cp + this->V->VL; // remove any trailing NULLs for UI values while (ep != cp && ep[-1] == '\0') { --ep; } const char *dp = ep; if (this->V->NumberOfValues > 1 && ++i > 0) { if (this->V->CharacterSet == 0) { dp = cp - 1; do { cp = dp + 1; do { dp++; } while (*dp != '\\' && dp != ep); } while (--i != 0 && dp != ep); } else { vtkDICOMCharacterSet cs(this->V->CharacterSet); for (;;) { dp = cp + cs.NextBackslash(cp, ep); if (--i == 0 || *dp != '\\') { break; } cp = dp + 1; } } } // remove any spaces used as padding if (!this->V->VR.HasSingleValue()) { while (cp != dp && cp[0] == ' ') { cp++; } } while (cp != dp && dp[-1] == ' ') { dp--; } start = cp; end = dp; } //---------------------------------------------------------------------------- void vtkDICOMValue::AppendValueToSafeUTF8String( std::string& str, size_t i) const { if (this->V && this->V->Type == VTK_CHAR) { const char *cp = static_cast *>(this->V)->Data; size_t l = this->V->VL; if (this->V->VR.HasSingleValue()) { while (l > 0 && cp[l-1] == '\0') { l--; } while (l > 0 && cp[l-1] == ' ') { l--; } } else { const char *dp; this->Substring(i, cp, dp); l = dp - cp; } vtkDICOMCharacterSet cs(this->V->CharacterSet); str += cs.ToSafeUTF8(cp, l); } else { this->AppendValueToString(str, i); } } //---------------------------------------------------------------------------- void vtkDICOMValue::AppendValueToUTF8String( std::string& str, size_t i) const { if (this->V && this->V->Type == VTK_CHAR && this->V->CharacterSet != 0) { const char *cp = static_cast *>(this->V)->Data; size_t l = this->V->VL; if (this->V->VR.HasSingleValue()) { while (l > 0 && cp[l-1] == '\0') { l--; } while (l > 0 && cp[l-1] == ' ') { l--; } } else { const char *dp; this->Substring(i, cp, dp); l = dp - cp; } vtkDICOMCharacterSet cs(this->V->CharacterSet); str += cs.ToUTF8(cp, l); } else { this->AppendValueToString(str, i); } } //---------------------------------------------------------------------------- // Convert one value to text and add it to the supplied string void vtkDICOMValue::AppendValueToString( std::string& str, size_t i) const { const char *cp = 0; const char *dp = 0; double f = 0.0; long long d = 0; unsigned long long u = 0; vtkDICOMTag a; if (this->V == 0) { return; } assert(i < this->V->NumberOfValues); switch (this->V->Type) { case VTK_CHAR: cp = static_cast *>(this->V)->Data; dp = cp + (i == 0 ? this->V->VL : 0); if (this->V->VR.HasSingleValue()) { // strip trailing spaces while (dp != cp && dp[-1] == '\0') { --dp; } while (dp != cp && dp[-1] == ' ') { --dp; } } else { // get just one of the values, strip leading & trailing spaces this->Substring(i, cp, dp); } break; case VTK_UNSIGNED_CHAR: d = static_cast *>(this->V)->Data[i]; break; case VTK_SHORT: d = static_cast *>(this->V)->Data[i]; break; case VTK_UNSIGNED_SHORT: d = static_cast *>(this->V)->Data[i]; break; case VTK_INT: d = static_cast *>(this->V)->Data[i]; break; case VTK_UNSIGNED_INT: u = static_cast *>(this->V)->Data[i]; break; case VTK_LONG_LONG: d = static_cast *>(this->V)->Data[i]; break; case VTK_UNSIGNED_LONG_LONG: u = static_cast *>(this->V)->Data[i]; break; case VTK_FLOAT: f = static_cast *>(this->V)->Data[i]; break; case VTK_DOUBLE: f = static_cast *>(this->V)->Data[i]; break; case VTK_DICOM_TAG: a = static_cast *>(this->V)->Data[i]; break; } if (this->V->Type == VTK_CHAR) { while (cp != dp && dp[-1] == '\0') { --dp; } str.append(cp, dp); } else if (this->V->Type == VTK_FLOAT || this->V->Type == VTK_DOUBLE) { // force consistent printing of "inf", "nan" regardless of platform if (vtkMath::IsNan(f)) { str.append("nan"); } else if (vtkMath::IsInf(f)) { str.append((f < 0) ? "-inf" : "inf"); } else { // create a stream that uses the "C" locale char text[32]; OutputString sb(text, sizeof(text)); std::ostream sbs(&sb); sbs.imbue(std::locale::classic()); // guard against printing non-significant digits: // use exponential form if printing in "%f" format // would print an integer that is too large for the // float to accurately represent. if ((this->V->Type == VTK_DOUBLE && fabs(f) <= 9007199254740992.0) || // 2^53 (this->V->Type == VTK_FLOAT && fabs(f) <= 16777216.0)) // 2^24 { if (this->V->Type == VTK_DOUBLE) { sbs.precision(16); } else { sbs.precision(8); } } else { sbs.setf(std::ios::scientific); if (this->V->Type == VTK_DOUBLE) { sbs.precision(15); } else { sbs.precision(7); } } // write the value sbs << f; size_t l = sb.length(); if (l > 0) { // make sure there is a decimal point size_t tk = (text[0] == '-' || text[0] == '+'); while (tk < l) { if (text[tk] < '0' || text[tk] > '9') { break; } tk++; } if (tk == l) { text[l++] = '.'; } // make sure there is a zero after the decimal point if (text[l-1] == '.') { text[l++] = '0'; } } // trim trailing zeros, except the one following decimal point size_t ti = 0; while (ti < l && text[ti] != 'e') { ti++; } size_t tj = ti; while (tj > 1 && text[tj-1] == '0' && text[tj-2] != '.') { tj--; } // in scientific notation, remove decimal if followed by zero if (ti < l && text[ti] == 'e') { if (tj > 2 && text[tj-1] == '0' && text[tj-2] == '.') { tj -= 2; } else if (tj > 1 && text[tj-1] == '.') { tj -= 1; } } // this performs the actual removal while (ti < l) { text[tj++] = text[ti++]; } l = tj; // if exponent has three digits, clear the first if it is zero if (l >= 5 && text[l-5] == 'e' && text[l-3] == '0') { text[l-3] = text[l-2]; text[l-2] = text[l-1]; l--; } str.append(text, l); } } else if (this->V->Type == VTK_UNSIGNED_CHAR || this->V->Type == VTK_SHORT || this->V->Type == VTK_UNSIGNED_SHORT || this->V->Type == VTK_INT || this->V->Type == VTK_UNSIGNED_INT || this->V->Type == VTK_LONG_LONG || this->V->Type == VTK_UNSIGNED_LONG_LONG) { // simple code to convert an integer to a string char text[20]; size_t ti = 20; // if d is nonzero, set u to abs(d) if (d > 0) { u = d; } if (d < 0) { u = -d; } // convert u to a string do { text[--ti] = '0' + static_cast(u % 10); u /= 10; } while (u != 0); // add sign if (d < 0) { text[--ti] = '-'; } str.append(&text[ti], &text[20]); } else if (this->V->Type == VTK_DICOM_TAG) { char text[12]; int t[2]; t[0] = a.GetGroup(); t[1] = a.GetElement(); char *tp = text; *tp++ = '('; for (int j = 0; j < 2; j++) { for (int k = 12; k >= 0; k -= 4) { char c = ((t[j] >> k) & 0x000F); *tp++ = (c < 10 ? '0' + c : 'A' - 10 + c); } *tp++ = ','; } tp[-1] = ')'; *tp = '\0'; str.append(text, &text[11]); } } //---------------------------------------------------------------------------- // These compare functions can only be safely used within "operator==" // and "Matches()" because they require a pre-check that VL matches // and that a, b are the correct type. template bool vtkDICOMValue::ValueT::Compare(const Value *a, const Value *b) { bool r = (a->VL == b->VL); size_t n = a->VL/sizeof(T); if (n != 0 && r) { const T *ap = static_cast *>(a)->Data; const T *bp = static_cast *>(b)->Data; do { r &= (*ap++ == *bp++); } while (r && --n); } return r; } template<> bool vtkDICOMValue::ValueT::Compare( const Value *a, const Value *b) { bool r = (a->VL == b->VL); r &= (a->CharacterSet == b->CharacterSet); size_t n = a->VL; if (n != 0 && r) { const unsigned char *ap = static_cast *>(a)->Data; const unsigned char *bp = static_cast *>(b)->Data; do { r &= (*ap++ == *bp++); } while (r && --n); } return r; } template<> bool vtkDICOMValue::ValueT::Compare( const Value *a, const Value *b) { bool r = (a->VL == b->VL); size_t n = a->VL; if (a->VL == 0xFFFFFFFF) { n = a->NumberOfValues; r &= (n == b->NumberOfValues); #ifdef VTK_DICOM_USE_OVERFLOW_BYTE n += (static_cast(a->Overflow) << 32); r &= (a->Overflow == b->Overflow); #endif } if (n != 0 && r) { const unsigned char *ap = static_cast *>(a)->Data; const unsigned char *bp = static_cast *>(b)->Data; do { r &= (*ap++ == *bp++); } while (r && --n); } return r; } template<> bool vtkDICOMValue::ValueT::Compare( const Value *a, const Value *b) { size_t n = a->NumberOfValues; // do not use VL/sizeof() bool r = (n == b->NumberOfValues); if (n != 0 && r) { const vtkDICOMItem *ap = static_cast *>(a)->Data; const vtkDICOMItem *bp = static_cast *>(b)->Data; do { r &= (*ap++ == *bp++); } while (r && --n); } return r; } template<> bool vtkDICOMValue::ValueT::Compare( const Value *a, const Value *b) { size_t n = a->NumberOfValues; // do not use VL/sizeof() bool r = (n == b->NumberOfValues); if (n != 0 && r) { const vtkDICOMValue *ap = static_cast *>(a)->Data; const vtkDICOMValue *bp = static_cast *>(b)->Data; do { r &= (*ap++ == *bp++); } while (r && --n); } return r; } //---------------------------------------------------------------------------- // This CompareEach template is more limited than the Compare template: // it can only be used for SS, US, SL, UL, FL, FD. Its purpose it to // support the Matches() method, and it shouldn't be used anywhere else. template bool vtkDICOMValue::ValueT::CompareEach(const Value *a, const Value *b) { bool r = true; if (a->NumberOfValues > 0 && b->NumberOfValues > 0) { size_t n = a->NumberOfValues; size_t mm = b->NumberOfValues; const T *ap = static_cast *>(a)->Data; const T *bbp = static_cast *>(b)->Data; do { size_t m = mm; const T *bp = bbp; do { r = (*ap == *bp); bp++; } while (--m && !r); if (r) { // set new start for inner loop bbp = bp; mm = m; if (mm == 0) { r = (n == 1); break; } } ap++; } while (--n && r); } return r; } //---------------------------------------------------------------------------- bool vtkDICOMValue::PatternMatchesMulti( const char *pattern, const char *val, vtkDICOMVR vr) { typedef vtkDICOMVR VR; bool inclusive = (vr == VR::UI); bool ordered = (vr == VR::IS || vr == VR::DS); bool nowildcards = (vr == VR::UI || vr == VR::AS || vr == VR::IS || vr == VR::DS); bool match = !inclusive; const char *pp = pattern; while (match ^ inclusive) { // get pattern value start and end const char *pd = pp; while (*pd != '\0' && *pd != '\\') { pd++; } const char *pf = pd; // strip spaces while (*pp == ' ') { pp++; } while (pf != pp && pf[-1] == ' ') { --pf; } match = false; const char *vp = val; while (!match) { // get value start and end const char *vd = vp; while (*vd != '\0' && *vd != '\\') { vd++; } const char *vf = vd; // strip whitespace while (*vp == ' ') { vp++; } while (vf != vp && vf[-1] == ' ') { --vf; } if (nowildcards) { // if VR doesn't allow wildcards, use simple string comparison // (start at back, because UIDs often share the same prefix). const char *cf = pf; match = (pf-pp == vf-vp); while (match && cf != pp) { match = (*(--vf) == *(--cf)); } } else { // use wildcard pattern matching match = vtkDICOMUtilities::PatternMatches(pp, pf-pp, vp, vf-vp); } // break if no values remain if (*vd == '\0') { break; } vp = vd + 1; } if (match && ordered) { // set inner loop start to current position val = vp; } // break if no patterns remain if (*pd == '\0') { break; } pp = pd + 1; } return match; } //---------------------------------------------------------------------------- bool vtkDICOMValue::PatternMatchesPersonName( const char *pattern, const char *val) { bool match = false; char normalizedPattern[256]; char normalizedName[256]; const char *pp = pattern; while (!match) { // normalize the pattern vtkDICOMValue::NormalizePersonName(pp, normalizedPattern, true); const char *vp = val; while (!match) { // normalize the name vtkDICOMValue::NormalizePersonName(vp, normalizedName); match = vtkDICOMUtilities::PatternMatches( normalizedPattern, strlen(normalizedPattern), normalizedName, strlen(normalizedName)); // break if no values remain while (*vp != '\0' && *vp != '\\') { vp++; } if (*vp == '\0') { break; } vp++; } // break if no patterns remain while (*pp != '\0' && *pp != '\\') { pp++; } if (*pp == '\0') { break; } pp++; } return match; } //---------------------------------------------------------------------------- void vtkDICOMValue::NormalizePersonName( const char *input, char output[256], bool isquery) { // this normalizes a PN so that it consists of three component groups // of five components each const char *cp = input; char *dp = output; // loop over component groups for (int i = 0; i < 3; i++) { // set maximum length of extended component group to 85 bytes // (because 85*3 + 1 == 256, and 85 > 64 where 64 is max for PN) char *groupStart = dp; char *ep = dp + 85; // loop over components for (int j = 0; j < 5; j++) { // save start location char *componentStart = dp; // copy characters while (*cp != '^' && *cp != '=' && *cp != '\\' && *cp != '\0' && dp != ep) { *dp++ = *cp++; } // strip trailing spaces and periods while (dp != componentStart && (dp[-1] == ' ' || dp[-1] == '.')) { --dp; } if (dp != ep) { // if query, replace empty components with wildcard if (isquery && dp == componentStart) { *dp++ = '*'; } // mark end of component if (j != 4) { *dp++ = '^'; } } else if (isquery && dp != componentStart) { // back up by one unicode code point, replace with wildcard do { --dp; } while (dp != componentStart && (*dp & 0xC0) == 0x80); *dp++ = '*'; } // go to next component of input if (*cp == '^') { cp++; } } // collapse repeated wildcards if (isquery) { while (dp - groupStart > 2 && dp[-3] == '*' && dp[-2] == '^' && dp[-1] == '*') { dp -= 2; } } // mark end of component group if (i != 2) { *dp++ = '='; } // go to next component group of input if (*cp == '=') { cp++; } } // collapse repeated wildcards if (isquery) { while (dp - output > 2 && dp[-3] == '*' && dp[-2] == '=' && dp[-1] == '*') { dp -= 2; } } // terminate *dp = '\0'; } //---------------------------------------------------------------------------- size_t vtkDICOMValue::NormalizeDateTime( const char *input, char output[22], vtkDICOMVR vr) { // if the value is DT and has a timezone offset, we ignore it, // because timezone adjustment is only done if it is negotiated // as part of the query, otherwise timezones are ignored // use UNIX epoch as our arbitrary time base static const char epoch[22] = "19700101000000.000000"; for (int i = 0; i < 22; i++) { output[i] = epoch[i]; } char *tp = output; if (vr == vtkDICOMVR::TM) { tp += 8; } const char *cp = input; while (*tp != 0 && *cp >= '0' && *cp <= '9') { *tp++ = *cp++; } if (*tp == '.' && *cp == '.') { *tp++ = *cp++; while (*tp != 0 && *cp >= '0' && *cp <= '9') { *tp++ = *cp++; } } return static_cast(tp - output); } //---------------------------------------------------------------------------- bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const { /* Attribute matching: 1) Single Value Matching 2) List of UID Matching (match if any UIDs in query list match) 3) Universal Matching (if query value is empty) 4) Wild Card Matching (with * and ?) 5) Range Matching (range of dates or times) 6) Sequence Matching (match if any items in sequence match) Notes: - Encoded strings should be converted to UTF8 - PN matches should be case-insensitive, ideally normalized - All other queries are case-sensitive - List can be used for more than just UIDs - Numeric value comparisons can be templated */ // keys with no value match (universal matching) if (value.V == 0) { return true; } if (value.V->Type != VTK_DICOM_ITEM) { // for everything but sequences, check if the length is zero if (value.V->VL == 0) { return true; } } else if (value.GetNumberOfValues() == 0 || static_cast *>(value.V)->Data ->GetNumberOfDataElements() == 0) { // empty sequences match return true; } if (this->V == 0 || this->V->VR != value.V->VR) { // match is impossible if VRs differ return false; } bool match = false; vtkDICOMVR vr = this->V->VR; int type = this->V->Type; // First, do comparisons for string values if (type == VTK_CHAR) { // Does the pattern string have wildcards? bool wildcard = false; const char *pattern = static_cast *>(value.V)->Data; size_t pl = 0; while (pattern[pl] != '\0' && pl < value.V->VL) { char c = pattern[pl++]; wildcard |= (c == '*'); wildcard |= (c == '?'); } while (pl > 0 && pattern[pl-1] == ' ') { pl--; } // Get string value and remove any trailing nulls and spaces const char *cp = static_cast *>(this->V)->Data; size_t l = this->V->VL; while (l > 0 && cp[l-1] == '\0') { l--; } while (l > 0 && cp[l-1] == ' ') { l--; } if (!wildcard && (vr == vtkDICOMVR::DA || vr == vtkDICOMVR::TM || vr == vtkDICOMVR::DT)) { // Find the position of the hyphen size_t hp = 0; while (hp < pl && pattern[hp] != '-') { hp++; } if (vr == vtkDICOMVR::DT && hp + 5 < pl) { // Check if the hyphen was part of the timezone offset if (pattern[hp+5] == '-') { hp += 5; } else if (hp != 4 && pattern[hp+5] == '\0') { hp = 0; } } // Get a pointer to the part of pattern after the hyphen const char *dp = &pattern[hp]; bool hyphen = (*dp == '-'); dp += hyphen; // Normalize the dates/times and compare char r1[22], r2[22], d[22]; size_t n1 = 0; size_t n2 = 0; vtkDICOMValue::NormalizeDateTime(cp, d, vr); r1[0] = '\0'; if (pattern[0] != '\0' && pattern[0] != '-') { n1 = vtkDICOMValue::NormalizeDateTime(pattern, r1, vr); } r2[0] = '\0'; if (dp[0] != '\0' && dp[0] != '-') { n2 = vtkDICOMValue::NormalizeDateTime(dp, r2, vr); } // Perform lexical comparison on normalized datetime if (!hyphen) { match = (strncmp(d, r1, n1) == 0); } else if (*r1 != '\0') { match = (strncmp(d, r1, n1) >= 0); } else if (*r2 != '\0') { match = (strncmp(r2, d, n2) >= 0); } else { match = (strncmp(r2, d, n2) >= 0 && strncmp(d, r1, n1) >= 0); } } else { // Perform wildcard matching and list matching std::string str; std::string pstr; if (vr == vtkDICOMVR::PN) { // Convert to lowercase UTF8 before matching vtkDICOMCharacterSet cs = this->GetCharacterSet(); const char *ep = cp + l; while (cp != ep && *cp != '\0') { size_t n = cs.NextBackslash(cp, ep); str.append(cs.CaseFoldedUTF8(cp, n)); cp += n; if (cp != ep && *cp == '\\') { str.append(cp, 1); cp++; } } cp = str.c_str(); l = str.length(); pstr = value.GetCharacterSet().CaseFoldedUTF8(pattern, pl); pattern = pstr.c_str(); pl = pstr.length(); } else if (vr.HasSpecificCharacterSet()) { // Convert value and pattern to UTF8 before matching str = this->AsUTF8String(); cp = str.c_str(); l = str.length(); pstr = value.AsUTF8String(); pattern = pstr.c_str(); pl = pstr.length(); } if (vr == vtkDICOMVR::PN) { match = vtkDICOMValue::PatternMatchesPersonName(pattern, cp); } else if (vr.HasSingleValue()) { match = vtkDICOMUtilities::PatternMatches(pattern, pl, cp, l); } else { match = vtkDICOMValue::PatternMatchesMulti(pattern, cp, vr); } } } else if (type == VTK_DICOM_VALUE) { // Match if any of the contained values match vtkDICOMValue *vp = static_cast *>(this->V)->Data; size_t vn = this->GetNumberOfValues(); for (size_t i = 0; i < vn && !match; i++) { match = vp->Matches(value); vp++; } } else if (type == VTK_DICOM_ITEM) { // Match if any item matches vtkDICOMItem *item = static_cast *>(value.V)->Data; vtkDICOMItem *ip = static_cast *>(this->V)->Data; size_t n = this->GetNumberOfValues(); for (size_t i = 0; i < n && !match; i++) { vtkDICOMDataElementIterator iter = item->Begin(); vtkDICOMDataElementIterator iterEnd = item->End(); match = true; while (match && iter != iterEnd) { vtkDICOMTag tag = iter->GetTag(); // The SpecificCharacterSet is always considered to match. Its // presence in the query describes the character encoding of the // query, so that query strings can be converted to utf-8 at the // point of comparison with the data set strings. if (tag != DC::SpecificCharacterSet) { match = ip->Get(tag).Matches(iter->GetValue()); } ++iter; } ip++; } } else if (type == VTK_DICOM_TAG) { // Comparing tags between data sets should just always return "true" match = true; } else if (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::UN) { // OB and UN must match exactly match = ValueT::Compare(value.V, this->V); } else if (vr == vtkDICOMVR::OW) { // OW must match exactly match = ValueT::Compare(value.V, this->V); } else if (vr == vtkDICOMVR::OL) { // OL must match exactly match = ValueT::Compare(value.V, this->V); } else if (vr == vtkDICOMVR::OV) { // OV must match exactly match = ValueT::Compare(value.V, this->V); } else if (vr == vtkDICOMVR::OF) { // OF must match exactly match = ValueT::Compare(value.V, this->V); } else if (vr == vtkDICOMVR::OD) { // OF must match exactly match = ValueT::Compare(value.V, this->V); } else if (type == VTK_SHORT || type == VTK_UNSIGNED_SHORT) { // Match if any value matches match = ValueT::CompareEach(value.V, this->V); } else if (type == VTK_INT || type == VTK_UNSIGNED_INT) { // Match if any value matches match = ValueT::CompareEach(value.V, this->V); } else if (type == VTK_LONG_LONG || type == VTK_UNSIGNED_LONG_LONG) { // Match if any value matches match = ValueT::CompareEach(value.V, this->V); } else if (type == VTK_FLOAT) { // Match if any value matches match = ValueT::CompareEach(value.V, this->V); } else if (type == VTK_DOUBLE) { // Match if any value matches match = ValueT::CompareEach(value.V, this->V); } return match; } //---------------------------------------------------------------------------- bool vtkDICOMValue::Matches(const std::string& value) const { if (value.length() == 0) { // to support universal matching return true; } if (this->V) { if (this->V->VR.HasTextValue()) { return this->Matches(vtkDICOMValue( this->V->VR, this->V->CharacterSet, value)); } else { vtkDICOMValue v(this->V->VR, value); return (v.AsString() == value && this->Matches(v)); } } return false; } //---------------------------------------------------------------------------- bool vtkDICOMValue::Matches(double value) const { if (this->V && this->V->VL > 0 && this->V->VR.HasNumericValue()) { vtkDICOMValue v(this->V->VR, value); return (v.AsDouble() == value && this->Matches(v)); } return false; } //---------------------------------------------------------------------------- bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const { const vtkDICOMValue::Value *a = this->V; const vtkDICOMValue::Value *b = o.V; bool r = true; if (a != b) { r = false; if (a != 0 && b != 0) { if (a->VR == b->VR && a->VL == b->VL && a->Type == b->Type) { r = true; switch (a->Type) { case VTK_CHAR: r = ValueT::Compare(a, b); break; case VTK_UNSIGNED_CHAR: r = ValueT::Compare(a, b); break; case VTK_SHORT: case VTK_UNSIGNED_SHORT: r = ValueT::Compare(a, b); break; case VTK_INT: case VTK_UNSIGNED_INT: r = ValueT::Compare(a, b); break; case VTK_LONG_LONG: case VTK_UNSIGNED_LONG_LONG: r = ValueT::Compare(a, b); break; case VTK_FLOAT: r = ValueT::Compare(a, b); break; case VTK_DOUBLE: r = ValueT::Compare(a, b); break; case VTK_DICOM_ITEM: r = ValueT::Compare(a, b); break; case VTK_DICOM_VALUE: r = ValueT::Compare(a, b); break; } } } } return r; } //---------------------------------------------------------------------------- ostream& operator<<(ostream& os, const vtkDICOMValue& v) { vtkDICOMVR vr = v.GetVR(); const char *cp = v.GetCharData(); const vtkDICOMValue *vp = v.GetMultiplexData(); size_t m = v.GetNumberOfValues(); if (!v.IsValid()) { os << "empty[0]"; } else if (vp) { // value is a multiplex of per-instance values os << "values[" << m << "]"; } else if (vr == vtkDICOMVR::UN) { os << "unknown[" << m << "]"; } else if (vr == vtkDICOMVR::ST || vr == vtkDICOMVR::LT || vr == vtkDICOMVR::UT) { // might have control characters, don't print it os << "text[" << v.GetVL() << "]"; } else if (cp && !vr.HasSpecificCharacterSet()) { const char *dp = cp + v.GetVL(); while (cp != dp && *cp == ' ') { cp++; } while (cp != dp && dp[-1] == ' ') { dp--; } if (cp != dp) { if (dp[-1] == '\0' || *dp == '\0') { os << cp; } else { std::string s = std::string(cp, dp); os << s.c_str(); } } } else if (vr == vtkDICOMVR::AT) { const vtkDICOMTag *tp = v.GetTagData(); if (tp) { for (size_t j = 0; j < m; j++) { if (j > 0) { os << ","; } os << tp[j]; } } else { os << "tags[" << m << "]"; } } else if (vr == vtkDICOMVR::SQ) { os << "items[" << m << "]"; } else if (vr == vtkDICOMVR::OB) { os << "bytes[" << m << "]"; } else if (vr == vtkDICOMVR::OW) { os << "words[" << m << "]"; } else if (vr == vtkDICOMVR::OL) { os << "longwords[" << m << "]"; } else if (vr == vtkDICOMVR::OV) { os << "verylongwords[" << m << "]"; } else if (vr == vtkDICOMVR::OF) { os << "floats[" << m << "]"; } else if (vr == vtkDICOMVR::OD) { os << "doubles[" << m << "]"; } else { std::string s; size_t n = (m <= 16 ? m : 16); for (size_t i = 0; i < n; i++) { s.append((i == 0 ? "" : ",")); v.AppendValueToSafeUTF8String(s, i); } if (m > n) { s.append(",..."); } os << s.c_str(); } return os; } vtk-dicom-0.8.12/Source/vtkDICOMValue.h000066400000000000000000000510531356440565500175060ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkDICOMValue_h #define vtkDICOMValue_h #include "vtkSystemIncludes.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMVR.h" #include "vtkDICOMTag.h" #include "vtkDICOMCharacterSet.h" #include "vtkDICOMReferenceCount.h" #include // type constants #define VTK_DICOM_TAG 13 #define VTK_DICOM_ITEM 14 #define VTK_DICOM_VALUE 15 // This adds an overflow byte for the "NumberOfValues" field, so that // "NumberOfValues" can effectively go as high as 2^40-1. This means // that data elements that use delimiters, rather than fixed lengths, // can store up to one terabyte instead of being limited to four gigabytes. #if defined(__x86_64__) || defined(__ia64__) || defined(_M_X64) #define VTK_DICOM_USE_OVERFLOW_BYTE #endif class vtkDICOMItem; class vtkDICOMSequence; //! A class to store attribute values for DICOM metadata. /*! * The vtkDICOMValue class is a container for any values that * can be stored in a DICOM data element. Like std::string, * it is implemented as a pointer to a reference-counted internal * data object. To keep it lightweight, in terms of size, it has * no virtual methods. */ class VTKDICOM_EXPORT vtkDICOMValue { private: //! A reference-counted value class. struct Value { vtkDICOMReferenceCount ReferenceCount; unsigned char Type; unsigned char CharacterSet; unsigned char Overflow; vtkDICOMVR VR; unsigned int VL; unsigned int NumberOfValues; Value() : ReferenceCount(1) {} }; //! The value class, subclassed to support values of different types. template struct ValueT : Value { T Data[1]; ValueT(vtkDICOMVR vr, size_t vn); static bool Compare(const Value *a, const Value *b); static bool CompareEach(const Value *a, const Value *b); }; public: //@{ //! Construct a new value from the data that is provided. /*! * The data will be copied into the value, with conversion if * necessary. If the data cannot be converted into the type * required by the VR, then the resulting value will be invalid. * * For these VRs, always use these types: * - OB (other byte) or UN (unknown), use unsigned char. * - OW, use either unsigned short or signed short. * - AT, use an array of vtkDICOMTag values. * - SQ, use an array of vtkDICOMItem values. */ vtkDICOMValue(vtkDICOMVR vr, double v); vtkDICOMValue(vtkDICOMVR vr, const std::string& v); vtkDICOMValue(vtkDICOMVR vr, vtkDICOMTag v); vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMItem& v); vtkDICOMValue(vtkDICOMVR vr, const char *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const unsigned char *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const short *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const unsigned short *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const int *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const unsigned int *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const long long *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const unsigned long long *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const float *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const double *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMTag *data, size_t count); vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMItem *data, size_t count); //@} //@{ //! Construct a string value with a specific character set. /*! * This will set the character set that will be used to interpret * the data inside the string value. The character set parameter * will be ignored unless the the VR is PN, SH, LO, ST, LT, or UT, * since all other VRs are restricted to ASCII. */ vtkDICOMValue(vtkDICOMVR vr, vtkDICOMCharacterSet cs, const std::string& v); vtkDICOMValue(vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *data, size_t l); //@} //@{ //! Create an emtpy value. explicit vtkDICOMValue(vtkDICOMVR vr); //! Copy constructor. vtkDICOMValue(const vtkDICOMValue &v) : V(v.V) { if (this->V) { ++(this->V->ReferenceCount); } } //! Construct from a tag. vtkDICOMValue(vtkDICOMTag v); //! Construct from an item. vtkDICOMValue(const vtkDICOMItem &v); //! Construct from a sequence. vtkDICOMValue(const vtkDICOMSequence &v); //@} //@{ //! Default constructor, constructs an invalid value. vtkDICOMValue() : V(0) {} //! Destructor releases the internal data array. ~vtkDICOMValue() { this->Clear(); } //@} //@{ //! Create a value from a UTF8-encoded string. /*! * This will convert a UTF-8 string to the target encoding and store * the result in a new value. If the target encoding is ISO 2022, * then escape codes will be added before and after delimeters as * necessary (the delimiters are 'backslash' for multi-valued VRs, * and '^', '=' for PN). */ static vtkDICOMValue FromUTF8String( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const std::string& v); //@} //@{ //! Clear the value, the result is an invalid value. void Clear() { if (this->V && --(this->V->ReferenceCount) == 0) { this->FreeValue(this->V); } this->V = 0; } //! Check whether this value is valid, i.e. contains data. bool IsValid() const { return (this->V != 0); } //@} //@{ //! Get the VR, the representation of the data values. vtkDICOMVR GetVR() const { return (this->V ? this->V->VR : vtkDICOMVR()); } //! Get the VL, the length of the data in bytes (will always be even). unsigned int GetVL() const { return (this->V ? this->V->VL : 0); } //! Get the character set for a text value. /*! * String values are stored with their original encoding, as given * by the SpecificCharacterSet attribute of the data set that they * belong to. This only applies to VRs of PN, SH, LO, ST, LT, and UT. * All other string values are always stored as plain ASCII with no * control characters. */ vtkDICOMCharacterSet GetCharacterSet() const { return (this->V ? this->V->CharacterSet : 0); } //! Get the value multiplicity. /*! * The number of values has different interpretations for * for different VRs: * - for backslash-delimited text (AE, AS, CS, DA, DS, DT, IS, * LO, PN, SH, UI) it is the number of backslash-separated values. * - for other text (LT, ST, UT) the number of values is always 1. * - for binary numerical data (FL, FD, SS, US, SL, UL, OF, OW, OB) * the number of binary values will be returned. * - for UN, the number of bytes will be returned. * - for attribute tags (VR is AT) the number of tags will be returned. * - for sequences (SQ) the number of items in the sequence, * excluding any delimeters, will be returned. */ size_t GetNumberOfValues() const { return (this->V ? this->V->NumberOfValues #ifdef VTK_DICOM_USE_OVERFLOW_BYTE + (static_cast(this->V->Overflow) << 32) #endif : 0); } //@} //@{ //! Copy "n" values into vb, starting at value "i". /*! * Get one or more values, doing conversion from the stored type to * the requested type. If the VR is IS or DS (integer string or * decimal string) then conversion from text to a numerical value * will be performed. */ void GetValues(std::string *vb, size_t n, size_t i=0) const; void GetValues(unsigned char *vb, size_t n, size_t i=0) const; void GetValues(short *vb, size_t n, size_t i=0) const; void GetValues(unsigned short *vb, size_t n, size_t i=0) const; void GetValues(int *vb, size_t n, size_t i=0) const; void GetValues(unsigned int *vb, size_t n, size_t i=0) const; void GetValues(long long *vb, size_t n, size_t i=0) const; void GetValues(unsigned long long *vb, size_t n, size_t i=0) const; void GetValues(float *vb, size_t n, size_t i=0) const; void GetValues(double *vb, size_t n, size_t i=0) const; void GetValues(vtkDICOMTag *vb, size_t n, size_t i=0) const; //@} //@{ //! Get one scalar, string, tag or item from the value. /*! * Convert the i'th value to the desired type, if possible, and return * it. If the value is invalid, or conversion is not possible, or the * index is out of range, then the return value will be zero (or an * empty string). Trailing spaces are always removed from strings. * Leading spaces are removed unless the VR is ST, LT, or UT. */ std::string GetUTF8String(size_t i) const; std::string GetString(size_t i) const; unsigned char GetUnsignedChar(size_t i) const; short GetShort(size_t i) const; unsigned short GetUnsignedShort(size_t i) const; int GetInt(size_t i) const; unsigned int GetUnsignedInt(size_t i) const; long long GetInt64(size_t i) const; unsigned long long GetUnsignedInt64(size_t i) const; float GetFloat(size_t i) const; double GetDouble(size_t i) const; vtkDICOMTag GetTag(size_t i) const; const vtkDICOMItem& GetItem(size_t i) const; //@} //@{ //! Get the value as a scalar, string, tag, or item. /*! * The value is converted to the desired type, if possible, and returned. * Otherwise the return value is zero (or an empty string). Conversion * to string always produces an empty string for values of type UN, SQ, * OB, OW, and OF. Trailing spaces are always removed from strings. * Leading spaces are removed unless the VR is ST, LT, or UT. */ std::string AsUTF8String() const; std::string AsString() const; unsigned char AsUnsignedChar() const; short AsShort() const; unsigned short AsUnsignedShort() const; int AsInt() const; unsigned int AsUnsignedInt() const; long long AsInt64() const; unsigned long long AsUnsignedInt64() const; float AsFloat() const; double AsDouble() const; vtkDICOMTag AsTag() const; const vtkDICOMItem& AsItem() const; //@} //@{ //! Get a pointer to the internal data array. /*! * GetCharData will return a null-terminated string if VR is * AE, AS, CS, DA, DS, DT, IS, LO, LT, PN, SH, ST, TM, UI, UT, * with a possible trailing space if the VR is not UI (UID). * The other methods will return a valid pointer if the the * requested pointer type matches the VR. To compute the size * of the array, divide VL by the size of the requested type. * Do not use NumberOfValues as the array size, because for many * VRs the array size is much larger than the NumberOfValues, * in fact for OB, OF, UT, and many other VRs the entire array * counts as a single value, according to the DICOM standard. * Returns NULL if the requested pointer type does not match the VR. */ const char *GetCharData() const; const unsigned char *GetUnsignedCharData() const; const short *GetShortData() const; const unsigned short *GetUnsignedShortData() const; const int *GetIntData() const; const unsigned int *GetUnsignedIntData() const; const long long *GetInt64Data() const; const unsigned long long *GetUnsignedInt64Data() const; const float *GetFloatData() const; const double *GetDoubleData() const; const vtkDICOMTag *GetTagData() const; const vtkDICOMItem *GetSequenceData() const; const vtkDICOMValue *GetMultiplexData() const; //@} //@{ //! Allocate space within a value object. /*! * Allocate an array of the specified size (number of elements) * within the value object. This method will not do any checks * to ensure that the data type matches the VR. It is meant to * be an efficient way for the parser to allocate a value so that * the value's contents can be read in directly from a file. */ char *AllocateCharData(vtkDICOMVR vr, size_t vn); char *AllocateCharData( vtkDICOMVR vr, vtkDICOMCharacterSet cs, size_t vn); unsigned char *AllocateUnsignedCharData(vtkDICOMVR vr, size_t vn); short *AllocateShortData(vtkDICOMVR vr, size_t vn); unsigned short *AllocateUnsignedShortData(vtkDICOMVR vr, size_t vn); int *AllocateIntData(vtkDICOMVR vr, size_t vn); unsigned int *AllocateUnsignedIntData(vtkDICOMVR vr, size_t vn); long long *AllocateInt64Data(vtkDICOMVR vr, size_t vn); unsigned long long *AllocateUnsignedInt64Data(vtkDICOMVR vr, size_t vn); float *AllocateFloatData(vtkDICOMVR vr, size_t vn); double *AllocateDoubleData(vtkDICOMVR vr, size_t vn); vtkDICOMTag *AllocateTagData(vtkDICOMVR vr, size_t vn); vtkDICOMItem *AllocateSequenceData(vtkDICOMVR vr, size_t vn); vtkDICOMValue *AllocateMultiplexData(vtkDICOMVR vr, size_t vn); //@} //@{ //! Compute the number of backslash-separated string values. /*! * After calling AllocateCharData and writing text into the allocated * space, this must be called to set the NumberOfValues according to * the number of backslash-separated string values that are present. */ void ComputeNumberOfValuesForCharData(); //! Reallocate data of type OB or UN. /*! * Values of type OB or UN can hold encapsulated data. When * building these values, it is useful to be able to extend * the internal data as needed. After this method is called, * the NumberOfValues will be vn, and the VL will be 0xffffffff. */ unsigned char *ReallocateUnsignedCharData(size_t vn); //@} //@{ //! Append value "i" to the supplied UTF8 string. /* * String values will be converted from their native encoding * to UTF-8. */ void AppendValueToUTF8String(std::string &str, size_t i) const; //@{ //! Append value "i" to the supplied UTF8 string for safe printing. /* * This method will check for control characters or unconvertible * characters in the value, and will replace them with four-byte * codes of the form '\ooo' where 'o' is an octal digit. */ void AppendValueToSafeUTF8String(std::string &str, size_t i) const; //! Append value "i" to the supplied string. /*! * This will convert the value to human-readable format. * Be cautious when using this method for an element with VR equal * to ST, LT, or UT, because the resulting string might be very * long, and might contain special (i.e. non-printable) characters. */ void AppendValueToString(std::string &str, size_t i) const; //@} //@{ //! Check if the value matches the specified find query value. /*! * This method is used during "find" requests, according to the rules * of DICOM Part 4 C.2.2.2 Attribute Matching. The standard wildcards * "*" and "?" are supported, as well as numeric ranges (for times and dates) * through the use of two values separated by "-". Matches are case * sensitive, except when the VR is PN. If the value has multiplicity, * then the match will succeed if any of the values match. */ bool Matches(const vtkDICOMValue& value) const; //! Check if the value is equal to the specified string. /*! * Note that matches to an empty string will always succeed due to * the universal matching rule. To check if a value is empty, you * should instead check to see if its VL is zero. Padding spaces will * automatically be stripped before the comparison is done. The * character set of the string is assumed to be the same as the * character set of the value that is being matched. This method * can be used to match numerical values in addition to text values. */ bool Matches(const std::string& v) const; //! Check if the value is the specified numeric value. /*! * This will return true only if the value has a numeric representation * (e.g. has a VR of IS, DS, US, UL, SS, SL, FL, FD) and is equal to the * specified number. If the value multiplicity is greater than one, * then the match is true if at least one value matches. */ bool Matches(double v) const; //@} //@{ //! Override assignment operator for reference counting. vtkDICOMValue& operator=(const vtkDICOMValue& o) { if (this->V != o.V) { if (o.V) { ++(o.V->ReferenceCount); } if (this->V) { if (--(this->V->ReferenceCount) == 0) { this->FreeValue(this->V); } } this->V = o.V; } return *this; } //! Assign a value from a sequence object. vtkDICOMValue& operator=(const vtkDICOMSequence& o); //@} //@{ //! Equality requires that all elements of the value are equal. bool operator==(const vtkDICOMValue& o) const; bool operator!=(const vtkDICOMValue& o) const { return !(*this == o); } //@} private: //! Allocate an array of size vn for the specified vr template T *Allocate(vtkDICOMVR vr, size_t vn); //! Free the internal value. static void FreeValue(Value *v); //! Internal templated GetValues() method. template void GetValuesT(OT *v, size_t count, size_t s) const; //! Internal templated value creation method. template void CreateValue(vtkDICOMVR vr, const T *data, size_t count); //! Internal templated method to initialize for future appends. template void AppendInit(vtkDICOMVR vr); //! Internal templated method to grow the value. template void AppendValue(const T &item); //! Internal templated method to set a value. template void SetValue(size_t i, const T &item); //! Method used by vtkDICOMMetaData to change multiplexed value. vtkDICOMValue *GetMultiplex(); //! Get the start and end for the "i"th backslash-delimited value. void Substring(size_t i, const char *&start, const char *&end) const; //! Create a value from a string with a specific character set. void CreateValueWithSpecificCharacterSet( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *data, size_t l); //! Create a value with conversion from UTF8 to the given encoding. /*! * Given a UTF8 input string, this method will attempt to convert * it to the specified character set and store it in the value. * The return value is the number of input characters that were * successfully converted before the first error (it will be equal * to the length of the input string if no errors occurred); */ size_t CreateValueFromUTF8( vtkDICOMVR vr, vtkDICOMCharacterSet cs, const char *data, size_t l); //! A simple string compare with wildcards "*" and "?". static bool PatternMatches( const char *pattern, const char *pe, const char *val, const char *ve); //! Pattern matching with multiple backslash-delimited values. static bool PatternMatchesMulti( const char *pattern, const char *val, vtkDICOMVR vr); //! Normalize a date, time, or datetime. /*! * The return value is the number of characters that should be used for * comparison to the normalized datetime, everything past the maximum * significant character is zero (or, for dates, first day of January). */ static size_t NormalizeDateTime( const char *input, char output[22], vtkDICOMVR vr); //! Do case-insensitive matching on names, after normalization. /*! * This will check to see if a given wildcard pattern (using "*" and "?") * matches the given patient name. It expects "^" to be used as the * separator between name segments. Prior to comparison, the names are * normalized to five "^"-separated segments. */ static bool PatternMatchesPersonName(const char *pattern, const char *val); //! Normalize a person's name for comparison. /*! * The normalization involves expanding the name into 5 distinct segments * separated by "^". If the "isquery" parameter is set, then empty * segments will be filled with "*" to allow them to match non-empty * segments. */ static void NormalizePersonName( const char *input, char output[256], bool isquery=false); //! The only data member: a pointer to the internal value. Value *V; //! An empty item, for when one is needed. static const vtkDICOMItem EmptyItem; // friend the sequence class, it requires AppendValue() and SetValue(). friend class vtkDICOMSequence; // friend the meta data class, it requires GetMultiplex(). friend class vtkDICOMValueFriendMetaData; }; //! @cond // This friendship class allows vtkDICOMMetaData to use exactly one // private method from vtkDICOMValue. class vtkDICOMValueFriendMetaData { static vtkDICOMValue *GetMultiplex(vtkDICOMValue *v) { return v->GetMultiplex(); } friend class vtkDICOMMetaData; }; //! @endcond VTKDICOM_EXPORT ostream& operator<<(ostream& os, const vtkDICOMValue& v); #endif /* vtkDICOMValue_h */ // VTK-HeaderTest-Exclude: vtkDICOMValue.h vtk-dicom-0.8.12/Source/vtkDICOMWriter.cxx000066400000000000000000000640761356440565500202720ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkDICOMWriter.h" #include "vtkDICOMAlgorithm.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMCompiler.h" #include "vtkDICOMSCGenerator.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include "vtkObjectFactory.h" #include "vtkIntArray.h" #include "vtkImageData.h" #include "vtkPointData.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkByteSwap.h" #include "vtkMatrix4x4.h" #include "vtkTrivialProducer.h" #include "vtkAlgorithmOutput.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkCommand.h" #include "vtkErrorCode.h" #include "vtkSmartPointer.h" #include "vtkVersion.h" #include #include #include #include #include vtkStandardNewMacro(vtkDICOMWriter); vtkCxxSetObjectMacro(vtkDICOMWriter,PatientMatrix,vtkMatrix4x4); vtkCxxSetObjectMacro(vtkDICOMWriter,MetaData,vtkDICOMMetaData); vtkCxxSetObjectMacro(vtkDICOMWriter,Generator,vtkDICOMGenerator); //---------------------------------------------------------------------------- vtkDICOMWriter::vtkDICOMWriter() { this->FileLowerLeft = 1; this->FileDimensionality = 2; this->MetaData = 0; this->GeneratedMetaData = 0; this->Generator = vtkDICOMSCGenerator::New(); this->TimeAsVector = 0; this->TimeDimension = 0; this->TimeSpacing = 1.0; this->RescaleIntercept = 0.0; this->RescaleSlope = 1.0; this->PatientMatrix = 0; this->MemoryRowOrder = vtkDICOMWriter::BottomUp; this->FileSliceOrder = vtkDICOMWriter::RHR; this->SeriesDescription = 0; this->TransferSyntaxUID = 0; this->ImageType = new char[24]; strcpy(this->ImageType, "DERIVED/SECONDARY/OTHER"); this->OverlayType = 0; this->Streaming = 0; // the second input is the overlay this->SetNumberOfInputPorts(2); } //---------------------------------------------------------------------------- vtkDICOMWriter::~vtkDICOMWriter() { if (this->PatientMatrix) { this->PatientMatrix->Delete(); } if (this->MetaData) { this->MetaData->Delete(); } if (this->Generator) { this->Generator->Delete(); } delete [] this->TransferSyntaxUID; delete [] this->SeriesDescription; delete [] this->ImageType; } //---------------------------------------------------------------------------- vtkDICOMMetaData *vtkDICOMWriter::GetMetaData() { return this->MetaData; } //---------------------------------------------------------------------------- void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "SeriesDescription: " << this->SeriesDescription << "\n"; os << indent << "ImageType: " << this->ImageType << "\n"; os << indent << "OverlayType: " << (this->OverlayType ? "ROI\n" : "Graphics\n"); os << indent << "TransferSyntaxUID: "; if (this->TransferSyntaxUID) { os << this->TransferSyntaxUID << "\n"; } else { os << "(none)\n"; } os << indent << "MetaData: "; if (this->MetaData) { os << this->MetaData << "\n"; } else { os << "(none)\n"; } os << indent << "Generator: "; if (this->Generator) { os << this->Generator << "\n"; } else { os << "(none)\n"; } os << indent << "TimeAsVector: " << (this->TimeAsVector ? "On\n" : "Off\n"); os << indent << "TimeDimension: " << this->TimeDimension << "\n"; os << indent << "TimeSpacing: " << this->TimeSpacing << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "PatientMatrix:"; if (this->PatientMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "MemoryRowOrder: " << this->GetMemoryRowOrderAsString() << "\n"; os << indent << "FileSliceOrder: " << this->GetFileSliceOrderAsString() << "\n"; os << indent << "Streaming: " << (this->Streaming ? "On\n" : "Off\n"); } //---------------------------------------------------------------------------- void vtkDICOMWriter::SetMemoryRowOrder(int order) { if (order >= 0 && order <= vtkDICOMWriter::BottomUp) { if (order != this->MemoryRowOrder) { this->MemoryRowOrder = order; this->Modified(); } } } //---------------------------------------------------------------------------- const char *vtkDICOMWriter::GetMemoryRowOrderAsString() { const char *text = ""; switch (this->MemoryRowOrder) { case vtkDICOMWriter::FileNative: text = "FileNative"; break; case vtkDICOMWriter::TopDown: text = "TopDown"; break; case vtkDICOMWriter::BottomUp: text = "BottomUp"; break; } return text; } //---------------------------------------------------------------------------- void vtkDICOMWriter::SetFileSliceOrder(int order) { if (order >= 0 && order <= vtkDICOMWriter::Reverse) { if (order != this->FileSliceOrder) { this->FileSliceOrder = order; this->Modified(); } } } //---------------------------------------------------------------------------- const char *vtkDICOMWriter::GetFileSliceOrderAsString() { const char *text = ""; switch (this->FileSliceOrder) { case vtkDICOMWriter::RHR: text = "RHR"; break; case vtkDICOMWriter::LHR: text = "LHR"; break; case vtkDICOMWriter::Same: text = "Same"; break; case vtkDICOMWriter::Reverse: text = "Reverse"; break; } return text; } //---------------------------------------------------------------------------- void vtkDICOMWriter::ComputeInternalFileName(int slice) { size_t n = 0; if (this->FileName) { n = strlen(this->FileName) + 1; } else if (this->FilePrefix) { n = strlen(this->FilePrefix) + strlen(this->FilePattern) + 10; } else { n = strlen(this->FilePattern) + 10; } if (this->InternalFileName == 0 || strlen(this->InternalFileName) + 10 < n) { delete [] this->InternalFileName; this->InternalFileName = new char[n + 11]; } if (this->FileName) { sprintf(this->InternalFileName, "%s", this->FileName); } else if (this->FilePrefix) { sprintf(this->InternalFileName, this->FilePattern, this->FilePrefix, slice); } else { sprintf(this->InternalFileName, this->FilePattern, slice); } } //---------------------------------------------------------------------------- void vtkDICOMWriter::FreeInternalFileName() { delete [] this->InternalFileName; this->InternalFileName = 0; } //---------------------------------------------------------------------------- int vtkDICOMWriter::GenerateMetaData(vtkInformation *info) { if (this->GeneratedMetaData) { this->GeneratedMetaData->Delete(); this->GeneratedMetaData = 0; } if (!this->Generator) { vtkErrorMacro("No Generator was supplied, unable to create a DICOM " "data set"); return 0; } // Check whether image is stored top-to-bottom or bottom-to-top bool flipImage = (this->MemoryRowOrder == vtkDICOMWriter::BottomUp); bool reverseSlices = flipImage; if (this->FileSliceOrder == vtkDICOMWriter::LHR) { reverseSlices = !flipImage; } else if (this->FileSliceOrder == vtkDICOMWriter::Same) { reverseSlices = false; } else if (this->FileSliceOrder == vtkDICOMWriter::Reverse) { reverseSlices = true; } // Get the meta data from the pipeline if not given explicitly vtkDICOMMetaData *inMeta = this->MetaData; vtkMatrix4x4 *inMatrix = this->PatientMatrix; vtkInformation *metaInfo = info; if (inMeta == 0 || inMatrix == 0) { // this code is needed for when SetInputData was used vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0); if (sourceConnection) { vtkAlgorithm *producer = sourceConnection->GetProducer(); if (producer && vtkTrivialProducer::SafeDownCast(producer)) { vtkDataObject *inputData = producer->GetOutputDataObject(0); if (inputData) { metaInfo = inputData->GetInformation(); } } } } if (inMeta == 0) { inMeta = vtkDICOMMetaData::SafeDownCast( metaInfo->Get(vtkDICOMAlgorithm::META_DATA())); } if (inMatrix == 0) { double *elements = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX()); if (elements) { inMatrix = vtkMatrix4x4::New(); inMatrix->DeepCopy(elements); } } else { inMatrix->Register(0); } // Generate the meta data this->Generator->SetMultiFrame(this->FileDimensionality > 2); this->Generator->SetOriginAtBottom(flipImage); this->Generator->SetReverseSliceOrder(reverseSlices); this->Generator->SetTimeAsVector(this->TimeAsVector); this->Generator->SetTimeDimension(this->TimeDimension); this->Generator->SetTimeSpacing(this->TimeSpacing); this->Generator->SetRescaleIntercept(this->RescaleIntercept); this->Generator->SetRescaleSlope(this->RescaleSlope); this->Generator->SetNumberOfOverlays( this->GetNumberOfInputConnections(1)); this->Generator->SetSourceMetaData(inMeta); this->Generator->SetPatientMatrix(inMatrix); if (inMatrix) { inMatrix->Delete(); } if (!this->Generator->GenerateInstance(info)) { return 0; } this->GeneratedMetaData = this->Generator->GetMetaData(); this->GeneratedMetaData->Register(this); vtkDICOMMetaData *meta = this->GeneratedMetaData; // set the series description from the member variable if (this->SeriesDescription && this->SeriesDescription[0] != '\0') { char sd[65]; strncpy(sd, this->SeriesDescription, 64); sd[64] = '\0'; meta->Set(DC::SeriesDescription, sd); meta->Erase(DC::SeriesDescriptionCodeSequence); } // set the image type from the member variable if (this->ImageType && this->ImageType[0] != '\0') { const char *allowedTypes[] = { "ORIGINAL\\PRIMARY", "DERIVED\\PRIMARY", "ORIGINAL\\SECONDARY", "DERIVED\\SECONDARY", 0 }; char sd[256]; strncpy(sd, this->ImageType, 255); sd[255] = '\0'; char *sdp = sd; char *lsdp = sd; while (*sdp != '\0') { char c = *sdp++; if (((c < 'A' || c > 'Z') && (c < '0' || c > '9') && c != '_' && c != ' ') || (sdp - lsdp > 16)) { vtkErrorMacro("Illegal ImageType: " << this->ImageType); return 0; } if (*sdp == '/' || *sdp == '\\') { *sdp++ = '\\'; lsdp = sdp; } } bool isAllowed = false; for (const char **allowed = allowedTypes; *allowed != 0; allowed++) { size_t sl = strlen(*allowed); if (strncmp(*allowed, sd, sl) == 0 && (sd[sl] == '\0' || sd[sl] == '\\')) { isAllowed = true; break; } } if (!isAllowed) { vtkErrorMacro("Illegal ImageType: " << this->ImageType << ", " "the first part must be ORIGINAL or DERIVED, the " "second part must be PRIMARY or SECONDARY"); return 0; } meta->Set(DC::ImageType, sd); } // add an empty PixelData to be filled in by the compiler unsigned short empty = 0; meta->Set( DC::PixelData, vtkDICOMValue(vtkDICOMVR::OW, &empty, empty)); return 1; } //---------------------------------------------------------------------------- void vtkDICOMWriter::GenerateOverlays( int minFileIdx, int maxFileIdx, const int wholeExtent[4]) { vtkImageData *data = this->GetOverlayInput(); if (!data) { return; } // Get the extent of the input int extent[6]; data->GetExtent(extent); int scalarSize = data->GetScalarSize(); int nComp = data->GetNumberOfScalarComponents(); vtkIdType pixelInc = nComp*scalarSize; vtkIdType rowInc = pixelInc*(extent[1] - extent[0] + 1); // Clip the overlay extent with the whole extent of the main input // (According to DICOM standard, this doesn't need to be done) for (int i = 0; i < 6; i += 2) { extent[i] = std::max(extent[i], wholeExtent[i]); extent[i+1] = std::max(extent[i+1], wholeExtent[i+1]); if (extent[i] > extent[i+1]) { return; } } // Get rows, cols in overlay int overlayCols = extent[1] - extent[0] + 1; int overlayRows = extent[3] - extent[2] + 1; int firstCol = extent[0] - wholeExtent[0]; int firstRow = extent[2] - wholeExtent[2]; // adjust if a flip is needed vtkIdType flipOffset = 0; if (this->MemoryRowOrder == vtkDICOMWriter::BottomUp) { firstRow = wholeExtent[3] - extent[3]; flipOffset = rowInc*(extent[3] - extent[2]); rowInc = -rowInc; } // Get the map from file,frame to slice. vtkIntArray *sliceMap = this->Generator->GetSliceIndexArray(); vtkIntArray *componentMap = this->Generator->GetComponentIndexArray(); int numFrames = sliceMap->GetNumberOfComponents(); for (int fileIdx = minFileIdx; fileIdx <= maxFileIdx; fileIdx++) { // Count the number of overlay frames int overlayFrames = 0; for (int frameIdx = 0; frameIdx < numFrames; frameIdx++) { if (componentMap->GetComponent(fileIdx, frameIdx) < nComp) { overlayFrames++; } } // Allocate the output buffer size_t nbits = overlayFrames; nbits *= overlayRows; nbits *= overlayCols; vtkDICOMValue v; unsigned char *buffer = v.AllocateUnsignedCharData(vtkDICOMVR::OB, (nbits+7)/8); unsigned char *bptr = buffer; // for keeping track of bits written int bit = 0; unsigned char c = 0; // iterate through all frames in the file for (int frameIdx = 0; frameIdx < numFrames; frameIdx++) { int sliceIdx = sliceMap->GetComponent(fileIdx, frameIdx); int componentIdx = componentMap->GetComponent(fileIdx, frameIdx); if (sliceIdx < extent[4] || sliceIdx > extent[5] || componentIdx >= nComp) { continue; } // Get the pointer to the data int sliceExtent[6] = { extent[0], extent[1], extent[2], extent[3], sliceIdx, sliceIdx }; unsigned char *ptr = static_cast( data->GetScalarPointerForExtent(sliceExtent)); #ifdef VTK_WORDS_BIGENDIAN ptr += (scalarSize-1); #endif ptr += componentIdx*scalarSize; ptr += flipOffset; for (int i = extent[2]; i <= extent[3]; i++) { unsigned char *optr = ptr; for (int j = extent[0]; j <= extent[1]; j++) { c |= (*optr & 1) << bit++; if (bit == 8) { *bptr++ = c; bit = 0; c = 0; } optr += pixelInc; } ptr += rowInc; } } if (bit != 0) { *bptr++ = c; } if (((bptr - buffer) & 1) != 0) { // pad data element to even size *bptr++ = 0; } // write the attributes for the overlay vtkDICOMMetaData *meta = this->GeneratedMetaData; meta->Set(fileIdx, DC::OverlayRows, overlayRows); meta->Set(fileIdx, DC::OverlayColumns, overlayCols); meta->Set(fileIdx, DC::OverlayType, (this->OverlayType ? "R" : "G")); short overlayOrigin[2] = { static_cast(firstRow+1), static_cast(firstCol+1) }; meta->Set(fileIdx, DC::OverlayOrigin, vtkDICOMValue(vtkDICOMVR::SS, overlayOrigin, 2)); meta->Set(fileIdx, DC::OverlayBitsAllocated, 1); meta->Set(fileIdx, DC::OverlayBitPosition, 0); meta->Set(fileIdx, DC::OverlayData, v); if (meta->Has(DC::NumberOfFrames)) { meta->Set(fileIdx, DC::NumberOfFramesInOverlay, overlayFrames); } // optional attributes must be suited for the type if (!this->OverlayType) // not ROI { meta->Erase(DC::ROIArea); meta->Erase(DC::ROIMean); meta->Erase(DC::ROIStandardDeviation); } } } //---------------------------------------------------------------------------- void vtkDICOMWriter::SetOverlayInputData(vtkImageData *overlay) { #if VTK_MAJOR_VERSION >= 6 this->SetInputData(1, overlay); #else this->SetInput(1, overlay); #endif } //---------------------------------------------------------------------------- void vtkDICOMWriter::SetOverlayInputConnection(vtkAlgorithmOutput *overlay) { this->SetInputConnection(1, overlay); } //---------------------------------------------------------------------------- vtkImageData *vtkDICOMWriter::GetOverlayInput() { if (this->GetNumberOfInputConnections(1) < 1) { return NULL; } return vtkImageData::SafeDownCast( this->GetExecutive()->GetInputData(1, 0)); } //---------------------------------------------------------------------------- int vtkDICOMWriter::FillInputPortInformation(int port, vtkInformation *info) { if (port == 1) { info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData"); info->Set(vtkAlgorithm::INPUT_IS_OPTIONAL(), 1); } else { info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData"); } return 1; } //---------------------------------------------------------------------------- int vtkDICOMWriter::RequestData( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* vtkNotUsed(outputVector)) { this->SetErrorCode(vtkErrorCode::NoError); vtkInformation *info = inputVector[0]->GetInformationObject(0); vtkImageData *data = vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT())); if (data == NULL) { vtkErrorMacro("No input provided!"); return 0; } if (!this->FileName && !this->FilePattern) { vtkErrorMacro("Write:Please specify either a FileName " "or a file prefix and pattern"); this->SetErrorCode(vtkErrorCode::NoFileNameError); return 0; } if (!this->GeneratedMetaData) { // Generate the meta data to go with the image if (!this->GenerateMetaData(info)) { return 0; } } // Get the map from file,frame to slice. vtkIntArray *sliceMap = this->Generator->GetSliceIndexArray(); vtkIntArray *componentMap = this->Generator->GetComponentIndexArray(); int numFiles = static_cast(sliceMap->GetNumberOfTuples()); int numFrames = sliceMap->GetNumberOfComponents(); // Get the image dimensions int extent[6], wholeExtent[6]; info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent); info->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), extent); // Find the range of files that corresponds to the update extent int minFileIdx = numFiles-1; int maxFileIdx = 0; for (int fileIdx = 0; fileIdx < numFiles; fileIdx++) { for (int frameIdx = 0; frameIdx < numFrames; frameIdx++) { int sliceIdx = sliceMap->GetComponent(fileIdx, frameIdx); if (sliceIdx >= extent[4] && sliceIdx <= extent[5]) { minFileIdx = (minFileIdx < fileIdx ? minFileIdx : fileIdx); maxFileIdx = (maxFileIdx > fileIdx ? maxFileIdx : fileIdx); } } } // Generate overlays this->GenerateOverlays(minFileIdx, maxFileIdx, wholeExtent); vtkSmartPointer compiler = vtkSmartPointer::New(); if (this->TransferSyntaxUID) { compiler->SetTransferSyntaxUID(this->TransferSyntaxUID); } vtkDICOMMetaData *meta = this->GeneratedMetaData; compiler->SetMetaData(meta); // write the image unsigned char *dataPtr = static_cast( data->GetScalarPointerForExtent(extent)); bool flipImage = (this->MemoryRowOrder == vtkDICOMWriter::BottomUp); int planarConfiguration = meta->Get(DC::PlanarConfiguration).AsInt(); int samplesPerPixel = meta->Get(DC::SamplesPerPixel).AsInt(); samplesPerPixel = (samplesPerPixel > 0 ? samplesPerPixel : 1); int numFileComponents = (planarConfiguration ? 1 : samplesPerPixel); int numPlanes = (planarConfiguration ? samplesPerPixel : 1); int scalarSize = data->GetScalarSize(); int numComponents = data->GetNumberOfScalarComponents(); vtkIdType pixelSize = numComponents*scalarSize; vtkIdType rowSize = pixelSize*(extent[1] - extent[0] + 1); vtkIdType sliceSize = rowSize*(extent[3] - extent[2] + 1); vtkIdType filePixelSize = numFileComponents*scalarSize; vtkIdType fileRowSize = filePixelSize*(extent[1] - extent[0] + 1); vtkIdType filePlaneSize = fileRowSize*(extent[3] - extent[2] + 1); vtkIdType fileFrameSize = filePlaneSize*numPlanes; this->InvokeEvent(vtkCommand::StartEvent); this->UpdateProgress(0.0); bool packedToPlanar = (filePixelSize != pixelSize); unsigned char *rowBuffer = 0; if (flipImage) { rowBuffer = new unsigned char[fileRowSize]; } unsigned char *frameBuffer = 0; if (flipImage || packedToPlanar) { frameBuffer = new unsigned char[fileFrameSize]; } // loop through all files in the update extent for (int fileIdx = minFileIdx; fileIdx <= maxFileIdx; fileIdx++) { // get the index for this file this->ComputeInternalFileName(fileIdx + 1); compiler->SetFileName(this->InternalFileName); compiler->SetIndex(fileIdx); compiler->SetSOPInstanceUID( meta->Get(fileIdx, DC::SOPInstanceUID).GetCharData()); compiler->SetSeriesInstanceUID( meta->Get(fileIdx, DC::SeriesInstanceUID).GetCharData()); compiler->WriteHeader(); // iterate through all frames in the file for (int frameIdx = 0; frameIdx < numFrames; frameIdx++) { if (this->AbortExecute) { break; } this->UpdateProgress(static_cast(fileIdx*numFrames + frameIdx)/ static_cast(numFiles*numFrames)); int sliceIdx = sliceMap->GetComponent(fileIdx, frameIdx); int componentIdx = componentMap->GetComponent(fileIdx, frameIdx); // pointer to the frame that will be written to the file unsigned char *framePtr = frameBuffer; if (!framePtr) { // write the frame directly from image data framePtr = (dataPtr + (sliceIdx - extent[4])*sliceSize); } // go to the correct position in image data unsigned char *slicePtr = (dataPtr + (sliceIdx - extent[4])*sliceSize + componentIdx*samplesPerPixel*scalarSize); // iterate through all color planes in the slice unsigned char *planePtr = framePtr; for (int pIdx = 0; pIdx < numPlanes; pIdx++) { // convert scalar components to planes if (packedToPlanar) { const unsigned char *tmpInPtr = slicePtr; unsigned char *tmpOutPtr = planePtr; int m = sliceSize/pixelSize; for (int i = 0; i < m; i++) { vtkIdType n = filePixelSize; do { *tmpOutPtr++ = *tmpInPtr++; } while (--n); tmpInPtr += pixelSize - filePixelSize; } slicePtr += filePixelSize; } else { memcpy(framePtr, slicePtr, fileFrameSize); } // flip the data if necessary if (flipImage) { int numRows = extent[3] - extent[2] + 1; int halfRows = numRows/2; for (int yIdx = 0; yIdx < halfRows; yIdx++) { unsigned char *row1 = planePtr + yIdx*fileRowSize; unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize; memcpy(rowBuffer, row1, fileRowSize); memcpy(row1, row2, fileRowSize); memcpy(row2, rowBuffer, fileRowSize); } } planePtr += filePlaneSize; } // write the frame to the file compiler->WriteFrame(framePtr, fileFrameSize); } compiler->Close(); } delete [] rowBuffer; delete [] frameBuffer; this->FreeInternalFileName(); this->UpdateProgress(1.0); this->InvokeEvent(vtkCommand::EndEvent); return 1; } //---------------------------------------------------------------------------- void vtkDICOMWriter::Write() { // call Modified to force update to execute this->Modified(); this->UpdateInformation(); vtkInformation* inInfo = this->GetExecutive()->GetInputInformation(0, 0); int wholeExtent[6]; inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent); int numOverlays = this->GetNumberOfInputConnections(1); // if streaming is on, write the slices one-at-a-time if (this->Streaming && this->FileDimensionality == 2) { if (this->GenerateMetaData(inInfo)) { int extent[6] = { wholeExtent[0], wholeExtent[1], wholeExtent[2], wholeExtent[3], wholeExtent[4], wholeExtent[5] }; for (int i = wholeExtent[4]; i <= wholeExtent[5]; i++) { // set the update extent to the slice extent[4] = i; extent[5] = i; this->Modified(); inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), extent, 6); for (int j = 0; j < numOverlays; j++) { vtkInformation *ovInfo = this->GetExecutive()->GetInputInformation(1, j); int ovExtent[6]; ovInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ovExtent); if (i >= ovExtent[4] && i <= ovExtent[5]) { ovExtent[4] = i; ovExtent[5] = i; } ovInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), ovExtent, 6); } this->Update(); } } } else { // set update wholeExtent to whole wholeExtent inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), wholeExtent, 6); for (int j = 0; j < numOverlays; j++) { vtkInformation *ovInfo = this->GetExecutive()->GetInputInformation(1, j); int ovExtent[6]; ovInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ovExtent); ovInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), ovExtent, 6); } this->Update(); } // do some cleanup if (this->GeneratedMetaData) { this->GeneratedMetaData->Delete(); this->GeneratedMetaData = 0; } } vtk-dicom-0.8.12/Source/vtkDICOMWriter.h000066400000000000000000000236521356440565500177120ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2012-2019 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkDICOMWriter * \brief Write DICOM image files. * * This class writes a series of one or more DICOM files. The default * behavior is to write a series of Secondary Capture files with no * modality-specific information. To write other kinds of DICOM files, * use the SetGenerator() method to supply a generator for the type of * data set that you wish to write. Currently, there are generators for * MR and CT data sets. */ #ifndef vtkDICOMWriter_h #define vtkDICOMWriter_h #include "vtkImageWriter.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkMatrix4x4; class vtkDICOMMetaData; class vtkDICOMGenerator; class VTKDICOM_EXPORT vtkDICOMWriter : public vtkImageWriter { public: vtkTypeMacro(vtkDICOMWriter, vtkImageWriter); //! Static method for construction. static vtkDICOMWriter *New(); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set a short description (max 64 chars) for the DICOM series. /*! * The default description is "VTKX.Y" where X.Y is the VTK version. */ vtkSetStringMacro(SeriesDescription); vtkGetStringMacro(SeriesDescription); //@} //@{ //! Set the image type, using a series of DICOM code strings. /*! * This must follow the DICOM standard, an error will be generated * if it doesn't. The default value is DERIVED/SECONDARY/OTHER, * where the forward-slashes will be replaced by backslashes when * the attribute is written. Set this to NULL if you wish to use * the original ImageType. */ vtkSetStringMacro(ImageType); vtkGetStringMacro(ImageType); //@} //@{ //! Write scalar components as the time dimension (default: Off). /*! * If this is on, the writer assumes that each time slot is stored * in a different scalar component of the image data. If it is off, * the writer assumes that each block of N adjacent slices correspond * to the N time slots of the time dimension. */ vtkSetMacro(TimeAsVector, int); vtkBooleanMacro(TimeAsVector, int); vtkGetMacro(TimeAsVector, int); //@} //@{ //! Set the time dimension to use in the DICOM file (or zero if none). /*! * The number of components of the input data must be divisible by the time * dimension if the time dimension is not set to zero. The vector dimension * will be set to the number of components divided by the time dimension. * This will be ignored if the SOP Class IOD does not permit a time * dimension. */ vtkSetMacro(TimeDimension, int); vtkGetMacro(TimeDimension, int); vtkSetMacro(TimeSpacing, double); vtkGetMacro(TimeSpacing, double); //@} //@{ //! Set the parameters to rescale integer pixel values into real values. /*! * These parameters are the intercept and slope int the equation v = m*x + b * that converts the stored pixel values to real units such as Hounsfield * units. Most modalities (including MR) ignore these values, while certain * modalities (such as CT) require them. */ vtkSetMacro(RescaleIntercept, double); vtkGetMacro(RescaleIntercept, double); vtkSetMacro(RescaleSlope, double); vtkGetMacro(RescaleSlope, double); //@} //@{ //! Set the matrix that places the image in DICOM patient coords. /*! * The 3x3 portion of the matrix must be orthonormal, and the * last column of the matrix is understood to be in millimetres. */ void SetPatientMatrix(vtkMatrix4x4 *); vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; } //@} //! Enumeration for top-down vs. bottom-up ordering. enum RowOrder { FileNative, TopDown, BottomUp }; //@{ //! Set the ordering of the image rows in memory. /*! * If the order is BottomUp (which is the default) then * the images will be flipped when they are read from disk. * The native orientation of DICOM images is top-to-bottom. */ void SetMemoryRowOrder(int order); void SetMemoryRowOrderToFileNative() { this->SetMemoryRowOrder(FileNative); } void SetMemoryRowOrderToTopDown() { this->SetMemoryRowOrder(TopDown); } void SetMemoryRowOrderToBottomUp() { this->SetMemoryRowOrder(BottomUp); } int GetMemoryRowOrder() { return this->MemoryRowOrder; } const char *GetMemoryRowOrderAsString(); //@} //! Enumeration for file order. enum SliceOrder { RHR, LHR, Same, Reverse }; //@{ //! Set the slice ordering of the files to be written. /*! * The default is RHR (right-hand-rule), which means that if your * right thumb points along an image row, and your index finger points * down a row (starting at the top left of the image), then a bent middle * finger points in the direction of increasing slice index. LHR is the * reverse of this. Same keeps files in the same order as VTK slices. */ void SetFileSliceOrder(int order); void SetFileSliceOrderToRHR() { this->SetFileSliceOrder(RHR); } void SetFileSliceOrderToLHR() { this->SetFileSliceOrder(LHR); } void SetFileSliceOrderToSame() { this->SetFileSliceOrder(Same); } void SetFileSliceOrderToReverse() { this->SetFileSliceOrder(Reverse); } int GetFileSliceOrder() { return this->FileSliceOrder; } const char *GetFileSliceOrderAsString(); //@} //@{ //! Set the meta data to include with the file. /*! * The supplied meta data is only used as a hint, the writer * will override attributes that aren't valid for the image. */ void SetMetaData(vtkDICOMMetaData *); vtkDICOMMetaData *GetMetaData(); //@} //@{ //! Set the generator for image modality you wish to write. /*! * The generator combines the image information from VTK with the * supplied MetaData to create the DICOM data series that will be * written to disk. The default generator will write a Secondary * Capture series, rather than a series belonging to a specific * imaging modality. */ void SetGenerator(vtkDICOMGenerator *); vtkDICOMGenerator *GetGenerator() { return this->Generator; } //@} //@{ //! Set the Transfer Syntax UID. /*! * Setting the transfer syntax is an experimental feature. If not * set, the transfer syntax will be 1.2.840.10008.1.2.1 (uncompressed * little-endian with explicit VR). */ vtkSetStringMacro(TransferSyntaxUID); vtkGetStringMacro(TransferSyntaxUID); //@} //@{ //! Turn on streaming, to pass one slice though the pipeline at a time. /*! * Streaming decreases memory usage for images with a large number of * slices, since only one slice will have to be in memory at a time. * However, streaming can be slower (sometimes much slower) than * reading and processing all of the slices at once. */ vtkSetMacro(Streaming, int); vtkGetMacro(Streaming, int); vtkBooleanMacro(Streaming, int); //@} //@{ //! Provide an overlay to be written with the data. void SetOverlayInputData(vtkImageData *data); void SetOverlayInputConnection(vtkAlgorithmOutput *data); vtkImageData *GetOverlayInput(); //@} //@{ //! Set the overlay type. vtkSetMacro(OverlayType, int); vtkGetMacro(OverlayType, int); void SetOverlayTypeToGraphics() { this->SetOverlayType(0); } void SetOverlayTypeToROI() { this->SetOverlayType(1); } //@} //@{ //! Write the file to disk. void Write() VTK_DICOM_OVERRIDE; //@} protected: vtkDICOMWriter(); ~vtkDICOMWriter(); //! Compute the name of one of the output files. void ComputeInternalFileName(int slice); //! Free the filename created by ComputeInternalFileName. void FreeInternalFileName(); //! Generate the meta data to be written for the files. virtual int GenerateMetaData(vtkInformation *info); //! Generate the overlays. virtual void GenerateOverlays(int minFileIdx, int maxFileIdx, const int extent[4]); //! The main execution method, which writes the file. int FillInputPortInformation(int port, vtkInformation *info) VTK_DICOM_OVERRIDE; int RequestData(vtkInformation *request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! The meta data set by the user. vtkDICOMMetaData *MetaData; //! The meta data generated by the generator. vtkDICOMMetaData *GeneratedMetaData; //! The modality-specific generator for the DICOM data object. vtkDICOMGenerator *Generator; //! Whether time is stored in slices or in scalar components. int TimeAsVector; //! Time dimension to use in the file. int TimeDimension; double TimeSpacing; //! The parameters for rescaling the data to real values. double RescaleIntercept; double RescaleSlope; //! The orientation matrix for the DICOM file. vtkMatrix4x4 *PatientMatrix; //! A description of how the file was produced. char *SeriesDescription; //! The transfer syntax to use when writing the data. char *TransferSyntaxUID; //! The DICOM Image Type. char *ImageType; //! The overlay type. int OverlayType; //! The row order to use when storing the data in memory. int MemoryRowOrder; //! The slice order to use when writing the files to disk. int FileSliceOrder; //! Whether to stream the data and write one file at a time. int Streaming; private: #ifdef VTK_DICOM_DELETE vtkDICOMWriter(const vtkDICOMWriter&) VTK_DICOM_DELETE; void operator=(const vtkDICOMWriter&) VTK_DICOM_DELETE; #else vtkDICOMWriter(const vtkDICOMWriter&) = delete; void operator=(const vtkDICOMWriter&) = delete; #endif }; #endif // vtkDICOMWriter_h vtk-dicom-0.8.12/Source/vtkNIFTIHeader.cxx000066400000000000000000000465541356440565500202250ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIHeader.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkNIFTIHeader.h" #include "vtkNIFTIPrivate.h" #include "vtkObjectFactory.h" #include "vtkByteSwap.h" #include #include #include #include vtkStandardNewMacro(vtkNIFTIHeader); //---------------------------------------------------------------------------- namespace { // utility function to normalize floats that are close to zero double vtkNIFTINormalizeFloat(double d) { return (fabs(d) < FLT_MIN ? 0.0 : d); } double vtkNIFTINormalizeDouble(double d) { return (fabs(d) < DBL_MIN ? 0.0 : d); } } // end anonymous namespace //---------------------------------------------------------------------------- vtkNIFTIHeader::vtkNIFTIHeader() { this->Initialize(); } //---------------------------------------------------------------------------- vtkNIFTIHeader::~vtkNIFTIHeader() { } //---------------------------------------------------------------------------- void vtkNIFTIHeader::Initialize() { memset(this->Magic, '\0', sizeof(this->Magic)); this->VoxOffset = 0; this->DataType = 0; this->BitPix = 0; for (int i = 0; i < 8; i++) { this->Dim[i] = 0; this->PixDim[i] = 0.0; } this->IntentCode = 0; memset(this->IntentName, '\0', sizeof(this->IntentName)); this->IntentP1 = 0.0; this->IntentP2 = 0.0; this->IntentP3 = 0.0; this->SclSlope = 0.0; this->SclInter = 0.0; this->CalMin = 0.0; this->CalMax = 0.0; this->SliceDuration = 0.0; this->TOffset = 0.0; this->SliceStart = 0; this->SliceEnd = 0; this->SliceCode = 0; this->XYZTUnits = 0; this->DimInfo = 0; memset(this->Descrip, '\0', sizeof(this->Descrip)); memset(this->AuxFile, '\0', sizeof(this->AuxFile)); this->QFormCode = 0; this->SFormCode = 0; this->QuaternB = 0.0; this->QuaternC = 0.0; this->QuaternD = 0.0; this->QOffsetX = 0.0; this->QOffsetY = 0.0; this->QOffsetZ = 0.0; for (int i = 0; i < 4; i++) { this->SRowX[i] = 0.0; this->SRowY[i] = 0.0; this->SRowZ[i] = 0.0; } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr) { // clear all fields (in case supplied header is Analyze 7.5) this->Initialize(); // check if header is NIfTI (vs. Analyze 7.5) bool isnifti = (hdr->magic[0] == 'n' && (hdr->magic[1] == '+' || hdr->magic[1] == 'i') && hdr->magic[2] == '1' && hdr->magic[3] == '\0'); if (isnifti) { memcpy(this->Magic, hdr->magic, sizeof(hdr->magic)); } this->VoxOffset = static_cast(hdr->vox_offset); this->DataType = hdr->datatype; this->BitPix = hdr->bitpix; for (int i = 0; i < 8; i++) { this->Dim[i] = hdr->dim[i]; this->PixDim[i] = hdr->pixdim[i]; } if (isnifti) { this->IntentCode = hdr->intent_code; strncpy(this->IntentName, hdr->intent_name, sizeof(this->IntentName)); this->IntentP1 = hdr->intent_p1; this->IntentP2 = hdr->intent_p2; this->IntentP3 = hdr->intent_p3; this->SclSlope = hdr->scl_slope; this->SclInter = hdr->scl_inter; } this->CalMin = hdr->cal_min; this->CalMax = hdr->cal_max; if (isnifti) { this->SliceDuration = hdr->slice_duration; this->TOffset = hdr->toffset; this->SliceStart = hdr->slice_start; this->SliceEnd = hdr->slice_end; this->SliceCode = hdr->slice_code; } this->XYZTUnits = hdr->xyzt_units; this->DimInfo = hdr->dim_info; strncpy(this->Descrip, hdr->descrip, sizeof(this->Descrip)); strncpy(this->AuxFile, hdr->aux_file, sizeof(this->AuxFile)); if (isnifti) { this->QFormCode = hdr->qform_code; this->SFormCode = hdr->sform_code; this->QuaternB = hdr->quatern_b; this->QuaternC = hdr->quatern_c; this->QuaternD = hdr->quatern_d; this->QOffsetX = hdr->qoffset_x; this->QOffsetY = hdr->qoffset_y; this->QOffsetZ = hdr->qoffset_z; for (int i = 0; i < 4; i++) { this->SRowX[i] = hdr->srow_x[i]; this->SRowY[i] = hdr->srow_y[i]; this->SRowZ[i] = hdr->srow_z[i]; } } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr) { hdr->sizeof_hdr = Nifti1HeaderSize; memcpy(hdr->magic, this->Magic, sizeof(hdr->magic)); memset(hdr->data_type, '\0', 10); memset(hdr->db_name, '\0', 18); hdr->extents = 0; hdr->session_error = 0; hdr->regular = 0; hdr->dim_info = this->DimInfo; hdr->intent_p1 = vtkNIFTINormalizeFloat(this->IntentP1); hdr->intent_p2 = vtkNIFTINormalizeFloat(this->IntentP2); hdr->intent_p3 = vtkNIFTINormalizeFloat(this->IntentP3); hdr->intent_code = static_cast(this->IntentCode); hdr->datatype = static_cast(this->DataType); hdr->bitpix = static_cast(this->BitPix); hdr->slice_start = this->SliceStart; for (int i = 0; i < 8; i++) { hdr->dim[i] = static_cast(this->Dim[i]); hdr->pixdim[i] = vtkNIFTINormalizeFloat(this->PixDim[i]); } hdr->vox_offset = static_cast(this->VoxOffset); strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1); hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0'; hdr->scl_slope = vtkNIFTINormalizeFloat(this->SclSlope); hdr->scl_inter = vtkNIFTINormalizeFloat(this->SclInter); hdr->cal_min = vtkNIFTINormalizeFloat(this->CalMin); hdr->cal_max = vtkNIFTINormalizeFloat(this->CalMax); hdr->slice_duration = vtkNIFTINormalizeFloat(this->SliceDuration); hdr->toffset = vtkNIFTINormalizeFloat(this->TOffset); hdr->glmax = 0; hdr->glmin = 0; hdr->slice_end = this->SliceEnd; hdr->slice_code = this->SliceCode; hdr->xyzt_units = this->XYZTUnits; strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1); hdr->descrip[sizeof(hdr->descrip) - 1] = '\0'; strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1); hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0'; hdr->qform_code = static_cast(this->QFormCode); hdr->sform_code = static_cast(this->SFormCode); hdr->quatern_b = vtkNIFTINormalizeFloat(this->QuaternB); hdr->quatern_c = vtkNIFTINormalizeFloat(this->QuaternC); hdr->quatern_d = vtkNIFTINormalizeFloat(this->QuaternD); hdr->qoffset_x = vtkNIFTINormalizeFloat(this->QOffsetX); hdr->qoffset_y = vtkNIFTINormalizeFloat(this->QOffsetY); hdr->qoffset_z = vtkNIFTINormalizeFloat(this->QOffsetZ); for (int i = 0; i < 4; i++) { hdr->srow_x[i] = vtkNIFTINormalizeFloat(this->SRowX[i]); hdr->srow_y[i] = vtkNIFTINormalizeFloat(this->SRowY[i]); hdr->srow_z[i] = vtkNIFTINormalizeFloat(this->SRowZ[i]); } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetHeader(const nifti_2_header *hdr) { memcpy(this->Magic, hdr->magic, sizeof(hdr->magic)); this->VoxOffset = hdr->vox_offset; this->DataType = hdr->datatype; this->BitPix = hdr->bitpix; for (int i = 0; i < 8; i++) { this->Dim[i] = hdr->dim[i]; this->PixDim[i] = hdr->pixdim[i]; } this->IntentCode = hdr->intent_code; strncpy(this->IntentName, hdr->intent_name, sizeof(this->IntentName)); this->IntentP1 = hdr->intent_p1; this->IntentP2 = hdr->intent_p2; this->IntentP3 = hdr->intent_p3; this->SclSlope = hdr->scl_slope; this->SclInter = hdr->scl_inter; this->CalMin = hdr->cal_min; this->CalMax = hdr->cal_max; this->SliceDuration = hdr->slice_duration; this->TOffset = hdr->toffset; this->SliceStart = hdr->slice_start; this->SliceEnd = hdr->slice_end; this->SliceCode = hdr->slice_code; this->XYZTUnits = hdr->xyzt_units; this->DimInfo = hdr->dim_info; strncpy(this->Descrip, hdr->descrip, sizeof(this->Descrip)); strncpy(this->AuxFile, hdr->aux_file, sizeof(this->AuxFile)); this->QFormCode = hdr->qform_code; this->SFormCode = hdr->sform_code; this->QuaternB = hdr->quatern_b; this->QuaternC = hdr->quatern_c; this->QuaternD = hdr->quatern_d; this->QOffsetX = hdr->qoffset_x; this->QOffsetY = hdr->qoffset_y; this->QOffsetZ = hdr->qoffset_z; for (int i = 0; i < 4; i++) { this->SRowX[i] = hdr->srow_x[i]; this->SRowY[i] = hdr->srow_y[i]; this->SRowZ[i] = hdr->srow_z[i]; } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr) { hdr->sizeof_hdr = Nifti2HeaderSize; memcpy(hdr->magic, this->Magic, sizeof(hdr->magic)); hdr->datatype = static_cast(this->DataType); hdr->bitpix = static_cast(this->BitPix); for (int i = 0; i < 8; i++) { hdr->dim[i] = static_cast(this->Dim[i]); hdr->pixdim[i] = vtkNIFTINormalizeDouble(this->PixDim[i]); } hdr->intent_p1 = vtkNIFTINormalizeDouble(this->IntentP1); hdr->intent_p2 = vtkNIFTINormalizeDouble(this->IntentP2); hdr->intent_p3 = vtkNIFTINormalizeDouble(this->IntentP3); hdr->vox_offset = this->VoxOffset; hdr->scl_slope = vtkNIFTINormalizeDouble(this->SclSlope); hdr->scl_inter = vtkNIFTINormalizeDouble(this->SclInter); hdr->cal_min = vtkNIFTINormalizeDouble(this->CalMin); hdr->cal_max = vtkNIFTINormalizeDouble(this->CalMax); hdr->slice_duration = vtkNIFTINormalizeDouble(this->SliceDuration); hdr->toffset = vtkNIFTINormalizeDouble(this->TOffset); hdr->slice_start = this->SliceStart; hdr->slice_end = this->SliceEnd; strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1); hdr->descrip[sizeof(hdr->descrip) - 1] = '\0'; strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1); hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0'; hdr->qform_code = static_cast(this->QFormCode); hdr->sform_code = static_cast(this->SFormCode); hdr->quatern_b = vtkNIFTINormalizeDouble(this->QuaternB); hdr->quatern_c = vtkNIFTINormalizeDouble(this->QuaternC); hdr->quatern_d = vtkNIFTINormalizeDouble(this->QuaternD); hdr->qoffset_x = vtkNIFTINormalizeDouble(this->QOffsetX); hdr->qoffset_y = vtkNIFTINormalizeDouble(this->QOffsetY); hdr->qoffset_z = vtkNIFTINormalizeDouble(this->QOffsetZ); for (int i = 0; i < 4; i++) { hdr->srow_x[i] = vtkNIFTINormalizeDouble(this->SRowX[i]); hdr->srow_y[i] = vtkNIFTINormalizeDouble(this->SRowY[i]); hdr->srow_z[i] = vtkNIFTINormalizeDouble(this->SRowZ[i]); } hdr->slice_code = this->SliceCode; hdr->xyzt_units = this->XYZTUnits; hdr->intent_code = static_cast(this->IntentCode); strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1); hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0'; hdr->dim_info = static_cast(this->DimInfo); memset(hdr->unused_str, '\0', 15); } //---------------------------------------------------------------------------- void vtkNIFTIHeader::ByteSwapHeader(nifti_1_header *hdr) { // Common to NIFTI and Analyze 7.5 vtkByteSwap::SwapVoidRange(&hdr->sizeof_hdr, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->extents, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->session_error, 1, 2); vtkByteSwap::SwapVoidRange(hdr->dim, 8, 2); vtkByteSwap::SwapVoidRange(&hdr->intent_p1, 1, 4); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->intent_p2, 1, 4); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->intent_p3, 1, 4); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->intent_code, 1, 2); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->datatype, 1, 2); vtkByteSwap::SwapVoidRange(&hdr->bitpix, 1, 2); vtkByteSwap::SwapVoidRange(&hdr->slice_start, 1, 2); // dim_un0 in 7.5 vtkByteSwap::SwapVoidRange(hdr->pixdim, 8, 4); vtkByteSwap::SwapVoidRange(&hdr->vox_offset, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->scl_slope, 1, 4); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->scl_inter, 1, 4); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->slice_end, 1, 2); // unused in 7.5 vtkByteSwap::SwapVoidRange(&hdr->cal_max, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->cal_min, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->slice_duration,1, 4); // compressed in 7.5 vtkByteSwap::SwapVoidRange(&hdr->toffset, 1, 4); // verified in 7.5 vtkByteSwap::SwapVoidRange(&hdr->glmax, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->glmin, 1, 4); // All NIFTI-specific (meaning is totally different in Analyze 7.5) if (strncmp(hdr->magic, "ni1", 4) == 0 || strncmp(hdr->magic, "n+1", 4) == 0) { vtkByteSwap::SwapVoidRange(&hdr->qform_code, 1, 2); vtkByteSwap::SwapVoidRange(&hdr->sform_code, 1, 2); vtkByteSwap::SwapVoidRange(&hdr->quatern_b, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->quatern_c, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->quatern_d, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->qoffset_x, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->qoffset_y, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->qoffset_z, 1, 4); vtkByteSwap::SwapVoidRange(hdr->srow_x, 4, 4); vtkByteSwap::SwapVoidRange(hdr->srow_y, 4, 4); vtkByteSwap::SwapVoidRange(hdr->srow_z, 4, 4); } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::ByteSwapHeader(nifti_2_header *hdr) { vtkByteSwap::SwapVoidRange(&hdr->sizeof_hdr, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->datatype, 1, 2); vtkByteSwap::SwapVoidRange(&hdr->bitpix, 1, 2); vtkByteSwap::SwapVoidRange(hdr->dim, 8, 8); vtkByteSwap::SwapVoidRange(&hdr->intent_p1, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->intent_p2, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->intent_p3, 1, 8); vtkByteSwap::SwapVoidRange(hdr->pixdim, 8, 8); vtkByteSwap::SwapVoidRange(&hdr->vox_offset, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->scl_slope, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->scl_inter, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->cal_max, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->cal_min, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->slice_duration,1, 8); vtkByteSwap::SwapVoidRange(&hdr->toffset, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->slice_start, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->slice_end, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->qform_code, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->sform_code, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->quatern_b, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->quatern_c, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->quatern_d, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->qoffset_x, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->qoffset_y, 1, 8); vtkByteSwap::SwapVoidRange(&hdr->qoffset_z, 1, 8); vtkByteSwap::SwapVoidRange(hdr->srow_x, 4, 8); vtkByteSwap::SwapVoidRange(hdr->srow_y, 4, 8); vtkByteSwap::SwapVoidRange(hdr->srow_z, 4, 8); vtkByteSwap::SwapVoidRange(&hdr->slice_code, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->xyzt_units, 1, 4); vtkByteSwap::SwapVoidRange(&hdr->intent_code, 1, 4); } //---------------------------------------------------------------------------- void vtkNIFTIHeader::DeepCopy(vtkNIFTIHeader *o) { if (o) { nifti_2_header hdr; o->GetHeader(&hdr); this->SetHeader(&hdr); } else { this->Initialize(); } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os.setf(std::ios::hex, std::ios::basefield); os << indent << "DimInfo: 0x" << this->DimInfo << "\n"; os.unsetf(std::ios::hex); os << indent << "Dim:"; for (int i = 0; i < 8; i++) { os << " " << this->Dim[i]; } os << indent << "\n"; os << indent << "PixDim:"; for (int i = 0; i < 8; i++) { os << " " << this->PixDim[i]; } os << indent << "\n"; os << indent << "VoxOffset:" << this->VoxOffset << "\n"; os << indent << "IntentP1: " << this->IntentP1 << "\n"; os << indent << "IntentP2: " << this->IntentP2 << "\n"; os << indent << "IntentP3: " << this->IntentP3 << "\n"; os << indent << "IntentCode: " << this->IntentCode << "\n"; os << indent << "DataType: " << this->DataType << "\n"; os << indent << "BitPix: " << this->BitPix << "\n"; os << indent << "SliceStart: " << this->SliceStart << "\n"; os << indent << "SclSlope: " << this->SclSlope << "\n"; os << indent << "SclInter: " << this->SclInter << "\n"; os << indent << "SliceEnd: " << this->SliceEnd << "\n"; os << indent << "SliceCode: " << static_cast(this->SliceCode) << "\n"; os.setf(std::ios::hex, std::ios::basefield); os << indent << "XYZTUnits: 0x" << static_cast(this->XYZTUnits) << "\n"; os.unsetf(std::ios::hex); os << indent << "CalMax: " << this->CalMax << "\n"; os << indent << "CalMin: " << this->CalMin << "\n"; os << indent << "SliceDuration: " << this->SliceDuration << "\n"; os << indent << "TOffset: " << this->TOffset << "\n"; os << indent << "Descrip: \""; for (size_t j = 0; j < 80 && this->Descrip[j] != '\0'; j++) { os << (isprint(this->Descrip[j]) ? this->Descrip[j] : '?'); } os << "\"\n"; os << indent << "AuxFile: \""; for (size_t j = 0; j < 24 && this->AuxFile[j] != '\0'; j++) { os << (isprint(this->AuxFile[j]) ? this->AuxFile[j] : '?'); } os << "\"\n"; os << indent << "QFormCode: " << this->QFormCode << "\n"; os << indent << "SFormCode: " << this->SFormCode << "\n"; os << indent << "QuaternB: " << this->QuaternB << "\n"; os << indent << "QuaternC: " << this->QuaternC << "\n"; os << indent << "QuaternD: " << this->QuaternD << "\n"; os << indent << "QOffsetX: " << this->QOffsetX << "\n"; os << indent << "QOffsetY: " << this->QOffsetY << "\n"; os << indent << "QOffsetZ: " << this->QOffsetZ << "\n"; os << indent << "SRowX:"; for (int i = 0; i < 4; i++) { os << " " << this->SRowX[i]; } os << "\n"; os << indent << "SRowY:"; for (int i = 0; i < 4; i++) { os << " " << this->SRowY[i]; } os << "\n"; os << indent << "SRowZ:"; for (int i = 0; i < 4; i++) { os << " " << this->SRowZ[i]; } os << "\n"; os << indent << "IntentName: \""; for (size_t j = 0; j < 16 && this->IntentName[j] != '\0'; j++) { os << (isprint(this->IntentName[j]) ? this->IntentName[j] : '?'); } os << "\"\n"; os << indent << "Magic: \""; for (size_t j = 0; j < 4 && this->Magic[j] != '\0'; j++) { os << (isprint(this->Magic[j]) ? this->Magic[j] : '?'); } os << "\"\n"; } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetStringValue(char *x, const char *y, size_t n) { if (y == 0) { y = ""; } if (strncmp(x, y, n) != 0) { strncpy(x, y, n); x[n] = '\0'; this->Modified(); } } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetIntentName(const char *val) { this->SetStringValue(this->IntentName, val, 16); } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetDescrip(const char *val) { this->SetStringValue(this->Descrip, val, 80); } //---------------------------------------------------------------------------- void vtkNIFTIHeader::SetAuxFile(const char *val) { this->SetStringValue(this->AuxFile, val, 24); } vtk-dicom-0.8.12/Source/vtkNIFTIHeader.h000066400000000000000000000266131356440565500176440ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIHeader.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkNIFTIHeader * \brief Store NIfTI header information. * * This class stores the header of a NIfTI file in a VTK-friendly format. * By using this class, it is possible to specify the header information * that will be stored in a file written by the vtkNIFTIWriter. Note * that the SForm and QForm orientation information in this class will be * ignored by the writer if an SForm and QForm have been explicitly set * via the writer's SetSForm and SetQForm methods. Also note that all * info like Dim, PixDim, DataType, etc. will be ignored by the writer * because this information must instead be taken from the vtkImageData * information. Finally, note that the vtkNIFTIWriter will ignore the * Descrip field, since it has its own SetDescription method. * * This class was contributed to VTK by the Calgary Image Processing and * Analysis Centre (CIPAC). * * \sa vtkNIFTIReader, vtkNIFTIWriter */ #ifndef vtkNIFTIHeader_h #define vtkNIFTIHeader_h #include "vtkObject.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details struct nifti_1_header; struct nifti_2_header; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkNIFTIHeader : public vtkObject { public: //! NIFTI intent codes. enum IntentCodeEnum { IntentNone = 0, IntentCorrel = 2, IntentTTest = 3, IntentFTest = 4, IntentZScore = 5, IntentChiSQ = 6, IntentBeta = 7, IntentBinom = 8, IntentGamma = 9, IntentPoisson = 10, IntentNormal = 11, IntentFTestNonc = 12, IntentChiSQNonc = 13, IntentLogistic = 14, IntentLaplace = 15, IntentUniform = 16, IntentTTestNonc = 17, IntentWeibull = 18, IntentChi = 19, IntentInvGauss = 20, IntentExtVal = 21, IntentPVal = 22, IntentLogPVal = 23, IntentLog10PVal = 24, IntentEstimate = 1001, IntentLabel = 1002, IntentNeuroName = 1003, IntentGenMatrix = 1004, IntentSymMatrix = 1005, IntentDispVect = 1006, IntentVector = 1007, IntentPointSet = 1008, IntentTriangle = 1009, IntentQuaternion = 1010, IntentDimless = 1011, IntentTimeSeries = 2001, IntentNodeIndex = 2002, IntentRGBVector = 2003, IntentRGBAVector = 2004, IntentShape = 2005 }; //! NIFTI transform codes. enum XFormCodeEnum { XFormUnkown = 0, XFormScannerAnat = 1, XFormAlignedAnat = 2, XFormTalairach = 3, XFormMNI152 = 4 }; //! NIFTI slice codes. enum SliceCodeEnum { SliceUnknown = 0, SliceSeqInc = 1, SliceSeqDec = 2, SliceAltInc = 3, SliceAltDec = 4, SliceAltInc2 = 5, SliceAltDec2 = 6 }; //! NIFTI unit codes. enum UnitsXYZTEnum { UnitsUnknown = 0, UnitsMeter = 1, UnitsMM = 2, UnitsMicron = 3, UnitsSpace = 7, UnitsSec = 8, UnitsMSec = 16, UnitsUSec = 24, UnitsHz = 32, UnitsPPM = 40, UnitsRads = 48, UnitsTime = 56 }; //! NIFTI data types. /*! * Types RGB24 and RGB32 are represented in VTK as a multi-component * unsigned char image. Complex values are represented as two-component * images. The NIFTI types Float128 and Complex256 are not supported. */ enum DataTypeEnum { TypeUInt8 = 2, TypeInt16 = 4, TypeInt32 = 8, TypeFloat32 = 16, TypeComplex64 = 32, TypeFloat64 = 64, TypeRGB24 = 128, TypeInt8 = 256, TypeUInt16 = 512, TypeUInt32 = 768, TypeInt64 = 1024, TypeUInt64 = 1280, TypeFloat128 = 1536, TypeComplex128 = 1792, TypeComplex256 = 2048, TypeRGBA32 = 2304 }; //! NIFTI header sizes. enum HeaderSizeEnum { Nifti1HeaderSize = 348, Nifti2HeaderSize = 540 }; //! Static method for construction. static vtkNIFTIHeader *New(); vtkTypeMacro(vtkNIFTIHeader, vtkObject); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Get the magic number for the NIFTI file as a null-terminated string. const char *GetMagic() { return this->Magic; } //! Get the offset to the pixel data within the file. vtkTypeInt64 GetVoxOffset() { return this->VoxOffset; } //! Get the data type. int GetDataType() { return this->DataType; } //! Get the number of bits per pixel. int GetBitPix() { return this->BitPix; } //@} //@{ //! Get the nth dimension of the data, where 1 is first dimension. /*! * GetDim(0) returns the number of dimensions that are defined for the file. */ vtkTypeInt64 GetDim(int i) { return (i < 0 || i > 7 ? 0 : this->Dim[i]); } //! Get the sample spacing in the nth dimension, 1 is first dimension. /*! * If GetPixDim(0) is negative, then the quaternion for the qform describes * the correct orientation only after the slice ordering has been reversed. */ double GetPixDim(int i) { return (i < 0 || i > 7 ? 0.0 : this->PixDim[i]); } //@} //@{ //! Get the NIFTI intent code. /*! * This is an enumerated value in the NIFTI header that states what the * data is intended to be used for. */ vtkSetMacro(IntentCode, int); int GetIntentCode() { return this->IntentCode; } //@} //@{ //! Get the intent name. This should match the intent code. void SetIntentName(const char *name); const char *GetIntentName() { return this->IntentName; } //@} //@{ //! Get one of the NIFTI intent parameters. /*! * The definition of these parameters varies according to the IntentCode. */ vtkSetMacro(IntentP1, double); double GetIntentP1() { return this->IntentP1; } vtkSetMacro(IntentP2, double); double GetIntentP2() { return this->IntentP2; } vtkSetMacro(IntentP3, double); double GetIntentP3() { return this->IntentP3; } //@} //@{ //! Get the scale and slope to apply to get real-valued data. vtkSetMacro(SclSlope, double); double GetSclSlope() { return this->SclSlope; } vtkSetMacro(SclInter, double); double GetSclInter() { return this->SclInter; } //@} //@{ //! Get the calibrated range (cal_min, cal_max) of the data. vtkSetMacro(CalMin, double); double GetCalMin() { return this->CalMin; } vtkSetMacro(CalMax, double); double GetCalMax() { return this->CalMax; } //@} //@{ //! Get the slice_duration and toffset from the header. vtkSetMacro(SliceDuration, double); double GetSliceDuration() { return this->SliceDuration; } vtkSetMacro(TOffset, double); double GetTOffset() { return this->TOffset; } //@} //@{ //! Get the slice range for the data. vtkSetMacro(SliceStart, vtkTypeInt64); vtkTypeInt64 GetSliceStart() { return this->SliceStart; } vtkSetMacro(SliceEnd, vtkTypeInt64); vtkTypeInt64 GetSliceEnd() { return this->SliceEnd; } //@} //@{ //! Get the slice code for the data. vtkSetMacro(SliceCode, int); int GetSliceCode() { return this->SliceCode; } //@} //@{ //! Get a bitfield that describes the units for the first 4 dims. vtkSetMacro(XYZTUnits, int); int GetXYZTUnits() { return this->XYZTUnits; } //@} //@{ //! Get a bitfield with extra information about the dimensions, it /*! * states which dimensions are the phase encode, frequency encode, * and slice encode dimensions for MRI acquisitions. */ vtkSetMacro(DimInfo, int); int GetDimInfo() { return this->DimInfo; } //@} //@{ //! Get a null-terminated file descriptor, this usually gives the /*! * name of the software that wrote the file. It will have a maximum * length of 80 characters. */ void SetDescrip(const char *descrip); const char *GetDescrip() { return this->Descrip; } //@} //@{ //! Get an auxiliary file, e.g. a color table, that is associated /*! * with this data. The length of the filename must be a maximum of * 24 characters, and it will be assumed to be in the same directory * as the NIFTI file. */ void SetAuxFile(const char *auxfile); const char *GetAuxFile() { return this->AuxFile; } //@} //@{ //! Get the QForm or SForm code. vtkSetMacro(QFormCode, int); int GetQFormCode() { return this->QFormCode; } vtkSetMacro(SFormCode, int); int GetSFormCode() { return this->SFormCode; } //@} //@{ //! Get information about the quaternion transformation. Note that /*! * Note that the vtkNIFTIWriter ignores this part of the header if a * quaternion has been set via vtkNIFTIWriter::SetQFormMatrix(). */ vtkSetMacro(QuaternB, double); double GetQuaternB() { return this->QuaternB; } vtkSetMacro(QuaternC, double); double GetQuaternC() { return this->QuaternC; } vtkSetMacro(QuaternD, double); double GetQuaternD() { return this->QuaternD; } vtkSetMacro(QOffsetX, double); double GetQOffsetX() { return this->QOffsetX; } vtkSetMacro(QOffsetY, double); double GetQOffsetY() { return this->QOffsetY; } vtkSetMacro(QOffsetZ, double); double GetQOffsetZ() { return this->QOffsetZ; } //@} //@{ //! Get information about the matrix transformation. /*! * Note that the vtkNIFTIWriter ignores this part of the header if a * matrix has been set via vtkNIFTIWriter::SetSFormMatrix(). */ vtkSetVector4Macro(SRowX, double); vtkGetVector4Macro(SRowX, double); vtkSetVector4Macro(SRowY, double); vtkGetVector4Macro(SRowY, double); vtkSetVector4Macro(SRowZ, double); vtkGetVector4Macro(SRowZ, double); //@} //@{ //! Initialize the header to default values. void Initialize(); //@} //@{ //! Make a copy of the header. void DeepCopy(vtkNIFTIHeader *o); //@} //@{ //! Set the values from an existing nifti struct, or vice-versa. void SetHeader(const nifti_1_header *hdr); void GetHeader(nifti_1_header *hdr); void SetHeader(const nifti_2_header *hdr); void GetHeader(nifti_2_header *hdr); //@} //@{ //! Byte-swap the nifti header struct. static void ByteSwapHeader(nifti_1_header *hdr); static void ByteSwapHeader(nifti_2_header *hdr); //@} protected: vtkNIFTIHeader(); ~vtkNIFTIHeader(); char Magic[12]; vtkTypeInt64 VoxOffset; int DataType; int BitPix; vtkTypeInt64 Dim[8]; double PixDim[8]; int IntentCode; char IntentName[18]; double IntentP1; double IntentP2; double IntentP3; double SclSlope; double SclInter; double CalMin; double CalMax; double SliceDuration; double TOffset; vtkTypeInt64 SliceStart; vtkTypeInt64 SliceEnd; int SliceCode; int XYZTUnits; int DimInfo; char Descrip[82]; char AuxFile[26]; int QFormCode; int SFormCode; double QuaternB; double QuaternC; double QuaternD; double QOffsetX; double QOffsetY; double QOffsetZ; double SRowX[4]; double SRowY[4]; double SRowZ[4]; void SetStringValue(char *x, const char *y, size_t n); private: #ifdef VTK_DICOM_DELETE vtkNIFTIHeader(const vtkNIFTIHeader&) VTK_DICOM_DELETE; void operator=(const vtkNIFTIHeader&) VTK_DICOM_DELETE; #else vtkNIFTIHeader(const vtkNIFTIHeader&) = delete; void operator=(const vtkNIFTIHeader&) = delete; #endif }; #endif // vtkNIFTIHeader_h vtk-dicom-0.8.12/Source/vtkNIFTIPrivate.h000066400000000000000000000325251356440565500200650ustar00rootroot00000000000000#ifndef _NIFTI_HEADER_ #define _NIFTI_HEADER_ /***************************************************************************** ** This file defines the "NIFTI-1" header format. ** ** It is derived from 2 meetings at the NIH (31 Mar 2003 and ** ** 02 Sep 2003) of the Data Format Working Group (DFWG), ** ** chartered by the NIfTI (Neuroimaging Informatics Technology ** ** Initiative) at the National Institutes of Health (NIH). ** **--------------------------------------------------------------** ** Neither the National Institutes of Health (NIH), the DFWG, ** ** nor any of the members or employees of these institutions ** ** imply any warranty of usefulness of this material for any ** ** purpose, and do not assume any liability for damages, ** ** incidental or otherwise, caused by any use of this document. ** ** If these conditions are not acceptable, do not use this! ** **--------------------------------------------------------------** ** Author: Robert W Cox (NIMH, Bethesda) ** ** Advisors: John Ashburner (FIL, London), ** ** Stephen Smith (FMRIB, Oxford), ** ** Mark Jenkinson (FMRIB, Oxford) ** ******************************************************************************/ /*=================*/ #ifdef __cplusplus extern "C" { #endif /*=================*/ /*! \struct nifti_1_header \brief Data structure defining the fields in the nifti1 header. This binary header should be found at the beginning of a valid NIFTI-1 header file. */ /*************************/ /************/ struct nifti_1_header { /* NIFTI-1 usage */ /* offset */ /*************************/ /************/ int sizeof_hdr; /*!< MUST be 348 */ /* 0 */ char data_type[10]; /*!< ++UNUSED++ */ /* 4 */ char db_name[18]; /*!< ++UNUSED++ */ /* 14 */ int extents; /*!< ++UNUSED++ */ /* 32 */ short session_error; /*!< ++UNUSED++ */ /* 36 */ char regular; /*!< ++UNUSED++ */ /* 38 */ char dim_info; /*!< MRI slice ordering. */ /* 39 */ short dim[8]; /*!< Data array dimensions.*/ /* 40 */ float intent_p1; /*!< 1st intent parameter. */ /* 56 */ float intent_p2; /*!< 2nd intent parameter. */ /* 60 */ float intent_p3; /*!< 3rd intent parameter. */ /* 64 */ short intent_code; /*!< NIFTI_INTENT_* code. */ /* 68 */ short datatype; /*!< Defines data type! */ /* 70 */ short bitpix; /*!< Number bits/voxel. */ /* 72 */ short slice_start; /*!< First slice index. */ /* 74 */ float pixdim[8]; /*!< Grid spacings. */ /* 76 */ float vox_offset; /*!< Offset into .nii file */ /* 108 */ float scl_slope; /*!< Data scaling: slope. */ /* 112 */ float scl_inter; /*!< Data scaling: offset. */ /* 116 */ short slice_end; /*!< Last slice index. */ /* 120 */ char slice_code; /*!< Slice timing order. */ /* 122 */ char xyzt_units; /*!< Units of pixdim[1..4] */ /* 123 */ float cal_max; /*!< Max display intensity */ /* 124 */ float cal_min; /*!< Min display intensity */ /* 128 */ float slice_duration;/*!< Time for 1 slice. */ /* 132 */ float toffset; /*!< Time axis shift. */ /* 136 */ int glmax; /*!< ++UNUSED++ */ /* 140 */ int glmin; /*!< ++UNUSED++ */ /* 144 */ char descrip[80]; /*!< any text you like. */ /* 148 */ char aux_file[24]; /*!< auxiliary filename. */ /* 228 */ short qform_code; /*!< NIFTI_XFORM_* code. */ /* 252 */ short sform_code; /*!< NIFTI_XFORM_* code. */ /* 254 */ float quatern_b; /*!< Quaternion b param. */ /* 256 */ float quatern_c; /*!< Quaternion c param. */ /* 260 */ float quatern_d; /*!< Quaternion d param. */ /* 264 */ float qoffset_x; /*!< Quaternion x shift. */ /* 268 */ float qoffset_y; /*!< Quaternion y shift. */ /* 272 */ float qoffset_z; /*!< Quaternion z shift. */ /* 276 */ float srow_x[4]; /*!< 1st row affine transform. */ /* 280 */ float srow_y[4]; /*!< 2nd row affine transform. */ /* 296 */ float srow_z[4]; /*!< 3rd row affine transform. */ /* 312 */ char intent_name[16];/*!< 'name' or meaning of data. */ /* 328 */ char magic[4]; /*!< MUST be "ni1\0" or "n+1\0". */ /* 344 */ }; /**** 348 bytes total ****/ typedef struct nifti_1_header nifti_1_header; /*---------------------------------------------------------------------------*/ /* TYPE OF DATA (acceptable values for datatype field): --------------------------------------------------- Values of datatype smaller than 256 are ANALYZE 7.5 compatible. Larger values are NIFTI-1 additions. These are all multiples of 256, so that no bits below position 8 are set in datatype. But there is no need to use only powers-of-2, as the original ANALYZE 7.5 datatype codes do. The additional codes are intended to include a complete list of basic scalar types, including signed and unsigned integers from 8 to 64 bits, floats from 32 to 128 bits, and complex (float pairs) from 64 to 256 bits. Note that most programs will support only a few of these datatypes! A NIFTI-1 program should fail gracefully (e.g., print a warning message) when it encounters a dataset with a type it doesn't like. -----------------------------------------------------------------------------*/ /*! \defgroup NIFTI1_DATATYPE_ALIASES \brief aliases for the nifti1 datatype codes @{ */ /*! unsigned char. */ #define NIFTI_TYPE_UINT8 2 /*! signed short. */ #define NIFTI_TYPE_INT16 4 /*! signed int. */ #define NIFTI_TYPE_INT32 8 /*! 32 bit float. */ #define NIFTI_TYPE_FLOAT32 16 /*! 64 bit complex = 2 32 bit floats. */ #define NIFTI_TYPE_COMPLEX64 32 /*! 64 bit float = double. */ #define NIFTI_TYPE_FLOAT64 64 /*! 3 8 bit bytes. */ #define NIFTI_TYPE_RGB24 128 /*! signed char. */ #define NIFTI_TYPE_INT8 256 /*! unsigned short. */ #define NIFTI_TYPE_UINT16 512 /*! unsigned int. */ #define NIFTI_TYPE_UINT32 768 /*! signed long long. */ #define NIFTI_TYPE_INT64 1024 /*! unsigned long long. */ #define NIFTI_TYPE_UINT64 1280 /*! 128 bit float = long double. */ #define NIFTI_TYPE_FLOAT128 1536 /*! 128 bit complex = 2 64 bit floats. */ #define NIFTI_TYPE_COMPLEX128 1792 /*! 256 bit complex = 2 128 bit floats */ #define NIFTI_TYPE_COMPLEX256 2048 /*! 4 8 bit bytes. */ #define NIFTI_TYPE_RGBA32 2304 /* @} */ /*---------------------------------------------------------------------------*/ /* MISCELLANEOUS C MACROS -----------------------------------------------------------------------------*/ /*.................*/ /*! Given a nifti_1_header struct, check if it has a good magic number. Returns NIFTI version number (1..9) if magic is good, 0 if it is not. */ #define NIFTI_VERSION(h) \ ( ( (h).magic[0]=='n' && (h).magic[3]=='\0' && \ ( (h).magic[1]=='i' || (h).magic[1]=='+' ) && \ ( (h).magic[2]>='1' && (h).magic[2]<='9' ) ) \ ? (h).magic[2]-'0' : 0 ) /*.................*/ /*! Check if a nifti_1_header struct says if the data is stored in the same file or in a separate file. Returns 1 if the data is in the same file as the header, 0 if it is not. */ #define NIFTI_ONEFILE(h) ( (h).magic[1] == '+' ) /*.................*/ /*! Check if a nifti_1_header struct needs to be byte swapped. Returns 1 if it needs to be swapped, 0 if it does not. */ #define NIFTI_NEEDS_SWAP(h) ( (h).dim[0] < 0 || (h).dim[0] > 7 ) /*=================*/ #ifdef __cplusplus } #endif /*=================*/ #endif /* _NIFTI_HEADER_ */ #ifndef __NIFTI2_HEADER #define __NIFTI2_HEADER /*---------------------------------------------------------------------------*/ /* Changes to the header from NIFTI-1 to NIFTI-2 are intended to allow for larger and more accurate fields. The changes are as follows: - short dim[8] -> int64_t dim[8] - float intent_p1,2,3 -> double intent_p1,2,3 (3 fields) - float pixdim[8] -> double pixdim[8] - float vox_offset -> int64_t vox_offset - float scl_slope -> double scl_slope - float scl_inter -> double scl_inter - float cal_max -> double cal_max - float cal_min -> double cal_min - float slice_duration -> double slice_duration - float toffset -> double toffset - short slice_start -> int64_t slice_start - short slice_end -> int64_t slice_end - char slice_code -> int32_t slice_code - char xyzt_units -> int32_t xyzt_units - short intent_code -> int32_t intent_code - short qform_code -> int32_t qform_code - short sform_code -> int32_t sform_code - float quatern_b,c,d -> double quatern_b,c,d (3 fields) - float srow_x,y,z[4] -> double srow_x,y,z[4] (3 fields) - char magic[4] -> char magic[8] - char unused_str[15] -> padding added at the end of the header - previously unused fields have been removed: data_type, db_name, extents, session_error, regular, glmax, glmin - the field ordering has been changed -----------------------------------------------------------------------------*/ /*=================*/ #ifdef __cplusplus extern "C" { #endif /*=================*/ /*! \struct nifti_2_header \brief Data structure defining the fields in the nifti2 header. This binary header should be found at the beginning of a valid NIFTI-2 header file. */ /*************************/ /************/ struct nifti_2_header { /* NIFTI-2 usage */ /* offset */ /*************************/ /************/ int sizeof_hdr; /*!< MUST be 540 */ /* 0 */ char magic[8]; /*!< MUST be valid signature. */ /* 4 */ short datatype; /*!< Defines data type! */ /* 12 */ short bitpix; /*!< Number bits/voxel. */ /* 14 */ long long dim[8]; /*!< Data array dimensions.*/ /* 16 */ double intent_p1; /*!< 1st intent parameter. */ /* 80 */ double intent_p2; /*!< 2nd intent parameter. */ /* 88 */ double intent_p3; /*!< 3rd intent parameter. */ /* 96 */ double pixdim[8]; /*!< Grid spacings. */ /* 104 */ long long vox_offset; /*!< Offset into .nii file */ /* 168 */ double scl_slope; /*!< Data scaling: slope. */ /* 176 */ double scl_inter; /*!< Data scaling: offset. */ /* 184 */ double cal_max; /*!< Max display intensity */ /* 192 */ double cal_min; /*!< Min display intensity */ /* 200 */ double slice_duration;/*!< Time for 1 slice. */ /* 208 */ double toffset; /*!< Time axis shift. */ /* 216 */ long long slice_start;/*!< First slice index. */ /* 224 */ long long slice_end; /*!< Last slice index. */ /* 232 */ char descrip[80]; /*!< any text you like. */ /* 240 */ char aux_file[24]; /*!< auxiliary filename. */ /* 320 */ int qform_code; /*!< NIFTI_XFORM_* code. */ /* 344 */ int sform_code; /*!< NIFTI_XFORM_* code. */ /* 348 */ double quatern_b; /*!< Quaternion b param. */ /* 352 */ double quatern_c; /*!< Quaternion c param. */ /* 360 */ double quatern_d; /*!< Quaternion d param. */ /* 368 */ double qoffset_x; /*!< Quaternion x shift. */ /* 376 */ double qoffset_y; /*!< Quaternion y shift. */ /* 384 */ double qoffset_z; /*!< Quaternion z shift. */ /* 392 */ double srow_x[4]; /*!< 1st row affine transform. */ /* 400 */ double srow_y[4]; /*!< 2nd row affine transform. */ /* 432 */ double srow_z[4]; /*!< 3rd row affine transform. */ /* 464 */ int slice_code; /*!< Slice timing order. */ /* 496 */ int xyzt_units; /*!< Units of pixdim[1..4] */ /* 500 */ int intent_code; /*!< NIFTI_INTENT_* code. */ /* 504 */ char intent_name[16]; /*!< 'name' or meaning of data. */ /* 508 */ char dim_info; /*!< MRI slice ordering. */ /* 524 */ char unused_str[15]; /*!< unused, filled with \0 */ /* 525 */ }; /**** 540 bytes total ****/ typedef struct nifti_2_header nifti_2_header; /*=================*/ #ifdef __cplusplus } #endif /*=================*/ #endif /* __NIFTI2_HEADER */ // VTK-HeaderTest-Exclude: vtkNIFTIPrivate.h vtk-dicom-0.8.12/Source/vtkNIFTIReader.cxx000066400000000000000000001114141356440565500202230ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIReader.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkNIFTIReader.h" #include "vtkObjectFactory.h" #include "vtkImageData.h" #include "vtkPointData.h" #include "vtkDataArray.h" #include "vtkByteSwap.h" #include "vtkMatrix4x4.h" #include "vtkMath.h" #include "vtkCommand.h" #include "vtkErrorCode.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkStringArray.h" #include "vtkVersion.h" #ifdef _WIN32 // To allow use of wchar_t paths on Windows #include "vtkDICOMFilePath.h" #endif #include "vtkDICOMFile.h" // Header for NIFTI #include "vtkNIFTIHeader.h" #include "vtkNIFTIPrivate.h" #include "vtkDICOMConfig.h" // Header for zlib #ifdef DICOM_USE_VTKZLIB #include "vtk_zlib.h" #else #include "zlib.h" #endif #include #include #include #ifdef _WIN32 // To allow use of wchar_t paths on Windows #include "vtkDICOMFilePath.h" #if VTK_MAJOR_VERSION >= 7 #ifdef gzopen #undef gzopen #endif #define gzopen gzopen_w #endif #endif vtkStandardNewMacro(vtkNIFTIReader); //---------------------------------------------------------------------------- vtkNIFTIReader::vtkNIFTIReader() { for (int i = 0; i < 8; i++) { this->Dim[i] = 0; } for (int i = 0; i < 8; i++) { this->PixDim[i] = 1.0; } this->TimeAsVector = 0; this->RescaleSlope = 1.0; this->RescaleIntercept = 0.0; this->QFac = 1.0; this->QFormMatrix = 0; this->SFormMatrix = 0; this->NIFTIHeader = 0; this->PlanarRGB = false; } //---------------------------------------------------------------------------- vtkNIFTIReader::~vtkNIFTIReader() { if (this->QFormMatrix) { this->QFormMatrix->Delete(); } if (this->SFormMatrix) { this->SFormMatrix->Delete(); } if (this->NIFTIHeader) { this->NIFTIHeader->Delete(); } } //---------------------------------------------------------------------------- vtkNIFTIHeader *vtkNIFTIReader::GetNIFTIHeader() { if (!this->NIFTIHeader) { this->NIFTIHeader = vtkNIFTIHeader::New(); } return this->NIFTIHeader; } //---------------------------------------------------------------------------- void vtkNIFTIReader::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "TimeAsVector: " << (this->TimeAsVector ? "On\n" : "Off\n"); os << indent << "TimeDimension: " << this->GetTimeDimension() << "\n"; os << indent << "TimeSpacing: " << this->GetTimeSpacing() << "\n"; os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "QFac: " << this->QFac << "\n"; os << indent << "QFormMatrix:"; if (this->QFormMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "SFormMatrix:"; if (this->SFormMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n"); os << indent << "PlanarRGB: " << (this->PlanarRGB ? "On\n" : "Off\n"); } //---------------------------------------------------------------------------- bool vtkNIFTIReader::CheckExtension( const char *filename, const char *ext) { if (strlen(ext) == 4 && ext[0] == '.') { size_t n = strlen(filename); if (n > 2 && filename[n-3] == '.' && tolower(filename[n-2]) == 'g' && tolower(filename[n-1]) == 'z') { n -= 3; } if (n > 3 && filename[n-4] == '.' && tolower(filename[n-3]) == tolower(ext[1]) && tolower(filename[n-2]) == tolower(ext[2]) && tolower(filename[n-1]) == tolower(ext[3])) { return true; } } return false; } //---------------------------------------------------------------------------- char *vtkNIFTIReader::ReplaceExtension( const char *filename, const char *ext1, const char *ext2) { char *newname = 0; if (strlen(ext1) == 4 && ext1[0] == '.' && strlen(ext2) == 4 && ext2[0] == '.') { size_t n = strlen(filename); size_t m = n; newname = new char[n+4]; strcpy(newname, filename); // check for trailing .gz if (n > 2 && filename[n-3] == '.' && tolower(filename[n-2]) == 'g' && tolower(filename[n-1]) == 'z') { m = n - 3; } if (vtkNIFTIReader::CheckExtension(filename, ext1)) { // replace the extension if (isupper(filename[m-3])) { newname[m-3] = toupper(ext2[1]); newname[m-2] = toupper(ext2[2]); newname[m-1] = toupper(ext2[3]); } else { newname[m-3] = tolower(ext2[1]); newname[m-2] = tolower(ext2[2]); newname[m-1] = tolower(ext2[3]); } } // existence of file for (int i = 0; i < 2; i++) { int code = vtkDICOMFile::Access(newname, vtkDICOMFile::In); if (code != vtkDICOMFile::FileNotFound) { return newname; } if (i == 0) { if (m < n) { // try again without the ".gz" newname[m] = '\0'; n = m; } else { // try again with the ".gz" newname[m] = '.'; newname[m+1] = (isupper(newname[m-3]) ? 'G' : 'g'); newname[m+2] = (isupper(newname[m-3]) ? 'Z' : 'z'); newname[m+3] = '\0'; } } } delete [] newname; newname = 0; } return newname; } //---------------------------------------------------------------------------- int vtkNIFTIReader::CheckNIFTIVersion(const nifti_1_header *hdr) { int version = 0; // Check for NIFTIv2. The NIFTIv2 magic number is stored where // the data_type appears in the NIFTIv1 header. if (hdr->data_type[0] == 'n' && (hdr->data_type[1] == '+' || hdr->data_type[1] == 'i') && (hdr->data_type[2] >= '2' && hdr->data_type[2] <= '9') && hdr->data_type[3] == '\0') { version = (hdr->data_type[2] - '0'); if (hdr->data_type[4] != '\r' || hdr->data_type[5] != '\n' || hdr->data_type[6] != '\032' || hdr->data_type[7] != '\n') { // Indicate that file was corrupted by newline conversion version = -version; } } // Check for NIFTIv1 else if (hdr->magic[0] == 'n' && (hdr->magic[1] == '+' || hdr->magic[1] == 'i') && hdr->magic[2] == '1' && hdr->magic[3] == '\0') { version = 1; } return version; } //---------------------------------------------------------------------------- bool vtkNIFTIReader::CheckAnalyzeHeader(const nifti_1_header *hdr) { if (hdr->sizeof_hdr == 348 || // Analyze 7.5 header size hdr->sizeof_hdr == 1543569408) // byte-swapped 348 { return true; } return false; } //---------------------------------------------------------------------------- int vtkNIFTIReader::CanReadFile(const char *filename) { vtkDebugMacro("Opening NIFTI file " << filename); char *hdrname = vtkNIFTIReader::ReplaceExtension( filename, ".img", ".hdr"); if (hdrname == 0) { return 0; } #if _WIN32 vtkDICOMFilePath fp(hdrname); #if VTK_MAJOR_VERSION < 7 // convert to the local character set const char *uhdrname = fp.Local(); #else // use wide character const wchar_t *uhdrname = fp.Wide(); #endif #else const char *uhdrname = hdrname; #endif // try opening file gzFile file = gzopen(uhdrname, "rb"); delete [] hdrname; if (!file) { return 0; } // read and check the header bool canRead = false; nifti_1_header hdr; int hsize = vtkNIFTIHeader::Nifti1HeaderSize; // nifti_1 header size int rsize = gzread(file, &hdr, hsize); if (rsize == hsize) { int version = vtkNIFTIReader::CheckNIFTIVersion(&hdr); if (version > 0) { // NIFTI file canRead = true; } else if (version == 0) { // Analyze 7.5 file canRead = vtkNIFTIReader::CheckAnalyzeHeader(&hdr); } } gzclose(file); return canRead; } //---------------------------------------------------------------------------- int vtkNIFTIReader::RequestInformation( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) { // Clear the error indicator. this->SetErrorCode(vtkErrorCode::NoError); // Create the header object if (!this->NIFTIHeader) { this->NIFTIHeader = vtkNIFTIHeader::New(); } // default byte order is native byte order #ifdef VTK_WORDS_BIGENDIAN bool isLittleEndian = false; #else bool isLittleEndian = true; #endif const char *filename = 0; char *hdrname = 0; if (this->FileNames) { vtkIdType n = this->FileNames->GetNumberOfValues(); int headers = 0; for (int i = 0; i < 2; i++) { filename = this->FileNames->GetValue(i); // this checks for .hdr and .hdr.gz, case insensitive if (vtkNIFTIReader::CheckExtension(filename, ".hdr")) { headers++; hdrname = new char[strlen(filename) + 1]; strcpy(hdrname, filename); } } if (n != 2 || headers != 1) { vtkErrorMacro("There must be two files and one must be a .hdr file."); return 0; } } else { filename = this->GetFileName(); } if (filename == 0) { vtkErrorMacro("A FileName must be provided"); this->SetErrorCode(vtkErrorCode::NoFileNameError); return 0; } if (hdrname == 0) { hdrname = vtkNIFTIReader::ReplaceExtension( filename, ".img", ".hdr"); } if (hdrname == 0) { vtkErrorMacro("Unable to locate header for file " << filename); this->SetErrorCode(vtkErrorCode::CannotOpenFileError); return 0; } vtkDebugMacro("Opening NIFTI file " << hdrname); #if _WIN32 vtkDICOMFilePath fph(hdrname); #if VTK_MAJOR_VERSION < 7 // convert to the local character set const char *uhdrname = fph.Local(); #else // use wide character const wchar_t *uhdrname = fph.Wide(); #endif #else const char *uhdrname = hdrname; #endif // try opening file gzFile file = 0; if (uhdrname) { file = gzopen(uhdrname, "rb"); } if (!file) { vtkErrorMacro("Cannot open file " << hdrname); delete [] hdrname; this->SetErrorCode(vtkErrorCode::CannotOpenFileError); return 0; } // read and check the header bool canRead = false; int niftiVersion = 0; nifti_1_header *hdr1 = new nifti_1_header; nifti_2_header hdr2obj; nifti_2_header *hdr2 = &hdr2obj; const int hsize = vtkNIFTIHeader::Nifti1HeaderSize; int rsize = gzread(file, hdr1, hsize); if (rsize == hsize) { niftiVersion = vtkNIFTIReader::CheckNIFTIVersion(hdr1); if (niftiVersion >= 2) { // the header was a NIFTIv2 header const int h2size = vtkNIFTIHeader::Nifti2HeaderSize; // copy what was read into the NIFTIv1 header memcpy(hdr2, hdr1, hsize); // read the remainder of the NIFTIv2 header rsize = gzread(file, reinterpret_cast(hdr2)+hsize, h2size-hsize); if (rsize == h2size-hsize) { canRead = true; } } else if (niftiVersion == 1) { // the header was a NIFTIv1 header canRead = true; } else if (niftiVersion == 0) { // Analyze 7.5 file canRead = vtkNIFTIReader::CheckAnalyzeHeader(hdr1); } } if (canRead) { if (niftiVersion >= 2) { if (NIFTI_NEEDS_SWAP(*hdr2)) { vtkNIFTIHeader::ByteSwapHeader(hdr2); isLittleEndian = !isLittleEndian; } this->NIFTIHeader->SetHeader(hdr2); } else { if (NIFTI_NEEDS_SWAP(*hdr1)) { vtkNIFTIHeader::ByteSwapHeader(hdr1); isLittleEndian = !isLittleEndian; } // convert NIFTIv1 header into NIFTIv2 this->NIFTIHeader->SetHeader(hdr1); this->NIFTIHeader->GetHeader(hdr2); } } gzclose(file); // delete the NIFTIv1 header, use the NIFTIv2 header delete hdr1; hdr1 = 0; if (!canRead) { const char *message = (niftiVersion <= -2 ? "NIfTI header has newline corruption " : "Bad NIfTI header in file "); vtkErrorMacro(<< message << hdrname); this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError); delete [] hdrname; return 0; } delete [] hdrname; // number of dimensions int ndim = hdr2->dim[0]; if (ndim < 0 || ndim > 7) { vtkErrorMacro("NIfTI image has illegal ndim of " << ndim); this->SetErrorCode(vtkErrorCode::FileFormatError); return 0; } // sanity checks for (int i = 0; i < 8; i++) { // voxel spacing cannot be zero if (hdr2->pixdim[i] == 0) { hdr2->pixdim[i] = 1.0; } if (i > ndim) { // dimensions greater than ndim have size of 1 hdr2->dim[i] = 1; } else if (hdr2->dim[i] < 0) { vtkErrorMacro("NIfTI image dimension " << i << " is negative"); this->SetErrorCode(vtkErrorCode::FileFormatError); return 0; } else if ((hdr2->dim[i] & 0x7fffffff) != hdr2->dim[i]) { // dimension does not fit in signed int vtkErrorMacro("NIfTI image dimension " << i << " is larger than int32"); this->SetErrorCode(vtkErrorCode::FileFormatError); return 0; } } if (niftiVersion > 0) { // pass rescale info to user (do not rescale in the reader) this->RescaleSlope = hdr2->scl_slope; this->RescaleIntercept = hdr2->scl_inter; } else { // rescale information not available for Analyze 7.5 this->RescaleSlope = 1.0; this->RescaleIntercept = 0.0; } // header might be extended, vox_offset says where data starts this->SetHeaderSize(static_cast(hdr2->vox_offset)); // endianness of data if (isLittleEndian) { this->SetDataByteOrderToLittleEndian(); } else { this->SetDataByteOrderToBigEndian(); } // NIFTI images are stored in a single file, not one file per slice this->SetFileDimensionality(3); // NIFTI uses a lower-left-hand origin this->FileLowerLeftOn(); // dim this->SetDataExtent(0, hdr2->dim[1]-1, 0, hdr2->dim[2]-1, 0, hdr2->dim[3]-1); // pixdim this->SetDataSpacing(hdr2->pixdim[1], hdr2->pixdim[2], hdr2->pixdim[3]); // offset is part of the transform, so set origin to zero this->SetDataOrigin(0.0, 0.0, 0.0); // map the NIFTI type to a VTK type and number of components static const int typeMap[][3] = { { NIFTI_TYPE_INT8, VTK_TYPE_INT8, 1}, { NIFTI_TYPE_UINT8, VTK_TYPE_UINT8, 1 }, { NIFTI_TYPE_INT16, VTK_TYPE_INT16, 1 }, { NIFTI_TYPE_UINT16, VTK_TYPE_UINT16, 1 }, { NIFTI_TYPE_INT32, VTK_TYPE_INT32, 1 }, { NIFTI_TYPE_UINT32, VTK_TYPE_UINT32, 1 }, { NIFTI_TYPE_INT64, VTK_TYPE_INT64, 1 }, { NIFTI_TYPE_UINT64, VTK_TYPE_UINT64, 1 }, { NIFTI_TYPE_FLOAT32, VTK_TYPE_FLOAT32, 1 }, { NIFTI_TYPE_FLOAT64, VTK_TYPE_FLOAT64, 1 }, { NIFTI_TYPE_COMPLEX64, VTK_TYPE_FLOAT32, 2 }, { NIFTI_TYPE_COMPLEX128, VTK_TYPE_FLOAT64, 2 }, { NIFTI_TYPE_RGB24, VTK_TYPE_UINT8, 3 }, { NIFTI_TYPE_RGBA32, VTK_TYPE_UINT8, 4 }, { 0, 0, 0 } }; int scalarType = 0; int numComponents = 0; for (int i = 0; typeMap[2] != 0; i++) { if (hdr2->datatype == typeMap[i][0]) { scalarType = typeMap[i][1]; numComponents = typeMap[i][2]; break; } } // if loop finished without finding a match if (numComponents == 0) { vtkErrorMacro("Unrecognized NIFTI data type: " << hdr2->datatype); this->SetErrorCode(vtkErrorCode::FileFormatError); return 0; } // vector planes become vector components if (ndim >= 5) { numComponents *= hdr2->dim[5]; } if (ndim >= 4 && this->TimeAsVector) { numComponents *= hdr2->dim[4]; } this->SetDataScalarType(scalarType); this->SetNumberOfScalarComponents(numComponents); // Set the output information. vtkInformation* outInfo = outputVector->GetInformationObject(0); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, this->DataScalarType, this->NumberOfScalarComponents); outInfo->Set(vtkDataObject::SPACING(), this->DataSpacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), this->DataOrigin, 3); outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), this->DataExtent, 6); // copy dim for when RequestData is called for (int j = 0; j < 8; j++) { this->Dim[j] = hdr2->dim[j]; this->PixDim[j] = hdr2->pixdim[j]; } // === Image Orientation in NIfTI files === // // The vtkImageData class does not provide a way of storing image // orientation. So when we read a NIFTI file, we should also provide // the user with a 4x4 matrix that can transform VTK's data coordinates // into NIFTI's intended coordinate system for the image. NIFTI defines // these coordinate systems as: // 1) NIFTI_XFORM_SCANNER_ANAT - coordinate system of the imaging device // 2) NIFTI_XFORM_ALIGNED_ANAT - result of registration to another image // 3) NIFTI_XFORM_TALAIRACH - a brain-specific coordinate system // 4) NIFTI_XFORM_MNI_152 - a similar brain-specific coordinate system // // NIFTI images can store orientation in two ways: // 1) via a quaternion (orientation and offset, i.e. rigid-body) // 2) via a matrix (used to store e.g. the results of registration) // // A NIFTI file can have both a quaternion (qform) and matrix (sform) // stored in the same file. The NIFTI documentation recommends that // the qform be used to record the "scanner anatomical" coordinates // and that the sform, if present, be used to define a secondary // coordinate system, e.g. a coordinate system derived through // registration to a template. // // -- Quaternion Representation -- // // If the "quaternion" form is used, then the following equation // defines the transformation from voxel indices to NIFTI's world // coordinates, where R is the rotation matrix computed from the // quaternion components: // // [ x ] [ R11 R12 R13 ] [ pixdim[1] * i ] [ qoffset_x ] // [ y ] = [ R21 R22 R23 ] [ pixdim[2] * j ] + [ qoffset_y ] // [ z ] [ R31 R32 R33 ] [ pixdim[3] * k * qfac ] [ qoffset_z ] // // qfac is stored in pixdim[0], if it is equal to -1 then the slices // are stacked in reverse: VTK will have to reorder the slices in order // to maintain a right-handed coordinate transformation between indices // and coordinates. // // Let's call VTK data coordinates X,Y,Z to distinguish them from // the NIFTI coordinates x,y,z. The relationship between X,Y,Z and // x,y,z is expressed by a 4x4 matrix M: // // [ x ] [ M11 M12 M13 M14 ] [ X ] // [ y ] = [ M21 M22 M23 M24 ] [ Y ] // [ z ] [ M31 M32 M33 M34 ] [ Z ] // [ 1 ] [ 0 0 0 1 ] [ 1 ] // // where the VTK data coordinates X,Y,Z are related to the // VTK structured coordinates IJK (i.e. point indices) by: // // X = I*Spacing[0] + Origin[0] // Y = J*Spacing[1] + Origin[1] // Z = K*Spacing[2] + Origin[2] // // Now let's consider: when we read a NIFTI image, how should we set // the Spacing, the Origin, and the matrix M? Let's consider the // cases: // // 1) If there is no qform, then R is identity and qoffset is zero, // and qfac will be 1 (never -1). So: // I,J,K = i,j,k, Spacing = pixdim, Origin = 0, M = Identity // // 2) If there is a qform, and qfac is 1, then: // // I,J,K = i,j,k (i.e. voxel order in VTK same as in NIFTI) // // Spacing[0] = pixdim[1] // Spacing[1] = pixdim[2] // Spacing[2] = pixdim[3] // // Origin[0] = 0.0 // Origin[1] = 0.0 // Origin[2] = 0.0 // // [ R11 R12 R13 qoffset_x ] // M = [ R21 R22 R23 qoffset_y ] // [ R31 R32 R33 qoffset_z ] // [ 0 0 0 1 ] // // Note that we cannot store qoffset in the origin. That would // be mathematically incorrect. It would only give us the right // offset when R is the identity matrix. // // 3) If there is a qform and qfac is -1, then the situation is more // compilcated. We have three choices, each of which is a compromise: // a) we can use Spacing[2] = qfac*pixdim[3], i.e. use a negative // slice spacing, which might cause some VTK algorithms to // misbehave (the VTK tests only use images with positive spacing). // b) we can use M13 = -R13, M23 = -R23, M33 = -R33 i.e. introduce // a flip into the matrix, which is very bad for VTK rendering // algorithms and should definitely be avoided. // c) we can reverse the order of the slices in VTK relative to // NIFTI, which allows us to preserve positive spacing and retain // a well-behaved rotation matrix, by using these equations: // // K = number_of_slices - k - 1 // // M14 = qoffset_x - (number_of_slices - 1)*pixdim[3]*R13 // M24 = qoffset_y - (number_of_slices - 1)*pixdim[3]*R23 // M34 = qoffset_z - (number_of_slices - 1)*pixdim[3]*R33 // // This will give us data that will be well-behaved in VTK, at // the expense of making VTK slice numbers not match with // the original NIFTI slice numbers. NIFTI slice 0 will become // VTK slice N-1, and the order will be reversed. // // -- Matrix Representation -- // // If the "matrix" form is used, then pixdim[] is ignored, and the // voxel spacing is implicitly stored in the matrix. In addition, // the matrix may have a negative determinant, there is no "qfac" // flip-factor as there is in the quaternion representation. // // Let S be the matrix stored in the NIFTI header, and let M be our // desired coordinate transformation from VTK data coordinates X,Y,Z // to NIFTI data coordinates x,y,z (see discussion above for more // information). Let's consider the cases where the determinant // is positive, or negative. // // 1) If the determinant is positive, we will factor the spacing // (but not the origin) out of the matrix. // // Spacing[0] = pixdim[1] // Spacing[1] = pixdim[2] // Spacing[2] = pixdim[3] // // Origin[0] = 0.0 // Origin[1] = 0.0 // Origin[2] = 0.0 // // [ S11/pixdim[1] S12/pixdim[2] S13/pixdim[3] S14 ] // M = [ S21/pixdim[1] S22/pixdim[2] S23/pixdim[3] S24 ] // [ S31/pixdim[1] S32/pixdim[2] S33/pixdim[3] S34 ] // [ 0 0 0 1 ] // // 2) If the determinant is negative, then we face the same choices // as when qfac is -1 for the quaternion transformation. We can: // a) use a negative Z spacing and multiply the 3rd column of M by -1 // b) keep the matrix as is (with a negative determinant) // c) reorder the slices, multiply the 3rd column by -1, and adjust // the 4th column of the matrix: // // M14 = S14 + (number_of_slices - 1)*S13 // M24 = S24 + (number_of_slices - 1)*S23 // M34 = S34 + (number_of_slices - 1)*S33 // // The third choice will provide a VTK image that has positive // spacing and a matrix with a positive determinant. // // -- Analyze 7.5 Orientation -- // // This reader provides only bare-bones backwards compatibility with // the Analyze 7.5 file header. We do not orient these files. // Initialize this->QFac = 1.0; if (this->QFormMatrix) { this->QFormMatrix->Delete(); this->QFormMatrix = NULL; } if (this->SFormMatrix) { this->SFormMatrix->Delete(); this->SFormMatrix = NULL; } // Set the QFormMatrix from the quaternion data in the header. // See the long discussion above for more information. if (niftiVersion > 0 && hdr2->qform_code > 0) { double mmat[16]; double rmat[3][3]; double quat[4]; quat[1] = hdr2->quatern_b; quat[2] = hdr2->quatern_c; quat[3] = hdr2->quatern_d; quat[0] = 1.0 - quat[1]*quat[1] - quat[2]*quat[2] - quat[3]*quat[3]; if (quat[0] > 0.0) { quat[0] = sqrt(quat[0]); } else { quat[0] = 0.0; } vtkMath::QuaternionToMatrix3x3(quat, rmat); // If any matrix values are close to zero, then they should actually // be zero but aren't due to limited numerical precision in the // quaternion-to-matrix conversion. const double tol = 2.384185791015625e-07; // 2**-22 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (fabs(rmat[i][j]) < tol) { rmat[i][j] = 0.0; } } vtkMath::Normalize(rmat[i]); } // first row mmat[0] = rmat[0][0]; mmat[1] = rmat[0][1]; mmat[2] = rmat[0][2]; mmat[3] = hdr2->qoffset_x; // second row mmat[4] = rmat[1][0]; mmat[5] = rmat[1][1]; mmat[6] = rmat[1][2]; mmat[7] = hdr2->qoffset_y; // third row mmat[8] = rmat[2][0]; mmat[9] = rmat[2][1]; mmat[10] = rmat[2][2]; mmat[11] = hdr2->qoffset_z; mmat[12] = 0.0; mmat[13] = 0.0; mmat[14] = 0.0; mmat[15] = 1.0; this->QFac = ((hdr2->pixdim[0] < 0) ? -1.0 : 1.0); if (this->QFac < 0) { // We will be reversing the order of the slices, so the first VTK // slice will be at the position of the last NIfTI slice, and we // must adjust the offset to compensate for this. mmat[3] -= rmat[0][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1); mmat[7] -= rmat[1][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1); mmat[11] -= rmat[2][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1); } this->QFormMatrix = vtkMatrix4x4::New(); this->QFormMatrix->DeepCopy(mmat); } // Set the SFormMatrix from the matrix information in the header. // See the long discussion above for more information. if (niftiVersion > 0 && hdr2->sform_code > 0) { double mmat[16]; // first row mmat[0] = hdr2->srow_x[0]/hdr2->pixdim[1]; mmat[1] = hdr2->srow_x[1]/hdr2->pixdim[2]; mmat[2] = hdr2->srow_x[2]/hdr2->pixdim[3]; mmat[3] = hdr2->srow_x[3]; // second row mmat[4] = hdr2->srow_y[0]/hdr2->pixdim[1]; mmat[5] = hdr2->srow_y[1]/hdr2->pixdim[2]; mmat[6] = hdr2->srow_y[2]/hdr2->pixdim[3]; mmat[7] = hdr2->srow_y[3]; // third row mmat[8] = hdr2->srow_z[0]/hdr2->pixdim[1]; mmat[9] = hdr2->srow_z[1]/hdr2->pixdim[2]; mmat[10] = hdr2->srow_z[2]/hdr2->pixdim[3]; mmat[11] = hdr2->srow_z[3]; mmat[12] = 0.0; mmat[13] = 0.0; mmat[14] = 0.0; mmat[15] = 1.0; // Set QFac to -1 if the determinant is negative, unless QFac // has already been set by the qform information. if (vtkMatrix4x4::Determinant(mmat) < 0 && hdr2->qform_code == 0) { this->QFac = -1.0; } if (this->QFac < 0) { // If QFac is set to -1 then the slices will be reversed, and we must // reverse the slice orientation vector (the third column of the matrix) // to compensate. // reverse the slice orientation vector mmat[2] = -mmat[2]; mmat[6] = -mmat[6]; mmat[10] = -mmat[10]; // adjust the offset to compensate for changed slice ordering mmat[3] += hdr2->srow_x[2]*(hdr2->dim[3] - 1); mmat[7] += hdr2->srow_y[2]*(hdr2->dim[3] - 1); mmat[11] += hdr2->srow_z[2]*(hdr2->dim[3] - 1); } this->SFormMatrix = vtkMatrix4x4::New(); this->SFormMatrix->DeepCopy(mmat); if (this->SFormMatrix->Determinant() < 0) { vtkWarningMacro("SFormMatrix is flipped compared to QFormMatrix"); } } return 1; } //---------------------------------------------------------------------------- int vtkNIFTIReader::RequestData( vtkInformation* request, vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) { // check whether the reader is in an error state if (this->GetErrorCode() != vtkErrorCode::NoError) { return 0; } // which output port did the request come from int outputPort = request->Get(vtkDemandDrivenPipeline::FROM_OUTPUT_PORT()); // for now, this reader has only one output if (outputPort > 0) { return 1; } vtkInformation* outInfo = outputVector->GetInformationObject(0); int extent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), extent); // get the data object, allocate memory vtkImageData *data = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); #if VTK_MAJOR_VERSION >= 6 this->AllocateOutputData(data, outInfo, extent); #else this->AllocateOutputData(data, extent); #endif data->GetPointData()->GetScalars()->SetName("NIFTI"); const char *filename = 0; char *imgname = 0; if (this->FileNames) { vtkIdType n = this->FileNames->GetNumberOfValues(); int headers = 0; for (int i = 0; i < 2; i++) { filename = this->FileNames->GetValue(i); // this checks for .hdr and .hdr.gz, case insensitive if (vtkNIFTIReader::CheckExtension(filename, ".hdr")) { headers++; } else { imgname = new char[strlen(filename) + 1]; strcpy(imgname, filename); } } if (n != 2 || headers != 1) { vtkErrorMacro("There must be two files and one must be a .hdr file."); return 0; } } else { filename = this->GetFileName(); } if (filename == 0) { vtkErrorMacro("A FileName must be provided"); return 0; } if (imgname == 0) { imgname = vtkNIFTIReader::ReplaceExtension(filename, ".hdr", ".img"); } if (imgname == 0) { vtkErrorMacro("Unable to locate image for file " << filename); return 0; } vtkDebugMacro("Opening NIFTI file " << imgname); data->GetPointData()->GetScalars()->SetName("NIFTI"); unsigned char *dataPtr = static_cast(data->GetScalarPointer()); #if _WIN32 vtkDICOMFilePath fpi(imgname); #if VTK_MAJOR_VERSION < 7 // convert to the local character set const char *uimgname = fpi.Local(); #else // use wide character const wchar_t *uimgname = fpi.Wide(); #endif #else const char *uimgname = imgname; #endif gzFile file = 0; if (uimgname) { file = gzopen(uimgname, "rb"); } delete [] imgname; if (!file) { return 0; } // check if planar RGB is applicable (Analyze only) bool planarRGB = (this->PlanarRGB && (this->NIFTIHeader->GetDataType() == NIFTI_TYPE_RGB24 || this->NIFTIHeader->GetDataType() == NIFTI_TYPE_RGBA32)); int swapBytes = this->GetSwapBytes(); int scalarSize = data->GetScalarSize(); int numComponents = data->GetNumberOfScalarComponents(); int timeDim = (this->Dim[0] >= 4 ? this->Dim[4] : 1); int vectorDim = (this->Dim[0] >= 5 ? this->Dim[5] : 1); if (this->TimeAsVector) { vectorDim *= timeDim; } int outSizeX = extent[1] - extent[0] + 1; int outSizeY = extent[3] - extent[2] + 1; int outSizeZ = extent[5] - extent[4] + 1; z_off_t fileVoxelIncr = scalarSize*numComponents/vectorDim; z_off_t fileRowIncr = fileVoxelIncr*this->Dim[1]; z_off_t filePlaneIncr = fileRowIncr*this->Dim[2]; z_off_t fileSliceIncr = fileRowIncr*this->Dim[2]; z_off_t fileTimeIncr = fileSliceIncr*this->Dim[3]; z_off_t fileVectorIncr = fileTimeIncr*this->Dim[4]; if (this->TimeAsVector) { fileVectorIncr = fileTimeIncr; } // planar RGB requires different increments int planarSize = 1; // if > 1, indicates planar RGB if (planarRGB) { planarSize = numComponents/vectorDim; fileVoxelIncr = scalarSize; fileRowIncr = fileVoxelIncr*this->Dim[1]; filePlaneIncr = fileRowIncr*this->Dim[2]; } // add a buffer for planar-vector to packed-vector conversion unsigned char *rowBuffer = 0; if (vectorDim > 1 || planarRGB) { rowBuffer = new unsigned char[outSizeX*fileVoxelIncr]; } // special increment to reverse the slices if needed vtkIdType sliceOffset = 0; if (this->GetQFac() < 0) { // put slices in reverse order sliceOffset = scalarSize*numComponents; sliceOffset *= outSizeX; sliceOffset *= outSizeY; dataPtr += sliceOffset*(outSizeZ - 1); } // special increment to handle planar RGB vtkIdType planarOffset = 0; vtkIdType planarEndOffset = 0; if (planarRGB) { planarOffset = scalarSize*numComponents; planarOffset *= outSizeX; planarOffset *= outSizeY; planarOffset -= scalarSize; planarEndOffset = planarOffset - scalarSize*(planarSize - 1); } // report progress every 2% of the way to completion this->InvokeEvent(vtkCommand::StartEvent); this->UpdateProgress(0.0); vtkIdType target = static_cast(0.02*planarSize*outSizeY*outSizeZ*vectorDim) + 1; vtkIdType count = 0; // seek to the start of the data z_off_t offset = static_cast(this->GetHeaderSize()); offset += extent[0]*fileVoxelIncr; offset += extent[2]*fileRowIncr; offset += extent[4]*fileSliceIncr; // read the data one row at a time, do planar-to-packed conversion // of vector components if NIFTI file has a vector dimension int rowSize = fileVoxelIncr/scalarSize*outSizeX; int t = 0; // counter for time int c = 0; // counter for vector components int j = 0; // counter for rows int p = 0; // counter for planes (planar RGB) int k = 0; // counter for slices unsigned char *ptr = dataPtr; int errorCode = 0; while (!this->AbortExecute) { if (offset) { int rval = gzseek(file, offset, SEEK_CUR); if (rval == -1) { errorCode = vtkErrorCode::FileFormatError; if (gzeof(file)) { errorCode = vtkErrorCode::PrematureEndOfFileError; } break; } } if (vectorDim == 1 && !planarRGB) { // read directly into the output instead of into a buffer rowBuffer = ptr; } int code = gzread(file, rowBuffer, rowSize*scalarSize); if (code != rowSize*scalarSize) { errorCode = vtkErrorCode::FileFormatError; if (gzeof(file)) { errorCode = vtkErrorCode::PrematureEndOfFileError; } break; } if (swapBytes != 0 && scalarSize > 1) { vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize); } if (vectorDim == 1 && !planarRGB) { // advance the pointer to the next row ptr += outSizeX*numComponents*scalarSize; rowBuffer = 0; } else { // write vector plane to packed vector component unsigned char *tmpPtr = rowBuffer; z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr; for (int i = 0; i < outSizeX; i++) { // write one vector component of one voxel z_off_t n = fileVoxelIncr; do { *ptr++ = *tmpPtr++; } while (--n); // skip past the other components ptr += skipOther; } } if (++count % target == 0) { this->UpdateProgress(0.02*count/target); } // offset to skip unread sections of the file, for when // the update extent is less than the whole extent offset = fileRowIncr - outSizeX*fileVoxelIncr; if (++j == outSizeY) { j = 0; offset += filePlaneIncr - outSizeY*fileRowIncr; // back up for next plane (R, G, or B) if planar mode ptr -= planarOffset; if (++p == planarSize) { p = 0; ptr += planarEndOffset; // advance to start of next slice ptr -= 2*sliceOffset; // for reverse slice order if (++k == outSizeZ) { k = 0; offset += fileVectorIncr - outSizeZ*fileSliceIncr; if (++t == timeDim) { t = 0; } if (++c == vectorDim) { break; } // back up the ptr to the beginning of the image, // then increment to the next vector component ptr = dataPtr + c*fileVoxelIncr*planarSize; if (this->TimeAsVector) { // if timeDim is included in the vectorDim (and hence in the // VTK scalar components) then we have to make sure that // the vector components are packed before the time steps ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim* fileVoxelIncr*planarSize; } } } } } if (vectorDim > 1 || planarRGB) { delete [] rowBuffer; } gzclose(file); if (errorCode) { const char *errorText = "Error in NIFTI file, cannot read."; if (errorCode == vtkErrorCode::PrematureEndOfFileError) { errorText = "NIFTI file is truncated, some data is missing."; } this->SetErrorCode(errorCode); vtkErrorMacro(<< errorText); return 0; } this->UpdateProgress(1.0); this->InvokeEvent(vtkCommand::EndEvent); return 1; } vtk-dicom-0.8.12/Source/vtkNIFTIReader.h000066400000000000000000000215441356440565500176540ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIReader.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkNIFTIReader * \brief Read NIfTI-1 and NIfTI-2 medical image files * * This class reads NIFTI files, either in .nii format or as separate * .img and .hdr files. If two files are used, then they can be passed * by using SetFileNames() instead of SetFileName(). Files ending in .gz * are decompressed on-the-fly while they are being read. Files with * complex numbers or vector dimensions will be read as multi-component * images. If a NIFTI file has a time dimension, then by default only the * first image in the time series will be read, but the TimeAsVector * flag can be set to read the time steps as vector components. Files in * Analyze 7.5 format are also supported by this reader. * * This class was contributed to VTK by the Calgary Image Processing and * Analysis Centre (CIPAC). * * \sa vtkNIFTIWriter, vtkNIFTIHeader */ #ifndef vtkNIFTIReader_h #define vtkNIFTIReader_h #include "vtkImageReader2.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkNIFTIHeader; class vtkMatrix4x4; struct nifti_1_header; //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkNIFTIReader : public vtkImageReader2 { public: //! Static method for construction. static vtkNIFTIReader *New(); vtkTypeMacro(vtkNIFTIReader, vtkImageReader2); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Valid extensions for this file type. const char* GetFileExtensions() VTK_DICOM_OVERRIDE { return ".nii .nii.gz .img .img.gz .hdr .hdr.gz"; } //! Return a descriptive name that might be useful in a GUI. const char* GetDescriptiveName() VTK_DICOM_OVERRIDE { return "NIfTI"; } //! Return true if this reader can read the given file. int CanReadFile(const char* filename) VTK_DICOM_OVERRIDE; //@} //@{ //! Read the time dimension as scalar components (default: Off). /*! * If this is on, then each time point will be stored as a component in * the image data. If the file has both a time dimension and a vector * dimension, then the number of components will be the product of these * two dimensions, i.e. the components will store a sequence of vectors. */ vtkGetMacro(TimeAsVector, int); vtkSetMacro(TimeAsVector, int); vtkBooleanMacro(TimeAsVector, int); //@} //@{ //! Get the time dimension that was stored in the NIFTI header. int GetTimeDimension() { return this->Dim[4]; } double GetTimeSpacing() { return this->PixDim[4]; } //@} //@{ //! Get the slope and intercept for rescaling the scalar values. /*! * These values allow calibration of the data to real values. * Use the equation v = u*RescaleSlope + RescaleIntercept. * This directly returns the values stored in the scl_slope and * scl_inter fields in the NIFTI header. */ double GetRescaleSlope() { return this->RescaleSlope; } double GetRescaleIntercept() { return this->RescaleIntercept; } //@} //@{ //! Read planar RGB (separate R, G, and B planes), rather than packed RGB. /*! * The NIFTI format should always use packed RGB. The Analyze format, * however, was used to store both planar RGB and packed RGB depending * on the software, without any indication in the header about which * convention was being used. Use this if you have a planar RGB file. */ vtkGetMacro(PlanarRGB, bool); vtkSetMacro(PlanarRGB, bool); vtkBooleanMacro(PlanarRGB, bool); //@} //@{ //! QFac gives the slice order in the NIFTI file versus the VTK image. /*! * If QFac is -1, then the VTK slice index K is related to the NIFTI * slice index k by the equation K = (num_slices - k - 1). VTK requires * the slices to be ordered so that the voxel indices (I,J,K) provide a * right-handed coordinate system, whereas NIFTI does not. Instead, * NIFTI stores a factor called "qfac" in the header to signal when the * (i,j,k) indices form a left-handed coordinate system. QFac will only * ever have values of +1 or -1. */ double GetQFac() { return this->QFac; } //@} //@{ //! Get a matrix that gives the "qform" orientation and offset for the data. /*! * If no qform matrix was stored in the file, the return value is NULL. * This matrix will transform VTK data coordinates into the NIFTI oriented * data coordinates, where +X points right, +Y points anterior (toward the * front), and +Z points superior (toward the head). The qform matrix will * always have a positive determinant. The offset that is stored in the * matrix gives the position of the first pixel in the first slice of the * VTK image data. Note that if QFac is -1, then the first slice in the * VTK image data is the last slice in the NIFTI file, and the Z offset * will automatically be adjusted to compensate for this. */ vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; } //! Get a matrix that gives the "sform" orientation and offset for the data. /*! * If no sform matrix was stored in the file, the return value is NULL. * Like the qform matrix, this matrix will transform VTK data coordinates * into a NIFTI coordinate system. Unlike the qform matrix, the sform * matrix can contain scaling information and can even (rarely) have * a negative determinant, i.e. a flip. This matrix is modified slightly * as compared to the sform matrix stored in the NIFTI header: the pixdim * pixel spacing is factored out. Also, if QFac is -1, then the VTK slices * are in reverse order as compared to the NIFTI slices, hence as compared * to the sform matrix stored in the header, the third column of this matrix * is multiplied by -1 and the Z offset is shifted to compensate for the * fact that the last slice has become the first. */ vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; } //@} //@{ //! Get the raw header information from the NIfTI file. vtkNIFTIHeader *GetNIFTIHeader(); //@} protected: vtkNIFTIReader(); ~vtkNIFTIReader(); //! Read the header information. int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Read the voxel data. int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Doe a case-insensitive check for the given extension. /*! * The check will succeed if the filename ends in ".gz", and if the * extension matches after removing the ".gz". */ static bool CheckExtension(const char *fname, const char *ext); //! Make a new filename by replacing extension "ext1" with "ext2". /*! * The extensions must include a period, must be three characters * long, and must be lower case. This method also verifies that * the file exists, and adds or subtracts a ".gz" as necessary * If the file exists, a new string is returned that must be * deleted by the caller. Otherwise, the return value is NULL. */ static char *ReplaceExtension( const char *fname, const char *ext1, const char *ext2); //! Check the version of the header. static int CheckNIFTIVersion(const nifti_1_header *hdr); //! Check for Analyze 7.5 header. static bool CheckAnalyzeHeader(const nifti_1_header *hdr); //! Read the time dimension as if it was a vector dimension. int TimeAsVector; //! Information for rescaling data to quantitative units. double RescaleIntercept; double RescaleSlope; //! Set to -1 when VTK slice order is opposite to NIFTI slice order. double QFac; //! The orientation matrices for the NIFTI file. vtkMatrix4x4 *QFormMatrix; vtkMatrix4x4 *SFormMatrix; //! The dimensions of the NIFTI file. int Dim[8]; //! The spacings in the NIFTI file. double PixDim[8]; //! A copy of the header from the file that was most recently read. vtkNIFTIHeader *NIFTIHeader; //! Use planar RGB instead of the default (packed). bool PlanarRGB; private: #ifdef VTK_DICOM_DELETE vtkNIFTIReader(const vtkNIFTIReader&) VTK_DICOM_DELETE; void operator=(const vtkNIFTIReader&) VTK_DICOM_DELETE; #else vtkNIFTIReader(const vtkNIFTIReader&) = delete; void operator=(const vtkNIFTIReader&) = delete; #endif }; #endif // vtkNIFTIReader_h vtk-dicom-0.8.12/Source/vtkNIFTIWriter.cxx000066400000000000000000000656021356440565500203040ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIWriter.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkNIFTIWriter.h" #include "vtkObjectFactory.h" #include "vtkNIFTIReader.h" #include "vtkImageData.h" #include "vtkPointData.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkErrorCode.h" #include "vtkByteSwap.h" #include "vtkMatrix4x4.h" #include "vtkMath.h" #include "vtkCommand.h" #include "vtkVersion.h" // For removing file if write failed #include "vtkDICOMFile.h" // Header for NIFTI #include "vtkNIFTIHeader.h" #include "vtkNIFTIPrivate.h" #include "vtkDICOMConfig.h" // Header for zlib #ifdef DICOM_USE_VTKZLIB #include "vtk_zlib.h" #else #include "zlib.h" #endif #include #include #include #include #ifdef _WIN32 // To allow use of wchar_t paths on Windows #include "vtkDICOMFilePath.h" #if VTK_MAJOR_VERSION >= 7 #ifdef gzopen #undef gzopen #endif #define gzopen gzopen_w #define fopen _wfopen #define NIFTI_FILE_MODE L"wb" #else #define NIFTI_FILE_MODE "wb" #endif #else #define NIFTI_FILE_MODE "wb" #endif vtkStandardNewMacro(vtkNIFTIWriter); vtkCxxSetObjectMacro(vtkNIFTIWriter,QFormMatrix,vtkMatrix4x4); vtkCxxSetObjectMacro(vtkNIFTIWriter,SFormMatrix,vtkMatrix4x4); vtkCxxSetObjectMacro(vtkNIFTIWriter,NIFTIHeader,vtkNIFTIHeader); //---------------------------------------------------------------------------- vtkNIFTIWriter::vtkNIFTIWriter() { this->FileLowerLeft = 1; this->FileDimensionality = 3; this->TimeDimension = 0; this->TimeSpacing = 1.0; // If slope,inter are 0,0 then default slope,inter of 1,0 is used this->RescaleSlope = 0.0; this->RescaleIntercept = 0.0; this->QFac = 0.0; this->QFormMatrix = 0; this->SFormMatrix = 0; this->OwnHeader = 0; this->NIFTIHeader = 0; this->NIFTIVersion = 0; this->Description = 0; // Planar RGB (NIFTI doesn't allow this, it's here for Analyze) this->PlanarRGB = false; this->DataByteOrder = LittleEndian; } //---------------------------------------------------------------------------- vtkNIFTIWriter::~vtkNIFTIWriter() { if (this->QFormMatrix) { this->QFormMatrix->Delete(); } if (this->SFormMatrix) { this->SFormMatrix->Delete(); } if (this->OwnHeader) { this->OwnHeader->Delete(); } if (this->NIFTIHeader) { this->NIFTIHeader->Delete(); } delete [] this->Description; } //---------------------------------------------------------------------------- vtkNIFTIHeader *vtkNIFTIWriter::GetNIFTIHeader() { if (!this->NIFTIHeader) { this->NIFTIHeader = vtkNIFTIHeader::New(); } return this->NIFTIHeader; } //---------------------------------------------------------------------------- void vtkNIFTIWriter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "Description: " << (this->Description ? this->Description : "(NULL)") << "\n"; os << indent << "TimeDimension: " << this->TimeDimension << "\n"; os << indent << "TimeSpacing: " << this->TimeSpacing << "\n"; os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "QFac: " << this->QFac << "\n"; os << indent << "QFormMatrix:"; if (this->QFormMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "SFormMatrix:"; if (this->SFormMatrix) { double mat[16]; vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix); for (int i = 0; i < 16; i++) { os << " " << mat[i]; } os << "\n"; } else { os << " (none)\n"; } os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n"); os << indent << "NIFTIVersion: " << this->NIFTIVersion << "\n"; os << indent << "PlanarRGB: " << (this->PlanarRGB ? "On\n" : "Off\n"); os << indent << "DataByteOrder: " << ((this->DataByteOrder == BigEndian) ? "BigEndian\n" : "LittleEndian\n"); } //---------------------------------------------------------------------------- char *vtkNIFTIWriter::ReplaceExtension( const char *filename, const char *ext1, const char *ext2) { size_t n = strlen(filename); size_t m = n; char *newname = new char[n+4]; strcpy(newname, filename); if (n > 2 && filename[n-3] == '.' && tolower(filename[n-2]) == 'g' && tolower(filename[n-1]) == 'z') { m -= 3; } if (m > 3 && filename[m-4] == '.' && tolower(filename[m-3]) == tolower(ext1[1]) && tolower(filename[m-2]) == tolower(ext1[2]) && tolower(filename[m-1]) == tolower(ext1[3])) { if (isupper(filename[m-3])) { newname[m-3] = toupper(ext2[1]); newname[m-2] = toupper(ext2[2]); newname[m-1] = toupper(ext2[3]); } else { newname[m-3] = tolower(ext2[1]); newname[m-2] = tolower(ext2[2]); newname[m-1] = tolower(ext2[3]); } } return newname; } //---------------------------------------------------------------------------- namespace { // Initialize the NIFTI header with only the most basic information: // - NIFTI data type is set from VTK data type // - NIFTI pixdim set from VTK spacing // - dimensionality is: // - 5 if number of components is greater than one // - 2 if Z dimension is one and number of components is one // - 3 if Z dimension is greater than one and number of components is one // - units are NIFTI_UNITS_UNKNOWN // - intent is NIFTI_INTENT_NONE // - magic is "n+1" (i.e. a .nii file, header+image in one file) // - vox_offset is set to the header size plus 64-bit alignment padding // - everything else is initialized to zero // After initialization, the following should be set: // - if file is ".hdr", set magic to "ni1" and vox_offset to zero // - intent should be set, if known // - units should be set, if known // - qform and sform should be set, if known // - pixdim[0] should be set to qfac (1 or -1) if qform is known // - slope and inter should be set, if known // - descrip and intent_name should be set, if known // - for RGB and RGBA images, header should be modified as necessary // - for complex images, header should be modified as necessary void vtkNIFTIWriterSetInformation( nifti_2_header *hdr, vtkInformation *info) { // get the scalar information vtkInformation *scalarInfo = vtkDataObject::GetActiveFieldInformation( info, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS); int extent[6]; info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); double spacing[3]; info->Get(vtkDataObject::SPACING(), spacing); int scalarType = scalarInfo->Get(vtkDataObject::FIELD_ARRAY_TYPE()); int numComponents = scalarInfo->Get( vtkDataObject::FIELD_NUMBER_OF_COMPONENTS()); // map VTK type to NIFTI type and bits static const int typeMap[][3] = { #if VTK_TYPE_CHAR_IS_SIGNED { VTK_CHAR, NIFTI_TYPE_INT8, 8 }, #else { VTK_CHAR, NIFTI_TYPE_UINT8, 8 }, #endif { VTK_SIGNED_CHAR, NIFTI_TYPE_INT8, 8 }, { VTK_UNSIGNED_CHAR, NIFTI_TYPE_UINT8, 8 }, { VTK_SHORT, NIFTI_TYPE_INT16, 16 }, { VTK_UNSIGNED_SHORT, NIFTI_TYPE_UINT16, 16 }, { VTK_INT, NIFTI_TYPE_INT32, 32 }, { VTK_UNSIGNED_INT, NIFTI_TYPE_UINT32, 32 }, #if VTK_SIZEOF_LONG == 4 { VTK_LONG, NIFTI_TYPE_INT32, 32 }, { VTK_UNSIGNED_LONG, NIFTI_TYPE_UINT32, 32 }, #else { VTK_LONG, NIFTI_TYPE_INT64, 64 }, { VTK_UNSIGNED_LONG, NIFTI_TYPE_UINT64, 64 }, #endif { VTK_LONG_LONG, NIFTI_TYPE_INT64, 64 }, { VTK_UNSIGNED_LONG_LONG, NIFTI_TYPE_UINT64, 64 }, #ifdef VTK___INT64 { VTK___INT64, NIFTI_TYPE_INT64, 64 }, #endif #ifdef VTK_UNSIGNED___INT64 { VTK_UNSIGNED___INT64, NIFTI_TYPE_UINT64, 64 }, #endif { VTK_FLOAT, NIFTI_TYPE_FLOAT32, 32 }, { VTK_DOUBLE, NIFTI_TYPE_FLOAT64, 64 }, { 0, 0, 0 } }; short datatype = 0; short databits = 0; for (int i = 0; typeMap[2] != 0; i++) { if (scalarType == typeMap[i][0]) { datatype = typeMap[i][1]; databits = typeMap[i][2]; break; } } // number of spatial dimensions int spaceDim = (extent[4] == extent[5] ? 2 : 3); hdr->dim[0] = (numComponents == 1 ? spaceDim : 5); hdr->dim[1] = extent[1] - extent[0] + 1; hdr->dim[2] = extent[3] - extent[2] + 1; hdr->dim[3] = extent[5] - extent[4] + 1; hdr->dim[4] = 1; hdr->dim[5] = numComponents; hdr->dim[6] = 1; hdr->dim[7] = 1; hdr->datatype = datatype; hdr->bitpix = databits; hdr->slice_start = 0; hdr->pixdim[0] = 0.0; hdr->pixdim[1] = spacing[0]; hdr->pixdim[2] = spacing[1]; hdr->pixdim[3] = spacing[2]; hdr->pixdim[4] = 1.0; hdr->pixdim[5] = 1.0; hdr->pixdim[6] = 1.0; hdr->pixdim[7] = 1.0; } // Set the QForm from a 4x4 matrix void vtkNIFTIWriterSetQForm( nifti_2_header *hdr, double mmat[16], double qfac) { double rmat[3][3]; rmat[0][0] = mmat[0]; rmat[0][1] = mmat[1]; rmat[0][2] = mmat[2]; rmat[1][0] = mmat[4]; rmat[1][1] = mmat[5]; rmat[1][2] = mmat[6]; rmat[2][0] = mmat[8]; rmat[2][1] = mmat[9]; rmat[2][2] = mmat[10]; double quat[4]; vtkMath::Matrix3x3ToQuaternion(rmat, quat); if (quat[0] < 0) { quat[0] = -quat[0]; quat[1] = -quat[1]; quat[2] = -quat[2]; quat[3] = -quat[3]; } if (qfac < 0) { // We will be reversing the order of the slices, so the first VTK // slice will be at the position of the last NIfTI slice, and we // must adjust the offset to compensate for this. mmat[3] += rmat[0][2]*hdr->pixdim[3]*(hdr->dim[3] - 1); mmat[7] += rmat[1][2]*hdr->pixdim[3]*(hdr->dim[3] - 1); mmat[11] += rmat[2][2]*hdr->pixdim[3]*(hdr->dim[3] - 1); } hdr->pixdim[0] = qfac; hdr->quatern_b = quat[1]; hdr->quatern_c = quat[2]; hdr->quatern_d = quat[3]; hdr->qoffset_x = mmat[3]; hdr->qoffset_y = mmat[7]; hdr->qoffset_z = mmat[11]; } // Set the SForm from a 4x4 matrix void vtkNIFTIWriterSetSForm( nifti_2_header *hdr, double mmat[16], double qfac) { if (qfac < 0) { // If QFac is set to -1 (which only occurs if qform_code was set) // then the slices will be reversed, and we must reverse the slice // orientation vector (the third column of the matrix) to compensate. // adjust the offset to compensate for changed slice ordering mmat[3] += mmat[2] * hdr->pixdim[3] * (hdr->dim[3] - 1); mmat[7] += mmat[6] * hdr->pixdim[3] * (hdr->dim[3] - 1); mmat[11] += mmat[10] * hdr->pixdim[3] * (hdr->dim[3] - 1); // reverse the slice orientation vector mmat[2] = -mmat[2]; mmat[6] = -mmat[6]; mmat[10] = -mmat[10]; } // first row hdr->srow_x[0] = mmat[0] * hdr->pixdim[1]; hdr->srow_x[1] = mmat[1] * hdr->pixdim[2]; hdr->srow_x[2] = mmat[2] * hdr->pixdim[3]; hdr->srow_x[3] = mmat[3]; // second row hdr->srow_y[0] = mmat[4] * hdr->pixdim[1]; hdr->srow_y[1] = mmat[5] * hdr->pixdim[2]; hdr->srow_y[2] = mmat[6] * hdr->pixdim[3]; hdr->srow_y[3] = mmat[7]; // third row hdr->srow_z[0] = mmat[8] * hdr->pixdim[1]; hdr->srow_z[1] = mmat[9] * hdr->pixdim[2]; hdr->srow_z[2] = mmat[10] * hdr->pixdim[3]; hdr->srow_z[3] = mmat[11]; } void vtkNIFTIWriterMatrix( double mmat[16], vtkMatrix4x4 *matrix, const double origin[3]) { // find new offset by multiplying the origin by the matrix double offset[4]; offset[0] = origin[0]; offset[1] = origin[1]; offset[2] = origin[2]; offset[3] = 1.0; if (matrix) { matrix->MultiplyPoint(offset, offset); vtkMatrix4x4::DeepCopy(mmat, matrix); } else { vtkMatrix4x4::Identity(mmat); } mmat[3] = offset[0]; mmat[7] = offset[1]; mmat[11] = offset[2]; } } // end anonymous namespace //---------------------------------------------------------------------------- int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile) { // create the header nifti_2_header hdr; int version = 0; if (this->OwnHeader == 0) { this->OwnHeader = vtkNIFTIHeader::New(); } else { this->OwnHeader->Initialize(); } if (this->NIFTIHeader) { // use the header supplied by SetNIFTIHeader() this->NIFTIHeader->GetHeader(&hdr); version = hdr.magic[2] - '0'; if (version > 2) { version = 2; } } else { // start with a blank header this->OwnHeader->GetHeader(&hdr); hdr.scl_slope = 1.0; } // copy the image information into the header vtkNIFTIWriterSetInformation(&hdr, info); if (hdr.datatype == 0) { vtkErrorMacro("Illegal data type for NIFTI file."); return 0; } // override the version if set via SetNIFTIVersion if (this->NIFTIVersion != 0) { version = this->NIFTIVersion; } // set the rescale slope/intercept if not (0.0,0.0) if (this->RescaleSlope != 0.0 || this->RescaleIntercept != 0.0) { hdr.scl_slope = this->RescaleSlope; hdr.scl_inter = this->RescaleIntercept; } // set the header size hdr.sizeof_hdr = (version == 2 ? vtkNIFTIHeader::Nifti2HeaderSize : vtkNIFTIHeader::Nifti1HeaderSize); // modify magic number and voxel offset for .img files if (!singleFile) { strncpy(hdr.magic, (version == 2 ? "ni2" : "ni1"), 4); hdr.vox_offset = 0; } else { strncpy(hdr.magic, (version == 2 ? "n+2" : "n+1"), 4); hdr.vox_offset = (version == 2 ? 544 : 352); } if (version == 2) { // version 2 has four bytes for newline transfer checks memcpy(&hdr.magic[4], "\r\n\032\n", 4); } // set the description if (this->Description) { strncpy(hdr.descrip, this->Description, sizeof(hdr.descrip) - 1); hdr.descrip[sizeof(hdr.descrip) - 1] = '\0'; } // qfac dictates the slice ordering in the file double qfac = (this->QFac < 0 ? -1.0 : 1.0); // origin must be incorporated into qform and sform double origin[3]; info->Get(vtkDataObject::ORIGIN(), origin); if (this->QFormMatrix || (origin[0] != 0 || origin[1] != 0 || origin[2] != 0)) { hdr.qform_code = 1; // SCANNER_ANAT double mat16[16]; vtkNIFTIWriterMatrix(mat16, this->QFormMatrix, origin); vtkNIFTIWriterSetQForm(&hdr, mat16, qfac); } if (this->SFormMatrix) { hdr.sform_code = 2; // ALIGNED_ANAT double mat16[16]; vtkNIFTIWriterMatrix(mat16, this->SFormMatrix, origin); vtkNIFTIWriterSetSForm(&hdr, mat16, qfac); } // base dimension not counting vector dimension int basedim = (hdr.dim[3] == 1 ? 2 : 3); if (this->TimeDimension) { int tdim = this->TimeDimension; if (hdr.dim[5] % tdim != 0) { vtkErrorMacro("Number of components in the image data must be " "divisible by the TimeDimension"); return 0; } hdr.pixdim[4] = this->TimeSpacing; hdr.dim[4] = tdim; hdr.dim[5] /= tdim; hdr.dim[0] = (hdr.dim[5] > 1 ? 5 : 4); basedim = 4; } if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT32) { // float with 2 components becomes COMPLEX64 hdr.datatype = NIFTI_TYPE_COMPLEX64; hdr.bitpix = 64; hdr.dim[0] = basedim; hdr.dim[5] = 1; } else if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT64) { // double with 2 components becomes COMPLEX128 hdr.datatype = NIFTI_TYPE_COMPLEX128; hdr.bitpix = 32; hdr.dim[0] = basedim; hdr.dim[5] = 1; } else if (hdr.dim[5] == 3 && hdr.datatype == NIFTI_TYPE_UINT8) { // unsigned char with 3 components becomes RGB24 hdr.datatype = NIFTI_TYPE_RGB24; hdr.bitpix = 24; hdr.dim[0] = basedim; hdr.dim[5] = 1; } else if (hdr.dim[5] == 4 && hdr.datatype == NIFTI_TYPE_UINT8) { // unsigned char with 4 components becomes RGBA32 hdr.datatype = NIFTI_TYPE_RGBA32; hdr.bitpix = 32; hdr.dim[0] = basedim; hdr.dim[5] = 1; } this->OwnHeader->SetHeader(&hdr); return 1; } //---------------------------------------------------------------------------- int vtkNIFTIWriter::RequestData( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* vtkNotUsed(outputVector)) { this->SetErrorCode(vtkErrorCode::NoError); vtkInformation *info = inputVector[0]->GetInformationObject(0); vtkImageData *data = vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT())); if (data == NULL) { vtkErrorMacro("No input provided!"); return 0; } const char *filename = this->GetFileName(); if (filename == NULL) { vtkErrorMacro("A FileName must be provided"); this->SetErrorCode(vtkErrorCode::NoFileNameError); return 0; } // check whether to do a byteswap (for header and data) #ifdef VTK_WORDS_BIGENDIAN int swapBytes = (this->DataByteOrder != BigEndian); #else int swapBytes = (this->DataByteOrder == BigEndian); #endif int extent[6]; info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); if (extent[0] > extent[1] || extent[2] > extent[3] || extent[4] > extent[5]) { vtkErrorMacro("The input is empty! The extent is (" << extent[0] << "," << extent[1] << "," << extent[2] << "," << extent[3] << "," << extent[4] << "," << extent[5] << ")."); return 0; } // use compression if name ends in .gz bool isCompressed = false; size_t n = strlen(filename); size_t m = n; if (n > 2 && filename[n-3] == '.' && tolower(filename[n-2]) == 'g' && tolower(filename[n-1]) == 'z') { m = n - 3; isCompressed = true; } // after the optional ".gz" is removed, is it a ".img/.hdr" file? bool singleFile = true; if (m > 4 && filename[m-4] == '.' && ((tolower(filename[m-3]) == 'h' && tolower(filename[m-2]) == 'd' && tolower(filename[m-1]) == 'r') || (tolower(filename[m-3]) == 'i' && tolower(filename[m-2]) == 'm' && tolower(filename[m-1]) == 'g'))) { singleFile = false; } // generate the header information if (this->GenerateHeader(info, singleFile) == 0) { return 0; } // if file is not .nii, then get .hdr and .img filenames char *hdrname = vtkNIFTIWriter::ReplaceExtension( filename, ".img", ".hdr"); char *imgname = vtkNIFTIWriter::ReplaceExtension( filename, ".hdr", ".img"); vtkDebugMacro(<< "Writing NIFTI file " << hdrname); // get either a NIFTIv1 or a NIFTIv2 header nifti_1_header hdr1; nifti_2_header hdr2; void *hdrptr = 0; size_t hdrsize = 0; int version = this->OwnHeader->GetMagic()[2] - '0'; if (version == 2) { this->OwnHeader->GetHeader(&hdr2); hdrsize = hdr2.sizeof_hdr; if (swapBytes) { vtkNIFTIHeader::ByteSwapHeader(&hdr2); } hdrptr = &hdr2; } else { this->OwnHeader->GetHeader(&hdr1); hdrsize = hdr1.sizeof_hdr; if (swapBytes) { vtkNIFTIHeader::ByteSwapHeader(&hdr1); } hdrptr = &hdr1; if (extent[1] - extent[0] + 1 > VTK_SHORT_MAX || extent[3] - extent[2] + 1 > VTK_SHORT_MAX || extent[5] - extent[4] + 1 > VTK_SHORT_MAX) { vtkErrorMacro("Image too large to store in NIFTI-1 format"); return 0; } } #if _WIN32 vtkDICOMFilePath fph(hdrname); vtkDICOMFilePath fpi(imgname); #if VTK_MAJOR_VERSION < 7 // convert to the local character set const char *uhdrname = fph.Local(); const char *uimgname = fpi.Local(); #else // use wide character const wchar_t *uhdrname = fph.Wide(); const wchar_t *uimgname = fpi.Wide(); #endif #else const char *uhdrname = hdrname; const char *uimgname = imgname; #endif // try opening file gzFile file = 0; FILE *ufile = 0; if (uhdrname && uimgname) { if (isCompressed) { file = gzopen(uhdrname, "wb"); } else { ufile = fopen(uhdrname, NIFTI_FILE_MODE); } } if (!file && !ufile) { delete [] hdrname; delete [] imgname; this->SetErrorCode(vtkErrorCode::CannotOpenFileError); return 0; } this->InvokeEvent(vtkCommand::StartEvent); this->UpdateProgress(0.0); // write the header size_t bytesWritten = 0; if (isCompressed) { unsigned int hsize = static_cast(hdrsize); int code = gzwrite(file, hdrptr, hsize); bytesWritten = (code < 0 ? 0 : code); } else { bytesWritten = fwrite(hdrptr, 1, hdrsize, ufile); } if (bytesWritten < hdrsize) { this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError); } if (singleFile && !this->ErrorCode) { // write the padding between the header and the image to the .nii file size_t padsize = (static_cast(this->OwnHeader->GetVoxOffset()) - hdrsize); char *padding = new char[padsize]; memset(padding, '\0', padsize); if (isCompressed) { int code = gzwrite(file, padding, static_cast(padsize)); bytesWritten = (code < 0 ? 0 : code); } else { bytesWritten = fwrite(padding, 1, padsize, ufile); } delete [] padding; if (bytesWritten < padsize) { this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError); } } else if (!this->ErrorCode) { // close the .hdr file and open the .img file if (isCompressed) { gzclose(file); file = gzopen(uimgname, "wb"); } else { fclose(ufile); ufile = fopen(uimgname, NIFTI_FILE_MODE); } } if (!file && !ufile) { vtkErrorMacro("Cannot open file " << imgname); this->SetErrorCode(vtkErrorCode::CannotOpenFileError); } // write the image unsigned char *dataPtr = static_cast(data->GetScalarPointer()); // check if planar RGB is applicable (Analyze only) bool planarRGB = (this->PlanarRGB && (this->OwnHeader->GetDataType() == NIFTI_TYPE_RGB24 || this->OwnHeader->GetDataType() == NIFTI_TYPE_RGBA32)); int scalarSize = data->GetScalarSize(); int numComponents = data->GetNumberOfScalarComponents(); int outSizeX = static_cast(this->OwnHeader->GetDim(1)); int outSizeY = static_cast(this->OwnHeader->GetDim(2)); int outSizeZ = static_cast(this->OwnHeader->GetDim(3)); int timeDim = static_cast(this->OwnHeader->GetDim(4)); int vectorDim = static_cast(this->OwnHeader->GetDim(5)); // for counting, include timeDim in vectorDim vectorDim *= timeDim; z_off_t fileVoxelIncr = scalarSize*numComponents/vectorDim; int planarSize = 1; if (planarRGB) { planarSize = numComponents/vectorDim; fileVoxelIncr = scalarSize; } // add a buffer for planar-vector to packed-vector conversion unsigned char *rowBuffer = 0; if (vectorDim > 1 || planarRGB || swapBytes) { rowBuffer = new unsigned char[outSizeX*fileVoxelIncr]; } // special increment to reverse the slices if needed vtkIdType sliceOffset = 0; if (this->QFac < 0) { // put slices in reverse order sliceOffset = scalarSize*numComponents; sliceOffset *= outSizeX; sliceOffset *= outSizeY; dataPtr += sliceOffset*(outSizeZ - 1); } // special increment to handle planar RGB vtkIdType planarOffset = 0; vtkIdType planarEndOffset = 0; if (planarRGB) { planarOffset = scalarSize*numComponents; planarOffset *= outSizeX; planarOffset *= outSizeY; planarOffset -= scalarSize; planarEndOffset = planarOffset - scalarSize*(planarSize - 1); } // report progress every 2% of the way to completion vtkIdType target = static_cast(0.02*planarSize*outSizeY*outSizeZ*vectorDim) + 1; vtkIdType count = 0; // write the data one row at a time, do planar-to-packed conversion // of vector components if NIFTI file has a vector dimension int rowSize = fileVoxelIncr/scalarSize*outSizeX; int c = 0; // counter for vector components int j = 0; // counter for rows int p = 0; // counter for planes (planar RGB) int k = 0; // counter for slices int t = 0; // counter for time unsigned char *ptr = dataPtr; while (!this->AbortExecute && !this->ErrorCode) { if (vectorDim == 1 && !planarRGB && !swapBytes) { // write directly from input, instead of using a buffer rowBuffer = ptr; ptr += outSizeX*numComponents*scalarSize; } else { // create a vector plane from packed vector components unsigned char *tmpPtr = rowBuffer; z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr; for (int i = 0; i < outSizeX; i++) { // write one vector component of one voxel z_off_t nn = fileVoxelIncr; do { *tmpPtr++ = *ptr++; } while (--nn); // skip past the other components ptr += skipOther; } } if (swapBytes != 0 && scalarSize > 1) { vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize); } if (isCompressed) { int code = gzwrite(file, rowBuffer, rowSize*scalarSize); bytesWritten = (code < 0 ? 0 : code); } else { bytesWritten = fwrite(rowBuffer, scalarSize, rowSize, ufile)*scalarSize; } if (bytesWritten < static_cast(rowSize*scalarSize)) { this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError); break; } if (++count % target == 0) { this->UpdateProgress(0.02*count/target); } if (++j == outSizeY) { j = 0; // back up for next plane (R, G, or B) if planar mode ptr -= planarOffset; if (++p == planarSize) { p = 0; ptr += planarEndOffset; // advance to start of next slice ptr -= 2*sliceOffset; // for reverse slice order if (++k == outSizeZ) { k = 0; if (++t == timeDim) { t = 0; } if (++c == vectorDim) { break; } // back up the ptr to the beginning of the image, // then increment to the next vector component ptr = dataPtr + c*fileVoxelIncr*planarSize; if (timeDim > 1) { // if timeDim is included in the vectorDim (and hence in the // VTK scalar components) then we have to make sure that // the vector components are packed before the time steps ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim* fileVoxelIncr*planarSize; } } } } } if (vectorDim > 1 || swapBytes || planarRGB) { delete [] rowBuffer; } if (isCompressed) { gzclose(file); } else { fclose(ufile); } if (this->ErrorCode == vtkErrorCode::OutOfDiskSpaceError) { // erase the file, rather than leave a corrupt file on disk vtkErrorMacro("Out of disk space, removing incomplete file " << imgname); vtkDICOMFile::Remove(imgname); if (!singleFile) { vtkDICOMFile::Remove(hdrname); } } this->UpdateProgress(1.0); this->InvokeEvent(vtkCommand::EndEvent); delete [] hdrname; delete [] imgname; return 1; } vtk-dicom-0.8.12/Source/vtkNIFTIWriter.h000066400000000000000000000176761356440565500177410ustar00rootroot00000000000000/*========================================================================= Program: Visualization Toolkit Module: vtkNIFTIWriter.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkNIFTIWriter * \brief Write NIfTI-1 and NIfTI-2 medical image files * * This class writes NIFTI files, either in .nii format or as separate * .img and .hdr files. If told to write a file that ends in ".gz", * then the writer will automatically compress the file with zlib. * Images of type unsigned char that have 3 or 4 scalar components * will automatically be written as RGB or RGBA respectively. Images * of type float or double that have 2 components will automatically be * written as complex values. * * This class was contributed to VTK by the Calgary Image Processing and * Analysis Centre (CIPAC). * * \sa vtkNIFTIReader */ #ifndef vtkNIFTIWriter_h #define vtkNIFTIWriter_h #include "vtkImageWriter.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details class vtkMatrix4x4; class vtkNIFTIHeader; class VTKDICOM_EXPORT vtkNIFTIWriter : public vtkImageWriter { public: //! Endianness of output file. enum EndianEnum { BigEndian = 0, LittleEndian = 1 }; //! Static method for construction. static vtkNIFTIWriter *New(); vtkTypeMacro(vtkNIFTIWriter, vtkImageWriter); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Set the version number for the NIfTI file format to use. /*! * This can be 1, 2, or 0 (the default). If set to zero, then it * will save as NIfTI version 1 unless SetNIFTIHeader() provided * header information from a NIfTI version 2 file. */ vtkSetMacro(NIFTIVersion, int); vtkGetMacro(NIFTIVersion, int); //@} //@{ //! Set a short description (max 80 chars) of how the file was produced. vtkSetStringMacro(Description); vtkGetStringMacro(Description); //@} //@{ //! Set the time dimension to use in the NIFTI file (or zero if none). /*! * The number of components of the input data must be divisible by the time * dimension if the time dimension is not set to zero. The vector dimension * will be set to the number of components divided by the time dimension. */ vtkGetMacro(TimeDimension, int); vtkSetMacro(TimeDimension, int); vtkGetMacro(TimeSpacing, double); vtkSetMacro(TimeSpacing, double); //@} //@{ //! Set the slope and intercept for calibrating the scalar values. /*! * Other programs that read the NIFTI file can use the equation * v = u*RescaleSlope + RescaleIntercept to rescale the data to * real values. If both the slope and the intercept are zero, * then the SclSlope and SclIntercept in the header info provided * via SetNIFTIHeader() are used instead. */ vtkSetMacro(RescaleSlope, double); vtkGetMacro(RescaleSlope, double); vtkSetMacro(RescaleIntercept, double); vtkGetMacro(RescaleIntercept, double); //@} //@{ //! Write planar RGB (separate R, G, and B planes), rather than packed RGB. /*! * Use this option with extreme caution: the NIFTI standard requires RGB * pixels to be packed. The Analyze format, however, was used to store * both planar RGB and packed RGB depending on the software, without any * indication in the header about which convention was being used. */ vtkGetMacro(PlanarRGB, bool); vtkSetMacro(PlanarRGB, bool); vtkBooleanMacro(PlanarRGB, bool); //@} //@{ //! The QFac sets the ordering of the slices in the NIFTI file. /*! * If QFac is -1, then the slice ordering in the file will be reversed * as compared to VTK. Use with caution. */ vtkSetMacro(QFac, double); vtkGetMacro(QFac, double); //@} //@{ //! Set the "qform" orientation and offset for the image data. /*! * The 3x3 portion of the matrix must be orthonormal and have a * positive determinant, it will be used to compute the quaternion. * The last column of the matrix will be used for the offset. * In the NIFTI header, the qform_code will be set to 1. */ void SetQFormMatrix(vtkMatrix4x4 *); vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; } //@} //@{ //! Set a matrix for the "sform" transformation stored in the file. /*! * Unlike the qform matrix, the sform matrix can contain scaling * information. Before being stored in the NIFTI header, the * first three columns of the matrix will be multiplied by the voxel * spacing. In the NIFTI header, the sform_code will be set to 2. */ void SetSFormMatrix(vtkMatrix4x4 *); vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; } //@} //@{ //! Set the NIFTI header information to use when writing the file. /*! * The data dimensions and pixdim from the supplied header will be * ignored. Likewise, the QForm and SForm information in the supplied * header will be ignored if you have called SetQFormMatrix() or * SetSFormMatrix() to provide the orientation information for the file. */ void SetNIFTIHeader(vtkNIFTIHeader *hdr); vtkNIFTIHeader *GetNIFTIHeader(); //@} //@{ //! Set the byte order for the files (default: little endian). /*! * These methods allow the byte order of the NIFTI file to be set. * Originally, Analyze files (and NIFTI, by extension) were meant to * be written using the native endianness of the system. However, * with the overwhelming preference for little-endian architectures * on image processing workstations, defaulting to little endian * files (even on big-endian systems) provides better compatibility. */ vtkSetMacro(DataByteOrder, EndianEnum); void SetDataByteOrderToBigEndian() { this->SetDataByteOrder(BigEndian); } void SetDataByteOrderToLittleEndian() { this->SetDataByteOrder(LittleEndian); } vtkGetMacro(DataByteOrder, EndianEnum); //@} protected: vtkNIFTIWriter(); ~vtkNIFTIWriter(); //! Generate the header information for the file. int GenerateHeader(vtkInformation *info, bool singleFile); //! The main execution method, which writes the file. int RequestData(vtkInformation *request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Make a new filename by replacing extension "ext1" with "ext2". /*! * The extensions must include a period, must be three characters * long, and must be lower case. A new string is returned that must * be deleted by the caller. */ static char *ReplaceExtension( const char *fname, const char *ext1, const char *ext2); //! Time dimension to use in the file. int TimeDimension; double TimeSpacing; //! Information for rescaling data to quantitative units. double RescaleIntercept; double RescaleSlope; //! Set to -1 when VTK slice order is opposite to NIFTI slice order. double QFac; //! The orientation matrices for the NIFTI file. vtkMatrix4x4 *QFormMatrix; vtkMatrix4x4 *SFormMatrix; //! A description of how the file was produced. char *Description; //! The header information. vtkNIFTIHeader *NIFTIHeader; vtkNIFTIHeader *OwnHeader; int NIFTIVersion; //! Use planar RGB instead of the default (packed). bool PlanarRGB; //! Whether the file should be little endian. EndianEnum DataByteOrder; private: #ifdef VTK_DICOM_DELETE vtkNIFTIWriter(const vtkNIFTIWriter&) VTK_DICOM_DELETE; void operator=(const vtkNIFTIWriter&) VTK_DICOM_DELETE; #else vtkNIFTIWriter(const vtkNIFTIWriter&) = delete; void operator=(const vtkNIFTIWriter&) = delete; #endif }; #endif // vtkNIFTIWriter_h vtk-dicom-0.8.12/Source/vtkScancoCTReader.cxx000066400000000000000000001111501356440565500210040ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2015 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkScancoCTReader.h" #include "vtkObjectFactory.h" #include "vtkCommand.h" #include "vtkErrorCode.h" #include "vtkImageData.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkPointData.h" #include "vtkDataArray.h" #include "vtkStringArray.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkVersion.h" #ifdef _WIN32 // To allow use of wchar_t paths on Windows #include "vtkDICOMFilePath.h" #endif #include #include #include #include #include #include vtkStandardNewMacro(vtkScancoCTReader); //---------------------------------------------------------------------------- vtkScancoCTReader::vtkScancoCTReader() { this->InitializeHeader(); this->RawHeader = 0; // ISQ uses a lower-left-hand origin this->FileLowerLeft = true; } //---------------------------------------------------------------------------- vtkScancoCTReader::~vtkScancoCTReader() { delete [] this->RawHeader; } //---------------------------------------------------------------------------- void vtkScancoCTReader::InitializeHeader() { memset(this->Version, 0, 18); memset(this->PatientName, 0, 42); memset(this->CreationDate, 0, 32); memset(this->ModificationDate, 0, 32); this->ScanDimensionsPixels[0] = 0; this->ScanDimensionsPixels[1] = 0; this->ScanDimensionsPixels[2] = 0; this->ScanDimensionsPhysical[0] = 0; this->ScanDimensionsPhysical[1] = 0; this->ScanDimensionsPhysical[2] = 0; this->PatientIndex = 0; this->ScannerID = 0; this->SliceThickness = 0; this->SliceIncrement = 0; this->StartPosition = 0; this->EndPosition = 0; this->ZPosition = 0; this->DataRange[0] = 0; this->DataRange[1] = 0; this->MuScaling = 1.0; this->NumberOfSamples = 0; this->NumberOfProjections = 0; this->ScanDistance = 0; this->SampleTime = 0; this->ScannerType = 0; this->MeasurementIndex = 0; this->Site = 0; this->ReconstructionAlg = 0; this->ReferenceLine = 0; this->Energy = 0; this->Intensity = 0; this->RescaleType = 0; memset(this->RescaleUnits, 0, 18); memset(this->CalibrationData, 0, 66); this->RescaleSlope = 1.0; this->RescaleIntercept = 0.0; this->MuWater = 0; this->Compression = 0; } //---------------------------------------------------------------------------- void vtkScancoCTReader::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "RawHeader: " << static_cast(this->RawHeader) << "\n"; os << indent << "Version: " << this->Version << "\n"; os << indent << "CreationDate: " << this->CreationDate << "\n"; os << indent << "ModificationDate: " << this->ModificationDate << "\n"; os << indent << "PatientName: " << this->PatientName << "\n"; os << indent << "PatientIndex: " << this->PatientIndex << "\n"; os << indent << "MeasurementIndex: " << this->MeasurementIndex << "\n"; os << indent << "Site: " << this->Site << "\n"; os << indent << "ScannerID: " << this->ScannerID << "\n"; os << indent << "ScannerType: " << this->ScannerType << "\n"; os << indent << "ScanDimensionsPixels: " << this->ScanDimensionsPixels[0] << " " << this->ScanDimensionsPixels[1] << " " << this->ScanDimensionsPixels[2] << "\n"; os << indent << "ScanDimensionsPhysical: " << this->ScanDimensionsPhysical[0] << " " << this->ScanDimensionsPhysical[1] << " " << this->ScanDimensionsPhysical[2] << "\n"; os << indent << "ZPosition: " << this->ZPosition << " [mm]\n"; os << indent << "StartPosition: " << this->StartPosition << " [mm]\n"; os << indent << "EndPosition: " << this->EndPosition << " [mm]\n"; os << indent << "ReferenceLine: " << this->ReferenceLine << " [mm]\n"; os << indent << "NumberOfSamples: " << this->NumberOfSamples << "\n"; os << indent << "NumberOfProjections: " << this->NumberOfProjections << "\n"; os << indent << "ScanDistance: " << this->ScanDistance << " [mm]\n"; os << indent << "SampleTime: " << this->SampleTime << " [ms]\n"; os << indent << "SliceThickness: " << this->SliceThickness << " [mm]\n"; os << indent << "SliceIncrement: " << this->SliceIncrement << " [mm]\n"; os << indent << "ReconstructionAlg: " << this->ReconstructionAlg << "\n"; os << indent << "Energy: " << this->Energy << " [kV]\n"; os << indent << "Intensity: " << this->Intensity << " [mA]\n"; os << indent << "MuScaling: " << this->MuScaling << " [cm]\n"; os << indent << "DataRange: " << this->DataRange[0] << " " << this->DataRange[1] << "\n"; os << indent << "CalibrationData: " << this->CalibrationData << "\n"; os << indent << "RescaleType: " << this->RescaleType << "\n"; os << indent << "RescaleUnits: " << this->RescaleUnits << "\n"; os << indent << "RescaleSlope: " << this->RescaleSlope << "\n"; os << indent << "RescaleIntercept: " << this->RescaleIntercept << "\n"; os << indent << "MuWater: " << this->MuWater << " [cm^-1]\n"; } //---------------------------------------------------------------------------- int vtkScancoCTReader::CheckVersion(const char header[16]) { int fileType = 0; if (strncmp(header, "CTDATA-HEADER_V1", 16) == 0) { fileType = 1; } else if (strcmp(header, "AIMDATA_V030 ") == 0) { fileType = 3; } else { int preHeaderSize = vtkScancoCTReader::DecodeInt(header); int imageHeaderSize = vtkScancoCTReader::DecodeInt(header + 4); if (preHeaderSize == 20 && imageHeaderSize == 140) { fileType = 2; } } return fileType; } //---------------------------------------------------------------------------- int vtkScancoCTReader::CanReadFile(const char *filename) { ifstream infile(filename, ios::in | ios::binary); bool canRead = false; if (infile.good()) { // header is a 512 byte block char buffer[512]; infile.read(buffer, 512); if (!infile.bad()) { int fileType = vtkScancoCTReader::CheckVersion(buffer); canRead = (fileType > 0); } } infile.close(); return canRead; } //---------------------------------------------------------------------------- void vtkScancoCTReader::DecodeDate(const void *data, int& year, int& month, int& day, int& hour, int& minute, int& second, int& millis) { // This is the offset between the astronomical "Julian day", which counts // days since January 1, 4713BC, and the "VMS epoch", which counts from // November 17, 1858: const vtkTypeUInt64 julianOffset = 2400001; const vtkTypeUInt64 millisPerSecond = 1000; const vtkTypeUInt64 millisPerMinute = 60 * 1000; const vtkTypeUInt64 millisPerHour = 3600 * 1000; const vtkTypeUInt64 millisPerDay = 3600 * 24 * 1000; // Read the date as a long integer with units of 1e-7 seconds int d1 = vtkScancoCTReader::DecodeInt(data); int d2 = vtkScancoCTReader::DecodeInt(static_cast(data)+4); vtkTypeUInt64 tVMS = d1 + (static_cast(d2) << 32); vtkTypeUInt64 time = tVMS/10000 + julianOffset*millisPerDay; int y, m, d; int julianDay = static_cast(time / millisPerDay); time -= millisPerDay*julianDay; // Gregorian calendar starting from October 15, 1582 // This algorithm is from Henry F. Fliegel and Thomas C. Van Flandern int ell, n, i, j; ell = julianDay + 68569; n = (4 * ell) / 146097; ell = ell - (146097 * n + 3) / 4; i = (4000 * (ell + 1)) / 1461001; ell = ell - (1461 * i) / 4 + 31; j = (80 * ell) / 2447; d = ell - (2447 * j) / 80; ell = j / 11; m = j + 2 - (12 * ell); y = 100 * (n - 49) + i + ell; // Return the result year = y; month = m; day = d; hour = static_cast(time / millisPerHour); time -= hour*millisPerHour; minute = static_cast(time / millisPerMinute); time -= minute*millisPerMinute; second = static_cast(time / millisPerSecond); time -= second*millisPerSecond; millis = static_cast(time); } //---------------------------------------------------------------------------- int vtkScancoCTReader::DecodeInt(const void *data) { const unsigned char *cp = static_cast(data); return (cp[0] | (cp[1] << 8) | (cp[2] << 16) | (cp[3] << 24)); } //---------------------------------------------------------------------------- float vtkScancoCTReader::DecodeFloat(const void *data) { const unsigned char *cp = static_cast(data); // different ordering and exponent bias than IEEE 754 float union { float f; unsigned int i; } v; v.i = (cp[0] << 16) | (cp[1] << 24) | cp[2] | (cp[3] << 8); return 0.25*v.f; } //---------------------------------------------------------------------------- double vtkScancoCTReader::DecodeDouble(const void *data) { // different ordering and exponent bias than IEEE 754 double const unsigned char *cp = static_cast(data); union { double d; vtkTypeUInt64 l; } v; unsigned int l1, l2; l1 = (cp[0] << 16) | (cp[1] << 24) | cp[2] | (cp[3] << 8); l2 = (cp[4] << 16) | (cp[5] << 24) | cp[6] | (cp[7] << 8); v.l = (static_cast(l1) << 32) | l2; return v.d*0.25; } //---------------------------------------------------------------------------- // re-implement strtod() so that it always uses "C" locale, // i.e. so that it never uses "," as the decimal point. // (this implementation does not read "nan" or "infinity") double vtkScancoCTReader::StringToDouble(const char *cp, char **cpp) { while (*cp == ' ' || *cp == '\t' || *cp == '\r' || *cp == '\n' || *cp == '\v' || *cp == '\f') { cp++; } if (cpp) { char *dp = const_cast(cp); *cpp = dp; } // save the position const char *sp = cp; // read the sign if (*cp == '-' || *cp == '+') { cp++; } // read the mantissa bool digits = false; while (*cp >= '0' && *cp <= '9') { cp++; digits = true; } if (*cp == '.') { cp++; } while (*cp >= '0' && *cp <= '9') { cp++; digits = true; } if (!digits) { return 0.0; } // read the exponent if ((cp[0] == 'E' || cp[0] == 'e') && ((cp[1] >= '0' && cp[1] <= '9') || ((cp[1] == '-' || cp[1] == '+') && (cp[2] >= '0' && cp[2] <= '9')))) { cp++; if (*cp == '-' || *cp == '+') { cp++; } while (*cp >= '0' && *cp <= '9') { cp++; } } // now "dp" points to the end of the value if (cpp) { char *dp = const_cast(cp); *cpp = dp; } // convert with "C" locale std::string s(sp, cp-sp); std::istringstream istr(s); istr.imbue(std::locale::classic()); double x = 0.0; istr >> x; return x; } //---------------------------------------------------------------------------- // convert a decimal string to integer int vtkScancoCTReader::StringToInt(const char *cp, char **cpp) { while (*cp == ' ' || *cp == '\t' || *cp == '\r' || *cp == '\n' || *cp == '\v' || *cp == '\f') { cp++; } char s = *cp; if ((cp[0] == '-' || cp[0] == '+') && (cp[1] >= '0' && cp[1] <= '9')) { cp++; } unsigned int x = 0; while (*cp >= '0' && *cp <= '9') { x = x*10 + (*cp++ - '0'); } if (cpp) { char *dp = const_cast(cp); *cpp = dp; } return (s == '-' ? -static_cast(x) : static_cast(x)); } //---------------------------------------------------------------------------- void vtkScancoCTReader::StripString(char *dest, const char *cp, size_t l) { char *dp = dest; for (size_t i = 0; i < l && *cp != '\0'; i++) { *dp++ = *cp++; } while (dp != dest && dp[-1] == ' ') { dp--; } *dp = '\0'; } //---------------------------------------------------------------------------- int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead) { if (bytesRead < 512) { return 0; } char *h = this->RawHeader; vtkScancoCTReader::StripString(this->Version, h, 16); h += 16; int dataType = vtkScancoCTReader::DecodeInt(h); h += 4; /*int numBytes = vtkScancoCTReader::DecodeInt(h);*/ h += 4; /*int numBlocks = vtkScancoCTReader::DecodeInt(h);*/ h += 4; this->PatientIndex = vtkScancoCTReader::DecodeInt(h); h += 4; this->ScannerID = vtkScancoCTReader::DecodeInt(h); h += 4; int year, month, day, hour, minute, second, milli; vtkScancoCTReader::DecodeDate( h, year, month, day, hour, minute, second, milli); h += 8; int pixdim[3], physdim[3]; pixdim[0] = vtkScancoCTReader::DecodeInt(h); h += 4; pixdim[1] = vtkScancoCTReader::DecodeInt(h); h += 4; pixdim[2] = vtkScancoCTReader::DecodeInt(h); h += 4; physdim[0] = vtkScancoCTReader::DecodeInt(h); h += 4; physdim[1] = vtkScancoCTReader::DecodeInt(h); h += 4; physdim[2] = vtkScancoCTReader::DecodeInt(h); h += 4; bool isRAD = (dataType == 9 || physdim[2] == 0); if (isRAD) // RAD file { this->MeasurementIndex = vtkScancoCTReader::DecodeInt(h); h += 4; this->DataRange[0] = vtkScancoCTReader::DecodeInt(h); h += 4; this->DataRange[1] = vtkScancoCTReader::DecodeInt(h); h += 4; this->MuScaling = vtkScancoCTReader::DecodeInt(h); h += 4; vtkScancoCTReader::StripString(this->PatientName, h, 40); h += 40; this->ZPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; /* unknown */ h += 4; this->SampleTime = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->Energy = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->Intensity = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->ReferenceLine = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->EndPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; h += 88*4; } else // ISQ file or RSQ file { this->SliceThickness = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->SliceIncrement = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->EndPosition = this->StartPosition + physdim[2]*1e-3*(pixdim[2] - 1)/pixdim[2]; this->DataRange[0] = vtkScancoCTReader::DecodeInt(h); h += 4; this->DataRange[1] = vtkScancoCTReader::DecodeInt(h); h += 4; this->MuScaling = vtkScancoCTReader::DecodeInt(h); h += 4; this->NumberOfSamples = vtkScancoCTReader::DecodeInt(h); h += 4; this->NumberOfProjections = vtkScancoCTReader::DecodeInt(h); h += 4; this->ScanDistance = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->ScannerType = vtkScancoCTReader::DecodeInt(h); h += 4; this->SampleTime = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->MeasurementIndex = vtkScancoCTReader::DecodeInt(h); h += 4; this->Site = vtkScancoCTReader::DecodeInt(h); h += 4; this->ReferenceLine = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->ReconstructionAlg = vtkScancoCTReader::DecodeInt(h); h += 4; vtkScancoCTReader::StripString(this->PatientName, h, 40); h += 40; this->Energy = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; this->Intensity = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4; h += 83*4; } int dataOffset = vtkScancoCTReader::DecodeInt(h); // fix SliceThickness and SliceIncrement if they were truncated if (physdim[2] != 0) { double computedSpacing = physdim[2]*1e-3/pixdim[2]; if (fabs(computedSpacing - this->SliceThickness) < 1.1e-3) { this->SliceThickness = computedSpacing; } if (fabs(computedSpacing - this->SliceIncrement) < 1.1e-3) { this->SliceIncrement = computedSpacing; } } // Convert date information into a string month = ((month > 12 || month < 1) ? 0 : month); static const char *months[] = { "XXX", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; sprintf(this->CreationDate, "%d-%s-%d %02d:%02d:%02d.%03d", (day % 100), months[month], (year % 10000), (hour % 100), (minute % 100), (second % 100), (milli % 1000)); sprintf(this->ModificationDate, "%d-%s-%d %02d:%02d:%02d.%03d", (day % 100), months[month], (year % 10000), (hour % 100), (minute % 100), (second % 100), (milli % 1000)); this->SetDataByteOrderToLittleEndian(); this->SetFileDimensionality(3); // Perform a sanity check on the dimensions for (int i = 0; i < 3; i++) { this->ScanDimensionsPixels[i] = pixdim[i]; if (pixdim[i] < 1) { pixdim[i] = 1; } this->ScanDimensionsPhysical[i] = (isRAD ? physdim[i]*1e-6 : physdim[i]*1e-3); if (physdim[i] == 0) { physdim[i] = 1.0; } } this->SetDataExtent(0, pixdim[0]-1, 0, pixdim[1]-1, 0, pixdim[2]-1); this->SetDataOrigin(0.0, 0.0, 0.0); if (isRAD) // RAD file { this->SetDataSpacing(physdim[0]*1e-6/pixdim[0], physdim[1]*1e-6/pixdim[1], 1.0); } else { this->SetDataSpacing(physdim[0]*1e-3/pixdim[0], physdim[1]*1e-3/pixdim[1], physdim[2]*1e-3/pixdim[2]); } this->SetDataScalarType(VTK_SHORT); this->SetNumberOfScalarComponents(1); // total header size unsigned long headerSize = static_cast(dataOffset + 1)*512; this->SetHeaderSize(headerSize); // read the rest of the header if (headerSize > bytesRead) { h = new char[headerSize]; memcpy(h, this->RawHeader, bytesRead); delete [] this->RawHeader; this->RawHeader = h; file->read(h + bytesRead, headerSize - bytesRead); if (static_cast(file->gcount()) < headerSize - bytesRead) { return 0; } } // decode the extended header (lots of guesswork) if (headerSize >= 2048) { char *calHeader = 0; int calHeaderSize = 0; h = this->RawHeader + 512; unsigned long hskip = 1; char *headerName = h + 8; if (strncmp(headerName, "MultiHeader ", 16) == 0) { h += 512; hskip += 1; } unsigned long hsize = 0; for (int i = 0; i < 4; i++) { hsize = vtkScancoCTReader::DecodeInt(h + i*128 + 24); if ((1 + hskip + hsize)*512 > headerSize) { break; } headerName = h + i*128 + 8; if (strncmp(headerName, "Calibration ", 16) == 0) { calHeader = this->RawHeader + (1 + hskip)*512; calHeaderSize = hsize*512; } hskip += hsize; } if (calHeader && calHeaderSize >= 1024) { h = calHeader; vtkScancoCTReader::StripString(this->CalibrationData, h + 28, 64); // std::string calFile(h + 112, 256); // std::string s3(h + 376, 256); this->RescaleType = vtkScancoCTReader::DecodeInt(h + 632); vtkScancoCTReader::StripString(this->RescaleUnits, h + 648, 16); // std::string s5(h + 700, 16); // std::string calFilter(h + 772, 16); this->RescaleSlope = vtkScancoCTReader::DecodeDouble(h + 664); this->RescaleIntercept = vtkScancoCTReader::DecodeDouble(h + 672); this->MuWater = vtkScancoCTReader::DecodeDouble(h + 688); } } // Include conversion to linear att coeff in the rescaling if (this->MuScaling != 0) { this->RescaleSlope /= this->MuScaling; } return 1; } //---------------------------------------------------------------------------- int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead) { if (bytesRead < 160) { return 0; } char *h = this->RawHeader; int intSize = 0; unsigned long headerSize = 0; if (strcmp(h, "AIMDATA_V030 ") == 0) { // header uses 64-bit ints (8 bytes) intSize = 8; strcpy(this->Version, h); headerSize = 16; h += headerSize; } else { // header uses 32-bit ints (4 bytes) intSize = 4; strcpy(this->Version, "AIMDATA_V020 "); } // read the pre-header char *preheader = h; int preheaderSize = vtkScancoCTReader::DecodeInt(h); h += intSize; int structSize = vtkScancoCTReader::DecodeInt(h); h += intSize; int logSize = vtkScancoCTReader::DecodeInt(h); h += intSize; // read the rest of the header headerSize += preheaderSize + structSize + logSize; this->SetHeaderSize(headerSize); if (headerSize > bytesRead) { h = new char[headerSize]; memcpy(h, this->RawHeader, bytesRead); preheader = h + (preheader - this->RawHeader); delete [] this->RawHeader; this->RawHeader = h; file->read(h + bytesRead, headerSize - bytesRead); if (static_cast(file->gcount()) < headerSize - bytesRead) { return 0; } } // decode the struct header h = preheader + preheaderSize; h += 20; // not sure what these 20 bytes are for int dataType = vtkScancoCTReader::DecodeInt(h); h += 4; int structValues[21]; for (int i = 0; i < 21; i++) { structValues[i] = vtkScancoCTReader::DecodeInt(h); h += intSize; } float elementSize[3]; for (int i = 0; i < 3; i++) { elementSize[i] = vtkScancoCTReader::DecodeFloat(h); if (elementSize[i] == 0) { elementSize[i] = 1.0; } h += 4; } // number of components per pixel is 1 by default int scalarType = VTK_UNSIGNED_CHAR; int scalarComponents = 1; this->Compression = 0; // a limited selection of data types are supported // (only 0x00010001 (char) and 0x00020002 (short) are fully tested) switch (dataType) { case 0x00160001: scalarType = VTK_UNSIGNED_CHAR; break; case 0x000d0001: scalarType = VTK_UNSIGNED_CHAR; break; case 0x00120003: scalarType = VTK_UNSIGNED_CHAR; scalarComponents = 3; break; case 0x00010001: scalarType = VTK_SIGNED_CHAR; break; case 0x00060003: scalarType = VTK_SIGNED_CHAR; scalarComponents = 3; break; case 0x00170002: scalarType = VTK_UNSIGNED_SHORT; break; case 0x00020002: scalarType = VTK_SHORT; break; case 0x00030004: scalarType = VTK_INT; break; case 0x001a0004: scalarType = VTK_FLOAT; break; case 0x00150001: this->Compression = 0x00b2; // run-length compressed bits scalarType = VTK_SIGNED_CHAR; break; case 0x00080002: this->Compression = 0x00c2; // run-length compressed signed char scalarType = VTK_SIGNED_CHAR; break; case 0x00060001: this->Compression = 0x00b1; // packed bits scalarType = VTK_SIGNED_CHAR; break; default: vtkErrorMacro("Unrecognized data type in AIM file: " << dataType); return 0; } this->SetDataScalarType(scalarType); this->SetNumberOfScalarComponents(scalarComponents); this->SetDataByteOrderToLittleEndian(); this->SetFileDimensionality(3); this->SetDataExtent(0, structValues[3]-1, 0, structValues[4]-1, 0, structValues[5]-1); this->SetDataSpacing(elementSize[0], elementSize[1], elementSize[2]); // the origin will reflect the cropping of the data this->SetDataOrigin(this->DataSpacing[0]*structValues[0], this->DataSpacing[1]*structValues[1], this->DataSpacing[2]*structValues[2]); // decode the processing log h = preheader + preheaderSize + structSize; char *logEnd = h + logSize; while (h != logEnd && *h != '\0') { // skip newline and go to next line if (*h == '\n') { h++; } // search for the end of this line char *lineEnd = h; while (lineEnd != logEnd && *lineEnd != '\n' && *lineEnd != '\0') { lineEnd++; } // if not a comment, search for keys if (h != lineEnd && *h != '!' && (*lineEnd == '\n' || *lineEnd == '\0')) { // key and value are separated by multiple spaces char *key = h; while (h+1 != lineEnd && (h[0] != ' ' || h[1] != ' ')) { h++; } // this gives the length of the key size_t keylen = h - key; // skip to the end of the spaces while (h != lineEnd && *h == ' ') { h++; } // this is where the value starts char *value = h; size_t valuelen = lineEnd - value; // look for trailing spaces while (valuelen > 0 && (h[valuelen-1] == ' ' || h[valuelen-1] == '\r')) { valuelen--; } // convert into a std::string for convenience std::string skey(key, keylen); // check for known keys if (skey == "Time") { valuelen = (valuelen > 31 ? 31 : valuelen); strncpy(this->ModificationDate, value, valuelen); this->ModificationDate[valuelen] = '\0'; } else if (skey == "Original Creation-Date") { valuelen = (valuelen > 31 ? 31 : valuelen); strncpy(this->CreationDate, value, valuelen); this->CreationDate[valuelen] = '\0'; } else if (skey == "Orig-ISQ-Dim-p") { for (int i = 0; i < 3; i++) { this->ScanDimensionsPixels[i] = vtkScancoCTReader::StringToInt(value, &value); } } else if (skey == "Orig-ISQ-Dim-um") { for (int i = 0; i < 3; i++) { this->ScanDimensionsPhysical[i] = vtkScancoCTReader::StringToDouble(value, &value)*1e-3; } } else if (skey == "Patient Name") { valuelen = (valuelen > 41 ? 41 : valuelen); strncpy(this->PatientName, value, valuelen); this->PatientName[valuelen] = '\0'; } else if (skey == "Index Patient") { this->PatientIndex = vtkScancoCTReader::StringToInt(value); } else if (skey == "Index Measurement") { this->MeasurementIndex = vtkScancoCTReader::StringToInt(value); } else if (skey == "Site") { this->Site = vtkScancoCTReader::StringToInt(value); } else if (skey == "Scanner ID") { this->ScannerID = vtkScancoCTReader::StringToInt(value); } else if (skey == "Scanner type") { this->ScannerType = vtkScancoCTReader::StringToInt(value); } else if (skey == "Position Slice 1 [um]") { this->StartPosition = vtkScancoCTReader::StringToDouble(value)*1e-3; this->EndPosition = this->StartPosition + elementSize[2]*(structValues[5] - 1); } else if (skey == "No. samples") { this->NumberOfSamples = vtkScancoCTReader::StringToInt(value); } else if (skey == "No. projections per 180") { this->NumberOfProjections = vtkScancoCTReader::StringToInt(value); } else if (skey == "Scan Distance [um]") { this->ScanDistance = vtkScancoCTReader::StringToDouble(value)*1e-3; } else if (skey == "Integration time [us]") { this->SampleTime = vtkScancoCTReader::StringToDouble(value)*1e-3; } else if (skey == "Reference line [um]") { this->ReferenceLine = vtkScancoCTReader::StringToDouble(value)*1e-3; } else if (skey == "Reconstruction-Alg.") { this->ReconstructionAlg = vtkScancoCTReader::StringToInt(value); } else if (skey == "Energy [V]") { this->Energy = vtkScancoCTReader::StringToDouble(value)*1e-3; } else if (skey == "Intensity [uA]") { this->Intensity = vtkScancoCTReader::StringToDouble(value)*1e-3; } else if (skey == "Mu_Scaling") { this->MuScaling = vtkScancoCTReader::StringToInt(value); } else if (skey == "Minimum data value") { this->DataRange[0] = vtkScancoCTReader::StringToDouble(value); } else if (skey == "Maximum data value") { this->DataRange[1] = vtkScancoCTReader::StringToDouble(value); } else if (skey == "Calib. default unit type") { this->RescaleType = vtkScancoCTReader::StringToInt(value); } else if (skey == "Calibration Data") { valuelen = (valuelen > 64 ? 64 : valuelen); strncpy(this->CalibrationData, value, valuelen); this->CalibrationData[valuelen] = '\0'; } else if (skey == "Density: unit") { valuelen = (valuelen > 16 ? 16 : valuelen); strncpy(this->RescaleUnits, value, valuelen); this->RescaleUnits[valuelen] = '\0'; } else if (skey == "Density: slope") { this->RescaleSlope = vtkScancoCTReader::StringToDouble(value); } else if (skey == "Density: intercept") { this->RescaleIntercept = vtkScancoCTReader::StringToDouble(value); } else if (skey == "HU: mu water") { this->MuWater = vtkScancoCTReader::StringToDouble(value); } } // skip to the end of the line h = lineEnd; } // Include conversion to linear att coeff in the rescaling if (this->MuScaling != 0) { this->RescaleSlope /= this->MuScaling; } // these items are not in the processing log this->SliceThickness = elementSize[2]; this->SliceIncrement = elementSize[2]; return 1; } //---------------------------------------------------------------------------- int vtkScancoCTReader::RequestInformation( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) { // Clear the error indicator. this->SetErrorCode(vtkErrorCode::NoError); this->InitializeHeader(); const char *filename = this->FileName; if (filename == 0) { vtkErrorMacro("A filename must be specified"); return 0; } vtkDebugMacro("Opening ISQ/AIM file " << filename); #if defined(_WIN32) && (_MSC_VER >= 1400) vtkDICOMFilePath fp(filename); const wchar_t *ufilename = fp.Wide(); #else const char *ufilename = filename; #endif ifstream infile(ufilename, ios::in | ios::binary); if (!infile.good()) { vtkErrorMacro("Cannot open file " << filename); this->SetErrorCode(vtkErrorCode::CannotOpenFileError); return 0; } // header is a 512 byte block delete [] this->RawHeader; this->RawHeader = new char[512]; infile.read(this->RawHeader, 512); int fileType = 0; unsigned long bytesRead = 0; if (!infile.bad()) { bytesRead = static_cast(infile.gcount()); fileType = vtkScancoCTReader::CheckVersion(this->RawHeader); } if (fileType == 0) { vtkErrorMacro(<< "Unrecognized header in " << filename); this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError); infile.close(); return 0; } int returnValue = 0; if (fileType == 1) { returnValue = this->ReadISQHeader(&infile, bytesRead); } else { returnValue = this->ReadAIMHeader(&infile, bytesRead); } infile.close(); // This code causes rescaling to Hounsfield units /* if (this->MuScaling > 0 && this->MuWater > 0) { // HU = 1000*(u - u_water)/u_water this->RescaleSlope = 1000.0/(this->MuWater * this->MuScaling); this->RescaleIntercept = -1000.0; } */ // Set the output information. vtkInformation* outInfo = outputVector->GetInformationObject(0); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, this->DataScalarType, this->NumberOfScalarComponents); outInfo->Set(vtkDataObject::SPACING(), this->DataSpacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), this->DataOrigin, 3); outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), this->DataExtent, 6); return returnValue; } //---------------------------------------------------------------------------- int vtkScancoCTReader::RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { if (this->Compression == 0) { return this->Superclass::RequestData(request, inputVector, outputVector); } // check whether the reader is in an error state if (this->GetErrorCode() != vtkErrorCode::NoError) { return 0; } // which output port did the request come from int outputPort = request->Get(vtkDemandDrivenPipeline::FROM_OUTPUT_PORT()); // for now, this reader has only one output if (outputPort > 0) { return 1; } vtkInformation* outInfo = outputVector->GetInformationObject(0); int extent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); // get the data object, allocate memory vtkImageData *data = static_cast(outInfo->Get(vtkDataObject::DATA_OBJECT())); #if VTK_MAJOR_VERSION >= 6 this->AllocateOutputData(data, outInfo, extent); #else this->AllocateOutputData(data, extent); #endif data->GetPointData()->GetScalars()->SetName("ImageFile"); const char *filename = 0; if (this->FileNames && this->FileNames->GetNumberOfValues() == 1) { filename = this->FileNames->GetValue(0); } else { filename = this->GetFileName(); } if (filename == 0) { vtkErrorMacro("A FileName must be provided"); return 0; } // get the pointer to the output unsigned char *dataPtr = static_cast(data->GetScalarPointer()); // open the file ifstream infile(filename, ios::in | ios::binary); if (!infile.good()) { vtkErrorMacro("Cannot open file " << filename); this->SetErrorCode(vtkErrorCode::CannotOpenFileError); return 0; } // seek to the data infile.seekg(this->HeaderSize); // get the size of the compressed data int intSize = 4; if (strcmp(this->Version, "AIMDATA_V030 ") == 0) { // header uses 64-bit ints (8 bytes) intSize = 8; } // Dimensions of the data int xsize = (extent[1] - extent[0] + 1); int ysize = (extent[3] - extent[2] + 1); int zsize = (extent[5] - extent[4] + 1); size_t outSize = xsize; outSize *= ysize; outSize *= zsize; // For the input (compressed) data char *input = 0; size_t size = 0; if (this->Compression == 0x00b1) { // Compute the size of the binary packed data size_t xinc = (xsize+1)/2; size_t yinc = (ysize+1)/2; size_t zinc = (zsize+1)/2; size = xinc*yinc*zinc + 1; input = new char[size]; infile.read(input, size); } else if (this->Compression == 0x00b2 || this->Compression == 0x00c2) { // Get the size of the compressed data char head[8]; infile.read(head, intSize); size = static_cast(vtkScancoCTReader::DecodeInt(head)); if (intSize == 8) { // Read the high word of a 64-bit int unsigned int high = vtkScancoCTReader::DecodeInt(head + 4); size += (static_cast(high) << 32); } input = new char[size - intSize]; size -= intSize; infile.read(input, size); } // confirm that enough data was read size_t shortread = size - infile.gcount(); if (shortread != 0) { this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError); vtkErrorMacro("File is truncated, " << shortread << " bytes are missing"); } // Close the file infile.close(); if (this->Compression == 0x00b1) { // Unpack binary data, each byte becomes a 2x2x2 block of voxels size_t xinc = (xsize+1)/2; size_t yinc = (ysize+1)/2; unsigned char v = input[size-1]; v = (v == 0 ? 0x7f : v); unsigned char bit = 0; for (int i = 0; i < zsize; i++) { bit ^= (bit & 2); for (int j = 0; j < ysize; j++) { char *inPtr = input + (i*yinc + j)*xinc; bit ^= (bit & 1); for (int k = 0; k < xsize; k++) { unsigned char c = *inPtr; *dataPtr++ = ((c >> bit) & 1)*v; inPtr += (bit & 1); bit ^= 1; } bit ^= 2; } bit ^= 4; } } else if (this->Compression == 0x00b2) { // Decompress binary run-lengths bool flip = 0; unsigned char v = input[flip]; char *inPtr = input + 2; size -= 2; if (size > 0) { do { unsigned char l = *inPtr++; if (l == 255) { l = 254; flip = !flip; } if (l > outSize) { l = static_cast(outSize); } outSize -= l; if (l > 0) { do { *dataPtr++ = v; } while (--l); } flip = !flip; v = input[flip]; } while (--size != 0 && outSize != 0); } } else if (this->Compression == 0x00c2) { // Decompress 8-bit run-lengths char *inPtr = input; size /= 2; if (size > 0) { do { unsigned char l = inPtr[0]; unsigned char v = inPtr[1]; inPtr += 2; if (l > outSize) { l = static_cast(outSize); } outSize -= l; if (l > 0) { do { *dataPtr++ = v; } while (--l); } } while (--size != 0 && outSize != 0); } } delete [] input; this->UpdateProgress(1.0); this->InvokeEvent(vtkCommand::EndEvent); return 1; } vtk-dicom-0.8.12/Source/vtkScancoCTReader.h000066400000000000000000000216251356440565500204400ustar00rootroot00000000000000/*========================================================================= Program: DICOM for VTK Copyright (c) 2015 David Gobbi All rights reserved. See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * \class vtkScancoCTReader * \brief Read SCANCO ISQ and AIM medical image files * * This class reads ISQ and AIM files, which are used for high-resolution * computed tomography. The information that it provides uses different * units as compared to the original files: all distances are given in * millimeters (instead of micrometers), times are given in milliseconds * (instead of microseconds), voltage and current given in kV and mA * (instead of volts and microamps). If the scanner was calibrated, then * the data values can be converted to calibrated units. To convert * to linear attenuation coefficients [cm^-1], simply divide the data * values by the MuScaling. To convert to density values, multiply * the data values by the RescaleSlope and add the RescaleIntercept. * To convert to Hounsfield units, multiply by 1000/(MuScaling*MuWater) * and subtract 1000. * * Created at the Calgary Image Processing and Analysis Centre (CIPAC). */ #ifndef vtkScancoCTReader_h #define vtkScancoCTReader_h #include "vtkImageReader2.h" #include "vtkDICOMModule.h" // For export macro #include "vtkDICOMConfig.h" // For configuration details //---------------------------------------------------------------------------- class VTKDICOM_EXPORT vtkScancoCTReader : public vtkImageReader2 { public: //! Static method for construction. static vtkScancoCTReader *New(); vtkTypeMacro(vtkScancoCTReader, vtkImageReader2); //! Print information about this object. void PrintSelf(ostream& os, vtkIndent indent) VTK_DICOM_OVERRIDE; //@{ //! Valid extensions for this file type. const char* GetFileExtensions() VTK_DICOM_OVERRIDE { return ".isq .rsq .rad .aim" ; } //! Return a descriptive name that might be useful in a GUI. const char* GetDescriptiveName() VTK_DICOM_OVERRIDE { return "SCANCO MicroCT"; } //@} //@{ //! Return true if this reader can read the given file. int CanReadFile(const char* filename) VTK_DICOM_OVERRIDE; //@} //@{ //! Get a string that states the version of the file header. const char *GetVersion() { return this->Version; } //! Get the patient index from the header. int GetPatientIndex() { return this->PatientIndex; } //! Get the scanner ID from the header. int GetScannerID() { return this->ScannerID; } //! Get the creation date as a string. const char *GetCreationDate() { return this->CreationDate; } //! Get the date when the data was last modified. const char *GetModificationDate() { return this->ModificationDate; } //! Get the slice thickness in millimeters. double GetSliceThickness() { return this->SliceThickness; } //! Get the slice increment in millimeters. double GetSliceIncrement() { return this->SliceIncrement; } //! Get the position of the first slice in millimeters. double GetStartPosition() { return this->StartPosition; } //! Get the position of the final slice in millimeters. double GetEndPosition() { return this->EndPosition; } //! Get the location of the edge of a locator scan. double GetZPosition() { return this->ZPosition; } //! Get the data range, as stored in the file header. vtkGetVector2Macro(DataRange, double); //! Get the scaling factor from linear attenuation [1/cm] to data values. double GetMuScaling() { return this->MuScaling; } //! Get the number of samples. int GetNumberOfSamples() { return this->NumberOfSamples; } //! Get the number of projections. int GetNumberOfProjections() { return this->NumberOfProjections; } //! Get the scan distance (in millimeters). double GetScanDistance() { return this->ScanDistance; } //! Get the scanner type, as an integer code. int GetScannerType() { return this->ScannerType; } //! Get the sample time (in milliseconds). double GetSampleTime() { return this->SampleTime; } //! Get the index measurement. int GetMeasurementIndex() { return this->MeasurementIndex; } //! Get an integer value that identifies the site on the body. int GetSite() { return this->Site; } //! Get the reference line (in millimeters). double GetReferenceLine() { return this->ReferenceLine; } //! Get an integer value that identifies the reconstruction algorithm. int GetReconstructionAlg() { return this->ReconstructionAlg; } //! Get a descriptive name for this scan. const char *GetPatientName() { return this->PatientName; } //! Get the X-ray energy (in kVp). double GetEnergy() { return this->Energy; } //! Get the X-ray intensity (in mA). double GetIntensity() { return this->Intensity; } //! Get the slope and intercept for rescaling the scalar values. /*! * These values allow calibration of the data to real values. * Use the equation v = u*RescaleSlope + RescaleIntercept. */ double GetRescaleSlope() { return this->RescaleSlope; } double GetRescaleIntercept() { return this->RescaleIntercept; } //! Get the rescale type as an integer code. int GetRescaleType() { return this->RescaleType; } //! Get the units of the data after rescaling with slope and intercept. const char *GetRescaleUnits() { return this->RescaleUnits; } //! Get the linear attenuation of water, in units of [1/cm]. double GetMuWater() { return this->MuWater; } //! Get the calibration data (energy, filtration, etc.) const char *GetCalibrationData() { return this->CalibrationData; } //! Get the full scan dimensions in pixels. vtkGetVector3Macro(ScanDimensionsPixels, int); //! Get the full scan dimensions in millimeters. vtkGetVector3Macro(ScanDimensionsPhysical, double); //! Get the raw header information (512 bytes) from the file. void *GetRawHeader() { return this->RawHeader; } //@} protected: vtkScancoCTReader(); ~vtkScancoCTReader(); //! Read the header information. int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Read the voxel data. int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) VTK_DICOM_OVERRIDE; //! Initialize the header information void InitializeHeader(); //! Read an ISQ header. int ReadISQHeader(ifstream *file, unsigned long bytesRead); //! Read AIM header. int ReadAIMHeader(ifstream *file, unsigned long bytesRead); //! Check the file header to see what type of file it is. /*! * Return values are: 0 if unrecognized, 1 if ISQ/RAD, * 2 if AIM 020, 3 if AIM 030. */ static int CheckVersion(const char header[16]); //! Convert a VMS timestamp to a calendar date. void DecodeDate(const void *data, int& year, int& month, int& day, int& hour, int& minute, int& second, int& millis); //! Convert char data to 32-bit int (little-endian). static int DecodeInt(const void *data); //! Convert char data to float (single precision). static float DecodeFloat(const void *data); //! Convert a string to a double precision value. static double StringToDouble(const char *cp, char **cpp=0); //! Convert a string to an int. static int StringToInt(const char *cp, char **cpp=0); //! Convert char data to float (double precision). static double DecodeDouble(const void *data); //! Strip a string by removing trailing whitespace. /*! * The dest must have a size of at least l+1. */ static void StripString(char *dest, const char *source, size_t l); // Header information char Version[18]; char PatientName[42]; int PatientIndex; int ScannerID; char CreationDate[32]; char ModificationDate[32]; int ScanDimensionsPixels[3]; double ScanDimensionsPhysical[3]; double SliceThickness; double SliceIncrement; double StartPosition; double EndPosition; double ZPosition; double DataRange[2]; double MuScaling; int NumberOfSamples; int NumberOfProjections; double ScanDistance; double SampleTime; int ScannerType; int MeasurementIndex; int Site; int ReconstructionAlg; double ReferenceLine; double Energy; double Intensity; int RescaleType; char RescaleUnits[18]; char CalibrationData[66]; double RescaleSlope; double RescaleIntercept; double MuWater; char *RawHeader; // The compression mode, if any. int Compression; private: #ifdef VTK_DICOM_DELETE vtkScancoCTReader(const vtkScancoCTReader&) VTK_DICOM_DELETE; void operator=(const vtkScancoCTReader&) VTK_DICOM_DELETE; #else vtkScancoCTReader(const vtkScancoCTReader&) = delete; void operator=(const vtkScancoCTReader&) = delete; #endif }; #endif // vtkScancoCTReader_h vtk-dicom-0.8.12/Testing/000077500000000000000000000000001356440565500151315ustar00rootroot00000000000000vtk-dicom-0.8.12/Testing/CMakeLists.txt000066400000000000000000000100351356440565500176700ustar00rootroot00000000000000set(TEST_SRCS TestDICOMCharacterSet.cxx TestDICOMDictionary.cxx TestDICOMFilePath.cxx TestDICOMItem.cxx TestDICOMMetaData.cxx TestDICOMSequence.cxx TestDICOMTagPath.cxx TestDICOMUtilities.cxx TestDICOMValue.cxx TestDICOMVM.cxx TestDICOMVR.cxx ) if(DEFINED VTK_MODULE_ENABLE_VTK_DICOM AND NOT DICOM_EXTERNAL_BUILD) # When building as a remote module for VTK 9 (or VTK 8.90+) vtk_add_test_cxx(vtkDICOMCxxTests TEST_NAMES NO_VALID ${TEST_SRCS}) vtk_test_cxx_executable(vtkDICOMCxxTests TEST_NAMES) elseif(Module_vtkDICOM) # When building as a remote module for older versions of VTK vtk_add_test_cxx(vtkDICOMCxxTests TEST_NAMES NO_VALID ${TEST_SRCS}) vtk_test_cxx_executable(vtkDICOMCxxTests TEST_NAMES) else() include_directories(${DICOM_INCLUDE_DIRS}) set(BASE_LIBS ${VTK_DICOM_LINK_TARGET} ${VTK_LIBS}) foreach(_src ${TEST_SRCS}) get_filename_component(_test ${_src} NAME_WE) add_executable(${_test} ${_src}) target_link_libraries(${_test} ${BASE_LIBS}) get_target_property(_pth ${_test} RUNTIME_OUTPUT_DIRECTORY) add_test(${_test} ${_pth}/${_test}) endforeach() # For VTK 9 and up, executable targets use VTK:: namespace prefix if(VTK_VERSION VERSION_LESS 8.90) set(_vtk vtk) set(_python_module_path "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") else() set(_vtk VTK::) get_target_property(_python_module_path vtkDICOMPython LIBRARY_OUTPUT_DIRECTORY) endif() if(BUILD_PYTHON_WRAPPERS) if(NOT VTK_PYTHON_EXE) get_target_property(WRAP_PYTHON_PATH ${_vtk}WrapPython LOCATION_) get_filename_component(VTK_EXE_DIR ${WRAP_PYTHON_PATH} PATH) find_program(VTK_PYTHON_EXE vtkpython "${VTK_EXE_DIR}") endif() if(NOT VTK_PYTHON_EXE) # fall back to using python rather than vtkpython find_package(PythonInterp QUIET) mark_as_advanced(PYTHON_EXECUTABLE) set(VTK_PYTHON_EXE ${PYTHON_EXECUTABLE}) endif() add_test(TestDICOMPython "${VTK_PYTHON_EXE}" "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMPython.py") if(NOT CMAKE_CONFIGURATION_TYPES) set_tests_properties(TestDICOMPython PROPERTIES ENVIRONMENT "PYTHONPATH=${_python_module_path}") endif() endif() if(BUILD_TCL_WRAPPERS) if(CMAKE_CONFIGURATION_TYPES) if(NOT VTK_TCL_EXE) get_target_property(WRAP_TCL_PATH vtkWrapTcl LOCATION_) get_filename_component(VTK_EXE_DIR ${WRAP_TCL_PATH} PATH) find_program(VTK_TCL_EXE vtk "${VTK_EXE_DIR}") endif() if(NOT VTK_TCL_EXE) # fall back to using tclsh set(VTK_TCL_EXE ${TCL_TCLSH}) endif() add_test(TestDICOMTcl "${VTK_TCL_EXE}" "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl") else() add_test(TestDICOMTcl "${TCL_TCLSH}" "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl") set_tests_properties(TestDICOMTcl PROPERTIES ENVIRONMENT "TCLLIBPATH={${VTK_DIR}/Wrapping/Tcl} {${CMAKE_LIBRARY_OUTPUT_DIRECTORY}}") endif() endif() if(BUILD_JAVA_WRAPPERS) set(_sep ":") if(WIN32) set(_sep "\\;") endif() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMJava.java.in" "${CMAKE_CURRENT_BINARY_DIR}/TestDICOMJava.java" @ONLY) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/javac_test_stamp.txt COMMAND ${JAVA_COMPILE} ${JAVAC_OPTIONS} -source ${VTK_JAVA_SOURCE_VERSION} -target ${VTK_JAVA_TARGET_VERSION} -classpath "${VTK_JAR_PATH}/vtkdicom.jar${_sep}${DICOM_BINARY_DIR}/java${_sep}${VTK_JAVA_JAR}" -sourcepath ${CMAKE_CURRENT_SOURCE_DIR} -d ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/TestDICOMJava.java COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/javac_test_stamp.txt DEPENDS vtkDICOMJavaJar "${CMAKE_CURRENT_BINARY_DIR}/TestDICOMJava.java" COMMENT "Compiling Java Tests" ) add_custom_target(DICOMJavaTests ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/javac_test_stamp.txt ${JAVA_LIBRARIES}) add_test(TestDICOMJava "${JAVA_RUNTIME}" -classpath "${VTK_JAR_PATH}/vtkdicom.jar${_sep}${DICOM_BINARY_DIR}/java${_sep}${VTK_JAVA_JAR}${_sep}${CMAKE_CURRENT_BINARY_DIR}" TestDICOMJava) endif() endif() vtk-dicom-0.8.12/Testing/TestDICOMCharacterSet.cxx000066400000000000000000000357731356440565500216600ustar00rootroot00000000000000#include "vtkDICOMValue.h" #include "vtkDICOMItem.h" #include "vtkDICOMMetaData.h" #include "vtkSmartPointer.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } // order is character set, utf-8, native encoding static const char *ClunieText[][3] = { { "ISO_IR 138", "\xd7\xa9\xd7\xa8\xd7\x95\xd7\x9f^\xd7\x93\xd7\x91\xd7\x95\xd7\xa8\xd7\x94", "\xf9\xf8\xe5\xef^\xe3\xe1\xe5\xf8\xe4" }, { "ISO_IR 144", "\xd0\x9b\xd1\x8e\xd0\xba\x63\x65\xd0\xbc\xd0\xb1yp\xd0\xb3", "\xbb\xee\xda\x63\x65\xdc\xd1yp\xd3" }, { "ISO_IR 127", "\xd9\x82\xd8\xa8\xd8\xa7\xd9\x86\xd9\x8a^\xd9\x84\xd9\x86\xd8\xb2\xd8\xa7\xd8\xb1", "\xe2\xc8\xc7\xe6\xea^\xe4\xe6\xd2\xc7\xd1" }, { "ISO_IR 100", "\xc3\x84neas^R\xc3\xbc\x64iger", "\xc4neas^R\xfc\x64iger" }, { "ISO_IR 100", "Buc^J\xc3\xa9r\xc3\xb4me", "Buc^J\xe9r\xf4me" }, { "ISO_IR 126", "\xce\x94\xce\xb9\xce\xbf\xce\xbd\xcf\x85\xcf\x83\xce\xb9\xce\xbf\xcf\x82", "\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" }, { "GB18030", "Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe4\xb8\x9c=", "Wang^XiaoDong=\xcd\xf5^\xd0\xa1\xb6\xab=" }, { "GBK", "Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe4\xb8\x9c=", "Wang^XiaoDong=\xcd\xf5^\xd0\xa1\xb6\xab=" }, { "\\ISO 2022 IR 58", "1. \xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\xe6\x96\x87\xe5\xad\x97\xe3\x80\x82\r\n", "1. \x1b$)A\xb5\xda\xd2\xbb\xd0\xd0\xce\xc4\xd7\xd6\xa1\xa3\x1b(B\r\n" }, { "ISO_IR 192", "Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe6\x9d\xb1=", "Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe6\x9d\xb1=" }, { "\\ISO 2022 IR 149", "Hong^Gildong=\xe6\xb4\xaa^\xe5\x90\x89\xe6\xb4\x9e=\xed\x99\x8d^\xea\xb8\xb8\xeb\x8f\x99", "Hong^Gildong=\x1b$)C\xfb\xf3^\x1b$)C\xd1\xce\xd4\xd7=\x1b$)C\xc8\xab^\x1b$)C\xb1\xe6\xb5\xbf" }, { "ISO 2022 IR 13\\ISO 2022 IR 87", "\xef\xbe\x94\xef\xbe\x8f\xef\xbe\x80\xef\xbe\x9e^\xef\xbe\x80\xef\xbe\x9b\xef\xbd\xb3=\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e=\xe3\x82\x84\xe3\x81\xbe\xe3\x81\xa0^\xe3\x81\x9f\xe3\x82\x8d\xe3\x81\x86", "\xd4\xcf\xc0\xde^\xc0\xdb\xb3=\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J=\x1b$B$d$^$@\x1b(J^\x1b$B$\x3f$m$&\x1b(J" }, { "\\ISO 2022 IR 87", "Yamada^Tarou=\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e=\xe3\x82\x84\xe3\x81\xbe\xe3\x81\xa0^\xe3\x81\x9f\xe3\x82\x8d\xe3\x81\x86", "Yamada^Tarou=\x1b$B;3ED\x1b(B^\x1b$BB@O:\x1b(B=\x1b$B$d$^$@\x1b(B^\x1b$B$\x3f$m$&\x1b(B" }, { 0, 0, 0 } }; // order is character set, utf-8, native encoding static const char *OtherText[][3] = { { "GB18030", "Linear1: \xc2\x80 to \xef\xbf\xbd\n" "Linear2: \xf0\x90\x80\x80 to \xf4\x8f\xbf\xbf\n", "Linear1: \x81\x30\x81\x30 to \x84\x31\xa4\x37\n" "Linear2: \x90\x30\x81\x30 to \xe3\x32\x9a\x35\n" }, { "ISO 2022 IR 13\\ISO 2022 IR 87\\ISO 2022 IR 159", "JISX0208: \xe5\x85\x83\xe6\xb0\x97\n" "JISX0212: \xe9\xa8\x8f\xe9\xa9\x8e\n" "JISX0201: \xef\xbd\xba\xef\xbe\x9d\xef\xbe\x86\xef\xbe\x81\xef\xbe\x8a\n", "JISX0208: \x1b$B855$\x1b(J\n" "JISX0212: \x1b$BqV\x1b$(DiQ\x1b(J\n" "JISX0201: \xba\xdd\xc6\xc1\xca\n" }, { "iso-2022-jp-2", "JISX0208: \xe5\x85\x83\xe6\xb0\x97\n" "JISX0212: \xe9\xa8\x8f\xe9\xa9\x8e\n" "Katakana: \xef\xbd\xba\xef\xbe\x9d\xef\xbe\x86\xef\xbe\x81\xef\xbe\x8a\n" "Chinese: \xe5\xbc\x80\xe5\x8f\x91\n" "Korean: \xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94\n" "French: Tr\xc3\xa8s bien\n" "Greek: \xce\xbc\xce\xb5\xce\xb3\xce\xac\xce\xbb\xce\xb7\n", "JISX0208: \x1b$B855$\x1b(B\n" "JISX0212: \x1b$BqV\x1b$(DiQ\x1b(B\n" "Katakana: \x1b(I:]FAJ\x1b(B\n" "Chinese: \x1b$A?*7\"\x1b(B\n" "Korean: \x1b$(C>H3gGO< 0 ? argv[0] : "TestDICOMCharacterSet"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; { // test the listed encodings for (int i = 0; ClunieText[i][0] != 0; i++) { std::string name = ClunieText[i][0]; std::string utf = ClunieText[i][1]; std::string raw = ClunieText[i][2]; vtkDICOMCharacterSet cs(name); std::string s = cs.ToUTF8(raw); TestAssert(s == utf); std::string t = cs.FromUTF8(utf); if (name == "\\ISO 2022 IR 58" || name == "\\ISO 2022 IR 149") { // escape codes are placed differently, so just check round-trip std::string u = cs.ToUTF8(t); TestAssert(u == utf); } else { TestAssert(t == raw); } } for (int i = 0; OtherText[i][0] != 0; i++) { std::string name = OtherText[i][0]; std::string utf = OtherText[i][1]; std::string raw = OtherText[i][2]; vtkDICOMCharacterSet cs(name); std::string s = cs.ToUTF8(raw); // if (s != utf) { cout << i << "\n" << s << "\n" << utf << "\n"; } TestAssert(s == utf); std::string t = cs.FromUTF8(utf); if (name != "iso-2022-jp-2") { TestAssert(t == raw); } } } { // test storing values in their native encoding in an item for (int i = 0; ClunieText[i][0] != 0; i++) { std::string name = ClunieText[i][0]; std::string utf = ClunieText[i][1]; std::string raw = ClunieText[i][2]; vtkDICOMItem item; item.Set(DC::SpecificCharacterSet, name); item.Set(DC::PatientName, raw); std::string s = item.Get(DC::PatientName).AsUTF8String(); // if (s != utf) { cout << i << "\n" << s << "\n" << utf << "\n"; } TestAssert(s == utf); std::string t = item.Get(DC::PatientName).GetUTF8String(0); // if (t != utf) { cout << i << "\n" << t << "\n" << utf << "\n"; } TestAssert(t == utf); } } { // test storing values in their native encoding in metadata for (int i = 0; ClunieText[i][0] != 0; i++) { std::string name = ClunieText[i][0]; std::string utf = ClunieText[i][1]; std::string raw = ClunieText[i][2]; vtkSmartPointer meta = vtkSmartPointer::New(); meta->Set(DC::SpecificCharacterSet, name); meta->Set(DC::PatientName, raw); std::string s = meta->Get(DC::PatientName).AsUTF8String(); // if (s != utf) { cout << i << "\n" << s << "\n" << utf << "\n"; } TestAssert(s == utf); std::string t = meta->Get(DC::PatientName).GetUTF8String(0); // if (t != utf) { cout << i << "\n" << t << "\n" << utf << "\n"; } TestAssert(t == utf); } } { // test storing multiple values in their native encoding in metadata for (int i = 0; ClunieText[i][0] != 0; i++) { std::string name = ClunieText[i][0]; std::string utf = ClunieText[i][1]; std::string raw = ClunieText[i][2]; vtkSmartPointer meta = vtkSmartPointer::New(); meta->SetNumberOfInstances(2); meta->Set(DC::SpecificCharacterSet, name); meta->Set(0, DC::PatientName, "Doe^John"); meta->Set(1, DC::PatientName, raw); std::string s = meta->Get(1, DC::PatientName).AsUTF8String(); // if (s != utf) { cout << i << "\n" << s << "\n" << utf << "\n"; } TestAssert(s == utf); } } { // test "safe" conversions for (int i = 0; ClunieText[i][0] != 0; i++) { // ToSafeUTF8 == ToUTF8 if string is already "safe" std::string name = ClunieText[i][0]; std::string raw = ClunieText[i][2]; if (raw[raw.length()-1] == '\n') { continue; } vtkDICOMCharacterSet cs(name); TestAssert(cs.ToUTF8(raw) == cs.ToSafeUTF8(raw)); } // test control codes (C0, C1, and DELETE) vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_100); TestAssert(cs.ToSafeUTF8("Hello\r\nWorld") == "Hello\\015\\012World"); TestAssert(cs.ToSafeUTF8("\201Hello World") == "\\201Hello World"); TestAssert(cs.ToSafeUTF8("Hello World\177") == "Hello World\\177"); // test convertible characters for ISO 8859 TestAssert(cs.ToSafeUTF8("\240 \377") == "\302\240 \303\277"); // test unconvertible characters for ISO 8859 cs = vtkDICOMCharacterSet::ISO_IR_109; TestAssert(cs.ToSafeUTF8("Hello \245World") == "Hello \\245World"); // test unconvertible characters for other character sets cs = vtkDICOMCharacterSet::X_CP1253; TestAssert(cs.ToSafeUTF8("Hello\251 \252") == "Hello\302\251 \\252"); } { // test for proper escaping of backslashes in GB18030 std::string name = "GB18030"; // the following string includes a multi-byte character where the // second byte has the same value as backslash std::string raw = "Wang^XiaoDong\\\xcd\xf5^\xd0\\\xb6\xab\\"; vtkDICOMItem item; item.Set(DC::SpecificCharacterSet, name); item.Set(DC::OperatorsName, raw); vtkDICOMValue v = item.Get(DC::OperatorsName); TestAssert(v.GetNumberOfValues() == 3); TestAssert(v.AsString() == raw); TestAssert(v.GetString(0) == "Wang^XiaoDong"); TestAssert(v.GetString(1) == "\xcd\xf5^\xd0\\\xb6\xab"); TestAssert(v.GetString(2) == ""); } { // test for proper escaping of backslashes in iso-2022-jp std::string name = "ISO 2022 IR 13\\ISO 2022 IR 87"; // the following string includes multi-byte characters where the // first and second bytes have the same value as backslash std::string raw = "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\" "\x1b$B\\3ED\x1b(J^\x1b$B\\\\O\\\x1b(J\\" "\x1b$B$d$^$@\x1b(J^\x1b$B$\x3f$m$&\x1b(J"; vtkDICOMItem item; item.Set(DC::SpecificCharacterSet, name); item.Set(DC::OperatorsName, raw); vtkDICOMValue v = item.Get(DC::OperatorsName); TestAssert(v.GetNumberOfValues() == 3); TestAssert(v.AsString() == raw); TestAssert(v.GetString(0) == "\xd4\xcf\xc0\xde^\xc0\xdb\xb3"); TestAssert(v.GetString(1) == "\x1b$B\\3ED\x1b(J^\x1b$B\\\\O\\\x1b(J"); TestAssert(v.GetString(2) == "\x1b$B$d$^$@\x1b(J^\x1b$B$\x3f$m$&\x1b(J"); } { // test for handling of utf-16 surrogates encoded in utf-8 vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_192; // the following string has a matched surrogate pair std::string raw = "\xed\xa1\x80\xed\xb3\x8c"; // D840 DCCC // case folding causes decoding + encoding std::string cooked = cs.CaseFoldedUTF8(raw.data(), raw.length()); TestAssert(cooked == "\xf0\xa0\x83\x8c"); // 0200CC } { // test that all hangul will round-trip through EUC-KR, even the ones // that have to be encoded as 8-bytes. std::string hangul; for (unsigned int code = 0xAC00; code <= 0xD7A3; code++) { // create a long utf-8 string with all the hangul hangul.push_back(0xE0 | (code >> 12)); hangul.push_back(0x80 | ((code >> 6) & 0x3F)); hangul.push_back(0x80 | (code & 0x3F)); } vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_2022_IR_149; std::string t = cs.FromUTF8(hangul); std::string u = cs.ToUTF8(t); TestAssert(u == hangul); } { // test round-trip of JIS X 0201 through JIS X 0208 std::string jisx0201; for (unsigned char c = 0x20; c < 0x7f; c++) { jisx0201.push_back(static_cast(c)); } for (unsigned char c = 0xa1; c <= 0xdf; c++) { jisx0201.push_back(static_cast(c)); } vtkDICOMCharacterSet cs1 = vtkDICOMCharacterSet::ISO_IR_13; vtkDICOMCharacterSet cs2 = vtkDICOMCharacterSet::ISO_2022_IR_87; std::string u = cs1.ToUTF8(jisx0201); std::string u2 = cs2.ToUTF8(cs2.FromUTF8(u)); std::string t = cs1.FromUTF8(u2); TestAssert(t == jisx0201); } { // test compatibility mappings of jouyou kanji not in jis 0208 std::string official = "\xf0\xa0\xae\x9f \xe5\xa1\xa1 \xe5\x89\x9d \xe9\xa0\xb0"; std::string compat = "\xe5\x8f\xb1 \xe5\xa1\xab \xe5\x89\xa5 \xe9\xa0\xac"; vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_2022_IR_87; std::string t = cs.FromUTF8(official); std::string s = cs.FromUTF8(compat); TestAssert(t == s); // round trip expected to fail due to compatibility mapping std::string u = cs.ToUTF8(t); TestAssert(u == compat); } { // test round trip of single-byte character sets within valid ranges const char *sets[] = { "ISO_IR 13", "\x01\x7f,\xa0\xdf,", "ISO_IR 100", "\x01\x7f,\xa0\xff,", "ISO_IR 101", "\x01\x7f,\xa0\xff,", "ISO_IR 109", "\x01\x7f,\xa0\xa4,\xa6\xad,\xaf\xbd,\xbf\xc2,\xc4\xcf," "\xd1\xe2,\xe4\xef,\xf1\xff,", "ISO_IR 110", "\x01\x7f,\xa0\xff,", "ISO_IR 144", "\x01\x7f,\xa0\xff,", "ISO_IR 127", "\x01\x7f,\xa0\xa0,\xa4\xa4,\xac\xad,\xbb\xbb,\xbf\xbf," "\xc1\xda,\xe0\xf2,", "ISO_IR 126", "\x01\x7f,\xa0\xad,\xaf\xd1,\xd3\xfe,", "ISO_IR 138", "\x01\x7f,\xa0\xa0,\xa2\xbe,\xdf\xfa,\xfd\xfe,", "ISO_IR 148", "\x01\x7f,\xa0\xff,", "LATIN6", "\x01\x7f,\xa0\xff,", "ISO_IR 166", "\x01\x7f,\xa0\xda,\xdf\xfb,", "LATIN7", "\x01\x7f,\xa0\xff,", "LATIN8", "\x01\x7f,\xa0\xff,", "LATIN9", "\x01\x7f,\xa0\xff,", "LATIN10", "\x01\x7f,\xa0\xff,", "Windows-874","\x01\xda,\xdf\xfb,", "CP1250", "\x01\xff,", "CP1251", "\x01\xff,", "CP1252", "\x01\xff,", "CP1253", "\x01\xa9,\xab\xd1,\xd3\xfe,", "CP1254", "\x01\xff,", "CP1255", "\x01\xd8,\xe0\xfa,\xfd\xfe,", "CP1256", "\x01\xff,", "CP1257", "\x01\xa0,\xa2\xa4,\xa6\xff,", "KOI8", "\x01\x7f,\x9a\x9a,\x9e\x9e,\xa3\xa4,\xa6\xa7,\xad\xae," "\xb3\xb4,\xb6\xb7,\xbd\xbe,\xbf\xff,", NULL, NULL }; for (int i = 0; sets[i]; i += 2) { std::string codes; for (const char *r = sets[i+1]; *r; r += 3) { const unsigned char *range = reinterpret_cast(r); for (int c = range[0]; c <= range[1]; c++) { codes.push_back(static_cast(c)); } } vtkDICOMCharacterSet cs(sets[i]); std::string u = cs.ToUTF8(codes); std::string t = cs.FromUTF8(u); if (t != codes) { std::cerr << "Failed round-trip for " << sets[i] << "\n"; TestAssert(t == codes); } } } return rval; } vtk-dicom-0.8.12/Testing/TestDICOMDictionary.cxx000066400000000000000000000045521356440565500214040ustar00rootroot00000000000000#include "vtkDICOMDictionary.h" #include "vtkDICOMDictEntry.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMDictionary(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMDictionary"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; // test a valid entry vtkDICOMDictEntry e = vtkDICOMDictionary::FindDictEntry(DC::Modality); std::string name = "Modality"; TestAssert(e.IsValid()); TestAssert(e.GetTag() == DC::Modality); TestAssert(e.GetVR() == vtkDICOMVR::CS); TestAssert(e.GetVM() == vtkDICOMVM::M1); TestAssert(name == e.GetName()); TestAssert(e.IsRetired() == 0); // test lookup via string e = vtkDICOMDictionary::FindDictEntry(name.c_str()); TestAssert(e.IsValid()); TestAssert(e.GetTag() == DC::Modality); TestAssert(e.GetVR() == vtkDICOMVR::CS); TestAssert(e.GetVM() == vtkDICOMVM::M1); TestAssert(name == e.GetName()); TestAssert(e.IsRetired() == 0); // test an invalid entry e = vtkDICOMDictionary::FindDictEntry(vtkDICOMTag(0x0002,0xFFFF)); TestAssert(!e.IsValid()); e = vtkDICOMDictionary::FindDictEntry("Wombat"); TestAssert(!e.IsValid()); e = vtkDICOMDictionary::FindDictEntry(""); TestAssert(!e.IsValid()); e = vtkDICOMDictEntry(); TestAssert(!e.IsValid()); // test private dictionary vtkDICOMTag ptag(0x0019,0x0004); std::string pkey = "CellSpacing"; e = vtkDICOMDictionary::FindDictEntry(ptag, "GEMS_ACQU_01"); TestAssert(e.IsValid()); TestAssert(e.GetTag() == ptag); TestAssert(e.GetVR() == vtkDICOMVR::DS); TestAssert(e.GetVM() == vtkDICOMVM::M1); TestAssert(pkey == e.GetName()); e = vtkDICOMDictionary::FindDictEntry(pkey.c_str(), "GEMS_ACQU_01"); TestAssert(e.IsValid()); TestAssert(e.GetTag() == ptag); TestAssert(e.GetVR() == vtkDICOMVR::DS); TestAssert(e.GetVM() == vtkDICOMVM::M1); TestAssert(pkey == e.GetName()); e = vtkDICOMDictionary::FindDictEntry("", "GEMS_ACQU_01"); TestAssert(!e.IsValid()); return rval; } vtk-dicom-0.8.12/Testing/TestDICOMFilePath.cxx000066400000000000000000000147001356440565500207670ustar00rootroot00000000000000#include "vtkDICOMFilePath.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMFilePath(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMFilePath"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; // Test common to all platforms { // test the constructor vtkDICOMFilePath path1("/hello/"); TestAssert(path1.AsString() == "/hello"); vtkDICOMFilePath path2("/"); TestAssert(path2.AsString() == "/"); vtkDICOMFilePath path3(""); TestAssert(path3.AsString() == ""); } { // test push and pop for absolute paths vtkDICOMFilePath path("/hello"); path.PushBack("world"); TestAssert(path.AsString() == "/hello/world"); TestAssert(path.GetBack() == "world"); path.PopBack(); path.PushBack("world/"); TestAssert(path.AsString() == "/hello/world"); TestAssert(path.GetBack() == "world"); path.PopBack(); TestAssert(path.AsString() == "/hello"); path.PushBack("/world"); TestAssert(path.AsString() == "/hello"); path.PushBack("world/"); TestAssert(path.AsString() == "/hello/world"); path.PushBack("/"); TestAssert(path.AsString() == "/hello/world"); path.PopBack(); path.PopBack(); TestAssert(path.AsString() == "/"); path.PopBack(); TestAssert(path.AsString() == "/"); TestAssert(path.IsRoot()); TestAssert(!path.IsEmpty()); } { // test push and pop for relative paths vtkDICOMFilePath path("hello"); path.PushBack("world"); TestAssert(path.AsString() == "hello/world"); TestAssert(path.GetBack() == "world"); path.PopBack(); TestAssert(path.AsString() == "hello"); path.PopBack(); TestAssert(path.AsString() == ""); path.PopBack(); TestAssert(path.AsString() == ""); TestAssert(path.IsEmpty()); TestAssert(!path.IsRoot()); } { // test join vtkDICOMFilePath path("/hello"); TestAssert(path.Join("world") == "/hello/world"); TestAssert(path.Join("/world") == "/world"); TestAssert(path.Join("/") == "/"); } { // test extension vtkDICOMFilePath path("/hello"); TestAssert(path.GetExtension() == ""); path.PushBack("world.wld"); TestAssert(path.GetExtension() == ".wld"); path.PushBack("space.tar.gz"); TestAssert(path.GetExtension() == ".gz"); path.PopExtension(); TestAssert(path.GetExtension() == ".tar"); path.PopExtension(); TestAssert(path.GetExtension() == ""); TestAssert(path.AsString() == "/hello/world.wld/space"); path.PushExtension(""); TestAssert(path.AsString() == "/hello/world.wld/space"); path.PushExtension("."); TestAssert(path.AsString() == "/hello/world.wld/space"); path.PushExtension("/"); TestAssert(path.AsString() == "/hello/world.wld/space"); path.PushExtension("./"); TestAssert(path.AsString() == "/hello/world.wld/space"); path.PushExtension(".com"); TestAssert(path.AsString() == "/hello/world.wld/space.com"); } #ifdef _WIN32 { // test the various roots TestAssert(vtkDICOMFilePath("\\").IsRoot()); TestAssert(vtkDICOMFilePath("/").IsRoot()); TestAssert(vtkDICOMFilePath("f:").IsRoot()); TestAssert(vtkDICOMFilePath("E:\\").IsRoot()); TestAssert(vtkDICOMFilePath("E:/").IsRoot()); TestAssert(vtkDICOMFilePath("\\\\server\\share").IsRoot()); TestAssert(vtkDICOMFilePath("//server/share").IsRoot()); } { // test stripping of trailing slash from root vtkDICOMFilePath path1("C:"); TestAssert(path1.AsString() == "C:"); vtkDICOMFilePath path2("C:\\"); TestAssert(path2.AsString() == "C:\\"); vtkDICOMFilePath path3("\\\\server\\share\\"); TestAssert(path3.AsString() == "\\\\server\\share"); } { // test separator vtkDICOMFilePath path1(""); path1.PushBack("hello"); path1.PushBack("there"); TestAssert(path1.AsString() == "hello/there"); vtkDICOMFilePath path2("\\"); path2.PushBack("hello"); path2.PushBack("there"); TestAssert(path2.AsString() == "\\hello\\there"); } { // test special rules for device paths vtkDICOMFilePath path1("E:\\hello"); TestAssert(path1.Join("\\") == "E:\\"); TestAssert(path1.Join("E:world") == "E:\\hello\\world"); TestAssert(path1.Join("D:world") == "D:world"); TestAssert(path1.Join("E:\\world") == "E:\\world"); vtkDICOMFilePath path2("E:"); TestAssert(path2.Join("\\world") == "E:\\world"); TestAssert(path2.Join("\\") == "E:\\"); path2.PushBack("D:"); TestAssert(path2.AsString() == "E:"); path2.PushBack("D:\\"); TestAssert(path2.AsString() == "E:"); path2.PushBack("D:\\hello"); TestAssert(path2.AsString() == "E:"); path2.PushBack("\\\\server\\share"); TestAssert(path2.AsString() == "E:"); path2.PushBack("\\hello"); TestAssert(path2.AsString() == "E:\\hello"); path2.PushBack("world"); TestAssert(path2.AsString() == "E:\\hello\\world"); } { // test UNC path names vtkDICOMFilePath path1("\\\\server\\share"); TestAssert(path1.Join("\\") == "\\"); TestAssert(path1.Join("\\dir") == "\\dir"); TestAssert(path1.Join("dir") == "\\\\server\\share\\dir"); vtkDICOMFilePath path2("//server/share"); TestAssert(path2.Join("/") == "/"); TestAssert(path2.Join("/dir") == "/dir"); TestAssert(path2.Join("dir") == "//server/share/dir"); vtkDICOMFilePath path3("//server/share/dir"); path3.PopBack(); TestAssert(path3.AsString() == "//server/share"); path3.PopBack(); TestAssert(path3.AsString() == "//server/share"); } { // test the extended prefix TestAssert(vtkDICOMFilePath("\\\\\?\\").IsRoot()); TestAssert(vtkDICOMFilePath("\\\\.\\").IsRoot()); TestAssert(vtkDICOMFilePath("\\\\\?\\D:").IsRoot()); TestAssert(vtkDICOMFilePath("\\\\\?\\D:\\").IsRoot()); TestAssert(vtkDICOMFilePath("\\\\\?\\UNC\\server\\share").IsRoot()); vtkDICOMFilePath path1("\\\\\?\\"); path1.PushBack("D:/"); TestAssert(path1.AsString() == "\\\\\?\\D:\\"); path1.PushBack("."); TestAssert(path1.AsString() == "\\\\\?\\D:\\"); path1.PushBack(".."); TestAssert(path1.AsString() == "\\\\\?\\D:\\"); path1.PushBack("hello"); TestAssert(path1.AsString() == "\\\\\?\\D:\\hello"); path1.PushBack(".."); TestAssert(path1.AsString() == "\\\\\?\\D:\\"); path1.PushBack("hello/../world/./"); TestAssert(path1.AsString() == "\\\\\?\\D:\\world"); } #endif return rval; } vtk-dicom-0.8.12/Testing/TestDICOMItem.cxx000066400000000000000000000113711356440565500201720ustar00rootroot00000000000000#include "vtkDICOMItem.h" #include "vtkDICOMMetaData.h" #include "vtkDICOMSequence.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMTagPath.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMItem(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMSequence"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkDICOMMetaData *meta = vtkDICOMMetaData::New(); // test the constructors { // default constructor vtkDICOMItem i; meta->Set(DC::ConceptNameCodeSequence, i); // try accessing it and removing it meta->Get(vtkDICOMTagPath(DC::ConceptNameCodeSequence, 0, DC::CodeMeaning)); meta->Erase(DC::ConceptNameCodeSequence); } { // low-level constructor (not for general use) vtkDICOMItem i(vtkDICOMCharacterSet::ISO_IR_101, vtkDICOMVR::US); i.Set(DC::CodeMeaning, "Whatever"); vtkDICOMCharacterSet cs = i.Get(DC::CodeMeaning).GetCharacterSet(); TestAssert(cs == vtkDICOMCharacterSet::ISO_IR_101); // check the pixel representation (the VRForXS) i.Set(DC::MappedPixelValue, 10); TestAssert(i.Get(DC::MappedPixelValue).GetVR() == vtkDICOMVR::US); } { // construct an item to be placed into a specific meta data object, // e.g. assume the same character set, pixel representation as meta data object meta->Set(DC::SpecificCharacterSet, "ISO_IR 100"); meta->Set(DC::PixelRepresentation, 1); vtkDICOMItem i = vtkDICOMItem(meta); // check that character set was inherited from meta data i.Set(DC::CodeMeaning, "Whatever"); vtkDICOMCharacterSet cs = i.Get(DC::CodeMeaning).GetCharacterSet(); TestAssert(cs == vtkDICOMCharacterSet::ISO_IR_100); // check that pixel representation was inherited from meta data i.Set(DC::MappedPixelValue, 10); TestAssert(i.Get(DC::MappedPixelValue).GetVR() == vtkDICOMVR::SS); } // test actions on an empty item { // check basic methods on an empty item vtkDICOMItem i; TestAssert(i.IsEmpty()); TestAssert(i.GetNumberOfDataElements() == 0); TestAssert(i.Begin() == i.End()); TestAssert(i.GetByteOffset() == 0); // defaults to zero TestAssert(i.IsDelimited() == true); // defaults to true TestAssert(i.FindDictEntry(DC::CodeMeaning).IsValid() == true); TestAssert(i.FindDictVR(DC::MappedPixelValue) == vtkDICOMVR::US); i.Clear(); // does nothing } { // test private tags functions on empty item vtkDICOMItem i; vtkDICOMTag ptag(0x0009,0x0011); vtkDICOMTag tag = i.ResolvePrivateTag(ptag, "GEMS_ACQU_01"); TestAssert(tag == vtkDICOMTag(0xFFFF,0xFFFF)); tag = i.ResolvePrivateTagForWriting(ptag, "GEMS_ACQU_01"); TestAssert(tag == vtkDICOMTag(0x0009,0x1011)); } { // test getting attributes from an empty item vtkDICOMItem i; TestAssert(i.Get(DC::CodeMeaning).IsValid() == false); vtkDICOMTagPath tp1 = vtkDICOMTagPath(DC::CodeMeaning); TestAssert(i.Get(tp1).IsValid() == false); vtkDICOMTagPath tp2(DC::ConceptNameCodeSequence, 0, DC::CodeMeaning); TestAssert(i.Get(tp2).IsValid() == false); } { // test setting attributes from an empty item vtkDICOMItem i; vtkDICOMTagPath tp2(DC::ConceptNameCodeSequence, 0, DC::CodeMeaning); i.Set(tp2, "Whatever"); TestAssert(i.Get(tp2).IsValid() == true); i.Clear(); vtkDICOMTagPath tp1 = vtkDICOMTagPath(DC::CodeMeaning); i.Set(tp1, "Whatever"); TestAssert(i.Get(tp1).IsValid() == true); i.Clear(); i.Set(DC::CodeMeaning, "Whatever"); TestAssert(i.Get(DC::CodeMeaning).IsValid() == true); i.Clear(); vtkDICOMTagPath tp3(DC::CodeMeaning, 0, DC::CodeMeaning); // invalid path! i.Set(tp3, "Whatever"); TestAssert(i.Get(tp3).IsValid() == false); } { // check lookup of character set for VRs that use it (will be ASCII) vtkDICOMItem i; i.Set(DC::CodeMeaning, "Hello"); vtkDICOMCharacterSet cs = i.Get(DC::CodeMeaning).GetCharacterSet(); TestAssert(cs == vtkDICOMCharacterSet::ISO_IR_6); } { // check lookup of XS being SS vs US (will be US) vtkDICOMItem i; i.Set(DC::MappedPixelValue, 10); TestAssert(i.Get(DC::MappedPixelValue).GetVR() == vtkDICOMVR::US); } { // check lookup of XS being SS vs US (will be US) vtkDICOMItem i; i.Set(DC::MappedPixelValue, 10); TestAssert(i.Get(DC::MappedPixelValue).GetVR() == vtkDICOMVR::US); } meta->Delete(); return rval; } vtk-dicom-0.8.12/Testing/TestDICOMJava.java.in000066400000000000000000000053351356440565500207040ustar00rootroot00000000000000import vtk.vtkDICOMReader; import vtk.vtkDICOMWriter; import vtk.vtkDICOMMetaData; import vtk.vtkObject; import vtk.vtkIntArray; //import vtk.vtkJavaTesting; import vtk.vtkSettings; import java.io.File; public class TestDICOMJava { public static void main(final String[] args) { // try loading the VTK libs from the VTK build directory try { String[] kits = vtkSettings.GetKits(); String vtk5libs[] = { "vtkCommonJava", "vtkFilteringJava", "vtkImagingJava", "vtkGraphicsJava", "vtkIOJava", "vtkInfovisJava" }; String vtk6libs[] = { "vtkCommonCoreJava", "vtkCommonDataModelJava", "vtkCommonExecutionModelJava", "vtkIOImageJava", "vtkIOMPIImageJava" }; int cc; for (cc = 0; cc < kits.length; cc++) { String libname = "vtk" + kits[cc] + "Java"; boolean found = false; int i; for (i = 0; i < vtk5libs.length; i++) { if (libname.equals(vtk5libs[i])) { found = true; break; } } for (i = 0; i < vtk6libs.length; i++) { if (libname.equals(vtk6libs[i])) { found = true; break; } } if (found) { Runtime.getRuntime().loadLibrary(libname); } } } catch (UnsatisfiedLinkError ee) { // try using VTK's own load function instead //vtkJavaTesting.Initialize(args, false); } // load the vtkDICOMJava lib String sep = System.getProperty("file.separator"); String lname = System.mapLibraryName("vtkDICOMJava"); String lpath = "@CMAKE_LIBRARY_OUTPUT_DIRECTORY@"; String configs[] = { "Release", "Debug", "RelWithDebInfo", "MinSizeRel", "" }; int i; for (i = 0; i < 5; i++) { String config = configs[i]; String fullpath = lpath + sep; if (config != "") { fullpath = fullpath + config + sep; } fullpath = fullpath + lname; if (new File(fullpath).exists() || config == "") { Runtime.getRuntime().load(fullpath); break; } } System.out.println("Ran the vtk-dicom Java test."); vtkDICOMReader reader = new vtkDICOMReader(); vtkDICOMWriter writer = new vtkDICOMWriter(); vtkDICOMMetaData meta = new vtkDICOMMetaData(); writer.SetInputConnection(reader.GetOutputPort()); vtkIntArray a = new vtkIntArray(); vtkObject.JAVA_OBJECT_MANAGER.deleteAll(); System.out.println("Ran the vtk-dicom Java test."); } } vtk-dicom-0.8.12/Testing/TestDICOMMetaData.cxx000066400000000000000000000473061356440565500207630ustar00rootroot00000000000000#include "vtkDICOMMetaData.h" #include "vtkDICOMValue.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMTagPath.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMMetaData(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMMetaData"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; vtkDICOMMetaData *metaData = vtkDICOMMetaData::New(); // simple test of adding and removing attributes metaData->Set(DC::Modality, "CT"); std::string modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "CT"); TestAssert(metaData->Has(DC::Modality)); TestAssert(!metaData->Has(DC::AcquisitionDateTime)); TestAssert(!metaData->Get(DC::AcquisitionDateTime).IsValid()); metaData->Set(DC::Modality, "MR"); modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "MR"); metaData->Erase(DC::Modality); TestAssert(!metaData->Has(DC::Modality)); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Erase(DC::Modality); metaData->Clear(); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Set(DC::Modality, "NM"); modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "NM"); TestAssert(metaData->GetNumberOfDataElements() == 1); metaData->Clear(); TestAssert(metaData->GetNumberOfDataElements() == 0); // test of multiple instances in a single meta data object metaData->SetNumberOfInstances(3); metaData->Set(DC::Modality, "CT"); TestAssert(metaData->Has(DC::Modality)); modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "CT"); modality = metaData->Get(0, DC::Modality).AsString(); TestAssert(modality == "CT"); modality = metaData->Get(1, DC::Modality).AsString(); TestAssert(modality == "CT"); modality = metaData->Get(2, DC::Modality).AsString(); TestAssert(modality == "CT"); metaData->Set(1, DC::Modality, "MR"); modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "CT"); modality = metaData->Get(0, DC::Modality).AsString(); TestAssert(modality == "CT"); modality = metaData->Get(1, DC::Modality).AsString(); TestAssert(modality == "MR"); modality = metaData->Get(2, DC::Modality).AsString(); TestAssert(modality == "CT"); metaData->Set(DC::Modality, "MR"); modality = metaData->Get(DC::Modality).AsString(); TestAssert(modality == "MR"); modality = metaData->Get(0, DC::Modality).AsString(); TestAssert(modality == "MR"); modality = metaData->Get(1, DC::Modality).AsString(); TestAssert(modality == "MR"); modality = metaData->Get(2, DC::Modality).AsString(); TestAssert(modality == "MR"); TestAssert(metaData->GetNumberOfDataElements() == 1); TestAssert(metaData->GetNumberOfInstances() == 3); metaData->Erase(DC::Modality); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Initialize(); TestAssert(metaData->GetNumberOfInstances() == 1); // test iterating through the data elements vtkDICOMDataElementIterator iter = metaData->Begin(); vtkDICOMDataElementIterator iterEnd = metaData->End(); TestAssert(iter == iterEnd); metaData->Set(DC::Modality, "CT"); const char *acquisitionTime = "20130126080000.000000+0700"; metaData->Set(DC::AcquisitionDateTime, acquisitionTime); iter = metaData->Begin(); iterEnd = metaData->End(); int n = metaData->GetNumberOfDataElements(); TestAssert(n == 2); for (int i = 0; i < n; i++) { if (i == 0) { TestAssert(iter->GetTag() == DC::AcquisitionDateTime); TestAssert(iter->GetVR() == vtkDICOMVR::DT); TestAssert(iter->GetValue().GetVL() == 26); TestAssert(iter->GetValue().AsString() == acquisitionTime); } else { TestAssert(iter->GetTag() == DC::Modality); TestAssert(iter->GetVR() == vtkDICOMVR::CS); TestAssert(iter->GetValue().GetVL() == 2); TestAssert(iter->GetValue().AsString() == "CT"); } ++iter; } TestAssert(iter == iterEnd); metaData->Clear(); // test iterating through the data elements with multiple instances metaData->SetNumberOfInstances(2); metaData->Set(0, DC::Modality, "CT"); metaData->Set(1, DC::Modality, "MR"); metaData->Set(DC::AcquisitionDateTime, acquisitionTime); iter = metaData->Begin(); iterEnd = metaData->End(); n = metaData->GetNumberOfDataElements(); TestAssert(n == 2); for (int i = 0; i < n; i++) { if (i == 0) { TestAssert(iter->GetTag() == DC::AcquisitionDateTime); TestAssert(iter->GetValue().AsString() == acquisitionTime); } else { // two values multiplexed together in one value TestAssert(iter->GetTag() == DC::Modality); vtkDICOMValue v = iter->GetValue(); TestAssert(v.GetNumberOfValues() == 2); const vtkDICOMValue *vp = v.GetMultiplexData(); TestAssert(vp[0].AsString() == "CT"); TestAssert(vp[1].AsString() == "MR"); } ++iter; } TestAssert(iter == iterEnd); metaData->Clear(); // test the Find() method metaData->SetNumberOfInstances(2); metaData->Set(0, DC::Modality, "CT"); metaData->Set(1, DC::Modality, "MR"); metaData->Set(DC::AcquisitionDateTime, acquisitionTime); iter = metaData->Find(DC::AcquisitionDateTime); TestAssert(iter->GetValue().AsString() == acquisitionTime); iter = metaData->Find(DC::Modality); if (iter != metaData->End()) { vtkDICOMValue v = iter->GetValue(); const vtkDICOMValue *vp = v.GetMultiplexData(); TestAssert(vp[0].AsString() == "CT"); TestAssert(vp[1].AsString() == "MR"); } iter = metaData->Find(DC::StudyDate); TestAssert(iter == metaData->End()); metaData->Clear(); // ------ // test sequence access: some miscellaneous UIDs to use const char *classUID = "1.2.840.10008.5.1.4.1.1.4"; const char *instanceUIDFormat = "1.2.840.113619.2.176.2025.4110284.7408.1276101323.%i"; char instanceUID[54]; // create the ReferencedSeriesSequence vtkDICOMSequence seq(1); // only add one item to the outer sequence for (int i = 0; i < 1; i++) { // add the first data element to the item vtkDICOMItem item(metaData); item.Set(DC::SeriesInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); // the second data element will be a nested sequence vtkDICOMSequence seq2; // add ten items to this sequence for (int j = 0; j < 10; j++) { // create a unique InstanceUID sprintf(instanceUID, instanceUIDFormat, 255+j); vtkDICOMItem item2(metaData); item2.Set(DC::ReferencedSOPClassUID, vtkDICOMValue(vtkDICOMVR::UI, classUID)); item2.Set(DC::ReferencedSOPInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, instanceUID)); seq2.AddItem(item2); } // create the ReferencedInstanceSequence from the items item.Set(DC::ReferencedInstanceSequence, seq2); // add this sequence-containing item to the original sequence seq.SetItem(i, item); } // test nested access with tag path metaData->Set(DC::ReferencedSeriesSequence, seq); vtkDICOMValue v2 = metaData->Get( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.GetCharData() != 0); if (v2.GetCharData()) { TestAssert( strcmp(v2.GetCharData(), "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0); } // test access two levels deep v2 = metaData->Get( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::ReferencedInstanceSequence, 0, DC::ReferencedSOPClassUID)); TestAssert(v2.GetCharData() != 0); if (v2.GetCharData()) { TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0); } metaData->Clear(); // ------ // test setting sequences via tagpath metaData->Set( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); for (int j = 0; j < 10; j++) { // create a unique InstanceUID sprintf(instanceUID, instanceUIDFormat, 255+j); metaData->Set( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::ReferencedInstanceSequence, j, DC::ReferencedSOPClassUID), classUID); metaData->Set( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::ReferencedInstanceSequence, j, DC::ReferencedSOPInstanceUID), instanceUID); } // test nested access with tag path v2 = metaData->Get( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.GetCharData() != 0); if (v2.GetCharData()) { TestAssert( strcmp(v2.GetCharData(), "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0); } // test access two levels deep v2 = metaData->Get( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::ReferencedInstanceSequence, 9, DC::ReferencedSOPClassUID)); TestAssert(v2.GetCharData() != 0); if (v2.GetCharData()) { TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0); } v2 = metaData->Get( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::ReferencedInstanceSequence, 8, DC::ReferencedSOPInstanceUID)); TestAssert(v2.GetCharData() != 0); if (v2.GetCharData()) { TestAssert(0 == strcmp( v2.GetCharData(), "1.2.840.113619.2.176.2025.4110284.7408.1276101323.263")); } metaData->Clear(); // ------ // test inheritance of XS=US,SS and CharacterSet // first, check default XS=US metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped), 4095); v2 = metaData->Get( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped)); TestAssert(v2.GetVR() == vtkDICOMVR::US); // next, check default CharacterSet=ISO_IR_6 metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation), "Too Hot"); v2 = metaData->Get( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation)); TestAssert(v2.GetCharacterSet() == vtkDICOMCharacterSet::ISO_IR_6); metaData->Clear(); // next, check inheritance of XS=SS metaData->Set(DC::BitsAllocated, 16); metaData->Set(DC::PixelRepresentation, 1); metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped), 4095); v2 = metaData->Get( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped)); TestAssert(v2.GetVR() == vtkDICOMVR::SS); // two levels deep metaData->Set( vtkDICOMTagPath(DC::IconImageSequence, 0, DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped), 4095); v2 = metaData->Get( vtkDICOMTagPath(DC::IconImageSequence, 0, DC::RealWorldValueMappingSequence, 0, DC::RealWorldValueLastValueMapped)); TestAssert(v2.GetVR() == vtkDICOMVR::SS); metaData->Clear(); // check inheritance of ISO_IR_100 metaData->Set(DC::SpecificCharacterSet, "ISO_IR 100"); metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation), "Too Hot"); v2 = metaData->Get( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation)); TestAssert(v2.GetCharacterSet() == vtkDICOMCharacterSet::ISO_IR_100); // override with new item-specific character set metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::SpecificCharacterSet), "\\ISO 2022 IR 149"); metaData->Set( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation), "Too Hot"); v2 = metaData->Get( vtkDICOMTagPath(DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation)); TestAssert(v2.GetCharacterSet() == vtkDICOMCharacterSet::ISO_2022_IR_149); // two levels deep metaData->Set( vtkDICOMTagPath(DC::IconImageSequence, 0, DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation), "Too Hot"); v2 = metaData->Get( vtkDICOMTagPath(DC::IconImageSequence, 0, DC::RealWorldValueMappingSequence, 0, DC::LUTExplanation)); TestAssert(v2.GetCharacterSet() == vtkDICOMCharacterSet::ISO_IR_100); metaData->Clear(); // ------ // if a non-sequence is used in a path, the call is ignored metaData->Set( vtkDICOMTagPath(DC::SeriesInstanceUID, 0, DC::SeriesInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); TestAssert(metaData->GetNumberOfDataElements() == 0); // ------ // test using a non-sequence that already exists metaData->Set(DC::SeriesInstanceUID, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"); metaData->Set( vtkDICOMTagPath(DC::SeriesInstanceUID, 0, DC::SeriesInstanceUID), vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); v2 = metaData->Get( vtkDICOMTagPath(DC::SeriesInstanceUID, 0, DC::SeriesInstanceUID)); TestAssert(!v2.IsValid()); v2 = metaData->Get(vtkDICOMTagPath(DC::SeriesInstanceUID)); if (v2.GetCharData()) { TestAssert( strcmp(v2.GetCharData(), "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0); } // test using a tag path with a private sequence metaData->Set( vtkDICOMTagPath(vtkDICOMTag(0x0009, 0x1013), 0, vtkDICOMTag(0x0009, 0x1014), 1, vtkDICOMTag(0x0009, 0x1015)), vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025")); v2 = metaData->Get( vtkDICOMTagPath(vtkDICOMTag(0x0009, 0x1013), 0, vtkDICOMTag(0x0009, 0x1014), 1, vtkDICOMTag(0x0009, 0x1015))); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025"); // make sure the "skipped" item returns nothing v2 = metaData->Get( vtkDICOMTagPath(vtkDICOMTag(0x0009, 0x1013), 0, vtkDICOMTag(0x0009, 0x1014), 0, vtkDICOMTag(0x0009, 0x1015))); TestAssert(!v2.IsValid()); metaData->Clear(); // ------ // Test setting tag paths with indices metaData->SetNumberOfInstances(3); metaData->Set(0, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), "1.2.840.113619.2.176.2025.4110284.747"); metaData->Set(2, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), "1.2.840.113619.2.176.2025.4110284.749"); v2 = metaData->Get(0, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.747"); v2 = metaData->Get(1, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(!v2.IsValid()); v2 = metaData->Get(2, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.749"); // Set without index metaData->Set( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), "1.2.840.113619.2.176.2025.4110284.747"); for (int i = 0; i < 3; i++) { v2 = metaData->Get(i, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.747"); } metaData->Clear(); // ------ // Test setting tag paths with indices after setting without indices metaData->SetNumberOfInstances(3); metaData->Set( vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), "1.2.840.113619.2.176.2025.4110284.747"); metaData->Set(1, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), vtkDICOMValue()); metaData->Set(2, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID), "1.2.840.113619.2.176.2025.4110284.749"); v2 = metaData->Get(0, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.747"); v2 = metaData->Get(1, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(!v2.IsValid()); v2 = metaData->Get(2, vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0, DC::SeriesInstanceUID)); TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.749"); metaData->Clear(); // ------ // Test setting invalid value attributes metaData->SetNumberOfInstances(3); metaData->Set(DC::Modality, "CT"); metaData->Set(DC::Modality, "MR"); TestAssert(metaData->GetNumberOfDataElements() == 1); metaData->Set(DC::Modality, vtkDICOMValue()); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Set(0, DC::Modality, vtkDICOMValue()); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Set(DC::Modality, "MR"); metaData->Set(0, DC::Modality, "CT"); TestAssert(metaData->Get(0, DC::Modality).AsString() == "CT"); TestAssert(metaData->Get(1, DC::Modality).AsString() == "MR"); TestAssert(metaData->Get(2, DC::Modality).AsString() == "MR"); metaData->Set(1, DC::Modality, vtkDICOMValue()); TestAssert(metaData->Get(0, DC::Modality).AsString() == "CT"); TestAssert(metaData->Get(1, DC::Modality).IsValid() == false); TestAssert(metaData->Get(2, DC::Modality).AsString() == "MR"); metaData->Set(0, DC::Modality, vtkDICOMValue()); metaData->Set(2, DC::Modality, vtkDICOMValue()); TestAssert(metaData->GetNumberOfDataElements() == 0); metaData->Set(0, DC::Modality, "CT"); TestAssert(metaData->Get(0, DC::Modality).AsString() == "CT"); TestAssert(metaData->Get(1, DC::Modality).IsValid() == false); TestAssert(metaData->Get(2, DC::Modality).IsValid() == false); metaData->Clear(); // ------ // Test DeepCopy metaData->SetNumberOfInstances(3); metaData->Set(DC::Modality, "CT"); metaData->Set(0, DC::Modality, "MR"); metaData->Set(DC::AcquisitionDateTime, acquisitionTime); metaData->DeepCopy(metaData); TestAssert(metaData->GetNumberOfInstances() == 3); TestAssert(metaData->GetNumberOfDataElements() == 2); vtkDICOMMetaData *mcopy = vtkDICOMMetaData::New(); mcopy->DeepCopy(metaData); metaData->DeepCopy(mcopy); mcopy->DeepCopy(metaData); metaData->DeepCopy(mcopy); mcopy->DeepCopy(metaData); TestAssert(mcopy->GetNumberOfInstances() == 3); TestAssert(mcopy->GetNumberOfDataElements() == 2); TestAssert(mcopy->Get(0, DC::Modality).AsString() == "MR"); TestAssert(mcopy->Get(1, DC::Modality).AsString() == "CT"); TestAssert(mcopy->Get( DC::AcquisitionDateTime).AsString() == acquisitionTime); mcopy->Initialize(); metaData->DeepCopy(mcopy); TestAssert(metaData->GetNumberOfInstances() == 1); TestAssert(metaData->GetNumberOfDataElements() == 0); mcopy->Delete(); metaData->Delete(); return rval; } vtk-dicom-0.8.12/Testing/TestDICOMPython.py000066400000000000000000000010001356440565500203670ustar00rootroot00000000000000#! /usr/bin/env python2 import sys import vtk import vtkDICOMPython # put everything into the vtk namespace for a in dir(vtkDICOMPython): if a[0] != '_': setattr(vtk, a, getattr(vtkDICOMPython, a)) m = vtk.vtkDICOMMetaData() if vtk.vtkVersion.GetVTKMajorVersion() < 6: sys.stderr.write("This test requires VTK 6 or higher.\n"); sys.exit(0) m.Set(vtk.vtkDICOMTag(0x0008, 0x0005), 'ISO_IR 100') v = m.Get(vtk.vtkDICOMTag(0x0008, 0x0005)) if v.AsString() != 'ISO_IR 100': sys.exit(1) vtk-dicom-0.8.12/Testing/TestDICOMSequence.cxx000066400000000000000000000133311356440565500210420ustar00rootroot00000000000000#include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include "vtkDICOMDictionary.h" #include "vtkDICOMTagPath.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } namespace { bool StringsEqual(const char *s1, const char *s2) { bool result = true; if (s1 != s2) { result = false; if (s1 != 0 && s2 != 0) { result = (strcmp(s1, s2) == 0); } } return result; } } #ifdef VTK_IN_VTK int TestDICOMSequence(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMSequence"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; // some miscellaneous UIDs to use const char *classUID = "1.2.840.10008.5.1.4.1.1.4"; const char *instanceUIDFormat = "1.2.840.113619.2.176.2025.4110284.7408.1276101323.%i"; char instanceUID[54]; // create the ReferencedSeriesSequence vtkDICOMSequence seq(1); // only add one item to the sequence for (int i = 0; i < 1; i++) { // add the first data element to the item vtkDICOMItem item; item.Set(DC::SeriesInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); // the second data element will be a nested sequence vtkDICOMSequence seq2; // add ten items to this sequence for (int j = 0; j < 10; j++) { // create a unique InstanceUID sprintf(instanceUID, instanceUIDFormat, 255+j); vtkDICOMItem item2; item2.Set(DC::ReferencedSOPClassUID, vtkDICOMValue(vtkDICOMVR::UI, classUID)); item2.Set(DC::ReferencedSOPInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, instanceUID)); seq2.AddItem(item2); } // create the ReferencedInstanceSequence from the items item.Set(DC::ReferencedInstanceSequence, seq2); // add this sequence-containing item to the original sequence seq.SetItem(i, item); } // do the tests size_t n = seq.GetNumberOfItems(); TestAssert(n == 1); // use iterator to go through the elements in each item vtkDICOMDataElementIterator iter; // use a plain old pointer to go through items in sequence const vtkDICOMItem *ip1 = seq.GetSequenceData(); // test variables bool found1 = false; bool found2 = false; int fullcount = 0; // go through the item in ReferencedSeriesSequence for (iter = ip1->Begin(); iter != ip1->End(); ++iter) { // make sure SeriesInstanceUID was found if (iter->GetTag() == DC::SeriesInstanceUID) { found1 = true; TestAssert(StringsEqual(iter->GetValue().GetCharData(), "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); } // make sure ReferencedInstanceSequence was found if (iter->GetTag() == DC::ReferencedInstanceSequence) { found2 = true; vtkDICOMDataElementIterator iter2; // get the nested sequence vtkDICOMSequence v2 = iter->GetValue(); size_t m = v2.GetNumberOfItems(); TestAssert(m == 10); // go through the 10 items in the sequence for (size_t j = 0; j < m; j++) { // check the two elements in each item const vtkDICOMItem &item = v2.GetItem(j); TestAssert(item.GetNumberOfDataElements() == 2); vtkDICOMValue v3; v3 = item.Get(DC::ReferencedSOPClassUID); TestAssert(StringsEqual(v3.GetCharData(), "1.2.840.10008.5.1.4.1.1.4")); v3 = item.Get(DC::ReferencedSOPInstanceUID); sprintf(instanceUID, instanceUIDFormat, 255+j); TestAssert(StringsEqual(v3.GetCharData(), instanceUID)); } } fullcount++; } // check that there were two elements in the ReferencedSeriesSequence item TestAssert(fullcount == 2); // check that both of the inserted elements were found TestAssert(found1); TestAssert(found2); // test direct access with GetAttributeValue vtkDICOMValue v2 = seq.Get(0, DC::SeriesInstanceUID); TestAssert(StringsEqual(v2.GetCharData(), "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); // test nested access with tag path v2 = seq.Get( 0, vtkDICOMTagPath(DC::ReferencedInstanceSequence, 0, DC::ReferencedSOPClassUID)); TestAssert(StringsEqual(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4")); // test appending to a sequence vtkDICOMSequence seq3; TestAssert(seq3.GetNumberOfItems() == 0); vtkDICOMValue val3 = seq3; TestAssert(val3.GetVR() == vtkDICOMVR::SQ); TestAssert(val3.GetVL() == 0xffffffffu); TestAssert(val3.GetNumberOfValues() == 0); for (int i = 0; i < 1; i++) { vtkDICOMItem item; item.Set(DC::SeriesInstanceUID, vtkDICOMValue(vtkDICOMVR::UI, "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239")); seq3.AddItem(item); } TestAssert(seq3.GetNumberOfItems() == 1); // previously assigned value should be unchanged TestAssert(val3.GetVR() == vtkDICOMVR::SQ); TestAssert(val3.GetVL() == 0xffffffffu); TestAssert(val3.GetNumberOfValues() == 0); // update the value val3 = seq3; TestAssert(val3.GetVR() == vtkDICOMVR::SQ); TestAssert(val3.GetVL() == 0xffffffffu); TestAssert(val3.GetNumberOfValues() == 1); seq3.Clear(); TestAssert(val3.GetVR() == vtkDICOMVR::SQ); TestAssert(val3.GetVL() == 0xffffffffu); TestAssert(val3.GetNumberOfValues() == 1); val3 = seq3; TestAssert(val3.GetVR() == vtkDICOMVR::SQ); TestAssert(val3.GetVL() == 0xffffffffu); TestAssert(val3.GetNumberOfValues() == 0); return rval; } vtk-dicom-0.8.12/Testing/TestDICOMTagPath.cxx000066400000000000000000000046441356440565500206310ustar00rootroot00000000000000#include "vtkDICOMTagPath.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMTagPath(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMTagPath"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; { // Test default constructor. vtkDICOMTagPath tp; TestAssert(tp.GetHead() == vtkDICOMTag()); TestAssert(!tp.HasTail()); } { // Test tag constructor. vtkDICOMTagPath tp(vtkDICOMTag(0x7FEE,0x0010)); TestAssert(tp.GetHead() == vtkDICOMTag(0x7FEE,0x0010)); TestAssert(!tp.HasTail()); } { // Test two tag constructor. vtkDICOMTagPath tp(vtkDICOMTag(0x0018,0x0034), 5, vtkDICOMTag(0x7FEE,0x0010)); TestAssert(tp.GetHead() == vtkDICOMTag(0x0018,0x0034)); TestAssert(tp.HasTail()); TestAssert(tp.GetIndex() == 5); TestAssert(tp.GetTail().GetHead() == vtkDICOMTag(0x7FEE,0x0010)); TestAssert(!tp.GetTail().HasTail()); } { // Test three tag constructor. vtkDICOMTagPath tp(vtkDICOMTag(0x0008,0x1115), 1, vtkDICOMTag(0x0008,0x1140), 0, vtkDICOMTag(0x0008,0x1150)); TestAssert(tp.GetHead() == vtkDICOMTag(0x0008,0x1115)); TestAssert(tp.HasTail()); TestAssert(tp.GetIndex() == 1); TestAssert(tp.GetTail().GetHead() == vtkDICOMTag(0x0008,0x1140)); TestAssert(tp.GetTail().HasTail()); TestAssert(tp.GetTail().GetTail().GetHead() == vtkDICOMTag(0x0008,0x1150)); TestAssert(!tp.GetTail().GetTail().HasTail()); } { // Test append constructor. vtkDICOMTagPath tp(vtkDICOMTag(0x0008,0x1120), 1, vtkDICOMTag(0x0008,0x1125), 0, vtkDICOMTag(0x0008,0x1115)); vtkDICOMTagPath tp2(tp, 5, vtkDICOMTag(0x0008,0x1150)); vtkDICOMTagPath tp3(vtkDICOMTag(0x0008,0x1125), 0, vtkDICOMTag(0x0008,0x1115), 5, vtkDICOMTag(0x0008,0x1150)); TestAssert(tp.GetHead() == vtkDICOMTag(0x0008,0x1120)); TestAssert(tp.HasTail()); TestAssert(tp.GetIndex() == 1); TestAssert(tp2.GetTail() == tp3); } return rval; } vtk-dicom-0.8.12/Testing/TestDICOMTcl.tcl000066400000000000000000000003221356440565500177700ustar00rootroot00000000000000package require vtk package require vtkdicom vtkDICOMMetaData meta vtkDICOMReader reader vtkDICOMWriter writer writer SetInputConnection [reader GetOutputPort] meta Delete reader Delete writer Delete exit 0 vtk-dicom-0.8.12/Testing/TestDICOMUtilities.cxx000066400000000000000000000065521356440565500212540ustar00rootroot00000000000000#include "vtkDICOMUtilities.h" #include "vtkDICOMDictionary.h" #include "vtkStringArray.h" #include "vtkSmartPointer.h" #include #include #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMUtilities(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMVM"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; typedef vtkDICOMUtilities DU; { // Test comparison of UIDs const char *uid1 = "1.2.840.113619.2.334"; const char *uid2 = "1.2.840.113619.2.334.3"; const char *uid3 = "1.2.840.113619.2.334.4"; const char *uid4 = "1.2.840.113619.2.334.12"; TestAssert(DU::CompareUIDs(uid1, uid1) == 0); TestAssert(DU::CompareUIDs(uid1, uid2) == -1); TestAssert(DU::CompareUIDs(uid2, uid3) == -1); TestAssert(DU::CompareUIDs(uid3, uid4) == -1); TestAssert(DU::CompareUIDs(uid2, uid1) == 1); TestAssert(DU::CompareUIDs(uid3, uid2) == 1); TestAssert(DU::CompareUIDs(uid4, uid3) == 1); } { // Test UID generation with 2.25 prefix std::string uid = DU::GenerateUID(DC::FrameOfReferenceUID); TestAssert(strncmp(uid.data(), "2.25.", 5) == 0); vtkSmartPointer a = vtkSmartPointer::New(); a->SetNumberOfValues(10); DU::GenerateUIDs(DC::SeriesInstanceUID, a); for (int i = 0; i < 9; i++) { TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0); } } { // Test UID generation with given prefix DU::SetUIDPrefix("1.2.840.10008."); std::string uid = DU::GenerateUID(DC::FrameOfReferenceUID); TestAssert(strncmp(uid.data(), "1.2.840.10008.", 14) == 0); vtkSmartPointer a = vtkSmartPointer::New(); a->SetNumberOfValues(10); DU::GenerateUIDs(DC::SeriesInstanceUID, a); for (int i = 0; i < 9; i++) { TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0); } } { // Test DateTime generation std::string s = DU::GenerateDateTime("-0600"); long long l = DU::ConvertDateTime(s.c_str()); std::string t = DU::GenerateDateTime(l, "-0600"); TestAssert(s == t); s = DU::GenerateDateTime(0); l = DU::ConvertDateTime(s.c_str()); t = DU::GenerateDateTime(l, 0); TestAssert(s == t); s = "20140710093855.874905-0600"; l = DU::ConvertDateTime(s.c_str()); TestAssert(l == 1405006735874905ll); } { // Test DateTime handling of DST boundaries const char *times[4] = { "20170312015959.999999", "20170312030000.000000", "20171105015959.999999", "20171105020000.000000", }; for (int i = 0; i < 4; i++) { long long l = DU::ConvertDateTime(times[i]); std::string t = DU::GenerateDateTime(l, 0); TestAssert(t.compare(0, 21, times[i]) == 0); } } { // Test packing/unpacking static const unsigned char t[4] = { 166, 95, 230, 93 }; unsigned char u[4]; unsigned int v = 1575378854; TestAssert(DU::UnpackUnsignedInt(t) == v); DU::PackUnsignedInt(v, u); TestAssert(u[0] == t[0] && u[1] == t[1] && u[2] == t[2] && u[3] == t[3]); } return rval; } vtk-dicom-0.8.12/Testing/TestDICOMVM.cxx000066400000000000000000000112131356440565500176110ustar00rootroot00000000000000#include "vtkDICOMVM.h" #include "vtkDICOMValue.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMVM(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMVM"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; { // Test default constructor. vtkDICOMVM vm; TestAssert(!vm.IsValid()); } { // Test the individual VMs vtkDICOMVM vmM1(vtkDICOMVM::M1); TestAssert(vmM1 == vtkDICOMVM::M1); TestAssert(vmM1.GetMin() == 1); TestAssert(vmM1.GetMax() == 1); TestAssert(vmM1.GetStep() == 1); vtkDICOMVM vmM1T2(vtkDICOMVM::M1T2); TestAssert(vmM1T2 == vtkDICOMVM::M1T2); TestAssert(vmM1T2.GetMin() == 1); TestAssert(vmM1T2.GetMax() == 2); TestAssert(vmM1T2.GetStep() == 1); vtkDICOMVM vmM1T3(vtkDICOMVM::M1T3); TestAssert(vmM1T3 == vtkDICOMVM::M1T3); TestAssert(vmM1T3.GetMin() == 1); TestAssert(vmM1T3.GetMax() == 3); TestAssert(vmM1T3.GetStep() == 1); vtkDICOMVM vmM1T32(vtkDICOMVM::M1T32); TestAssert(vmM1T32 == vtkDICOMVM::M1T32); TestAssert(vmM1T32.GetMin() == 1); TestAssert(vmM1T32.GetMax() == 32); TestAssert(vmM1T32.GetStep() == 1); vtkDICOMVM vmM1T99(vtkDICOMVM::M1T99); TestAssert(vmM1T99 == vtkDICOMVM::M1T99); TestAssert(vmM1T99.GetMin() == 1); TestAssert(vmM1T99.GetMax() == 99); TestAssert(vmM1T99.GetStep() == 1); vtkDICOMVM vmM1TN(vtkDICOMVM::M1TN); TestAssert(vmM1TN == vtkDICOMVM::M1TN); TestAssert(vmM1TN.GetMin() == 1); TestAssert(vmM1TN.GetMax() == -1); TestAssert(vmM1TN.GetStep() == 1); vtkDICOMVM vmM2(vtkDICOMVM::M2); TestAssert(vmM2 == vtkDICOMVM::M2); TestAssert(vmM2.GetMin() == 2); TestAssert(vmM2.GetMax() == 2); TestAssert(vmM2.GetStep() == 1); vtkDICOMVM vmM2T2N(vtkDICOMVM::M2T2N); TestAssert(vmM2T2N == vtkDICOMVM::M2T2N); TestAssert(vmM2T2N.GetMin() == 2); TestAssert(vmM2T2N.GetMax() == -1); TestAssert(vmM2T2N.GetStep() == 2); vtkDICOMVM vmM2TN(vtkDICOMVM::M2TN); TestAssert(vmM2TN == vtkDICOMVM::M2TN); TestAssert(vmM2TN.GetMin() == 2); TestAssert(vmM2TN.GetMax() == -1); TestAssert(vmM2TN.GetStep() == 1); vtkDICOMVM vmM3(vtkDICOMVM::M3); TestAssert(vmM3 == vtkDICOMVM::M3); TestAssert(vmM3.GetMin() == 3); TestAssert(vmM3.GetMax() == 3); TestAssert(vmM3.GetStep() == 1); vtkDICOMVM vmM3T3N(vtkDICOMVM::M3T3N); TestAssert(vmM3T3N == vtkDICOMVM::M3T3N); TestAssert(vmM3T3N.GetMin() == 3); TestAssert(vmM3T3N.GetMax() == -1); TestAssert(vmM3T3N.GetStep() == 3); vtkDICOMVM vmM3TN(vtkDICOMVM::M3TN); TestAssert(vmM3TN == vtkDICOMVM::M3TN); TestAssert(vmM3TN.GetMin() == 3); TestAssert(vmM3TN.GetMax() == -1); TestAssert(vmM3TN.GetStep() == 1); vtkDICOMVM vmM4(vtkDICOMVM::M4); TestAssert(vmM4 == vtkDICOMVM::M4); TestAssert(vmM4.GetMin() == 4); TestAssert(vmM4.GetMax() == 4); TestAssert(vmM4.GetStep() == 1); vtkDICOMVM vmM5(vtkDICOMVM::M5); TestAssert(vmM5 == vtkDICOMVM::M5); TestAssert(vmM5.GetMin() == 5); TestAssert(vmM5.GetMax() == 5); TestAssert(vmM5.GetStep() == 1); vtkDICOMVM vmM6(vtkDICOMVM::M6); TestAssert(vmM6 == vtkDICOMVM::M6); TestAssert(vmM6.GetMin() == 6); TestAssert(vmM6.GetMax() == 6); TestAssert(vmM6.GetStep() == 1); vtkDICOMVM vmM6TN(vtkDICOMVM::M6TN); TestAssert(vmM6TN == vtkDICOMVM::M6TN); TestAssert(vmM6TN.GetMin() == 6); TestAssert(vmM6TN.GetMax() == -1); TestAssert(vmM6TN.GetStep() == 1); vtkDICOMVM vmM8(vtkDICOMVM::M8); TestAssert(vmM8 == vtkDICOMVM::M8); TestAssert(vmM8.GetMin() == 8); TestAssert(vmM8.GetMax() == 8); TestAssert(vmM8.GetStep() == 1); vtkDICOMVM vmM9(vtkDICOMVM::M9); TestAssert(vmM9 == vtkDICOMVM::M9); TestAssert(vmM9.GetMin() == 9); TestAssert(vmM9.GetMax() == 9); TestAssert(vmM9.GetStep() == 1); vtkDICOMVM vmM16(vtkDICOMVM::M16); TestAssert(vmM16 == vtkDICOMVM::M16); TestAssert(vmM16.GetMin() == 16); TestAssert(vmM16.GetMax() == 16); TestAssert(vmM16.GetStep() == 1); vtkDICOMVM vmM24(vtkDICOMVM::M24); TestAssert(vmM24 == vtkDICOMVM::M24); TestAssert(vmM24.GetMin() == 24); TestAssert(vmM24.GetMax() == 24); TestAssert(vmM24.GetStep() == 1); vtkDICOMVM vmM256(vtkDICOMVM::M256); TestAssert(vmM256 == vtkDICOMVM::M256); TestAssert(vmM256.GetMin() == 256); TestAssert(vmM256.GetMax() == 256); TestAssert(vmM256.GetStep() == 1); } return rval; } vtk-dicom-0.8.12/Testing/TestDICOMVR.cxx000066400000000000000000000174701356440565500176310ustar00rootroot00000000000000#include "vtkDICOMVR.h" #include "vtkDICOMValue.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMVR(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMVR"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; { // Test default constructor. vtkDICOMVR vr; TestAssert(!vr.IsValid()); } { // Test the individual VRs vtkDICOMVR vrAE("AE"); TestAssert(vrAE == vtkDICOMVR::AE); TestAssert(strcmp(vrAE.GetText(), "AE") == 0); TestAssert(vrAE.GetType() == VTK_CHAR); vtkDICOMVR vrAS("AS"); TestAssert(vrAS == vtkDICOMVR::AS); TestAssert(strcmp(vrAS.GetText(), "AS") == 0); TestAssert(vrAS.GetType() == VTK_CHAR); vtkDICOMVR vrAT("AT"); TestAssert(vrAT == vtkDICOMVR::AT); TestAssert(strcmp(vrAT.GetText(), "AT") == 0); TestAssert(vrAT.GetType() == VTK_DICOM_TAG); vtkDICOMVR vrCS("CS"); TestAssert(vrCS == vtkDICOMVR::CS); TestAssert(strcmp(vrCS.GetText(), "CS") == 0); TestAssert(vrCS.GetType() == VTK_CHAR); vtkDICOMVR vrDA("DA"); TestAssert(vrDA == vtkDICOMVR::DA); TestAssert(strcmp(vrDA.GetText(), "DA") == 0); TestAssert(vrDA.GetType() == VTK_CHAR); vtkDICOMVR vrDS("DS"); TestAssert(vrDS == vtkDICOMVR::DS); TestAssert(strcmp(vrDS.GetText(), "DS") == 0); TestAssert(vrDS.GetType() == VTK_CHAR); vtkDICOMVR vrDT("DT"); TestAssert(vrDT == vtkDICOMVR::DT); TestAssert(strcmp(vrDT.GetText(), "DT") == 0); TestAssert(vrDT.GetType() == VTK_CHAR); vtkDICOMVR vrFD("FD"); TestAssert(vrFD == vtkDICOMVR::FD); TestAssert(strcmp(vrFD.GetText(), "FD") == 0); TestAssert(vrFD.GetType() == VTK_DOUBLE); vtkDICOMVR vrFL("FL"); TestAssert(vrFL == vtkDICOMVR::FL); TestAssert(strcmp(vrFL.GetText(), "FL") == 0); TestAssert(vrFL.GetType() == VTK_FLOAT); vtkDICOMVR vrIS("IS"); TestAssert(vrIS == vtkDICOMVR::IS); TestAssert(strcmp(vrIS.GetText(), "IS") == 0); TestAssert(vrIS.GetType() == VTK_CHAR); vtkDICOMVR vrLO("LO"); TestAssert(vrLO == vtkDICOMVR::LO); TestAssert(strcmp(vrLO.GetText(), "LO") == 0); TestAssert(vrLO.GetType() == VTK_CHAR); vtkDICOMVR vrLT("LT"); TestAssert(vrLT == vtkDICOMVR::LT); TestAssert(strcmp(vrLT.GetText(), "LT") == 0); TestAssert(vrLT.GetType() == VTK_CHAR); vtkDICOMVR vrOB("OB"); TestAssert(vrOB == vtkDICOMVR::OB); TestAssert(strcmp(vrOB.GetText(), "OB") == 0); TestAssert(vrOB.GetType() == VTK_UNSIGNED_CHAR); vtkDICOMVR vrOD("OD"); TestAssert(vrOD == vtkDICOMVR::OD); TestAssert(strcmp(vrOD.GetText(), "OD") == 0); TestAssert(vrOD.GetType() == VTK_DOUBLE); vtkDICOMVR vrOF("OF"); TestAssert(vrOF == vtkDICOMVR::OF); TestAssert(strcmp(vrOF.GetText(), "OF") == 0); TestAssert(vrOF.GetType() == VTK_FLOAT); vtkDICOMVR vrOL("OL"); TestAssert(vrOL == vtkDICOMVR::OL); TestAssert(strcmp(vrOL.GetText(), "OL") == 0); TestAssert(vrOL.GetType() == VTK_UNSIGNED_INT); vtkDICOMVR vrOV("OV"); TestAssert(vrOV == vtkDICOMVR::OV); TestAssert(strcmp(vrOV.GetText(), "OV") == 0); TestAssert(vrOV.GetType() == VTK_UNSIGNED_LONG_LONG); vtkDICOMVR vrOW("OW"); TestAssert(vrOW == vtkDICOMVR::OW); TestAssert(strcmp(vrOW.GetText(), "OW") == 0); TestAssert(vrOW.GetType() == VTK_UNSIGNED_SHORT); vtkDICOMVR vrPN("PN"); TestAssert(vrPN == vtkDICOMVR::PN); TestAssert(strcmp(vrPN.GetText(), "PN") == 0); TestAssert(vrPN.GetType() == VTK_CHAR); vtkDICOMVR vrSH("SH"); TestAssert(vrSH == vtkDICOMVR::SH); TestAssert(strcmp(vrSH.GetText(), "SH") == 0); TestAssert(vrSH.GetType() == VTK_CHAR); vtkDICOMVR vrSL("SL"); TestAssert(vrSL == vtkDICOMVR::SL); TestAssert(strcmp(vrSL.GetText(), "SL") == 0); TestAssert(vrSL.GetType() == VTK_INT); vtkDICOMVR vrSQ("SQ"); TestAssert(vrSQ == vtkDICOMVR::SQ); TestAssert(strcmp(vrSQ.GetText(), "SQ") == 0); TestAssert(vrSQ.GetType() == VTK_DICOM_ITEM); vtkDICOMVR vrSS("SS"); TestAssert(vrSS == vtkDICOMVR::SS); TestAssert(strcmp(vrSS.GetText(), "SS") == 0); TestAssert(vrSS.GetType() == VTK_SHORT); vtkDICOMVR vrST("ST"); TestAssert(vrST == vtkDICOMVR::ST); TestAssert(strcmp(vrST.GetText(), "ST") == 0); TestAssert(vrST.GetType() == VTK_CHAR); vtkDICOMVR vrSV("SV"); TestAssert(vrSV == vtkDICOMVR::SV); TestAssert(strcmp(vrSV.GetText(), "SV") == 0); TestAssert(vrSV.GetType() == VTK_LONG_LONG); vtkDICOMVR vrTM("TM"); TestAssert(vrTM == vtkDICOMVR::TM); TestAssert(strcmp(vrTM.GetText(), "TM") == 0); TestAssert(vrTM.GetType() == VTK_CHAR); vtkDICOMVR vrUC("UC"); TestAssert(vrUC == vtkDICOMVR::UC); TestAssert(strcmp(vrUC.GetText(), "UC") == 0); TestAssert(vrUC.GetType() == VTK_CHAR); vtkDICOMVR vrUI("UI"); TestAssert(vrUI == vtkDICOMVR::UI); TestAssert(strcmp(vrUI.GetText(), "UI") == 0); TestAssert(vrUI.GetType() == VTK_CHAR); vtkDICOMVR vrUL("UL"); TestAssert(vrUL == vtkDICOMVR::UL); TestAssert(strcmp(vrUL.GetText(), "UL") == 0); TestAssert(vrUL.GetType() == VTK_UNSIGNED_INT); vtkDICOMVR vrUN("UN"); TestAssert(vrUN == vtkDICOMVR::UN); TestAssert(strcmp(vrUN.GetText(), "UN") == 0); TestAssert(vrUN.GetType() == VTK_UNSIGNED_CHAR); vtkDICOMVR vrUR("UR"); TestAssert(vrUR == vtkDICOMVR::UR); TestAssert(strcmp(vrUR.GetText(), "UR") == 0); TestAssert(vrUR.GetType() == VTK_CHAR); vtkDICOMVR vrUS("US"); TestAssert(vrUS == vtkDICOMVR::US); TestAssert(strcmp(vrUS.GetText(), "US") == 0); TestAssert(vrUS.GetType() == VTK_UNSIGNED_SHORT); vtkDICOMVR vrUT("UT"); TestAssert(vrUT == vtkDICOMVR::UT); TestAssert(strcmp(vrUT.GetText(), "UT") == 0); TestAssert(vrUT.GetType() == VTK_CHAR); vtkDICOMVR vrUV("UV"); TestAssert(vrUV == vtkDICOMVR::UV); TestAssert(strcmp(vrUV.GetText(), "UV") == 0); TestAssert(vrUV.GetType() == VTK_UNSIGNED_LONG_LONG); } { // Test the attributes that are stored in bitfields vtkDICOMVR vrs[] = { vtkDICOMVR::XX, vtkDICOMVR::AE, vtkDICOMVR::AS, vtkDICOMVR::AT, vtkDICOMVR::CS, vtkDICOMVR::DA, vtkDICOMVR::DS, vtkDICOMVR::DT, vtkDICOMVR::FD, vtkDICOMVR::FL, vtkDICOMVR::IS, vtkDICOMVR::LO, vtkDICOMVR::LT, vtkDICOMVR::OB, vtkDICOMVR::OD, vtkDICOMVR::OF, vtkDICOMVR::OL, vtkDICOMVR::OV, vtkDICOMVR::OW, vtkDICOMVR::PN, vtkDICOMVR::SH, vtkDICOMVR::SL, vtkDICOMVR::SQ, vtkDICOMVR::SS, vtkDICOMVR::ST, vtkDICOMVR::SV, vtkDICOMVR::TM, vtkDICOMVR::UC, vtkDICOMVR::UI, vtkDICOMVR::UL, vtkDICOMVR::UN, vtkDICOMVR::UR, vtkDICOMVR::US, vtkDICOMVR::UT, vtkDICOMVR::UV, vtkDICOMVR::OX, vtkDICOMVR::XS, }; // XX AS CS DS FD IS LT OD OL OW SH SQ ST TM UI UN US UV XS // AE AT DA DT FL LO OB OF OV PN SL SS SV UC UL UR UT OS bool hasLongVL[] = { 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,1,0,1,0,0,1,1,0,1,1,0,0 }; bool hasSpecificCharacterSet[] = { 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0 }; bool hasTextValue[] = { 0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,1,1,1,0,0,1,0,1,0,0,0 }; bool hasNumericValue[] = { 0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,1,0,0 }; bool hasSingleValue[] = { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0 }; for (int i = 0; i < 37; i++) { TestAssert(hasLongVL[i] == vrs[i].HasLongVL()); TestAssert(hasSpecificCharacterSet[i] == vrs[i].HasSpecificCharacterSet()); TestAssert(hasTextValue[i] == vrs[i].HasTextValue()); TestAssert(hasNumericValue[i] == vrs[i].HasNumericValue()); TestAssert(hasSingleValue[i] == vrs[i].HasSingleValue()); } } return rval; } vtk-dicom-0.8.12/Testing/TestDICOMValue.cxx000066400000000000000000000522711356440565500203540ustar00rootroot00000000000000#include "vtkDICOMValue.h" #include "vtkDICOMSequence.h" #include "vtkDICOMItem.h" #include #include #include // macro for performing tests #define TestAssert(t) \ if (!(t)) \ { \ cout << exename << ": Assertion Failed: " << #t << "\n"; \ cout << __FILE__ << ":" << __LINE__ << "\n"; \ cout.flush(); \ rval |= 1; \ } #ifdef VTK_IN_VTK int TestDICOMValue(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { int rval = 0; const char *exename = (argc > 0 ? argv[0] : "TestDICOMValue"); // remove path portion of exename const char *cp = exename + strlen(exename); while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; } exename = cp; { // test empty value vtkDICOMValue v; TestAssert(!v.IsValid()); const char *sp = "hello"; v = vtkDICOMValue(vtkDICOMVR::SH, sp, strlen(sp)); TestAssert(v.IsValid()); v.Clear(); TestAssert(!v.IsValid()); } { // test VR and VL const char *sp = "HELLO\\THERE"; vtkDICOMValue v = vtkDICOMValue(vtkDICOMVR::CS, sp, strlen(sp)); TestAssert(v.GetVR() == vtkDICOMVR::CS); TestAssert(v.GetVL() == 12); // padded to even } { // test constructors and number of values vtkDICOMValue v; // backslash-separated values const char *sp = "HELLO\\THERE"; v = vtkDICOMValue(vtkDICOMVR::CS, sp, strlen(sp)); TestAssert(v.GetNumberOfValues() == 2); // numerical values static const double dbl[3] = { 1.0, 1.5, 1e200 }; v = vtkDICOMValue(vtkDICOMVR::FD, dbl, 3); TestAssert(v.GetNumberOfValues() == 3); TestAssert(v.GetVL() == 24); TestAssert(memcmp(v.GetDoubleData(), dbl, 24) == 0); // numerical values converted to strings static const short ssi[5] = { 1, 3, -2, 60, 13 }; v = vtkDICOMValue(vtkDICOMVR::IS, ssi, 5); TestAssert(v.GetNumberOfValues() == 5); TestAssert(v.GetVL() == 12); TestAssert(strcmp(v.GetCharData(), "1\\3\\-2\\60\\13") == 0); // string values converted to numbers static const char *flts = "1\\2.5\\-1e-5\\-4.23460975"; static const float flt[4] = { 1.0f, 2.5f, -1e-5f, -4.23460975f }; v = vtkDICOMValue(vtkDICOMVR::FL, flts, strlen(flts)); TestAssert(v.GetNumberOfValues() == 4); TestAssert(v.GetVL() == 16); TestAssert(memcmp(v.GetFloatData(), flt, 16) == 0); // string values converted to tags static const char *tagstring = "(ff00,0123)\\(0FA2,0001)"; v = vtkDICOMValue(vtkDICOMVR::AT, tagstring, strlen(tagstring)); TestAssert(v.GetNumberOfValues() == 2); TestAssert(v.GetVL() == 8); TestAssert(v.GetTag(0) == vtkDICOMTag(0xff00,0x0123)); TestAssert(v.GetTag(1) == vtkDICOMTag(0x0fa2,0x0001)); // tags constructed from enums v = vtkDICOMValue(vtkDICOMVR::AT, DC::FrameTimeVector); TestAssert(v.GetNumberOfValues() == 1); TestAssert(v.GetVL() == 4); TestAssert(v.AsTag() == vtkDICOMTag(0x0018,0x1065)); // these text VRs should always report 1 value const char *hp = "he\\llo"; size_t sl = strlen(hp); v = vtkDICOMValue(vtkDICOMVR::ST, hp, sl); TestAssert(v.GetNumberOfValues() == 1); TestAssert(v.GetVL() == 6); TestAssert(strcmp(v.GetCharData(), hp) == 0); v = vtkDICOMValue(vtkDICOMVR::LT, hp, sl); TestAssert(v.GetNumberOfValues() == 1); TestAssert(v.GetVL() == 6); TestAssert(strcmp(v.GetCharData(), hp) == 0); v = vtkDICOMValue(vtkDICOMVR::UT, hp, sl); TestAssert(v.GetNumberOfValues() == 1); TestAssert(v.GetVL() == 6); TestAssert(strcmp(v.GetCharData(), hp) == 0); // these data VRs should always report 1 value static const unsigned char uci[6] = { 1, 255, 12, 8, 9, 12 }; v = vtkDICOMValue(vtkDICOMVR::UN, uci, 6); TestAssert(v.GetNumberOfValues() == 6); TestAssert(v.GetVL() == 6); TestAssert(memcmp(v.GetUnsignedCharData(), uci, 6) == 0); v = vtkDICOMValue(vtkDICOMVR::OB, uci, 6); TestAssert(v.GetNumberOfValues() == 6); TestAssert(v.GetVL() == 6); TestAssert(memcmp(v.GetUnsignedCharData(), uci, 6) == 0); static const short data[5] = { 1, 3, -2, 60, 13 }; v = vtkDICOMValue(vtkDICOMVR::OW, data, 5); TestAssert(v.GetNumberOfValues() == 5); TestAssert(v.GetVL() == 10); TestAssert(memcmp(v.GetShortData(), data, 10) == 0); TestAssert(memcmp(v.GetUnsignedShortData(), data, 10) == 0); static const float fdata[5] = { 1.0f, 3.5f, -2.0f, 6.0f, 0.13f }; v = vtkDICOMValue(vtkDICOMVR::OF, fdata, 5); TestAssert(v.GetNumberOfValues() == 5); TestAssert(v.GetVL() == 20); TestAssert(memcmp(v.GetFloatData(), fdata, 20) == 0); } { // test getting numerical values vtkDICOMValue v; static const float flt1[2] = { 1.0f, 2.5f }; float flt2[2]; short shrt[2]; // store floats as doubles with VR=FD v = vtkDICOMValue(vtkDICOMVR::FD, flt1, 2); v.GetValues(flt2, 2, 0); TestAssert(flt1[0] == flt2[0] && flt1[1] == flt2[1]); flt2[0] = flt2[1] = 0; v.GetValues(&flt2[0], 1, 0); v.GetValues(&flt2[1], 1, 1); TestAssert(flt1[0] == flt2[0] && flt1[1] == flt2[1]); v.GetValues(shrt, 2, 0); TestAssert(static_cast(flt1[0]) == shrt[0]); TestAssert(static_cast(flt1[1]) == shrt[1]); // store floats as decimal strings with VR=DS v = vtkDICOMValue(vtkDICOMVR::DS, flt1, 2); v.GetValues(flt2, 2, 0); TestAssert(flt1[0] == flt2[0] && flt1[1] == flt2[1]); flt2[0] = flt2[1] = 0; v.GetValues(&flt2[0], 1, 0); v.GetValues(&flt2[1], 1, 1); TestAssert(flt1[0] == flt2[0] && flt1[1] == flt2[1]); v.GetValues(shrt, 2, 0); TestAssert(static_cast(flt1[0]) == shrt[0]); TestAssert(static_cast(flt1[1]) == shrt[1]); // store floats as integer strings with VR=IS v = vtkDICOMValue(vtkDICOMVR::IS, flt1, 2); v.GetValues(flt2, 2, 0); TestAssert(static_cast(static_cast(flt1[0])) == flt2[0] && static_cast(static_cast(flt1[1])) == flt2[1]); flt2[0] = flt2[1] = 0; v.GetValues(&flt2[0], 1, 0); v.GetValues(&flt2[1], 1, 1); TestAssert(static_cast(static_cast(flt1[0])) == flt2[0] && static_cast(static_cast(flt1[1])) == flt2[1]); v.GetValues(shrt, 2, 0); TestAssert(static_cast(flt1[0]) == shrt[0]); TestAssert(static_cast(flt1[1]) == shrt[1]); } { // test getting text values vtkDICOMValue v; std::string sa[2]; static const float flt1[2] = { 1.0f, 2.5f }; // store floats as doubles with VR=FD v = vtkDICOMValue(vtkDICOMVR::FD, flt1, 2); v.GetValues(sa, 2, 0); TestAssert(sa[0] == "1.0" && sa[1] == "2.5"); // store floats as text with VR=DS sa[0] = ""; sa[1] = ""; v = vtkDICOMValue(vtkDICOMVR::DS, flt1, 2); v.GetValues(sa, 2, 0); TestAssert(sa[0] == "1" && sa[1] == "2.5"); // store floats as text with VR=IS sa[0] = ""; sa[1] = ""; v = vtkDICOMValue(vtkDICOMVR::IS, flt1, 2); v.GetValues(sa, 2, 0); TestAssert(sa[0] == "1" && sa[1] == "2"); // get just the first value sa[0] = ""; sa[1] = ""; v = vtkDICOMValue(vtkDICOMVR::IS, flt1, 2); v.GetValues(sa, 1, 0); TestAssert(sa[0] == "1" && sa[1] == ""); // get just the second value sa[0] = ""; sa[1] = ""; v = vtkDICOMValue(vtkDICOMVR::IS, flt1, 2); v.GetValues(sa, 1, 1); TestAssert(sa[0] == "2" && sa[1] == ""); } { // test allowed range of decimal strings vtkDICOMValue v; static const double dbl[4] = { 1e200, -1e200, 1e-200, -1e-200 }; static const char *dblt = "9.999999999e+99\\-9.999999999e+99\\0\\0"; v = vtkDICOMValue(vtkDICOMVR::DS, dbl, 4); TestAssert(strcmp(v.GetCharData(), dblt) == 0); } { // test equality vtkDICOMValue v, u; v = vtkDICOMValue(vtkDICOMVR::CS, "hello"); u = vtkDICOMValue(vtkDICOMVR::CS, "hello"); TestAssert(u == v); v = vtkDICOMValue(vtkDICOMVR::CS, "hello"); u = vtkDICOMValue(vtkDICOMVR::DS, "1.234"); TestAssert(u != v); v = vtkDICOMValue(vtkDICOMVR::CS, "hello"); u = vtkDICOMValue(vtkDICOMVR::CS, "there"); TestAssert(u != v); v = vtkDICOMValue(vtkDICOMVR::CS, "hello"); u = vtkDICOMValue(vtkDICOMVR::SH, "hello"); TestAssert(u != v); short data[5] = { 1, 3, -2, 60, 13 }; v = vtkDICOMValue(vtkDICOMVR::SS, data, 5); u = vtkDICOMValue(vtkDICOMVR::SS, data, 5); TestAssert(u == v); data[2] = 0; u = vtkDICOMValue(vtkDICOMVR::SS, data, 5); TestAssert(u != v); } { // test stream operator std::stringstream os; vtkDICOMValue v; static const float flt1[2] = { 1.0f, 2.5f }; // print the invalid value os << v; TestAssert(os.str() == "empty[0]"); os.str(""); // store floats as doubles with VR=FD v = vtkDICOMValue(vtkDICOMVR::FD, flt1, 2); os << v; TestAssert(os.str() == "1.0,2.5"); os.str(""); // store floats as decimal strings with VR=DS v = vtkDICOMValue(vtkDICOMVR::DS, flt1, 2); os << v; TestAssert(os.str() == "1\\2.5"); os.str(""); // store floats as float data with VR=OF v = vtkDICOMValue(vtkDICOMVR::OF, flt1, 2); os << v; TestAssert(os.str() == "floats[2]"); os.str(""); // store attribute tags static const unsigned short tags[4] = { 0x0002, 0x0020, 0xF001, 0x0001 }; v = vtkDICOMValue(vtkDICOMVR::AT, tags, 4); os << v; TestAssert(os.str() == "(0002,0020),(F001,0001)"); os.str(""); } { // test multiplexing vtkDICOMValue v; vtkDICOMValue *vptr = v.AllocateMultiplexData(vtkDICOMVR::DS, 3); vptr[0] = vtkDICOMValue(vtkDICOMVR::DS, "1.3234"); vptr[1] = vtkDICOMValue(vtkDICOMVR::DS, "1.4"); vptr[2] = vtkDICOMValue(vtkDICOMVR::DS, "-1e-5"); const vtkDICOMValue *vptr2 = v.GetMultiplexData(); TestAssert(strcmp(vptr2[0].GetCharData(),"1.3234") == 0); TestAssert(strcmp(vptr2[1].GetCharData(),"1.4 ") == 0); // padded to even TestAssert(strcmp(vptr2[2].GetCharData(),"-1e-5 ") == 0); // padded to even vtkDICOMValue u; vtkDICOMValue *uptr = u.AllocateMultiplexData(vtkDICOMVR::DS, 3); uptr[0] = vtkDICOMValue(vtkDICOMVR::DS, "1.3234"); uptr[1] = vtkDICOMValue(vtkDICOMVR::DS, "1.4"); uptr[2] = vtkDICOMValue(vtkDICOMVR::DS, "-1e-5"); TestAssert(v == v); TestAssert(u == v); uptr[1] = vtkDICOMValue(vtkDICOMVR::DS, "1"); TestAssert(u != v); vptr[1] = vtkDICOMValue(vtkDICOMVR::IS, "1"); TestAssert(u != v); vptr[0] = uptr[0]; vptr[1] = uptr[1]; vptr[2] = uptr[2]; TestAssert(u == v); u = v; TestAssert(u == v); } { // test AsString vtkDICOMValue v; v = vtkDICOMValue(vtkDICOMVR::US, "3\\2\\1"); TestAssert(v.GetNumberOfValues() == 3); TestAssert(v.AsString() == "3\\2\\1"); TestAssert(v.AsInt() == 3); v = vtkDICOMValue(vtkDICOMVR::IS, "3\\2\\1"); TestAssert(v.GetNumberOfValues() == 3); TestAssert(v.AsString() == "3\\2\\1"); TestAssert(v.AsInt() == 3); v = vtkDICOMValue(vtkDICOMVR::UT, "3\\2\\1"); TestAssert(v.GetNumberOfValues() == 1); TestAssert(v.AsString() == "3\\2\\1"); TestAssert(v.AsInt() == 0); } { // test AsUTF8String vtkDICOMValue v; std::string s; // backslash interpreted as backslash v = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); s = "\xef\xbe\x94\xef\xbe\x8f\xef\xbe\x80\xef\xbe\x9e^\xef\xbe\x80\xef\xbe\x9b\xef\xbd\xb3\\\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e"; TestAssert(v.AsUTF8String() == s); // backslash interpreted according to character set v = vtkDICOMValue( vtkDICOMVR::LT, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); s = "\xef\xbe\x94\xef\xbe\x8f\xef\xbe\x80\xef\xbe\x9e^\xef\xbe\x80\xef\xbe\x9b\xef\xbd\xb3\xc2\xa5\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e"; TestAssert(v.AsUTF8String() == s); } { // test Matches for query matching vtkDICOMValue v; vtkDICOMValue u; // test comparison of null values TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO"); TestAssert(!v.Matches(u)); TestAssert(u.Matches(v)); // test comparison of empty values v = vtkDICOMValue(vtkDICOMVR::CS, ""); TestAssert(v.GetVL() == 0); TestAssert(u.Matches(v)); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, ""); TestAssert(v.Matches(u)); // test comparison of identical values v = vtkDICOMValue(vtkDICOMVR::CS, "HELLO"); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HEL"); TestAssert(!v.Matches(u)); v = vtkDICOMValue(vtkDICOMVR::US, 10); u = vtkDICOMValue(vtkDICOMVR::US, 10); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::US, 9); TestAssert(!v.Matches(u)); // test wildcards v = vtkDICOMValue(vtkDICOMVR::CS, "HELLO"); u = vtkDICOMValue(vtkDICOMVR::CS, "*"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "*LO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "H?LLO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "H*?LLO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "H?LO"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "H*P"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELL*"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO*"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELL?"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO?"); TestAssert(!v.Matches(u)); // test multiple values in the query v = vtkDICOMValue(vtkDICOMVR::UI, "10.3000.11.6"); u = vtkDICOMValue(vtkDICOMVR::UI, "10.3000.11.6\\10.3000.10.6"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::UI, "10.3000.10.6\\10.3000.11.6"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::UI, "10.3000.11.7\\10.3000.10.6"); TestAssert(!v.Matches(u)); // test multiple values in the value v = vtkDICOMValue(vtkDICOMVR::CS, "HELLO\\THERE"); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO\\THERE"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "THERE\\HELLO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO\\THER"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "HELLO"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "THERE"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "ELLO\\THER"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::CS, "ELLO"); TestAssert(!v.Matches(u)); // test string-encoded numbers v = vtkDICOMValue(vtkDICOMVR::IS, "5\\6\\10"); u = vtkDICOMValue(vtkDICOMVR::IS, "5\\6\\10"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::IS, "5\\6"); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::IS, "6\\10"); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::IS, "5\\10"); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::IS, "6"); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::IS, "10\\5"); TestAssert(!v.Matches(u)); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::IS, "6\\5"); TestAssert(!v.Matches(u)); TestAssert(!v.Matches(u)); // test backslash on ST, LT, UT v = vtkDICOMValue(vtkDICOMVR::UT, "HELLO\\THERE"); u = vtkDICOMValue(vtkDICOMVR::UT, "HELLO\\THERE"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::UT, "HELLO"); TestAssert(!v.Matches(u)); // test matches for binary data static const short vals[3] = { 10, 11, 12 }; static const short vals2[2] = { 10, 11 }; static const short vals3[2] = { 10, 12 }; static const short vals4[2] = { 11, 10 }; v = vtkDICOMValue(vtkDICOMVR::SS, vals, 3); u = vtkDICOMValue(vtkDICOMVR::SS, 10); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, 11); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, 12); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, 13); TestAssert(!v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, vals2, 2); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, vals3, 2); TestAssert(v.Matches(u)); TestAssert(!u.Matches(v)); u = vtkDICOMValue(vtkDICOMVR::SS, vals4, 2); TestAssert(!v.Matches(u)); TestAssert(!u.Matches(v)); // test matches for binary data OW v = vtkDICOMValue(vtkDICOMVR::OW, vals, 3); u = vtkDICOMValue(vtkDICOMVR::OW, vals, 3); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::OW, vals, 1); TestAssert(!v.Matches(u)); TestAssert(!v.Matches(u)); // test date v = vtkDICOMValue(vtkDICOMVR::DA, "20070125"); u = vtkDICOMValue(vtkDICOMVR::DA, "20070124"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "2007"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "20070124-"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "20070124-20080124"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "20070126-20080124"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "-20070124"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::DA, "-20070126"); TestAssert(v.Matches(u)); // test time v = vtkDICOMValue(vtkDICOMVR::TM, "114501.00"); u = vtkDICOMValue(vtkDICOMVR::TM, "114501"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::TM, "11"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::TM, "1145-"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::TM, "1146"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::TM, "-1146"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::TM, "0800-1146"); TestAssert(v.Matches(u)); // test sequences vtkDICOMSequence su(1); vtkDICOMItem item; item.Set(DC::ImageType, "ORIGINAL"); item.Set(DC::StudyDate, "20070124-20080124"); item.Set(DC::StudyTime, ""); su.SetItem(0, item); u = su; vtkDICOMSequence sv; v = sv; TestAssert(!v.Matches(u)); vtkDICOMItem item1; item1.Set(DC::ImageType, "DERIVED\\PRIMARY\\AXIAL"); item1.Set(DC::StudyDate, "20070513"); item1.Set(DC::StudyTime, "083045.210000"); sv.AddItem(item1); v = sv; TestAssert(!v.Matches(u)); vtkDICOMItem item2; item2.Set(DC::ImageType, "ORIGINAL\\PRIMARY\\AXIAL"); item2.Set(DC::StudyDate, "20070513"); item2.Set(DC::StudyTime, "083045.210000"); sv.AddItem(item2); v = sv; TestAssert(v.Matches(u)); vtkDICOMValue ve; vtkDICOMSequence su2; u = su2; TestAssert(v.Matches(u)); TestAssert(ve.Matches(u)); su2.AddItem(vtkDICOMItem()); u = su2; TestAssert(v.Matches(u)); TestAssert(ve.Matches(u)); // test comparisons of encoded strings v = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_100, "p\373ddle"); u = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_100, "puddle"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_6, "p?ddle"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_192, "p\303\273ddle"); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_100, "puddle"); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::SH, vtkDICOMCharacterSet::ISO_IR_6, "p?ddle"); TestAssert(v.Matches(u)); // test comparisons of names const char *names[] = { "Gobbi", "Gobbi^David", "Gobbi^^Gregory^", "Gobbi^David^Gregory", "Gobb", "Gobbi^Kevin" }; v = vtkDICOMValue(vtkDICOMVR::PN, names[3]); u = vtkDICOMValue(vtkDICOMVR::PN, names[0]); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::PN, names[1]); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::PN, names[2]); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::PN, names[3]); TestAssert(v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::PN, names[4]); TestAssert(!v.Matches(u)); u = vtkDICOMValue(vtkDICOMVR::PN, names[5]); TestAssert(!v.Matches(u)); // test comparison with character sets v = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); u = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO_IR 13"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO_IR 192"), "\xef\xbe\x94\xef\xbe\x8f\xef\xbe\x80\xef\xbe\x9e^\xef\xbe\x80\xef\xbe\x9b\xef\xbd\xb3"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO_IR 192"), "\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e"); // test comparison with character sets specifically for PN v = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); u = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet("ISO_IR 13"), "\xd4\xcf\xc0\xde^\xc0\xdb\xb3"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"), "\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet("ISO_IR 192"), "\xef\xbe\x94\xef\xbe\x8f\xef\xbe\x80\xef\xbe\x9e^\xef\xbe\x80\xef\xbe\x9b\xef\xbd\xb3"); TestAssert(v.Matches(u)); u = vtkDICOMValue( vtkDICOMVR::PN, vtkDICOMCharacterSet("ISO_IR 192"), "\xe5\xb1\xb1\xe7\x94\xb0^\xe5\xa4\xaa\xe9\x83\x8e"); TestAssert(v.Matches(u)); } return rval; } vtk-dicom-0.8.12/Utilities/000077500000000000000000000000001356440565500154675ustar00rootroot00000000000000vtk-dicom-0.8.12/Utilities/chartables.py000066400000000000000000001135521356440565500201600ustar00rootroot00000000000000""" Generate C++ character set conversion tables. This script takes the conversion tables from https://encoding.spec.whatwg.org as its input, performs some tweaks, and generates forward and reverse compressed conversion tables. For conversions in both directions, the code 0xFFFD will indicate a failed character conversion. See http://www.unicode.org/faq/unsup_char.html As of yet, this code doesn't provide generic replacements when converting from unicode (e.g. whitespace of any kind could becomes "space" in the target encoding) or generic removals (soft hyphen, word joiners, zero-width space, variation selectors). These could be handled in the following manner: If the table produces the replacement character, then the input unicode could be checked to see if it fits into one of the above categories, and the appropriate action could be taken. """ import bisect import sys import string # replacement character RCHAR = 0xFFFD # convenient constants for forward vs. reverse encoding Forward = False Reverse = True # interesting unicode ranges cjk_punct = [0x3000,0x301F] # common cjk punctuation cjk_kana = [0x3041,0x30FF] # japanese kana blocks cjk_punct_kana = [0x3000,0x30FF] # puct and kana as one big block cjk_unified = [0x4E00,0x9FFF] # cjk unified ideographs kr_hangul = [0xAC00,0xD7A3] # korean hangul block def readtable(fname): """Read a text file that contains a mapping table. The table is assumed to have two or more columns, with '#' for comments. """ f = open(fname, 'r') lines = f.readlines() f.close() maxindex = 0 for l in lines: l = l.strip() if l and l[0] != '#': columns = l.split() maxindex = max(maxindex, int(columns[0],base=0)) table = [RCHAR]*(maxindex+1) for l in lines: l = l.strip() if l and l[0] != '#': columns = l.split() if len(columns) > 1: table[int(columns[0],base=0)] = int(columns[1],base=0) return table def readlinear(fname): """Read a linear table, each line becomes two consecutive elements. Comments begin with '#'. """ f = open(fname, 'r') lines = f.readlines() f.close() table = [] for l in lines: l = l.strip() if l and l[0] != '#': columns = l.split() table.append(int(columns[0],base=0)) table.append(int(columns[1],base=0)) return table def readdict(fname): """Read a text file that contains a mapping table. The table is assumed to have two or more columns, with '#' for comments. """ d = {} f = open(fname, 'r') for l in f.readlines(): l = l.strip() if l and l[0] != '#': columns = l.split() if len(columns) > 1: d[int(columns[0],base=0)] = int(columns[1],base=0) f.close() return d def makedict(table, reverse, *special): """Turn a table into a dict, since a dict is better for sparse data. If "reverse" is set, the dict provides the reverse mapping. """ ranges = [] dicts = [] for s in special: if type(s) == dict: dicts.append(s) else: ranges.append(s) d = {} for j in range(len(table)): if reverse: i = j c = table[j] else: c = j i = table[j] for r in ranges: if c >= r[0] and c <= r[1]: c = 0xFFFD break if i == 0xFFFD or c == 0xFFFD: continue if not d.has_key(c): d[c] = i for s in dicts: for c,i in s.items(): for r in ranges: if c >= r[0] and c <= r[1]: c = 0xFFFD break if c == 0xFFFD: continue d[c] = i return d def maketable(d, maxrun=8, maxin=0xFFFF): """Given a dict created with "makedict", create a compressed table. """ keys = list(d.keys()) keys.sort() utable = [0] vtable = [RCHAR] wtable = [RCHAR] dtable = [] i = 0 while i < len(keys): key = keys[i] val = d[key] assert val != RCHAR j = i+1 jj = 0 k = RCHAR # check for a character run while (j < len(keys) and keys[j] == key+(j-i) and d[keys[j]] == val+(j-i)): j += 1 if j-i < maxrun: k = len(dtable) assert k != RCHAR j = i+1 dtable.append(val) val = RCHAR runlen = 0 while j < len(keys) and keys[j] - keys[j-1] < maxrun: key1 = keys[j-1] key2 = keys[j] if key2 == key1+1 and d[key2] == d[key1]+1: runlen += 1 if runlen == maxrun: dtable = dtable[0:-runlen] j -= runlen break else: runlen = 0 for n in range(key1+1,key2): dtable.append(RCHAR) jj += 1 dtable.append(d[key2]) j += 1 if len(dtable) > k: runlen = 1 for kk in range(k+1,len(dtable)): if dtable[kk] == dtable[kk-1]+1: runlen += 1 if len(dtable) == k + runlen: val = dtable[k] dtable = dtable[0:k] k = RCHAR if utable[-1] == key: vtable[-1] = val wtable[-1] = k else: utable.append(key) vtable.append(val) wtable.append(k) utable.append(key+(j+jj-i)) vtable.append(RCHAR) wtable.append(RCHAR) i = j while utable[-1] > maxin: utable = utable[0:-1] vtable = vtable[0:-1] wtable = wtable[0:-1] return [len(utable)] + utable + vtable + wtable + dtable """ # simpler code that does not include 'dtable' i = 0 while i < len(keys): key = keys[i] val = d[key] # look for a run j = i+1 while j < len(keys) and keys[j] == key+(j-i) and d[keys[j]] == val+(j-i): j += 1 if utable[-1] == key: vtable[-1] = val else: utable.append(key) vtable.append(val) utable.append(key+(j-i)) vtable.append(RCHAR) i = j """ def maketable2(table, reverse, *special, **kw): """Given a dense table, create a compressed table. If "reverse" is set, then the compressed table reverses the input table. """ d = makedict(table, reverse, *special) t = maketable(d, **kw) try: maxin = kw['maxin'] except KeyError: maxin = 0xFFFF header = [] ranges = [] dicts = [] for s in special: if type(s) == dict: dicts.append(s) else: ranges.append(s) header.append(len(ranges)) if ranges: newdata = [ [] ]*len(ranges) shift = 0 for r in ranges: shift += r[1] - r[0] + 1 n = t[0] p = 3*n + 1 t[p:p] = [RCHAR]*shift for i in range(2*n+1,3*n+1): if t[i] != RCHAR: t[i] += shift assert t[i] != RCHAR for j in range(len(table)): if reverse: i = j v = table[j] else: i = table[j] v = j p = 3*n + 1 for r in ranges: if v >= r[0] and v <= r[1]: t[v - r[0] + p] = i p += r[1] - r[0] + 1 for s in dicts: for v,i in s.items(): p = 3*n + 1 for r in ranges: if v >= r[0] and v <= r[1]: t[v - r[0] + p] = i p += r[1] - r[0] + 1 p = 3*n + 1 for r in ranges: j = bisect.bisect(t[1:n+1], r[0]) if t[j] == r[0]: t[j+2*n] = p - 3*n - 1 assert t[j+2*n] != RCHAR t[j+n] = RCHAR else: j += 1 t.insert(j+2*n, p - 3*n - 1) assert t[j+2*n] != RCHAR t.insert(j+n, RCHAR) t.insert(j, r[0]) assert t[0] != RCHAR n += 1 p += 3 header.append(j-1) if j+1 >= n or t[j+1] != r[1] + 1: t.insert(j+1+2*n, RCHAR) t.insert(j+1+n, RCHAR) t.insert(j+1, r[1] + 1) assert t[j+1] != RCHAR n += 1 p += 3 p += r[1] - r[0] + 1 t[0] = n while t[n] > maxin: del t[3*n] del t[2*n] del t[1*n] n -= 1 t[0] = n return header + t def printrows(table, fmt, n): h = fmt.find('%') l = h+1 while fmt[l] in string.digits: l += 1 w = str(h) if l > h+1: w = str(h + int(fmt[h+1:l])) fmt1 = '%s' + '%' + w + 's,' fmt2 = '%s' + fmt + ',' for k in range(len(table)): u = table[k] s = ' ' if k % n == 0: s = '\n ' if u == RCHAR: sys.stdout.write(fmt1 % (s,'RCHAR')) else: sys.stdout.write(fmt2 % (s,u)) def printtable(name, table, reverse, dtype='unsigned short', maxin=0xFFFF): n = table[0] htable = table[1:n+1] l = table[n+1] utable = table[n+2:n+l+2] vtable = table[n+l+2:n+2*l+2] wtable = table[n+2*l+2:n+3*l+2] dtable = table[n+3*l+2:] ufmt = '0x%04X' ucnt = 8 cfmt = '%6d' ccnt = 8 ufmt2 = '0x%04X' cfmt2 = '%6d' if reverse: (ffmt2,ffmt) = (ufmt2,ufmt) else: (ffmt2,ffmt) = (cfmt2,cfmt) if not reverse: (tfmt2,tfmt,tcnt) = (ufmt2,ufmt,ucnt) else: (tfmt2,tfmt,tcnt) = (cfmt2,cfmt,ccnt) sys.stdout.write('const %s %s[%d] = {' % (dtype, name, len(table))) sys.stdout.write('\n // hot segments (indexes into segment table)') printrows([n] + htable, '%d', 8) sys.stdout.write('\n // number of segments') printrows([l], '%d', 8) sys.stdout.write('\n // segment table') printrows(utable, ffmt2, 8) sys.stdout.write('\n // compressed segments') printrows(vtable, tfmt2, 8) sys.stdout.write('\n // uncompressed segments') printrows(wtable, tfmt2, 8) itable = list(htable) for i in range(l): if i not in htable: if htable and wtable[i] == RCHAR: itable.insert(bisect.bisect_left(itable, i), i) else: itable.append(i) for i in itable: nextval = maxin+1 if i+1 < l: nextval = utable[i+1] s = nextval - utable[i] v = vtable[i] w = wtable[i] if v != RCHAR or w != RCHAR: sys.stdout.write(('\n // ['+ffmt+','+ffmt+']') % (utable[i], nextval-1)) if v != RCHAR: sys.stdout.write((' -> ['+tfmt+','+tfmt+'] # seg %d') % (v,v+s-1,i)) if w != RCHAR: sys.stdout.write(' -v # seg %d at pos %d' % (i,w)) printrows(dtable[w:w+s], tfmt, tcnt) sys.stdout.write('\n};\n') def searchtable(table, x): n = table[0] l = table[n+1] utable = table[n+2:n+l+2] vtable = table[n+l+2:n+2*l+2] wtable = table[n+2*l+2:n+3*l+2] dtable = table[n+3*l+2:] for j in table[1:n+1]: if x >= utable[j] and x < utable[j]: i = j break else: i = bisect.bisect(utable, x) - 1 u = utable[i] v = vtable[i] if v == RCHAR: v = wtable[i] if v == RCHAR: return RCHAR return dtable[v + (x - u)] elif v == RCHAR: return RCHAR else: return v + (x - u) def checktable(table, reverse, orig, *dicts): for j in range(len(orig)): if reverse: i = j k = orig[j] else: i = orig[j] k = j c = searchtable(table, k) if k == 0xFFFD: if c != RCHAR: print "zerofail", i,c,hex(k) elif i != c: print "matchfail", i,c,hex(k) for d in dicts: for k,i in d.items(): c = searchtable(table, k) if k == 0xFFFD: if c != RCHAR: print "zerofail", i,c,hex(k) elif i != c: print "matchfail", i,c,hex(k) header = \ """/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/""" sys.stdout.write(header) sys.stdout.write('\n\n') sys.stdout.write('#include "vtkDICOMCharacterSetTables.h"\n') sys.stdout.write('\n') # ---- # ASCII # ---- ascii = list(range(0,128)) table = [1] + maketable2(ascii, Forward, maxin=255) checktable(table, Forward, ascii) CodePageASCII = table table = [1] + maketable2(ascii, Reverse) checktable(table, Reverse, ascii) CodePageASCII_R = table sys.stdout.write("// %s\n" % ("ASCII",)) printtable("CodePageASCII", CodePageASCII, Forward, maxin=255) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageASCII_R", CodePageASCII_R, Reverse) sys.stdout.write('\n') # ---- # JIS X 0201 # ---- j0201 = list(range(0,161)) + list(range(0xFF61,0xFFA0)) + [RCHAR]*32 j0201[ord('\\')] = 0xA5 j0201[ord('~')] = 0x203E j0201_compat = { # allow conversion of backslash, tilde to yen, macron ord('\\') : ord('\\'), ord('~') : ord('~'), } # allow fullwidth -> halfwidth conversion for x,u in readdict('whatwg/index-iso-2022-jp-katakana.txt').items(): j0201_compat[u] = 161 + x for x in range(94): j0201_compat[0xFF01 + x] = 33 + x j0201_compat[0xFFE3] = 126 # FULLWIDTH MACRON j0201_compat[0xFFE5] = 92 # FULLWIDTH YEN j0201_compat[0x3000] = 32 # IDEOGRAPHIC SPACE table = maketable2(j0201, Forward, maxrun=1, maxin=255) checktable(table, Forward, j0201) CodePageJISX0201 = table table = maketable2(j0201, Reverse, j0201_compat, maxrun=16) checktable(table, Reverse, j0201) CodePageJISX0201_R = table sys.stdout.write("// %s\n" % ("JIS X 0201",)) printtable("CodePageJISX0201", CodePageJISX0201, Forward, maxin=255) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageJISX0201_R", CodePageJISX0201_R, Reverse) sys.stdout.write('\n') # ---- # ISO 8859 Code Pages # ---- ISO8859 = {} CodePageISO8859 = {} CodePageISO8859_R = {} comment = { 1 : "Latin1, Western Europe", 2 : "Latin2, Central Europe", 3 : "Latin3, Maltese", 4 : "Latin4, Northern Europe", 5 : "Cyrillic", 6 : "Arabic", 7 : "Greek", 8 : "Hebrew", 9 : "Latin5, Turkish", 10: "Latin6, Nordic Europe", 11: "Thai, from TIS-620", 13: "Latin7, Baltic Rim", 14: "Latin8, Celtic", 15: "Latin9, Euro 1", 16: "Latin10, Euro 2", } for i in [1,2,3,4,5,6,7,8,9,10,11,13,14,15,16]: if i == 1: ISO8859[i] = list(range(0,256)) elif i == 9: ISO8859[i] = (list(range(0,160)) + readtable('whatwg/index-windows-1254.txt')[32:]) elif i == 11: ISO8859[i] = (list(range(0,160)) + readtable('whatwg/index-windows-874.txt')[32:]) else: ISO8859[i] = (list(range(0,128)) + readtable('whatwg/index-iso-8859-%d.txt' % (i,))) if i in [2, 3, 4, 10, 13, 14, 16]: table = maketable2(ISO8859[i], Forward, [160,255], maxin=255) else: table = maketable2(ISO8859[i], Forward, maxrun=1, maxin=255) table[0] += 1 table.insert(1, 0) checktable(table, Forward, ISO8859[i]) CodePageISO8859[i] = table if i in [2, 3, 4, 10, 13, 14, 16]: table = maketable2(ISO8859[i], Reverse, maxrun=16) #[0xA7,0x17E]) else: table = maketable2(ISO8859[i], Reverse, maxrun=1) table[0] += 1 table.insert(1, 0) checktable(table, Reverse, ISO8859[i]) CodePageISO8859_R[i] = table sys.stdout.write("// %s\n" % (comment[i],)) printtable("CodePageISO8859_%d"%(i,), CodePageISO8859[i], Forward, maxin=255) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageISO8859_%d_R"%(i,), CodePageISO8859_R[i], Reverse) sys.stdout.write('\n') # ---- # Encodings of Korean # ---- euckr = readdict('whatwg/index-euc-kr.txt') KSX1001 = [RCHAR]*(8836 + 8822) for x in range(0x81,0xFF): for y in range(0x41,0xFF): i = None if x >= 0xA1 and y >= 0xA1: i = (x-0xA1)*94 + (y-0xA1) elif (y >= 0x41 and y <= 0x5A) or (y >= 0x61 and y <= 0x7A) or y >= 0x81: a = x - 0x81 b = y - 0x41 if b >= 26: b -= 6 if b >= 52: b -= 6 if a < 32: i = 8836 + a*178 + b else: i = 8836 + 3008 + a*84 + b j = (x-0x81)*190 + (y-0x41) try: KSX1001[i] = euckr[j] except KeyError: pass table = maketable2(KSX1001, Forward, [0,163], [1410,3759]) # [0,163], [1410,3759], [3854,8741], [8836,17657]) checktable(table, Forward, KSX1001) CodePageKSX1001 = table table = maketable2(KSX1001, Reverse, cjk_punct, kr_hangul) checktable(table, Reverse, KSX1001) CodePageKSX1001_R = table sys.stdout.write("// Korean KS X 1001:1998") sys.stdout.write("(codes over 8836 are for CP949 compatibility)\n") printtable("CodePageKSX1001", CodePageKSX1001, Forward) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageKSX1001_R", CodePageKSX1001_R, Reverse) sys.stdout.write('\n') # ---- # Encodings of Simplified Chinese # ---- # For reference: C++ code to decode GBK so GB2312 comes first """ if (a < 0xA1) { if (b > 0x7F) { b--; } a = (a - 0x81)*190 + (b - 0x40) + 8836; } else if (b < 0xA1) { if (b > 0x7F) { b--; } a = (a - 0xA1)*96 + (b - 0x40) + 8836 + 6080; } else { // GB2312 a = (a - 0xA1)*94 + (b - 0xA1); } """ # Also use this table for GBK and GB2312 GB18030 = readtable('whatwg/index-gb18030.txt') # Fix difference between whatwg table and official table GB18030[6555] = 0xE5E5 # 0x3000, ideographic space (duplicate) # Change GB18030-2005 to GB18030-2000 (DICOM uses GB18030-2000) GB18030[7533] = 0xE7C7 # 0x1E3F # Reorganize the 23940 codes so that GB2312 codes come first, this allows # us to use the first 8836 entries as a GB2312 table. GB2312 = [] block2 = list(GB18030[0:6080]) block3 = [] for i in range(6080,6080+190*94,190): block3 += GB18030[i:i+96] GB2312 += GB18030[i+96:i+190] GB18030 = GB2312 + block2 + block3 # Add all linear mappings within the BMP to our GB18030 table LinearGB18030 = readlinear('whatwg/index-gb18030-ranges.txt') for i in range(0,len(LinearGB18030)-2,2): x1 = LinearGB18030[i] y = LinearGB18030[i+1] x2 = min(LinearGB18030[i+2], 39420) GB18030 += list(range(y,y+(x2-x1))) # For Unicode to GBK mapping, ensure compatibility with the GBK mappings # that pre-date the GB18030-2000 standard, as described in this table: gbk_compat = { # Compatibility mapping - m with acute 0x1E3F : 7533, # PUA mappings (2) in GB2312 0xE7C7 : 7533, 0xE7C8 : 7536, # PUA mappings (13) in GBK - ideographic description characters 0xE7E7 : 7672, 0xE7E8 : 7673, 0xE7E9 : 7674, 0xE7EA : 7675, 0xE7EB : 7676, 0xE7EC : 7677, 0xE7ED : 7678, 0xE7EE : 7679, 0xE7EF : 7680, 0xE7F0 : 7681, 0xE7F1 : 7682, 0xE7F2 : 7683, 0xE7F3 : 7684, # PUA mappings (80) in GBK - various radicals and ideographs 0xE815 :23766, 0xE816 :23767, 0xE817 :23768, 0xE818 :23769, 0xE819 :23770, 0xE81A :23771, 0xE81B :23772, 0xE81C :23773, 0xE81D :23774, 0xE81E :23775, 0xE81F :23776, 0xE820 :23777, 0xE821 :23778, 0xE822 :23779, 0xE823 :23780, 0xE824 :23781, 0xE825 :23782, 0xE826 :23783, 0xE827 :23784, 0xE828 :23785, 0xE829 :23786, 0xE82A :23787, 0xE82B :23788, 0xE82C :23789, 0xE82D :23790, 0xE82E :23791, 0xE82F :23792, 0xE830 :23793, 0xE831 :23794, 0xE832 :23795, 0xE833 :23796, 0xE834 :23797, 0xE835 :23798, 0xE836 :23799, 0xE837 :23800, 0xE838 :23801, 0xE839 :23802, 0xE83A :23803, 0xE83B :23804, 0xE83C :23805, 0xE83D :23806, 0xE83E :23807, 0xE83F :23808, 0xE840 :23809, 0xE841 :23810, 0xE842 :23811, 0xE843 :23812, 0xE844 :23813, 0xE845 :23814, 0xE846 :23815, 0xE847 :23816, 0xE848 :23817, 0xE849 :23818, 0xE84A :23819, 0xE84B :23820, 0xE84C :23821, 0xE84D :23822, 0xE84E :23823, 0xE84F :23824, 0xE850 :23825, 0xE851 :23826, 0xE852 :23827, 0xE853 :23828, 0xE854 :23829, 0xE855 :23830, 0xE856 :23831, 0xE857 :23832, 0xE858 :23833, 0xE859 :23834, 0xE85A :23835, 0xE85B :23836, 0xE85C :23837, 0xE85D :23838, 0xE85E :23839, 0xE85F :23840, 0xE860 :23841, 0xE861 :23842, 0xE862 :23843, 0xE863 :23844, 0xE864 :23845, # Compatibility mappings (8) not present in GB18030 0x9FB4 :23775, 0x9FB5 :23783, 0x9FB6 :23788, 0x9FB7 :23789, 0x9FB8 :23795, 0x9FB9 :23812, 0x9FBA :23829, 0x9FBB :23845, # Vertical punctuation (10) within GB2312 range 0xFE10 : 7182, 0xFE11 : 7183, 0xFE12 : 7184, 0xFE13 : 7185, 0xFE14 : 7186, 0xFE15 : 7187, 0xFE16 : 7188, 0xFE17 : 7189, 0xFE18 : 7190, 0xFE19 : 7191, # Points beyond the BMP (6) #0x20087 : 23767, 0x20089 : 23768, 0x200CC : 23769, 0x215D7 : 23794, #0x2298F : 23804, 0x241FE : 23830, } # re-number GBK codes in the above so that GB2312 comes first for k in gbk_compat.keys(): v = gbk_compat[k] (a,b) = (v/190,v%190) if a < 32: v += 8836 # make room for GB2312 elif b < 96: v = 8836 + 6080 + (a-32)*96 + b else: v = (a-32)*94 + (b-96) gbk_compat[k] = v GBKCOMPAT=[RCHAR]*(1 + max(gbk_compat.keys())) table = maketable2(GBKCOMPAT, Reverse, gbk_compat) GBKCompatTable = table def removesegs(table, x, y=0): """Remove the final segments from a table, to allow mapping of replacement code 0xFFFD as if it were a normal code.""" m = table[0] + 1 n = table[m] table[m] = n-x m += 1 table[m+n-x-y:m+n-y] = [] table[m+2*(n-x)-y:m+n-x+n-y] = [] table[m+3*(n-x)-y:m+2*(n-x)+n-y] = [] table = maketable2(GB18030, Forward, [0,93], [1410,8177]) checktable(table, 0, GB18030) removesegs(table, 2, 1) CodePageGB18030 = table # for compatibility with GBK 1.0, be sure to map old GBK PUA codes table = maketable2(GB18030, Reverse, cjk_punct, cjk_unified) checktable(table, 1, GB18030) removesegs(table, 2) CodePageGB18030_R = table sys.stdout.write("// Simplified Chinese GB18030-2000\n") printtable("CodePageGB18030", CodePageGB18030, Forward) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageGB18030_R", CodePageGB18030_R, Reverse) sys.stdout.write('\n') sys.stdout.write('// Compatibility overlay for GBK and GB2312\n') printtable("CodePageGBK_R", GBKCompatTable, Reverse) sys.stdout.write('\n') # ---- # Encodings of Japanese # ---- JISX0208 = readtable('whatwg/index-jis0208.txt') JISX0208[8836:10716] = range(0xE000,0xE000+(10716-8836)) # EUDC JISX0208[16] = 0xFFE3 # FULLWIDTH MACRON JISX0208[28] = 0x2014 # EM DASH JISX0208[31] = 0xFF3C # FULLWIDTH REVERSE SOLIDUS JISX0208[32] = 0x301C # WAVE DASH JISX0208[33] = 0x2016 # DOUBLE VERTICAL LINE JISX0208[60] = 0x2212 # MINUS SIGN JISX0208[78] = 0xFFE5 # FULLWIDTH YEN SIGN JISX0208[80] = 0x00A2 # CENT SIGN JISX0208[81] = 0x00A3 # POUND SIGN JISX0208[137] = 0x00AC # NOT SIGN JISX0212 = readtable('whatwg/index-jis0212.txt') JISX0212[116] = 0xFF5E # FULLWIDTH TILDE JISX0212[128] = 0x00A6 # BROKEN BAR JISX02XX = JISX0208[0:8836] + JISX0212 # remove NEC extensions JISX02XX[12*94:13*94] = [RCHAR]*94 JISX02XX[88*94:92*94] = [RCHAR]*(94*4) # The FULLWIDTH TILDE is a problem, because it can map either to # JIS X 0208 or JIS X 0212, and the former is preferred for CP932. # Also note that for CP932, PUA 0xE000 to 0xE757 (1880 points) should # map to the space between the JIS X 0208 table and the CP932 extensions. # ( also see http://www.unicode.org/L2/L2014/14198-wave-dash.pdf ) j_compat = { 0xFFE3 : 16, # FULLWIDTH MACRON 0x203E : 16, # OVERLINE (jisx0213) 0x2014 : 28, # EM DASH 0x2015 : 28, # HORIZONTAL BAR 0xFF3C : 31, # FULLWIDTH REVERSE SOLIDUS 0x005C : 31, # REVERSE SOLIDUS (jisx0201 compatibility) 0x301C : 32, # WAVE DASH # 0xFF5E : 32, # FULLWIDTH TILDE (cp932) 0x2016 : 33, # DOUBLE VERTICAL LINE 0x2225 : 33, # PARALLEL TO (cp932) 0x2212 : 60, # MINUS SIGN 0xFF0D : 60, # FULLWIDTH HYPHEN-MINUS (cp932) 0xFFE5 : 78, # FULLWIDTH YEN SIGN 0x00A5 : 78, # YEN SIGN (jisx0213) 0x00A2 : 80, # CENT SIGN 0xFFE0 : 80, # FULLWIDTH CENT SIGN (cp932) 0x00A3 : 81, # POUND SIGN 0xFFE1 : 81, # FULLWIDTH POUND SIGN (cp932) 0x00AC : 137, # NOT SIGN 0xFFE2 : 137, # FULLWIDTH NOT SIGN (cp932) 0x007E : 8952, # TILDE (jisx0201 compatibility) 0xFFE4 : 8964, # FULLWIDTH BROKEN BAR 0x525D : 3648, # U+5265 (jouyou kanji compatibility) # 0x20B9F : 2561, # U+53F1 (jouyou kanji compatibility) } # make a reversible table for CP932 JISX0208_R = ([RCHAR]*(94*12) + JISX0208[12*94:13*94] + [RCHAR]*(94*75) + JISX0208[88*94:94*94] + range(0xE000,0xE758)) JISX0208_R[32] = 0xFF5E # FULLWIDTH TILDE (in JIS0212) # remove duplicate mappings JISX0208_R[1207] = RCHAR # 159 0x2252 JISX0208_R[1208] = RCHAR # 158 0x2261 JISX0208_R[1209] = RCHAR # 166 0x222b JISX0208_R[1212] = RCHAR # 162 0x221a JISX0208_R[1213] = RCHAR # 154 0x22a5 JISX0208_R[1214] = RCHAR # 153 0x2220 JISX0208_R[1217] = RCHAR # 165 0x2235 JISX0208_R[1218] = RCHAR # 126 0x2229 JISX0208_R[1219] = RCHAR # 125 0x222a # the following jouyou kanji have compatibility mappings for JISX0208 JISX0208_R[3405] = 0x5861 # U+586B (in JIS0212) JISX0208_R[3990] = 0x9830 # U+982C (in JIS0212) # map halfwidth kana to fullwidth for x,u in readdict('whatwg/index-iso-2022-jp-katakana.txt').items(): if u <= 0x3002: JISX0208_R[u - 0x3000] = 0xFF61 + x elif u <= 0x300D: JISX0208_R[u - 0x300C + 53] = 0xFF61 + x elif u <= 0x309C: JISX0208_R[u - 0x309B + 10] = 0xFF61 + x elif u == 0x30FB: JISX0208_R[u - 0x30FB + 5] = 0xFF61 + x elif u == 0x30FC: JISX0208_R[u - 0x30FC + 27] = 0xFF61 + x else: JISX0208_R[u - 0x30A1 + 376] = 0xFF61 + x table = maketable2(JISX0208_R, Reverse, maxrun=2) checktable(table, Reverse, JISX0208_R) CodePageJISX0208_R = table # more finicky details: half-width katakana to full-width if JISX0201 is # not available, full-width katakana to half-width if only JISX0201 table = maketable2(JISX0208, Forward, [0,689], [1410,7807]) checktable(table, Forward, JISX0208) CodePageJISX0208 = table table = maketable2(JISX0212, Forward, [1410, 7210]) checktable(table, Forward, JISX0212) CodePageJISX0212 = table table = maketable2(JISX02XX, Reverse, cjk_punct_kana, cjk_unified, j_compat) checktable(table, Reverse, JISX02XX, j_compat) CodePageJISX_R = table sys.stdout.write("// Japanese JIS X 0208, plus CP932 compatibility\n") printtable("CodePageJISX0208", CodePageJISX0208, Forward) sys.stdout.write('\n') sys.stdout.write("// Japanese JIS X 0212\n") printtable("CodePageJISX0212", CodePageJISX0212, Forward) sys.stdout.write('\n') sys.stdout.write('// Reverse (values >= 8836 are JIS X 0212)\n') printtable("CodePageJISX_R", CodePageJISX_R, Reverse) sys.stdout.write('\n') sys.stdout.write('// Reverse table overlay with CP932 extensions\n') printtable("CodePageJISX0208_R", CodePageJISX0208_R, Reverse) sys.stdout.write('\n') # ---- # Encodings of Traditional Chinese # ---- # Read Big5, keep ETEN but ignore HKSCS # (ETEN adds 408 chars including japanese, cyrillic) BIG5_HKSCS = readtable('whatwg/index-big5.txt') BIG5_PRIV1 = list(range(0xEEB8,0xF6B1)) # CP950 compatibility BIG5_PRIV2 = list(range(0xE311,0xEEB8)) # CP950 compatibility BIG5_PRIV4 = list(range(0xE000,0xE311)) # CP950 compatibility BIG5 = BIG5_PRIV1 + BIG5_PRIV2 + BIG5_HKSCS[5024:18997] + BIG5_PRIV4 # These codes in ETEN block map outside BMP, replace with private codes BIG5[11205] = 0xF7E6 # 0x200CC BIG5[11207] = 0xF7E8 # 0x2008A BIG5[11213] = 0xF7EE # 0x27607 # For CP950 compatibility, fill unused slots with EUDC for i in range(10896,11304): if BIG5[i] == 0xFFFD: BIG5[i] = i - 10896 + 0xF6B1 # Duplicates must be removed from table before inverting it BIG5_R = list(BIG5) # Replace with hangzhou digits from Unicode 3.0 BIG5_R[5287] = 0x3038 # 5512 0x5341 BIG5_R[5288] = 0x3039 # None 0x5344 BIG5_R[5289] = 0x303A # 5599 0x5345 # Remove duplicate cjk characters in ETEN BIG5_R[10957] = 0xFFFD # 5104 0x3003 (DITTO MARK) BIG5_R[10958] = 0xFFFD # 11345 0x4edd (ideographic ditto) # Remove duplicate box-drawing characters BIG5_R[18975] = 0xFFFD # 5248 0x255e BIG5_R[18976] = 0xFFFD # 5249 0x256a BIG5_R[18977] = 0xFFFD # 5250 0x2561 BIG5_R[18991] = 0xFFFD # 5247 0x2550 BIG5_R[18992] = 0xFFFD # 5243 0x256d BIG5_R[18993] = 0xFFFD # 5244 0x256e BIG5_R[18994] = 0xFFFD # 5245 0x2570 BIG5_R[18995] = 0xFFFD # 5246 0x256f big5_compat = { 0x3038 : 5287, # HANGZHOU NUMERAL 10 0x3039 : 5288, # HANGZHOU NUMERAL 20 0x5344 : 5288, # cjk unified ideograph 0x303A : 5289, # HANGZHOU NUMERAL 30 } # compatibility for CP950 private codes for i in range(10896,11304): big5_compat[i - 10896 + 0xF6B1] = i table = maketable2(BIG5, 0) checktable(table, 0, BIG5) CodePageBig5 = table table = maketable2(BIG5_R, 1, cjk_punct, cjk_unified, big5_compat) checktable(table, 1, BIG5_R, big5_compat) CodePageBig5_R = table sys.stdout.write("// Traditional Chinese Big5 with ETEN extensions\n") sys.stdout.write("// Needs special handling for ETEN outside BMP:\n") sys.stdout.write("// 11205 -> 0x200CC, 11207 -> 0x2008A, 11213 -> 0x27607\n") printtable("CodePageBig5", CodePageBig5, Forward) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageBig5_R", CodePageBig5_R, Reverse) sys.stdout.write('\n') # ---- # Windows Code Pages # ---- CP = {} CodePageWindows = {} CodePageWindows_R = {} comment = { 874 : "Windows Thai, extends iso-8859-11", 1250: "Windows Central Europe", 1251: "Windows Cyrillic", 1252: "Windows Latin1, extents iso-8859-1", 1253: "Windows Greek", 1254: "Windows Turkish, extents iso-8859-9", 1255: "Windows Hebrew", 1256: "Windows Arabic", 1257: "Windows Baltic Rim", } for i in [874,1250,1251,1252,1253,1254,1255,1256,1257]: CP[i] = (list(range(0,128)) + readtable('whatwg/index-windows-%d.txt' % (i,))) if i in [1254]: table = maketable2(CP[i], Forward, [128,159], maxrun=1, maxin=255) table = [0] + table[2:] elif i in [1255]: table = maketable2(CP[i], Forward, [128,191], maxrun=1, maxin=255) table = [0] + table[2:] else: table = maketable2(CP[i], Forward, maxrun=16, maxin=255) table[0] += 1 table.insert(1, 0) checktable(table, Forward, CP[i]) CodePageWindows[i] = table table = maketable2(CP[i], Reverse, maxrun=16) table[0] += 1 table.insert(1, 0) checktable(table, Reverse, CP[i]) CodePageWindows_R[i] = table sys.stdout.write("// %s\n" % (comment[i],)) printtable("CodePageWindows%d"%(i,), CodePageWindows[i], Forward, maxin=255) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageWindows%d_R"%(i,), CodePageWindows_R[i], Reverse) sys.stdout.write('\n') # ---- # KOI8 Code Pages # ---- KOI8 = (list(range(0,128)) + readtable('whatwg/index-koi8-u.txt')) # remove all non-alphabetic characters except nbsp, interpunct, copyright for i in range(0x80,0xC0): if KOI8[i] < 0x400 or KOI8[i] >= 0x500: if KOI8[i] not in [0xA0,0xA9,0xB7]: KOI8[i] = RCHAR ftable = maketable2(KOI8, Forward, [160,255], maxin=255) ftable[0] += 1 ftable.insert(1, 0) checktable(ftable, Forward, KOI8) rtable = maketable2(KOI8, Reverse, [0x0400,0x0491]) rtable[0] += 1 rtable.insert(1, 0) checktable(rtable, Reverse, KOI8) sys.stdout.write("// koi8 with extra cyrillic letters from koi8-ru\n") printtable("CodePageKOI8", ftable, Forward, maxin=255) sys.stdout.write('\n') sys.stdout.write('// Reverse\n') printtable("CodePageKOI8_R", rtable, Reverse) sys.stdout.write('\n') # this must be consistent with the enum in vtkDICOMCharacterSet.h ISO_2022 = 32 ISO_IR_6 = 0 # US_ASCII ISO_IR_13 = 1 # JIS X 0201, japanese romaji + katakana ISO_IR_100 = 8 # ISO-8859-1, latin1, western europe ISO_IR_101 = 9 # ISO-8859-2, latin2, central europe ISO_IR_109 = 10 # ISO-8859-3, latin3, maltese ISO_IR_110 = 11 # ISO-8859-4, latin4, baltic ISO_IR_144 = 12 # ISO-8859-5, cyrillic ISO_IR_127 = 13 # ISO-8859-6, arabic ISO_IR_126 = 14 # ISO-8859-7, greek ISO_IR_138 = 15 # ISO-8859-8, hebrew ISO_IR_148 = 16 # ISO-8859-9, latin5, turkish X_LATIN6 = 17 # ISO-8859-10, latin6, nordic ISO_IR_166 = 18 # ISO-8859-11, thai X_LATIN7 = 19 # ISO-8859-13, latin7, baltic rim X_LATIN8 = 20 # ISO-8859-14, latin8, celtic X_LATIN9 = 21 # ISO-8859-15, latin9, western europe X_LATIN10 = 22 # ISO-8859-16, latin10, southeastern europe X_EUCKR = 24 # euc-kr, ISO_IR_149 without escape codes X_GB2312 = 25 # gb2312, ISO_IR_58 without escape codes ISO_2022_IR_6 = 32 # US_ASCII ISO_2022_IR_13 = 33 # JIS X 0201, japanese katakana ISO_2022_IR_87 = 34 # JIS X 0208, japanese 94x94 primary ISO_2022_IR_159 = 36 # JIS X 0212, japanese 94x94 secondary ISO_2022_IR_100 = 40 # ISO-8859-1, latin1, western europe ISO_2022_IR_101 = 41 # ISO-8859-2, latin2, central europe ISO_2022_IR_109 = 42 # ISO-8859-3, latin3, maltese ISO_2022_IR_110 = 43 # ISO-8859-4, latin4, baltic ISO_2022_IR_144 = 44 # ISO-8859-5, cyrillic ISO_2022_IR_127 = 45 # ISO-8859-6, arabic ISO_2022_IR_126 = 46 # ISO-8859-7, greek ISO_2022_IR_138 = 47 # ISO-8859-8, hebrew ISO_2022_IR_148 = 48 # ISO-8859-9, latin5, turkish ISO_2022_IR_166 = 50 # ISO-8859-11, thai ISO_2022_IR_149 = 56 # the KS X 1001 part of ISO-2022-KR ISO_2022_IR_58 = 57 # the GB2312 part of ISO-2022-CN ISO_IR_192 = 64 # UTF-8, unicode GB18030 = 65 # gb18030, chinese with full unicode mapping GBK = 66 # gbk, chinese X_BIG5 = 67 # big5 + ETEN, traditional chinese X_EUCJP = 69 # euc-jp, unix encoding for japanese X_SJIS = 70 # windows-31j, aka shift-jis, code page 932 X_CP874 = 76 # cp1162, thai (windows-874) X_CP1250 = 80 # cp1250, central europe X_CP1251 = 81 # cp1251, cyrillic X_CP1252 = 82 # cp1252, western europe X_CP1253 = 83 # cp1253, greek X_CP1254 = 84 # cp1254, turkish X_CP1255 = 85 # cp1255, hebrew X_CP1256 = 86 # cp1256, arabic X_CP1257 = 87 # cp1257, baltic rim X_KOI8 = 90 # koi, cyrillic pages = { ISO_IR_6 : ('CodePageASCII', 'CodePageASCII_R'), ISO_IR_13 : ('CodePageJISX0201', 'CodePageJISX0201_R'), ISO_IR_100 : ('CodePageISO8859_1', 'CodePageISO8859_1_R'), ISO_IR_101 : ('CodePageISO8859_2', 'CodePageISO8859_2_R'), ISO_IR_109 : ('CodePageISO8859_3', 'CodePageISO8859_3_R'), ISO_IR_110 : ('CodePageISO8859_4', 'CodePageISO8859_4_R'), ISO_IR_144 : ('CodePageISO8859_5', 'CodePageISO8859_5_R'), ISO_IR_127 : ('CodePageISO8859_6', 'CodePageISO8859_6_R'), ISO_IR_126 : ('CodePageISO8859_7', 'CodePageISO8859_7_R'), ISO_IR_138 : ('CodePageISO8859_8', 'CodePageISO8859_8_R'), ISO_IR_148 : ('CodePageISO8859_9', 'CodePageISO8859_9_R'), X_LATIN6 : ('CodePageISO8859_10', 'CodePageISO8859_10_R'), ISO_IR_166 : ('CodePageISO8859_11', 'CodePageISO8859_11_R'), X_LATIN7 : ('CodePageISO8859_13', 'CodePageISO8859_13_R'), X_LATIN8 : ('CodePageISO8859_14', 'CodePageISO8859_14_R'), X_LATIN9 : ('CodePageISO8859_15', 'CodePageISO8859_15_R'), X_LATIN10 : ('CodePageISO8859_16', 'CodePageISO8859_16_R'), X_EUCKR : ('CodePageKSX1001', 'CodePageKSX1001_R'), X_GB2312 : ('CodePageGB18030', 'CodePageGBK_R'), ISO_2022_IR_6 : ('CodePageASCII', 'CodePageASCII_R'), ISO_2022_IR_13 : ('CodePageJISX0201', 'CodePageJISX0201_R'), ISO_2022_IR_87 : ('CodePageJISX0208', 'CodePageJISX_R'), ISO_2022_IR_159 : ('CodePageJISX0212', 'CodePageJISX_R'), ISO_2022_IR_100 : ('CodePageISO8859_1', 'CodePageISO8859_1_R'), ISO_2022_IR_101 : ('CodePageISO8859_2', 'CodePageISO8859_2_R'), ISO_2022_IR_109 : ('CodePageISO8859_3', 'CodePageISO8859_3_R'), ISO_2022_IR_110 : ('CodePageISO8859_4', 'CodePageISO8859_4_R'), ISO_2022_IR_144 : ('CodePageISO8859_5', 'CodePageISO8859_5_R'), ISO_2022_IR_127 : ('CodePageISO8859_6', 'CodePageISO8859_6_R'), ISO_2022_IR_126 : ('CodePageISO8859_7', 'CodePageISO8859_7_R'), ISO_2022_IR_138 : ('CodePageISO8859_8', 'CodePageISO8859_8_R'), ISO_2022_IR_148 : ('CodePageISO8859_9', 'CodePageISO8859_9_R'), ISO_2022+X_LATIN6 : ('CodePageISO8859_10', 'CodePageISO8859_10_R'), ISO_2022_IR_166 : ('CodePageISO8859_11', 'CodePageISO8859_11_R'), ISO_2022+X_LATIN7 : ('CodePageISO8859_13', 'CodePageISO8859_13_R'), ISO_2022+X_LATIN8 : ('CodePageISO8859_14', 'CodePageISO8859_14_R'), ISO_2022+X_LATIN9 : ('CodePageISO8859_15', 'CodePageISO8859_15_R'), ISO_2022+X_LATIN10 : ('CodePageISO8859_16', 'CodePageISO8859_16_R'), ISO_2022_IR_149 : ('CodePageKSX1001', 'CodePageKSX1001_R'), ISO_2022_IR_58 : ('CodePageGB18030', 'CodePageGBK_R'), GB18030 : ('CodePageGB18030', 'CodePageGB18030_R'), GBK : ('CodePageGB18030', 'CodePageGBK_R'), X_BIG5 : ('CodePageBig5', 'CodePageBig5_R'), X_EUCJP : ('CodePageJISX0208', 'CodePageJISX_R'), X_SJIS : ('CodePageJISX0208', 'CodePageJISX0208_R'), X_CP874 : ('CodePageWindows874', 'CodePageWindows874_R'), X_CP1250 : ('CodePageWindows1250', 'CodePageWindows1250_R'), X_CP1251 : ('CodePageWindows1251', 'CodePageWindows1251_R'), X_CP1252 : ('CodePageWindows1252', 'CodePageWindows1252_R'), X_CP1253 : ('CodePageWindows1253', 'CodePageWindows1253_R'), X_CP1254 : ('CodePageWindows1254', 'CodePageWindows1254_R'), X_CP1255 : ('CodePageWindows1255', 'CodePageWindows1255_R'), X_CP1256 : ('CodePageWindows1256', 'CodePageWindows1256_R'), X_CP1257 : ('CodePageWindows1257', 'CodePageWindows1257_R'), X_KOI8 : ('CodePageKOI8', 'CodePageKOI8_R'), } table = [('0','0')]*256 for x,y in pages.items(): table[x] = y sys.stdout.write( 'const unsigned short *vtkDICOMCharacterSet::Table[256] = {\n') for l in table: sys.stdout.write(' %s,\n' % (l[0],)) sys.stdout.write('};\n\n') sys.stdout.write( 'const unsigned short *vtkDICOMCharacterSet::Reverse[256] = {\n') for l in table: sys.stdout.write(' %s,\n' % (l[1],)) sys.stdout.write('};\n') vtk-dicom-0.8.12/Utilities/make_vm.py000066400000000000000000000027501356440565500174640ustar00rootroot00000000000000""" Generate the enum code for the VM header file. """ def getmin(k): if ((k & 0x8000) != 0): return (k & 0x7fff) else: return (k >> 8) def getmax(k): if ((k & 0x8000) != 0): return (k & 0x7fff) elif ((k & 0x80) == 0): return (k & 0xff) else: return -1; def getstep(k): if ((k & 0x8000) != 0): return 1 elif ((k & 0x80) == 0): return 1 else: return ((-k) & 0xff) def printm(k): n = getmin(k) m = getmax(k) s = getstep(k) a = 'M' a += str(n) if (m > n or m < 0): a += 'T' if (s > 1): a += str(s) if (m > 0): a += str(m) else: a += 'N' return a if __name__ == '__main__': import sys if len(sys.argv) > 1: nlist = [] for i in sys.argv[1:]: nlist.append(int(i, 16)) else: nlist = [0x0000, 0x00FF, 0x7F7F, 0x8080, 0x80FF, 0x8100, 0x8200, 0x8300, 0x8400, 0x8800] nrange = range(0,33) + [63, 64, 99, 100] for i in nrange: mrange = range(i,33) + [63, 64, 99, 100, 0xff] for j in mrange: if j < i: continue nlist.append((i << 8) | j) if j == 0xff and i > 1: nlist.append((i << 8) | (j - i + 1)) nlist.sort() for i in nlist: m = printm(i) if len(m) <= 9: print ' %-9.9s = 0x%4.4X,' % (m, i) vtk-dicom-0.8.12/Utilities/makedict.py000066400000000000000000000270041356440565500176250ustar00rootroot00000000000000""" Generate a C++ DICOM dictionary from a text file. This program will read a text file generated from the DICOM data element regsistry table (DICOM Chapter 6 part 6) and will generate a hash table that can be used for dictionary lookups. Usage: python makedict.py nemadict.txt > vtkDICOMDictHash.cxx Usage: python makedict.py --header nemadict.txt > vtkDICOMDictHash.h The option "--private" can be added to create a private dictionary. """ import sys import math header = \ """/*========================================================================= This is an automatically generated file. Include errata for any changes. =========================================================================*/""" printheader = False privatedict = False filename = None for arg in sys.argv[1:]: if arg == "--header": printheader = True elif arg[0:10] == "--private=": privatedict = arg[10:] elif arg[0] != '-' and filename == None: filename = arg else: sys.stderr.write( """usage: python makedict.py nemadict.txt > vtkDICOMDictHash.cxx python makedict.py --header nemadict.txt > vtkDICOMDictHash.h\n""") sys.exit(1) # the hash table, in PYTHON htsize = 4096 # collect private dictionaries privatelines = {} # read the file in one go f = open(filename, 'r') lines = f.readlines() f.close() # look for repeating groups and repeat them i = 0 rg = [] while i < len(lines): tag = lines[i].strip() try: g, e = tag[1:10].split(',') except ValueError: sys.stderr.write("exception: %s\n" % (tag)) if g == "60xx" or g == "50xx": rg.extend(lines[i:i+6]) i = i + 6 elif rg: nb = [] for j in range(1,16): k = 0 m = len(rg) while k < m: g, e = rg[k][1:10].split(',') nb.append("(%s%02X,%s)\n" % (g[0:2], 2*j, e)) nb.append("%s %d\n" % (rg[k+1].strip(), j+1)) nb.append("%s%d\n" % (rg[k+2].strip(), j+1)) nb.append(rg[k+3]) nb.append(rg[k+4]) nb.append(rg[k+5]) k = k + 6 lines = lines[0:i] + nb + lines[i:] i += len(nb) rg = [] else: # check for and filter out the private tags private = False try: private = ((int(g[3]) & 0x1) != 0) except: pass if private: creator = lines[i + 5].strip() try: privatelines[creator] += lines[i:i+6] except KeyError: privatelines[creator] = lines[i:i+6] i = i + 6 def hashstring(s): """Compute a string hash based on the function "djb2". Use at most 64 characters. """ h = 5381 s = s[0:64] for c in s: h = ((h << 5) + h + ord(c)) & 0xffffffff return h def makedict(lines, creator="DICOM"): # the tables that will be created enum_list = [] element_list = [] entry_list = [] # a set to keep track of all VM strings encountered vms = {} htsize = 4096 if privatedict: htsize = int(len(lines)/6) if htsize == 0: htsize = 1 ht = [None]*htsize ht2 = [None]*htsize # iterate through all elements in the table j = 0 i = 0 n = len(lines) while i < n: try: tag = lines[i].encode('ascii').strip() i = i + 1 name = lines[i].encode('ascii').strip() i = i + 1 key = lines[i].encode('ascii').strip() i = i + 1 vr = lines[i].encode('ascii').strip() i = i + 1 vm = lines[i].encode('ascii').strip() i = i + 1 ret = lines[i].encode('ascii').strip() i = i + 1 except: sys.stderr.write("non-ascii character encountered on line %d\n" % (i,)) raise TypeError # replace "Unknown" and "?" with "" if name in ("Unknown", "Internal", "?"): name = "" if key in ("Unknown", "Internal", "?"): key = "" # replace "US or SS" with "XS" if vr in ("US or SS", "SS or US", "xs"): vr = "XS" # replace "OB or OW" with "OX" if vr in ("OB or OW", "OW or OB", "ox"): vr = "OX" # replace "see note" with "XX" if vr in ("", "see note", "See Note"): vr = "XX" # replace mixed short with "OW" if len(vr) > 2: if vr.find("OW") >= 0: vr = "OW" vm = "1" if vr.find("OB") >= 0: vr = "OB" vm = "1" # replace 'RET' with 1 or 0 if ret and not privatedict: if not printheader: ret = {"RET":"1","DICONDE":"2","DICOS":"3"}[ret] elif ret == "RET": ret = "1" else: ret = "0" # prefix vm with 'M', change '-' to 'T', change 'n' to 'N' vm = 'M' + vm.split(' ')[0].replace('-', 'T').replace('n', 'N') # add to the set of VMs vms[vm] = True # this is debug info: make sure no keys are over 63 chars, # which is the maximum id length in the C++ standard if len(key) > 63: print "XXXXXX", key sys.exit(1) # get the group, element g, e = tag[1:10].split(',') # make sure g, e are hexadecimal integers try: gi = int(g, 16) ei = int(e, 16) except: # replace 'x' (which means any digit) with zero #print "XXXXXX %s %s" % (tag, key) g = g.replace('xx','00') e = e.replace('xxxx','0000') e = e.replace('xxx','000') e = e.replace('xx','00') e = e.replace('x','1') gi = int(g, 16) ei = int(e, 16) if key or privatedict: enum_list.append( ("%-39s = 0x%s%s, // %s %-5s %s" % (key, g, e, vr, vm, ret)).strip()) element_list.append( "{ 0x%s, 0x%s, %s, VR::%s, VM::%s, \"%s\" }," % (g, e, ret, vr, vm, key)) # create a 16-bit hash from group, element h = ((gi ^ (gi >> 6)) ^ (ei ^ (ei >> 6))) # create a string hash hkey = hashstring(key) # build the hash tables h = (h % htsize) if ht[h] == None: ht[h] = [] h2 = (hkey % htsize) if ht2[h2] == None: ht2[h2] = [] # build the index table ht[h].append(j) ht[h].append(ei) ht2[h2].append(j) ht2[h2].append((hkey//htsize) & 0xffff) j = j + 1 # debug: print all VM's that were found #print vms.keys() # debug: print statistics about the hash table #print maxl, minl, k0, k4 return enum_list, element_list, ht, ht2 # write the output file def printhead(enum_dict, classname): print header print print "#ifndef %s_h" % (classname,) print "#define %s_h" % (classname,) print if not privatedict: print "//! Tag values defined in the DICOM standard" print "namespace DC" print "{" print "enum EnumType {" for enum_list in enum_dict.values(): # eliminate the "," for the last enum item m = len(enum_list) if m: enum_list[m-1] = enum_list[m-1].replace(", //", " //") for l in enum_list: print l print "};" print "} // end namespace DC" else: print "// This must be included before the initializer is declared." print "#include \"vtkDICOMDictionary.h\"" print print "// Initializer to add dict when header included." print "struct VTK_DICOM_EXPORT %sInitializer" % (classname,) print "{" print " %sInitializer();" % (classname,) print " ~%sInitializer();" % (classname,) print "};" print print "static %sInitializer %sInitializerInstance;" % (classname,classname); print print "#endif /* %s_h */" % (classname,) def printbody(entry_dict, classname): print header print print "#include \"vtkDICOMDictionary.h\"" print "#include \"%s.h\"" % (classname,) print print "namespace {" print print "typedef vtkDICOMVR VR;" print "typedef vtkDICOMVM VM;" print "typedef vtkDICOMDictEntry::Entry DictEntry;" ns = "" if not privatedict: ns = "vtkDICOMDictionary::" dn = 0 for name, (entry_list, tag_table, key_table) in entry_dict.items(): dn = dn + 1 ds = "" print if len(entry_dict) > 1: ds = "%03d" % (dn,) print "// ----- %s -----" % (name,) print print "const DictEntry Dict%sContents[] = {" % (ds,) for l in entry_list: print l print "};" for table,tagorkey in [(tag_table,"Tag"),(key_table,"Key")]: print print "const unsigned short Dict%s%sHashTable[] = {" % (ds,tagorkey) i = 0 j = len(table) + 1 for l in table: if l is None: print "%5d," % (len(table),), i = i + 1 if i % 10 == 0: print else: print "%5d," % (j,), i = i + 1 if i % 10 == 0: print j = j + len(l) + 1 print "%5d," % (0,), i = i + 1 if i % 10 == 0: print for l in table: if not (l is None): print "%5d," % (len(l)/2,), i = i + 1 if i % 10 == 0: print for e in l: print "%5d," % (e,), i = i + 1 if i % 10 == 0: print if i % 10 != 0: print print "};" if not privatedict: print print "} // end anonymous namespace" print if len(entry_dict) > 1: ds = "%03d" % (dn,) print "vtkDICOMDictionary::Dict %sDict%sData = {" % (ns,ds) print "\"%s\"," % (name,) print "%d," % (len(tag_table),) print "%d," % (len(entry_list),) print "Dict%sTagHashTable," % (ds,) print "Dict%sKeyHashTable," % (ds,) print "Dict%sContents" % (ds,) print "};" if privatedict: print print "vtkDICOMDictionary::Dict *PrivateDictData[] = {" dn = 0 for item in entry_dict.items(): dn = dn + 1 print "&Dict%03dData," % (dn,), if dn % 5 == 0: print print "NULL" print "};" print print "} // end anonymous namespace" print print "static unsigned int %sInitializerCounter;" % (classname,) print print "%sInitializer::%sInitializer()" % (classname,classname) print "{" print " if (%sInitializerCounter++ == 0)" % (classname,) print " {" print " for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)" print " {" print " vtkDICOMDictionary::AddPrivateDictionary(*dp);" print " }" print " }" print "}" print print "%sInitializer::~%sInitializer()" % (classname,classname) print "{" print " if (--%sInitializerCounter == 0)" % (classname,) print " {" print " for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)" print " {" print " vtkDICOMDictionary::RemovePrivateDictionary((*dp)->Name);" print " }" print " }" print "}" if privatedict: enum_dict = {} entry_dict = {} for name, lines in privatelines.items(): enum_list, entry_list, tag_table, key_table = makedict(lines, name) enum_dict[name] = enum_list entry_dict[name] = (entry_list, tag_table, key_table) if printheader: printhead(enum_dict, privatedict) else: printbody(entry_dict, privatedict) else: enum_list, entry_list, tag_table, key_table = makedict(lines) classname = "vtkDICOMDictHash" if printheader: printhead({"DICOM" : enum_list}, classname) print "// VTK-HeaderTest-Exclude: %s.h" % (classname,) else: printbody({"DICOM" : (entry_list, tag_table, key_table)}, classname) # informative: these names represent a range of tag values """ keys with ranges (0020,3100 to 31FF) SourceImageIDs (0028,04x0) RowsForNthOrderCoefficients (0028,04x1) ColumnsForNthOrderCoefficients (0028,04x2) CoefficientCoding (0028,04x3) CoefficientCodingPointers (0028,08x0) CodeLabel (0028,08x2) NumberOfTables (0028,08x3) CodeTableLocation (0028,08x4) BitsForCodeWord (0028,08x8) ImageDataLocation (1000,xxx0) EscapeTriplet (1000,xxx1) RunLengthTriplet (1000,xxx2) HuffmanTableSize (1000,xxx3) HuffmanTableTriplet (1000,xxx4) ShiftTableSize (1000,xxx5) ShiftTableTriplet (1010,xxxx) ZonalMap """ vtk-dicom-0.8.12/Utilities/nemadict.txt000066400000000000000000012130701356440565500200200ustar00rootroot00000000000000(0002,0000) File Meta Information Group Length FileMetaInformationGroupLength UL 1 (0002,0001) File Meta Information Version FileMetaInformationVersion OB 1 (0002,0002) Media Storage SOP Class UID MediaStorageSOPClassUID UI 1 (0002,0003) Media Storage SOP Instance UID MediaStorageSOPInstanceUID UI 1 (0002,0010) Transfer Syntax UID TransferSyntaxUID UI 1 (0002,0012) Implementation Class UID ImplementationClassUID UI 1 (0002,0013) Implementation Version Name ImplementationVersionName SH 1 (0002,0016) Source Application Entity Title SourceApplicationEntityTitle AE 1 (0002,0017) Sending Application Entity Title SendingApplicationEntityTitle AE 1 (0002,0018) Receiving Application Entity Title ReceivingApplicationEntityTitle AE 1 (0002,0026) Source Presentation Address SourcePresentationAddress UR 1 (0002,0027) Sending Presentation Address SendingPresentationAddress UR 1 (0002,0028) Receiving Presentation Address ReceivingPresentationAddress UR 1 (0002,0031) RTV Meta Information Version RTVMetaInformationVersion OB 1 (0002,0032) RTV Communication SOP Class UID RTVCommunicationSOPClassUID UI 1 (0002,0033) RTV Communication SOP Instance UID RTVCommunicationSOPInstanceUID UI 1 (0002,0035) RTV Source Identifier RTVSourceIdentifier OB 1 (0002,0036) RTV Flow Identifier RTVFlowIdentifier OB 1 (0002,0037) RTV Flow RTP Sampling Rate RTVFlowRTPSamplingRate UL 1 (0002,0038) RTV Flow Actual Frame Duration RTVFlowActualFrameDuration FD 1 (0002,0100) Private Information Creator UID PrivateInformationCreatorUID UI 1 (0002,0102) Private Information PrivateInformation OB 1 (0004,1130) File-set ID FileSetID CS 1 (0004,1141) File-set Descriptor File ID FileSetDescriptorFileID CS 1-8 (0004,1142) Specific Character Set of File-set Descriptor File SpecificCharacterSetOfFileSetDescriptorFile CS 1 (0004,1200) Offset of the First Directory Record of the Root Directory Entity OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity UL 1 (0004,1202) Offset of the Last Directory Record of the Root Directory Entity OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity UL 1 (0004,1212) File-set Consistency Flag FileSetConsistencyFlag US 1 (0004,1220) Directory Record Sequence DirectoryRecordSequence SQ 1 (0004,1400) Offset of the Next Directory Record OffsetOfTheNextDirectoryRecord UL 1 (0004,1410) Record In-use Flag RecordInUseFlag US 1 (0004,1420) Offset of Referenced Lower-Level Directory Entity OffsetOfReferencedLowerLevelDirectoryEntity UL 1 (0004,1430) Directory Record Type DirectoryRecordType CS 1 (0004,1432) Private Record UID PrivateRecordUID UI 1 (0004,1500) Referenced File ID ReferencedFileID CS 1-8 (0004,1504) MRDR Directory Record Offset MRDRDirectoryRecordOffset UL 1 RET (0004,1510) Referenced SOP Class UID in File ReferencedSOPClassUIDInFile UI 1 (0004,1511) Referenced SOP Instance UID in File ReferencedSOPInstanceUIDInFile UI 1 (0004,1512) Referenced Transfer Syntax UID in File ReferencedTransferSyntaxUIDInFile UI 1 (0004,151A) Referenced Related General SOP Class UID in File ReferencedRelatedGeneralSOPClassUIDInFile UI 1-n (0004,1600) Number of References NumberOfReferences UL 1 RET (0006,0001) Current Frame Functional Groups Sequence CurrentFrameFunctionalGroupsSequence SQ 1 (0008,0001) Length to End LengthToEnd UL 1 RET (0008,0005) Specific Character Set SpecificCharacterSet CS 1-n (0008,0006) Language Code Sequence LanguageCodeSequence SQ 1 (0008,0008) Image Type ImageType CS 2-n (0008,0010) Recognition Code RecognitionCode SH 1 RET (0008,0012) Instance Creation Date InstanceCreationDate DA 1 (0008,0013) Instance Creation Time InstanceCreationTime TM 1 (0008,0014) Instance Creator UID InstanceCreatorUID UI 1 (0008,0015) Instance Coercion DateTime InstanceCoercionDateTime DT 1 (0008,0016) SOP Class UID SOPClassUID UI 1 (0008,0018) SOP Instance UID SOPInstanceUID UI 1 (0008,001A) Related General SOP Class UID RelatedGeneralSOPClassUID UI 1-n (0008,001B) Original Specialized SOP Class UID OriginalSpecializedSOPClassUID UI 1 (0008,0020) Study Date StudyDate DA 1 (0008,0021) Series Date SeriesDate DA 1 (0008,0022) Acquisition Date AcquisitionDate DA 1 (0008,0023) Content Date ContentDate DA 1 (0008,0024) Overlay Date OverlayDate DA 1 RET (0008,0025) Curve Date CurveDate DA 1 RET (0008,002A) Acquisition DateTime AcquisitionDateTime DT 1 (0008,0030) Study Time StudyTime TM 1 (0008,0031) Series Time SeriesTime TM 1 (0008,0032) Acquisition Time AcquisitionTime TM 1 (0008,0033) Content Time ContentTime TM 1 (0008,0034) Overlay Time OverlayTime TM 1 RET (0008,0035) Curve Time CurveTime TM 1 RET (0008,0040) Data Set Type DataSetType US 1 RET (0008,0041) Data Set Subtype DataSetSubtype LO 1 RET (0008,0042) Nuclear Medicine Series Type NuclearMedicineSeriesType CS 1 RET (0008,0050) Accession Number AccessionNumber SH 1 (0008,0051) Issuer of Accession Number Sequence IssuerOfAccessionNumberSequence SQ 1 (0008,0052) Query/Retrieve Level QueryRetrieveLevel CS 1 (0008,0053) Query/Retrieve View QueryRetrieveView CS 1 (0008,0054) Retrieve AE Title RetrieveAETitle AE 1-n (0008,0055) Station AE Title StationAETitle AE 1 (0008,0056) Instance Availability InstanceAvailability CS 1 (0008,0058) Failed SOP Instance UID List FailedSOPInstanceUIDList UI 1-n (0008,0060) Modality Modality CS 1 (0008,0061) Modalities in Study ModalitiesInStudy CS 1-n (0008,0062) SOP Classes in Study SOPClassesInStudy UI 1-n (0008,0063) Anatomic Regions in Study Code Sequence AnatomicRegionsInStudyCodeSequence SQ 1 (0008,0064) Conversion Type ConversionType CS 1 (0008,0068) Presentation Intent Type PresentationIntentType CS 1 (0008,0070) Manufacturer Manufacturer LO 1 (0008,0080) Institution Name InstitutionName LO 1 (0008,0081) Institution Address InstitutionAddress ST 1 (0008,0082) Institution Code Sequence InstitutionCodeSequence SQ 1 (0008,0090) Referring Physician's Name ReferringPhysicianName PN 1 (0008,0092) Referring Physician's Address ReferringPhysicianAddress ST 1 (0008,0094) Referring Physician's Telephone Numbers ReferringPhysicianTelephoneNumbers SH 1-n (0008,0096) Referring Physician Identification Sequence ReferringPhysicianIdentificationSequence SQ 1 (0008,009C) Consulting Physician's Name ConsultingPhysicianName PN 1-n (0008,009D) Consulting Physician Identification Sequence ConsultingPhysicianIdentificationSequence SQ 1 (0008,0100) Code Value CodeValue SH 1 (0008,0101) Extended Code Value ExtendedCodeValue LO 1 DICOS (0008,0102) Coding Scheme Designator CodingSchemeDesignator SH 1 (0008,0103) Coding Scheme Version CodingSchemeVersion SH 1 (0008,0104) Code Meaning CodeMeaning LO 1 (0008,0105) Mapping Resource MappingResource CS 1 (0008,0106) Context Group Version ContextGroupVersion DT 1 (0008,0107) Context Group Local Version ContextGroupLocalVersion DT 1 (0008,0108) Extended Code Meaning ExtendedCodeMeaning LT 1 DICOS (0008,0109) Coding Scheme Resources Sequence CodingSchemeResourcesSequence SQ 1 (0008,010A) Coding Scheme URL Type CodingSchemeURLType CS 1 (0008,010B) Context Group Extension Flag ContextGroupExtensionFlag CS 1 (0008,010C) Coding Scheme UID CodingSchemeUID UI 1 (0008,010D) Context Group Extension Creator UID ContextGroupExtensionCreatorUID UI 1 (0008,010E) Coding Scheme URL CodingSchemeURL UR 1 (0008,010F) Context Identifier ContextIdentifier CS 1 (0008,0110) Coding Scheme Identification Sequence CodingSchemeIdentificationSequence SQ 1 (0008,0112) Coding Scheme Registry CodingSchemeRegistry LO 1 (0008,0114) Coding Scheme External ID CodingSchemeExternalID ST 1 (0008,0115) Coding Scheme Name CodingSchemeName ST 1 (0008,0116) Coding Scheme Responsible Organization CodingSchemeResponsibleOrganization ST 1 (0008,0117) Context UID ContextUID UI 1 (0008,0118) Mapping Resource UID MappingResourceUID UI 1 (0008,0119) Long Code Value LongCodeValue UC 1 (0008,0120) URN Code Value URNCodeValue UR 1 (0008,0121) Equivalent Code Sequence EquivalentCodeSequence SQ 1 (0008,0122) Mapping Resource Name MappingResourceName LO 1 (0008,0123) Context Group Identification Sequence ContextGroupIdentificationSequence SQ 1 (0008,0124) Mapping Resource Identification Sequence MappingResourceIdentificationSequence SQ 1 (0008,0201) Timezone Offset From UTC TimezoneOffsetFromUTC SH 1 (0008,0220) Responsible Group Code Sequence ResponsibleGroupCodeSequence SQ 1 (0008,0221) Equipment Modality EquipmentModality CS 1 (0008,0222) Manufacturer's Related Model Group ManufacturerRelatedModelGroup LO 1 (0008,0300) Private Data Element Characteristics Sequence PrivateDataElementCharacteristicsSequence SQ 1 (0008,0301) Private Group Reference PrivateGroupReference US 1 (0008,0302) Private Creator Reference PrivateCreatorReference LO 1 (0008,0303) Block Identifying Information Status BlockIdentifyingInformationStatus CS 1 (0008,0304) Nonidentifying Private Elements NonidentifyingPrivateElements US 1-n (0008,0305) Deidentification Action Sequence DeidentificationActionSequence SQ 1 (0008,0306) Identifying Private Elements IdentifyingPrivateElements US 1-n (0008,0307) Deidentification Action DeidentificationAction CS 1 (0008,0308) Private Data Element PrivateDataElement US 1 (0008,0309) Private Data Element Value Multiplicity PrivateDataElementValueMultiplicity UL 1-3 (0008,030A) Private Data Element Value Representation PrivateDataElementValueRepresentation CS 1 (0008,030B) Private Data Element Number of Items PrivateDataElementNumberOfItems UL 1-2 (0008,030C) Private Data Element Name PrivateDataElementName UC 1 (0008,030D) Private Data Element Keyword PrivateDataElementKeyword UC 1 (0008,030E) Private Data Element Description PrivateDataElementDescription UT 1 (0008,030F) Private Data Element Encoding PrivateDataElementEncoding UT 1 (0008,0310) Private Data Element Definition Sequence PrivateDataElementDefinitionSequence SQ 1 (0008,1000) Network ID NetworkID AE 1 RET (0008,1010) Station Name StationName SH 1 (0008,1030) Study Description StudyDescription LO 1 (0008,1032) Procedure Code Sequence ProcedureCodeSequence SQ 1 (0008,103E) Series Description SeriesDescription LO 1 (0008,103F) Series Description Code Sequence SeriesDescriptionCodeSequence SQ 1 (0008,1040) Institutional Department Name InstitutionalDepartmentName LO 1 (0008,1041) Institutional Department Type Code Sequence InstitutionalDepartmentTypeCodeSequence SQ 1 (0008,1048) Physician(s) of Record PhysiciansOfRecord PN 1-n (0008,1049) Physician(s) of Record Identification Sequence PhysiciansOfRecordIdentificationSequence SQ 1 (0008,1050) Performing Physician's Name PerformingPhysicianName PN 1-n (0008,1052) Performing Physician Identification Sequence PerformingPhysicianIdentificationSequence SQ 1 (0008,1060) Name of Physician(s) Reading Study NameOfPhysiciansReadingStudy PN 1-n (0008,1062) Physician(s) Reading Study Identification Sequence PhysiciansReadingStudyIdentificationSequence SQ 1 (0008,1070) Operators' Name OperatorsName PN 1-n (0008,1072) Operator Identification Sequence OperatorIdentificationSequence SQ 1 (0008,1080) Admitting Diagnoses Description AdmittingDiagnosesDescription LO 1-n (0008,1084) Admitting Diagnoses Code Sequence AdmittingDiagnosesCodeSequence SQ 1 (0008,1090) Manufacturer's Model Name ManufacturerModelName LO 1 (0008,1100) Referenced Results Sequence ReferencedResultsSequence SQ 1 RET (0008,1110) Referenced Study Sequence ReferencedStudySequence SQ 1 (0008,1111) Referenced Performed Procedure Step Sequence ReferencedPerformedProcedureStepSequence SQ 1 (0008,1115) Referenced Series Sequence ReferencedSeriesSequence SQ 1 (0008,1120) Referenced Patient Sequence ReferencedPatientSequence SQ 1 (0008,1125) Referenced Visit Sequence ReferencedVisitSequence SQ 1 (0008,1130) Referenced Overlay Sequence ReferencedOverlaySequence SQ 1 RET (0008,1134) Referenced Stereometric Instance Sequence ReferencedStereometricInstanceSequence SQ 1 (0008,113A) Referenced Waveform Sequence ReferencedWaveformSequence SQ 1 (0008,1140) Referenced Image Sequence ReferencedImageSequence SQ 1 (0008,1145) Referenced Curve Sequence ReferencedCurveSequence SQ 1 RET (0008,114A) Referenced Instance Sequence ReferencedInstanceSequence SQ 1 (0008,114B) Referenced Real World Value Mapping Instance Sequence ReferencedRealWorldValueMappingInstanceSequence SQ 1 (0008,1150) Referenced SOP Class UID ReferencedSOPClassUID UI 1 (0008,1155) Referenced SOP Instance UID ReferencedSOPInstanceUID UI 1 (0008,1156) Definition Source Sequence DefinitionSourceSequence SQ 1 (0008,115A) SOP Classes Supported SOPClassesSupported UI 1-n (0008,1160) Referenced Frame Number ReferencedFrameNumber IS 1-n (0008,1161) Simple Frame List SimpleFrameList UL 1-n (0008,1162) Calculated Frame List CalculatedFrameList UL 3-3n (0008,1163) Time Range TimeRange FD 2 (0008,1164) Frame Extraction Sequence FrameExtractionSequence SQ 1 (0008,1167) Multi-frame Source SOP Instance UID MultiFrameSourceSOPInstanceUID UI 1 (0008,1190) Retrieve URL RetrieveURL UR 1 (0008,1195) Transaction UID TransactionUID UI 1 (0008,1196) Warning Reason WarningReason US 1 (0008,1197) Failure Reason FailureReason US 1 (0008,1198) Failed SOP Sequence FailedSOPSequence SQ 1 (0008,1199) Referenced SOP Sequence ReferencedSOPSequence SQ 1 (0008,119A) Other Failures Sequence OtherFailuresSequence SQ 1 (0008,1200) Studies Containing Other Referenced Instances Sequence StudiesContainingOtherReferencedInstancesSequence SQ 1 (0008,1250) Related Series Sequence RelatedSeriesSequence SQ 1 (0008,2110) Lossy Image Compression (Retired) LossyImageCompressionRetired CS 1 RET (0008,2111) Derivation Description DerivationDescription ST 1 (0008,2112) Source Image Sequence SourceImageSequence SQ 1 (0008,2120) Stage Name StageName SH 1 (0008,2122) Stage Number StageNumber IS 1 (0008,2124) Number of Stages NumberOfStages IS 1 (0008,2127) View Name ViewName SH 1 (0008,2128) View Number ViewNumber IS 1 (0008,2129) Number of Event Timers NumberOfEventTimers IS 1 (0008,212A) Number of Views in Stage NumberOfViewsInStage IS 1 (0008,2130) Event Elapsed Time(s) EventElapsedTimes DS 1-n (0008,2132) Event Timer Name(s) EventTimerNames LO 1-n (0008,2133) Event Timer Sequence EventTimerSequence SQ 1 (0008,2134) Event Time Offset EventTimeOffset FD 1 (0008,2135) Event Code Sequence EventCodeSequence SQ 1 (0008,2142) Start Trim StartTrim IS 1 (0008,2143) Stop Trim StopTrim IS 1 (0008,2144) Recommended Display Frame Rate RecommendedDisplayFrameRate IS 1 (0008,2200) Transducer Position TransducerPosition CS 1 RET (0008,2204) Transducer Orientation TransducerOrientation CS 1 RET (0008,2208) Anatomic Structure AnatomicStructure CS 1 RET (0008,2218) Anatomic Region Sequence AnatomicRegionSequence SQ 1 (0008,2220) Anatomic Region Modifier Sequence AnatomicRegionModifierSequence SQ 1 (0008,2228) Primary Anatomic Structure Sequence PrimaryAnatomicStructureSequence SQ 1 (0008,2229) Anatomic Structure, Space or Region Sequence AnatomicStructureSpaceOrRegionSequence SQ 1 RET (0008,2230) Primary Anatomic Structure Modifier Sequence PrimaryAnatomicStructureModifierSequence SQ 1 (0008,2240) Transducer Position Sequence TransducerPositionSequence SQ 1 RET (0008,2242) Transducer Position Modifier Sequence TransducerPositionModifierSequence SQ 1 RET (0008,2244) Transducer Orientation Sequence TransducerOrientationSequence SQ 1 RET (0008,2246) Transducer Orientation Modifier Sequence TransducerOrientationModifierSequence SQ 1 RET (0008,2251) Anatomic Structure Space Or Region Code Sequence (Trial) AnatomicStructureSpaceOrRegionCodeSequenceTrial SQ 1 RET (0008,2253) Anatomic Portal Of Entrance Code Sequence (Trial) AnatomicPortalOfEntranceCodeSequenceTrial SQ 1 RET (0008,2255) Anatomic Approach Direction Code Sequence (Trial) AnatomicApproachDirectionCodeSequenceTrial SQ 1 RET (0008,2256) Anatomic Perspective Description (Trial) AnatomicPerspectiveDescriptionTrial ST 1 RET (0008,2257) Anatomic Perspective Code Sequence (Trial) AnatomicPerspectiveCodeSequenceTrial SQ 1 RET (0008,2258) Anatomic Location Of Examining Instrument Description (Trial) AnatomicLocationOfExaminingInstrumentDescriptionTrial ST 1 RET (0008,2259) Anatomic Location Of Examining Instrument Code Sequence (Trial) AnatomicLocationOfExaminingInstrumentCodeSequenceTrial SQ 1 RET (0008,225A) Anatomic Structure Space Or Region Modifier Code Sequence (Trial) AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial SQ 1 RET (0008,225C) On Axis Background Anatomic Structure Code Sequence (Trial) OnAxisBackgroundAnatomicStructureCodeSequenceTrial SQ 1 RET (0008,3001) Alternate Representation Sequence AlternateRepresentationSequence SQ 1 (0008,3002) Available Transfer Syntax UID AvailableTransferSyntaxUID UI 1-n (0008,3010) Irradiation Event UID IrradiationEventUID UI 1-n (0008,3011) Source Irradiation Event Sequence SourceIrradiationEventSequence SQ 1 (0008,3012) Radiopharmaceutical Administration Event UID RadiopharmaceuticalAdministrationEventUID UI 1 (0008,4000) Identifying Comments IdentifyingComments LT 1 RET (0008,9007) Frame Type FrameType CS 4 (0008,9092) Referenced Image Evidence Sequence ReferencedImageEvidenceSequence SQ 1 (0008,9121) Referenced Raw Data Sequence ReferencedRawDataSequence SQ 1 (0008,9123) Creator-Version UID CreatorVersionUID UI 1 (0008,9124) Derivation Image Sequence DerivationImageSequence SQ 1 (0008,9154) Source Image Evidence Sequence SourceImageEvidenceSequence SQ 1 (0008,9205) Pixel Presentation PixelPresentation CS 1 (0008,9206) Volumetric Properties VolumetricProperties CS 1 (0008,9207) Volume Based Calculation Technique VolumeBasedCalculationTechnique CS 1 (0008,9208) Complex Image Component ComplexImageComponent CS 1 (0008,9209) Acquisition Contrast AcquisitionContrast CS 1 (0008,9215) Derivation Code Sequence DerivationCodeSequence SQ 1 (0008,9237) Referenced Presentation State Sequence ReferencedPresentationStateSequence SQ 1 (0008,9410) Referenced Other Plane Sequence ReferencedOtherPlaneSequence SQ 1 (0008,9458) Frame Display Sequence FrameDisplaySequence SQ 1 (0008,9459) Recommended Display Frame Rate in Float RecommendedDisplayFrameRateInFloat FL 1 (0008,9460) Skip Frame Range Flag SkipFrameRangeFlag CS 1 (0010,0010) Patient's Name PatientName PN 1 (0010,0020) Patient ID PatientID LO 1 (0010,0021) Issuer of Patient ID IssuerOfPatientID LO 1 (0010,0022) Type of Patient ID TypeOfPatientID CS 1 (0010,0024) Issuer of Patient ID Qualifiers Sequence IssuerOfPatientIDQualifiersSequence SQ 1 (0010,0026) Source Patient Group Identification Sequence SourcePatientGroupIdentificationSequence SQ 1 (0010,0027) Group of Patients Identification Sequence GroupOfPatientsIdentificationSequence SQ 1 (0010,0028) Subject Relative Position in Image SubjectRelativePositionInImage US 3 (0010,0030) Patient's Birth Date PatientBirthDate DA 1 (0010,0032) Patient's Birth Time PatientBirthTime TM 1 (0010,0033) Patient's Birth Date in Alternative Calendar PatientBirthDateInAlternativeCalendar LO 1 (0010,0034) Patient's Death Date in Alternative Calendar PatientDeathDateInAlternativeCalendar LO 1 (0010,0035) Patient's Alternative Calendar PatientAlternativeCalendar CS 1 (0010,0040) Patient's Sex PatientSex CS 1 (0010,0050) Patient's Insurance Plan Code Sequence PatientInsurancePlanCodeSequence SQ 1 (0010,0101) Patient's Primary Language Code Sequence PatientPrimaryLanguageCodeSequence SQ 1 (0010,0102) Patient's Primary Language Modifier Code Sequence PatientPrimaryLanguageModifierCodeSequence SQ 1 (0010,0200) Quality Control Subject QualityControlSubject CS 1 (0010,0201) Quality Control Subject Type Code Sequence QualityControlSubjectTypeCodeSequence SQ 1 (0010,0212) Strain Description StrainDescription UC 1 (0010,0213) Strain Nomenclature StrainNomenclature LO 1 (0010,0214) Strain Stock Number StrainStockNumber LO 1 (0010,0215) Strain Source Registry Code Sequence StrainSourceRegistryCodeSequence SQ 1 (0010,0216) Strain Stock Sequence StrainStockSequence SQ 1 (0010,0217) Strain Source StrainSource LO 1 (0010,0218) Strain Additional Information StrainAdditionalInformation UT 1 (0010,0219) Strain Code Sequence StrainCodeSequence SQ 1 (0010,0221) Genetic Modifications Sequence GeneticModificationsSequence SQ 1 (0010,0222) Genetic Modifications Description GeneticModificationsDescription UC 1 (0010,0223) Genetic Modifications Nomenclature GeneticModificationsNomenclature LO 1 (0010,0229) Genetic Modifications Code Sequence GeneticModificationsCodeSequence SQ 1 (0010,1000) Other Patient IDs OtherPatientIDs LO 1-n RET (0010,1001) Other Patient Names OtherPatientNames PN 1-n (0010,1002) Other Patient IDs Sequence OtherPatientIDsSequence SQ 1 (0010,1005) Patient's Birth Name PatientBirthName PN 1 (0010,1010) Patient's Age PatientAge AS 1 (0010,1020) Patient's Size PatientSize DS 1 (0010,1021) Patient's Size Code Sequence PatientSizeCodeSequence SQ 1 (0010,1022) Patient's Body Mass Index PatientBodyMassIndex DS 1 (0010,1023) Measured AP Dimension MeasuredAPDimension DS 1 (0010,1024) Measured Lateral Dimension MeasuredLateralDimension DS 1 (0010,1030) Patient's Weight PatientWeight DS 1 (0010,1040) Patient's Address PatientAddress LO 1 (0010,1050) Insurance Plan Identification InsurancePlanIdentification LO 1-n RET (0010,1060) Patient's Mother's Birth Name PatientMotherBirthName PN 1 (0010,1080) Military Rank MilitaryRank LO 1 (0010,1081) Branch of Service BranchOfService LO 1 (0010,1090) Medical Record Locator MedicalRecordLocator LO 1 RET (0010,1100) Referenced Patient Photo Sequence ReferencedPatientPhotoSequence SQ 1 (0010,2000) Medical Alerts MedicalAlerts LO 1-n (0010,2110) Allergies Allergies LO 1-n (0010,2150) Country of Residence CountryOfResidence LO 1 (0010,2152) Region of Residence RegionOfResidence LO 1 (0010,2154) Patient's Telephone Numbers PatientTelephoneNumbers SH 1-n (0010,2155) Patient's Telecom Information PatientTelecomInformation LT 1 (0010,2160) Ethnic Group EthnicGroup SH 1 (0010,2180) Occupation Occupation SH 1 (0010,21A0) Smoking Status SmokingStatus CS 1 (0010,21B0) Additional Patient History AdditionalPatientHistory LT 1 (0010,21C0) Pregnancy Status PregnancyStatus US 1 (0010,21D0) Last Menstrual Date LastMenstrualDate DA 1 (0010,21F0) Patient's Religious Preference PatientReligiousPreference LO 1 (0010,2201) Patient Species Description PatientSpeciesDescription LO 1 (0010,2202) Patient Species Code Sequence PatientSpeciesCodeSequence SQ 1 (0010,2203) Patient's Sex Neutered PatientSexNeutered CS 1 (0010,2210) Anatomical Orientation Type AnatomicalOrientationType CS 1 (0010,2292) Patient Breed Description PatientBreedDescription LO 1 (0010,2293) Patient Breed Code Sequence PatientBreedCodeSequence SQ 1 (0010,2294) Breed Registration Sequence BreedRegistrationSequence SQ 1 (0010,2295) Breed Registration Number BreedRegistrationNumber LO 1 (0010,2296) Breed Registry Code Sequence BreedRegistryCodeSequence SQ 1 (0010,2297) Responsible Person ResponsiblePerson PN 1 (0010,2298) Responsible Person Role ResponsiblePersonRole CS 1 (0010,2299) Responsible Organization ResponsibleOrganization LO 1 (0010,4000) Patient Comments PatientComments LT 1 (0010,9431) Examined Body Thickness ExaminedBodyThickness FL 1 (0012,0010) Clinical Trial Sponsor Name ClinicalTrialSponsorName LO 1 (0012,0020) Clinical Trial Protocol ID ClinicalTrialProtocolID LO 1 (0012,0021) Clinical Trial Protocol Name ClinicalTrialProtocolName LO 1 (0012,0030) Clinical Trial Site ID ClinicalTrialSiteID LO 1 (0012,0031) Clinical Trial Site Name ClinicalTrialSiteName LO 1 (0012,0040) Clinical Trial Subject ID ClinicalTrialSubjectID LO 1 (0012,0042) Clinical Trial Subject Reading ID ClinicalTrialSubjectReadingID LO 1 (0012,0050) Clinical Trial Time Point ID ClinicalTrialTimePointID LO 1 (0012,0051) Clinical Trial Time Point Description ClinicalTrialTimePointDescription ST 1 (0012,0052) Longitudinal Temporal Offset from Event LongitudinalTemporalOffsetFromEvent FD 1 (0012,0053) Longitudinal Temporal Event Type LongitudinalTemporalEventType CS 1 (0012,0060) Clinical Trial Coordinating Center Name ClinicalTrialCoordinatingCenterName LO 1 (0012,0062) Patient Identity Removed PatientIdentityRemoved CS 1 (0012,0063) De-identification Method DeidentificationMethod LO 1-n (0012,0064) De-identification Method Code Sequence DeidentificationMethodCodeSequence SQ 1 (0012,0071) Clinical Trial Series ID ClinicalTrialSeriesID LO 1 (0012,0072) Clinical Trial Series Description ClinicalTrialSeriesDescription LO 1 (0012,0081) Clinical Trial Protocol Ethics Committee Name ClinicalTrialProtocolEthicsCommitteeName LO 1 (0012,0082) Clinical Trial Protocol Ethics Committee Approval Number ClinicalTrialProtocolEthicsCommitteeApprovalNumber LO 1 (0012,0083) Consent for Clinical Trial Use Sequence ConsentForClinicalTrialUseSequence SQ 1 (0012,0084) Distribution Type DistributionType CS 1 (0012,0085) Consent for Distribution Flag ConsentForDistributionFlag CS 1 (0012,0086) Ethics Committee Approval Effectiveness Start Date EthicsCommitteeApprovalEffectivenessStartDate DA 1 (0012,0087) Ethics Committee Approval Effectiveness End Date EthicsCommitteeApprovalEffectivenessEndDate DA 1 (0014,0023) CAD File Format CADFileFormat ST 1 RET (0014,0024) Component Reference System ComponentReferenceSystem ST 1 RET (0014,0025) Component Manufacturing Procedure ComponentManufacturingProcedure ST 1 DICONDE (0014,0028) Component Manufacturer ComponentManufacturer ST 1 DICONDE (0014,0030) Material Thickness MaterialThickness DS 1-n DICONDE (0014,0032) Material Pipe Diameter MaterialPipeDiameter DS 1-n DICONDE (0014,0034) Material Isolation Diameter MaterialIsolationDiameter DS 1-n DICONDE (0014,0042) Material Grade MaterialGrade ST 1 DICONDE (0014,0044) Material Properties Description MaterialPropertiesDescription ST 1 DICONDE (0014,0045) Material Properties File Format (Retired) MaterialPropertiesFileFormatRetired ST 1 RET (0014,0046) Material Notes MaterialNotes LT 1 DICONDE (0014,0050) Component Shape ComponentShape CS 1 DICONDE (0014,0052) Curvature Type CurvatureType CS 1 DICONDE (0014,0054) Outer Diameter OuterDiameter DS 1 DICONDE (0014,0056) Inner Diameter InnerDiameter DS 1 DICONDE (0014,0100) Component Welder IDs ComponentWelderIDs LO 1-n DICONDE (0014,0101) Secondary Approval Status SecondaryApprovalStatus CS 1 DICONDE (0014,0102) Secondary Review Date SecondaryReviewDate DA 1 DICONDE (0014,0103) Secondary Review Time SecondaryReviewTime TM 1 DICONDE (0014,0104) Secondary Reviewer Name SecondaryReviewerName PN 1 DICONDE (0014,0105) Repair ID RepairID ST 1 DICONDE (0014,0106) Multiple Component Approval Sequence MultipleComponentApprovalSequence SQ 1 DICONDE (0014,0107) Other Approval Status OtherApprovalStatus CS 1-n DICONDE (0014,0108) Other Secondary Approval Status OtherSecondaryApprovalStatus CS 1-n DICONDE (0014,1010) Actual Environmental Conditions ActualEnvironmentalConditions ST 1 DICONDE (0014,1020) Expiry Date ExpiryDate DA 1 DICONDE (0014,1040) Environmental Conditions EnvironmentalConditions ST 1 DICONDE (0014,2002) Evaluator Sequence EvaluatorSequence SQ 1 DICONDE (0014,2004) Evaluator Number EvaluatorNumber IS 1 DICONDE (0014,2006) Evaluator Name EvaluatorName PN 1 DICONDE (0014,2008) Evaluation Attempt EvaluationAttempt IS 1 DICONDE (0014,2012) Indication Sequence IndicationSequence SQ 1 DICONDE (0014,2014) Indication Number IndicationNumber IS 1 DICONDE (0014,2016) Indication Label IndicationLabel SH 1 DICONDE (0014,2018) Indication Description IndicationDescription ST 1 DICONDE (0014,201A) Indication Type IndicationType CS 1-n DICONDE (0014,201C) Indication Disposition IndicationDisposition CS 1 DICONDE (0014,201E) Indication ROI Sequence IndicationROISequence SQ 1 DICONDE (0014,2030) Indication Physical Property Sequence IndicationPhysicalPropertySequence SQ 1 DICONDE (0014,2032) Property Label PropertyLabel SH 1 DICONDE (0014,2202) Coordinate System Number of Axes CoordinateSystemNumberOfAxes IS 1 DICONDE (0014,2204) Coordinate System Axes Sequence CoordinateSystemAxesSequence SQ 1 DICONDE (0014,2206) Coordinate System Axis Description CoordinateSystemAxisDescription ST 1 DICONDE (0014,2208) Coordinate System Data Set Mapping CoordinateSystemDataSetMapping CS 1 DICONDE (0014,220A) Coordinate System Axis Number CoordinateSystemAxisNumber IS 1 DICONDE (0014,220C) Coordinate System Axis Type CoordinateSystemAxisType CS 1 DICONDE (0014,220E) Coordinate System Axis Units CoordinateSystemAxisUnits CS 1 DICONDE (0014,2210) Coordinate System Axis Values CoordinateSystemAxisValues OB 1 DICONDE (0014,2220) Coordinate System Transform Sequence CoordinateSystemTransformSequence SQ 1 DICONDE (0014,2222) Transform Description TransformDescription ST 1 DICONDE (0014,2224) Transform Number of Axes TransformNumberOfAxes IS 1 DICONDE (0014,2226) Transform Order of Axes TransformOrderOfAxes IS 1-n DICONDE (0014,2228) Transformed Axis Units TransformedAxisUnits CS 1 DICONDE (0014,222A) Coordinate System Transform Rotation and Scale Matrix CoordinateSystemTransformRotationAndScaleMatrix DS 1-n DICONDE (0014,222C) Coordinate System Transform Translation Matrix CoordinateSystemTransformTranslationMatrix DS 1-n DICONDE (0014,3011) Internal Detector Frame Time InternalDetectorFrameTime DS 1 DICONDE (0014,3012) Number of Frames Integrated NumberOfFramesIntegrated DS 1 DICONDE (0014,3020) Detector Temperature Sequence DetectorTemperatureSequence SQ 1 DICONDE (0014,3022) Sensor Name SensorName ST 1 DICONDE (0014,3024) Horizontal Offset of Sensor HorizontalOffsetOfSensor DS 1 DICONDE (0014,3026) Vertical Offset of Sensor VerticalOffsetOfSensor DS 1 DICONDE (0014,3028) Sensor Temperature SensorTemperature DS 1 DICONDE (0014,3040) Dark Current Sequence DarkCurrentSequence SQ 1 DICONDE (0014,3050) Dark Current Counts DarkCurrentCounts OB or OW 1 DICONDE (0014,3060) Gain Correction Reference Sequence GainCorrectionReferenceSequence SQ 1 DICONDE (0014,3070) Air Counts AirCounts OB or OW 1 DICONDE (0014,3071) KV Used in Gain Calibration KVUsedInGainCalibration DS 1 DICONDE (0014,3072) MA Used in Gain Calibration MAUsedInGainCalibration DS 1 DICONDE (0014,3073) Number of Frames Used for Integration NumberOfFramesUsedForIntegration DS 1 DICONDE (0014,3074) Filter Material Used in Gain Calibration FilterMaterialUsedInGainCalibration LO 1 DICONDE (0014,3075) Filter Thickness Used in Gain Calibration FilterThicknessUsedInGainCalibration DS 1 DICONDE (0014,3076) Date of Gain Calibration DateOfGainCalibration DA 1 DICONDE (0014,3077) Time of Gain Calibration TimeOfGainCalibration TM 1 DICONDE (0014,3080) Bad Pixel Image BadPixelImage OB 1 DICONDE (0014,3099) Calibration Notes CalibrationNotes LT 1 DICONDE (0014,4002) Pulser Equipment Sequence PulserEquipmentSequence SQ 1 DICONDE (0014,4004) Pulser Type PulserType CS 1 DICONDE (0014,4006) Pulser Notes PulserNotes LT 1 DICONDE (0014,4008) Receiver Equipment Sequence ReceiverEquipmentSequence SQ 1 DICONDE (0014,400A) Amplifier Type AmplifierType CS 1 DICONDE (0014,400C) Receiver Notes ReceiverNotes LT 1 DICONDE (0014,400E) Pre-Amplifier Equipment Sequence PreAmplifierEquipmentSequence SQ 1 DICONDE (0014,400F) Pre-Amplifier Notes PreAmplifierNotes LT 1 DICONDE (0014,4010) Transmit Transducer Sequence TransmitTransducerSequence SQ 1 DICONDE (0014,4011) Receive Transducer Sequence ReceiveTransducerSequence SQ 1 DICONDE (0014,4012) Number of Elements NumberOfElements US 1 DICONDE (0014,4013) Element Shape ElementShape CS 1 DICONDE (0014,4014) Element Dimension A ElementDimensionA DS 1 DICONDE (0014,4015) Element Dimension B ElementDimensionB DS 1 DICONDE (0014,4016) Element Pitch A ElementPitchA DS 1 DICONDE (0014,4017) Measured Beam Dimension A MeasuredBeamDimensionA DS 1 DICONDE (0014,4018) Measured Beam Dimension B MeasuredBeamDimensionB DS 1 DICONDE (0014,4019) Location of Measured Beam Diameter LocationOfMeasuredBeamDiameter DS 1 DICONDE (0014,401A) Nominal Frequency NominalFrequency DS 1 DICONDE (0014,401B) Measured Center Frequency MeasuredCenterFrequency DS 1 DICONDE (0014,401C) Measured Bandwidth MeasuredBandwidth DS 1 DICONDE (0014,401D) Element Pitch B ElementPitchB DS 1 DICONDE (0014,4020) Pulser Settings Sequence PulserSettingsSequence SQ 1 DICONDE (0014,4022) Pulse Width PulseWidth DS 1 DICONDE (0014,4024) Excitation Frequency ExcitationFrequency DS 1 DICONDE (0014,4026) Modulation Type ModulationType CS 1 DICONDE (0014,4028) Damping Damping DS 1 DICONDE (0014,4030) Receiver Settings Sequence ReceiverSettingsSequence SQ 1 DICONDE (0014,4031) Acquired Soundpath Length AcquiredSoundpathLength DS 1 DICONDE (0014,4032) Acquisition Compression Type AcquisitionCompressionType CS 1 DICONDE (0014,4033) Acquisition Sample Size AcquisitionSampleSize IS 1 DICONDE (0014,4034) Rectifier Smoothing RectifierSmoothing DS 1 DICONDE (0014,4035) DAC Sequence DACSequence SQ 1 DICONDE (0014,4036) DAC Type DACType CS 1 DICONDE (0014,4038) DAC Gain Points DACGainPoints DS 1-n DICONDE (0014,403A) DAC Time Points DACTimePoints DS 1-n DICONDE (0014,403C) DAC Amplitude DACAmplitude DS 1-n DICONDE (0014,4040) Pre-Amplifier Settings Sequence PreAmplifierSettingsSequence SQ 1 DICONDE (0014,4050) Transmit Transducer Settings Sequence TransmitTransducerSettingsSequence SQ 1 DICONDE (0014,4051) Receive Transducer Settings Sequence ReceiveTransducerSettingsSequence SQ 1 DICONDE (0014,4052) Incident Angle IncidentAngle DS 1 DICONDE (0014,4054) Coupling Technique CouplingTechnique ST 1 DICONDE (0014,4056) Coupling Medium CouplingMedium ST 1 DICONDE (0014,4057) Coupling Velocity CouplingVelocity DS 1 DICONDE (0014,4058) Probe Center Location X ProbeCenterLocationX DS 1 DICONDE (0014,4059) Probe Center Location Z ProbeCenterLocationZ DS 1 DICONDE (0014,405A) Sound Path Length SoundPathLength DS 1 DICONDE (0014,405C) Delay Law Identifier DelayLawIdentifier ST 1 DICONDE (0014,4060) Gate Settings Sequence GateSettingsSequence SQ 1 DICONDE (0014,4062) Gate Threshold GateThreshold DS 1 DICONDE (0014,4064) Velocity of Sound VelocityOfSound DS 1 DICONDE (0014,4070) Calibration Settings Sequence CalibrationSettingsSequence SQ 1 DICONDE (0014,4072) Calibration Procedure CalibrationProcedure ST 1 DICONDE (0014,4074) Procedure Version ProcedureVersion SH 1 DICONDE (0014,4076) Procedure Creation Date ProcedureCreationDate DA 1 DICONDE (0014,4078) Procedure Expiration Date ProcedureExpirationDate DA 1 DICONDE (0014,407A) Procedure Last Modified Date ProcedureLastModifiedDate DA 1 DICONDE (0014,407C) Calibration Time CalibrationTime TM 1-n DICONDE (0014,407E) Calibration Date CalibrationDate DA 1-n DICONDE (0014,4080) Probe Drive Equipment Sequence ProbeDriveEquipmentSequence SQ 1 DICONDE (0014,4081) Drive Type DriveType CS 1 DICONDE (0014,4082) Probe Drive Notes ProbeDriveNotes LT 1 DICONDE (0014,4083) Drive Probe Sequence DriveProbeSequence SQ 1 DICONDE (0014,4084) Probe Inductance ProbeInductance DS 1 DICONDE (0014,4085) Probe Resistance ProbeResistance DS 1 DICONDE (0014,4086) Receive Probe Sequence ReceiveProbeSequence SQ 1 DICONDE (0014,4087) Probe Drive Settings Sequence ProbeDriveSettingsSequence SQ 1 DICONDE (0014,4088) Bridge Resistors BridgeResistors DS 1 DICONDE (0014,4089) Probe Orientation Angle ProbeOrientationAngle DS 1 DICONDE (0014,408B) User Selected Gain Y UserSelectedGainY DS 1 DICONDE (0014,408C) User Selected Phase UserSelectedPhase DS 1 DICONDE (0014,408D) User Selected Offset X UserSelectedOffsetX DS 1 DICONDE (0014,408E) User Selected Offset Y UserSelectedOffsetY DS 1 DICONDE (0014,4091) Channel Settings Sequence ChannelSettingsSequence SQ 1 DICONDE (0014,4092) Channel Threshold ChannelThreshold DS 1 DICONDE (0014,409A) Scanner Settings Sequence ScannerSettingsSequence SQ 1 DICONDE (0014,409B) Scan Procedure ScanProcedure ST 1 DICONDE (0014,409C) Translation Rate X TranslationRateX DS 1 DICONDE (0014,409D) Translation Rate Y TranslationRateY DS 1 DICONDE (0014,409F) Channel Overlap ChannelOverlap DS 1 DICONDE (0014,40A0) Image Quality Indicator Type ImageQualityIndicatorType LO 1 DICONDE (0014,40A1) Image Quality Indicator Material ImageQualityIndicatorMaterial LO 1 DICONDE (0014,40A2) Image Quality Indicator Size ImageQualityIndicatorSize LO 1 DICONDE (0014,5002) LINAC Energy LINACEnergy IS 1 DICONDE (0014,5004) LINAC Output LINACOutput IS 1 DICONDE (0014,5100) Active Aperture ActiveAperture US 1 DICONDE (0014,5101) Total Aperture TotalAperture DS 1 DICONDE (0014,5102) Aperture Elevation ApertureElevation DS 1 DICONDE (0014,5103) Main Lobe Angle MainLobeAngle DS 1 DICONDE (0014,5104) Main Roof Angle MainRoofAngle DS 1 DICONDE (0014,5105) Connector Type ConnectorType CS 1 DICONDE (0014,5106) Wedge Model Number WedgeModelNumber SH 1 DICONDE (0014,5107) Wedge Angle Float WedgeAngleFloat DS 1 DICONDE (0014,5108) Wedge Roof Angle WedgeRoofAngle DS 1 DICONDE (0014,5109) Wedge Element 1 Position WedgeElement1Position CS 1 DICONDE (0014,510A) Wedge Material Velocity WedgeMaterialVelocity DS 1 DICONDE (0014,510B) Wedge Material WedgeMaterial SH 1 DICONDE (0014,510C) Wedge Offset Z WedgeOffsetZ DS 1 DICONDE (0014,510D) Wedge Origin Offset X WedgeOriginOffsetX DS 1 DICONDE (0014,510E) Wedge Time Delay WedgeTimeDelay DS 1 DICONDE (0014,510F) Wedge Name WedgeName SH 1 DICONDE (0014,5110) Wedge Manufacturer Name WedgeManufacturerName SH 1 DICONDE (0014,5111) Wedge Description WedgeDescription LO 1 DICONDE (0014,5112) Nominal Beam Angle NominalBeamAngle DS 1 DICONDE (0014,5113) Wedge Offset X WedgeOffsetX DS 1 DICONDE (0014,5114) Wedge Offset Y WedgeOffsetY DS 1 DICONDE (0014,5115) Wedge Total Length WedgeTotalLength DS 1 DICONDE (0014,5116) Wedge In Contact Length WedgeInContactLength DS 1 DICONDE (0014,5117) Wedge Front Gap WedgeFrontGap DS 1 DICONDE (0014,5118) Wedge Total Height WedgeTotalHeight DS 1 DICONDE (0014,5119) Wedge Front Height WedgeFrontHeight DS 1 DICONDE (0014,511A) Wedge Rear Height WedgeRearHeight DS 1 DICONDE (0014,511B) Wedge Total Width WedgeTotalWidth DS 1 DICONDE (0014,511C) Wedge In Contact Width WedgeInContactWidth DS 1 DICONDE (0014,511D) Wedge Chamfer Height WedgeChamferHeight DS 1 DICONDE (0014,511E) Wedge Curve WedgeCurve CS 1 DICONDE (0014,511F) Radius Along the Wedge RadiusAlongWedge DS 1 DICONDE (0016,0001) White Point WhitePoint DS 1 (0016,0002) Primary Chromaticities PrimaryChromaticities DS 3 (0016,0003) Battery Level BatteryLevel UT 1 (0016,0004) Exposure Time in Seconds ExposureTimeInSeconds DS 1 (0016,0005) F-Number FNumber DS 1 (0016,0006) OECF Rows OECFRows IS 1 (0016,0007) OECF Columns OECFColumns IS 1 (0016,0008) OECF Column Names OECFColumnNames UC 1-n (0016,0009) OECF Values OECFValues DS 1-n (0016,000A) Spatial Frequency Response Rows SpatialFrequencyResponseRows IS 1 (0016,000B) Spatial Frequency Response Columns SpatialFrequencyResponseColumns IS 1 (0016,000C) Spatial Frequency Response Column Names SpatialFrequencyResponseColumnNames UC 1-n (0016,000D) Spatial Frequency Response Values SpatialFrequencyResponseValues DS 1-n (0016,000E) Color Filter Array Pattern Rows ColorFilterArrayPatternRows IS 1 (0016,000F) Color Filter Array Pattern Columns ColorFilterArrayPatternColumns IS 1 (0016,0010) Color Filter Array Pattern Values ColorFilterArrayPatternValues DS 1-n (0016,0011) Flash Firing Status FlashFiringStatus US 1 (0016,0012) Flash Return Status FlashReturnStatus US 1 (0016,0013) Flash Mode FlashMode US 1 (0016,0014) Flash Function Present FlashFunctionPresent US 1 (0016,0015) Flash Red Eye Mode FlashRedEyeMode US 1 (0016,0016) Exposure Program ExposureProgram US 1 (0016,0017) Spectral Sensitivity SpectralSensitivity UT 1 (0016,0018) Photographic Sensitivity PhotographicSensitivity IS 1 (0016,0019) Self Timer Mode SelfTimerMode IS 1 (0016,001A) Sensitivity Type SensitivityType US 1 (0016,001B) Standard Output Sensitivity StandardOutputSensitivity IS 1 (0016,001C) Recommended Exposure Index RecommendedExposureIndex IS 1 (0016,001D) ISO Speed ISOSpeed IS 1 (0016,001E) ISO Speed Latitude yyy ISOSpeedLatitudeyyy IS 1 (0016,001F) ISO Speed Latitude zzz ISOSpeedLatitudezzz IS 1 (0016,0020) EXIF Version EXIFVersion UT 1 (0016,0021) Shutter Speed Value ShutterSpeedValue DS 1 (0016,0022) Aperture Value ApertureValue DS 1 (0016,0023) Brightness Value BrightnessValue DS 1 (0016,0024) Exposure Bias Value ExposureBiasValue DS 1 (0016,0025) Max Aperture Value MaxApertureValue DS 1 (0016,0026) Subject Distance SubjectDistance DS 1 (0016,0027) Metering Mode MeteringMode US 1 (0016,0028) Light Source LightSource US 1 (0016,0029) Focal Length FocalLength DS 1 (0016,002A) Subject Area SubjectArea IS 2-4 (0016,002B) Maker Note MakerNote OB 1 (0016,0030) Temperature Temperature DS 1 (0016,0031) Humidity Humidity DS 1 (0016,0032) Pressure Pressure DS 1 (0016,0033) Water Depth WaterDepth DS 1 (0016,0034) Acceleration Acceleration DS 1 (0016,0035) Camera Elevation Angle CameraElevationAngle DS 1 (0016,0036) Flash Energy FlashEnergy DS 1-2 (0016,0037) Subject Location SubjectLocation IS 2 (0016,0038) Photographic Exposure Index PhotographicExposureIndex DS 1 (0016,0039) Sensing Method SensingMethod US 1 (0016,003A) File Source FileSource US 1 (0016,003B) Scene Type SceneType US 1 (0016,0041) Custom Rendered CustomRendered US 1 (0016,0042) Exposure Mode ExposureMode US 1 (0016,0043) White Balance WhiteBalance US 1 (0016,0044) Digital Zoom Ratio DigitalZoomRatio DS 1 (0016,0045) Focal Length In 35mm Film FocalLengthIn35mmFilm IS 1 (0016,0046) Scene Capture Type SceneCaptureType US 1 (0016,0047) Gain Control GainControl US 1 (0016,0048) Contrast Contrast US 1 (0016,0049) Saturation Saturation US 1 (0016,004A) Sharpness Sharpness US 1 (0016,004B) Device Setting Description DeviceSettingDescription OB 1 (0016,004C) Subject Distance Range SubjectDistanceRange US 1 (0016,004D) Camera Owner Name CameraOwnerName UT 1 (0016,004E) Lens Specification LensSpecification DS 4 (0016,004F) Lens Make LensMake UT 1 (0016,0050) Lens Model LensModel UT 1 (0016,0051) Lens Serial Number LensSerialNumber UT 1 (0016,0061) Interoperability Index InteroperabilityIndex CS 1 (0016,0062) Interoperability Version InteroperabilityVersion OB 1 (0016,0070) GPS Version ID GPSVersionID OB 1 (0016,0071) GPS Latitude Ref GPSLatitudeRef CS 1 (0016,0072) GPS Latitude GPSLatitude DS 3 (0016,0073) GPS Longitude Ref GPSLongitudeRef CS 1 (0016,0074) GPS Longitude GPSLongitude DS 3 (0016,0075) GPS Altitude Ref GPSAltitudeRef US 1 (0016,0076) GPS Altitude GPSAltitude DS 1 (0016,0077) GPS Time Stamp GPSTimeStamp DT 1 (0016,0078) GPS Satellites GPSSatellites UT 1 (0016,0079) GPS Status GPSStatus CS 1 (0016,007A) GPS Measure Mode GPSMeasureMode CS 1 (0016,007B) GPS DOP GPSDOP DS 1 (0016,007C) GPS Speed Ref GPSSpeedRef CS 1 (0016,007D) GPS Speed GPSSpeed DS 1 (0016,007E) GPS Track Ref GPSTrackRef CS 1 (0016,007F) GPS Track GPSTrack DS 1 (0016,0080) GPS Img Direction Ref GPSImgDirectionRef CS 1 (0016,0081) GPS Img Direction GPSImgDirection DS 1 (0016,0082) GPS Map Datum GPSMapDatum UT 1 (0016,0083) GPS Dest Latitude Ref GPSDestLatitudeRef CS 1 (0016,0084) GPS Dest Latitude GPSDestLatitude DS 3 (0016,0085) GPS Dest Longitude Ref GPSDestLongitudeRef CS 1 (0016,0086) GPS Dest Longitude GPSDestLongitude DS 3 (0016,0087) GPS Dest Bearing Ref GPSDestBearingRef CS 1 (0016,0088) GPS Dest Bearing GPSDestBearing DS 1 (0016,0089) GPS Dest Distance Ref GPSDestDistanceRef CS 1 (0016,008A) GPS Dest Distance GPSDestDistance DS 1 (0016,008B) GPS Processing Method GPSProcessingMethod OB 1 (0016,008C) GPS Area Information GPSAreaInformation OB 1 (0016,008D) GPS Date Stamp GPSDateStamp DT 1 (0016,008E) GPS Differential GPSDifferential IS 1 (0018,0010) Contrast/Bolus Agent ContrastBolusAgent LO 1 (0018,0012) Contrast/Bolus Agent Sequence ContrastBolusAgentSequence SQ 1 (0018,0013) Contrast/Bolus T1 Relaxivity ContrastBolusT1Relaxivity FL 1 (0018,0014) Contrast/Bolus Administration Route Sequence ContrastBolusAdministrationRouteSequence SQ 1 (0018,0015) Body Part Examined BodyPartExamined CS 1 (0018,0020) Scanning Sequence ScanningSequence CS 1-n (0018,0021) Sequence Variant SequenceVariant CS 1-n (0018,0022) Scan Options ScanOptions CS 1-n (0018,0023) MR Acquisition Type MRAcquisitionType CS 1 (0018,0024) Sequence Name SequenceName SH 1 (0018,0025) Angio Flag AngioFlag CS 1 (0018,0026) Intervention Drug Information Sequence InterventionDrugInformationSequence SQ 1 (0018,0027) Intervention Drug Stop Time InterventionDrugStopTime TM 1 (0018,0028) Intervention Drug Dose InterventionDrugDose DS 1 (0018,0029) Intervention Drug Code Sequence InterventionDrugCodeSequence SQ 1 (0018,002A) Additional Drug Sequence AdditionalDrugSequence SQ 1 (0018,0030) Radionuclide Radionuclide LO 1-n RET (0018,0031) Radiopharmaceutical Radiopharmaceutical LO 1 (0018,0032) Energy Window Centerline EnergyWindowCenterline DS 1 RET (0018,0033) Energy Window Total Width EnergyWindowTotalWidth DS 1-n RET (0018,0034) Intervention Drug Name InterventionDrugName LO 1 (0018,0035) Intervention Drug Start Time InterventionDrugStartTime TM 1 (0018,0036) Intervention Sequence InterventionSequence SQ 1 (0018,0037) Therapy Type TherapyType CS 1 RET (0018,0038) Intervention Status InterventionStatus CS 1 (0018,0039) Therapy Description TherapyDescription CS 1 RET (0018,003A) Intervention Description InterventionDescription ST 1 (0018,0040) Cine Rate CineRate IS 1 (0018,0042) Initial Cine Run State InitialCineRunState CS 1 (0018,0050) Slice Thickness SliceThickness DS 1 (0018,0060) KVP KVP DS 1 (0018,0061) DS 1 RET (0018,0070) Counts Accumulated CountsAccumulated IS 1 (0018,0071) Acquisition Termination Condition AcquisitionTerminationCondition CS 1 (0018,0072) Effective Duration EffectiveDuration DS 1 (0018,0073) Acquisition Start Condition AcquisitionStartCondition CS 1 (0018,0074) Acquisition Start Condition Data AcquisitionStartConditionData IS 1 (0018,0075) Acquisition Termination Condition Data AcquisitionTerminationConditionData IS 1 (0018,0080) Repetition Time RepetitionTime DS 1 (0018,0081) Echo Time EchoTime DS 1 (0018,0082) Inversion Time InversionTime DS 1 (0018,0083) Number of Averages NumberOfAverages DS 1 (0018,0084) Imaging Frequency ImagingFrequency DS 1 (0018,0085) Imaged Nucleus ImagedNucleus SH 1 (0018,0086) Echo Number(s) EchoNumbers IS 1-n (0018,0087) Magnetic Field Strength MagneticFieldStrength DS 1 (0018,0088) Spacing Between Slices SpacingBetweenSlices DS 1 (0018,0089) Number of Phase Encoding Steps NumberOfPhaseEncodingSteps IS 1 (0018,0090) Data Collection Diameter DataCollectionDiameter DS 1 (0018,0091) Echo Train Length EchoTrainLength IS 1 (0018,0093) Percent Sampling PercentSampling DS 1 (0018,0094) Percent Phase Field of View PercentPhaseFieldOfView DS 1 (0018,0095) Pixel Bandwidth PixelBandwidth DS 1 (0018,1000) Device Serial Number DeviceSerialNumber LO 1 (0018,1002) Device UID DeviceUID UI 1 (0018,1003) Device ID DeviceID LO 1 (0018,1004) Plate ID PlateID LO 1 (0018,1005) Generator ID GeneratorID LO 1 (0018,1006) Grid ID GridID LO 1 (0018,1007) Cassette ID CassetteID LO 1 (0018,1008) Gantry ID GantryID LO 1 (0018,1009) Unique Device Identifier UniqueDeviceIdentifier UT 1 (0018,100A) UDI Sequence UDISequence SQ 1 (0018,100B) Manufacturer's Device Class UID ManufacturerDeviceClassUID UI 1-n (0018,1010) Secondary Capture Device ID SecondaryCaptureDeviceID LO 1 (0018,1011) Hardcopy Creation Device ID HardcopyCreationDeviceID LO 1 RET (0018,1012) Date of Secondary Capture DateOfSecondaryCapture DA 1 (0018,1014) Time of Secondary Capture TimeOfSecondaryCapture TM 1 (0018,1016) Secondary Capture Device Manufacturer SecondaryCaptureDeviceManufacturer LO 1 (0018,1017) Hardcopy Device Manufacturer HardcopyDeviceManufacturer LO 1 RET (0018,1018) Secondary Capture Device Manufacturer's Model Name SecondaryCaptureDeviceManufacturerModelName LO 1 (0018,1019) Secondary Capture Device Software Versions SecondaryCaptureDeviceSoftwareVersions LO 1-n (0018,101A) Hardcopy Device Software Version HardcopyDeviceSoftwareVersion LO 1-n RET (0018,101B) Hardcopy Device Manufacturer's Model Name HardcopyDeviceManufacturerModelName LO 1 RET (0018,1020) Software Versions SoftwareVersions LO 1-n (0018,1022) Video Image Format Acquired VideoImageFormatAcquired SH 1 (0018,1023) Digital Image Format Acquired DigitalImageFormatAcquired LO 1 (0018,1030) Protocol Name ProtocolName LO 1 (0018,1040) Contrast/Bolus Route ContrastBolusRoute LO 1 (0018,1041) Contrast/Bolus Volume ContrastBolusVolume DS 1 (0018,1042) Contrast/Bolus Start Time ContrastBolusStartTime TM 1 (0018,1043) Contrast/Bolus Stop Time ContrastBolusStopTime TM 1 (0018,1044) Contrast/Bolus Total Dose ContrastBolusTotalDose DS 1 (0018,1045) Syringe Counts SyringeCounts IS 1 (0018,1046) Contrast Flow Rate ContrastFlowRate DS 1-n (0018,1047) Contrast Flow Duration ContrastFlowDuration DS 1-n (0018,1048) Contrast/Bolus Ingredient ContrastBolusIngredient CS 1 (0018,1049) Contrast/Bolus Ingredient Concentration ContrastBolusIngredientConcentration DS 1 (0018,1050) Spatial Resolution SpatialResolution DS 1 (0018,1060) Trigger Time TriggerTime DS 1 (0018,1061) Trigger Source or Type TriggerSourceOrType LO 1 (0018,1062) Nominal Interval NominalInterval IS 1 (0018,1063) Frame Time FrameTime DS 1 (0018,1064) Cardiac Framing Type CardiacFramingType LO 1 (0018,1065) Frame Time Vector FrameTimeVector DS 1-n (0018,1066) Frame Delay FrameDelay DS 1 (0018,1067) Image Trigger Delay ImageTriggerDelay DS 1 (0018,1068) Multiplex Group Time Offset MultiplexGroupTimeOffset DS 1 (0018,1069) Trigger Time Offset TriggerTimeOffset DS 1 (0018,106A) Synchronization Trigger SynchronizationTrigger CS 1 (0018,106C) Synchronization Channel SynchronizationChannel US 2 (0018,106E) Trigger Sample Position TriggerSamplePosition UL 1 (0018,1070) Radiopharmaceutical Route RadiopharmaceuticalRoute LO 1 (0018,1071) Radiopharmaceutical Volume RadiopharmaceuticalVolume DS 1 (0018,1072) Radiopharmaceutical Start Time RadiopharmaceuticalStartTime TM 1 (0018,1073) Radiopharmaceutical Stop Time RadiopharmaceuticalStopTime TM 1 (0018,1074) Radionuclide Total Dose RadionuclideTotalDose DS 1 (0018,1075) Radionuclide Half Life RadionuclideHalfLife DS 1 (0018,1076) Radionuclide Positron Fraction RadionuclidePositronFraction DS 1 (0018,1077) Radiopharmaceutical Specific Activity RadiopharmaceuticalSpecificActivity DS 1 (0018,1078) Radiopharmaceutical Start DateTime RadiopharmaceuticalStartDateTime DT 1 (0018,1079) Radiopharmaceutical Stop DateTime RadiopharmaceuticalStopDateTime DT 1 (0018,1080) Beat Rejection Flag BeatRejectionFlag CS 1 (0018,1081) Low R-R Value LowRRValue IS 1 (0018,1082) High R-R Value HighRRValue IS 1 (0018,1083) Intervals Acquired IntervalsAcquired IS 1 (0018,1084) Intervals Rejected IntervalsRejected IS 1 (0018,1085) PVC Rejection PVCRejection LO 1 (0018,1086) Skip Beats SkipBeats IS 1 (0018,1088) Heart Rate HeartRate IS 1 (0018,1090) Cardiac Number of Images CardiacNumberOfImages IS 1 (0018,1094) Trigger Window TriggerWindow IS 1 (0018,1100) Reconstruction Diameter ReconstructionDiameter DS 1 (0018,1110) Distance Source to Detector DistanceSourceToDetector DS 1 (0018,1111) Distance Source to Patient DistanceSourceToPatient DS 1 (0018,1114) Estimated Radiographic Magnification Factor EstimatedRadiographicMagnificationFactor DS 1 (0018,1120) Gantry/Detector Tilt GantryDetectorTilt DS 1 (0018,1121) Gantry/Detector Slew GantryDetectorSlew DS 1 (0018,1130) Table Height TableHeight DS 1 (0018,1131) Table Traverse TableTraverse DS 1 (0018,1134) Table Motion TableMotion CS 1 (0018,1135) Table Vertical Increment TableVerticalIncrement DS 1-n (0018,1136) Table Lateral Increment TableLateralIncrement DS 1-n (0018,1137) Table Longitudinal Increment TableLongitudinalIncrement DS 1-n (0018,1138) Table Angle TableAngle DS 1 (0018,113A) Table Type TableType CS 1 (0018,1140) Rotation Direction RotationDirection CS 1 (0018,1141) Angular Position AngularPosition DS 1 RET (0018,1142) Radial Position RadialPosition DS 1-n (0018,1143) Scan Arc ScanArc DS 1 (0018,1144) Angular Step AngularStep DS 1 (0018,1145) Center of Rotation Offset CenterOfRotationOffset DS 1 (0018,1146) Rotation Offset RotationOffset DS 1-n RET (0018,1147) Field of View Shape FieldOfViewShape CS 1 (0018,1149) Field of View Dimension(s) FieldOfViewDimensions IS 1-2 (0018,1150) Exposure Time ExposureTime IS 1 (0018,1151) X-Ray Tube Current XRayTubeCurrent IS 1 (0018,1152) Exposure Exposure IS 1 (0018,1153) Exposure in uAs ExposureInuAs IS 1 (0018,1154) Average Pulse Width AveragePulseWidth DS 1 (0018,1155) Radiation Setting RadiationSetting CS 1 (0018,1156) Rectification Type RectificationType CS 1 (0018,115A) Radiation Mode RadiationMode CS 1 (0018,115E) Image and Fluoroscopy Area Dose Product ImageAndFluoroscopyAreaDoseProduct DS 1 (0018,1160) Filter Type FilterType SH 1 (0018,1161) Type of Filters TypeOfFilters LO 1-n (0018,1162) Intensifier Size IntensifierSize DS 1 (0018,1164) Imager Pixel Spacing ImagerPixelSpacing DS 2 (0018,1166) Grid Grid CS 1-n (0018,1170) Generator Power GeneratorPower IS 1 (0018,1180) Collimator/grid Name CollimatorGridName SH 1 (0018,1181) Collimator Type CollimatorType CS 1 (0018,1182) Focal Distance FocalDistance IS 1-2 (0018,1183) X Focus Center XFocusCenter DS 1-2 (0018,1184) Y Focus Center YFocusCenter DS 1-2 (0018,1190) Focal Spot(s) FocalSpots DS 1-n (0018,1191) Anode Target Material AnodeTargetMaterial CS 1 (0018,11A0) Body Part Thickness BodyPartThickness DS 1 (0018,11A2) Compression Force CompressionForce DS 1 (0018,11A3) Compression Pressure CompressionPressure DS 1 (0018,11A4) Paddle Description PaddleDescription LO 1 (0018,11A5) Compression Contact Area CompressionContactArea DS 1 (0018,1200) Date of Last Calibration DateOfLastCalibration DA 1-n (0018,1201) Time of Last Calibration TimeOfLastCalibration TM 1-n (0018,1202) DateTime of Last Calibration DateTimeOfLastCalibration DT 1 (0018,1210) Convolution Kernel ConvolutionKernel SH 1-n (0018,1240) Upper/Lower Pixel Values UpperLowerPixelValues IS 1-n RET (0018,1242) Actual Frame Duration ActualFrameDuration IS 1 (0018,1243) Count Rate CountRate IS 1 (0018,1244) Preferred Playback Sequencing PreferredPlaybackSequencing US 1 (0018,1250) Receive Coil Name ReceiveCoilName SH 1 (0018,1251) Transmit Coil Name TransmitCoilName SH 1 (0018,1260) Plate Type PlateType SH 1 (0018,1261) Phosphor Type PhosphorType LO 1 (0018,1271) Water Equivalent Diameter WaterEquivalentDiameter FD 1 (0018,1272) Water Equivalent Diameter Calculation Method Code Sequence WaterEquivalentDiameterCalculationMethodCodeSequence SQ 1 (0018,1300) Scan Velocity ScanVelocity DS 1 (0018,1301) Whole Body Technique WholeBodyTechnique CS 1-n (0018,1302) Scan Length ScanLength IS 1 (0018,1310) Acquisition Matrix AcquisitionMatrix US 4 (0018,1312) In-plane Phase Encoding Direction InPlanePhaseEncodingDirection CS 1 (0018,1314) Flip Angle FlipAngle DS 1 (0018,1315) Variable Flip Angle Flag VariableFlipAngleFlag CS 1 (0018,1316) SAR SAR DS 1 (0018,1318) dB/dt dBdt DS 1 (0018,1320) B1rms B1rms FL 1 (0018,1400) Acquisition Device Processing Description AcquisitionDeviceProcessingDescription LO 1 (0018,1401) Acquisition Device Processing Code AcquisitionDeviceProcessingCode LO 1 (0018,1402) Cassette Orientation CassetteOrientation CS 1 (0018,1403) Cassette Size CassetteSize CS 1 (0018,1404) Exposures on Plate ExposuresOnPlate US 1 (0018,1405) Relative X-Ray Exposure RelativeXRayExposure IS 1 (0018,1411) Exposure Index ExposureIndex DS 1 (0018,1412) Target Exposure Index TargetExposureIndex DS 1 (0018,1413) Deviation Index DeviationIndex DS 1 (0018,1450) Column Angulation ColumnAngulation DS 1 (0018,1460) Tomo Layer Height TomoLayerHeight DS 1 (0018,1470) Tomo Angle TomoAngle DS 1 (0018,1480) Tomo Time TomoTime DS 1 (0018,1490) Tomo Type TomoType CS 1 (0018,1491) Tomo Class TomoClass CS 1 (0018,1495) Number of Tomosynthesis Source Images NumberOfTomosynthesisSourceImages IS 1 (0018,1500) Positioner Motion PositionerMotion CS 1 (0018,1508) Positioner Type PositionerType CS 1 (0018,1510) Positioner Primary Angle PositionerPrimaryAngle DS 1 (0018,1511) Positioner Secondary Angle PositionerSecondaryAngle DS 1 (0018,1520) Positioner Primary Angle Increment PositionerPrimaryAngleIncrement DS 1-n (0018,1521) Positioner Secondary Angle Increment PositionerSecondaryAngleIncrement DS 1-n (0018,1530) Detector Primary Angle DetectorPrimaryAngle DS 1 (0018,1531) Detector Secondary Angle DetectorSecondaryAngle DS 1 (0018,1600) Shutter Shape ShutterShape CS 1-3 (0018,1602) Shutter Left Vertical Edge ShutterLeftVerticalEdge IS 1 (0018,1604) Shutter Right Vertical Edge ShutterRightVerticalEdge IS 1 (0018,1606) Shutter Upper Horizontal Edge ShutterUpperHorizontalEdge IS 1 (0018,1608) Shutter Lower Horizontal Edge ShutterLowerHorizontalEdge IS 1 (0018,1610) Center of Circular Shutter CenterOfCircularShutter IS 2 (0018,1612) Radius of Circular Shutter RadiusOfCircularShutter IS 1 (0018,1620) Vertices of the Polygonal Shutter VerticesOfThePolygonalShutter IS 2-2n (0018,1622) Shutter Presentation Value ShutterPresentationValue US 1 (0018,1623) Shutter Overlay Group ShutterOverlayGroup US 1 (0018,1624) Shutter Presentation Color CIELab Value ShutterPresentationColorCIELabValue US 3 (0018,1630) Outline Shape Type OutlineShapeType CS 1 (0018,1631) Outline Left Vertical Edge OutlineLeftVerticalEdge FD 1 (0018,1632) Outline Right Vertical Edge OutlineRightVerticalEdge FD 1 (0018,1633) Outline Upper Horizontal Edge OutlineUpperHorizontalEdge FD 1 (0018,1634) Outline Lower Horizontal Edge OutlineLowerHorizontalEdge FD 1 (0018,1635) Center of Circular Outline CenterOfCircularOutline FD 2 (0018,1636) Diameter of Circular Outline DiameterOfCircularOutline FD 1 (0018,1637) Number of Polygonal Vertices NumberOfPolygonalVertices UL 1 (0018,1638) Vertices of the Polygonal Outline VerticesOfThePolygonalOutline OF 1 (0018,1700) Collimator Shape CollimatorShape CS 1-3 (0018,1702) Collimator Left Vertical Edge CollimatorLeftVerticalEdge IS 1 (0018,1704) Collimator Right Vertical Edge CollimatorRightVerticalEdge IS 1 (0018,1706) Collimator Upper Horizontal Edge CollimatorUpperHorizontalEdge IS 1 (0018,1708) Collimator Lower Horizontal Edge CollimatorLowerHorizontalEdge IS 1 (0018,1710) Center of Circular Collimator CenterOfCircularCollimator IS 2 (0018,1712) Radius of Circular Collimator RadiusOfCircularCollimator IS 1 (0018,1720) Vertices of the Polygonal Collimator VerticesOfThePolygonalCollimator IS 2-2n (0018,1800) Acquisition Time Synchronized AcquisitionTimeSynchronized CS 1 (0018,1801) Time Source TimeSource SH 1 (0018,1802) Time Distribution Protocol TimeDistributionProtocol CS 1 (0018,1803) NTP Source Address NTPSourceAddress LO 1 (0018,2001) Page Number Vector PageNumberVector IS 1-n (0018,2002) Frame Label Vector FrameLabelVector SH 1-n (0018,2003) Frame Primary Angle Vector FramePrimaryAngleVector DS 1-n (0018,2004) Frame Secondary Angle Vector FrameSecondaryAngleVector DS 1-n (0018,2005) Slice Location Vector SliceLocationVector DS 1-n (0018,2006) Display Window Label Vector DisplayWindowLabelVector SH 1-n (0018,2010) Nominal Scanned Pixel Spacing NominalScannedPixelSpacing DS 2 (0018,2020) Digitizing Device Transport Direction DigitizingDeviceTransportDirection CS 1 (0018,2030) Rotation of Scanned Film RotationOfScannedFilm DS 1 (0018,2041) Biopsy Target Sequence BiopsyTargetSequence SQ 1 (0018,2042) Target UID TargetUID UI 1 (0018,2043) Localizing Cursor Position LocalizingCursorPosition FL 2 (0018,2044) Calculated Target Position CalculatedTargetPosition FL 3 (0018,2045) Target Label TargetLabel SH 1 (0018,2046) Displayed Z Value DisplayedZValue FL 1 (0018,3100) IVUS Acquisition IVUSAcquisition CS 1 (0018,3101) IVUS Pullback Rate IVUSPullbackRate DS 1 (0018,3102) IVUS Gated Rate IVUSGatedRate DS 1 (0018,3103) IVUS Pullback Start Frame Number IVUSPullbackStartFrameNumber IS 1 (0018,3104) IVUS Pullback Stop Frame Number IVUSPullbackStopFrameNumber IS 1 (0018,3105) Lesion Number LesionNumber IS 1-n (0018,4000) Acquisition Comments AcquisitionComments LT 1 RET (0018,5000) Output Power OutputPower SH 1-n (0018,5010) Transducer Data TransducerData LO 1-n (0018,5012) Focus Depth FocusDepth DS 1 (0018,5020) Processing Function ProcessingFunction LO 1 (0018,5021) Postprocessing Function PostprocessingFunction LO 1 RET (0018,5022) Mechanical Index MechanicalIndex DS 1 (0018,5024) Bone Thermal Index BoneThermalIndex DS 1 (0018,5026) Cranial Thermal Index CranialThermalIndex DS 1 (0018,5027) Soft Tissue Thermal Index SoftTissueThermalIndex DS 1 (0018,5028) Soft Tissue-focus Thermal Index SoftTissueFocusThermalIndex DS 1 (0018,5029) Soft Tissue-surface Thermal Index SoftTissueSurfaceThermalIndex DS 1 (0018,5030) Dynamic Range DynamicRange DS 1 RET (0018,5040) Total Gain TotalGain DS 1 RET (0018,5050) Depth of Scan Field DepthOfScanField IS 1 (0018,5100) Patient Position PatientPosition CS 1 (0018,5101) View Position ViewPosition CS 1 (0018,5104) Projection Eponymous Name Code Sequence ProjectionEponymousNameCodeSequence SQ 1 (0018,5210) Image Transformation Matrix ImageTransformationMatrix DS 6 RET (0018,5212) Image Translation Vector ImageTranslationVector DS 3 RET (0018,6000) Sensitivity Sensitivity DS 1 (0018,6011) Sequence of Ultrasound Regions SequenceOfUltrasoundRegions SQ 1 (0018,6012) Region Spatial Format RegionSpatialFormat US 1 (0018,6014) Region Data Type RegionDataType US 1 (0018,6016) Region Flags RegionFlags UL 1 (0018,6018) Region Location Min X0 RegionLocationMinX0 UL 1 (0018,601A) Region Location Min Y0 RegionLocationMinY0 UL 1 (0018,601C) Region Location Max X1 RegionLocationMaxX1 UL 1 (0018,601E) Region Location Max Y1 RegionLocationMaxY1 UL 1 (0018,6020) Reference Pixel X0 ReferencePixelX0 SL 1 (0018,6022) Reference Pixel Y0 ReferencePixelY0 SL 1 (0018,6024) Physical Units X Direction PhysicalUnitsXDirection US 1 (0018,6026) Physical Units Y Direction PhysicalUnitsYDirection US 1 (0018,6028) Reference Pixel Physical Value X ReferencePixelPhysicalValueX FD 1 (0018,602A) Reference Pixel Physical Value Y ReferencePixelPhysicalValueY FD 1 (0018,602C) Physical Delta X PhysicalDeltaX FD 1 (0018,602E) Physical Delta Y PhysicalDeltaY FD 1 (0018,6030) Transducer Frequency TransducerFrequency UL 1 (0018,6031) Transducer Type TransducerType CS 1 (0018,6032) Pulse Repetition Frequency PulseRepetitionFrequency UL 1 (0018,6034) Doppler Correction Angle DopplerCorrectionAngle FD 1 (0018,6036) Steering Angle SteeringAngle FD 1 (0018,6038) Doppler Sample Volume X Position (Retired) DopplerSampleVolumeXPositionRetired UL 1 RET (0018,6039) Doppler Sample Volume X Position DopplerSampleVolumeXPosition SL 1 (0018,603A) Doppler Sample Volume Y Position (Retired) DopplerSampleVolumeYPositionRetired UL 1 RET (0018,603B) Doppler Sample Volume Y Position DopplerSampleVolumeYPosition SL 1 (0018,603C) TM-Line Position X0 (Retired) TMLinePositionX0Retired UL 1 RET (0018,603D) TM-Line Position X0 TMLinePositionX0 SL 1 (0018,603E) TM-Line Position Y0 (Retired) TMLinePositionY0Retired UL 1 RET (0018,603F) TM-Line Position Y0 TMLinePositionY0 SL 1 (0018,6040) TM-Line Position X1 (Retired) TMLinePositionX1Retired UL 1 RET (0018,6041) TM-Line Position X1 TMLinePositionX1 SL 1 (0018,6042) TM-Line Position Y1 (Retired) TMLinePositionY1Retired UL 1 RET (0018,6043) TM-Line Position Y1 TMLinePositionY1 SL 1 (0018,6044) Pixel Component Organization PixelComponentOrganization US 1 (0018,6046) Pixel Component Mask PixelComponentMask UL 1 (0018,6048) Pixel Component Range Start PixelComponentRangeStart UL 1 (0018,604A) Pixel Component Range Stop PixelComponentRangeStop UL 1 (0018,604C) Pixel Component Physical Units PixelComponentPhysicalUnits US 1 (0018,604E) Pixel Component Data Type PixelComponentDataType US 1 (0018,6050) Number of Table Break Points NumberOfTableBreakPoints UL 1 (0018,6052) Table of X Break Points TableOfXBreakPoints UL 1-n (0018,6054) Table of Y Break Points TableOfYBreakPoints FD 1-n (0018,6056) Number of Table Entries NumberOfTableEntries UL 1 (0018,6058) Table of Pixel Values TableOfPixelValues UL 1-n (0018,605A) Table of Parameter Values TableOfParameterValues FL 1-n (0018,6060) R Wave Time Vector RWaveTimeVector FL 1-n (0018,7000) Detector Conditions Nominal Flag DetectorConditionsNominalFlag CS 1 (0018,7001) Detector Temperature DetectorTemperature DS 1 (0018,7004) Detector Type DetectorType CS 1 (0018,7005) Detector Configuration DetectorConfiguration CS 1 (0018,7006) Detector Description DetectorDescription LT 1 (0018,7008) Detector Mode DetectorMode LT 1 (0018,700A) Detector ID DetectorID SH 1 (0018,700C) Date of Last Detector Calibration DateOfLastDetectorCalibration DA 1 (0018,700E) Time of Last Detector Calibration TimeOfLastDetectorCalibration TM 1 (0018,7010) Exposures on Detector Since Last Calibration ExposuresOnDetectorSinceLastCalibration IS 1 (0018,7011) Exposures on Detector Since Manufactured ExposuresOnDetectorSinceManufactured IS 1 (0018,7012) Detector Time Since Last Exposure DetectorTimeSinceLastExposure DS 1 (0018,7014) Detector Active Time DetectorActiveTime DS 1 (0018,7016) Detector Activation Offset From Exposure DetectorActivationOffsetFromExposure DS 1 (0018,701A) Detector Binning DetectorBinning DS 2 (0018,7020) Detector Element Physical Size DetectorElementPhysicalSize DS 2 (0018,7022) Detector Element Spacing DetectorElementSpacing DS 2 (0018,7024) Detector Active Shape DetectorActiveShape CS 1 (0018,7026) Detector Active Dimension(s) DetectorActiveDimensions DS 1-2 (0018,7028) Detector Active Origin DetectorActiveOrigin DS 2 (0018,702A) Detector Manufacturer Name DetectorManufacturerName LO 1 (0018,702B) Detector Manufacturer's Model Name DetectorManufacturerModelName LO 1 (0018,7030) Field of View Origin FieldOfViewOrigin DS 2 (0018,7032) Field of View Rotation FieldOfViewRotation DS 1 (0018,7034) Field of View Horizontal Flip FieldOfViewHorizontalFlip CS 1 (0018,7036) Pixel Data Area Origin Relative To FOV PixelDataAreaOriginRelativeToFOV FL 2 (0018,7038) Pixel Data Area Rotation Angle Relative To FOV PixelDataAreaRotationAngleRelativeToFOV FL 1 (0018,7040) Grid Absorbing Material GridAbsorbingMaterial LT 1 (0018,7041) Grid Spacing Material GridSpacingMaterial LT 1 (0018,7042) Grid Thickness GridThickness DS 1 (0018,7044) Grid Pitch GridPitch DS 1 (0018,7046) Grid Aspect Ratio GridAspectRatio IS 2 (0018,7048) Grid Period GridPeriod DS 1 (0018,704C) Grid Focal Distance GridFocalDistance DS 1 (0018,7050) Filter Material FilterMaterial CS 1-n (0018,7052) Filter Thickness Minimum FilterThicknessMinimum DS 1-n (0018,7054) Filter Thickness Maximum FilterThicknessMaximum DS 1-n (0018,7056) Filter Beam Path Length Minimum FilterBeamPathLengthMinimum FL 1-n (0018,7058) Filter Beam Path Length Maximum FilterBeamPathLengthMaximum FL 1-n (0018,7060) Exposure Control Mode ExposureControlMode CS 1 (0018,7062) Exposure Control Mode Description ExposureControlModeDescription LT 1 (0018,7064) Exposure Status ExposureStatus CS 1 (0018,7065) Phototimer Setting PhototimerSetting DS 1 (0018,8150) Exposure Time in uS ExposureTimeInuS DS 1 (0018,8151) X-Ray Tube Current in uA XRayTubeCurrentInuA DS 1 (0018,9004) Content Qualification ContentQualification CS 1 (0018,9005) Pulse Sequence Name PulseSequenceName SH 1 (0018,9006) MR Imaging Modifier Sequence MRImagingModifierSequence SQ 1 (0018,9008) Echo Pulse Sequence EchoPulseSequence CS 1 (0018,9009) Inversion Recovery InversionRecovery CS 1 (0018,9010) Flow Compensation FlowCompensation CS 1 (0018,9011) Multiple Spin Echo MultipleSpinEcho CS 1 (0018,9012) Multi-planar Excitation MultiPlanarExcitation CS 1 (0018,9014) Phase Contrast PhaseContrast CS 1 (0018,9015) Time of Flight Contrast TimeOfFlightContrast CS 1 (0018,9016) Spoiling Spoiling CS 1 (0018,9017) Steady State Pulse Sequence SteadyStatePulseSequence CS 1 (0018,9018) Echo Planar Pulse Sequence EchoPlanarPulseSequence CS 1 (0018,9019) Tag Angle First Axis TagAngleFirstAxis FD 1 (0018,9020) Magnetization Transfer MagnetizationTransfer CS 1 (0018,9021) T2 Preparation T2Preparation CS 1 (0018,9022) Blood Signal Nulling BloodSignalNulling CS 1 (0018,9024) Saturation Recovery SaturationRecovery CS 1 (0018,9025) Spectrally Selected Suppression SpectrallySelectedSuppression CS 1 (0018,9026) Spectrally Selected Excitation SpectrallySelectedExcitation CS 1 (0018,9027) Spatial Pre-saturation SpatialPresaturation CS 1 (0018,9028) Tagging Tagging CS 1 (0018,9029) Oversampling Phase OversamplingPhase CS 1 (0018,9030) Tag Spacing First Dimension TagSpacingFirstDimension FD 1 (0018,9032) Geometry of k-Space Traversal GeometryOfKSpaceTraversal CS 1 (0018,9033) Segmented k-Space Traversal SegmentedKSpaceTraversal CS 1 (0018,9034) Rectilinear Phase Encode Reordering RectilinearPhaseEncodeReordering CS 1 (0018,9035) Tag Thickness TagThickness FD 1 (0018,9036) Partial Fourier Direction PartialFourierDirection CS 1 (0018,9037) Cardiac Synchronization Technique CardiacSynchronizationTechnique CS 1 (0018,9041) Receive Coil Manufacturer Name ReceiveCoilManufacturerName LO 1 (0018,9042) MR Receive Coil Sequence MRReceiveCoilSequence SQ 1 (0018,9043) Receive Coil Type ReceiveCoilType CS 1 (0018,9044) Quadrature Receive Coil QuadratureReceiveCoil CS 1 (0018,9045) Multi-Coil Definition Sequence MultiCoilDefinitionSequence SQ 1 (0018,9046) Multi-Coil Configuration MultiCoilConfiguration LO 1 (0018,9047) Multi-Coil Element Name MultiCoilElementName SH 1 (0018,9048) Multi-Coil Element Used MultiCoilElementUsed CS 1 (0018,9049) MR Transmit Coil Sequence MRTransmitCoilSequence SQ 1 (0018,9050) Transmit Coil Manufacturer Name TransmitCoilManufacturerName LO 1 (0018,9051) Transmit Coil Type TransmitCoilType CS 1 (0018,9052) Spectral Width SpectralWidth FD 1-2 (0018,9053) Chemical Shift Reference ChemicalShiftReference FD 1-2 (0018,9054) Volume Localization Technique VolumeLocalizationTechnique CS 1 (0018,9058) MR Acquisition Frequency Encoding Steps MRAcquisitionFrequencyEncodingSteps US 1 (0018,9059) De-coupling Decoupling CS 1 (0018,9060) De-coupled Nucleus DecoupledNucleus CS 1-2 (0018,9061) De-coupling Frequency DecouplingFrequency FD 1-2 (0018,9062) De-coupling Method DecouplingMethod CS 1 (0018,9063) De-coupling Chemical Shift Reference DecouplingChemicalShiftReference FD 1-2 (0018,9064) k-space Filtering KSpaceFiltering CS 1 (0018,9065) Time Domain Filtering TimeDomainFiltering CS 1-2 (0018,9066) Number of Zero Fills NumberOfZeroFills US 1-2 (0018,9067) Baseline Correction BaselineCorrection CS 1 (0018,9069) Parallel Reduction Factor In-plane ParallelReductionFactorInPlane FD 1 (0018,9070) Cardiac R-R Interval Specified CardiacRRIntervalSpecified FD 1 (0018,9073) Acquisition Duration AcquisitionDuration FD 1 (0018,9074) Frame Acquisition DateTime FrameAcquisitionDateTime DT 1 (0018,9075) Diffusion Directionality DiffusionDirectionality CS 1 (0018,9076) Diffusion Gradient Direction Sequence DiffusionGradientDirectionSequence SQ 1 (0018,9077) Parallel Acquisition ParallelAcquisition CS 1 (0018,9078) Parallel Acquisition Technique ParallelAcquisitionTechnique CS 1 (0018,9079) Inversion Times InversionTimes FD 1-n (0018,9080) Metabolite Map Description MetaboliteMapDescription ST 1 (0018,9081) Partial Fourier PartialFourier CS 1 (0018,9082) Effective Echo Time EffectiveEchoTime FD 1 (0018,9083) Metabolite Map Code Sequence MetaboliteMapCodeSequence SQ 1 (0018,9084) Chemical Shift Sequence ChemicalShiftSequence SQ 1 (0018,9085) Cardiac Signal Source CardiacSignalSource CS 1 (0018,9087) Diffusion b-value DiffusionBValue FD 1 (0018,9089) Diffusion Gradient Orientation DiffusionGradientOrientation FD 3 (0018,9090) Velocity Encoding Direction VelocityEncodingDirection FD 3 (0018,9091) Velocity Encoding Minimum Value VelocityEncodingMinimumValue FD 1 (0018,9092) Velocity Encoding Acquisition Sequence VelocityEncodingAcquisitionSequence SQ 1 (0018,9093) Number of k-Space Trajectories NumberOfKSpaceTrajectories US 1 (0018,9094) Coverage of k-Space CoverageOfKSpace CS 1 (0018,9095) Spectroscopy Acquisition Phase Rows SpectroscopyAcquisitionPhaseRows UL 1 (0018,9096) Parallel Reduction Factor In-plane (Retired) ParallelReductionFactorInPlaneRetired FD 1 RET (0018,9098) Transmitter Frequency TransmitterFrequency FD 1-2 (0018,9100) Resonant Nucleus ResonantNucleus CS 1-2 (0018,9101) Frequency Correction FrequencyCorrection CS 1 (0018,9103) MR Spectroscopy FOV/Geometry Sequence MRSpectroscopyFOVGeometrySequence SQ 1 (0018,9104) Slab Thickness SlabThickness FD 1 (0018,9105) Slab Orientation SlabOrientation FD 3 (0018,9106) Mid Slab Position MidSlabPosition FD 3 (0018,9107) MR Spatial Saturation Sequence MRSpatialSaturationSequence SQ 1 (0018,9112) MR Timing and Related Parameters Sequence MRTimingAndRelatedParametersSequence SQ 1 (0018,9114) MR Echo Sequence MREchoSequence SQ 1 (0018,9115) MR Modifier Sequence MRModifierSequence SQ 1 (0018,9117) MR Diffusion Sequence MRDiffusionSequence SQ 1 (0018,9118) Cardiac Synchronization Sequence CardiacSynchronizationSequence SQ 1 (0018,9119) MR Averages Sequence MRAveragesSequence SQ 1 (0018,9125) MR FOV/Geometry Sequence MRFOVGeometrySequence SQ 1 (0018,9126) Volume Localization Sequence VolumeLocalizationSequence SQ 1 (0018,9127) Spectroscopy Acquisition Data Columns SpectroscopyAcquisitionDataColumns UL 1 (0018,9147) Diffusion Anisotropy Type DiffusionAnisotropyType CS 1 (0018,9151) Frame Reference DateTime FrameReferenceDateTime DT 1 (0018,9152) MR Metabolite Map Sequence MRMetaboliteMapSequence SQ 1 (0018,9155) Parallel Reduction Factor out-of-plane ParallelReductionFactorOutOfPlane FD 1 (0018,9159) Spectroscopy Acquisition Out-of-plane Phase Steps SpectroscopyAcquisitionOutOfPlanePhaseSteps UL 1 (0018,9166) Bulk Motion Status BulkMotionStatus CS 1 RET (0018,9168) Parallel Reduction Factor Second In-plane ParallelReductionFactorSecondInPlane FD 1 (0018,9169) Cardiac Beat Rejection Technique CardiacBeatRejectionTechnique CS 1 (0018,9170) Respiratory Motion Compensation Technique RespiratoryMotionCompensationTechnique CS 1 (0018,9171) Respiratory Signal Source RespiratorySignalSource CS 1 (0018,9172) Bulk Motion Compensation Technique BulkMotionCompensationTechnique CS 1 (0018,9173) Bulk Motion Signal Source BulkMotionSignalSource CS 1 (0018,9174) Applicable Safety Standard Agency ApplicableSafetyStandardAgency CS 1 (0018,9175) Applicable Safety Standard Description ApplicableSafetyStandardDescription LO 1 (0018,9176) Operating Mode Sequence OperatingModeSequence SQ 1 (0018,9177) Operating Mode Type OperatingModeType CS 1 (0018,9178) Operating Mode OperatingMode CS 1 (0018,9179) Specific Absorption Rate Definition SpecificAbsorptionRateDefinition CS 1 (0018,9180) Gradient Output Type GradientOutputType CS 1 (0018,9181) Specific Absorption Rate Value SpecificAbsorptionRateValue FD 1 (0018,9182) Gradient Output GradientOutput FD 1 (0018,9183) Flow Compensation Direction FlowCompensationDirection CS 1 (0018,9184) Tagging Delay TaggingDelay FD 1 (0018,9185) Respiratory Motion Compensation Technique Description RespiratoryMotionCompensationTechniqueDescription ST 1 (0018,9186) Respiratory Signal Source ID RespiratorySignalSourceID SH 1 (0018,9195) Chemical Shift Minimum Integration Limit in Hz ChemicalShiftMinimumIntegrationLimitInHz FD 1 RET (0018,9196) Chemical Shift Maximum Integration Limit in Hz ChemicalShiftMaximumIntegrationLimitInHz FD 1 RET (0018,9197) MR Velocity Encoding Sequence MRVelocityEncodingSequence SQ 1 (0018,9198) First Order Phase Correction FirstOrderPhaseCorrection CS 1 (0018,9199) Water Referenced Phase Correction WaterReferencedPhaseCorrection CS 1 (0018,9200) MR Spectroscopy Acquisition Type MRSpectroscopyAcquisitionType CS 1 (0018,9214) Respiratory Cycle Position RespiratoryCyclePosition CS 1 (0018,9217) Velocity Encoding Maximum Value VelocityEncodingMaximumValue FD 1 (0018,9218) Tag Spacing Second Dimension TagSpacingSecondDimension FD 1 (0018,9219) Tag Angle Second Axis TagAngleSecondAxis SS 1 (0018,9220) Frame Acquisition Duration FrameAcquisitionDuration FD 1 (0018,9226) MR Image Frame Type Sequence MRImageFrameTypeSequence SQ 1 (0018,9227) MR Spectroscopy Frame Type Sequence MRSpectroscopyFrameTypeSequence SQ 1 (0018,9231) MR Acquisition Phase Encoding Steps in-plane MRAcquisitionPhaseEncodingStepsInPlane US 1 (0018,9232) MR Acquisition Phase Encoding Steps out-of-plane MRAcquisitionPhaseEncodingStepsOutOfPlane US 1 (0018,9234) Spectroscopy Acquisition Phase Columns SpectroscopyAcquisitionPhaseColumns UL 1 (0018,9236) Cardiac Cycle Position CardiacCyclePosition CS 1 (0018,9239) Specific Absorption Rate Sequence SpecificAbsorptionRateSequence SQ 1 (0018,9240) RF Echo Train Length RFEchoTrainLength US 1 (0018,9241) Gradient Echo Train Length GradientEchoTrainLength US 1 (0018,9250) Arterial Spin Labeling Contrast ArterialSpinLabelingContrast CS 1 (0018,9251) MR Arterial Spin Labeling Sequence MRArterialSpinLabelingSequence SQ 1 (0018,9252) ASL Technique Description ASLTechniqueDescription LO 1 (0018,9253) ASL Slab Number ASLSlabNumber US 1 (0018,9254) ASL Slab Thickness ASLSlabThickness FD 1 (0018,9255) ASL Slab Orientation ASLSlabOrientation FD 3 (0018,9256) ASL Mid Slab Position ASLMidSlabPosition FD 3 (0018,9257) ASL Context ASLContext CS 1 (0018,9258) ASL Pulse Train Duration ASLPulseTrainDuration UL 1 (0018,9259) ASL Crusher Flag ASLCrusherFlag CS 1 (0018,925A) ASL Crusher Flow Limit ASLCrusherFlowLimit FD 1 (0018,925B) ASL Crusher Description ASLCrusherDescription LO 1 (0018,925C) ASL Bolus Cut-off Flag ASLBolusCutoffFlag CS 1 (0018,925D) ASL Bolus Cut-off Timing Sequence ASLBolusCutoffTimingSequence SQ 1 (0018,925E) ASL Bolus Cut-off Technique ASLBolusCutoffTechnique LO 1 (0018,925F) ASL Bolus Cut-off Delay Time ASLBolusCutoffDelayTime UL 1 (0018,9260) ASL Slab Sequence ASLSlabSequence SQ 1 (0018,9295) Chemical Shift Minimum Integration Limit in ppm ChemicalShiftMinimumIntegrationLimitInppm FD 1 (0018,9296) Chemical Shift Maximum Integration Limit in ppm ChemicalShiftMaximumIntegrationLimitInppm FD 1 (0018,9297) Water Reference Acquisition WaterReferenceAcquisition CS 1 (0018,9298) Echo Peak Position EchoPeakPosition IS 1 (0018,9301) CT Acquisition Type Sequence CTAcquisitionTypeSequence SQ 1 (0018,9302) Acquisition Type AcquisitionType CS 1 (0018,9303) Tube Angle TubeAngle FD 1 (0018,9304) CT Acquisition Details Sequence CTAcquisitionDetailsSequence SQ 1 (0018,9305) Revolution Time RevolutionTime FD 1 (0018,9306) Single Collimation Width SingleCollimationWidth FD 1 (0018,9307) Total Collimation Width TotalCollimationWidth FD 1 (0018,9308) CT Table Dynamics Sequence CTTableDynamicsSequence SQ 1 (0018,9309) Table Speed TableSpeed FD 1 (0018,9310) Table Feed per Rotation TableFeedPerRotation FD 1 (0018,9311) Spiral Pitch Factor SpiralPitchFactor FD 1 (0018,9312) CT Geometry Sequence CTGeometrySequence SQ 1 (0018,9313) Data Collection Center (Patient) DataCollectionCenterPatient FD 3 (0018,9314) CT Reconstruction Sequence CTReconstructionSequence SQ 1 (0018,9315) Reconstruction Algorithm ReconstructionAlgorithm CS 1 (0018,9316) Convolution Kernel Group ConvolutionKernelGroup CS 1 (0018,9317) Reconstruction Field of View ReconstructionFieldOfView FD 2 (0018,9318) Reconstruction Target Center (Patient) ReconstructionTargetCenterPatient FD 3 (0018,9319) Reconstruction Angle ReconstructionAngle FD 1 (0018,9320) Image Filter ImageFilter SH 1 (0018,9321) CT Exposure Sequence CTExposureSequence SQ 1 (0018,9322) Reconstruction Pixel Spacing ReconstructionPixelSpacing FD 2 (0018,9323) Exposure Modulation Type ExposureModulationType CS 1-n (0018,9324) Estimated Dose Saving EstimatedDoseSaving FD 1 (0018,9325) CT X-Ray Details Sequence CTXRayDetailsSequence SQ 1 (0018,9326) CT Position Sequence CTPositionSequence SQ 1 (0018,9327) Table Position TablePosition FD 1 (0018,9328) Exposure Time in ms ExposureTimeInms FD 1 (0018,9329) CT Image Frame Type Sequence CTImageFrameTypeSequence SQ 1 (0018,9330) X-Ray Tube Current in mA XRayTubeCurrentInmA FD 1 (0018,9332) Exposure in mAs ExposureInmAs FD 1 (0018,9333) Constant Volume Flag ConstantVolumeFlag CS 1 (0018,9334) Fluoroscopy Flag FluoroscopyFlag CS 1 (0018,9335) Distance Source to Data Collection Center DistanceSourceToDataCollectionCenter FD 1 (0018,9337) Contrast/Bolus Agent Number ContrastBolusAgentNumber US 1 (0018,9338) Contrast/Bolus Ingredient Code Sequence ContrastBolusIngredientCodeSequence SQ 1 (0018,9340) Contrast Administration Profile Sequence ContrastAdministrationProfileSequence SQ 1 (0018,9341) Contrast/Bolus Usage Sequence ContrastBolusUsageSequence SQ 1 (0018,9342) Contrast/Bolus Agent Administered ContrastBolusAgentAdministered CS 1 (0018,9343) Contrast/Bolus Agent Detected ContrastBolusAgentDetected CS 1 (0018,9344) Contrast/Bolus Agent Phase ContrastBolusAgentPhase CS 1 (0018,9345) CTDIvol CTDIvol FD 1 (0018,9346) CTDI Phantom Type Code Sequence CTDIPhantomTypeCodeSequence SQ 1 (0018,9351) Calcium Scoring Mass Factor Patient CalciumScoringMassFactorPatient FL 1 (0018,9352) Calcium Scoring Mass Factor Device CalciumScoringMassFactorDevice FL 3 (0018,9353) Energy Weighting Factor EnergyWeightingFactor FL 1 (0018,9360) CT Additional X-Ray Source Sequence CTAdditionalXRaySourceSequence SQ 1 (0018,9361) Multi-energy CT Acquisition MultienergyCTAcquisition CS 1 (0018,9362) Multi-energy CT Acquisition Sequence MultienergyCTAcquisitionSequence SQ 1 (0018,9363) Multi-energy CT Processing Sequence MultienergyCTProcessingSequence SQ 1 (0018,9364) Multi-energy CT Characteristics Sequence MultienergyCTCharacteristicsSequence SQ 1 (0018,9365) Multi-energy CT X-Ray Source Sequence MultienergyCTXRaySourceSequence SQ 1 (0018,9366) X-Ray Source Index XRaySourceIndex US 1 (0018,9367) X-Ray Source ID XRaySourceID UC 1 (0018,9368) Multi-energy Source Technique MultienergySourceTechnique CS 1 (0018,9369) Source Start DateTime SourceStartDateTime DT 1 (0018,936A) Source End DateTime SourceEndDateTime DT 1 (0018,936B) Switching Phase Number SwitchingPhaseNumber US 1 (0018,936C) Switching Phase Nominal Duration SwitchingPhaseNominalDuration DS 1 (0018,936D) Switching Phase Transition Duration SwitchingPhaseTransitionDuration DS 1 (0018,936E) Effective Bin Energy EffectiveBinEnergy DS 1 (0018,936F) Multi-energy CT X-Ray Detector Sequence MultienergyCTXRayDetectorSequence SQ 1 (0018,9370) X-Ray Detector Index XRayDetectorIndex US 1 (0018,9371) X-Ray Detector ID XRayDetectorID UC 1 (0018,9372) Multi-energy Detector Type MultienergyDetectorType CS 1 (0018,9373) X-Ray Detector Label XRayDetectorLabel ST 1 (0018,9374) Nominal Max Energy NominalMaxEnergy DS 1 (0018,9375) Nominal Min Energy NominalMinEnergy DS 1 (0018,9376) Referenced X-Ray Detector Index ReferencedXRayDetectorIndex US 1-n (0018,9377) Referenced X-Ray Source Index ReferencedXRaySourceIndex US 1-n (0018,9378) Referenced Path Index ReferencedPathIndex US 1-n (0018,9379) Multi-energy CT Path Sequence MultienergyCTPathSequence SQ 1 (0018,937A) Multi-energy CT Path Index MultienergyCTPathIndex US 1 (0018,937B) Multi-energy Acquisition Description MultienergyAcquisitionDescription UT 1 (0018,937C) Monoenergetic Energy Equivalent MonoenergeticEnergyEquivalent FD 1 (0018,937D) Material Code Sequence MaterialCodeSequence SQ 1 (0018,937E) Decomposition Method DecompositionMethod CS 1 (0018,937F) Decomposition Description DecompositionDescription UT 1 (0018,9380) Decomposition Algorithm Identification Sequence DecompositionAlgorithmIdentificationSequence SQ 1 (0018,9381) Decomposition Material Sequence DecompositionMaterialSequence SQ 1 (0018,9382) Material Attenuation Sequence MaterialAttenuationSequence SQ 1 (0018,9383) Photon Energy PhotonEnergy DS 1 (0018,9384) X-Ray Mass Attenuation Coefficient XRayMassAttenuationCoefficient DS 1 (0018,9401) Projection Pixel Calibration Sequence ProjectionPixelCalibrationSequence SQ 1 (0018,9402) Distance Source to Isocenter DistanceSourceToIsocenter FL 1 (0018,9403) Distance Object to Table Top DistanceObjectToTableTop FL 1 (0018,9404) Object Pixel Spacing in Center of Beam ObjectPixelSpacingInCenterOfBeam FL 2 (0018,9405) Positioner Position Sequence PositionerPositionSequence SQ 1 (0018,9406) Table Position Sequence TablePositionSequence SQ 1 (0018,9407) Collimator Shape Sequence CollimatorShapeSequence SQ 1 (0018,9410) Planes in Acquisition PlanesInAcquisition CS 1 (0018,9412) XA/XRF Frame Characteristics Sequence XAXRFFrameCharacteristicsSequence SQ 1 (0018,9417) Frame Acquisition Sequence FrameAcquisitionSequence SQ 1 (0018,9420) X-Ray Receptor Type XRayReceptorType CS 1 (0018,9423) Acquisition Protocol Name AcquisitionProtocolName LO 1 (0018,9424) Acquisition Protocol Description AcquisitionProtocolDescription LT 1 (0018,9425) Contrast/Bolus Ingredient Opaque ContrastBolusIngredientOpaque CS 1 (0018,9426) Distance Receptor Plane to Detector Housing DistanceReceptorPlaneToDetectorHousing FL 1 (0018,9427) Intensifier Active Shape IntensifierActiveShape CS 1 (0018,9428) Intensifier Active Dimension(s) IntensifierActiveDimensions FL 1-2 (0018,9429) Physical Detector Size PhysicalDetectorSize FL 2 (0018,9430) Position of Isocenter Projection PositionOfIsocenterProjection FL 2 (0018,9432) Field of View Sequence FieldOfViewSequence SQ 1 (0018,9433) Field of View Description FieldOfViewDescription LO 1 (0018,9434) Exposure Control Sensing Regions Sequence ExposureControlSensingRegionsSequence SQ 1 (0018,9435) Exposure Control Sensing Region Shape ExposureControlSensingRegionShape CS 1 (0018,9436) Exposure Control Sensing Region Left Vertical Edge ExposureControlSensingRegionLeftVerticalEdge SS 1 (0018,9437) Exposure Control Sensing Region Right Vertical Edge ExposureControlSensingRegionRightVerticalEdge SS 1 (0018,9438) Exposure Control Sensing Region Upper Horizontal Edge ExposureControlSensingRegionUpperHorizontalEdge SS 1 (0018,9439) Exposure Control Sensing Region Lower Horizontal Edge ExposureControlSensingRegionLowerHorizontalEdge SS 1 (0018,9440) Center of Circular Exposure Control Sensing Region CenterOfCircularExposureControlSensingRegion SS 2 (0018,9441) Radius of Circular Exposure Control Sensing Region RadiusOfCircularExposureControlSensingRegion US 1 (0018,9442) Vertices of the Polygonal Exposure Control Sensing Region VerticesOfThePolygonalExposureControlSensingRegion SS 2-n (0018,9445) RET (0018,9447) Column Angulation (Patient) ColumnAngulationPatient FL 1 (0018,9449) Beam Angle BeamAngle FL 1 (0018,9451) Frame Detector Parameters Sequence FrameDetectorParametersSequence SQ 1 (0018,9452) Calculated Anatomy Thickness CalculatedAnatomyThickness FL 1 (0018,9455) Calibration Sequence CalibrationSequence SQ 1 (0018,9456) Object Thickness Sequence ObjectThicknessSequence SQ 1 (0018,9457) Plane Identification PlaneIdentification CS 1 (0018,9461) Field of View Dimension(s) in Float FieldOfViewDimensionsInFloat FL 1-2 (0018,9462) Isocenter Reference System Sequence IsocenterReferenceSystemSequence SQ 1 (0018,9463) Positioner Isocenter Primary Angle PositionerIsocenterPrimaryAngle FL 1 (0018,9464) Positioner Isocenter Secondary Angle PositionerIsocenterSecondaryAngle FL 1 (0018,9465) Positioner Isocenter Detector Rotation Angle PositionerIsocenterDetectorRotationAngle FL 1 (0018,9466) Table X Position to Isocenter TableXPositionToIsocenter FL 1 (0018,9467) Table Y Position to Isocenter TableYPositionToIsocenter FL 1 (0018,9468) Table Z Position to Isocenter TableZPositionToIsocenter FL 1 (0018,9469) Table Horizontal Rotation Angle TableHorizontalRotationAngle FL 1 (0018,9470) Table Head Tilt Angle TableHeadTiltAngle FL 1 (0018,9471) Table Cradle Tilt Angle TableCradleTiltAngle FL 1 (0018,9472) Frame Display Shutter Sequence FrameDisplayShutterSequence SQ 1 (0018,9473) Acquired Image Area Dose Product AcquiredImageAreaDoseProduct FL 1 (0018,9474) C-arm Positioner Tabletop Relationship CArmPositionerTabletopRelationship CS 1 (0018,9476) X-Ray Geometry Sequence XRayGeometrySequence SQ 1 (0018,9477) Irradiation Event Identification Sequence IrradiationEventIdentificationSequence SQ 1 (0018,9504) X-Ray 3D Frame Type Sequence XRay3DFrameTypeSequence SQ 1 (0018,9506) Contributing Sources Sequence ContributingSourcesSequence SQ 1 (0018,9507) X-Ray 3D Acquisition Sequence XRay3DAcquisitionSequence SQ 1 (0018,9508) Primary Positioner Scan Arc PrimaryPositionerScanArc FL 1 (0018,9509) Secondary Positioner Scan Arc SecondaryPositionerScanArc FL 1 (0018,9510) Primary Positioner Scan Start Angle PrimaryPositionerScanStartAngle FL 1 (0018,9511) Secondary Positioner Scan Start Angle SecondaryPositionerScanStartAngle FL 1 (0018,9514) Primary Positioner Increment PrimaryPositionerIncrement FL 1 (0018,9515) Secondary Positioner Increment SecondaryPositionerIncrement FL 1 (0018,9516) Start Acquisition DateTime StartAcquisitionDateTime DT 1 (0018,9517) End Acquisition DateTime EndAcquisitionDateTime DT 1 (0018,9518) Primary Positioner Increment Sign PrimaryPositionerIncrementSign SS 1 (0018,9519) Secondary Positioner Increment Sign SecondaryPositionerIncrementSign SS 1 (0018,9524) Application Name ApplicationName LO 1 (0018,9525) Application Version ApplicationVersion LO 1 (0018,9526) Application Manufacturer ApplicationManufacturer LO 1 (0018,9527) Algorithm Type AlgorithmType CS 1 (0018,9528) Algorithm Description AlgorithmDescription LO 1 (0018,9530) X-Ray 3D Reconstruction Sequence XRay3DReconstructionSequence SQ 1 (0018,9531) Reconstruction Description ReconstructionDescription LO 1 (0018,9538) Per Projection Acquisition Sequence PerProjectionAcquisitionSequence SQ 1 (0018,9541) Detector Position Sequence DetectorPositionSequence SQ 1 (0018,9542) X-Ray Acquisition Dose Sequence XRayAcquisitionDoseSequence SQ 1 (0018,9543) X-Ray Source Isocenter Primary Angle XRaySourceIsocenterPrimaryAngle FD 1 (0018,9544) X-Ray Source Isocenter Secondary Angle XRaySourceIsocenterSecondaryAngle FD 1 (0018,9545) Breast Support Isocenter Primary Angle BreastSupportIsocenterPrimaryAngle FD 1 (0018,9546) Breast Support Isocenter Secondary Angle BreastSupportIsocenterSecondaryAngle FD 1 (0018,9547) Breast Support X Position to Isocenter BreastSupportXPositionToIsocenter FD 1 (0018,9548) Breast Support Y Position to Isocenter BreastSupportYPositionToIsocenter FD 1 (0018,9549) Breast Support Z Position to Isocenter BreastSupportZPositionToIsocenter FD 1 (0018,9550) Detector Isocenter Primary Angle DetectorIsocenterPrimaryAngle FD 1 (0018,9551) Detector Isocenter Secondary Angle DetectorIsocenterSecondaryAngle FD 1 (0018,9552) Detector X Position to Isocenter DetectorXPositionToIsocenter FD 1 (0018,9553) Detector Y Position to Isocenter DetectorYPositionToIsocenter FD 1 (0018,9554) Detector Z Position to Isocenter DetectorZPositionToIsocenter FD 1 (0018,9555) X-Ray Grid Sequence XRayGridSequence SQ 1 (0018,9556) X-Ray Filter Sequence XRayFilterSequence SQ 1 (0018,9557) Detector Active Area TLHC Position DetectorActiveAreaTLHCPosition FD 3 (0018,9558) Detector Active Area Orientation DetectorActiveAreaOrientation FD 6 (0018,9559) Positioner Primary Angle Direction PositionerPrimaryAngleDirection CS 1 (0018,9601) Diffusion b-matrix Sequence DiffusionBMatrixSequence SQ 1 (0018,9602) Diffusion b-value XX DiffusionBValueXX FD 1 (0018,9603) Diffusion b-value XY DiffusionBValueXY FD 1 (0018,9604) Diffusion b-value XZ DiffusionBValueXZ FD 1 (0018,9605) Diffusion b-value YY DiffusionBValueYY FD 1 (0018,9606) Diffusion b-value YZ DiffusionBValueYZ FD 1 (0018,9607) Diffusion b-value ZZ DiffusionBValueZZ FD 1 (0018,9621) Functional MR Sequence FunctionalMRSequence SQ 1 (0018,9622) Functional Settling Phase Frames Present FunctionalSettlingPhaseFramesPresent CS 1 (0018,9623) Functional Sync Pulse FunctionalSyncPulse DT 1 (0018,9624) Settling Phase Frame SettlingPhaseFrame CS 1 (0018,9701) Decay Correction DateTime DecayCorrectionDateTime DT 1 (0018,9715) Start Density Threshold StartDensityThreshold FD 1 (0018,9716) Start Relative Density Difference Threshold StartRelativeDensityDifferenceThreshold FD 1 (0018,9717) Start Cardiac Trigger Count Threshold StartCardiacTriggerCountThreshold FD 1 (0018,9718) Start Respiratory Trigger Count Threshold StartRespiratoryTriggerCountThreshold FD 1 (0018,9719) Termination Counts Threshold TerminationCountsThreshold FD 1 (0018,9720) Termination Density Threshold TerminationDensityThreshold FD 1 (0018,9721) Termination Relative Density Threshold TerminationRelativeDensityThreshold FD 1 (0018,9722) Termination Time Threshold TerminationTimeThreshold FD 1 (0018,9723) Termination Cardiac Trigger Count Threshold TerminationCardiacTriggerCountThreshold FD 1 (0018,9724) Termination Respiratory Trigger Count Threshold TerminationRespiratoryTriggerCountThreshold FD 1 (0018,9725) Detector Geometry DetectorGeometry CS 1 (0018,9726) Transverse Detector Separation TransverseDetectorSeparation FD 1 (0018,9727) Axial Detector Dimension AxialDetectorDimension FD 1 (0018,9729) Radiopharmaceutical Agent Number RadiopharmaceuticalAgentNumber US 1 (0018,9732) PET Frame Acquisition Sequence PETFrameAcquisitionSequence SQ 1 (0018,9733) PET Detector Motion Details Sequence PETDetectorMotionDetailsSequence SQ 1 (0018,9734) PET Table Dynamics Sequence PETTableDynamicsSequence SQ 1 (0018,9735) PET Position Sequence PETPositionSequence SQ 1 (0018,9736) PET Frame Correction Factors Sequence PETFrameCorrectionFactorsSequence SQ 1 (0018,9737) Radiopharmaceutical Usage Sequence RadiopharmaceuticalUsageSequence SQ 1 (0018,9738) Attenuation Correction Source AttenuationCorrectionSource CS 1 (0018,9739) Number of Iterations NumberOfIterations US 1 (0018,9740) Number of Subsets NumberOfSubsets US 1 (0018,9749) PET Reconstruction Sequence PETReconstructionSequence SQ 1 (0018,9751) PET Frame Type Sequence PETFrameTypeSequence SQ 1 (0018,9755) Time of Flight Information Used TimeOfFlightInformationUsed CS 1 (0018,9756) Reconstruction Type ReconstructionType CS 1 (0018,9758) Decay Corrected DecayCorrected CS 1 (0018,9759) Attenuation Corrected AttenuationCorrected CS 1 (0018,9760) Scatter Corrected ScatterCorrected CS 1 (0018,9761) Dead Time Corrected DeadTimeCorrected CS 1 (0018,9762) Gantry Motion Corrected GantryMotionCorrected CS 1 (0018,9763) Patient Motion Corrected PatientMotionCorrected CS 1 (0018,9764) Count Loss Normalization Corrected CountLossNormalizationCorrected CS 1 (0018,9765) Randoms Corrected RandomsCorrected CS 1 (0018,9766) Non-uniform Radial Sampling Corrected NonUniformRadialSamplingCorrected CS 1 (0018,9767) Sensitivity Calibrated SensitivityCalibrated CS 1 (0018,9768) Detector Normalization Correction DetectorNormalizationCorrection CS 1 (0018,9769) Iterative Reconstruction Method IterativeReconstructionMethod CS 1 (0018,9770) Attenuation Correction Temporal Relationship AttenuationCorrectionTemporalRelationship CS 1 (0018,9771) Patient Physiological State Sequence PatientPhysiologicalStateSequence SQ 1 (0018,9772) Patient Physiological State Code Sequence PatientPhysiologicalStateCodeSequence SQ 1 (0018,9801) Depth(s) of Focus DepthsOfFocus FD 1-n (0018,9803) Excluded Intervals Sequence ExcludedIntervalsSequence SQ 1 (0018,9804) Exclusion Start DateTime ExclusionStartDateTime DT 1 (0018,9805) Exclusion Duration ExclusionDuration FD 1 (0018,9806) US Image Description Sequence USImageDescriptionSequence SQ 1 (0018,9807) Image Data Type Sequence ImageDataTypeSequence SQ 1 (0018,9808) Data Type DataType CS 1 (0018,9809) Transducer Scan Pattern Code Sequence TransducerScanPatternCodeSequence SQ 1 (0018,980B) Aliased Data Type AliasedDataType CS 1 (0018,980C) Position Measuring Device Used PositionMeasuringDeviceUsed CS 1 (0018,980D) Transducer Geometry Code Sequence TransducerGeometryCodeSequence SQ 1 (0018,980E) Transducer Beam Steering Code Sequence TransducerBeamSteeringCodeSequence SQ 1 (0018,980F) Transducer Application Code Sequence TransducerApplicationCodeSequence SQ 1 (0018,9810) Zero Velocity Pixel Value ZeroVelocityPixelValue US or SS 1 (0018,9900) Reference Location Label ReferenceLocationLabel LO 1 (0018,9901) Reference Location Description ReferenceLocationDescription UT 1 (0018,9902) Reference Basis Code Sequence ReferenceBasisCodeSequence SQ 1 (0018,9903) Reference Geometry Code Sequence ReferenceGeometryCodeSequence SQ 1 (0018,9904) Offset Distance OffsetDistance DS 1 (0018,9905) Offset Direction OffsetDirection CS 1 (0018,9906) Potential Scheduled Protocol Code Sequence PotentialScheduledProtocolCodeSequence SQ 1 (0018,9907) Potential Requested Procedure Code Sequence PotentialRequestedProcedureCodeSequence SQ 1 (0018,9908) Potential Reasons for Procedure PotentialReasonsForProcedure UC 1-n (0018,9909) Potential Reasons for Procedure Code Sequence PotentialReasonsForProcedureCodeSequence SQ 1 (0018,990A) Potential Diagnostic Tasks PotentialDiagnosticTasks UC 1-n (0018,990B) Contraindications Code Sequence ContraindicationsCodeSequence SQ 1 (0018,990C) Referenced Defined Protocol Sequence ReferencedDefinedProtocolSequence SQ 1 (0018,990D) Referenced Performed Protocol Sequence ReferencedPerformedProtocolSequence SQ 1 (0018,990E) Predecessor Protocol Sequence PredecessorProtocolSequence SQ 1 (0018,990F) Protocol Planning Information ProtocolPlanningInformation UT 1 (0018,9910) Protocol Design Rationale ProtocolDesignRationale UT 1 (0018,9911) Patient Specification Sequence PatientSpecificationSequence SQ 1 (0018,9912) Model Specification Sequence ModelSpecificationSequence SQ 1 (0018,9913) Parameters Specification Sequence ParametersSpecificationSequence SQ 1 (0018,9914) Instruction Sequence InstructionSequence SQ 1 (0018,9915) Instruction Index InstructionIndex US 1 (0018,9916) Instruction Text InstructionText LO 1 (0018,9917) Instruction Description InstructionDescription UT 1 (0018,9918) Instruction Performed Flag InstructionPerformedFlag CS 1 (0018,9919) Instruction Performed DateTime InstructionPerformedDateTime DT 1 (0018,991A) Instruction Performance Comment InstructionPerformanceComment UT 1 (0018,991B) Patient Positioning Instruction Sequence PatientPositioningInstructionSequence SQ 1 (0018,991C) Positioning Method Code Sequence PositioningMethodCodeSequence SQ 1 (0018,991D) Positioning Landmark Sequence PositioningLandmarkSequence SQ 1 (0018,991E) Target Frame of Reference UID TargetFrameOfReferenceUID UI 1 (0018,991F) Acquisition Protocol Element Specification Sequence AcquisitionProtocolElementSpecificationSequence SQ 1 (0018,9920) Acquisition Protocol Element Sequence AcquisitionProtocolElementSequence SQ 1 (0018,9921) Protocol Element Number ProtocolElementNumber US 1 (0018,9922) Protocol Element Name ProtocolElementName LO 1 (0018,9923) Protocol Element Characteristics Summary ProtocolElementCharacteristicsSummary UT 1 (0018,9924) Protocol Element Purpose ProtocolElementPurpose UT 1 (0018,9930) Acquisition Motion AcquisitionMotion CS 1 (0018,9931) Acquisition Start Location Sequence AcquisitionStartLocationSequence SQ 1 (0018,9932) Acquisition End Location Sequence AcquisitionEndLocationSequence SQ 1 (0018,9933) Reconstruction Protocol Element Specification Sequence ReconstructionProtocolElementSpecificationSequence SQ 1 (0018,9934) Reconstruction Protocol Element Sequence ReconstructionProtocolElementSequence SQ 1 (0018,9935) Storage Protocol Element Specification Sequence StorageProtocolElementSpecificationSequence SQ 1 (0018,9936) Storage Protocol Element Sequence StorageProtocolElementSequence SQ 1 (0018,9937) Requested Series Description RequestedSeriesDescription LO 1 (0018,9938) Source Acquisition Protocol Element Number SourceAcquisitionProtocolElementNumber US 1-n (0018,9939) Source Acquisition Beam Number SourceAcquisitionBeamNumber US 1-n (0018,993A) Source Reconstruction Protocol Element Number SourceReconstructionProtocolElementNumber US 1-n (0018,993B) Reconstruction Start Location Sequence ReconstructionStartLocationSequence SQ 1 (0018,993C) Reconstruction End Location Sequence ReconstructionEndLocationSequence SQ 1 (0018,993D) Reconstruction Algorithm Sequence ReconstructionAlgorithmSequence SQ 1 (0018,993E) Reconstruction Target Center Location Sequence ReconstructionTargetCenterLocationSequence SQ 1 (0018,9941) Image Filter Description ImageFilterDescription UT 1 (0018,9942) CTDIvol Notification Trigger CTDIvolNotificationTrigger FD 1 (0018,9943) DLP Notification Trigger DLPNotificationTrigger FD 1 (0018,9944) Auto KVP Selection Type AutoKVPSelectionType CS 1 (0018,9945) Auto KVP Upper Bound AutoKVPUpperBound FD 1 (0018,9946) Auto KVP Lower Bound AutoKVPLowerBound FD 1 (0018,9947) Protocol Defined Patient Position ProtocolDefinedPatientPosition CS 1 (0018,A001) Contributing Equipment Sequence ContributingEquipmentSequence SQ 1 (0018,A002) Contribution DateTime ContributionDateTime DT 1 (0018,A003) Contribution Description ContributionDescription ST 1 (0020,000D) Study Instance UID StudyInstanceUID UI 1 (0020,000E) Series Instance UID SeriesInstanceUID UI 1 (0020,0010) Study ID StudyID SH 1 (0020,0011) Series Number SeriesNumber IS 1 (0020,0012) Acquisition Number AcquisitionNumber IS 1 (0020,0013) Instance Number InstanceNumber IS 1 (0020,0014) Isotope Number IsotopeNumber IS 1 RET (0020,0015) Phase Number PhaseNumber IS 1 RET (0020,0016) Interval Number IntervalNumber IS 1 RET (0020,0017) Time Slot Number TimeSlotNumber IS 1 RET (0020,0018) Angle Number AngleNumber IS 1 RET (0020,0019) Item Number ItemNumber IS 1 (0020,0020) Patient Orientation PatientOrientation CS 2 (0020,0022) Overlay Number OverlayNumber IS 1 RET (0020,0024) Curve Number CurveNumber IS 1 RET (0020,0026) LUT Number LUTNumber IS 1 RET (0020,0030) Image Position ImagePosition DS 3 RET (0020,0032) Image Position (Patient) ImagePositionPatient DS 3 (0020,0035) Image Orientation ImageOrientation DS 6 RET (0020,0037) Image Orientation (Patient) ImageOrientationPatient DS 6 (0020,0050) Location Location DS 1 RET (0020,0052) Frame of Reference UID FrameOfReferenceUID UI 1 (0020,0060) Laterality Laterality CS 1 (0020,0062) Image Laterality ImageLaterality CS 1 (0020,0070) Image Geometry Type ImageGeometryType LO 1 RET (0020,0080) Masking Image MaskingImage CS 1-n RET (0020,00AA) Report Number ReportNumber IS 1 RET (0020,0100) Temporal Position Identifier TemporalPositionIdentifier IS 1 (0020,0105) Number of Temporal Positions NumberOfTemporalPositions IS 1 (0020,0110) Temporal Resolution TemporalResolution DS 1 (0020,0200) Synchronization Frame of Reference UID SynchronizationFrameOfReferenceUID UI 1 (0020,0242) SOP Instance UID of Concatenation Source SOPInstanceUIDOfConcatenationSource UI 1 (0020,1000) Series in Study SeriesInStudy IS 1 RET (0020,1001) Acquisitions in Series AcquisitionsInSeries IS 1 RET (0020,1002) Images in Acquisition ImagesInAcquisition IS 1 (0020,1003) Images in Series ImagesInSeries IS 1 RET (0020,1004) Acquisitions in Study AcquisitionsInStudy IS 1 RET (0020,1005) Images in Study ImagesInStudy IS 1 RET (0020,1020) Reference Reference LO 1-n RET (0020,103F) Target Position Reference Indicator TargetPositionReferenceIndicator LO 1 (0020,1040) Position Reference Indicator PositionReferenceIndicator LO 1 (0020,1041) Slice Location SliceLocation DS 1 (0020,1070) Other Study Numbers OtherStudyNumbers IS 1-n RET (0020,1200) Number of Patient Related Studies NumberOfPatientRelatedStudies IS 1 (0020,1202) Number of Patient Related Series NumberOfPatientRelatedSeries IS 1 (0020,1204) Number of Patient Related Instances NumberOfPatientRelatedInstances IS 1 (0020,1206) Number of Study Related Series NumberOfStudyRelatedSeries IS 1 (0020,1208) Number of Study Related Instances NumberOfStudyRelatedInstances IS 1 (0020,1209) Number of Series Related Instances NumberOfSeriesRelatedInstances IS 1 (0020,31xx) Source Image IDs SourceImageIDs CS 1-n RET (0020,3401) Modifying Device ID ModifyingDeviceID CS 1 RET (0020,3402) Modified Image ID ModifiedImageID CS 1 RET (0020,3403) Modified Image Date ModifiedImageDate DA 1 RET (0020,3404) Modifying Device Manufacturer ModifyingDeviceManufacturer LO 1 RET (0020,3405) Modified Image Time ModifiedImageTime TM 1 RET (0020,3406) Modified Image Description ModifiedImageDescription LO 1 RET (0020,4000) Image Comments ImageComments LT 1 (0020,5000) Original Image Identification OriginalImageIdentification AT 1-n RET (0020,5002) Original Image Identification Nomenclature OriginalImageIdentificationNomenclature LO 1-n RET (0020,9056) Stack ID StackID SH 1 (0020,9057) In-Stack Position Number InStackPositionNumber UL 1 (0020,9071) Frame Anatomy Sequence FrameAnatomySequence SQ 1 (0020,9072) Frame Laterality FrameLaterality CS 1 (0020,9111) Frame Content Sequence FrameContentSequence SQ 1 (0020,9113) Plane Position Sequence PlanePositionSequence SQ 1 (0020,9116) Plane Orientation Sequence PlaneOrientationSequence SQ 1 (0020,9128) Temporal Position Index TemporalPositionIndex UL 1 (0020,9153) Nominal Cardiac Trigger Delay Time NominalCardiacTriggerDelayTime FD 1 (0020,9154) Nominal Cardiac Trigger Time Prior To R-Peak NominalCardiacTriggerTimePriorToRPeak FL 1 (0020,9155) Actual Cardiac Trigger Time Prior To R-Peak ActualCardiacTriggerTimePriorToRPeak FL 1 (0020,9156) Frame Acquisition Number FrameAcquisitionNumber US 1 (0020,9157) Dimension Index Values DimensionIndexValues UL 1-n (0020,9158) Frame Comments FrameComments LT 1 (0020,9161) Concatenation UID ConcatenationUID UI 1 (0020,9162) In-concatenation Number InConcatenationNumber US 1 (0020,9163) In-concatenation Total Number InConcatenationTotalNumber US 1 (0020,9164) Dimension Organization UID DimensionOrganizationUID UI 1 (0020,9165) Dimension Index Pointer DimensionIndexPointer AT 1 (0020,9167) Functional Group Pointer FunctionalGroupPointer AT 1 (0020,9170) Unassigned Shared Converted Attributes Sequence UnassignedSharedConvertedAttributesSequence SQ 1 (0020,9171) Unassigned Per-Frame Converted Attributes Sequence UnassignedPerFrameConvertedAttributesSequence SQ 1 (0020,9172) Conversion Source Attributes Sequence ConversionSourceAttributesSequence SQ 1 (0020,9213) Dimension Index Private Creator DimensionIndexPrivateCreator LO 1 (0020,9221) Dimension Organization Sequence DimensionOrganizationSequence SQ 1 (0020,9222) Dimension Index Sequence DimensionIndexSequence SQ 1 (0020,9228) Concatenation Frame Offset Number ConcatenationFrameOffsetNumber UL 1 (0020,9238) Functional Group Private Creator FunctionalGroupPrivateCreator LO 1 (0020,9241) Nominal Percentage of Cardiac Phase NominalPercentageOfCardiacPhase FL 1 (0020,9245) Nominal Percentage of Respiratory Phase NominalPercentageOfRespiratoryPhase FL 1 (0020,9246) Starting Respiratory Amplitude StartingRespiratoryAmplitude FL 1 (0020,9247) Starting Respiratory Phase StartingRespiratoryPhase CS 1 (0020,9248) Ending Respiratory Amplitude EndingRespiratoryAmplitude FL 1 (0020,9249) Ending Respiratory Phase EndingRespiratoryPhase CS 1 (0020,9250) Respiratory Trigger Type RespiratoryTriggerType CS 1 (0020,9251) R-R Interval Time Nominal RRIntervalTimeNominal FD 1 (0020,9252) Actual Cardiac Trigger Delay Time ActualCardiacTriggerDelayTime FD 1 (0020,9253) Respiratory Synchronization Sequence RespiratorySynchronizationSequence SQ 1 (0020,9254) Respiratory Interval Time RespiratoryIntervalTime FD 1 (0020,9255) Nominal Respiratory Trigger Delay Time NominalRespiratoryTriggerDelayTime FD 1 (0020,9256) Respiratory Trigger Delay Threshold RespiratoryTriggerDelayThreshold FD 1 (0020,9257) Actual Respiratory Trigger Delay Time ActualRespiratoryTriggerDelayTime FD 1 (0020,9301) Image Position (Volume) ImagePositionVolume FD 3 (0020,9302) Image Orientation (Volume) ImageOrientationVolume FD 6 (0020,9307) Ultrasound Acquisition Geometry UltrasoundAcquisitionGeometry CS 1 (0020,9308) Apex Position ApexPosition FD 3 (0020,9309) Volume to Transducer Mapping Matrix VolumeToTransducerMappingMatrix FD 16 (0020,930A) Volume to Table Mapping Matrix VolumeToTableMappingMatrix FD 16 (0020,930B) Volume to Transducer Relationship VolumeToTransducerRelationship CS 1 (0020,930C) Patient Frame of Reference Source PatientFrameOfReferenceSource CS 1 (0020,930D) Temporal Position Time Offset TemporalPositionTimeOffset FD 1 (0020,930E) Plane Position (Volume) Sequence PlanePositionVolumeSequence SQ 1 (0020,930F) Plane Orientation (Volume) Sequence PlaneOrientationVolumeSequence SQ 1 (0020,9310) Temporal Position Sequence TemporalPositionSequence SQ 1 (0020,9311) Dimension Organization Type DimensionOrganizationType CS 1 (0020,9312) Volume Frame of Reference UID VolumeFrameOfReferenceUID UI 1 (0020,9313) Table Frame of Reference UID TableFrameOfReferenceUID UI 1 (0020,9421) Dimension Description Label DimensionDescriptionLabel LO 1 (0020,9450) Patient Orientation in Frame Sequence PatientOrientationInFrameSequence SQ 1 (0020,9453) Frame Label FrameLabel LO 1 (0020,9518) Acquisition Index AcquisitionIndex US 1-n (0020,9529) Contributing SOP Instances Reference Sequence ContributingSOPInstancesReferenceSequence SQ 1 (0020,9536) Reconstruction Index ReconstructionIndex US 1 (0022,0001) Light Path Filter Pass-Through Wavelength LightPathFilterPassThroughWavelength US 1 (0022,0002) Light Path Filter Pass Band LightPathFilterPassBand US 2 (0022,0003) Image Path Filter Pass-Through Wavelength ImagePathFilterPassThroughWavelength US 1 (0022,0004) Image Path Filter Pass Band ImagePathFilterPassBand US 2 (0022,0005) Patient Eye Movement Commanded PatientEyeMovementCommanded CS 1 (0022,0006) Patient Eye Movement Command Code Sequence PatientEyeMovementCommandCodeSequence SQ 1 (0022,0007) Spherical Lens Power SphericalLensPower FL 1 (0022,0008) Cylinder Lens Power CylinderLensPower FL 1 (0022,0009) Cylinder Axis CylinderAxis FL 1 (0022,000A) Emmetropic Magnification EmmetropicMagnification FL 1 (0022,000B) Intra Ocular Pressure IntraOcularPressure FL 1 (0022,000C) Horizontal Field of View HorizontalFieldOfView FL 1 (0022,000D) Pupil Dilated PupilDilated CS 1 (0022,000E) Degree of Dilation DegreeOfDilation FL 1 (0022,0010) Stereo Baseline Angle StereoBaselineAngle FL 1 (0022,0011) Stereo Baseline Displacement StereoBaselineDisplacement FL 1 (0022,0012) Stereo Horizontal Pixel Offset StereoHorizontalPixelOffset FL 1 (0022,0013) Stereo Vertical Pixel Offset StereoVerticalPixelOffset FL 1 (0022,0014) Stereo Rotation StereoRotation FL 1 (0022,0015) Acquisition Device Type Code Sequence AcquisitionDeviceTypeCodeSequence SQ 1 (0022,0016) Illumination Type Code Sequence IlluminationTypeCodeSequence SQ 1 (0022,0017) Light Path Filter Type Stack Code Sequence LightPathFilterTypeStackCodeSequence SQ 1 (0022,0018) Image Path Filter Type Stack Code Sequence ImagePathFilterTypeStackCodeSequence SQ 1 (0022,0019) Lenses Code Sequence LensesCodeSequence SQ 1 (0022,001A) Channel Description Code Sequence ChannelDescriptionCodeSequence SQ 1 (0022,001B) Refractive State Sequence RefractiveStateSequence SQ 1 (0022,001C) Mydriatic Agent Code Sequence MydriaticAgentCodeSequence SQ 1 (0022,001D) Relative Image Position Code Sequence RelativeImagePositionCodeSequence SQ 1 (0022,001E) Camera Angle of View CameraAngleOfView FL 1 (0022,0020) Stereo Pairs Sequence StereoPairsSequence SQ 1 (0022,0021) Left Image Sequence LeftImageSequence SQ 1 (0022,0022) Right Image Sequence RightImageSequence SQ 1 (0022,0028) Stereo Pairs Present StereoPairsPresent CS 1 (0022,0030) Axial Length of the Eye AxialLengthOfTheEye FL 1 (0022,0031) Ophthalmic Frame Location Sequence OphthalmicFrameLocationSequence SQ 1 (0022,0032) Reference Coordinates ReferenceCoordinates FL 2-2n (0022,0035) Depth Spatial Resolution DepthSpatialResolution FL 1 (0022,0036) Maximum Depth Distortion MaximumDepthDistortion FL 1 (0022,0037) Along-scan Spatial Resolution AlongScanSpatialResolution FL 1 (0022,0038) Maximum Along-scan Distortion MaximumAlongScanDistortion FL 1 (0022,0039) Ophthalmic Image Orientation OphthalmicImageOrientation CS 1 (0022,0041) Depth of Transverse Image DepthOfTransverseImage FL 1 (0022,0042) Mydriatic Agent Concentration Units Sequence MydriaticAgentConcentrationUnitsSequence SQ 1 (0022,0048) Across-scan Spatial Resolution AcrossScanSpatialResolution FL 1 (0022,0049) Maximum Across-scan Distortion MaximumAcrossScanDistortion FL 1 (0022,004E) Mydriatic Agent Concentration MydriaticAgentConcentration DS 1 (0022,0055) Illumination Wave Length IlluminationWaveLength FL 1 (0022,0056) Illumination Power IlluminationPower FL 1 (0022,0057) Illumination Bandwidth IlluminationBandwidth FL 1 (0022,0058) Mydriatic Agent Sequence MydriaticAgentSequence SQ 1 (0022,1007) Ophthalmic Axial Measurements Right Eye Sequence OphthalmicAxialMeasurementsRightEyeSequence SQ 1 (0022,1008) Ophthalmic Axial Measurements Left Eye Sequence OphthalmicAxialMeasurementsLeftEyeSequence SQ 1 (0022,1009) Ophthalmic Axial Measurements Device Type OphthalmicAxialMeasurementsDeviceType CS 1 (0022,1010) Ophthalmic Axial Length Measurements Type OphthalmicAxialLengthMeasurementsType CS 1 (0022,1012) Ophthalmic Axial Length Sequence OphthalmicAxialLengthSequence SQ 1 (0022,1019) Ophthalmic Axial Length OphthalmicAxialLength FL 1 (0022,1024) Lens Status Code Sequence LensStatusCodeSequence SQ 1 (0022,1025) Vitreous Status Code Sequence VitreousStatusCodeSequence SQ 1 (0022,1028) IOL Formula Code Sequence IOLFormulaCodeSequence SQ 1 (0022,1029) IOL Formula Detail IOLFormulaDetail LO 1 (0022,1033) Keratometer Index KeratometerIndex FL 1 (0022,1035) Source of Ophthalmic Axial Length Code Sequence SourceOfOphthalmicAxialLengthCodeSequence SQ 1 (0022,1036) Source of Corneal Size Data Code Sequence SourceOfCornealSizeDataCodeSequence SQ 1 (0022,1037) Target Refraction TargetRefraction FL 1 (0022,1039) Refractive Procedure Occurred RefractiveProcedureOccurred CS 1 (0022,1040) Refractive Surgery Type Code Sequence RefractiveSurgeryTypeCodeSequence SQ 1 (0022,1044) Ophthalmic Ultrasound Method Code Sequence OphthalmicUltrasoundMethodCodeSequence SQ 1 (0022,1045) Surgically Induced Astigmatism Sequence SurgicallyInducedAstigmatismSequence SQ 1 (0022,1046) Type of Optical Correction TypeOfOpticalCorrection CS 1 (0022,1047) Toric IOL Power Sequence ToricIOLPowerSequence SQ 1 (0022,1048) Predicted Toric Error Sequence PredictedToricErrorSequence SQ 1 (0022,1049) Pre-Selected for Implantation PreSelectedForImplantation CS 1 (0022,104A) Toric IOL Power for Exact Emmetropia Sequence ToricIOLPowerForExactEmmetropiaSequence SQ 1 (0022,104B) Toric IOL Power for Exact Target Refraction Sequence ToricIOLPowerForExactTargetRefractionSequence SQ 1 (0022,1050) Ophthalmic Axial Length Measurements Sequence OphthalmicAxialLengthMeasurementsSequence SQ 1 (0022,1053) IOL Power IOLPower FL 1 (0022,1054) Predicted Refractive Error PredictedRefractiveError FL 1 (0022,1059) Ophthalmic Axial Length Velocity OphthalmicAxialLengthVelocity FL 1 (0022,1065) Lens Status Description LensStatusDescription LO 1 (0022,1066) Vitreous Status Description VitreousStatusDescription LO 1 (0022,1090) IOL Power Sequence IOLPowerSequence SQ 1 (0022,1092) Lens Constant Sequence LensConstantSequence SQ 1 (0022,1093) IOL Manufacturer IOLManufacturer LO 1 (0022,1094) Lens Constant Description LensConstantDescription LO 1 RET (0022,1095) Implant Name ImplantName LO 1 (0022,1096) Keratometry Measurement Type Code Sequence KeratometryMeasurementTypeCodeSequence SQ 1 (0022,1097) Implant Part Number ImplantPartNumber LO 1 (0022,1100) Referenced Ophthalmic Axial Measurements Sequence ReferencedOphthalmicAxialMeasurementsSequence SQ 1 (0022,1101) Ophthalmic Axial Length Measurements Segment Name Code Sequence OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence SQ 1 (0022,1103) Refractive Error Before Refractive Surgery Code Sequence RefractiveErrorBeforeRefractiveSurgeryCodeSequence SQ 1 (0022,1121) IOL Power For Exact Emmetropia IOLPowerForExactEmmetropia FL 1 (0022,1122) IOL Power For Exact Target Refraction IOLPowerForExactTargetRefraction FL 1 (0022,1125) Anterior Chamber Depth Definition Code Sequence AnteriorChamberDepthDefinitionCodeSequence SQ 1 (0022,1127) Lens Thickness Sequence LensThicknessSequence SQ 1 (0022,1128) Anterior Chamber Depth Sequence AnteriorChamberDepthSequence SQ 1 (0022,112A) Calculation Comment Sequence CalculationCommentSequence SQ 1 (0022,112B) Calculation Comment Type CalculationCommentType CS 1 (0022,112C) Calculation Comment CalculationComment LT 1 (0022,1130) Lens Thickness LensThickness FL 1 (0022,1131) Anterior Chamber Depth AnteriorChamberDepth FL 1 (0022,1132) Source of Lens Thickness Data Code Sequence SourceOfLensThicknessDataCodeSequence SQ 1 (0022,1133) Source of Anterior Chamber Depth Data Code Sequence SourceOfAnteriorChamberDepthDataCodeSequence SQ 1 (0022,1134) Source of Refractive Measurements Sequence SourceOfRefractiveMeasurementsSequence SQ 1 (0022,1135) Source of Refractive Measurements Code Sequence SourceOfRefractiveMeasurementsCodeSequence SQ 1 (0022,1140) Ophthalmic Axial Length Measurement Modified OphthalmicAxialLengthMeasurementModified CS 1 (0022,1150) Ophthalmic Axial Length Data Source Code Sequence OphthalmicAxialLengthDataSourceCodeSequence SQ 1 (0022,1153) Ophthalmic Axial Length Acquisition Method Code Sequence OphthalmicAxialLengthAcquisitionMethodCodeSequence SQ 1 RET (0022,1155) Signal to Noise Ratio SignalToNoiseRatio FL 1 (0022,1159) Ophthalmic Axial Length Data Source Description OphthalmicAxialLengthDataSourceDescription LO 1 (0022,1210) Ophthalmic Axial Length Measurements Total Length Sequence OphthalmicAxialLengthMeasurementsTotalLengthSequence SQ 1 (0022,1211) Ophthalmic Axial Length Measurements Segmental Length Sequence OphthalmicAxialLengthMeasurementsSegmentalLengthSequence SQ 1 (0022,1212) Ophthalmic Axial Length Measurements Length Summation Sequence OphthalmicAxialLengthMeasurementsLengthSummationSequence SQ 1 (0022,1220) Ultrasound Ophthalmic Axial Length Measurements Sequence UltrasoundOphthalmicAxialLengthMeasurementsSequence SQ 1 (0022,1225) Optical Ophthalmic Axial Length Measurements Sequence OpticalOphthalmicAxialLengthMeasurementsSequence SQ 1 (0022,1230) Ultrasound Selected Ophthalmic Axial Length Sequence UltrasoundSelectedOphthalmicAxialLengthSequence SQ 1 (0022,1250) Ophthalmic Axial Length Selection Method Code Sequence OphthalmicAxialLengthSelectionMethodCodeSequence SQ 1 (0022,1255) Optical Selected Ophthalmic Axial Length Sequence OpticalSelectedOphthalmicAxialLengthSequence SQ 1 (0022,1257) Selected Segmental Ophthalmic Axial Length Sequence SelectedSegmentalOphthalmicAxialLengthSequence SQ 1 (0022,1260) Selected Total Ophthalmic Axial Length Sequence SelectedTotalOphthalmicAxialLengthSequence SQ 1 (0022,1262) Ophthalmic Axial Length Quality Metric Sequence OphthalmicAxialLengthQualityMetricSequence SQ 1 (0022,1265) Ophthalmic Axial Length Quality Metric Type Code Sequence OphthalmicAxialLengthQualityMetricTypeCodeSequence SQ 1 RET (0022,1273) Ophthalmic Axial Length Quality Metric Type Description OphthalmicAxialLengthQualityMetricTypeDescription LO 1 RET (0022,1300) Intraocular Lens Calculations Right Eye Sequence IntraocularLensCalculationsRightEyeSequence SQ 1 (0022,1310) Intraocular Lens Calculations Left Eye Sequence IntraocularLensCalculationsLeftEyeSequence SQ 1 (0022,1330) Referenced Ophthalmic Axial Length Measurement QC Image Sequence ReferencedOphthalmicAxialLengthMeasurementQCImageSequence SQ 1 (0022,1415) Ophthalmic Mapping Device Type OphthalmicMappingDeviceType CS 1 (0022,1420) Acquisition Method Code Sequence AcquisitionMethodCodeSequence SQ 1 (0022,1423) Acquisition Method Algorithm Sequence AcquisitionMethodAlgorithmSequence SQ 1 (0022,1436) Ophthalmic Thickness Map Type Code Sequence OphthalmicThicknessMapTypeCodeSequence SQ 1 (0022,1443) Ophthalmic Thickness Mapping Normals Sequence OphthalmicThicknessMappingNormalsSequence SQ 1 (0022,1445) Retinal Thickness Definition Code Sequence RetinalThicknessDefinitionCodeSequence SQ 1 (0022,1450) Pixel Value Mapping to Coded Concept Sequence PixelValueMappingToCodedConceptSequence SQ 1 (0022,1452) Mapped Pixel Value MappedPixelValue US or SS 1 (0022,1454) Pixel Value Mapping Explanation PixelValueMappingExplanation LO 1 (0022,1458) Ophthalmic Thickness Map Quality Threshold Sequence OphthalmicThicknessMapQualityThresholdSequence SQ 1 (0022,1460) Ophthalmic Thickness Map Threshold Quality Rating OphthalmicThicknessMapThresholdQualityRating FL 1 (0022,1463) Anatomic Structure Reference Point AnatomicStructureReferencePoint FL 2 (0022,1465) Registration to Localizer Sequence RegistrationToLocalizerSequence SQ 1 (0022,1466) Registered Localizer Units RegisteredLocalizerUnits CS 1 (0022,1467) Registered Localizer Top Left Hand Corner RegisteredLocalizerTopLeftHandCorner FL 2 (0022,1468) Registered Localizer Bottom Right Hand Corner RegisteredLocalizerBottomRightHandCorner FL 2 (0022,1470) Ophthalmic Thickness Map Quality Rating Sequence OphthalmicThicknessMapQualityRatingSequence SQ 1 (0022,1472) Relevant OPT Attributes Sequence RelevantOPTAttributesSequence SQ 1 (0022,1512) Transformation Method Code Sequence TransformationMethodCodeSequence SQ 1 (0022,1513) Transformation Algorithm Sequence TransformationAlgorithmSequence SQ 1 (0022,1515) Ophthalmic Axial Length Method OphthalmicAxialLengthMethod CS 1 (0022,1517) Ophthalmic FOV OphthalmicFOV FL 1 (0022,1518) Two Dimensional to Three Dimensional Map Sequence TwoDimensionalToThreeDimensionalMapSequence SQ 1 (0022,1525) Wide Field Ophthalmic Photography Quality Rating Sequence WideFieldOphthalmicPhotographyQualityRatingSequence SQ 1 (0022,1526) Wide Field Ophthalmic Photography Quality Threshold Sequence WideFieldOphthalmicPhotographyQualityThresholdSequence SQ 1 (0022,1527) Wide Field Ophthalmic Photography Threshold Quality Rating WideFieldOphthalmicPhotographyThresholdQualityRating FL 1 (0022,1528) X Coordinates Center Pixel View Angle XCoordinatesCenterPixelViewAngle FL 1 (0022,1529) Y Coordinates Center Pixel View Angle YCoordinatesCenterPixelViewAngle FL 1 (0022,1530) Number of Map Points NumberOfMapPoints UL 1 (0022,1531) Two Dimensional to Three Dimensional Map Data TwoDimensionalToThreeDimensionalMapData OF 1 (0022,1612) Derivation Algorithm Sequence DerivationAlgorithmSequence SQ 1 (0022,1615) Ophthalmic Image Type Code Sequence OphthalmicImageTypeCodeSequence SQ 1 (0022,1616) Ophthalmic Image Type Description OphthalmicImageTypeDescription LO 1 (0022,1618) Scan Pattern Type Code Sequence ScanPatternTypeCodeSequence SQ 1 (0022,1620) Referenced Surface Mesh Identification Sequence ReferencedSurfaceMeshIdentificationSequence SQ 1 (0022,1622) Ophthalmic Volumetric Properties Flag OphthalmicVolumetricPropertiesFlag CS 1 (0022,1624) Ophthalmic Anatomic Reference Point X-Coordinate OphthalmicAnatomicReferencePointXCoordinate FL 1 (0022,1626) Ophthalmic Anatomic Reference Point Y-Coordinate OphthalmicAnatomicReferencePointYCoordinate FL 1 (0022,1628) Ophthalmic En Face Image Quality Rating Sequence OphthalmicEnFaceImageQualityRatingSequence SQ 1 (0022,1630) Quality Threshold QualityThreshold DS 1 (0022,1640) OCT B-scan Analysis Acquisition Parameters Sequence OCTBscanAnalysisAcquisitionParametersSequence SQ 1 (0022,1642) Number of B-scans Per Frame NumberofBscansPerFrame UL 1 (0022,1643) B-scan Slab Thickness BscanSlabThickness FL 1 (0022,1644) Distance Between B-scan Slabs DistanceBetweenBscanSlabs FL 1 (0022,1645) B-scan Cycle Time BscanCycleTime FL 1 (0022,1646) B-scan Cycle Time Vector BscanCycleTimeVector FL 1-n (0022,1649) A-scan Rate AscanRate FL 1 (0022,1650) B-scan Rate BscanRate FL 1 (0022,1658) Surface Mesh Z-Pixel Offset SurfaceMeshZPixelOffset UL 1 (0024,0010) Visual Field Horizontal Extent VisualFieldHorizontalExtent FL 1 (0024,0011) Visual Field Vertical Extent VisualFieldVerticalExtent FL 1 (0024,0012) Visual Field Shape VisualFieldShape CS 1 (0024,0016) Screening Test Mode Code Sequence ScreeningTestModeCodeSequence SQ 1 (0024,0018) Maximum Stimulus Luminance MaximumStimulusLuminance FL 1 (0024,0020) Background Luminance BackgroundLuminance FL 1 (0024,0021) Stimulus Color Code Sequence StimulusColorCodeSequence SQ 1 (0024,0024) Background Illumination Color Code Sequence BackgroundIlluminationColorCodeSequence SQ 1 (0024,0025) Stimulus Area StimulusArea FL 1 (0024,0028) Stimulus Presentation Time StimulusPresentationTime FL 1 (0024,0032) Fixation Sequence FixationSequence SQ 1 (0024,0033) Fixation Monitoring Code Sequence FixationMonitoringCodeSequence SQ 1 (0024,0034) Visual Field Catch Trial Sequence VisualFieldCatchTrialSequence SQ 1 (0024,0035) Fixation Checked Quantity FixationCheckedQuantity US 1 (0024,0036) Patient Not Properly Fixated Quantity PatientNotProperlyFixatedQuantity US 1 (0024,0037) Presented Visual Stimuli Data Flag PresentedVisualStimuliDataFlag CS 1 (0024,0038) Number of Visual Stimuli NumberOfVisualStimuli US 1 (0024,0039) Excessive Fixation Losses Data Flag ExcessiveFixationLossesDataFlag CS 1 (0024,0040) Excessive Fixation Losses ExcessiveFixationLosses CS 1 (0024,0042) Stimuli Retesting Quantity StimuliRetestingQuantity US 1 (0024,0044) Comments on Patient's Performance of Visual Field CommentsOnPatientPerformanceOfVisualField LT 1 (0024,0045) False Negatives Estimate Flag FalseNegativesEstimateFlag CS 1 (0024,0046) False Negatives Estimate FalseNegativesEstimate FL 1 (0024,0048) Negative Catch Trials Quantity NegativeCatchTrialsQuantity US 1 (0024,0050) False Negatives Quantity FalseNegativesQuantity US 1 (0024,0051) Excessive False Negatives Data Flag ExcessiveFalseNegativesDataFlag CS 1 (0024,0052) Excessive False Negatives ExcessiveFalseNegatives CS 1 (0024,0053) False Positives Estimate Flag FalsePositivesEstimateFlag CS 1 (0024,0054) False Positives Estimate FalsePositivesEstimate FL 1 (0024,0055) Catch Trials Data Flag CatchTrialsDataFlag CS 1 (0024,0056) Positive Catch Trials Quantity PositiveCatchTrialsQuantity US 1 (0024,0057) Test Point Normals Data Flag TestPointNormalsDataFlag CS 1 (0024,0058) Test Point Normals Sequence TestPointNormalsSequence SQ 1 (0024,0059) Global Deviation Probability Normals Flag GlobalDeviationProbabilityNormalsFlag CS 1 (0024,0060) False Positives Quantity FalsePositivesQuantity US 1 (0024,0061) Excessive False Positives Data Flag ExcessiveFalsePositivesDataFlag CS 1 (0024,0062) Excessive False Positives ExcessiveFalsePositives CS 1 (0024,0063) Visual Field Test Normals Flag VisualFieldTestNormalsFlag CS 1 (0024,0064) Results Normals Sequence ResultsNormalsSequence SQ 1 (0024,0065) Age Corrected Sensitivity Deviation Algorithm Sequence AgeCorrectedSensitivityDeviationAlgorithmSequence SQ 1 (0024,0066) Global Deviation From Normal GlobalDeviationFromNormal FL 1 (0024,0067) Generalized Defect Sensitivity Deviation Algorithm Sequence GeneralizedDefectSensitivityDeviationAlgorithmSequence SQ 1 (0024,0068) Localized Deviation From Normal LocalizedDeviationFromNormal FL 1 (0024,0069) Patient Reliability Indicator PatientReliabilityIndicator LO 1 (0024,0070) Visual Field Mean Sensitivity VisualFieldMeanSensitivity FL 1 (0024,0071) Global Deviation Probability GlobalDeviationProbability FL 1 (0024,0072) Local Deviation Probability Normals Flag LocalDeviationProbabilityNormalsFlag CS 1 (0024,0073) Localized Deviation Probability LocalizedDeviationProbability FL 1 (0024,0074) Short Term Fluctuation Calculated ShortTermFluctuationCalculated CS 1 (0024,0075) Short Term Fluctuation ShortTermFluctuation FL 1 (0024,0076) Short Term Fluctuation Probability Calculated ShortTermFluctuationProbabilityCalculated CS 1 (0024,0077) Short Term Fluctuation Probability ShortTermFluctuationProbability FL 1 (0024,0078) Corrected Localized Deviation From Normal Calculated CorrectedLocalizedDeviationFromNormalCalculated CS 1 (0024,0079) Corrected Localized Deviation From Normal CorrectedLocalizedDeviationFromNormal FL 1 (0024,0080) Corrected Localized Deviation From Normal Probability Calculated CorrectedLocalizedDeviationFromNormalProbabilityCalculated CS 1 (0024,0081) Corrected Localized Deviation From Normal Probability CorrectedLocalizedDeviationFromNormalProbability FL 1 (0024,0083) Global Deviation Probability Sequence GlobalDeviationProbabilitySequence SQ 1 (0024,0085) Localized Deviation Probability Sequence LocalizedDeviationProbabilitySequence SQ 1 (0024,0086) Foveal Sensitivity Measured FovealSensitivityMeasured CS 1 (0024,0087) Foveal Sensitivity FovealSensitivity FL 1 (0024,0088) Visual Field Test Duration VisualFieldTestDuration FL 1 (0024,0089) Visual Field Test Point Sequence VisualFieldTestPointSequence SQ 1 (0024,0090) Visual Field Test Point X-Coordinate VisualFieldTestPointXCoordinate FL 1 (0024,0091) Visual Field Test Point Y-Coordinate VisualFieldTestPointYCoordinate FL 1 (0024,0092) Age Corrected Sensitivity Deviation Value AgeCorrectedSensitivityDeviationValue FL 1 (0024,0093) Stimulus Results StimulusResults CS 1 (0024,0094) Sensitivity Value SensitivityValue FL 1 (0024,0095) Retest Stimulus Seen RetestStimulusSeen CS 1 (0024,0096) Retest Sensitivity Value RetestSensitivityValue FL 1 (0024,0097) Visual Field Test Point Normals Sequence VisualFieldTestPointNormalsSequence SQ 1 (0024,0098) Quantified Defect QuantifiedDefect FL 1 (0024,0100) Age Corrected Sensitivity Deviation Probability Value AgeCorrectedSensitivityDeviationProbabilityValue FL 1 (0024,0102) Generalized Defect Corrected Sensitivity Deviation Flag GeneralizedDefectCorrectedSensitivityDeviationFlag CS 1 (0024,0103) Generalized Defect Corrected Sensitivity Deviation Value GeneralizedDefectCorrectedSensitivityDeviationValue FL 1 (0024,0104) Generalized Defect Corrected Sensitivity Deviation Probability Value GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue FL 1 (0024,0105) Minimum Sensitivity Value MinimumSensitivityValue FL 1 (0024,0106) Blind Spot Localized BlindSpotLocalized CS 1 (0024,0107) Blind Spot X-Coordinate BlindSpotXCoordinate FL 1 (0024,0108) Blind Spot Y-Coordinate BlindSpotYCoordinate FL 1 (0024,0110) Visual Acuity Measurement Sequence VisualAcuityMeasurementSequence SQ 1 (0024,0112) Refractive Parameters Used on Patient Sequence RefractiveParametersUsedOnPatientSequence SQ 1 (0024,0113) Measurement Laterality MeasurementLaterality CS 1 (0024,0114) Ophthalmic Patient Clinical Information Left Eye Sequence OphthalmicPatientClinicalInformationLeftEyeSequence SQ 1 (0024,0115) Ophthalmic Patient Clinical Information Right Eye Sequence OphthalmicPatientClinicalInformationRightEyeSequence SQ 1 (0024,0117) Foveal Point Normative Data Flag FovealPointNormativeDataFlag CS 1 (0024,0118) Foveal Point Probability Value FovealPointProbabilityValue FL 1 (0024,0120) Screening Baseline Measured ScreeningBaselineMeasured CS 1 (0024,0122) Screening Baseline Measured Sequence ScreeningBaselineMeasuredSequence SQ 1 (0024,0124) Screening Baseline Type ScreeningBaselineType CS 1 (0024,0126) Screening Baseline Value ScreeningBaselineValue FL 1 (0024,0202) Algorithm Source AlgorithmSource LO 1 (0024,0306) Data Set Name DataSetName LO 1 (0024,0307) Data Set Version DataSetVersion LO 1 (0024,0308) Data Set Source DataSetSource LO 1 (0024,0309) Data Set Description DataSetDescription LO 1 (0024,0317) Visual Field Test Reliability Global Index Sequence VisualFieldTestReliabilityGlobalIndexSequence SQ 1 (0024,0320) Visual Field Global Results Index Sequence VisualFieldGlobalResultsIndexSequence SQ 1 (0024,0325) Data Observation Sequence DataObservationSequence SQ 1 (0024,0338) Index Normals Flag IndexNormalsFlag CS 1 (0024,0341) Index Probability IndexProbability FL 1 (0024,0344) Index Probability Sequence IndexProbabilitySequence SQ 1 (0028,0002) Samples per Pixel SamplesPerPixel US 1 (0028,0003) Samples per Pixel Used SamplesPerPixelUsed US 1 (0028,0004) Photometric Interpretation PhotometricInterpretation CS 1 (0028,0005) Image Dimensions ImageDimensions US 1 RET (0028,0006) Planar Configuration PlanarConfiguration US 1 (0028,0008) Number of Frames NumberOfFrames IS 1 (0028,0009) Frame Increment Pointer FrameIncrementPointer AT 1-n (0028,000A) Frame Dimension Pointer FrameDimensionPointer AT 1-n (0028,0010) Rows Rows US 1 (0028,0011) Columns Columns US 1 (0028,0012) Planes Planes US 1 RET (0028,0014) Ultrasound Color Data Present UltrasoundColorDataPresent US 1 (0028,0020) RET (0028,0030) Pixel Spacing PixelSpacing DS 2 (0028,0031) Zoom Factor ZoomFactor DS 2 (0028,0032) Zoom Center ZoomCenter DS 2 (0028,0034) Pixel Aspect Ratio PixelAspectRatio IS 2 (0028,0040) Image Format ImageFormat CS 1 RET (0028,0050) Manipulated Image ManipulatedImage LO 1-n RET (0028,0051) Corrected Image CorrectedImage CS 1-n (0028,005F) Compression Recognition Code CompressionRecognitionCode LO 1 RET (0028,0060) Compression Code CompressionCode CS 1 RET (0028,0061) Compression Originator CompressionOriginator SH 1 RET (0028,0062) Compression Label CompressionLabel LO 1 RET (0028,0063) Compression Description CompressionDescription SH 1 RET (0028,0065) Compression Sequence CompressionSequence CS 1-n RET (0028,0066) Compression Step Pointers CompressionStepPointers AT 1-n RET (0028,0068) Repeat Interval RepeatInterval US 1 RET (0028,0069) Bits Grouped BitsGrouped US 1 RET (0028,0070) Perimeter Table PerimeterTable US 1-n RET (0028,0071) Perimeter Value PerimeterValue US or SS 1 RET (0028,0080) Predictor Rows PredictorRows US 1 RET (0028,0081) Predictor Columns PredictorColumns US 1 RET (0028,0082) Predictor Constants PredictorConstants US 1-n RET (0028,0090) Blocked Pixels BlockedPixels CS 1 RET (0028,0091) Block Rows BlockRows US 1 RET (0028,0092) Block Columns BlockColumns US 1 RET (0028,0093) Row Overlap RowOverlap US 1 RET (0028,0094) Column Overlap ColumnOverlap US 1 RET (0028,0100) Bits Allocated BitsAllocated US 1 (0028,0101) Bits Stored BitsStored US 1 (0028,0102) High Bit HighBit US 1 (0028,0103) Pixel Representation PixelRepresentation US 1 (0028,0104) Smallest Valid Pixel Value SmallestValidPixelValue US or SS 1 RET (0028,0105) Largest Valid Pixel Value LargestValidPixelValue US or SS 1 RET (0028,0106) Smallest Image Pixel Value SmallestImagePixelValue US or SS 1 (0028,0107) Largest Image Pixel Value LargestImagePixelValue US or SS 1 (0028,0108) Smallest Pixel Value in Series SmallestPixelValueInSeries US or SS 1 (0028,0109) Largest Pixel Value in Series LargestPixelValueInSeries US or SS 1 (0028,0110) Smallest Image Pixel Value in Plane SmallestImagePixelValueInPlane US or SS 1 RET (0028,0111) Largest Image Pixel Value in Plane LargestImagePixelValueInPlane US or SS 1 RET (0028,0120) Pixel Padding Value PixelPaddingValue US or SS 1 (0028,0121) Pixel Padding Range Limit PixelPaddingRangeLimit US or SS 1 (0028,0122) Float Pixel Padding Value FloatPixelPaddingValue FL 1 (0028,0123) Double Float Pixel Padding Value DoubleFloatPixelPaddingValue FD 1 (0028,0124) Float Pixel Padding Range Limit FloatPixelPaddingRangeLimit FL 1 (0028,0125) Double Float Pixel Padding Range Limit DoubleFloatPixelPaddingRangeLimit FD 1 (0028,0200) Image Location ImageLocation US 1 RET (0028,0300) Quality Control Image QualityControlImage CS 1 (0028,0301) Burned In Annotation BurnedInAnnotation CS 1 (0028,0302) Recognizable Visual Features RecognizableVisualFeatures CS 1 (0028,0303) Longitudinal Temporal Information Modified LongitudinalTemporalInformationModified CS 1 (0028,0304) Referenced Color Palette Instance UID ReferencedColorPaletteInstanceUID UI 1 (0028,0400) Transform Label TransformLabel LO 1 RET (0028,0401) Transform Version Number TransformVersionNumber LO 1 RET (0028,0402) Number of Transform Steps NumberOfTransformSteps US 1 RET (0028,0403) Sequence of Compressed Data SequenceOfCompressedData LO 1-n RET (0028,0404) Details of Coefficients DetailsOfCoefficients AT 1-n RET (0028,04x0) Rows For Nth Order Coefficients RowsForNthOrderCoefficients US 1 RET (0028,04x1) Columns For Nth Order Coefficients ColumnsForNthOrderCoefficients US 1 RET (0028,04x2) Coefficient Coding CoefficientCoding LO 1-n RET (0028,04x3) Coefficient Coding Pointers CoefficientCodingPointers AT 1-n RET (0028,0700) DCT Label DCTLabel LO 1 RET (0028,0701) Data Block Description DataBlockDescription CS 1-n RET (0028,0702) Data Block DataBlock AT 1-n RET (0028,0710) Normalization Factor Format NormalizationFactorFormat US 1 RET (0028,0720) Zonal Map Number Format ZonalMapNumberFormat US 1 RET (0028,0721) Zonal Map Location ZonalMapLocation AT 1-n RET (0028,0722) Zonal Map Format ZonalMapFormat US 1 RET (0028,0730) Adaptive Map Format AdaptiveMapFormat US 1 RET (0028,0740) Code Number Format CodeNumberFormat US 1 RET (0028,08x0) Code Label CodeLabel CS 1-n RET (0028,08x2) Number of Tables NumberOfTables US 1 RET (0028,08x3) Code Table Location CodeTableLocation AT 1-n RET (0028,08x4) Bits For Code Word BitsForCodeWord US 1 RET (0028,08x8) Image Data Location ImageDataLocation AT 1-n RET (0028,0A02) Pixel Spacing Calibration Type PixelSpacingCalibrationType CS 1 (0028,0A04) Pixel Spacing Calibration Description PixelSpacingCalibrationDescription LO 1 (0028,1040) Pixel Intensity Relationship PixelIntensityRelationship CS 1 (0028,1041) Pixel Intensity Relationship Sign PixelIntensityRelationshipSign SS 1 (0028,1050) Window Center WindowCenter DS 1-n (0028,1051) Window Width WindowWidth DS 1-n (0028,1052) Rescale Intercept RescaleIntercept DS 1 (0028,1053) Rescale Slope RescaleSlope DS 1 (0028,1054) Rescale Type RescaleType LO 1 (0028,1055) Window Center & Width Explanation WindowCenterWidthExplanation LO 1-n (0028,1056) VOI LUT Function VOILUTFunction CS 1 (0028,1080) Gray Scale GrayScale CS 1 RET (0028,1090) Recommended Viewing Mode RecommendedViewingMode CS 1 (0028,1100) Gray Lookup Table Descriptor GrayLookupTableDescriptor US or SS 3 RET (0028,1101) Red Palette Color Lookup Table Descriptor RedPaletteColorLookupTableDescriptor US or SS 3 (0028,1102) Green Palette Color Lookup Table Descriptor GreenPaletteColorLookupTableDescriptor US or SS 3 (0028,1103) Blue Palette Color Lookup Table Descriptor BluePaletteColorLookupTableDescriptor US or SS 3 (0028,1104) Alpha Palette Color Lookup Table Descriptor AlphaPaletteColorLookupTableDescriptor US 3 (0028,1111) Large Red Palette Color Lookup Table Descriptor LargeRedPaletteColorLookupTableDescriptor US or SS 4 RET (0028,1112) Large Green Palette Color Lookup Table Descriptor LargeGreenPaletteColorLookupTableDescriptor US or SS 4 RET (0028,1113) Large Blue Palette Color Lookup Table Descriptor LargeBluePaletteColorLookupTableDescriptor US or SS 4 RET (0028,1199) Palette Color Lookup Table UID PaletteColorLookupTableUID UI 1 (0028,1200) Gray Lookup Table Data GrayLookupTableData US or SS or OW 1-n or 1 RET (0028,1201) Red Palette Color Lookup Table Data RedPaletteColorLookupTableData OW 1 (0028,1202) Green Palette Color Lookup Table Data GreenPaletteColorLookupTableData OW 1 (0028,1203) Blue Palette Color Lookup Table Data BluePaletteColorLookupTableData OW 1 (0028,1204) Alpha Palette Color Lookup Table Data AlphaPaletteColorLookupTableData OW 1 (0028,1211) Large Red Palette Color Lookup Table Data LargeRedPaletteColorLookupTableData OW 1 RET (0028,1212) Large Green Palette Color Lookup Table Data LargeGreenPaletteColorLookupTableData OW 1 RET (0028,1213) Large Blue Palette Color Lookup Table Data LargeBluePaletteColorLookupTableData OW 1 RET (0028,1214) Large Palette Color Lookup Table UID LargePaletteColorLookupTableUID UI 1 RET (0028,1221) Segmented Red Palette Color Lookup Table Data SegmentedRedPaletteColorLookupTableData OW 1 (0028,1222) Segmented Green Palette Color Lookup Table Data SegmentedGreenPaletteColorLookupTableData OW 1 (0028,1223) Segmented Blue Palette Color Lookup Table Data SegmentedBluePaletteColorLookupTableData OW 1 (0028,1224) Segmented Alpha Palette Color Lookup Table Data SegmentedAlphaPaletteColorLookupTableData OW 1 (0028,1230) Stored Value Color Range Sequence StoredValueColorRangeSequence SQ 1 (0028,1231) Minimum Stored Value Mapped MinimumStoredValueMapped FD 1 (0028,1232) Maximum Stored Value Mapped MaximumStoredValueMapped FD 1 (0028,1300) Breast Implant Present BreastImplantPresent CS 1 (0028,1350) Partial View PartialView CS 1 (0028,1351) Partial View Description PartialViewDescription ST 1 (0028,1352) Partial View Code Sequence PartialViewCodeSequence SQ 1 (0028,135A) Spatial Locations Preserved SpatialLocationsPreserved CS 1 (0028,1401) Data Frame Assignment Sequence DataFrameAssignmentSequence SQ 1 (0028,1402) Data Path Assignment DataPathAssignment CS 1 (0028,1403) Bits Mapped to Color Lookup Table BitsMappedToColorLookupTable US 1 (0028,1404) Blending LUT 1 Sequence BlendingLUT1Sequence SQ 1 (0028,1405) Blending LUT 1 Transfer Function BlendingLUT1TransferFunction CS 1 (0028,1406) Blending Weight Constant BlendingWeightConstant FD 1 (0028,1407) Blending Lookup Table Descriptor BlendingLookupTableDescriptor US 3 (0028,1408) Blending Lookup Table Data BlendingLookupTableData OW 1 (0028,140B) Enhanced Palette Color Lookup Table Sequence EnhancedPaletteColorLookupTableSequence SQ 1 (0028,140C) Blending LUT 2 Sequence BlendingLUT2Sequence SQ 1 (0028,140D) Blending LUT 2 Transfer Function BlendingLUT2TransferFunction CS 1 (0028,140E) Data Path ID DataPathID CS 1 (0028,140F) RGB LUT Transfer Function RGBLUTTransferFunction CS 1 (0028,1410) Alpha LUT Transfer Function AlphaLUTTransferFunction CS 1 (0028,2000) ICC Profile ICCProfile OB 1 (0028,2002) Color Space ColorSpace CS 1 (0028,2110) Lossy Image Compression LossyImageCompression CS 1 (0028,2112) Lossy Image Compression Ratio LossyImageCompressionRatio DS 1-n (0028,2114) Lossy Image Compression Method LossyImageCompressionMethod CS 1-n (0028,3000) Modality LUT Sequence ModalityLUTSequence SQ 1 (0028,3002) LUT Descriptor LUTDescriptor US or SS 3 (0028,3003) LUT Explanation LUTExplanation LO 1 (0028,3004) Modality LUT Type ModalityLUTType LO 1 (0028,3006) LUT Data LUTData US or OW 1-n or 1 (0028,3010) VOI LUT Sequence VOILUTSequence SQ 1 (0028,3110) Softcopy VOI LUT Sequence SoftcopyVOILUTSequence SQ 1 (0028,4000) Image Presentation Comments ImagePresentationComments LT 1 RET (0028,5000) Bi-Plane Acquisition Sequence BiPlaneAcquisitionSequence SQ 1 RET (0028,6010) Representative Frame Number RepresentativeFrameNumber US 1 (0028,6020) Frame Numbers of Interest (FOI) FrameNumbersOfInterest US 1-n (0028,6022) Frame of Interest Description FrameOfInterestDescription LO 1-n (0028,6023) Frame of Interest Type FrameOfInterestType CS 1-n (0028,6030) Mask Pointer(s) MaskPointers US 1-n RET (0028,6040) R Wave Pointer RWavePointer US 1-n (0028,6100) Mask Subtraction Sequence MaskSubtractionSequence SQ 1 (0028,6101) Mask Operation MaskOperation CS 1 (0028,6102) Applicable Frame Range ApplicableFrameRange US 2-2n (0028,6110) Mask Frame Numbers MaskFrameNumbers US 1-n (0028,6112) Contrast Frame Averaging ContrastFrameAveraging US 1 (0028,6114) Mask Sub-pixel Shift MaskSubPixelShift FL 2 (0028,6120) TID Offset TIDOffset SS 1 (0028,6190) Mask Operation Explanation MaskOperationExplanation ST 1 (0028,7000) Equipment Administrator Sequence EquipmentAdministratorSequence SQ 1 (0028,7001) Number of Display Subsystems NumberOfDisplaySubsystems US 1 (0028,7002) Current Configuration ID CurrentConfigurationID US 1 (0028,7003) Display Subsystem ID DisplaySubsystemID US 1 (0028,7004) Display Subsystem Name DisplaySubsystemName SH 1 (0028,7005) Display Subsystem Description DisplaySubsystemDescription LO 1 (0028,7006) System Status SystemStatus CS 1 (0028,7007) System Status Comment SystemStatusComment LO 1 (0028,7008) Target Luminance Characteristics Sequence TargetLuminanceCharacteristicsSequence SQ 1 (0028,7009) Luminance Characteristics ID LuminanceCharacteristicsID US 1 (0028,700A) Display Subsystem Configuration Sequence DisplaySubsystemConfigurationSequence SQ 1 (0028,700B) Configuration ID ConfigurationID US 1 (0028,700C) Configuration Name ConfigurationName SH 1 (0028,700D) Configuration Description ConfigurationDescription LO 1 (0028,700E) Referenced Target Luminance Characteristics ID ReferencedTargetLuminanceCharacteristicsID US 1 (0028,700F) QA Results Sequence QAResultsSequence SQ 1 (0028,7010) Display Subsystem QA Results Sequence DisplaySubsystemQAResultsSequence SQ 1 (0028,7011) Configuration QA Results Sequence ConfigurationQAResultsSequence SQ 1 (0028,7012) Measurement Equipment Sequence MeasurementEquipmentSequence SQ 1 (0028,7013) Measurement Functions MeasurementFunctions CS 1-n (0028,7014) Measurement Equipment Type MeasurementEquipmentType CS 1 (0028,7015) Visual Evaluation Result Sequence VisualEvaluationResultSequence SQ 1 (0028,7016) Display Calibration Result Sequence DisplayCalibrationResultSequence SQ 1 (0028,7017) DDL Value DDLValue US 1 (0028,7018) CIExy White Point CIExyWhitePoint FL 2 (0028,7019) Display Function Type DisplayFunctionType CS 1 (0028,701A) Gamma Value GammaValue FL 1 (0028,701B) Number of Luminance Points NumberOfLuminancePoints US 1 (0028,701C) Luminance Response Sequence LuminanceResponseSequence SQ 1 (0028,701D) Target Minimum Luminance TargetMinimumLuminance FL 1 (0028,701E) Target Maximum Luminance TargetMaximumLuminance FL 1 (0028,701F) Luminance Value LuminanceValue FL 1 (0028,7020) Luminance Response Description LuminanceResponseDescription LO 1 (0028,7021) White Point Flag WhitePointFlag CS 1 (0028,7022) Display Device Type Code Sequence DisplayDeviceTypeCodeSequence SQ 1 (0028,7023) Display Subsystem Sequence DisplaySubsystemSequence SQ 1 (0028,7024) Luminance Result Sequence LuminanceResultSequence SQ 1 (0028,7025) Ambient Light Value Source AmbientLightValueSource CS 1 (0028,7026) Measured Characteristics MeasuredCharacteristics CS 1-n (0028,7027) Luminance Uniformity Result Sequence LuminanceUniformityResultSequence SQ 1 (0028,7028) Visual Evaluation Test Sequence VisualEvaluationTestSequence SQ 1 (0028,7029) Test Result TestResult CS 1 (0028,702A) Test Result Comment TestResultComment LO 1 (0028,702B) Test Image Validation TestImageValidation CS 1 (0028,702C) Test Pattern Code Sequence TestPatternCodeSequence SQ 1 (0028,702D) Measurement Pattern Code Sequence MeasurementPatternCodeSequence SQ 1 (0028,702E) Visual Evaluation Method Code Sequence VisualEvaluationMethodCodeSequence SQ 1 (0028,7FE0) Pixel Data Provider URL PixelDataProviderURL UR 1 (0028,9001) Data Point Rows DataPointRows UL 1 (0028,9002) Data Point Columns DataPointColumns UL 1 (0028,9003) Signal Domain Columns SignalDomainColumns CS 1 (0028,9099) Largest Monochrome Pixel Value LargestMonochromePixelValue US 1 RET (0028,9108) Data Representation DataRepresentation CS 1 (0028,9110) Pixel Measures Sequence PixelMeasuresSequence SQ 1 (0028,9132) Frame VOI LUT Sequence FrameVOILUTSequence SQ 1 (0028,9145) Pixel Value Transformation Sequence PixelValueTransformationSequence SQ 1 (0028,9235) Signal Domain Rows SignalDomainRows CS 1 (0028,9411) Display Filter Percentage DisplayFilterPercentage FL 1 (0028,9415) Frame Pixel Shift Sequence FramePixelShiftSequence SQ 1 (0028,9416) Subtraction Item ID SubtractionItemID US 1 (0028,9422) Pixel Intensity Relationship LUT Sequence PixelIntensityRelationshipLUTSequence SQ 1 (0028,9443) Frame Pixel Data Properties Sequence FramePixelDataPropertiesSequence SQ 1 (0028,9444) Geometrical Properties GeometricalProperties CS 1 (0028,9445) Geometric Maximum Distortion GeometricMaximumDistortion FL 1 (0028,9446) Image Processing Applied ImageProcessingApplied CS 1-n (0028,9454) Mask Selection Mode MaskSelectionMode CS 1 (0028,9474) LUT Function LUTFunction CS 1 (0028,9478) Mask Visibility Percentage MaskVisibilityPercentage FL 1 (0028,9501) Pixel Shift Sequence PixelShiftSequence SQ 1 (0028,9502) Region Pixel Shift Sequence RegionPixelShiftSequence SQ 1 (0028,9503) Vertices of the Region VerticesOfTheRegion SS 2-2n (0028,9505) Multi-frame Presentation Sequence MultiFramePresentationSequence SQ 1 (0028,9506) Pixel Shift Frame Range PixelShiftFrameRange US 2-2n (0028,9507) LUT Frame Range LUTFrameRange US 2-2n (0028,9520) Image to Equipment Mapping Matrix ImageToEquipmentMappingMatrix DS 16 (0028,9537) Equipment Coordinate System Identification EquipmentCoordinateSystemIdentification CS 1 (0032,000A) Study Status ID StudyStatusID CS 1 RET (0032,000C) Study Priority ID StudyPriorityID CS 1 RET (0032,0012) Study ID Issuer StudyIDIssuer LO 1 RET (0032,0032) Study Verified Date StudyVerifiedDate DA 1 RET (0032,0033) Study Verified Time StudyVerifiedTime TM 1 RET (0032,0034) Study Read Date StudyReadDate DA 1 RET (0032,0035) Study Read Time StudyReadTime TM 1 RET (0032,1000) Scheduled Study Start Date ScheduledStudyStartDate DA 1 RET (0032,1001) Scheduled Study Start Time ScheduledStudyStartTime TM 1 RET (0032,1010) Scheduled Study Stop Date ScheduledStudyStopDate DA 1 RET (0032,1011) Scheduled Study Stop Time ScheduledStudyStopTime TM 1 RET (0032,1020) Scheduled Study Location ScheduledStudyLocation LO 1 RET (0032,1021) Scheduled Study Location AE Title ScheduledStudyLocationAETitle AE 1-n RET (0032,1030) Reason for Study ReasonForStudy LO 1 RET (0032,1031) Requesting Physician Identification Sequence RequestingPhysicianIdentificationSequence SQ 1 (0032,1032) Requesting Physician RequestingPhysician PN 1 (0032,1033) Requesting Service RequestingService LO 1 (0032,1034) Requesting Service Code Sequence RequestingServiceCodeSequence SQ 1 (0032,1040) Study Arrival Date StudyArrivalDate DA 1 RET (0032,1041) Study Arrival Time StudyArrivalTime TM 1 RET (0032,1050) Study Completion Date StudyCompletionDate DA 1 RET (0032,1051) Study Completion Time StudyCompletionTime TM 1 RET (0032,1055) Study Component Status ID StudyComponentStatusID CS 1 RET (0032,1060) Requested Procedure Description RequestedProcedureDescription LO 1 (0032,1064) Requested Procedure Code Sequence RequestedProcedureCodeSequence SQ 1 (0032,1066) Reason for Visit ReasonForVisit UT 1 (0032,1067) Reason for Visit Code Sequence ReasonForVisitCodeSequence SQ 1 (0032,1070) Requested Contrast Agent RequestedContrastAgent LO 1 (0032,4000) Study Comments StudyComments LT 1 RET (0034,0001) Flow Identifier Sequence FlowIdentifierSequence SQ 1 (0034,0002) Flow Identifier FlowIdentifier OB 1 (0034,0003) Flow Transfer Syntax UID FlowTransferSyntaxUID UI 1 (0034,0004) Flow RTP Sampling Rate FlowRTPSamplingRate UL 1 (0034,0005) Source Identifier SourceIdentifier OB 1 (0034,0007) Frame Origin Timestamp FrameOriginTimestamp OB 1 (0034,0008) Includes Imaging Subject IncludesImagingSubject CS 1 (0034,0009) Frame Usefulness Group Sequence FrameUsefulnessGroupSequence SQ 1 (0034,000A) Real-Time Bulk Data Flow Sequence RealTimeBulkDataFlowSequence SQ 1 (0034,000B) Camera Position Group Sequence CameraPositionGroupSequence SQ 1 (0034,000C) Includes Information IncludesInformation CS 1 (0034,000D) Time of Frame Group Sequence TimeOfFrameGroupSequence SQ 1 (0038,0004) Referenced Patient Alias Sequence ReferencedPatientAliasSequence SQ 1 (0038,0008) Visit Status ID VisitStatusID CS 1 (0038,0010) Admission ID AdmissionID LO 1 (0038,0011) Issuer of Admission ID IssuerOfAdmissionID LO 1 RET (0038,0014) Issuer of Admission ID Sequence IssuerOfAdmissionIDSequence SQ 1 (0038,0016) Route of Admissions RouteOfAdmissions LO 1 (0038,001A) Scheduled Admission Date ScheduledAdmissionDate DA 1 RET (0038,001B) Scheduled Admission Time ScheduledAdmissionTime TM 1 RET (0038,001C) Scheduled Discharge Date ScheduledDischargeDate DA 1 RET (0038,001D) Scheduled Discharge Time ScheduledDischargeTime TM 1 RET (0038,001E) Scheduled Patient Institution Residence ScheduledPatientInstitutionResidence LO 1 RET (0038,0020) Admitting Date AdmittingDate DA 1 (0038,0021) Admitting Time AdmittingTime TM 1 (0038,0030) Discharge Date DischargeDate DA 1 RET (0038,0032) Discharge Time DischargeTime TM 1 RET (0038,0040) Discharge Diagnosis Description DischargeDiagnosisDescription LO 1 RET (0038,0044) Discharge Diagnosis Code Sequence DischargeDiagnosisCodeSequence SQ 1 RET (0038,0050) Special Needs SpecialNeeds LO 1 (0038,0060) Service Episode ID ServiceEpisodeID LO 1 (0038,0061) Issuer of Service Episode ID IssuerOfServiceEpisodeID LO 1 RET (0038,0062) Service Episode Description ServiceEpisodeDescription LO 1 (0038,0064) Issuer of Service Episode ID Sequence IssuerOfServiceEpisodeIDSequence SQ 1 (0038,0100) Pertinent Documents Sequence PertinentDocumentsSequence SQ 1 (0038,0101) Pertinent Resources Sequence PertinentResourcesSequence SQ 1 (0038,0102) Resource Description ResourceDescription LO 1 (0038,0300) Current Patient Location CurrentPatientLocation LO 1 (0038,0400) Patient's Institution Residence PatientInstitutionResidence LO 1 (0038,0500) Patient State PatientState LO 1 (0038,0502) Patient Clinical Trial Participation Sequence PatientClinicalTrialParticipationSequence SQ 1 (0038,4000) Visit Comments VisitComments LT 1 (003A,0004) Waveform Originality WaveformOriginality CS 1 (003A,0005) Number of Waveform Channels NumberOfWaveformChannels US 1 (003A,0010) Number of Waveform Samples NumberOfWaveformSamples UL 1 (003A,001A) Sampling Frequency SamplingFrequency DS 1 (003A,0020) Multiplex Group Label MultiplexGroupLabel SH 1 (003A,0200) Channel Definition Sequence ChannelDefinitionSequence SQ 1 (003A,0202) Waveform Channel Number WaveformChannelNumber IS 1 (003A,0203) Channel Label ChannelLabel SH 1 (003A,0205) Channel Status ChannelStatus CS 1-n (003A,0208) Channel Source Sequence ChannelSourceSequence SQ 1 (003A,0209) Channel Source Modifiers Sequence ChannelSourceModifiersSequence SQ 1 (003A,020A) Source Waveform Sequence SourceWaveformSequence SQ 1 (003A,020C) Channel Derivation Description ChannelDerivationDescription LO 1 (003A,0210) Channel Sensitivity ChannelSensitivity DS 1 (003A,0211) Channel Sensitivity Units Sequence ChannelSensitivityUnitsSequence SQ 1 (003A,0212) Channel Sensitivity Correction Factor ChannelSensitivityCorrectionFactor DS 1 (003A,0213) Channel Baseline ChannelBaseline DS 1 (003A,0214) Channel Time Skew ChannelTimeSkew DS 1 (003A,0215) Channel Sample Skew ChannelSampleSkew DS 1 (003A,0218) Channel Offset ChannelOffset DS 1 (003A,021A) Waveform Bits Stored WaveformBitsStored US 1 (003A,0220) Filter Low Frequency FilterLowFrequency DS 1 (003A,0221) Filter High Frequency FilterHighFrequency DS 1 (003A,0222) Notch Filter Frequency NotchFilterFrequency DS 1 (003A,0223) Notch Filter Bandwidth NotchFilterBandwidth DS 1 (003A,0230) Waveform Data Display Scale WaveformDataDisplayScale FL 1 (003A,0231) Waveform Display Background CIELab Value WaveformDisplayBackgroundCIELabValue US 3 (003A,0240) Waveform Presentation Group Sequence WaveformPresentationGroupSequence SQ 1 (003A,0241) Presentation Group Number PresentationGroupNumber US 1 (003A,0242) Channel Display Sequence ChannelDisplaySequence SQ 1 (003A,0244) Channel Recommended Display CIELab Value ChannelRecommendedDisplayCIELabValue US 3 (003A,0245) Channel Position ChannelPosition FL 1 (003A,0246) Display Shading Flag DisplayShadingFlag CS 1 (003A,0247) Fractional Channel Display Scale FractionalChannelDisplayScale FL 1 (003A,0248) Absolute Channel Display Scale AbsoluteChannelDisplayScale FL 1 (003A,0300) Multiplexed Audio Channels Description Code Sequence MultiplexedAudioChannelsDescriptionCodeSequence SQ 1 (003A,0301) Channel Identification Code ChannelIdentificationCode IS 1 (003A,0302) Channel Mode ChannelMode CS 1 (0040,0001) Scheduled Station AE Title ScheduledStationAETitle AE 1-n (0040,0002) Scheduled Procedure Step Start Date ScheduledProcedureStepStartDate DA 1 (0040,0003) Scheduled Procedure Step Start Time ScheduledProcedureStepStartTime TM 1 (0040,0004) Scheduled Procedure Step End Date ScheduledProcedureStepEndDate DA 1 (0040,0005) Scheduled Procedure Step End Time ScheduledProcedureStepEndTime TM 1 (0040,0006) Scheduled Performing Physician's Name ScheduledPerformingPhysicianName PN 1 (0040,0007) Scheduled Procedure Step Description ScheduledProcedureStepDescription LO 1 (0040,0008) Scheduled Protocol Code Sequence ScheduledProtocolCodeSequence SQ 1 (0040,0009) Scheduled Procedure Step ID ScheduledProcedureStepID SH 1 (0040,000A) Stage Code Sequence StageCodeSequence SQ 1 (0040,000B) Scheduled Performing Physician Identification Sequence ScheduledPerformingPhysicianIdentificationSequence SQ 1 (0040,0010) Scheduled Station Name ScheduledStationName SH 1-n (0040,0011) Scheduled Procedure Step Location ScheduledProcedureStepLocation SH 1 (0040,0012) Pre-Medication PreMedication LO 1 (0040,0020) Scheduled Procedure Step Status ScheduledProcedureStepStatus CS 1 (0040,0026) Order Placer Identifier Sequence OrderPlacerIdentifierSequence SQ 1 (0040,0027) Order Filler Identifier Sequence OrderFillerIdentifierSequence SQ 1 (0040,0031) Local Namespace Entity ID LocalNamespaceEntityID UT 1 (0040,0032) Universal Entity ID UniversalEntityID UT 1 (0040,0033) Universal Entity ID Type UniversalEntityIDType CS 1 (0040,0035) Identifier Type Code IdentifierTypeCode CS 1 (0040,0036) Assigning Facility Sequence AssigningFacilitySequence SQ 1 (0040,0039) Assigning Jurisdiction Code Sequence AssigningJurisdictionCodeSequence SQ 1 (0040,003A) Assigning Agency or Department Code Sequence AssigningAgencyOrDepartmentCodeSequence SQ 1 (0040,0100) Scheduled Procedure Step Sequence ScheduledProcedureStepSequence SQ 1 (0040,0220) Referenced Non-Image Composite SOP Instance Sequence ReferencedNonImageCompositeSOPInstanceSequence SQ 1 (0040,0241) Performed Station AE Title PerformedStationAETitle AE 1 (0040,0242) Performed Station Name PerformedStationName SH 1 (0040,0243) Performed Location PerformedLocation SH 1 (0040,0244) Performed Procedure Step Start Date PerformedProcedureStepStartDate DA 1 (0040,0245) Performed Procedure Step Start Time PerformedProcedureStepStartTime TM 1 (0040,0250) Performed Procedure Step End Date PerformedProcedureStepEndDate DA 1 (0040,0251) Performed Procedure Step End Time PerformedProcedureStepEndTime TM 1 (0040,0252) Performed Procedure Step Status PerformedProcedureStepStatus CS 1 (0040,0253) Performed Procedure Step ID PerformedProcedureStepID SH 1 (0040,0254) Performed Procedure Step Description PerformedProcedureStepDescription LO 1 (0040,0255) Performed Procedure Type Description PerformedProcedureTypeDescription LO 1 (0040,0260) Performed Protocol Code Sequence PerformedProtocolCodeSequence SQ 1 (0040,0261) Performed Protocol Type PerformedProtocolType CS 1 (0040,0270) Scheduled Step Attributes Sequence ScheduledStepAttributesSequence SQ 1 (0040,0275) Request Attributes Sequence RequestAttributesSequence SQ 1 (0040,0280) Comments on the Performed Procedure Step CommentsOnThePerformedProcedureStep ST 1 (0040,0281) Performed Procedure Step Discontinuation Reason Code Sequence PerformedProcedureStepDiscontinuationReasonCodeSequence SQ 1 (0040,0293) Quantity Sequence QuantitySequence SQ 1 (0040,0294) Quantity Quantity DS 1 (0040,0295) Measuring Units Sequence MeasuringUnitsSequence SQ 1 (0040,0296) Billing Item Sequence BillingItemSequence SQ 1 (0040,0300) Total Time of Fluoroscopy TotalTimeOfFluoroscopy US 1 RET (0040,0301) Total Number of Exposures TotalNumberOfExposures US 1 RET (0040,0302) Entrance Dose EntranceDose US 1 (0040,0303) Exposed Area ExposedArea US 1-2 (0040,0306) Distance Source to Entrance DistanceSourceToEntrance DS 1 (0040,0307) Distance Source to Support DistanceSourceToSupport DS 1 RET (0040,030E) Exposure Dose Sequence ExposureDoseSequence SQ 1 RET (0040,0310) Comments on Radiation Dose CommentsOnRadiationDose ST 1 (0040,0312) X-Ray Output XRayOutput DS 1 (0040,0314) Half Value Layer HalfValueLayer DS 1 (0040,0316) Organ Dose OrganDose DS 1 (0040,0318) Organ Exposed OrganExposed CS 1 (0040,0320) Billing Procedure Step Sequence BillingProcedureStepSequence SQ 1 (0040,0321) Film Consumption Sequence FilmConsumptionSequence SQ 1 (0040,0324) Billing Supplies and Devices Sequence BillingSuppliesAndDevicesSequence SQ 1 (0040,0330) Referenced Procedure Step Sequence ReferencedProcedureStepSequence SQ 1 RET (0040,0340) Performed Series Sequence PerformedSeriesSequence SQ 1 (0040,0400) Comments on the Scheduled Procedure Step CommentsOnTheScheduledProcedureStep LT 1 (0040,0440) Protocol Context Sequence ProtocolContextSequence SQ 1 (0040,0441) Content Item Modifier Sequence ContentItemModifierSequence SQ 1 (0040,0500) Scheduled Specimen Sequence ScheduledSpecimenSequence SQ 1 (0040,050A) Specimen Accession Number SpecimenAccessionNumber LO 1 RET (0040,0512) Container Identifier ContainerIdentifier LO 1 (0040,0513) Issuer of the Container Identifier Sequence IssuerOfTheContainerIdentifierSequence SQ 1 (0040,0515) Alternate Container Identifier Sequence AlternateContainerIdentifierSequence SQ 1 (0040,0518) Container Type Code Sequence ContainerTypeCodeSequence SQ 1 (0040,051A) Container Description ContainerDescription LO 1 (0040,0520) Container Component Sequence ContainerComponentSequence SQ 1 (0040,0550) Specimen Sequence SpecimenSequence SQ 1 RET (0040,0551) Specimen Identifier SpecimenIdentifier LO 1 (0040,0552) Specimen Description Sequence (Trial) SpecimenDescriptionSequenceTrial SQ 1 RET (0040,0553) Specimen Description (Trial) SpecimenDescriptionTrial ST 1 RET (0040,0554) Specimen UID SpecimenUID UI 1 (0040,0555) Acquisition Context Sequence AcquisitionContextSequence SQ 1 (0040,0556) Acquisition Context Description AcquisitionContextDescription ST 1 (0040,059A) Specimen Type Code Sequence SpecimenTypeCodeSequence SQ 1 (0040,0560) Specimen Description Sequence SpecimenDescriptionSequence SQ 1 (0040,0562) Issuer of the Specimen Identifier Sequence IssuerOfTheSpecimenIdentifierSequence SQ 1 (0040,0600) Specimen Short Description SpecimenShortDescription LO 1 (0040,0602) Specimen Detailed Description SpecimenDetailedDescription UT 1 (0040,0610) Specimen Preparation Sequence SpecimenPreparationSequence SQ 1 (0040,0612) Specimen Preparation Step Content Item Sequence SpecimenPreparationStepContentItemSequence SQ 1 (0040,0620) Specimen Localization Content Item Sequence SpecimenLocalizationContentItemSequence SQ 1 (0040,06FA) Slide Identifier SlideIdentifier LO 1 RET (0040,0710) Whole Slide Microscopy Image Frame Type Sequence WholeSlideMicroscopyImageFrameTypeSequence SQ 1 (0040,071A) Image Center Point Coordinates Sequence ImageCenterPointCoordinatesSequence SQ 1 (0040,072A) X Offset in Slide Coordinate System XOffsetInSlideCoordinateSystem DS 1 (0040,073A) Y Offset in Slide Coordinate System YOffsetInSlideCoordinateSystem DS 1 (0040,074A) Z Offset in Slide Coordinate System ZOffsetInSlideCoordinateSystem DS 1 (0040,08D8) Pixel Spacing Sequence PixelSpacingSequence SQ 1 RET (0040,08DA) Coordinate System Axis Code Sequence CoordinateSystemAxisCodeSequence SQ 1 RET (0040,08EA) Measurement Units Code Sequence MeasurementUnitsCodeSequence SQ 1 (0040,09F8) Vital Stain Code Sequence (Trial) VitalStainCodeSequenceTrial SQ 1 RET (0040,1001) Requested Procedure ID RequestedProcedureID SH 1 (0040,1002) Reason for the Requested Procedure ReasonForTheRequestedProcedure LO 1 (0040,1003) Requested Procedure Priority RequestedProcedurePriority SH 1 (0040,1004) Patient Transport Arrangements PatientTransportArrangements LO 1 (0040,1005) Requested Procedure Location RequestedProcedureLocation LO 1 (0040,1006) Placer Order Number / Procedure PlacerOrderNumberProcedure SH 1 RET (0040,1007) Filler Order Number / Procedure FillerOrderNumberProcedure SH 1 RET (0040,1008) Confidentiality Code ConfidentialityCode LO 1 (0040,1009) Reporting Priority ReportingPriority SH 1 (0040,100A) Reason for Requested Procedure Code Sequence ReasonForRequestedProcedureCodeSequence SQ 1 (0040,1010) Names of Intended Recipients of Results NamesOfIntendedRecipientsOfResults PN 1-n (0040,1011) Intended Recipients of Results Identification Sequence IntendedRecipientsOfResultsIdentificationSequence SQ 1 (0040,1012) Reason For Performed Procedure Code Sequence ReasonForPerformedProcedureCodeSequence SQ 1 (0040,1060) Requested Procedure Description (Trial) RequestedProcedureDescriptionTrial LO 1 RET (0040,1101) Person Identification Code Sequence PersonIdentificationCodeSequence SQ 1 (0040,1102) Person's Address PersonAddress ST 1 (0040,1103) Person's Telephone Numbers PersonTelephoneNumbers LO 1-n (0040,1104) Person's Telecom Information PersonTelecomInformation LT 1 (0040,1400) Requested Procedure Comments RequestedProcedureComments LT 1 (0040,2001) Reason for the Imaging Service Request ReasonForTheImagingServiceRequest LO 1 RET (0040,2004) Issue Date of Imaging Service Request IssueDateOfImagingServiceRequest DA 1 (0040,2005) Issue Time of Imaging Service Request IssueTimeOfImagingServiceRequest TM 1 (0040,2006) Placer Order Number / Imaging Service Request (Retired) PlacerOrderNumberImagingServiceRequestRetired SH 1 RET (0040,2007) Filler Order Number / Imaging Service Request (Retired) FillerOrderNumberImagingServiceRequestRetired SH 1 RET (0040,2008) Order Entered By OrderEnteredBy PN 1 (0040,2009) Order Enterer's Location OrderEntererLocation SH 1 (0040,2010) Order Callback Phone Number OrderCallbackPhoneNumber SH 1 (0040,2011) Order Callback Telecom Information OrderCallbackTelecomInformation LT 1 (0040,2016) Placer Order Number / Imaging Service Request PlacerOrderNumberImagingServiceRequest LO 1 (0040,2017) Filler Order Number / Imaging Service Request FillerOrderNumberImagingServiceRequest LO 1 (0040,2400) Imaging Service Request Comments ImagingServiceRequestComments LT 1 (0040,3001) Confidentiality Constraint on Patient Data Description ConfidentialityConstraintOnPatientDataDescription LO 1 (0040,4001) General Purpose Scheduled Procedure Step Status GeneralPurposeScheduledProcedureStepStatus CS 1 RET (0040,4002) General Purpose Performed Procedure Step Status GeneralPurposePerformedProcedureStepStatus CS 1 RET (0040,4003) General Purpose Scheduled Procedure Step Priority GeneralPurposeScheduledProcedureStepPriority CS 1 RET (0040,4004) Scheduled Processing Applications Code Sequence ScheduledProcessingApplicationsCodeSequence SQ 1 RET (0040,4005) Scheduled Procedure Step Start DateTime ScheduledProcedureStepStartDateTime DT 1 (0040,4006) Multiple Copies Flag MultipleCopiesFlag CS 1 RET (0040,4007) Performed Processing Applications Code Sequence PerformedProcessingApplicationsCodeSequence SQ 1 RET (0040,4008) Scheduled Procedure Step Expiration DateTime ScheduledProcedureStepExpirationDateTime DT 1 (0040,4009) Human Performer Code Sequence HumanPerformerCodeSequence SQ 1 (0040,4010) Scheduled Procedure Step Modification DateTime ScheduledProcedureStepModificationDateTime DT 1 (0040,4011) Expected Completion DateTime ExpectedCompletionDateTime DT 1 (0040,4015) Resulting General Purpose Performed Procedure Steps Sequence ResultingGeneralPurposePerformedProcedureStepsSequence SQ 1 RET (0040,4016) Referenced General Purpose Scheduled Procedure Step Sequence ReferencedGeneralPurposeScheduledProcedureStepSequence SQ 1 RET (0040,4018) Scheduled Workitem Code Sequence ScheduledWorkitemCodeSequence SQ 1 (0040,4019) Performed Workitem Code Sequence PerformedWorkitemCodeSequence SQ 1 (0040,4020) Input Availability Flag InputAvailabilityFlag CS 1 RET (0040,4021) Input Information Sequence InputInformationSequence SQ 1 (0040,4022) Relevant Information Sequence RelevantInformationSequence SQ 1 RET (0040,4023) Referenced General Purpose Scheduled Procedure Step Transaction UID ReferencedGeneralPurposeScheduledProcedureStepTransactionUID UI 1 RET (0040,4025) Scheduled Station Name Code Sequence ScheduledStationNameCodeSequence SQ 1 (0040,4026) Scheduled Station Class Code Sequence ScheduledStationClassCodeSequence SQ 1 (0040,4027) Scheduled Station Geographic Location Code Sequence ScheduledStationGeographicLocationCodeSequence SQ 1 (0040,4028) Performed Station Name Code Sequence PerformedStationNameCodeSequence SQ 1 (0040,4029) Performed Station Class Code Sequence PerformedStationClassCodeSequence SQ 1 (0040,4030) Performed Station Geographic Location Code Sequence PerformedStationGeographicLocationCodeSequence SQ 1 (0040,4031) Requested Subsequent Workitem Code Sequence RequestedSubsequentWorkitemCodeSequence SQ 1 RET (0040,4032) Non-DICOM Output Code Sequence NonDICOMOutputCodeSequence SQ 1 RET (0040,4033) Output Information Sequence OutputInformationSequence SQ 1 (0040,4034) Scheduled Human Performers Sequence ScheduledHumanPerformersSequence SQ 1 (0040,4035) Actual Human Performers Sequence ActualHumanPerformersSequence SQ 1 (0040,4036) Human Performer's Organization HumanPerformerOrganization LO 1 (0040,4037) Human Performer's Name HumanPerformerName PN 1 (0040,4040) Raw Data Handling RawDataHandling CS 1 (0040,4041) Input Readiness State InputReadinessState CS 1 (0040,4050) Performed Procedure Step Start DateTime PerformedProcedureStepStartDateTime DT 1 (0040,4051) Performed Procedure Step End DateTime PerformedProcedureStepEndDateTime DT 1 (0040,4052) Procedure Step Cancellation DateTime ProcedureStepCancellationDateTime DT 1 (0040,4070) Output Destination Sequence OutputDestinationSequence SQ 1 (0040,4071) DICOM Storage Sequence DICOMStorageSequence SQ 1 (0040,4072) STOW-RS Storage Sequence STOWRSStorageSequence SQ 1 (0040,4073) Storage URL StorageURL UR 1 (0040,4074) XDS Storage Sequence XDSStorageSequence SQ 1 (0040,8302) Entrance Dose in mGy EntranceDoseInmGy DS 1 (0040,8303) Entrance Dose Derivation EntranceDoseDerivation CS 1 (0040,9092) Parametric Map Frame Type Sequence ParametricMapFrameTypeSequence SQ 1 (0040,9094) Referenced Image Real World Value Mapping Sequence ReferencedImageRealWorldValueMappingSequence SQ 1 (0040,9096) Real World Value Mapping Sequence RealWorldValueMappingSequence SQ 1 (0040,9098) Pixel Value Mapping Code Sequence PixelValueMappingCodeSequence SQ 1 (0040,9210) LUT Label LUTLabel SH 1 (0040,9211) Real World Value Last Value Mapped RealWorldValueLastValueMapped US or SS 1 (0040,9212) Real World Value LUT Data RealWorldValueLUTData FD 1-n (0040,9213) Double Float Real World Value Last Value Mapped DoubleFloatRealWorldValueLastValueMapped FD 1 (0040,9214) Double Float Real World Value First Value Mapped DoubleFloatRealWorldValueFirstValueMapped FD 1 (0040,9216) Real World Value First Value Mapped RealWorldValueFirstValueMapped US or SS 1 (0040,9220) Quantity Definition Sequence QuantityDefinitionSequence SQ 1 (0040,9224) Real World Value Intercept RealWorldValueIntercept FD 1 (0040,9225) Real World Value Slope RealWorldValueSlope FD 1 (0040,A007) Findings Flag (Trial) FindingsFlagTrial CS 1 RET (0040,A010) Relationship Type RelationshipType CS 1 (0040,A020) Findings Sequence (Trial) FindingsSequenceTrial SQ 1 RET (0040,A021) Findings Group UID (Trial) FindingsGroupUIDTrial UI 1 RET (0040,A022) Referenced Findings Group UID (Trial) ReferencedFindingsGroupUIDTrial UI 1 RET (0040,A023) Findings Group Recording Date (Trial) FindingsGroupRecordingDateTrial DA 1 RET (0040,A024) Findings Group Recording Time (Trial) FindingsGroupRecordingTimeTrial TM 1 RET (0040,A026) Findings Source Category Code Sequence (Trial) FindingsSourceCategoryCodeSequenceTrial SQ 1 RET (0040,A027) Verifying Organization VerifyingOrganization LO 1 (0040,A028) Documenting Organization Identifier Code Sequence (Trial) DocumentingOrganizationIdentifierCodeSequenceTrial SQ 1 RET (0040,A030) Verification DateTime VerificationDateTime DT 1 (0040,A032) Observation DateTime ObservationDateTime DT 1 (0040,A040) Value Type ValueType CS 1 (0040,A043) Concept Name Code Sequence ConceptNameCodeSequence SQ 1 (0040,A047) Measurement Precision Description (Trial) MeasurementPrecisionDescriptionTrial LO 1 RET (0040,A050) Continuity Of Content ContinuityOfContent CS 1 (0040,A057) Urgency or Priority Alerts (Trial) UrgencyOrPriorityAlertsTrial CS 1-n RET (0040,A060) Sequencing Indicator (Trial) SequencingIndicatorTrial LO 1 RET (0040,A066) Document Identifier Code Sequence (Trial) DocumentIdentifierCodeSequenceTrial SQ 1 RET (0040,A067) Document Author (Trial) DocumentAuthorTrial PN 1 RET (0040,A068) Document Author Identifier Code Sequence (Trial) DocumentAuthorIdentifierCodeSequenceTrial SQ 1 RET (0040,A070) Identifier Code Sequence (Trial) IdentifierCodeSequenceTrial SQ 1 RET (0040,A073) Verifying Observer Sequence VerifyingObserverSequence SQ 1 (0040,A074) Object Binary Identifier (Trial) ObjectBinaryIdentifierTrial OB 1 RET (0040,A075) Verifying Observer Name VerifyingObserverName PN 1 (0040,A076) Documenting Observer Identifier Code Sequence (Trial) DocumentingObserverIdentifierCodeSequenceTrial SQ 1 RET (0040,A078) Author Observer Sequence AuthorObserverSequence SQ 1 (0040,A07A) Participant Sequence ParticipantSequence SQ 1 (0040,A07C) Custodial Organization Sequence CustodialOrganizationSequence SQ 1 (0040,A080) Participation Type ParticipationType CS 1 (0040,A082) Participation DateTime ParticipationDateTime DT 1 (0040,A084) Observer Type ObserverType CS 1 (0040,A085) Procedure Identifier Code Sequence (Trial) ProcedureIdentifierCodeSequenceTrial SQ 1 RET (0040,A088) Verifying Observer Identification Code Sequence VerifyingObserverIdentificationCodeSequence SQ 1 (0040,A089) Object Directory Binary Identifier (Trial) ObjectDirectoryBinaryIdentifierTrial OB 1 RET (0040,A090) Equivalent CDA Document Sequence EquivalentCDADocumentSequence SQ 1 RET (0040,A0B0) Referenced Waveform Channels ReferencedWaveformChannels US 2-2n (0040,A110) Date of Document or Verbal Transaction (Trial) DateOfDocumentOrVerbalTransactionTrial DA 1 RET (0040,A112) Time of Document Creation or Verbal Transaction (Trial) TimeOfDocumentCreationOrVerbalTransactionTrial TM 1 RET (0040,A120) DateTime DateTime DT 1 (0040,A121) Date Date DA 1 (0040,A122) Time Time TM 1 (0040,A123) Person Name PersonName PN 1 (0040,A124) UID UID UI 1 (0040,A125) Report Status ID (Trial) ReportStatusIDTrial CS 2 RET (0040,A130) Temporal Range Type TemporalRangeType CS 1 (0040,A132) Referenced Sample Positions ReferencedSamplePositions UL 1-n (0040,A136) Referenced Frame Numbers ReferencedFrameNumbers US 1-n RET (0040,A138) Referenced Time Offsets ReferencedTimeOffsets DS 1-n (0040,A13A) Referenced DateTime ReferencedDateTime DT 1-n (0040,A160) Text Value TextValue UT 1 (0040,A161) Floating Point Value FloatingPointValue FD 1-n (0040,A162) Rational Numerator Value RationalNumeratorValue SL 1-n (0040,A163) Rational Denominator Value RationalDenominatorValue UL 1-n (0040,A167) Observation Category Code Sequence (Trial) ObservationCategoryCodeSequenceTrial SQ 1 RET (0040,A168) Concept Code Sequence ConceptCodeSequence SQ 1 (0040,A16A) Bibliographic Citation (Trial) BibliographicCitationTrial ST 1 RET (0040,A170) Purpose of Reference Code Sequence PurposeOfReferenceCodeSequence SQ 1 (0040,A171) Observation UID ObservationUID UI 1 (0040,A172) Referenced Observation UID (Trial) ReferencedObservationUIDTrial UI 1 RET (0040,A173) Referenced Observation Class (Trial) ReferencedObservationClassTrial CS 1 RET (0040,A174) Referenced Object Observation Class (Trial) ReferencedObjectObservationClassTrial CS 1 RET (0040,A180) Annotation Group Number AnnotationGroupNumber US 1 (0040,A192) Observation Date (Trial) ObservationDateTrial DA 1 RET (0040,A193) Observation Time (Trial) ObservationTimeTrial TM 1 RET (0040,A194) Measurement Automation (Trial) MeasurementAutomationTrial CS 1 RET (0040,A195) Modifier Code Sequence ModifierCodeSequence SQ 1 (0040,A224) Identification Description (Trial) IdentificationDescriptionTrial ST 1 RET (0040,A290) Coordinates Set Geometric Type (Trial) CoordinatesSetGeometricTypeTrial CS 1 RET (0040,A296) Algorithm Code Sequence (Trial) AlgorithmCodeSequenceTrial SQ 1 RET (0040,A297) Algorithm Description (Trial) AlgorithmDescriptionTrial ST 1 RET (0040,A29A) Pixel Coordinates Set (Trial) PixelCoordinatesSetTrial SL 2-2n RET (0040,A300) Measured Value Sequence MeasuredValueSequence SQ 1 (0040,A301) Numeric Value Qualifier Code Sequence NumericValueQualifierCodeSequence SQ 1 (0040,A307) Current Observer (Trial) CurrentObserverTrial PN 1 RET (0040,A30A) Numeric Value NumericValue DS 1-n (0040,A313) Referenced Accession Sequence (Trial) ReferencedAccessionSequenceTrial SQ 1 RET (0040,A33A) Report Status Comment (Trial) ReportStatusCommentTrial ST 1 RET (0040,A340) Procedure Context Sequence (Trial) ProcedureContextSequenceTrial SQ 1 RET (0040,A352) Verbal Source (Trial) VerbalSourceTrial PN 1 RET (0040,A353) Address (Trial) AddressTrial ST 1 RET (0040,A354) Telephone Number (Trial) TelephoneNumberTrial LO 1 RET (0040,A358) Verbal Source Identifier Code Sequence (Trial) VerbalSourceIdentifierCodeSequenceTrial SQ 1 RET (0040,A360) Predecessor Documents Sequence PredecessorDocumentsSequence SQ 1 (0040,A370) Referenced Request Sequence ReferencedRequestSequence SQ 1 (0040,A372) Performed Procedure Code Sequence PerformedProcedureCodeSequence SQ 1 (0040,A375) Current Requested Procedure Evidence Sequence CurrentRequestedProcedureEvidenceSequence SQ 1 (0040,A380) Report Detail Sequence (Trial) ReportDetailSequenceTrial SQ 1 RET (0040,A385) Pertinent Other Evidence Sequence PertinentOtherEvidenceSequence SQ 1 (0040,A390) HL7 Structured Document Reference Sequence HL7StructuredDocumentReferenceSequence SQ 1 (0040,A402) Observation Subject UID (Trial) ObservationSubjectUIDTrial UI 1 RET (0040,A403) Observation Subject Class (Trial) ObservationSubjectClassTrial CS 1 RET (0040,A404) Observation Subject Type Code Sequence (Trial) ObservationSubjectTypeCodeSequenceTrial SQ 1 RET (0040,A491) Completion Flag CompletionFlag CS 1 (0040,A492) Completion Flag Description CompletionFlagDescription LO 1 (0040,A493) Verification Flag VerificationFlag CS 1 (0040,A494) Archive Requested ArchiveRequested CS 1 (0040,A496) Preliminary Flag PreliminaryFlag CS 1 (0040,A504) Content Template Sequence ContentTemplateSequence SQ 1 (0040,A525) Identical Documents Sequence IdenticalDocumentsSequence SQ 1 (0040,A600) Observation Subject Context Flag (Trial) ObservationSubjectContextFlagTrial CS 1 RET (0040,A601) Observer Context Flag (Trial) ObserverContextFlagTrial CS 1 RET (0040,A603) Procedure Context Flag (Trial) ProcedureContextFlagTrial CS 1 RET (0040,A730) Content Sequence ContentSequence SQ 1 (0040,A731) Relationship Sequence (Trial) RelationshipSequenceTrial SQ 1 RET (0040,A732) Relationship Type Code Sequence (Trial) RelationshipTypeCodeSequenceTrial SQ 1 RET (0040,A744) Language Code Sequence (Trial) LanguageCodeSequenceTrial SQ 1 RET (0040,A992) Uniform Resource Locator (Trial) UniformResourceLocatorTrial ST 1 RET (0040,B020) Waveform Annotation Sequence WaveformAnnotationSequence SQ 1 (0040,DB00) Template Identifier TemplateIdentifier CS 1 (0040,DB06) Template Version TemplateVersion DT 1 RET (0040,DB07) Template Local Version TemplateLocalVersion DT 1 RET (0040,DB0B) Template Extension Flag TemplateExtensionFlag CS 1 RET (0040,DB0C) Template Extension Organization UID TemplateExtensionOrganizationUID UI 1 RET (0040,DB0D) Template Extension Creator UID TemplateExtensionCreatorUID UI 1 RET (0040,DB73) Referenced Content Item Identifier ReferencedContentItemIdentifier UL 1-n (0040,E001) HL7 Instance Identifier HL7InstanceIdentifier ST 1 (0040,E004) HL7 Document Effective Time HL7DocumentEffectiveTime DT 1 (0040,E006) HL7 Document Type Code Sequence HL7DocumentTypeCodeSequence SQ 1 (0040,E008) Document Class Code Sequence DocumentClassCodeSequence SQ 1 (0040,E010) Retrieve URI RetrieveURI UR 1 (0040,E011) Retrieve Location UID RetrieveLocationUID UI 1 (0040,E020) Type of Instances TypeOfInstances CS 1 (0040,E021) DICOM Retrieval Sequence DICOMRetrievalSequence SQ 1 (0040,E022) DICOM Media Retrieval Sequence DICOMMediaRetrievalSequence SQ 1 (0040,E023) WADO Retrieval Sequence WADORetrievalSequence SQ 1 (0040,E024) XDS Retrieval Sequence XDSRetrievalSequence SQ 1 (0040,E025) WADO-RS Retrieval Sequence WADORSRetrievalSequence SQ 1 (0040,E030) Repository Unique ID RepositoryUniqueID UI 1 (0040,E031) Home Community ID HomeCommunityID UI 1 (0042,0010) Document Title DocumentTitle ST 1 (0042,0011) Encapsulated Document EncapsulatedDocument OB 1 (0042,0012) MIME Type of Encapsulated Document MIMETypeOfEncapsulatedDocument LO 1 (0042,0013) Source Instance Sequence SourceInstanceSequence SQ 1 (0042,0014) List of MIME Types ListOfMIMETypes LO 1-n (0042,0015) Encapsulated Document Length EncapsulatedDocumentLength UL 1 (0044,0001) Product Package Identifier ProductPackageIdentifier ST 1 (0044,0002) Substance Administration Approval SubstanceAdministrationApproval CS 1 (0044,0003) Approval Status Further Description ApprovalStatusFurtherDescription LT 1 (0044,0004) Approval Status DateTime ApprovalStatusDateTime DT 1 (0044,0007) Product Type Code Sequence ProductTypeCodeSequence SQ 1 (0044,0008) Product Name ProductName LO 1-n (0044,0009) Product Description ProductDescription LT 1 (0044,000A) Product Lot Identifier ProductLotIdentifier LO 1 (0044,000B) Product Expiration DateTime ProductExpirationDateTime DT 1 (0044,0010) Substance Administration DateTime SubstanceAdministrationDateTime DT 1 (0044,0011) Substance Administration Notes SubstanceAdministrationNotes LO 1 (0044,0012) Substance Administration Device ID SubstanceAdministrationDeviceID LO 1 (0044,0013) Product Parameter Sequence ProductParameterSequence SQ 1 (0044,0019) Substance Administration Parameter Sequence SubstanceAdministrationParameterSequence SQ 1 (0044,0100) Approval Sequence ApprovalSequence SQ 1 (0044,0101) Assertion Code Sequence AssertionCodeSequence SQ 1 (0044,0102) Assertion UID AssertionUID UI 1 (0044,0103) Asserter Identification Sequence AsserterIdentificationSequence SQ 1 (0044,0104) Assertion DateTime AssertionDateTime DT 1 (0044,0105) Assertion Expiration DateTime AssertionExpirationDateTime DT 1 (0044,0106) Assertion Comments AssertionComments UT 1 (0044,0107) Related Assertion Sequence RelatedAssertionSequence SQ 1 (0044,0108) Referenced Assertion UID ReferencedAssertionUID UI 1 (0044,0109) Approval Subject Sequence ApprovalSubjectSequence SQ 1 (0044,010A) Organizational Role Code Sequence OrganizationalRoleCodeSequence SQ 1 (0046,0012) Lens Description LensDescription LO 1 (0046,0014) Right Lens Sequence RightLensSequence SQ 1 (0046,0015) Left Lens Sequence LeftLensSequence SQ 1 (0046,0016) Unspecified Laterality Lens Sequence UnspecifiedLateralityLensSequence SQ 1 (0046,0018) Cylinder Sequence CylinderSequence SQ 1 (0046,0028) Prism Sequence PrismSequence SQ 1 (0046,0030) Horizontal Prism Power HorizontalPrismPower FD 1 (0046,0032) Horizontal Prism Base HorizontalPrismBase CS 1 (0046,0034) Vertical Prism Power VerticalPrismPower FD 1 (0046,0036) Vertical Prism Base VerticalPrismBase CS 1 (0046,0038) Lens Segment Type LensSegmentType CS 1 (0046,0040) Optical Transmittance OpticalTransmittance FD 1 (0046,0042) Channel Width ChannelWidth FD 1 (0046,0044) Pupil Size PupilSize FD 1 (0046,0046) Corneal Size CornealSize FD 1 (0046,0047) Corneal Size Sequence CornealSizeSequence SQ 1 (0046,0050) Autorefraction Right Eye Sequence AutorefractionRightEyeSequence SQ 1 (0046,0052) Autorefraction Left Eye Sequence AutorefractionLeftEyeSequence SQ 1 (0046,0060) Distance Pupillary Distance DistancePupillaryDistance FD 1 (0046,0062) Near Pupillary Distance NearPupillaryDistance FD 1 (0046,0063) Intermediate Pupillary Distance IntermediatePupillaryDistance FD 1 (0046,0064) Other Pupillary Distance OtherPupillaryDistance FD 1 (0046,0070) Keratometry Right Eye Sequence KeratometryRightEyeSequence SQ 1 (0046,0071) Keratometry Left Eye Sequence KeratometryLeftEyeSequence SQ 1 (0046,0074) Steep Keratometric Axis Sequence SteepKeratometricAxisSequence SQ 1 (0046,0075) Radius of Curvature RadiusOfCurvature FD 1 (0046,0076) Keratometric Power KeratometricPower FD 1 (0046,0077) Keratometric Axis KeratometricAxis FD 1 (0046,0080) Flat Keratometric Axis Sequence FlatKeratometricAxisSequence SQ 1 (0046,0092) Background Color BackgroundColor CS 1 (0046,0094) Optotype Optotype CS 1 (0046,0095) Optotype Presentation OptotypePresentation CS 1 (0046,0097) Subjective Refraction Right Eye Sequence SubjectiveRefractionRightEyeSequence SQ 1 (0046,0098) Subjective Refraction Left Eye Sequence SubjectiveRefractionLeftEyeSequence SQ 1 (0046,0100) Add Near Sequence AddNearSequence SQ 1 (0046,0101) Add Intermediate Sequence AddIntermediateSequence SQ 1 (0046,0102) Add Other Sequence AddOtherSequence SQ 1 (0046,0104) Add Power AddPower FD 1 (0046,0106) Viewing Distance ViewingDistance FD 1 (0046,0110) Cornea Measurements Sequence CorneaMeasurementsSequence SQ 1 (0046,0111) Source of Cornea Measurement Data Code Sequence SourceOfCorneaMeasurementDataCodeSequence SQ 1 (0046,0112) Steep Corneal Axis Sequence SteepCornealAxisSequence SQ 1 (0046,0113) Flat Corneal Axis Sequence FlatCornealAxisSequence SQ 1 (0046,0114) Corneal Power CornealPower FD 1 (0046,0115) Corneal Axis CornealAxis FD 1 (0046,0116) Cornea Measurement Method Code Sequence CorneaMeasurementMethodCodeSequence SQ 1 (0046,0117) Refractive Index of Cornea RefractiveIndexOfCornea FL 1 (0046,0118) Refractive Index of Aqueous Humor RefractiveIndexOfAqueousHumor FL 1 (0046,0121) Visual Acuity Type Code Sequence VisualAcuityTypeCodeSequence SQ 1 (0046,0122) Visual Acuity Right Eye Sequence VisualAcuityRightEyeSequence SQ 1 (0046,0123) Visual Acuity Left Eye Sequence VisualAcuityLeftEyeSequence SQ 1 (0046,0124) Visual Acuity Both Eyes Open Sequence VisualAcuityBothEyesOpenSequence SQ 1 (0046,0125) Viewing Distance Type ViewingDistanceType CS 1 (0046,0135) Visual Acuity Modifiers VisualAcuityModifiers SS 2 (0046,0137) Decimal Visual Acuity DecimalVisualAcuity FD 1 (0046,0139) Optotype Detailed Definition OptotypeDetailedDefinition LO 1 (0046,0145) Referenced Refractive Measurements Sequence ReferencedRefractiveMeasurementsSequence SQ 1 (0046,0146) Sphere Power SpherePower FD 1 (0046,0147) Cylinder Power CylinderPower FD 1 (0046,0201) Corneal Topography Surface CornealTopographySurface CS 1 (0046,0202) Corneal Vertex Location CornealVertexLocation FL 2 (0046,0203) Pupil Centroid X-Coordinate PupilCentroidXCoordinate FL 1 (0046,0204) Pupil Centroid Y-Coordinate PupilCentroidYCoordinate FL 1 (0046,0205) Equivalent Pupil Radius EquivalentPupilRadius FL 1 (0046,0207) Corneal Topography Map Type Code Sequence CornealTopographyMapTypeCodeSequence SQ 1 (0046,0208) Vertices of the Outline of Pupil VerticesOfTheOutlineOfPupil IS 2-2n (0046,0210) Corneal Topography Mapping Normals Sequence CornealTopographyMappingNormalsSequence SQ 1 (0046,0211) Maximum Corneal Curvature Sequence MaximumCornealCurvatureSequence SQ 1 (0046,0212) Maximum Corneal Curvature MaximumCornealCurvature FL 1 (0046,0213) Maximum Corneal Curvature Location MaximumCornealCurvatureLocation FL 2 (0046,0215) Minimum Keratometric Sequence MinimumKeratometricSequence SQ 1 (0046,0218) Simulated Keratometric Cylinder Sequence SimulatedKeratometricCylinderSequence SQ 1 (0046,0220) Average Corneal Power AverageCornealPower FL 1 (0046,0224) Corneal I-S Value CornealISValue FL 1 (0046,0227) Analyzed Area AnalyzedArea FL 1 (0046,0230) Surface Regularity Index SurfaceRegularityIndex FL 1 (0046,0232) Surface Asymmetry Index SurfaceAsymmetryIndex FL 1 (0046,0234) Corneal Eccentricity Index CornealEccentricityIndex FL 1 (0046,0236) Keratoconus Prediction Index KeratoconusPredictionIndex FL 1 (0046,0238) Decimal Potential Visual Acuity DecimalPotentialVisualAcuity FL 1 (0046,0242) Corneal Topography Map Quality Evaluation CornealTopographyMapQualityEvaluation CS 1 (0046,0244) Source Image Corneal Processed Data Sequence SourceImageCornealProcessedDataSequence SQ 1 (0046,0247) Corneal Point Location CornealPointLocation FL 3 (0046,0248) Corneal Point Estimated CornealPointEstimated CS 1 (0046,0249) Axial Power AxialPower FL 1 (0046,0250) Tangential Power TangentialPower FL 1 (0046,0251) Refractive Power RefractivePower FL 1 (0046,0252) Relative Elevation RelativeElevation FL 1 (0046,0253) Corneal Wavefront CornealWavefront FL 1 (0048,0001) Imaged Volume Width ImagedVolumeWidth FL 1 (0048,0002) Imaged Volume Height ImagedVolumeHeight FL 1 (0048,0003) Imaged Volume Depth ImagedVolumeDepth FL 1 (0048,0006) Total Pixel Matrix Columns TotalPixelMatrixColumns UL 1 (0048,0007) Total Pixel Matrix Rows TotalPixelMatrixRows UL 1 (0048,0008) Total Pixel Matrix Origin Sequence TotalPixelMatrixOriginSequence SQ 1 (0048,0010) Specimen Label in Image SpecimenLabelInImage CS 1 (0048,0011) Focus Method FocusMethod CS 1 (0048,0012) Extended Depth of Field ExtendedDepthOfField CS 1 (0048,0013) Number of Focal Planes NumberOfFocalPlanes US 1 (0048,0014) Distance Between Focal Planes DistanceBetweenFocalPlanes FL 1 (0048,0015) Recommended Absent Pixel CIELab Value RecommendedAbsentPixelCIELabValue US 3 (0048,0100) Illuminator Type Code Sequence IlluminatorTypeCodeSequence SQ 1 (0048,0102) Image Orientation (Slide) ImageOrientationSlide DS 6 (0048,0105) Optical Path Sequence OpticalPathSequence SQ 1 (0048,0106) Optical Path Identifier OpticalPathIdentifier SH 1 (0048,0107) Optical Path Description OpticalPathDescription ST 1 (0048,0108) Illumination Color Code Sequence IlluminationColorCodeSequence SQ 1 (0048,0110) Specimen Reference Sequence SpecimenReferenceSequence SQ 1 (0048,0111) Condenser Lens Power CondenserLensPower DS 1 (0048,0112) Objective Lens Power ObjectiveLensPower DS 1 (0048,0113) Objective Lens Numerical Aperture ObjectiveLensNumericalAperture DS 1 (0048,0120) Palette Color Lookup Table Sequence PaletteColorLookupTableSequence SQ 1 (0048,0200) Referenced Image Navigation Sequence ReferencedImageNavigationSequence SQ 1 (0048,0201) Top Left Hand Corner of Localizer Area TopLeftHandCornerOfLocalizerArea US 2 (0048,0202) Bottom Right Hand Corner of Localizer Area BottomRightHandCornerOfLocalizerArea US 2 (0048,0207) Optical Path Identification Sequence OpticalPathIdentificationSequence SQ 1 (0048,021A) Plane Position (Slide) Sequence PlanePositionSlideSequence SQ 1 (0048,021E) Column Position In Total Image Pixel Matrix ColumnPositionInTotalImagePixelMatrix SL 1 (0048,021F) Row Position In Total Image Pixel Matrix RowPositionInTotalImagePixelMatrix SL 1 (0048,0301) Pixel Origin Interpretation PixelOriginInterpretation CS 1 (0048,0302) Number of Optical Paths NumberOfOpticalPaths UL 1 (0048,0303) Total Pixel Matrix Focal Planes TotalPixelMatrixFocalPlanes UL 1 (0050,0004) Calibration Image CalibrationImage CS 1 (0050,0010) Device Sequence DeviceSequence SQ 1 (0050,0012) Container Component Type Code Sequence ContainerComponentTypeCodeSequence SQ 1 (0050,0013) Container Component Thickness ContainerComponentThickness FD 1 (0050,0014) Device Length DeviceLength DS 1 (0050,0015) Container Component Width ContainerComponentWidth FD 1 (0050,0016) Device Diameter DeviceDiameter DS 1 (0050,0017) Device Diameter Units DeviceDiameterUnits CS 1 (0050,0018) Device Volume DeviceVolume DS 1 (0050,0019) Inter-Marker Distance InterMarkerDistance DS 1 (0050,001A) Container Component Material ContainerComponentMaterial CS 1 (0050,001B) Container Component ID ContainerComponentID LO 1 (0050,001C) Container Component Length ContainerComponentLength FD 1 (0050,001D) Container Component Diameter ContainerComponentDiameter FD 1 (0050,001E) Container Component Description ContainerComponentDescription LO 1 (0050,0020) Device Description DeviceDescription LO 1 (0050,0021) Long Device Description LongDeviceDescription ST 1 (0052,0001) Contrast/Bolus Ingredient Percent by Volume ContrastBolusIngredientPercentByVolume FL 1 (0052,0002) OCT Focal Distance OCTFocalDistance FD 1 (0052,0003) Beam Spot Size BeamSpotSize FD 1 (0052,0004) Effective Refractive Index EffectiveRefractiveIndex FD 1 (0052,0006) OCT Acquisition Domain OCTAcquisitionDomain CS 1 (0052,0007) OCT Optical Center Wavelength OCTOpticalCenterWavelength FD 1 (0052,0008) Axial Resolution AxialResolution FD 1 (0052,0009) Ranging Depth RangingDepth FD 1 (0052,0011) A-line Rate ALineRate FD 1 (0052,0012) A-lines Per Frame ALinesPerFrame US 1 (0052,0013) Catheter Rotational Rate CatheterRotationalRate FD 1 (0052,0014) A-line Pixel Spacing ALinePixelSpacing FD 1 (0052,0016) Mode of Percutaneous Access Sequence ModeOfPercutaneousAccessSequence SQ 1 (0052,0025) Intravascular OCT Frame Type Sequence IntravascularOCTFrameTypeSequence SQ 1 (0052,0026) OCT Z Offset Applied OCTZOffsetApplied CS 1 (0052,0027) Intravascular Frame Content Sequence IntravascularFrameContentSequence SQ 1 (0052,0028) Intravascular Longitudinal Distance IntravascularLongitudinalDistance FD 1 (0052,0029) Intravascular OCT Frame Content Sequence IntravascularOCTFrameContentSequence SQ 1 (0052,0030) OCT Z Offset Correction OCTZOffsetCorrection SS 1 (0052,0031) Catheter Direction of Rotation CatheterDirectionOfRotation CS 1 (0052,0033) Seam Line Location SeamLineLocation FD 1 (0052,0034) First A-line Location FirstALineLocation FD 1 (0052,0036) Seam Line Index SeamLineIndex US 1 (0052,0038) Number of Padded A-lines NumberOfPaddedALines US 1 (0052,0039) Interpolation Type InterpolationType CS 1 (0052,003A) Refractive Index Applied RefractiveIndexApplied CS 1 (0054,0010) Energy Window Vector EnergyWindowVector US 1-n (0054,0011) Number of Energy Windows NumberOfEnergyWindows US 1 (0054,0012) Energy Window Information Sequence EnergyWindowInformationSequence SQ 1 (0054,0013) Energy Window Range Sequence EnergyWindowRangeSequence SQ 1 (0054,0014) Energy Window Lower Limit EnergyWindowLowerLimit DS 1 (0054,0015) Energy Window Upper Limit EnergyWindowUpperLimit DS 1 (0054,0016) Radiopharmaceutical Information Sequence RadiopharmaceuticalInformationSequence SQ 1 (0054,0017) Residual Syringe Counts ResidualSyringeCounts IS 1 (0054,0018) Energy Window Name EnergyWindowName SH 1 (0054,0020) Detector Vector DetectorVector US 1-n (0054,0021) Number of Detectors NumberOfDetectors US 1 (0054,0022) Detector Information Sequence DetectorInformationSequence SQ 1 (0054,0030) Phase Vector PhaseVector US 1-n (0054,0031) Number of Phases NumberOfPhases US 1 (0054,0032) Phase Information Sequence PhaseInformationSequence SQ 1 (0054,0033) Number of Frames in Phase NumberOfFramesInPhase US 1 (0054,0036) Phase Delay PhaseDelay IS 1 (0054,0038) Pause Between Frames PauseBetweenFrames IS 1 (0054,0039) Phase Description PhaseDescription CS 1 (0054,0050) Rotation Vector RotationVector US 1-n (0054,0051) Number of Rotations NumberOfRotations US 1 (0054,0052) Rotation Information Sequence RotationInformationSequence SQ 1 (0054,0053) Number of Frames in Rotation NumberOfFramesInRotation US 1 (0054,0060) R-R Interval Vector RRIntervalVector US 1-n (0054,0061) Number of R-R Intervals NumberOfRRIntervals US 1 (0054,0062) Gated Information Sequence GatedInformationSequence SQ 1 (0054,0063) Data Information Sequence DataInformationSequence SQ 1 (0054,0070) Time Slot Vector TimeSlotVector US 1-n (0054,0071) Number of Time Slots NumberOfTimeSlots US 1 (0054,0072) Time Slot Information Sequence TimeSlotInformationSequence SQ 1 (0054,0073) Time Slot Time TimeSlotTime DS 1 (0054,0080) Slice Vector SliceVector US 1-n (0054,0081) Number of Slices NumberOfSlices US 1 (0054,0090) Angular View Vector AngularViewVector US 1-n (0054,0100) Time Slice Vector TimeSliceVector US 1-n (0054,0101) Number of Time Slices NumberOfTimeSlices US 1 (0054,0200) Start Angle StartAngle DS 1 (0054,0202) Type of Detector Motion TypeOfDetectorMotion CS 1 (0054,0210) Trigger Vector TriggerVector IS 1-n (0054,0211) Number of Triggers in Phase NumberOfTriggersInPhase US 1 (0054,0220) View Code Sequence ViewCodeSequence SQ 1 (0054,0222) View Modifier Code Sequence ViewModifierCodeSequence SQ 1 (0054,0300) Radionuclide Code Sequence RadionuclideCodeSequence SQ 1 (0054,0302) Administration Route Code Sequence AdministrationRouteCodeSequence SQ 1 (0054,0304) Radiopharmaceutical Code Sequence RadiopharmaceuticalCodeSequence SQ 1 (0054,0306) Calibration Data Sequence CalibrationDataSequence SQ 1 (0054,0308) Energy Window Number EnergyWindowNumber US 1 (0054,0400) Image ID ImageID SH 1 (0054,0410) Patient Orientation Code Sequence PatientOrientationCodeSequence SQ 1 (0054,0412) Patient Orientation Modifier Code Sequence PatientOrientationModifierCodeSequence SQ 1 (0054,0414) Patient Gantry Relationship Code Sequence PatientGantryRelationshipCodeSequence SQ 1 (0054,0500) Slice Progression Direction SliceProgressionDirection CS 1 (0054,0501) Scan Progression Direction ScanProgressionDirection CS 1 (0054,1000) Series Type SeriesType CS 2 (0054,1001) Units Units CS 1 (0054,1002) Counts Source CountsSource CS 1 (0054,1004) Reprojection Method ReprojectionMethod CS 1 (0054,1006) SUV Type SUVType CS 1 (0054,1100) Randoms Correction Method RandomsCorrectionMethod CS 1 (0054,1101) Attenuation Correction Method AttenuationCorrectionMethod LO 1 (0054,1102) Decay Correction DecayCorrection CS 1 (0054,1103) Reconstruction Method ReconstructionMethod LO 1 (0054,1104) Detector Lines of Response Used DetectorLinesOfResponseUsed LO 1 (0054,1105) Scatter Correction Method ScatterCorrectionMethod LO 1 (0054,1200) Axial Acceptance AxialAcceptance DS 1 (0054,1201) Axial Mash AxialMash IS 2 (0054,1202) Transverse Mash TransverseMash IS 1 (0054,1203) Detector Element Size DetectorElementSize DS 2 (0054,1210) Coincidence Window Width CoincidenceWindowWidth DS 1 (0054,1220) Secondary Counts Type SecondaryCountsType CS 1-n (0054,1300) Frame Reference Time FrameReferenceTime DS 1 (0054,1310) Primary (Prompts) Counts Accumulated PrimaryPromptsCountsAccumulated IS 1 (0054,1311) Secondary Counts Accumulated SecondaryCountsAccumulated IS 1-n (0054,1320) Slice Sensitivity Factor SliceSensitivityFactor DS 1 (0054,1321) Decay Factor DecayFactor DS 1 (0054,1322) Dose Calibration Factor DoseCalibrationFactor DS 1 (0054,1323) Scatter Fraction Factor ScatterFractionFactor DS 1 (0054,1324) Dead Time Factor DeadTimeFactor DS 1 (0054,1330) Image Index ImageIndex US 1 (0054,1400) Counts Included CountsIncluded CS 1-n RET (0054,1401) Dead Time Correction Flag DeadTimeCorrectionFlag CS 1 RET (0060,3000) Histogram Sequence HistogramSequence SQ 1 (0060,3002) Histogram Number of Bins HistogramNumberOfBins US 1 (0060,3004) Histogram First Bin Value HistogramFirstBinValue US or SS 1 (0060,3006) Histogram Last Bin Value HistogramLastBinValue US or SS 1 (0060,3008) Histogram Bin Width HistogramBinWidth US 1 (0060,3010) Histogram Explanation HistogramExplanation LO 1 (0060,3020) Histogram Data HistogramData UL 1-n (0062,0001) Segmentation Type SegmentationType CS 1 (0062,0002) Segment Sequence SegmentSequence SQ 1 (0062,0003) Segmented Property Category Code Sequence SegmentedPropertyCategoryCodeSequence SQ 1 (0062,0004) Segment Number SegmentNumber US 1 (0062,0005) Segment Label SegmentLabel LO 1 (0062,0006) Segment Description SegmentDescription ST 1 (0062,0007) Segmentation Algorithm Identification Sequence SegmentationAlgorithmIdentificationSequence SQ 1 (0062,0008) Segment Algorithm Type SegmentAlgorithmType CS 1 (0062,0009) Segment Algorithm Name SegmentAlgorithmName LO 1 (0062,000A) Segment Identification Sequence SegmentIdentificationSequence SQ 1 (0062,000B) Referenced Segment Number ReferencedSegmentNumber US 1-n (0062,000C) Recommended Display Grayscale Value RecommendedDisplayGrayscaleValue US 1 (0062,000D) Recommended Display CIELab Value RecommendedDisplayCIELabValue US 3 (0062,000E) Maximum Fractional Value MaximumFractionalValue US 1 (0062,000F) Segmented Property Type Code Sequence SegmentedPropertyTypeCodeSequence SQ 1 (0062,0010) Segmentation Fractional Type SegmentationFractionalType CS 1 (0062,0011) Segmented Property Type Modifier Code Sequence SegmentedPropertyTypeModifierCodeSequence SQ 1 (0062,0012) Used Segments Sequence UsedSegmentsSequence SQ 1 (0062,0013) Segments Overlap SegmentsOverlap CS 1 (0062,0020) Tracking ID TrackingID UT 1 (0062,0021) Tracking UID TrackingUID UI 1 (0064,0002) Deformable Registration Sequence DeformableRegistrationSequence SQ 1 (0064,0003) Source Frame of Reference UID SourceFrameOfReferenceUID UI 1 (0064,0005) Deformable Registration Grid Sequence DeformableRegistrationGridSequence SQ 1 (0064,0007) Grid Dimensions GridDimensions UL 3 (0064,0008) Grid Resolution GridResolution FD 3 (0064,0009) Vector Grid Data VectorGridData OF 1 (0064,000F) Pre Deformation Matrix Registration Sequence PreDeformationMatrixRegistrationSequence SQ 1 (0064,0010) Post Deformation Matrix Registration Sequence PostDeformationMatrixRegistrationSequence SQ 1 (0066,0001) Number of Surfaces NumberOfSurfaces UL 1 (0066,0002) Surface Sequence SurfaceSequence SQ 1 (0066,0003) Surface Number SurfaceNumber UL 1 (0066,0004) Surface Comments SurfaceComments LT 1 (0066,0009) Surface Processing SurfaceProcessing CS 1 (0066,000A) Surface Processing Ratio SurfaceProcessingRatio FL 1 (0066,000B) Surface Processing Description SurfaceProcessingDescription LO 1 (0066,000C) Recommended Presentation Opacity RecommendedPresentationOpacity FL 1 (0066,000D) Recommended Presentation Type RecommendedPresentationType CS 1 (0066,000E) Finite Volume FiniteVolume CS 1 (0066,0010) Manifold Manifold CS 1 (0066,0011) Surface Points Sequence SurfacePointsSequence SQ 1 (0066,0012) Surface Points Normals Sequence SurfacePointsNormalsSequence SQ 1 (0066,0013) Surface Mesh Primitives Sequence SurfaceMeshPrimitivesSequence SQ 1 (0066,0015) Number of Surface Points NumberOfSurfacePoints UL 1 (0066,0016) Point Coordinates Data PointCoordinatesData OF 1 (0066,0017) Point Position Accuracy PointPositionAccuracy FL 3 (0066,0018) Mean Point Distance MeanPointDistance FL 1 (0066,0019) Maximum Point Distance MaximumPointDistance FL 1 (0066,001A) Points Bounding Box Coordinates PointsBoundingBoxCoordinates FL 6 (0066,001B) Axis of Rotation AxisOfRotation FL 3 (0066,001C) Center of Rotation CenterOfRotation FL 3 (0066,001E) Number of Vectors NumberOfVectors UL 1 (0066,001F) Vector Dimensionality VectorDimensionality US 1 (0066,0020) Vector Accuracy VectorAccuracy FL 1-n (0066,0021) Vector Coordinate Data VectorCoordinateData OF 1 (0066,0023) Triangle Point Index List TrianglePointIndexList OW 1 RET (0066,0024) Edge Point Index List EdgePointIndexList OW 1 RET (0066,0025) Vertex Point Index List VertexPointIndexList OW 1 RET (0066,0026) Triangle Strip Sequence TriangleStripSequence SQ 1 (0066,0027) Triangle Fan Sequence TriangleFanSequence SQ 1 (0066,0028) Line Sequence LineSequence SQ 1 (0066,0029) Primitive Point Index List PrimitivePointIndexList OW 1 RET (0066,002A) Surface Count SurfaceCount UL 1 (0066,002B) Referenced Surface Sequence ReferencedSurfaceSequence SQ 1 (0066,002C) Referenced Surface Number ReferencedSurfaceNumber UL 1 (0066,002D) Segment Surface Generation Algorithm Identification Sequence SegmentSurfaceGenerationAlgorithmIdentificationSequence SQ 1 (0066,002E) Segment Surface Source Instance Sequence SegmentSurfaceSourceInstanceSequence SQ 1 (0066,002F) Algorithm Family Code Sequence AlgorithmFamilyCodeSequence SQ 1 (0066,0030) Algorithm Name Code Sequence AlgorithmNameCodeSequence SQ 1 (0066,0031) Algorithm Version AlgorithmVersion LO 1 (0066,0032) Algorithm Parameters AlgorithmParameters LT 1 (0066,0034) Facet Sequence FacetSequence SQ 1 (0066,0035) Surface Processing Algorithm Identification Sequence SurfaceProcessingAlgorithmIdentificationSequence SQ 1 (0066,0036) Algorithm Name AlgorithmName LO 1 (0066,0037) Recommended Point Radius RecommendedPointRadius FL 1 (0066,0038) Recommended Line Thickness RecommendedLineThickness FL 1 (0066,0040) Long Primitive Point Index List LongPrimitivePointIndexList OL 1 (0066,0041) Long Triangle Point Index List LongTrianglePointIndexList OL 1 (0066,0042) Long Edge Point Index List LongEdgePointIndexList OL 1 (0066,0043) Long Vertex Point Index List LongVertexPointIndexList OL 1 (0066,0101) Track Set Sequence TrackSetSequence SQ 1 (0066,0102) Track Sequence TrackSequence SQ 1 (0066,0103) Recommended Display CIELab Value List RecommendedDisplayCIELabValueList OW 1 (0066,0104) Tracking Algorithm Identification Sequence TrackingAlgorithmIdentificationSequence SQ 1 (0066,0105) Track Set Number TrackSetNumber UL 1 (0066,0106) Track Set Label TrackSetLabel LO 1 (0066,0107) Track Set Description TrackSetDescription UT 1 (0066,0108) Track Set Anatomical Type Code Sequence TrackSetAnatomicalTypeCodeSequence SQ 1 (0066,0121) Measurements Sequence MeasurementsSequence SQ 1 (0066,0124) Track Set Statistics Sequence TrackSetStatisticsSequence SQ 1 (0066,0125) Floating Point Values FloatingPointValues OF 1 (0066,0129) Track Point Index List TrackPointIndexList OL 1 (0066,0130) Track Statistics Sequence TrackStatisticsSequence SQ 1 (0066,0132) Measurement Values Sequence MeasurementValuesSequence SQ 1 (0066,0133) Diffusion Acquisition Code Sequence DiffusionAcquisitionCodeSequence SQ 1 (0066,0134) Diffusion Model Code Sequence DiffusionModelCodeSequence SQ 1 (0068,6210) Implant Size ImplantSize LO 1 (0068,6221) Implant Template Version ImplantTemplateVersion LO 1 (0068,6222) Replaced Implant Template Sequence ReplacedImplantTemplateSequence SQ 1 (0068,6223) Implant Type ImplantType CS 1 (0068,6224) Derivation Implant Template Sequence DerivationImplantTemplateSequence SQ 1 (0068,6225) Original Implant Template Sequence OriginalImplantTemplateSequence SQ 1 (0068,6226) Effective DateTime EffectiveDateTime DT 1 (0068,6230) Implant Target Anatomy Sequence ImplantTargetAnatomySequence SQ 1 (0068,6260) Information From Manufacturer Sequence InformationFromManufacturerSequence SQ 1 (0068,6265) Notification From Manufacturer Sequence NotificationFromManufacturerSequence SQ 1 (0068,6270) Information Issue DateTime InformationIssueDateTime DT 1 (0068,6280) Information Summary InformationSummary ST 1 (0068,62A0) Implant Regulatory Disapproval Code Sequence ImplantRegulatoryDisapprovalCodeSequence SQ 1 (0068,62A5) Overall Template Spatial Tolerance OverallTemplateSpatialTolerance FD 1 (0068,62C0) HPGL Document Sequence HPGLDocumentSequence SQ 1 (0068,62D0) HPGL Document ID HPGLDocumentID US 1 (0068,62D5) HPGL Document Label HPGLDocumentLabel LO 1 (0068,62E0) View Orientation Code Sequence ViewOrientationCodeSequence SQ 1 (0068,62F0) View Orientation Modifier Code Sequence ViewOrientationModifierCodeSequence SQ 1 (0068,62F2) HPGL Document Scaling HPGLDocumentScaling FD 1 (0068,6300) HPGL Document HPGLDocument OB 1 (0068,6310) HPGL Contour Pen Number HPGLContourPenNumber US 1 (0068,6320) HPGL Pen Sequence HPGLPenSequence SQ 1 (0068,6330) HPGL Pen Number HPGLPenNumber US 1 (0068,6340) HPGL Pen Label HPGLPenLabel LO 1 (0068,6345) HPGL Pen Description HPGLPenDescription ST 1 (0068,6346) Recommended Rotation Point RecommendedRotationPoint FD 2 (0068,6347) Bounding Rectangle BoundingRectangle FD 4 (0068,6350) Implant Template 3D Model Surface Number ImplantTemplate3DModelSurfaceNumber US 1-n (0068,6360) Surface Model Description Sequence SurfaceModelDescriptionSequence SQ 1 (0068,6380) Surface Model Label SurfaceModelLabel LO 1 (0068,6390) Surface Model Scaling Factor SurfaceModelScalingFactor FD 1 (0068,63A0) Materials Code Sequence MaterialsCodeSequence SQ 1 (0068,63A4) Coating Materials Code Sequence CoatingMaterialsCodeSequence SQ 1 (0068,63A8) Implant Type Code Sequence ImplantTypeCodeSequence SQ 1 (0068,63AC) Fixation Method Code Sequence FixationMethodCodeSequence SQ 1 (0068,63B0) Mating Feature Sets Sequence MatingFeatureSetsSequence SQ 1 (0068,63C0) Mating Feature Set ID MatingFeatureSetID US 1 (0068,63D0) Mating Feature Set Label MatingFeatureSetLabel LO 1 (0068,63E0) Mating Feature Sequence MatingFeatureSequence SQ 1 (0068,63F0) Mating Feature ID MatingFeatureID US 1 (0068,6400) Mating Feature Degree of Freedom Sequence MatingFeatureDegreeOfFreedomSequence SQ 1 (0068,6410) Degree of Freedom ID DegreeOfFreedomID US 1 (0068,6420) Degree of Freedom Type DegreeOfFreedomType CS 1 (0068,6430) 2D Mating Feature Coordinates Sequence TwoDMatingFeatureCoordinatesSequence SQ 1 (0068,6440) Referenced HPGL Document ID ReferencedHPGLDocumentID US 1 (0068,6450) 2D Mating Point TwoDMatingPoint FD 2 (0068,6460) 2D Mating Axes TwoDMatingAxes FD 4 (0068,6470) 2D Degree of Freedom Sequence TwoDDegreeOfFreedomSequence SQ 1 (0068,6490) 3D Degree of Freedom Axis ThreeDDegreeOfFreedomAxis FD 3 (0068,64A0) Range of Freedom RangeOfFreedom FD 2 (0068,64C0) 3D Mating Point ThreeDMatingPoint FD 3 (0068,64D0) 3D Mating Axes ThreeDMatingAxes FD 9 (0068,64F0) 2D Degree of Freedom Axis TwoDDegreeOfFreedomAxis FD 3 (0068,6500) Planning Landmark Point Sequence PlanningLandmarkPointSequence SQ 1 (0068,6510) Planning Landmark Line Sequence PlanningLandmarkLineSequence SQ 1 (0068,6520) Planning Landmark Plane Sequence PlanningLandmarkPlaneSequence SQ 1 (0068,6530) Planning Landmark ID PlanningLandmarkID US 1 (0068,6540) Planning Landmark Description PlanningLandmarkDescription LO 1 (0068,6545) Planning Landmark Identification Code Sequence PlanningLandmarkIdentificationCodeSequence SQ 1 (0068,6550) 2D Point Coordinates Sequence TwoDPointCoordinatesSequence SQ 1 (0068,6560) 2D Point Coordinates TwoDPointCoordinates FD 2 (0068,6590) 3D Point Coordinates ThreeDPointCoordinates FD 3 (0068,65A0) 2D Line Coordinates Sequence TwoDLineCoordinatesSequence SQ 1 (0068,65B0) 2D Line Coordinates TwoDLineCoordinates FD 4 (0068,65D0) 3D Line Coordinates ThreeDLineCoordinates FD 6 (0068,65E0) 2D Plane Coordinates Sequence TwoDPlaneCoordinatesSequence SQ 1 (0068,65F0) 2D Plane Intersection TwoDPlaneIntersection FD 4 (0068,6610) 3D Plane Origin ThreeDPlaneOrigin FD 3 (0068,6620) 3D Plane Normal ThreeDPlaneNormal FD 3 (0068,7001) Model Modification ModelModification CS 1 (0068,7002) Model Mirroring ModelMirroring CS 1 (0068,7003) Model Usage Code Sequence ModelUsageCodeSequence SQ 1 (0070,0001) Graphic Annotation Sequence GraphicAnnotationSequence SQ 1 (0070,0002) Graphic Layer GraphicLayer CS 1 (0070,0003) Bounding Box Annotation Units BoundingBoxAnnotationUnits CS 1 (0070,0004) Anchor Point Annotation Units AnchorPointAnnotationUnits CS 1 (0070,0005) Graphic Annotation Units GraphicAnnotationUnits CS 1 (0070,0006) Unformatted Text Value UnformattedTextValue ST 1 (0070,0008) Text Object Sequence TextObjectSequence SQ 1 (0070,0009) Graphic Object Sequence GraphicObjectSequence SQ 1 (0070,0010) Bounding Box Top Left Hand Corner BoundingBoxTopLeftHandCorner FL 2 (0070,0011) Bounding Box Bottom Right Hand Corner BoundingBoxBottomRightHandCorner FL 2 (0070,0012) Bounding Box Text Horizontal Justification BoundingBoxTextHorizontalJustification CS 1 (0070,0014) Anchor Point AnchorPoint FL 2 (0070,0015) Anchor Point Visibility AnchorPointVisibility CS 1 (0070,0020) Graphic Dimensions GraphicDimensions US 1 (0070,0021) Number of Graphic Points NumberOfGraphicPoints US 1 (0070,0022) Graphic Data GraphicData FL 2-n (0070,0023) Graphic Type GraphicType CS 1 (0070,0024) Graphic Filled GraphicFilled CS 1 (0070,0040) Image Rotation (Retired) ImageRotationRetired IS 1 RET (0070,0041) Image Horizontal Flip ImageHorizontalFlip CS 1 (0070,0042) Image Rotation ImageRotation US 1 (0070,0050) Displayed Area Top Left Hand Corner (Trial) DisplayedAreaTopLeftHandCornerTrial US 2 RET (0070,0051) Displayed Area Bottom Right Hand Corner (Trial) DisplayedAreaBottomRightHandCornerTrial US 2 RET (0070,0052) Displayed Area Top Left Hand Corner DisplayedAreaTopLeftHandCorner SL 2 (0070,0053) Displayed Area Bottom Right Hand Corner DisplayedAreaBottomRightHandCorner SL 2 (0070,005A) Displayed Area Selection Sequence DisplayedAreaSelectionSequence SQ 1 (0070,0060) Graphic Layer Sequence GraphicLayerSequence SQ 1 (0070,0062) Graphic Layer Order GraphicLayerOrder IS 1 (0070,0066) Graphic Layer Recommended Display Grayscale Value GraphicLayerRecommendedDisplayGrayscaleValue US 1 (0070,0067) Graphic Layer Recommended Display RGB Value GraphicLayerRecommendedDisplayRGBValue US 3 RET (0070,0068) Graphic Layer Description GraphicLayerDescription LO 1 (0070,0080) Content Label ContentLabel CS 1 (0070,0081) Content Description ContentDescription LO 1 (0070,0082) Presentation Creation Date PresentationCreationDate DA 1 (0070,0083) Presentation Creation Time PresentationCreationTime TM 1 (0070,0084) Content Creator's Name ContentCreatorName PN 1 (0070,0086) Content Creator's Identification Code Sequence ContentCreatorIdentificationCodeSequence SQ 1 (0070,0087) Alternate Content Description Sequence AlternateContentDescriptionSequence SQ 1 (0070,0100) Presentation Size Mode PresentationSizeMode CS 1 (0070,0101) Presentation Pixel Spacing PresentationPixelSpacing DS 2 (0070,0102) Presentation Pixel Aspect Ratio PresentationPixelAspectRatio IS 2 (0070,0103) Presentation Pixel Magnification Ratio PresentationPixelMagnificationRatio FL 1 (0070,0207) Graphic Group Label GraphicGroupLabel LO 1 (0070,0208) Graphic Group Description GraphicGroupDescription ST 1 (0070,0209) Compound Graphic Sequence CompoundGraphicSequence SQ 1 (0070,0226) Compound Graphic Instance ID CompoundGraphicInstanceID UL 1 (0070,0227) Font Name FontName LO 1 (0070,0228) Font Name Type FontNameType CS 1 (0070,0229) CSS Font Name CSSFontName LO 1 (0070,0230) Rotation Angle RotationAngle FD 1 (0070,0231) Text Style Sequence TextStyleSequence SQ 1 (0070,0232) Line Style Sequence LineStyleSequence SQ 1 (0070,0233) Fill Style Sequence FillStyleSequence SQ 1 (0070,0234) Graphic Group Sequence GraphicGroupSequence SQ 1 (0070,0241) Text Color CIELab Value TextColorCIELabValue US 3 (0070,0242) Horizontal Alignment HorizontalAlignment CS 1 (0070,0243) Vertical Alignment VerticalAlignment CS 1 (0070,0244) Shadow Style ShadowStyle CS 1 (0070,0245) Shadow Offset X ShadowOffsetX FL 1 (0070,0246) Shadow Offset Y ShadowOffsetY FL 1 (0070,0247) Shadow Color CIELab Value ShadowColorCIELabValue US 3 (0070,0248) Underlined Underlined CS 1 (0070,0249) Bold Bold CS 1 (0070,0250) Italic Italic CS 1 (0070,0251) Pattern On Color CIELab Value PatternOnColorCIELabValue US 3 (0070,0252) Pattern Off Color CIELab Value PatternOffColorCIELabValue US 3 (0070,0253) Line Thickness LineThickness FL 1 (0070,0254) Line Dashing Style LineDashingStyle CS 1 (0070,0255) Line Pattern LinePattern UL 1 (0070,0256) Fill Pattern FillPattern OB 1 (0070,0257) Fill Mode FillMode CS 1 (0070,0258) Shadow Opacity ShadowOpacity FL 1 (0070,0261) Gap Length GapLength FL 1 (0070,0262) Diameter of Visibility DiameterOfVisibility FL 1 (0070,0273) Rotation Point RotationPoint FL 2 (0070,0274) Tick Alignment TickAlignment CS 1 (0070,0278) Show Tick Label ShowTickLabel CS 1 (0070,0279) Tick Label Alignment TickLabelAlignment CS 1 (0070,0282) Compound Graphic Units CompoundGraphicUnits CS 1 (0070,0284) Pattern On Opacity PatternOnOpacity FL 1 (0070,0285) Pattern Off Opacity PatternOffOpacity FL 1 (0070,0287) Major Ticks Sequence MajorTicksSequence SQ 1 (0070,0288) Tick Position TickPosition FL 1 (0070,0289) Tick Label TickLabel SH 1 (0070,0294) Compound Graphic Type CompoundGraphicType CS 1 (0070,0295) Graphic Group ID GraphicGroupID UL 1 (0070,0306) Shape Type ShapeType CS 1 (0070,0308) Registration Sequence RegistrationSequence SQ 1 (0070,0309) Matrix Registration Sequence MatrixRegistrationSequence SQ 1 (0070,030A) Matrix Sequence MatrixSequence SQ 1 (0070,030B) Frame of Reference to Displayed Coordinate System Transformation Matrix FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix FD 16 (0070,030C) Frame of Reference Transformation Matrix Type FrameOfReferenceTransformationMatrixType CS 1 (0070,030D) Registration Type Code Sequence RegistrationTypeCodeSequence SQ 1 (0070,030F) Fiducial Description FiducialDescription ST 1 (0070,0310) Fiducial Identifier FiducialIdentifier SH 1 (0070,0311) Fiducial Identifier Code Sequence FiducialIdentifierCodeSequence SQ 1 (0070,0312) Contour Uncertainty Radius ContourUncertaintyRadius FD 1 (0070,0314) Used Fiducials Sequence UsedFiducialsSequence SQ 1 (0070,0318) Graphic Coordinates Data Sequence GraphicCoordinatesDataSequence SQ 1 (0070,031A) Fiducial UID FiducialUID UI 1 (0070,031B) Referenced Fiducial UID ReferencedFiducialUID UI 1 (0070,031C) Fiducial Set Sequence FiducialSetSequence SQ 1 (0070,031E) Fiducial Sequence FiducialSequence SQ 1 (0070,031F) Fiducials Property Category Code Sequence FiducialsPropertyCategoryCodeSequence SQ 1 (0070,0401) Graphic Layer Recommended Display CIELab Value GraphicLayerRecommendedDisplayCIELabValue US 3 (0070,0402) Blending Sequence BlendingSequence SQ 1 (0070,0403) Relative Opacity RelativeOpacity FL 1 (0070,0404) Referenced Spatial Registration Sequence ReferencedSpatialRegistrationSequence SQ 1 (0070,0405) Blending Position BlendingPosition CS 1 (0070,1101) Presentation Display Collection UID PresentationDisplayCollectionUID UI 1 (0070,1102) Presentation Sequence Collection UID PresentationSequenceCollectionUID UI 1 (0070,1103) Presentation Sequence Position Index PresentationSequencePositionIndex US 1 (0070,1104) Rendered Image Reference Sequence RenderedImageReferenceSequence SQ 1 (0070,1201) Volumetric Presentation State Input Sequence VolumetricPresentationStateInputSequence SQ 1 (0070,1202) Presentation Input Type PresentationInputType CS 1 (0070,1203) Input Sequence Position Index InputSequencePositionIndex US 1 (0070,1204) Crop Crop CS 1 (0070,1205) Cropping Specification Index CroppingSpecificationIndex US 1-n (0070,1206) Compositing Method CompositingMethod CS 1 RET (0070,1207) Volumetric Presentation Input Number VolumetricPresentationInputNumber US 1 (0070,1208) Image Volume Geometry ImageVolumeGeometry CS 1 (0070,1209) Volumetric Presentation Input Set UID VolumetricPresentationInputSetUID UI 1 (0070,120A) Volumetric Presentation Input Set Sequence VolumetricPresentationInputSetSequence SQ 1 (0070,120B) Global Crop GlobalCrop CS 1 (0070,120C) Global Cropping Specification Index GlobalCroppingSpecificationIndex US 1-n (0070,120D) Rendering Method RenderingMethod CS 1 (0070,1301) Volume Cropping Sequence VolumeCroppingSequence SQ 1 (0070,1302) Volume Cropping Method VolumeCroppingMethod CS 1 (0070,1303) Bounding Box Crop BoundingBoxCrop FD 6 (0070,1304) Oblique Cropping Plane Sequence ObliqueCroppingPlaneSequence SQ 1 (0070,1305) Plane Plane FD 4 (0070,1306) Plane Normal PlaneNormal FD 3 (0070,1309) Cropping Specification Number CroppingSpecificationNumber US 1 (0070,1501) Multi-Planar Reconstruction Style MultiPlanarReconstructionStyle CS 1 (0070,1502) MPR Thickness Type MPRThicknessType CS 1 (0070,1503) MPR Slab Thickness MPRSlabThickness FD 1 (0070,1505) MPR Top Left Hand Corner MPRTopLeftHandCorner FD 3 (0070,1507) MPR View Width Direction MPRViewWidthDirection FD 3 (0070,1508) MPR View Width MPRViewWidth FD 1 (0070,150C) Number of Volumetric Curve Points NumberOfVolumetricCurvePoints UL 1 (0070,150D) Volumetric Curve Points VolumetricCurvePoints OD 1 (0070,1511) MPR View Height Direction MPRViewHeightDirection FD 3 (0070,1512) MPR View Height MPRViewHeight FD 1 (0070,1602) Render Projection RenderProjection CS 1 (0070,1603) Viewpoint Position ViewpointPosition FD 3 (0070,1604) Viewpoint LookAt Point ViewpointLookAtPoint FD 3 (0070,1605) Viewpoint Up Direction ViewpointUpDirection FD 3 (0070,1606) Render Field of View RenderFieldOfView FD 6 (0070,1607) Sampling Step Size SamplingStepSize FD 1 (0070,1701) Shading Style ShadingStyle CS 1 (0070,1702) Ambient Reflection Intensity AmbientReflectionIntensity FD 1 (0070,1703) Light Direction LightDirection FD 3 (0070,1704) Diffuse Reflection Intensity DiffuseReflectionIntensity FD 1 (0070,1705) Specular Reflection Intensity SpecularReflectionIntensity FD 1 (0070,1706) Shininess Shininess FD 1 (0070,1801) Presentation State Classification Component Sequence PresentationStateClassificationComponentSequence SQ 1 (0070,1802) Component Type ComponentType CS 1 (0070,1803) Component Input Sequence ComponentInputSequence SQ 1 (0070,1804) Volumetric Presentation Input Index VolumetricPresentationInputIndex US 1 (0070,1805) Presentation State Compositor Component Sequence PresentationStateCompositorComponentSequence SQ 1 (0070,1806) Weighting Transfer Function Sequence WeightingTransferFunctionSequence SQ 1 (0070,1807) Weighting Lookup Table Descriptor WeightingLookupTableDescriptor US 3 (0070,1808) Weighting Lookup Table Data WeightingLookupTableData OB 1 (0070,1901) Volumetric Annotation Sequence VolumetricAnnotationSequence SQ 1 (0070,1903) Referenced Structured Context Sequence ReferencedStructuredContextSequence SQ 1 (0070,1904) Referenced Content Item ReferencedContentItem UI 1 (0070,1905) Volumetric Presentation Input Annotation Sequence VolumetricPresentationInputAnnotationSequence SQ 1 (0070,1907) Annotation Clipping AnnotationClipping CS 1 (0070,1A01) Presentation Animation Style PresentationAnimationStyle CS 1 (0070,1A03) Recommended Animation Rate RecommendedAnimationRate FD 1 (0070,1A04) Animation Curve Sequence AnimationCurveSequence SQ 1 (0070,1A05) Animation Step Size AnimationStepSize FD 1 (0070,1A06) Swivel Range SwivelRange FD 1 (0070,1A07) Volumetric Curve Up Directions VolumetricCurveUpDirections OD 1 (0070,1A08) Volume Stream Sequence VolumeStreamSequence SQ 1 (0070,1A09) RGBA Transfer Function Description RGBATransferFunctionDescription LO 1 (0070,1B01) Advanced Blending Sequence AdvancedBlendingSequence SQ 1 (0070,1B02) Blending Input Number BlendingInputNumber US 1 (0070,1B03) Blending Display Input Sequence BlendingDisplayInputSequence SQ 1 (0070,1B04) Blending Display Sequence BlendingDisplaySequence SQ 1 (0070,1B06) Blending Mode BlendingMode CS 1 (0070,1B07) Time Series Blending TimeSeriesBlending CS 1 (0070,1B08) Geometry for Display GeometryForDisplay CS 1 (0070,1B11) Threshold Sequence ThresholdSequence SQ 1 (0070,1B12) Threshold Value Sequence ThresholdValueSequence SQ 1 (0070,1B13) Threshold Type ThresholdType CS 1 (0070,1B14) Threshold Value ThresholdValue FD 1 (0072,0002) Hanging Protocol Name HangingProtocolName SH 1 (0072,0004) Hanging Protocol Description HangingProtocolDescription LO 1 (0072,0006) Hanging Protocol Level HangingProtocolLevel CS 1 (0072,0008) Hanging Protocol Creator HangingProtocolCreator LO 1 (0072,000A) Hanging Protocol Creation DateTime HangingProtocolCreationDateTime DT 1 (0072,000C) Hanging Protocol Definition Sequence HangingProtocolDefinitionSequence SQ 1 (0072,000E) Hanging Protocol User Identification Code Sequence HangingProtocolUserIdentificationCodeSequence SQ 1 (0072,0010) Hanging Protocol User Group Name HangingProtocolUserGroupName LO 1 (0072,0012) Source Hanging Protocol Sequence SourceHangingProtocolSequence SQ 1 (0072,0014) Number of Priors Referenced NumberOfPriorsReferenced US 1 (0072,0020) Image Sets Sequence ImageSetsSequence SQ 1 (0072,0022) Image Set Selector Sequence ImageSetSelectorSequence SQ 1 (0072,0024) Image Set Selector Usage Flag ImageSetSelectorUsageFlag CS 1 (0072,0026) Selector Attribute SelectorAttribute AT 1 (0072,0028) Selector Value Number SelectorValueNumber US 1 (0072,0030) Time Based Image Sets Sequence TimeBasedImageSetsSequence SQ 1 (0072,0032) Image Set Number ImageSetNumber US 1 (0072,0034) Image Set Selector Category ImageSetSelectorCategory CS 1 (0072,0038) Relative Time RelativeTime US 2 (0072,003A) Relative Time Units RelativeTimeUnits CS 1 (0072,003C) Abstract Prior Value AbstractPriorValue SS 2 (0072,003E) Abstract Prior Code Sequence AbstractPriorCodeSequence SQ 1 (0072,0040) Image Set Label ImageSetLabel LO 1 (0072,0050) Selector Attribute VR SelectorAttributeVR CS 1 (0072,0052) Selector Sequence Pointer SelectorSequencePointer AT 1-n (0072,0054) Selector Sequence Pointer Private Creator SelectorSequencePointerPrivateCreator LO 1-n (0072,0056) Selector Attribute Private Creator SelectorAttributePrivateCreator LO 1 (0072,005E) Selector AE Value SelectorAEValue AE 1-n (0072,005F) Selector AS Value SelectorASValue AS 1-n (0072,0060) Selector AT Value SelectorATValue AT 1-n (0072,0061) Selector DA Value SelectorDAValue DA 1-n (0072,0062) Selector CS Value SelectorCSValue CS 1-n (0072,0063) Selector DT Value SelectorDTValue DT 1-n (0072,0064) Selector IS Value SelectorISValue IS 1-n (0072,0065) Selector OB Value SelectorOBValue OB 1 (0072,0066) Selector LO Value SelectorLOValue LO 1-n (0072,0067) Selector OF Value SelectorOFValue OF 1 (0072,0068) Selector LT Value SelectorLTValue LT 1 (0072,0069) Selector OW Value SelectorOWValue OW 1 (0072,006A) Selector PN Value SelectorPNValue PN 1-n (0072,006B) Selector TM Value SelectorTMValue TM 1-n (0072,006C) Selector SH Value SelectorSHValue SH 1-n (0072,006D) Selector UN Value SelectorUNValue UN 1 (0072,006E) Selector ST Value SelectorSTValue ST 1 (0072,006F) Selector UC Value SelectorUCValue UC 1-n (0072,0070) Selector UT Value SelectorUTValue UT 1 (0072,0071) Selector UR Value SelectorURValue UR 1 (0072,0072) Selector DS Value SelectorDSValue DS 1-n (0072,0073) Selector OD Value SelectorODValue OD 1 (0072,0074) Selector FD Value SelectorFDValue FD 1-n (0072,0075) Selector OL Value SelectorOLValue OL 1 (0072,0076) Selector FL Value SelectorFLValue FL 1-n (0072,0078) Selector UL Value SelectorULValue UL 1-n (0072,007A) Selector US Value SelectorUSValue US 1-n (0072,007C) Selector SL Value SelectorSLValue SL 1-n (0072,007E) Selector SS Value SelectorSSValue SS 1-n (0072,007F) Selector UI Value SelectorUIValue UI 1-n (0072,0080) Selector Code Sequence Value SelectorCodeSequenceValue SQ 1 (0072,0100) Number of Screens NumberOfScreens US 1 (0072,0102) Nominal Screen Definition Sequence NominalScreenDefinitionSequence SQ 1 (0072,0104) Number of Vertical Pixels NumberOfVerticalPixels US 1 (0072,0106) Number of Horizontal Pixels NumberOfHorizontalPixels US 1 (0072,0108) Display Environment Spatial Position DisplayEnvironmentSpatialPosition FD 4 (0072,010A) Screen Minimum Grayscale Bit Depth ScreenMinimumGrayscaleBitDepth US 1 (0072,010C) Screen Minimum Color Bit Depth ScreenMinimumColorBitDepth US 1 (0072,010E) Application Maximum Repaint Time ApplicationMaximumRepaintTime US 1 (0072,0200) Display Sets Sequence DisplaySetsSequence SQ 1 (0072,0202) Display Set Number DisplaySetNumber US 1 (0072,0203) Display Set Label DisplaySetLabel LO 1 (0072,0204) Display Set Presentation Group DisplaySetPresentationGroup US 1 (0072,0206) Display Set Presentation Group Description DisplaySetPresentationGroupDescription LO 1 (0072,0208) Partial Data Display Handling PartialDataDisplayHandling CS 1 (0072,0210) Synchronized Scrolling Sequence SynchronizedScrollingSequence SQ 1 (0072,0212) Display Set Scrolling Group DisplaySetScrollingGroup US 2-n (0072,0214) Navigation Indicator Sequence NavigationIndicatorSequence SQ 1 (0072,0216) Navigation Display Set NavigationDisplaySet US 1 (0072,0218) Reference Display Sets ReferenceDisplaySets US 1-n (0072,0300) Image Boxes Sequence ImageBoxesSequence SQ 1 (0072,0302) Image Box Number ImageBoxNumber US 1 (0072,0304) Image Box Layout Type ImageBoxLayoutType CS 1 (0072,0306) Image Box Tile Horizontal Dimension ImageBoxTileHorizontalDimension US 1 (0072,0308) Image Box Tile Vertical Dimension ImageBoxTileVerticalDimension US 1 (0072,0310) Image Box Scroll Direction ImageBoxScrollDirection CS 1 (0072,0312) Image Box Small Scroll Type ImageBoxSmallScrollType CS 1 (0072,0314) Image Box Small Scroll Amount ImageBoxSmallScrollAmount US 1 (0072,0316) Image Box Large Scroll Type ImageBoxLargeScrollType CS 1 (0072,0318) Image Box Large Scroll Amount ImageBoxLargeScrollAmount US 1 (0072,0320) Image Box Overlap Priority ImageBoxOverlapPriority US 1 (0072,0330) Cine Relative to Real-Time CineRelativeToRealTime FD 1 (0072,0400) Filter Operations Sequence FilterOperationsSequence SQ 1 (0072,0402) Filter-by Category FilterByCategory CS 1 (0072,0404) Filter-by Attribute Presence FilterByAttributePresence CS 1 (0072,0406) Filter-by Operator FilterByOperator CS 1 (0072,0420) Structured Display Background CIELab Value StructuredDisplayBackgroundCIELabValue US 3 (0072,0421) Empty Image Box CIELab Value EmptyImageBoxCIELabValue US 3 (0072,0422) Structured Display Image Box Sequence StructuredDisplayImageBoxSequence SQ 1 (0072,0424) Structured Display Text Box Sequence StructuredDisplayTextBoxSequence SQ 1 (0072,0427) Referenced First Frame Sequence ReferencedFirstFrameSequence SQ 1 (0072,0430) Image Box Synchronization Sequence ImageBoxSynchronizationSequence SQ 1 (0072,0432) Synchronized Image Box List SynchronizedImageBoxList US 2-n (0072,0434) Type of Synchronization TypeOfSynchronization CS 1 (0072,0500) Blending Operation Type BlendingOperationType CS 1 (0072,0510) Reformatting Operation Type ReformattingOperationType CS 1 (0072,0512) Reformatting Thickness ReformattingThickness FD 1 (0072,0514) Reformatting Interval ReformattingInterval FD 1 (0072,0516) Reformatting Operation Initial View Direction ReformattingOperationInitialViewDirection CS 1 (0072,0520) 3D Rendering Type ThreeDRenderingType CS 1-n (0072,0600) Sorting Operations Sequence SortingOperationsSequence SQ 1 (0072,0602) Sort-by Category SortByCategory CS 1 (0072,0604) Sorting Direction SortingDirection CS 1 (0072,0700) Display Set Patient Orientation DisplaySetPatientOrientation CS 2 (0072,0702) VOI Type VOIType CS 1 (0072,0704) Pseudo-Color Type PseudoColorType CS 1 (0072,0705) Pseudo-Color Palette Instance Reference Sequence PseudoColorPaletteInstanceReferenceSequence SQ 1 (0072,0706) Show Grayscale Inverted ShowGrayscaleInverted CS 1 (0072,0710) Show Image True Size Flag ShowImageTrueSizeFlag CS 1 (0072,0712) Show Graphic Annotation Flag ShowGraphicAnnotationFlag CS 1 (0072,0714) Show Patient Demographics Flag ShowPatientDemographicsFlag CS 1 (0072,0716) Show Acquisition Techniques Flag ShowAcquisitionTechniquesFlag CS 1 (0072,0717) Display Set Horizontal Justification DisplaySetHorizontalJustification CS 1 (0072,0718) Display Set Vertical Justification DisplaySetVerticalJustification CS 1 (0074,0120) Continuation Start Meterset ContinuationStartMeterset FD 1 (0074,0121) Continuation End Meterset ContinuationEndMeterset FD 1 (0074,1000) Procedure Step State ProcedureStepState CS 1 (0074,1002) Procedure Step Progress Information Sequence ProcedureStepProgressInformationSequence SQ 1 (0074,1004) Procedure Step Progress ProcedureStepProgress DS 1 (0074,1006) Procedure Step Progress Description ProcedureStepProgressDescription ST 1 (0074,1007) Procedure Step Progress Parameters Sequence ProcedureStepProgressParametersSequence SQ 1 (0074,1008) Procedure Step Communications URI Sequence ProcedureStepCommunicationsURISequence SQ 1 (0074,100A) Contact URI ContactURI UR 1 (0074,100C) Contact Display Name ContactDisplayName LO 1 (0074,100E) Procedure Step Discontinuation Reason Code Sequence ProcedureStepDiscontinuationReasonCodeSequence SQ 1 (0074,1020) Beam Task Sequence BeamTaskSequence SQ 1 (0074,1022) Beam Task Type BeamTaskType CS 1 (0074,1024) Beam Order Index (Trial) BeamOrderIndexTrial IS 1 RET (0074,1025) Autosequence Flag AutosequenceFlag CS 1 (0074,1026) Table Top Vertical Adjusted Position TableTopVerticalAdjustedPosition FD 1 (0074,1027) Table Top Longitudinal Adjusted Position TableTopLongitudinalAdjustedPosition FD 1 (0074,1028) Table Top Lateral Adjusted Position TableTopLateralAdjustedPosition FD 1 (0074,102A) Patient Support Adjusted Angle PatientSupportAdjustedAngle FD 1 (0074,102B) Table Top Eccentric Adjusted Angle TableTopEccentricAdjustedAngle FD 1 (0074,102C) Table Top Pitch Adjusted Angle TableTopPitchAdjustedAngle FD 1 (0074,102D) Table Top Roll Adjusted Angle TableTopRollAdjustedAngle FD 1 (0074,1030) Delivery Verification Image Sequence DeliveryVerificationImageSequence SQ 1 (0074,1032) Verification Image Timing VerificationImageTiming CS 1 (0074,1034) Double Exposure Flag DoubleExposureFlag CS 1 (0074,1036) Double Exposure Ordering DoubleExposureOrdering CS 1 (0074,1038) Double Exposure Meterset (Trial) DoubleExposureMetersetTrial DS 1 RET (0074,103A) Double Exposure Field Delta (Trial) DoubleExposureFieldDeltaTrial DS 4 RET (0074,1040) Related Reference RT Image Sequence RelatedReferenceRTImageSequence SQ 1 (0074,1042) General Machine Verification Sequence GeneralMachineVerificationSequence SQ 1 (0074,1044) Conventional Machine Verification Sequence ConventionalMachineVerificationSequence SQ 1 (0074,1046) Ion Machine Verification Sequence IonMachineVerificationSequence SQ 1 (0074,1048) Failed Attributes Sequence FailedAttributesSequence SQ 1 (0074,104A) Overridden Attributes Sequence OverriddenAttributesSequence SQ 1 (0074,104C) Conventional Control Point Verification Sequence ConventionalControlPointVerificationSequence SQ 1 (0074,104E) Ion Control Point Verification Sequence IonControlPointVerificationSequence SQ 1 (0074,1050) Attribute Occurrence Sequence AttributeOccurrenceSequence SQ 1 (0074,1052) Attribute Occurrence Pointer AttributeOccurrencePointer AT 1 (0074,1054) Attribute Item Selector AttributeItemSelector UL 1 (0074,1056) Attribute Occurrence Private Creator AttributeOccurrencePrivateCreator LO 1 (0074,1057) Selector Sequence Pointer Items SelectorSequencePointerItems IS 1-n (0074,1200) Scheduled Procedure Step Priority ScheduledProcedureStepPriority CS 1 (0074,1202) Worklist Label WorklistLabel LO 1 (0074,1204) Procedure Step Label ProcedureStepLabel LO 1 (0074,1210) Scheduled Processing Parameters Sequence ScheduledProcessingParametersSequence SQ 1 (0074,1212) Performed Processing Parameters Sequence PerformedProcessingParametersSequence SQ 1 (0074,1216) Unified Procedure Step Performed Procedure Sequence UnifiedProcedureStepPerformedProcedureSequence SQ 1 (0074,1220) Related Procedure Step Sequence RelatedProcedureStepSequence SQ 1 RET (0074,1222) Procedure Step Relationship Type ProcedureStepRelationshipType LO 1 RET (0074,1224) Replaced Procedure Step Sequence ReplacedProcedureStepSequence SQ 1 (0074,1230) Deletion Lock DeletionLock LO 1 (0074,1234) Receiving AE ReceivingAE AE 1 (0074,1236) Requesting AE RequestingAE AE 1 (0074,1238) Reason for Cancellation ReasonForCancellation LT 1 (0074,1242) SCP Status SCPStatus CS 1 (0074,1244) Subscription List Status SubscriptionListStatus CS 1 (0074,1246) Unified Procedure Step List Status UnifiedProcedureStepListStatus CS 1 (0074,1324) Beam Order Index BeamOrderIndex UL 1 (0074,1338) Double Exposure Meterset DoubleExposureMeterset FD 1 (0074,133A) Double Exposure Field Delta DoubleExposureFieldDelta FD 4 (0074,1401) Brachy Task Sequence BrachyTaskSequence SQ 1 (0074,1402) Continuation Start Total Reference Air Kerma ContinuationStartTotalReferenceAirKerma DS 1 (0074,1403) Continuation End Total Reference Air Kerma ContinuationEndTotalReferenceAirKerma DS 1 (0074,1404) Continuation Pulse Number ContinuationPulseNumber IS 1 (0074,1405) Channel Delivery Order Sequence ChannelDeliveryOrderSequence SQ 1 (0074,1406) Referenced Channel Number ReferencedChannelNumber IS 1 (0074,1407) Start Cumulative Time Weight StartCumulativeTimeWeight DS 1 (0074,1408) End Cumulative Time Weight EndCumulativeTimeWeight DS 1 (0074,1409) Omitted Channel Sequence OmittedChannelSequence SQ 1 (0074,140A) Reason for Channel Omission ReasonForChannelOmission CS 1 (0074,140B) Reason for Channel Omission Description ReasonForChannelOmissionDescription LO 1 (0074,140C) Channel Delivery Order Index ChannelDeliveryOrderIndex IS 1 (0074,140D) Channel Delivery Continuation Sequence ChannelDeliveryContinuationSequence SQ 1 (0074,140E) Omitted Application Setup Sequence OmittedApplicationSetupSequence SQ 1 (0076,0001) Implant Assembly Template Name ImplantAssemblyTemplateName LO 1 (0076,0003) Implant Assembly Template Issuer ImplantAssemblyTemplateIssuer LO 1 (0076,0006) Implant Assembly Template Version ImplantAssemblyTemplateVersion LO 1 (0076,0008) Replaced Implant Assembly Template Sequence ReplacedImplantAssemblyTemplateSequence SQ 1 (0076,000A) Implant Assembly Template Type ImplantAssemblyTemplateType CS 1 (0076,000C) Original Implant Assembly Template Sequence OriginalImplantAssemblyTemplateSequence SQ 1 (0076,000E) Derivation Implant Assembly Template Sequence DerivationImplantAssemblyTemplateSequence SQ 1 (0076,0010) Implant Assembly Template Target Anatomy Sequence ImplantAssemblyTemplateTargetAnatomySequence SQ 1 (0076,0020) Procedure Type Code Sequence ProcedureTypeCodeSequence SQ 1 (0076,0030) Surgical Technique SurgicalTechnique LO 1 (0076,0032) Component Types Sequence ComponentTypesSequence SQ 1 (0076,0034) Component Type Code Sequence ComponentTypeCodeSequence SQ 1 (0076,0036) Exclusive Component Type ExclusiveComponentType CS 1 (0076,0038) Mandatory Component Type MandatoryComponentType CS 1 (0076,0040) Component Sequence ComponentSequence SQ 1 (0076,0055) Component ID ComponentID US 1 (0076,0060) Component Assembly Sequence ComponentAssemblySequence SQ 1 (0076,0070) Component 1 Referenced ID Component1ReferencedID US 1 (0076,0080) Component 1 Referenced Mating Feature Set ID Component1ReferencedMatingFeatureSetID US 1 (0076,0090) Component 1 Referenced Mating Feature ID Component1ReferencedMatingFeatureID US 1 (0076,00A0) Component 2 Referenced ID Component2ReferencedID US 1 (0076,00B0) Component 2 Referenced Mating Feature Set ID Component2ReferencedMatingFeatureSetID US 1 (0076,00C0) Component 2 Referenced Mating Feature ID Component2ReferencedMatingFeatureID US 1 (0078,0001) Implant Template Group Name ImplantTemplateGroupName LO 1 (0078,0010) Implant Template Group Description ImplantTemplateGroupDescription ST 1 (0078,0020) Implant Template Group Issuer ImplantTemplateGroupIssuer LO 1 (0078,0024) Implant Template Group Version ImplantTemplateGroupVersion LO 1 (0078,0026) Replaced Implant Template Group Sequence ReplacedImplantTemplateGroupSequence SQ 1 (0078,0028) Implant Template Group Target Anatomy Sequence ImplantTemplateGroupTargetAnatomySequence SQ 1 (0078,002A) Implant Template Group Members Sequence ImplantTemplateGroupMembersSequence SQ 1 (0078,002E) Implant Template Group Member ID ImplantTemplateGroupMemberID US 1 (0078,0050) 3D Implant Template Group Member Matching Point ThreeDImplantTemplateGroupMemberMatchingPoint FD 3 (0078,0060) 3D Implant Template Group Member Matching Axes ThreeDImplantTemplateGroupMemberMatchingAxes FD 9 (0078,0070) Implant Template Group Member Matching 2D Coordinates Sequence ImplantTemplateGroupMemberMatching2DCoordinatesSequence SQ 1 (0078,0090) 2D Implant Template Group Member Matching Point TwoDImplantTemplateGroupMemberMatchingPoint FD 2 (0078,00A0) 2D Implant Template Group Member Matching Axes TwoDImplantTemplateGroupMemberMatchingAxes FD 4 (0078,00B0) Implant Template Group Variation Dimension Sequence ImplantTemplateGroupVariationDimensionSequence SQ 1 (0078,00B2) Implant Template Group Variation Dimension Name ImplantTemplateGroupVariationDimensionName LO 1 (0078,00B4) Implant Template Group Variation Dimension Rank Sequence ImplantTemplateGroupVariationDimensionRankSequence SQ 1 (0078,00B6) Referenced Implant Template Group Member ID ReferencedImplantTemplateGroupMemberID US 1 (0078,00B8) Implant Template Group Variation Dimension Rank ImplantTemplateGroupVariationDimensionRank US 1 (0080,0001) Surface Scan Acquisition Type Code Sequence SurfaceScanAcquisitionTypeCodeSequence SQ 1 (0080,0002) Surface Scan Mode Code Sequence SurfaceScanModeCodeSequence SQ 1 (0080,0003) Registration Method Code Sequence RegistrationMethodCodeSequence SQ 1 (0080,0004) Shot Duration Time ShotDurationTime FD 1 (0080,0005) Shot Offset Time ShotOffsetTime FD 1 (0080,0006) Surface Point Presentation Value Data SurfacePointPresentationValueData US 1-n (0080,0007) Surface Point Color CIELab Value Data SurfacePointColorCIELabValueData US 3-3n (0080,0008) UV Mapping Sequence UVMappingSequence SQ 1 (0080,0009) Texture Label TextureLabel SH 1 (0080,0010) U Value Data UValueData OF 1 (0080,0011) V Value Data VValueData OF 1 (0080,0012) Referenced Texture Sequence ReferencedTextureSequence SQ 1 (0080,0013) Referenced Surface Data Sequence ReferencedSurfaceDataSequence SQ 1 (0082,0001) Assessment Summary AssessmentSummary CS 1 (0082,0003) Assessment Summary Description AssessmentSummaryDescription UT 1 (0082,0004) Assessed SOP Instance Sequence AssessedSOPInstanceSequence SQ 1 (0082,0005) Referenced Comparison SOP Instance Sequence ReferencedComparisonSOPInstanceSequence SQ 1 (0082,0006) Number of Assessment Observations NumberOfAssessmentObservations UL 1 (0082,0007) Assessment Observations Sequence AssessmentObservationsSequence SQ 1 (0082,0008) Observation Significance ObservationSignificance CS 1 (0082,000A) Observation Description ObservationDescription UT 1 (0082,000C) Structured Constraint Observation Sequence StructuredConstraintObservationSequence SQ 1 (0082,0010) Assessed Attribute Value Sequence AssessedAttributeValueSequence SQ 1 (0082,0016) Assessment Set ID AssessmentSetID LO 1 (0082,0017) Assessment Requester Sequence AssessmentRequesterSequence SQ 1 (0082,0018) Selector Attribute Name SelectorAttributeName LO 1 (0082,0019) Selector Attribute Keyword SelectorAttributeKeyword LO 1 (0082,0021) Assessment Type Code Sequence AssessmentTypeCodeSequence SQ 1 (0082,0022) Observation Basis Code Sequence ObservationBasisCodeSequence SQ 1 (0082,0023) Assessment Label AssessmentLabel LO 1 (0082,0032) Constraint Type ConstraintType CS 1 (0082,0033) Specification Selection Guidance SpecificationSelectionGuidance UT 1 (0082,0034) Constraint Value Sequence ConstraintValueSequence SQ 1 (0082,0035) Recommended Default Value Sequence RecommendedDefaultValueSequence SQ 1 (0082,0036) Constraint Violation Significance ConstraintViolationSignificance CS 1 (0082,0037) Constraint Violation Condition ConstraintViolationCondition UT 1 (0082,0038) Modifiable Constraint Flag ModifiableConstraintFlag CS 1 (0088,0130) Storage Media File-set ID StorageMediaFileSetID SH 1 (0088,0140) Storage Media File-set UID StorageMediaFileSetUID UI 1 (0088,0200) Icon Image Sequence IconImageSequence SQ 1 (0088,0904) Topic Title TopicTitle LO 1 RET (0088,0906) Topic Subject TopicSubject ST 1 RET (0088,0910) Topic Author TopicAuthor LO 1 RET (0088,0912) Topic Keywords TopicKeywords LO 1-32 RET (0100,0410) SOP Instance Status SOPInstanceStatus CS 1 (0100,0420) SOP Authorization DateTime SOPAuthorizationDateTime DT 1 (0100,0424) SOP Authorization Comment SOPAuthorizationComment LT 1 (0100,0426) Authorization Equipment Certification Number AuthorizationEquipmentCertificationNumber LO 1 (0400,0005) MAC ID Number MACIDNumber US 1 (0400,0010) MAC Calculation Transfer Syntax UID MACCalculationTransferSyntaxUID UI 1 (0400,0015) MAC Algorithm MACAlgorithm CS 1 (0400,0020) Data Elements Signed DataElementsSigned AT 1-n (0400,0100) Digital Signature UID DigitalSignatureUID UI 1 (0400,0105) Digital Signature DateTime DigitalSignatureDateTime DT 1 (0400,0110) Certificate Type CertificateType CS 1 (0400,0115) Certificate of Signer CertificateOfSigner OB 1 (0400,0120) Signature Signature OB 1 (0400,0305) Certified Timestamp Type CertifiedTimestampType CS 1 (0400,0310) Certified Timestamp CertifiedTimestamp OB 1 (0400,0315) FL 1 RET (0400,0401) Digital Signature Purpose Code Sequence DigitalSignaturePurposeCodeSequence SQ 1 (0400,0402) Referenced Digital Signature Sequence ReferencedDigitalSignatureSequence SQ 1 (0400,0403) Referenced SOP Instance MAC Sequence ReferencedSOPInstanceMACSequence SQ 1 (0400,0404) MAC MAC OB 1 (0400,0500) Encrypted Attributes Sequence EncryptedAttributesSequence SQ 1 (0400,0510) Encrypted Content Transfer Syntax UID EncryptedContentTransferSyntaxUID UI 1 (0400,0520) Encrypted Content EncryptedContent OB 1 (0400,0550) Modified Attributes Sequence ModifiedAttributesSequence SQ 1 (0400,0551) Nonconforming Modified Attributes Sequence NonconformingModifiedAttributesSequence SQ 1 (0400,0552) Nonconforming Data Element Value NonconformingDataElementValue OB 1 (0400,0561) Original Attributes Sequence OriginalAttributesSequence SQ 1 (0400,0562) Attribute Modification DateTime AttributeModificationDateTime DT 1 (0400,0563) Modifying System ModifyingSystem LO 1 (0400,0564) Source of Previous Values SourceOfPreviousValues LO 1 (0400,0565) Reason for the Attribute Modification ReasonForTheAttributeModification CS 1 (0400,0600) Instance Origin Status InstanceOriginStatus CS 1 (1000,xxx0) Escape Triplet EscapeTriplet US 3 RET (1000,xxx1) Run Length Triplet RunLengthTriplet US 3 RET (1000,xxx2) Huffman Table Size HuffmanTableSize US 1 RET (1000,xxx3) Huffman Table Triplet HuffmanTableTriplet US 3 RET (1000,xxx4) Shift Table Size ShiftTableSize US 1 RET (1000,xxx5) Shift Table Triplet ShiftTableTriplet US 3 RET (1010,xxxx) Zonal Map ZonalMap US 1-n RET (2000,0010) Number of Copies NumberOfCopies IS 1 (2000,001E) Printer Configuration Sequence PrinterConfigurationSequence SQ 1 (2000,0020) Print Priority PrintPriority CS 1 (2000,0030) Medium Type MediumType CS 1 (2000,0040) Film Destination FilmDestination CS 1 (2000,0050) Film Session Label FilmSessionLabel LO 1 (2000,0060) Memory Allocation MemoryAllocation IS 1 (2000,0061) Maximum Memory Allocation MaximumMemoryAllocation IS 1 (2000,0062) Color Image Printing Flag ColorImagePrintingFlag CS 1 RET (2000,0063) Collation Flag CollationFlag CS 1 RET (2000,0065) Annotation Flag AnnotationFlag CS 1 RET (2000,0067) Image Overlay Flag ImageOverlayFlag CS 1 RET (2000,0069) Presentation LUT Flag PresentationLUTFlag CS 1 RET (2000,006A) Image Box Presentation LUT Flag ImageBoxPresentationLUTFlag CS 1 RET (2000,00A0) Memory Bit Depth MemoryBitDepth US 1 (2000,00A1) Printing Bit Depth PrintingBitDepth US 1 (2000,00A2) Media Installed Sequence MediaInstalledSequence SQ 1 (2000,00A4) Other Media Available Sequence OtherMediaAvailableSequence SQ 1 (2000,00A8) Supported Image Display Formats Sequence SupportedImageDisplayFormatsSequence SQ 1 (2000,0500) Referenced Film Box Sequence ReferencedFilmBoxSequence SQ 1 (2000,0510) Referenced Stored Print Sequence ReferencedStoredPrintSequence SQ 1 RET (2010,0010) Image Display Format ImageDisplayFormat ST 1 (2010,0030) Annotation Display Format ID AnnotationDisplayFormatID CS 1 (2010,0040) Film Orientation FilmOrientation CS 1 (2010,0050) Film Size ID FilmSizeID CS 1 (2010,0052) Printer Resolution ID PrinterResolutionID CS 1 (2010,0054) Default Printer Resolution ID DefaultPrinterResolutionID CS 1 (2010,0060) Magnification Type MagnificationType CS 1 (2010,0080) Smoothing Type SmoothingType CS 1 (2010,00A6) Default Magnification Type DefaultMagnificationType CS 1 (2010,00A7) Other Magnification Types Available OtherMagnificationTypesAvailable CS 1-n (2010,00A8) Default Smoothing Type DefaultSmoothingType CS 1 (2010,00A9) Other Smoothing Types Available OtherSmoothingTypesAvailable CS 1-n (2010,0100) Border Density BorderDensity CS 1 (2010,0110) Empty Image Density EmptyImageDensity CS 1 (2010,0120) Min Density MinDensity US 1 (2010,0130) Max Density MaxDensity US 1 (2010,0140) Trim Trim CS 1 (2010,0150) Configuration Information ConfigurationInformation ST 1 (2010,0152) Configuration Information Description ConfigurationInformationDescription LT 1 (2010,0154) Maximum Collated Films MaximumCollatedFilms IS 1 (2010,015E) Illumination Illumination US 1 (2010,0160) Reflected Ambient Light ReflectedAmbientLight US 1 (2010,0376) Printer Pixel Spacing PrinterPixelSpacing DS 2 (2010,0500) Referenced Film Session Sequence ReferencedFilmSessionSequence SQ 1 (2010,0510) Referenced Image Box Sequence ReferencedImageBoxSequence SQ 1 (2010,0520) Referenced Basic Annotation Box Sequence ReferencedBasicAnnotationBoxSequence SQ 1 (2020,0010) Image Box Position ImageBoxPosition US 1 (2020,0020) Polarity Polarity CS 1 (2020,0030) Requested Image Size RequestedImageSize DS 1 (2020,0040) Requested Decimate/Crop Behavior RequestedDecimateCropBehavior CS 1 (2020,0050) Requested Resolution ID RequestedResolutionID CS 1 (2020,00A0) Requested Image Size Flag RequestedImageSizeFlag CS 1 (2020,00A2) Decimate/Crop Result DecimateCropResult CS 1 (2020,0110) Basic Grayscale Image Sequence BasicGrayscaleImageSequence SQ 1 (2020,0111) Basic Color Image Sequence BasicColorImageSequence SQ 1 (2020,0130) Referenced Image Overlay Box Sequence ReferencedImageOverlayBoxSequence SQ 1 RET (2020,0140) Referenced VOI LUT Box Sequence ReferencedVOILUTBoxSequence SQ 1 RET (2030,0010) Annotation Position AnnotationPosition US 1 (2030,0020) Text String TextString LO 1 (2040,0010) Referenced Overlay Plane Sequence ReferencedOverlayPlaneSequence SQ 1 RET (2040,0011) Referenced Overlay Plane Groups ReferencedOverlayPlaneGroups US 1-99 RET (2040,0020) Overlay Pixel Data Sequence OverlayPixelDataSequence SQ 1 RET (2040,0060) Overlay Magnification Type OverlayMagnificationType CS 1 RET (2040,0070) Overlay Smoothing Type OverlaySmoothingType CS 1 RET (2040,0072) Overlay or Image Magnification OverlayOrImageMagnification CS 1 RET (2040,0074) Magnify to Number of Columns MagnifyToNumberOfColumns US 1 RET (2040,0080) Overlay Foreground Density OverlayForegroundDensity CS 1 RET (2040,0082) Overlay Background Density OverlayBackgroundDensity CS 1 RET (2040,0090) Overlay Mode OverlayMode CS 1 RET (2040,0100) Threshold Density ThresholdDensity CS 1 RET (2040,0500) Referenced Image Box Sequence (Retired) ReferencedImageBoxSequenceRetired SQ 1 RET (2050,0010) Presentation LUT Sequence PresentationLUTSequence SQ 1 (2050,0020) Presentation LUT Shape PresentationLUTShape CS 1 (2050,0500) Referenced Presentation LUT Sequence ReferencedPresentationLUTSequence SQ 1 (2100,0010) Print Job ID PrintJobID SH 1 RET (2100,0020) Execution Status ExecutionStatus CS 1 (2100,0030) Execution Status Info ExecutionStatusInfo CS 1 (2100,0040) Creation Date CreationDate DA 1 (2100,0050) Creation Time CreationTime TM 1 (2100,0070) Originator Originator AE 1 (2100,0140) Destination AE DestinationAE AE 1 (2100,0160) Owner ID OwnerID SH 1 (2100,0170) Number of Films NumberOfFilms IS 1 (2100,0500) Referenced Print Job Sequence (Pull Stored Print) ReferencedPrintJobSequencePullStoredPrint SQ 1 RET (2110,0010) Printer Status PrinterStatus CS 1 (2110,0020) Printer Status Info PrinterStatusInfo CS 1 (2110,0030) Printer Name PrinterName LO 1 (2110,0099) Print Queue ID PrintQueueID SH 1 RET (2120,0010) Queue Status QueueStatus CS 1 RET (2120,0050) Print Job Description Sequence PrintJobDescriptionSequence SQ 1 RET (2120,0070) Referenced Print Job Sequence ReferencedPrintJobSequence SQ 1 RET (2130,0010) Print Management Capabilities Sequence PrintManagementCapabilitiesSequence SQ 1 RET (2130,0015) Printer Characteristics Sequence PrinterCharacteristicsSequence SQ 1 RET (2130,0030) Film Box Content Sequence FilmBoxContentSequence SQ 1 RET (2130,0040) Image Box Content Sequence ImageBoxContentSequence SQ 1 RET (2130,0050) Annotation Content Sequence AnnotationContentSequence SQ 1 RET (2130,0060) Image Overlay Box Content Sequence ImageOverlayBoxContentSequence SQ 1 RET (2130,0080) Presentation LUT Content Sequence PresentationLUTContentSequence SQ 1 RET (2130,00A0) Proposed Study Sequence ProposedStudySequence SQ 1 RET (2130,00C0) Original Image Sequence OriginalImageSequence SQ 1 RET (2200,0001) Label Using Information Extracted From Instances LabelUsingInformationExtractedFromInstances CS 1 (2200,0002) Label Text LabelText UT 1 (2200,0003) Label Style Selection LabelStyleSelection CS 1 (2200,0004) Media Disposition MediaDisposition LT 1 (2200,0005) Barcode Value BarcodeValue LT 1 (2200,0006) Barcode Symbology BarcodeSymbology CS 1 (2200,0007) Allow Media Splitting AllowMediaSplitting CS 1 (2200,0008) Include Non-DICOM Objects IncludeNonDICOMObjects CS 1 (2200,0009) Include Display Application IncludeDisplayApplication CS 1 (2200,000A) Preserve Composite Instances After Media Creation PreserveCompositeInstancesAfterMediaCreation CS 1 (2200,000B) Total Number of Pieces of Media Created TotalNumberOfPiecesOfMediaCreated US 1 (2200,000C) Requested Media Application Profile RequestedMediaApplicationProfile LO 1 (2200,000D) Referenced Storage Media Sequence ReferencedStorageMediaSequence SQ 1 (2200,000E) Failure Attributes FailureAttributes AT 1-n (2200,000F) Allow Lossy Compression AllowLossyCompression CS 1 (2200,0020) Request Priority RequestPriority CS 1 (3002,0002) RT Image Label RTImageLabel SH 1 (3002,0003) RT Image Name RTImageName LO 1 (3002,0004) RT Image Description RTImageDescription ST 1 (3002,000A) Reported Values Origin ReportedValuesOrigin CS 1 (3002,000C) RT Image Plane RTImagePlane CS 1 (3002,000D) X-Ray Image Receptor Translation XRayImageReceptorTranslation DS 3 (3002,000E) X-Ray Image Receptor Angle XRayImageReceptorAngle DS 1 (3002,0010) RT Image Orientation RTImageOrientation DS 6 (3002,0011) Image Plane Pixel Spacing ImagePlanePixelSpacing DS 2 (3002,0012) RT Image Position RTImagePosition DS 2 (3002,0020) Radiation Machine Name RadiationMachineName SH 1 (3002,0022) Radiation Machine SAD RadiationMachineSAD DS 1 (3002,0024) Radiation Machine SSD RadiationMachineSSD DS 1 (3002,0026) RT Image SID RTImageSID DS 1 (3002,0028) Source to Reference Object Distance SourceToReferenceObjectDistance DS 1 (3002,0029) Fraction Number FractionNumber IS 1 (3002,0030) Exposure Sequence ExposureSequence SQ 1 (3002,0032) Meterset Exposure MetersetExposure DS 1 (3002,0034) Diaphragm Position DiaphragmPosition DS 4 (3002,0040) Fluence Map Sequence FluenceMapSequence SQ 1 (3002,0041) Fluence Data Source FluenceDataSource CS 1 (3002,0042) Fluence Data Scale FluenceDataScale DS 1 (3002,0050) Primary Fluence Mode Sequence PrimaryFluenceModeSequence SQ 1 (3002,0051) Fluence Mode FluenceMode CS 1 (3002,0052) Fluence Mode ID FluenceModeID SH 1 (3004,0001) DVH Type DVHType CS 1 (3004,0002) Dose Units DoseUnits CS 1 (3004,0004) Dose Type DoseType CS 1 (3004,0005) Spatial Transform of Dose SpatialTransformOfDose CS 1 (3004,0006) Dose Comment DoseComment LO 1 (3004,0008) Normalization Point NormalizationPoint DS 3 (3004,000A) Dose Summation Type DoseSummationType CS 1 (3004,000C) Grid Frame Offset Vector GridFrameOffsetVector DS 2-n (3004,000E) Dose Grid Scaling DoseGridScaling DS 1 (3004,0010) RT Dose ROI Sequence RTDoseROISequence SQ 1 (3004,0012) Dose Value DoseValue DS 1 (3004,0014) Tissue Heterogeneity Correction TissueHeterogeneityCorrection CS 1-3 (3004,0040) DVH Normalization Point DVHNormalizationPoint DS 3 (3004,0042) DVH Normalization Dose Value DVHNormalizationDoseValue DS 1 (3004,0050) DVH Sequence DVHSequence SQ 1 (3004,0052) DVH Dose Scaling DVHDoseScaling DS 1 (3004,0054) DVH Volume Units DVHVolumeUnits CS 1 (3004,0056) DVH Number of Bins DVHNumberOfBins IS 1 (3004,0058) DVH Data DVHData DS 2-2n (3004,0060) DVH Referenced ROI Sequence DVHReferencedROISequence SQ 1 (3004,0062) DVH ROI Contribution Type DVHROIContributionType CS 1 (3004,0070) DVH Minimum Dose DVHMinimumDose DS 1 (3004,0072) DVH Maximum Dose DVHMaximumDose DS 1 (3004,0074) DVH Mean Dose DVHMeanDose DS 1 (3006,0002) Structure Set Label StructureSetLabel SH 1 (3006,0004) Structure Set Name StructureSetName LO 1 (3006,0006) Structure Set Description StructureSetDescription ST 1 (3006,0008) Structure Set Date StructureSetDate DA 1 (3006,0009) Structure Set Time StructureSetTime TM 1 (3006,0010) Referenced Frame of Reference Sequence ReferencedFrameOfReferenceSequence SQ 1 (3006,0012) RT Referenced Study Sequence RTReferencedStudySequence SQ 1 (3006,0014) RT Referenced Series Sequence RTReferencedSeriesSequence SQ 1 (3006,0016) Contour Image Sequence ContourImageSequence SQ 1 (3006,0018) Predecessor Structure Set Sequence PredecessorStructureSetSequence SQ 1 (3006,0020) Structure Set ROI Sequence StructureSetROISequence SQ 1 (3006,0022) ROI Number ROINumber IS 1 (3006,0024) Referenced Frame of Reference UID ReferencedFrameOfReferenceUID UI 1 (3006,0026) ROI Name ROIName LO 1 (3006,0028) ROI Description ROIDescription ST 1 (3006,002A) ROI Display Color ROIDisplayColor IS 3 (3006,002C) ROI Volume ROIVolume DS 1 (3006,0030) RT Related ROI Sequence RTRelatedROISequence SQ 1 (3006,0033) RT ROI Relationship RTROIRelationship CS 1 (3006,0036) ROI Generation Algorithm ROIGenerationAlgorithm CS 1 (3006,0037) ROI Derivation Algorithm Identification Sequence ROIDerivationAlgorithmIdentificationSequence SQ 1 (3006,0038) ROI Generation Description ROIGenerationDescription LO 1 (3006,0039) ROI Contour Sequence ROIContourSequence SQ 1 (3006,0040) Contour Sequence ContourSequence SQ 1 (3006,0042) Contour Geometric Type ContourGeometricType CS 1 (3006,0044) Contour Slab Thickness ContourSlabThickness DS 1 (3006,0045) Contour Offset Vector ContourOffsetVector DS 3 (3006,0046) Number of Contour Points NumberOfContourPoints IS 1 (3006,0048) Contour Number ContourNumber IS 1 (3006,0049) Attached Contours AttachedContours IS 1-n (3006,0050) Contour Data ContourData DS 3-3n (3006,0080) RT ROI Observations Sequence RTROIObservationsSequence SQ 1 (3006,0082) Observation Number ObservationNumber IS 1 (3006,0084) Referenced ROI Number ReferencedROINumber IS 1 (3006,0085) ROI Observation Label ROIObservationLabel SH 1 (3006,0086) RT ROI Identification Code Sequence RTROIIdentificationCodeSequence SQ 1 (3006,0088) ROI Observation Description ROIObservationDescription ST 1 (3006,00A0) Related RT ROI Observations Sequence RelatedRTROIObservationsSequence SQ 1 (3006,00A4) RT ROI Interpreted Type RTROIInterpretedType CS 1 (3006,00A6) ROI Interpreter ROIInterpreter PN 1 (3006,00B0) ROI Physical Properties Sequence ROIPhysicalPropertiesSequence SQ 1 (3006,00B2) ROI Physical Property ROIPhysicalProperty CS 1 (3006,00B4) ROI Physical Property Value ROIPhysicalPropertyValue DS 1 (3006,00B6) ROI Elemental Composition Sequence ROIElementalCompositionSequence SQ 1 (3006,00B7) ROI Elemental Composition Atomic Number ROIElementalCompositionAtomicNumber US 1 (3006,00B8) ROI Elemental Composition Atomic Mass Fraction ROIElementalCompositionAtomicMassFraction FL 1 (3006,00B9) Additional RT ROI Identification Code Sequence AdditionalRTROIIdentificationCodeSequence SQ 1 RET (3006,00C0) Frame of Reference Relationship Sequence FrameOfReferenceRelationshipSequence SQ 1 RET (3006,00C2) Related Frame of Reference UID RelatedFrameOfReferenceUID UI 1 RET (3006,00C4) Frame of Reference Transformation Type FrameOfReferenceTransformationType CS 1 RET (3006,00C6) Frame of Reference Transformation Matrix FrameOfReferenceTransformationMatrix DS 16 (3006,00C8) Frame of Reference Transformation Comment FrameOfReferenceTransformationComment LO 1 (3006,00C9) Patient Location Coordinates Sequence PatientLocationCoordinatesSequence SQ 1 (3006,00CA) Patient Location Coordinates Code Sequence PatientLocationCoordinatesCodeSequence SQ 1 (3006,00CB) Patient Support Position Sequence PatientSupportPositionSequence SQ 1 (3008,0010) Measured Dose Reference Sequence MeasuredDoseReferenceSequence SQ 1 (3008,0012) Measured Dose Description MeasuredDoseDescription ST 1 (3008,0014) Measured Dose Type MeasuredDoseType CS 1 (3008,0016) Measured Dose Value MeasuredDoseValue DS 1 (3008,0020) Treatment Session Beam Sequence TreatmentSessionBeamSequence SQ 1 (3008,0021) Treatment Session Ion Beam Sequence TreatmentSessionIonBeamSequence SQ 1 (3008,0022) Current Fraction Number CurrentFractionNumber IS 1 (3008,0024) Treatment Control Point Date TreatmentControlPointDate DA 1 (3008,0025) Treatment Control Point Time TreatmentControlPointTime TM 1 (3008,002A) Treatment Termination Status TreatmentTerminationStatus CS 1 (3008,002B) Treatment Termination Code TreatmentTerminationCode SH 1 (3008,002C) Treatment Verification Status TreatmentVerificationStatus CS 1 (3008,0030) Referenced Treatment Record Sequence ReferencedTreatmentRecordSequence SQ 1 (3008,0032) Specified Primary Meterset SpecifiedPrimaryMeterset DS 1 (3008,0033) Specified Secondary Meterset SpecifiedSecondaryMeterset DS 1 (3008,0036) Delivered Primary Meterset DeliveredPrimaryMeterset DS 1 (3008,0037) Delivered Secondary Meterset DeliveredSecondaryMeterset DS 1 (3008,003A) Specified Treatment Time SpecifiedTreatmentTime DS 1 (3008,003B) Delivered Treatment Time DeliveredTreatmentTime DS 1 (3008,0040) Control Point Delivery Sequence ControlPointDeliverySequence SQ 1 (3008,0041) Ion Control Point Delivery Sequence IonControlPointDeliverySequence SQ 1 (3008,0042) Specified Meterset SpecifiedMeterset DS 1 (3008,0044) Delivered Meterset DeliveredMeterset DS 1 (3008,0045) Meterset Rate Set MetersetRateSet FL 1 (3008,0046) Meterset Rate Delivered MetersetRateDelivered FL 1 (3008,0047) Scan Spot Metersets Delivered ScanSpotMetersetsDelivered FL 1-n (3008,0048) Dose Rate Delivered DoseRateDelivered DS 1 (3008,0050) Treatment Summary Calculated Dose Reference Sequence TreatmentSummaryCalculatedDoseReferenceSequence SQ 1 (3008,0052) Cumulative Dose to Dose Reference CumulativeDoseToDoseReference DS 1 (3008,0054) First Treatment Date FirstTreatmentDate DA 1 (3008,0056) Most Recent Treatment Date MostRecentTreatmentDate DA 1 (3008,005A) Number of Fractions Delivered NumberOfFractionsDelivered IS 1 (3008,0060) Override Sequence OverrideSequence SQ 1 (3008,0061) Parameter Sequence Pointer ParameterSequencePointer AT 1 (3008,0062) Override Parameter Pointer OverrideParameterPointer AT 1 (3008,0063) Parameter Item Index ParameterItemIndex IS 1 (3008,0064) Measured Dose Reference Number MeasuredDoseReferenceNumber IS 1 (3008,0065) Parameter Pointer ParameterPointer AT 1 (3008,0066) Override Reason OverrideReason ST 1 (3008,0067) Parameter Value Number ParameterValueNumber US 1 (3008,0068) Corrected Parameter Sequence CorrectedParameterSequence SQ 1 (3008,006A) Correction Value CorrectionValue FL 1 (3008,0070) Calculated Dose Reference Sequence CalculatedDoseReferenceSequence SQ 1 (3008,0072) Calculated Dose Reference Number CalculatedDoseReferenceNumber IS 1 (3008,0074) Calculated Dose Reference Description CalculatedDoseReferenceDescription ST 1 (3008,0076) Calculated Dose Reference Dose Value CalculatedDoseReferenceDoseValue DS 1 (3008,0078) Start Meterset StartMeterset DS 1 (3008,007A) End Meterset EndMeterset DS 1 (3008,0080) Referenced Measured Dose Reference Sequence ReferencedMeasuredDoseReferenceSequence SQ 1 (3008,0082) Referenced Measured Dose Reference Number ReferencedMeasuredDoseReferenceNumber IS 1 (3008,0090) Referenced Calculated Dose Reference Sequence ReferencedCalculatedDoseReferenceSequence SQ 1 (3008,0092) Referenced Calculated Dose Reference Number ReferencedCalculatedDoseReferenceNumber IS 1 (3008,00A0) Beam Limiting Device Leaf Pairs Sequence BeamLimitingDeviceLeafPairsSequence SQ 1 (3008,00B0) Recorded Wedge Sequence RecordedWedgeSequence SQ 1 (3008,00C0) Recorded Compensator Sequence RecordedCompensatorSequence SQ 1 (3008,00D0) Recorded Block Sequence RecordedBlockSequence SQ 1 (3008,00E0) Treatment Summary Measured Dose Reference Sequence TreatmentSummaryMeasuredDoseReferenceSequence SQ 1 (3008,00F0) Recorded Snout Sequence RecordedSnoutSequence SQ 1 (3008,00F2) Recorded Range Shifter Sequence RecordedRangeShifterSequence SQ 1 (3008,00F4) Recorded Lateral Spreading Device Sequence RecordedLateralSpreadingDeviceSequence SQ 1 (3008,00F6) Recorded Range Modulator Sequence RecordedRangeModulatorSequence SQ 1 (3008,0100) Recorded Source Sequence RecordedSourceSequence SQ 1 (3008,0105) Source Serial Number SourceSerialNumber LO 1 (3008,0110) Treatment Session Application Setup Sequence TreatmentSessionApplicationSetupSequence SQ 1 (3008,0116) Application Setup Check ApplicationSetupCheck CS 1 (3008,0120) Recorded Brachy Accessory Device Sequence RecordedBrachyAccessoryDeviceSequence SQ 1 (3008,0122) Referenced Brachy Accessory Device Number ReferencedBrachyAccessoryDeviceNumber IS 1 (3008,0130) Recorded Channel Sequence RecordedChannelSequence SQ 1 (3008,0132) Specified Channel Total Time SpecifiedChannelTotalTime DS 1 (3008,0134) Delivered Channel Total Time DeliveredChannelTotalTime DS 1 (3008,0136) Specified Number of Pulses SpecifiedNumberOfPulses IS 1 (3008,0138) Delivered Number of Pulses DeliveredNumberOfPulses IS 1 (3008,013A) Specified Pulse Repetition Interval SpecifiedPulseRepetitionInterval DS 1 (3008,013C) Delivered Pulse Repetition Interval DeliveredPulseRepetitionInterval DS 1 (3008,0140) Recorded Source Applicator Sequence RecordedSourceApplicatorSequence SQ 1 (3008,0142) Referenced Source Applicator Number ReferencedSourceApplicatorNumber IS 1 (3008,0150) Recorded Channel Shield Sequence RecordedChannelShieldSequence SQ 1 (3008,0152) Referenced Channel Shield Number ReferencedChannelShieldNumber IS 1 (3008,0160) Brachy Control Point Delivered Sequence BrachyControlPointDeliveredSequence SQ 1 (3008,0162) Safe Position Exit Date SafePositionExitDate DA 1 (3008,0164) Safe Position Exit Time SafePositionExitTime TM 1 (3008,0166) Safe Position Return Date SafePositionReturnDate DA 1 (3008,0168) Safe Position Return Time SafePositionReturnTime TM 1 (3008,0171) Pulse Specific Brachy Control Point Delivered Sequence PulseSpecificBrachyControlPointDeliveredSequence SQ 1 (3008,0172) Pulse Number PulseNumber US 1 (3008,0173) Brachy Pulse Control Point Delivered Sequence BrachyPulseControlPointDeliveredSequence SQ 1 (3008,0200) Current Treatment Status CurrentTreatmentStatus CS 1 (3008,0202) Treatment Status Comment TreatmentStatusComment ST 1 (3008,0220) Fraction Group Summary Sequence FractionGroupSummarySequence SQ 1 (3008,0223) Referenced Fraction Number ReferencedFractionNumber IS 1 (3008,0224) Fraction Group Type FractionGroupType CS 1 (3008,0230) Beam Stopper Position BeamStopperPosition CS 1 (3008,0240) Fraction Status Summary Sequence FractionStatusSummarySequence SQ 1 (3008,0250) Treatment Date TreatmentDate DA 1 (3008,0251) Treatment Time TreatmentTime TM 1 (300A,0002) RT Plan Label RTPlanLabel SH 1 (300A,0003) RT Plan Name RTPlanName LO 1 (300A,0004) RT Plan Description RTPlanDescription ST 1 (300A,0006) RT Plan Date RTPlanDate DA 1 (300A,0007) RT Plan Time RTPlanTime TM 1 (300A,0009) Treatment Protocols TreatmentProtocols LO 1-n (300A,000A) Plan Intent PlanIntent CS 1 (300A,000B) Treatment Sites TreatmentSites LO 1-n (300A,000C) RT Plan Geometry RTPlanGeometry CS 1 (300A,000E) Prescription Description PrescriptionDescription ST 1 (300A,0010) Dose Reference Sequence DoseReferenceSequence SQ 1 (300A,0012) Dose Reference Number DoseReferenceNumber IS 1 (300A,0013) Dose Reference UID DoseReferenceUID UI 1 (300A,0014) Dose Reference Structure Type DoseReferenceStructureType CS 1 (300A,0015) Nominal Beam Energy Unit NominalBeamEnergyUnit CS 1 (300A,0016) Dose Reference Description DoseReferenceDescription LO 1 (300A,0018) Dose Reference Point Coordinates DoseReferencePointCoordinates DS 3 (300A,001A) Nominal Prior Dose NominalPriorDose DS 1 (300A,0020) Dose Reference Type DoseReferenceType CS 1 (300A,0021) Constraint Weight ConstraintWeight DS 1 (300A,0022) Delivery Warning Dose DeliveryWarningDose DS 1 (300A,0023) Delivery Maximum Dose DeliveryMaximumDose DS 1 (300A,0025) Target Minimum Dose TargetMinimumDose DS 1 (300A,0026) Target Prescription Dose TargetPrescriptionDose DS 1 (300A,0027) Target Maximum Dose TargetMaximumDose DS 1 (300A,0028) Target Underdose Volume Fraction TargetUnderdoseVolumeFraction DS 1 (300A,002A) Organ at Risk Full-volume Dose OrganAtRiskFullVolumeDose DS 1 (300A,002B) Organ at Risk Limit Dose OrganAtRiskLimitDose DS 1 (300A,002C) Organ at Risk Maximum Dose OrganAtRiskMaximumDose DS 1 (300A,002D) Organ at Risk Overdose Volume Fraction OrganAtRiskOverdoseVolumeFraction DS 1 (300A,0040) Tolerance Table Sequence ToleranceTableSequence SQ 1 (300A,0042) Tolerance Table Number ToleranceTableNumber IS 1 (300A,0043) Tolerance Table Label ToleranceTableLabel SH 1 (300A,0044) Gantry Angle Tolerance GantryAngleTolerance DS 1 (300A,0046) Beam Limiting Device Angle Tolerance BeamLimitingDeviceAngleTolerance DS 1 (300A,0048) Beam Limiting Device Tolerance Sequence BeamLimitingDeviceToleranceSequence SQ 1 (300A,004A) Beam Limiting Device Position Tolerance BeamLimitingDevicePositionTolerance DS 1 (300A,004B) Snout Position Tolerance SnoutPositionTolerance FL 1 (300A,004C) Patient Support Angle Tolerance PatientSupportAngleTolerance DS 1 (300A,004E) Table Top Eccentric Angle Tolerance TableTopEccentricAngleTolerance DS 1 (300A,004F) Table Top Pitch Angle Tolerance TableTopPitchAngleTolerance FL 1 (300A,0050) Table Top Roll Angle Tolerance TableTopRollAngleTolerance FL 1 (300A,0051) Table Top Vertical Position Tolerance TableTopVerticalPositionTolerance DS 1 (300A,0052) Table Top Longitudinal Position Tolerance TableTopLongitudinalPositionTolerance DS 1 (300A,0053) Table Top Lateral Position Tolerance TableTopLateralPositionTolerance DS 1 (300A,0055) RT Plan Relationship RTPlanRelationship CS 1 (300A,0070) Fraction Group Sequence FractionGroupSequence SQ 1 (300A,0071) Fraction Group Number FractionGroupNumber IS 1 (300A,0072) Fraction Group Description FractionGroupDescription LO 1 (300A,0078) Number of Fractions Planned NumberOfFractionsPlanned IS 1 (300A,0079) Number of Fraction Pattern Digits Per Day NumberOfFractionPatternDigitsPerDay IS 1 (300A,007A) Repeat Fraction Cycle Length RepeatFractionCycleLength IS 1 (300A,007B) Fraction Pattern FractionPattern LT 1 (300A,0080) Number of Beams NumberOfBeams IS 1 (300A,0082) Beam Dose Specification Point BeamDoseSpecificationPoint DS 3 RET (300A,0083) Referenced Dose Reference UID ReferencedDoseReferenceUID UI 1 (300A,0084) Beam Dose BeamDose DS 1 (300A,0086) Beam Meterset BeamMeterset DS 1 (300A,0088) Beam Dose Point Depth BeamDosePointDepth FL 1 (300A,0089) Beam Dose Point Equivalent Depth BeamDosePointEquivalentDepth FL 1 (300A,008A) Beam Dose Point SSD BeamDosePointSSD FL 1 (300A,008B) Beam Dose Meaning BeamDoseMeaning CS 1 (300A,008C) Beam Dose Verification Control Point Sequence BeamDoseVerificationControlPointSequence SQ 1 (300A,008D) Average Beam Dose Point Depth AverageBeamDosePointDepth FL 1 RET (300A,008E) Average Beam Dose Point Equivalent Depth AverageBeamDosePointEquivalentDepth FL 1 RET (300A,008F) Average Beam Dose Point SSD AverageBeamDosePointSSD FL 1 RET (300A,0090) Beam Dose Type BeamDoseType CS 1 (300A,0091) Alternate Beam Dose AlternateBeamDose DS 1 (300A,0092) Alternate Beam Dose Type AlternateBeamDoseType CS 1 (300A,0093) Depth Value Averaging Flag DepthValueAveragingFlag CS 1 (300A,0094) Beam Dose Point Source to External Contour Distance BeamDosePointSourceToExternalContourDistance DS 1 (300A,00A0) Number of Brachy Application Setups NumberOfBrachyApplicationSetups IS 1 (300A,00A2) Brachy Application Setup Dose Specification Point BrachyApplicationSetupDoseSpecificationPoint DS 3 (300A,00A4) Brachy Application Setup Dose BrachyApplicationSetupDose DS 1 (300A,00B0) Beam Sequence BeamSequence SQ 1 (300A,00B2) Treatment Machine Name TreatmentMachineName SH 1 (300A,00B3) Primary Dosimeter Unit PrimaryDosimeterUnit CS 1 (300A,00B4) Source-Axis Distance SourceAxisDistance DS 1 (300A,00B6) Beam Limiting Device Sequence BeamLimitingDeviceSequence SQ 1 (300A,00B8) RT Beam Limiting Device Type RTBeamLimitingDeviceType CS 1 (300A,00BA) Source to Beam Limiting Device Distance SourceToBeamLimitingDeviceDistance DS 1 (300A,00BB) Isocenter to Beam Limiting Device Distance IsocenterToBeamLimitingDeviceDistance FL 1 (300A,00BC) Number of Leaf/Jaw Pairs NumberOfLeafJawPairs IS 1 (300A,00BE) Leaf Position Boundaries LeafPositionBoundaries DS 3-n (300A,00C0) Beam Number BeamNumber IS 1 (300A,00C2) Beam Name BeamName LO 1 (300A,00C3) Beam Description BeamDescription ST 1 (300A,00C4) Beam Type BeamType CS 1 (300A,00C5) Beam Delivery Duration Limit BeamDeliveryDurationLimit FD 1 (300A,00C6) Radiation Type RadiationType CS 1 (300A,00C7) High-Dose Technique Type HighDoseTechniqueType CS 1 (300A,00C8) Reference Image Number ReferenceImageNumber IS 1 (300A,00CA) Planned Verification Image Sequence PlannedVerificationImageSequence SQ 1 (300A,00CC) Imaging Device-Specific Acquisition Parameters ImagingDeviceSpecificAcquisitionParameters LO 1-n (300A,00CE) Treatment Delivery Type TreatmentDeliveryType CS 1 (300A,00D0) Number of Wedges NumberOfWedges IS 1 (300A,00D1) Wedge Sequence WedgeSequence SQ 1 (300A,00D2) Wedge Number WedgeNumber IS 1 (300A,00D3) Wedge Type WedgeType CS 1 (300A,00D4) Wedge ID WedgeID SH 1 (300A,00D5) Wedge Angle WedgeAngle IS 1 (300A,00D6) Wedge Factor WedgeFactor DS 1 (300A,00D7) Total Wedge Tray Water-Equivalent Thickness TotalWedgeTrayWaterEquivalentThickness FL 1 (300A,00D8) Wedge Orientation WedgeOrientation DS 1 (300A,00D9) Isocenter to Wedge Tray Distance IsocenterToWedgeTrayDistance FL 1 (300A,00DA) Source to Wedge Tray Distance SourceToWedgeTrayDistance DS 1 (300A,00DB) Wedge Thin Edge Position WedgeThinEdgePosition FL 1 (300A,00DC) Bolus ID BolusID SH 1 (300A,00DD) Bolus Description BolusDescription ST 1 (300A,00DE) Effective Wedge Angle EffectiveWedgeAngle DS 1 (300A,00E0) Number of Compensators NumberOfCompensators IS 1 (300A,00E1) Material ID MaterialID SH 1 (300A,00E2) Total Compensator Tray Factor TotalCompensatorTrayFactor DS 1 (300A,00E3) Compensator Sequence CompensatorSequence SQ 1 (300A,00E4) Compensator Number CompensatorNumber IS 1 (300A,00E5) Compensator ID CompensatorID SH 1 (300A,00E6) Source to Compensator Tray Distance SourceToCompensatorTrayDistance DS 1 (300A,00E7) Compensator Rows CompensatorRows IS 1 (300A,00E8) Compensator Columns CompensatorColumns IS 1 (300A,00E9) Compensator Pixel Spacing CompensatorPixelSpacing DS 2 (300A,00EA) Compensator Position CompensatorPosition DS 2 (300A,00EB) Compensator Transmission Data CompensatorTransmissionData DS 1-n (300A,00EC) Compensator Thickness Data CompensatorThicknessData DS 1-n (300A,00ED) Number of Boli NumberOfBoli IS 1 (300A,00EE) Compensator Type CompensatorType CS 1 (300A,00EF) Compensator Tray ID CompensatorTrayID SH 1 (300A,00F0) Number of Blocks NumberOfBlocks IS 1 (300A,00F2) Total Block Tray Factor TotalBlockTrayFactor DS 1 (300A,00F3) Total Block Tray Water-Equivalent Thickness TotalBlockTrayWaterEquivalentThickness FL 1 (300A,00F4) Block Sequence BlockSequence SQ 1 (300A,00F5) Block Tray ID BlockTrayID SH 1 (300A,00F6) Source to Block Tray Distance SourceToBlockTrayDistance DS 1 (300A,00F7) Isocenter to Block Tray Distance IsocenterToBlockTrayDistance FL 1 (300A,00F8) Block Type BlockType CS 1 (300A,00F9) Accessory Code AccessoryCode LO 1 (300A,00FA) Block Divergence BlockDivergence CS 1 (300A,00FB) Block Mounting Position BlockMountingPosition CS 1 (300A,00FC) Block Number BlockNumber IS 1 (300A,00FE) Block Name BlockName LO 1 (300A,0100) Block Thickness BlockThickness DS 1 (300A,0102) Block Transmission BlockTransmission DS 1 (300A,0104) Block Number of Points BlockNumberOfPoints IS 1 (300A,0106) Block Data BlockData DS 2-2n (300A,0107) Applicator Sequence ApplicatorSequence SQ 1 (300A,0108) Applicator ID ApplicatorID SH 1 (300A,0109) Applicator Type ApplicatorType CS 1 (300A,010A) Applicator Description ApplicatorDescription LO 1 (300A,010C) Cumulative Dose Reference Coefficient CumulativeDoseReferenceCoefficient DS 1 (300A,010E) Final Cumulative Meterset Weight FinalCumulativeMetersetWeight DS 1 (300A,0110) Number of Control Points NumberOfControlPoints IS 1 (300A,0111) Control Point Sequence ControlPointSequence SQ 1 (300A,0112) Control Point Index ControlPointIndex IS 1 (300A,0114) Nominal Beam Energy NominalBeamEnergy DS 1 (300A,0115) Dose Rate Set DoseRateSet DS 1 (300A,0116) Wedge Position Sequence WedgePositionSequence SQ 1 (300A,0118) Wedge Position WedgePosition CS 1 (300A,011A) Beam Limiting Device Position Sequence BeamLimitingDevicePositionSequence SQ 1 (300A,011C) Leaf/Jaw Positions LeafJawPositions DS 2-2n (300A,011E) Gantry Angle GantryAngle DS 1 (300A,011F) Gantry Rotation Direction GantryRotationDirection CS 1 (300A,0120) Beam Limiting Device Angle BeamLimitingDeviceAngle DS 1 (300A,0121) Beam Limiting Device Rotation Direction BeamLimitingDeviceRotationDirection CS 1 (300A,0122) Patient Support Angle PatientSupportAngle DS 1 (300A,0123) Patient Support Rotation Direction PatientSupportRotationDirection CS 1 (300A,0124) Table Top Eccentric Axis Distance TableTopEccentricAxisDistance DS 1 (300A,0125) Table Top Eccentric Angle TableTopEccentricAngle DS 1 (300A,0126) Table Top Eccentric Rotation Direction TableTopEccentricRotationDirection CS 1 (300A,0128) Table Top Vertical Position TableTopVerticalPosition DS 1 (300A,0129) Table Top Longitudinal Position TableTopLongitudinalPosition DS 1 (300A,012A) Table Top Lateral Position TableTopLateralPosition DS 1 (300A,012C) Isocenter Position IsocenterPosition DS 3 (300A,012E) Surface Entry Point SurfaceEntryPoint DS 3 (300A,0130) Source to Surface Distance SourceToSurfaceDistance DS 1 (300A,0131) Average Beam Dose Point Source to External Contour Distance AverageBeamDosePointSourceToExternalContourDistance FL 1 (300A,0132) Source to External Contour Distance SourceToExternalContourDistance FL 1 (300A,0133) External Contour Entry Point ExternalContourEntryPoint FL 3 (300A,0134) Cumulative Meterset Weight CumulativeMetersetWeight DS 1 (300A,0140) Table Top Pitch Angle TableTopPitchAngle FL 1 (300A,0142) Table Top Pitch Rotation Direction TableTopPitchRotationDirection CS 1 (300A,0144) Table Top Roll Angle TableTopRollAngle FL 1 (300A,0146) Table Top Roll Rotation Direction TableTopRollRotationDirection CS 1 (300A,0148) Head Fixation Angle HeadFixationAngle FL 1 (300A,014A) Gantry Pitch Angle GantryPitchAngle FL 1 (300A,014C) Gantry Pitch Rotation Direction GantryPitchRotationDirection CS 1 (300A,014E) Gantry Pitch Angle Tolerance GantryPitchAngleTolerance FL 1 (300A,0150) Fixation Eye FixationEye CS 1 (300A,0151) Chair Head Frame Position ChairHeadFramePosition DS 1 (300A,0152) Head Fixation Angle Tolerance HeadFixationAngleTolerance DS 1 (300A,0153) Chair Head Frame Position Tolerance ChairHeadFramePositionTolerance DS 1 (300A,0154) Fixation Light Azimuthal Angle Tolerance FixationLightAzimuthalAngleTolerance DS 1 (300A,0155) Fixation Light Polar Angle Tolerance FixationLightPolarAngleTolerance DS 1 (300A,0180) Patient Setup Sequence PatientSetupSequence SQ 1 (300A,0182) Patient Setup Number PatientSetupNumber IS 1 (300A,0183) Patient Setup Label PatientSetupLabel LO 1 (300A,0184) Patient Additional Position PatientAdditionalPosition LO 1 (300A,0190) Fixation Device Sequence FixationDeviceSequence SQ 1 (300A,0192) Fixation Device Type FixationDeviceType CS 1 (300A,0194) Fixation Device Label FixationDeviceLabel SH 1 (300A,0196) Fixation Device Description FixationDeviceDescription ST 1 (300A,0198) Fixation Device Position FixationDevicePosition SH 1 (300A,0199) Fixation Device Pitch Angle FixationDevicePitchAngle FL 1 (300A,019A) Fixation Device Roll Angle FixationDeviceRollAngle FL 1 (300A,01A0) Shielding Device Sequence ShieldingDeviceSequence SQ 1 (300A,01A2) Shielding Device Type ShieldingDeviceType CS 1 (300A,01A4) Shielding Device Label ShieldingDeviceLabel SH 1 (300A,01A6) Shielding Device Description ShieldingDeviceDescription ST 1 (300A,01A8) Shielding Device Position ShieldingDevicePosition SH 1 (300A,01B0) Setup Technique SetupTechnique CS 1 (300A,01B2) Setup Technique Description SetupTechniqueDescription ST 1 (300A,01B4) Setup Device Sequence SetupDeviceSequence SQ 1 (300A,01B6) Setup Device Type SetupDeviceType CS 1 (300A,01B8) Setup Device Label SetupDeviceLabel SH 1 (300A,01BA) Setup Device Description SetupDeviceDescription ST 1 (300A,01BC) Setup Device Parameter SetupDeviceParameter DS 1 (300A,01D0) Setup Reference Description SetupReferenceDescription ST 1 (300A,01D2) Table Top Vertical Setup Displacement TableTopVerticalSetupDisplacement DS 1 (300A,01D4) Table Top Longitudinal Setup Displacement TableTopLongitudinalSetupDisplacement DS 1 (300A,01D6) Table Top Lateral Setup Displacement TableTopLateralSetupDisplacement DS 1 (300A,0200) Brachy Treatment Technique BrachyTreatmentTechnique CS 1 (300A,0202) Brachy Treatment Type BrachyTreatmentType CS 1 (300A,0206) Treatment Machine Sequence TreatmentMachineSequence SQ 1 (300A,0210) Source Sequence SourceSequence SQ 1 (300A,0212) Source Number SourceNumber IS 1 (300A,0214) Source Type SourceType CS 1 (300A,0216) Source Manufacturer SourceManufacturer LO 1 (300A,0218) Active Source Diameter ActiveSourceDiameter DS 1 (300A,021A) Active Source Length ActiveSourceLength DS 1 (300A,021B) Source Model ID SourceModelID SH 1 (300A,021C) Source Description SourceDescription LO 1 (300A,0222) Source Encapsulation Nominal Thickness SourceEncapsulationNominalThickness DS 1 (300A,0224) Source Encapsulation Nominal Transmission SourceEncapsulationNominalTransmission DS 1 (300A,0226) Source Isotope Name SourceIsotopeName LO 1 (300A,0228) Source Isotope Half Life SourceIsotopeHalfLife DS 1 (300A,0229) Source Strength Units SourceStrengthUnits CS 1 (300A,022A) Reference Air Kerma Rate ReferenceAirKermaRate DS 1 (300A,022B) Source Strength SourceStrength DS 1 (300A,022C) Source Strength Reference Date SourceStrengthReferenceDate DA 1 (300A,022E) Source Strength Reference Time SourceStrengthReferenceTime TM 1 (300A,0230) Application Setup Sequence ApplicationSetupSequence SQ 1 (300A,0232) Application Setup Type ApplicationSetupType CS 1 (300A,0234) Application Setup Number ApplicationSetupNumber IS 1 (300A,0236) Application Setup Name ApplicationSetupName LO 1 (300A,0238) Application Setup Manufacturer ApplicationSetupManufacturer LO 1 (300A,0240) Template Number TemplateNumber IS 1 (300A,0242) Template Type TemplateType SH 1 (300A,0244) Template Name TemplateName LO 1 (300A,0250) Total Reference Air Kerma TotalReferenceAirKerma DS 1 (300A,0260) Brachy Accessory Device Sequence BrachyAccessoryDeviceSequence SQ 1 (300A,0262) Brachy Accessory Device Number BrachyAccessoryDeviceNumber IS 1 (300A,0263) Brachy Accessory Device ID BrachyAccessoryDeviceID SH 1 (300A,0264) Brachy Accessory Device Type BrachyAccessoryDeviceType CS 1 (300A,0266) Brachy Accessory Device Name BrachyAccessoryDeviceName LO 1 (300A,026A) Brachy Accessory Device Nominal Thickness BrachyAccessoryDeviceNominalThickness DS 1 (300A,026C) Brachy Accessory Device Nominal Transmission BrachyAccessoryDeviceNominalTransmission DS 1 (300A,0271) Channel Effective Length ChannelEffectiveLength DS 1 (300A,0272) Channel Inner Length ChannelInnerLength DS 1 (300A,0273) Afterloader Channel ID AfterloaderChannelID SH 1 (300A,0274) Source Applicator Tip Length SourceApplicatorTipLength DS 1 (300A,0280) Channel Sequence ChannelSequence SQ 1 (300A,0282) Channel Number ChannelNumber IS 1 (300A,0284) Channel Length ChannelLength DS 1 (300A,0286) Channel Total Time ChannelTotalTime DS 1 (300A,0288) Source Movement Type SourceMovementType CS 1 (300A,028A) Number of Pulses NumberOfPulses IS 1 (300A,028C) Pulse Repetition Interval PulseRepetitionInterval DS 1 (300A,0290) Source Applicator Number SourceApplicatorNumber IS 1 (300A,0291) Source Applicator ID SourceApplicatorID SH 1 (300A,0292) Source Applicator Type SourceApplicatorType CS 1 (300A,0294) Source Applicator Name SourceApplicatorName LO 1 (300A,0296) Source Applicator Length SourceApplicatorLength DS 1 (300A,0298) Source Applicator Manufacturer SourceApplicatorManufacturer LO 1 (300A,029C) Source Applicator Wall Nominal Thickness SourceApplicatorWallNominalThickness DS 1 (300A,029E) Source Applicator Wall Nominal Transmission SourceApplicatorWallNominalTransmission DS 1 (300A,02A0) Source Applicator Step Size SourceApplicatorStepSize DS 1 (300A,02A2) Transfer Tube Number TransferTubeNumber IS 1 (300A,02A4) Transfer Tube Length TransferTubeLength DS 1 (300A,02B0) Channel Shield Sequence ChannelShieldSequence SQ 1 (300A,02B2) Channel Shield Number ChannelShieldNumber IS 1 (300A,02B3) Channel Shield ID ChannelShieldID SH 1 (300A,02B4) Channel Shield Name ChannelShieldName LO 1 (300A,02B8) Channel Shield Nominal Thickness ChannelShieldNominalThickness DS 1 (300A,02BA) Channel Shield Nominal Transmission ChannelShieldNominalTransmission DS 1 (300A,02C8) Final Cumulative Time Weight FinalCumulativeTimeWeight DS 1 (300A,02D0) Brachy Control Point Sequence BrachyControlPointSequence SQ 1 (300A,02D2) Control Point Relative Position ControlPointRelativePosition DS 1 (300A,02D4) Control Point 3D Position ControlPoint3DPosition DS 3 (300A,02D6) Cumulative Time Weight CumulativeTimeWeight DS 1 (300A,02E0) Compensator Divergence CompensatorDivergence CS 1 (300A,02E1) Compensator Mounting Position CompensatorMountingPosition CS 1 (300A,02E2) Source to Compensator Distance SourceToCompensatorDistance DS 1-n (300A,02E3) Total Compensator Tray Water-Equivalent Thickness TotalCompensatorTrayWaterEquivalentThickness FL 1 (300A,02E4) Isocenter to Compensator Tray Distance IsocenterToCompensatorTrayDistance FL 1 (300A,02E5) Compensator Column Offset CompensatorColumnOffset FL 1 (300A,02E6) Isocenter to Compensator Distances IsocenterToCompensatorDistances FL 1-n (300A,02E7) Compensator Relative Stopping Power Ratio CompensatorRelativeStoppingPowerRatio FL 1 (300A,02E8) Compensator Milling Tool Diameter CompensatorMillingToolDiameter FL 1 (300A,02EA) Ion Range Compensator Sequence IonRangeCompensatorSequence SQ 1 (300A,02EB) Compensator Description CompensatorDescription LT 1 (300A,0302) Radiation Mass Number RadiationMassNumber IS 1 (300A,0304) Radiation Atomic Number RadiationAtomicNumber IS 1 (300A,0306) Radiation Charge State RadiationChargeState SS 1 (300A,0308) Scan Mode ScanMode CS 1 (300A,0309) Modulated Scan Mode Type ModulatedScanModeType CS 1 (300A,030A) Virtual Source-Axis Distances VirtualSourceAxisDistances FL 2 (300A,030C) Snout Sequence SnoutSequence SQ 1 (300A,030D) Snout Position SnoutPosition FL 1 (300A,030F) Snout ID SnoutID SH 1 (300A,0312) Number of Range Shifters NumberOfRangeShifters IS 1 (300A,0314) Range Shifter Sequence RangeShifterSequence SQ 1 (300A,0316) Range Shifter Number RangeShifterNumber IS 1 (300A,0318) Range Shifter ID RangeShifterID SH 1 (300A,0320) Range Shifter Type RangeShifterType CS 1 (300A,0322) Range Shifter Description RangeShifterDescription LO 1 (300A,0330) Number of Lateral Spreading Devices NumberOfLateralSpreadingDevices IS 1 (300A,0332) Lateral Spreading Device Sequence LateralSpreadingDeviceSequence SQ 1 (300A,0334) Lateral Spreading Device Number LateralSpreadingDeviceNumber IS 1 (300A,0336) Lateral Spreading Device ID LateralSpreadingDeviceID SH 1 (300A,0338) Lateral Spreading Device Type LateralSpreadingDeviceType CS 1 (300A,033A) Lateral Spreading Device Description LateralSpreadingDeviceDescription LO 1 (300A,033C) Lateral Spreading Device Water Equivalent Thickness LateralSpreadingDeviceWaterEquivalentThickness FL 1 (300A,0340) Number of Range Modulators NumberOfRangeModulators IS 1 (300A,0342) Range Modulator Sequence RangeModulatorSequence SQ 1 (300A,0344) Range Modulator Number RangeModulatorNumber IS 1 (300A,0346) Range Modulator ID RangeModulatorID SH 1 (300A,0348) Range Modulator Type RangeModulatorType CS 1 (300A,034A) Range Modulator Description RangeModulatorDescription LO 1 (300A,034C) Beam Current Modulation ID BeamCurrentModulationID SH 1 (300A,0350) Patient Support Type PatientSupportType CS 1 (300A,0352) Patient Support ID PatientSupportID SH 1 (300A,0354) Patient Support Accessory Code PatientSupportAccessoryCode LO 1 (300A,0355) Tray Accessory Code TrayAccessoryCode LO 1 (300A,0356) Fixation Light Azimuthal Angle FixationLightAzimuthalAngle FL 1 (300A,0358) Fixation Light Polar Angle FixationLightPolarAngle FL 1 (300A,035A) Meterset Rate MetersetRate FL 1 (300A,0360) Range Shifter Settings Sequence RangeShifterSettingsSequence SQ 1 (300A,0362) Range Shifter Setting RangeShifterSetting LO 1 (300A,0364) Isocenter to Range Shifter Distance IsocenterToRangeShifterDistance FL 1 (300A,0366) Range Shifter Water Equivalent Thickness RangeShifterWaterEquivalentThickness FL 1 (300A,0370) Lateral Spreading Device Settings Sequence LateralSpreadingDeviceSettingsSequence SQ 1 (300A,0372) Lateral Spreading Device Setting LateralSpreadingDeviceSetting LO 1 (300A,0374) Isocenter to Lateral Spreading Device Distance IsocenterToLateralSpreadingDeviceDistance FL 1 (300A,0380) Range Modulator Settings Sequence RangeModulatorSettingsSequence SQ 1 (300A,0382) Range Modulator Gating Start Value RangeModulatorGatingStartValue FL 1 (300A,0384) Range Modulator Gating Stop Value RangeModulatorGatingStopValue FL 1 (300A,0386) Range Modulator Gating Start Water Equivalent Thickness RangeModulatorGatingStartWaterEquivalentThickness FL 1 (300A,0388) Range Modulator Gating Stop Water Equivalent Thickness RangeModulatorGatingStopWaterEquivalentThickness FL 1 (300A,038A) Isocenter to Range Modulator Distance IsocenterToRangeModulatorDistance FL 1 (300A,038F) Scan Spot Time Offset ScanSpotTimeOffset FL 1-n (300A,0390) Scan Spot Tune ID ScanSpotTuneID SH 1 (300A,0391) Scan Spot Prescribed Indices ScanSpotPrescribedIndices IS 1-n (300A,0392) Number of Scan Spot Positions NumberOfScanSpotPositions IS 1 (300A,0393) Scan Spot Reordered ScanSpotReordered CS 1 (300A,0394) Scan Spot Position Map ScanSpotPositionMap FL 1-n (300A,0395) Scan Spot Reordering Allowed ScanSpotReorderingAllowed CS 1 (300A,0396) Scan Spot Meterset Weights ScanSpotMetersetWeights FL 1-n (300A,0398) Scanning Spot Size ScanningSpotSize FL 2 (300A,039A) Number of Paintings NumberOfPaintings IS 1 (300A,03A0) Ion Tolerance Table Sequence IonToleranceTableSequence SQ 1 (300A,03A2) Ion Beam Sequence IonBeamSequence SQ 1 (300A,03A4) Ion Beam Limiting Device Sequence IonBeamLimitingDeviceSequence SQ 1 (300A,03A6) Ion Block Sequence IonBlockSequence SQ 1 (300A,03A8) Ion Control Point Sequence IonControlPointSequence SQ 1 (300A,03AA) Ion Wedge Sequence IonWedgeSequence SQ 1 (300A,03AC) Ion Wedge Position Sequence IonWedgePositionSequence SQ 1 (300A,0401) Referenced Setup Image Sequence ReferencedSetupImageSequence SQ 1 (300A,0402) Setup Image Comment SetupImageComment ST 1 (300A,0410) Motion Synchronization Sequence MotionSynchronizationSequence SQ 1 (300A,0412) Control Point Orientation ControlPointOrientation FL 3 (300A,0420) General Accessory Sequence GeneralAccessorySequence SQ 1 (300A,0421) General Accessory ID GeneralAccessoryID SH 1 (300A,0422) General Accessory Description GeneralAccessoryDescription ST 1 (300A,0423) General Accessory Type GeneralAccessoryType CS 1 (300A,0424) General Accessory Number GeneralAccessoryNumber IS 1 (300A,0425) Source to General Accessory Distance SourceToGeneralAccessoryDistance FL 1 (300A,0431) Applicator Geometry Sequence ApplicatorGeometrySequence SQ 1 (300A,0432) Applicator Aperture Shape ApplicatorApertureShape CS 1 (300A,0433) Applicator Opening ApplicatorOpening FL 1 (300A,0434) Applicator Opening X ApplicatorOpeningX FL 1 (300A,0435) Applicator Opening Y ApplicatorOpeningY FL 1 (300A,0436) Source to Applicator Mounting Position Distance SourceToApplicatorMountingPositionDistance FL 1 (300A,0440) Number of Block Slab Items NumberOfBlockSlabItems IS 1 (300A,0441) Block Slab Sequence BlockSlabSequence SQ 1 (300A,0442) Block Slab Thickness BlockSlabThickness DS 1 (300A,0443) Block Slab Number BlockSlabNumber US 1 (300A,0450) Device Motion Control Sequence DeviceMotionControlSequence SQ 1 (300A,0451) Device Motion Execution Mode DeviceMotionExecutionMode CS 1 (300A,0452) Device Motion Observation Mode DeviceMotionObservationMode CS 1 (300A,0453) Device Motion Parameter Code Sequence DeviceMotionParameterCodeSequence SQ 1 (300A,0501) Distal Depth Fraction DistalDepthFraction FL 1 (300A,0502) Distal Depth DistalDepth FL 1 (300A,0503) Nominal Range Modulation Fractions NominalRangeModulationFractions FL 2 (300A,0504) Nominal Range Modulated Region Depths NominalRangeModulatedRegionDepths FL 2 (300A,0505) Depth Dose Parameters Sequence DepthDoseParametersSequence SQ 1 (300A,0506) Delivered Depth Dose Parameters Sequence DeliveredDepthDoseParametersSequence SQ 1 (300A,0507) Delivered Distal Depth Fraction DeliveredDistalDepthFraction FL 1 (300A,0508) Delivered Distal Depth DeliveredDistalDepth FL 1 (300A,0509) Delivered Nominal Range Modulation Fractions DeliveredNominalRangeModulationFractions FL 2 (300A,0510) Delivered Nominal Range Modulated Region Depths DeliveredNominalRangeModulatedRegionDepths FL 2 (300A,0511) Delivered Reference Dose Definition DeliveredReferenceDoseDefinition CS 1 (300A,0512) Reference Dose Definition ReferenceDoseDefinition CS 1 (300A,0600) RT Control Point Index RTControlPointIndex US 1 (300A,0601) Radiation Generation Mode Index RadiationGenerationModeIndex US 1 (300A,0602) Referenced Defined Device Index ReferencedDefinedDeviceIndex US 1 (300A,0603) Radiation Dose Identification Index RadiationDoseIdentificationIndex US 1 (300A,0604) Number of RT Control Points NumberOfRTControlPoints US 1 (300A,0605) Referenced Radiation Generation Mode Index ReferencedRadiationGenerationModeIndex US 1 (300A,0606) Treatment Position Index TreatmentPositionIndex US 1 (300A,0607) Referenced Device Index ReferencedDeviceIndex US 1 (300A,0608) Treatment Position Group Label TreatmentPositionGroupLabel LO 1 (300A,0609) Treatment Position Group UID TreatmentPositionGroupUID UI 1 (300A,060A) Treatment Position Group Sequence TreatmentPositionGroupSequence SQ 1 (300A,060B) Referenced Treatment Position Index ReferencedTreatmentPositionIndex US 1 (300A,060C) Referenced Radiation Dose Identification Index ReferencedRadiationDoseIdentificationIndex US 1 (300A,060D) RT Accessory Holder Water-Equivalent Thickness RTAccessoryHolderWaterEquivalentThickness FD 1 (300A,060E) Referenced RT Accessory Holder Device Index ReferencedRTAccessoryHolderDeviceIndex US 1 (300A,060F) RT Accessory Holder Slot Existence Flag RTAccessoryHolderSlotExistenceFlag CS 1 (300A,0610) RT Accessory Holder Slot Sequence RTAccessoryHolderSlotSequence SQ 1 (300A,0611) RT Accessory Holder Slot ID RTAccessoryHolderSlotID LO 1 (300A,0612) RT Accessory Holder Slot Distance RTAccessoryHolderSlotDistance FD 1 (300A,0613) RT Accessory Slot Distance RTAccessorySlotDistance FD 1 (300A,0614) RT Accessory Holder Definition Sequence RTAccessoryHolderDefinitionSequence SQ 1 (300A,0615) RT Accessory Device Slot ID RTAccessoryDeviceSlotID LO 1 (300A,0616) RT Radiation Sequence RTRadiationSequence SQ 1 (300A,0617) Radiation Dose Sequence RadiationDoseSequence SQ 1 (300A,0618) Radiation Dose Identification Sequence RadiationDoseIdentificationSequence SQ 1 (300A,0619) Radiation Dose Identification Label RadiationDoseIdentificationLabel LO 1 (300A,061A) Reference Dose Type ReferenceDoseType CS 1 (300A,061B) Primary Dose Value Indicator PrimaryDoseValueIndicator CS 1 (300A,061C) Dose Values Sequence DoseValuesSequence SQ 1 (300A,061D) Dose Value Purpose DoseValuePurpose CS 1-n (300A,061E) Reference Dose Point Coordinates ReferenceDosePointCoordinates FD 3 (300A,061F) Radiation Dose Values Parameters Sequence RadiationDoseValuesParametersSequence SQ 1 (300A,0620) Meterset to Dose Mapping Sequence MetersetToDoseMappingSequence SQ 1 (300A,0621) Expected In-Vivo Measurement Values Sequence ExpectedInVivoMeasurementValuesSequence SQ 1 (300A,0622) Expected In-Vivo Measurement Value Index ExpectedInVivoMeasurementValueIndex US 1 (300A,0623) Radiation Dose In-Vivo Measurement Label RadiationDoseInVivoMeasurementLabel LO 1 (300A,0624) Radiation Dose Central Axis Displacement RadiationDoseCentralAxisDisplacement FD 2 (300A,0625) Radiation Dose Value RadiationDoseValue FD 1 (300A,0626) Radiation Dose Source to Skin Distance RadiationDoseSourceToSkinDistance FD 1 (300A,0627) Radiation Dose Measurement Point Coordinates RadiationDoseMeasurementPointCoordinates FD 3 (300A,0628) Radiation Dose Source to External Contour Distance RadiationDoseSourceToExternalContourDistance FD 1 (300A,0629) RT Tolerance Set Sequence RTToleranceSetSequence SQ 1 (300A,062A) RT Tolerance Set Label RTToleranceSetLabel LO 1 (300A,062B) Attribute Tolerance Values Sequence AttributeToleranceValuesSequence SQ 1 (300A,062C) Tolerance Value ToleranceValue FD 1 (300A,062D) Patient Support Position Tolerance Sequence PatientSupportPositionToleranceSequence SQ 1 (300A,062E) Treatment Time Limit TreatmentTimeLimit FD 1 (300A,062F) C-Arm Photon-Electron Control Point Sequence CArmPhotonElectronControlPointSequence SQ 1 (300A,0630) Referenced RT Radiation Sequence ReferencedRTRadiationSequence SQ 1 (300A,0631) Referenced RT Instance Sequence ReferencedRTInstanceSequence SQ 1 (300A,0632) Referenced RT Patient Setup Sequence ReferencedRTPatientSetupSequence SQ 1 (300A,0634) Source to Patient Surface Distance SourceToPatientSurfaceDistance FD 1 (300A,0635) Treatment Machine Special Mode Code Sequence TreatmentMachineSpecialModeCodeSequence SQ 1 (300A,0636) Intended Number of Fractions IntendedNumberOfFractions US 1 (300A,0637) RT Radiation Set Intent RTRadiationSetIntent CS 1 (300A,0638) RT Radiation Physical and Geometric Content Detail Flag RTRadiationPhysicalAndGeometricContentDetailFlag CS 1 (300A,0639) RT Record Flag RTRecordFlag CS 1 (300A,063A) Treatment Device Identification Sequence TreatmentDeviceIdentificationSequence SQ 1 (300A,063B) Referenced RT Physician Intent Sequence ReferencedRTPhysicianIntentSequence SQ 1 (300A,063C) Cumulative Meterset CumulativeMeterset FD 1 (300A,063D) Delivery Rate DeliveryRate FD 1 (300A,063E) Delivery Rate Unit Sequence DeliveryRateUnitSequence SQ 1 (300A,063F) Treatment Position Sequence TreatmentPositionSequence SQ 1 (300A,0640) Radiation Source-Axis Distance RadiationSourceAxisDistance FD 1 (300A,0641) Number of RT Beam Limiting Devices NumberOfRTBeamLimitingDevices US 1 (300A,0642) RT Beam Limiting Device Proximal Distance RTBeamLimitingDeviceProximalDistance FD 1 (300A,0643) RT Beam Limiting Device Distal Distance RTBeamLimitingDeviceDistalDistance FD 1 (300A,0644) Parallel RT Beam Delimiter Device Orientation Label Code Sequence ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence SQ 1 (300A,0645) Beam Modifier Orientation Angle BeamModifierOrientationAngle FD 1 (300A,0646) Fixed RT Beam Delimiter Device Sequence FixedRTBeamDelimiterDeviceSequence SQ 1 (300A,0647) Parallel RT Beam Delimiter Device Sequence ParallelRTBeamDelimiterDeviceSequence SQ 1 (300A,0648) Number of Parallel RT Beam Delimiters NumberOfParallelRTBeamDelimiters US 1 (300A,0649) Parallel RT Beam Delimiter Boundaries ParallelRTBeamDelimiterBoundaries FD 2-n (300A,064A) Parallel RT Beam Delimiter Positions ParallelRTBeamDelimiterPositions FD 2-n (300A,064B) RT Beam Limiting Device Offset RTBeamLimitingDeviceOffset FD 2 (300A,064C) RT Beam Delimiter Geometry Sequence RTBeamDelimiterGeometrySequence SQ 1 (300A,064D) RT Beam Limiting Device Definition Sequence RTBeamLimitingDeviceDefinitionSequence SQ 1 (300A,064E) Parallel RT Beam Delimiter Opening Mode ParallelRTBeamDelimiterOpeningMode CS 1 (300A,064F) Parallel RT Beam Delimiter Leaf Mounting Side ParallelRTBeamDelimiterLeafMountingSide CS 1-n (300A,0650) Patient Setup UID PatientSetupUID UI 1 (300A,0651) Wedge Definition Sequence WedgeDefinitionSequence SQ 1 (300A,0652) Radiation Beam Wedge Angle RadiationBeamWedgeAngle FD 1 (300A,0653) Radiation Beam Wedge Thin Edge Distance RadiationBeamWedgeThinEdgeDistance FD 1 (300A,0654) Radiation Beam Effective Wedge Angle RadiationBeamEffectiveWedgeAngle FD 1 (300A,0655) Number of Wedge Positions NumberOfWedgePositions US 1 (300A,0656) RT Beam Limiting Device Opening Sequence RTBeamLimitingDeviceOpeningSequence SQ 1 (300A,0657) Number of RT Beam Limiting Device Openings NumberOfRTBeamLimitingDeviceOpenings US 1 (300A,0658) Radiation Dosimeter Unit Sequence RadiationDosimeterUnitSequence SQ 1 (300A,0659) RT Device Distance Reference Location Code Sequence RTDeviceDistanceReferenceLocationCodeSequence SQ 1 (300A,065A) Radiation Device Configuration and Commissioning Key Sequence RadiationDeviceConfigurationAndCommissioningKeySequence SQ 1 (300A,065B) Patient Support Position Parameter Sequence PatientSupportPositionParameterSequence SQ 1 (300A,065C) Patient Support Position Specification Method PatientSupportPositionSpecificationMethod CS 1 (300A,065D) Patient Support Position Device Parameter Sequence PatientSupportPositionDeviceParameterSequence SQ 1 (300A,065E) Device Order Index DeviceOrderIndex US 1 (300A,065F) Patient Support Position Parameter Order Index PatientSupportPositionParameterOrderIndex US 1 (300A,0660) Patient Support Position Device Tolerance Sequence PatientSupportPositionDeviceToleranceSequence SQ 1 (300A,0661) Patient Support Position Tolerance Order Index PatientSupportPositionToleranceOrderIndex US 1 (300A,0662) Compensator Definition Sequence CompensatorDefinitionSequence SQ 1 (300A,0663) Compensator Map Orientation CompensatorMapOrientation CS 1 (300A,0664) Compensator Proximal Thickness Map CompensatorProximalThicknessMap OF 1 (300A,0665) Compensator Distal Thickness Map CompensatorDistalThicknessMap OF 1 (300A,0666) Compensator Base Plane Offset CompensatorBasePlaneOffset FD 1 (300A,0667) Compensator Shape Fabrication Code Sequence CompensatorShapeFabricationCodeSequence SQ 1 (300A,0668) Compensator Shape Sequence CompensatorShapeSequence SQ 1 (300A,0669) Radiation Beam Compensator Milling Tool Diameter RadiationBeamCompensatorMillingToolDiameter FD 1 (300A,066A) Block Definition Sequence BlockDefinitionSequence SQ 1 (300A,066B) Block Edge Data BlockEdgeData OF 1 (300A,066C) Block Orientation BlockOrientation CS 1 (300A,066D) Radiation Beam Block Thickness RadiationBeamBlockThickness FD 1 (300A,066E) Radiation Beam Block Slab Thickness RadiationBeamBlockSlabThickness FD 1 (300A,066F) Block Edge Data Sequence BlockEdgeDataSequence SQ 1 (300A,0670) Number of RT Accessory Holders NumberOfRTAccessoryHolders US 1 (300A,0671) General Accessory Definition Sequence GeneralAccessoryDefinitionSequence SQ 1 (300A,0672) Number of General Accessories NumberOfGeneralAccessories US 1 (300A,0673) Bolus Definition Sequence BolusDefinitionSequence SQ 1 (300A,0674) Number of Boluses NumberOfBoluses US 1 (300A,0675) Equipment Frame of Reference UID EquipmentFrameOfReferenceUID UI 1 (300A,0676) Equipment Frame of Reference Description EquipmentFrameOfReferenceDescription ST 1 (300A,0677) Equipment Reference Point Coordinates Sequence EquipmentReferencePointCoordinatesSequence SQ 1 (300A,0678) Equipment Reference Point Code Sequence EquipmentReferencePointCodeSequence SQ 1 (300A,0679) RT Beam Limiting Device Angle RTBeamLimitingDeviceAngle FD 1 (300A,067A) Source Roll Angle SourceRollAngle FD 1 (300A,067B) Radiation GenerationMode Sequence RadiationGenerationModeSequence SQ 1 (300A,067C) Radiation GenerationMode Label RadiationGenerationModeLabel SH 1 (300A,067D) Radiation GenerationMode Description RadiationGenerationModeDescription ST 1 (300A,067E) Radiation GenerationMode Machine Code Sequence RadiationGenerationModeMachineCodeSequence SQ 1 (300A,067F) Radiation Type Code Sequence RadiationTypeCodeSequence SQ 1 (300A,0680) Nominal Energy NominalEnergy DS 1 (300A,0681) Minimum Nominal Energy MinimumNominalEnergy DS 1 (300A,0682) Maximum Nominal Energy MaximumNominalEnergy DS 1 (300A,0683) Radiation Fluence Modifier Code Sequence RadiationFluenceModifierCodeSequence SQ 1 (300A,0684) Energy Unit Code Sequence EnergyUnitCodeSequence SQ 1 (300A,0685) Number of Radiation GenerationModes NumberOfRadiationGenerationModes US 1 (300A,0686) Patient Support Devices Sequence PatientSupportDevicesSequence SQ 1 (300A,0687) Number of Patient Support Devices NumberOfPatientSupportDevices US 1 (300A,0688) RT Beam Modifier Definition Distance RTBeamModifierDefinitionDistance FD 1 (300A,0689) Beam Area Limit Sequence BeamAreaLimitSequence SQ 1 (300A,068A) Referenced RT Prescription Sequence ReferencedRTPrescriptionSequence SQ 1 (300C,0002) Referenced RT Plan Sequence ReferencedRTPlanSequence SQ 1 (300C,0004) Referenced Beam Sequence ReferencedBeamSequence SQ 1 (300C,0006) Referenced Beam Number ReferencedBeamNumber IS 1 (300C,0007) Referenced Reference Image Number ReferencedReferenceImageNumber IS 1 (300C,0008) Start Cumulative Meterset Weight StartCumulativeMetersetWeight DS 1 (300C,0009) End Cumulative Meterset Weight EndCumulativeMetersetWeight DS 1 (300C,000A) Referenced Brachy Application Setup Sequence ReferencedBrachyApplicationSetupSequence SQ 1 (300C,000C) Referenced Brachy Application Setup Number ReferencedBrachyApplicationSetupNumber IS 1 (300C,000E) Referenced Source Number ReferencedSourceNumber IS 1 (300C,0020) Referenced Fraction Group Sequence ReferencedFractionGroupSequence SQ 1 (300C,0022) Referenced Fraction Group Number ReferencedFractionGroupNumber IS 1 (300C,0040) Referenced Verification Image Sequence ReferencedVerificationImageSequence SQ 1 (300C,0042) Referenced Reference Image Sequence ReferencedReferenceImageSequence SQ 1 (300C,0050) Referenced Dose Reference Sequence ReferencedDoseReferenceSequence SQ 1 (300C,0051) Referenced Dose Reference Number ReferencedDoseReferenceNumber IS 1 (300C,0055) Brachy Referenced Dose Reference Sequence BrachyReferencedDoseReferenceSequence SQ 1 (300C,0060) Referenced Structure Set Sequence ReferencedStructureSetSequence SQ 1 (300C,006A) Referenced Patient Setup Number ReferencedPatientSetupNumber IS 1 (300C,0080) Referenced Dose Sequence ReferencedDoseSequence SQ 1 (300C,00A0) Referenced Tolerance Table Number ReferencedToleranceTableNumber IS 1 (300C,00B0) Referenced Bolus Sequence ReferencedBolusSequence SQ 1 (300C,00C0) Referenced Wedge Number ReferencedWedgeNumber IS 1 (300C,00D0) Referenced Compensator Number ReferencedCompensatorNumber IS 1 (300C,00E0) Referenced Block Number ReferencedBlockNumber IS 1 (300C,00F0) Referenced Control Point Index ReferencedControlPointIndex IS 1 (300C,00F2) Referenced Control Point Sequence ReferencedControlPointSequence SQ 1 (300C,00F4) Referenced Start Control Point Index ReferencedStartControlPointIndex IS 1 (300C,00F6) Referenced Stop Control Point Index ReferencedStopControlPointIndex IS 1 (300C,0100) Referenced Range Shifter Number ReferencedRangeShifterNumber IS 1 (300C,0102) Referenced Lateral Spreading Device Number ReferencedLateralSpreadingDeviceNumber IS 1 (300C,0104) Referenced Range Modulator Number ReferencedRangeModulatorNumber IS 1 (300C,0111) Omitted Beam Task Sequence OmittedBeamTaskSequence SQ 1 (300C,0112) Reason for Omission ReasonForOmission CS 1 (300C,0113) Reason for Omission Description ReasonForOmissionDescription LO 1 (300E,0002) Approval Status ApprovalStatus CS 1 (300E,0004) Review Date ReviewDate DA 1 (300E,0005) Review Time ReviewTime TM 1 (300E,0008) Reviewer Name ReviewerName PN 1 (3010,0001) Radiobiological Dose Effect Sequence RadiobiologicalDoseEffectSequence SQ 1 (3010,0002) Radiobiological Dose Effect Flag RadiobiologicalDoseEffectFlag CS 1 (3010,0003) Effective Dose Calculation Method Category Code Sequence EffectiveDoseCalculationMethodCategoryCodeSequence SQ 1 (3010,0004) Effective Dose Calculation Method Code Sequence EffectiveDoseCalculationMethodCodeSequence SQ 1 (3010,0005) Effective Dose Calculation Method Description EffectiveDoseCalculationMethodDescription LO 1 (3010,0006) Conceptual Volume UID ConceptualVolumeUID UI 1 (3010,0007) Originating SOP Instance Reference Sequence OriginatingSOPInstanceReferenceSequence SQ 1 (3010,0008) Conceptual Volume Constituent Sequence ConceptualVolumeConstituentSequence SQ 1 (3010,0009) Equivalent Conceptual Volume Instance Reference Sequence EquivalentConceptualVolumeInstanceReferenceSequence SQ 1 (3010,000A) Equivalent Conceptual Volumes Sequence EquivalentConceptualVolumesSequence SQ 1 (3010,000B) Referenced Conceptual Volume UID ReferencedConceptualVolumeUID UI 1 (3010,000C) Conceptual Volume Combination Expression ConceptualVolumeCombinationExpression UT 1 (3010,000D) Conceptual Volume Constituent Index ConceptualVolumeConstituentIndex US 1 (3010,000E) Conceptual Volume Combination Flag ConceptualVolumeCombinationFlag CS 1 (3010,000F) Conceptual Volume Combination Description ConceptualVolumeCombinationDescription ST 1 (3010,0010) Conceptual Volume Segmentation Defined Flag ConceptualVolumeSegmentationDefinedFlag CS 1 (3010,0011) Conceptual Volume Segmentation Reference Sequence ConceptualVolumeSegmentationReferenceSequence SQ 1 (3010,0012) Conceptual Volume Constituent Segmentation Reference Sequence ConceptualVolumeConstituentSegmentationReferenceSequence SQ 1 (3010,0013) Constituent Conceptual Volume UID ConstituentConceptualVolumeUID UI 1 (3010,0014) Derivation Conceptual Volume Sequence DerivationConceptualVolumeSequence SQ 1 (3010,0015) Source Conceptual Volume UID SourceConceptualVolumeUID UI 1 (3010,0016) Conceptual Volume Derivation Algorithm Sequence ConceptualVolumeDerivationAlgorithmSequence SQ 1 (3010,0017) Conceptual Volume Description ConceptualVolumeDescription ST 1 (3010,0018) Source Conceptual Volume Sequence SourceConceptualVolumeSequence SQ 1 (3010,0019) Author Identification Sequence AuthorIdentificationSequence SQ 1 (3010,001A) Manufacturer's Model Version ManufacturerModelVersion LO 1 (3010,001B) Device Alternate Identifier DeviceAlternateIdentifier UC 1 (3010,001C) Device Alternate Identifier Type DeviceAlternateIdentifierType CS 1 (3010,001D) Device Alternate Identifier Format DeviceAlternateIdentifierFormat LT 1 (3010,001E) Segmentation Creation Template Label SegmentationCreationTemplateLabel LO 1 (3010,001F) Segmentation Template UID SegmentationTemplateUID UI 1 (3010,0020) Referenced Segment Reference Index ReferencedSegmentReferenceIndex US 1 (3010,0021) Segment Reference Sequence SegmentReferenceSequence SQ 1 (3010,0022) Segment Reference Index SegmentReferenceIndex US 1 (3010,0023) Direct Segment Reference Sequence DirectSegmentReferenceSequence SQ 1 (3010,0024) Combination Segment Reference Sequence CombinationSegmentReferenceSequence SQ 1 (3010,0025) Conceptual Volume Sequence ConceptualVolumeSequence SQ 1 (3010,0026) Segmented RT Accessory Device Sequence SegmentedRTAccessoryDeviceSequence SQ 1 (3010,0027) Segment Characteristics Sequence SegmentCharacteristicsSequence SQ 1 (3010,0028) Related Segment Characteristics Sequence RelatedSegmentCharacteristicsSequence SQ 1 (3010,0029) Segment Characteristics Precedence SegmentCharacteristicsPrecedence US 1 (3010,002A) RT Segment Annotation Sequence RTSegmentAnnotationSequence SQ 1 (3010,002B) Segment Annotation Category Code Sequence SegmentAnnotationCategoryCodeSequence SQ 1 (3010,002C) Segment Annotation Type Code Sequence SegmentAnnotationTypeCodeSequence SQ 1 (3010,002D) Device Label DeviceLabel LO 1 (3010,002E) Device Type Code Sequence DeviceTypeCodeSequence SQ 1 (3010,0030) Patient Equipment Relationship Code Sequence PatientEquipmentRelationshipCodeSequence SQ 1 (3010,0031) Referenced Fiducials UID ReferencedFiducialsUID UI 1 (3010,0032) Patient Treatment Orientation Sequence PatientTreatmentOrientationSequence SQ 1 (3010,0033) User Content Label UserContentLabel SH 1 (3010,0034) User Content Long Label UserContentLongLabel LO 1 (3010,0035) Entity Label EntityLabel SH 1 (3010,0036) Entity Name EntityName LO 1 (3010,0037) Entity Description EntityDescription ST 1 (3010,0038) Entity Long Label EntityLongLabel LO 1 (3010,0039) Device Index DeviceIndex US 1 (3010,003A) RT Treatment Phase Index RTTreatmentPhaseIndex US 1 (3010,003B) RT Treatment Phase UID RTTreatmentPhaseUID UI 1 (3010,003C) RT Prescription Index RTPrescriptionIndex US 1 (3010,003D) RT Segment Annotation Index RTSegmentAnnotationIndex US 1 (3010,003E) Basis RT Treatment Phase Index BasisRTTreatmentPhaseIndex US 1 (3010,003F) Related RT Treatment Phase Index RelatedRTTreatmentPhaseIndex US 1 (3010,0040) Referenced RT Treatment Phase Index ReferencedRTTreatmentPhaseIndex US 1 (3010,0041) Referenced RT Prescription Index ReferencedRTPrescriptionIndex US 1 (3010,0042) Referenced Parent RT Prescription Index ReferencedParentRTPrescriptionIndex US 1 (3010,0043) Manufacturer's Device Identifier ManufacturerDeviceIdentifier ST 1 (3010,0044) Instance-Level Referenced Performed Procedure Step Sequence InstanceLevelReferencedPerformedProcedureStepSequence SQ 1 (3010,0045) RT Treatment Phase Intent Presence Flag RTTreatmentPhaseIntentPresenceFlag CS 1 (3010,0046) Radiotherapy Treatment Type RadiotherapyTreatmentType CS 1 (3010,0047) Teletherapy Radiation Type TeletherapyRadiationType CS 1-n (3010,0048) Brachytherapy Source Type BrachytherapySourceType CS 1-n (3010,0049) Referenced RT Treatment Phase Sequence ReferencedRTTreatmentPhaseSequence SQ 1 (3010,004A) Referenced Direct Segment Instance Sequence ReferencedDirectSegmentInstanceSequence SQ 1 (3010,004B) Intended RT Treatment Phase Sequence IntendedRTTreatmentPhaseSequence SQ 1 (3010,004C) Intended Phase Start Date IntendedPhaseStartDate DA 1 (3010,004D) Intended Phase End Date IntendedPhaseEndDate DA 1 (3010,004E) RT Treatment Phase Interval Sequence RTTreatmentPhaseIntervalSequence SQ 1 (3010,004F) Temporal Relationship Interval Anchor TemporalRelationshipIntervalAnchor CS 1 (3010,0050) Minimum Number of Interval Days MinimumNumberOfIntervalDays FD 1 (3010,0051) Maximum Number of Interval Days MaximumNumberOfIntervalDays FD 1 (3010,0052) Pertinent SOP Classes in Study PertinentSOPClassesInStudy UI 1-n (3010,0053) Pertinent SOP Classes in Series PertinentSOPClassesInSeries UI 1-n (3010,0054) RT Prescription Label RTPrescriptionLabel LO 1 (3010,0055) RT Physician Intent Predecessor Sequence RTPhysicianIntentPredecessorSequence SQ 1 (3010,0056) RT Treatment Approach Label RTTreatmentApproachLabel LO 1 (3010,0057) RT Physician Intent Sequence RTPhysicianIntentSequence SQ 1 (3010,0058) RT Physician Intent Index RTPhysicianIntentIndex US 1 (3010,0059) RT Treatment Intent Type RTTreatmentIntentType CS 1 (3010,005A) RT Physician Intent Narrative RTPhysicianIntentNarrative UT 1 (3010,005B) RT Protocol Code Sequence RTProtocolCodeSequence SQ 1 (3010,005C) Reason for Superseding ReasonForSuperseding ST 1 (3010,005D) RT Diagnosis Code Sequence RTDiagnosisCodeSequence SQ 1 (3010,005E) Referenced RT Physician Intent Index ReferencedRTPhysicianIntentIndex US 1 (3010,005F) RT Physician Intent Input Instance Sequence RTPhysicianIntentInputInstanceSequence SQ 1 (3010,0060) RT Anatomic Prescription Sequence RTAnatomicPrescriptionSequence SQ 1 (3010,0061) Prior Treatment Dose Description PriorTreatmentDoseDescription UT 1 (3010,0062) Prior Treatment Reference Sequence PriorTreatmentReferenceSequence SQ 1 (3010,0063) Dosimetric Objective Evaluation Scope DosimetricObjectiveEvaluationScope CS 1 (3010,0064) Therapeutic Role Category Code Sequence TherapeuticRoleCategoryCodeSequence SQ 1 (3010,0065) Therapeutic Role Type Code Sequence TherapeuticRoleTypeCodeSequence SQ 1 (3010,0066) Conceptual Volume Optimization Precedence ConceptualVolumeOptimizationPrecedence US 1 (3010,0067) Conceptual Volume Category Code Sequence ConceptualVolumeCategoryCodeSequence SQ 1 (3010,0068) Conceptual Volume Blocking Constraint ConceptualVolumeBlockingConstraint CS 1 (3010,0069) Conceptual Volume Type Code Sequence ConceptualVolumeTypeCodeSequence SQ 1 (3010,006A) Conceptual Volume Type Modifier Code Sequence ConceptualVolumeTypeModifierCodeSequence SQ 1 (3010,006B) RT Prescription Sequence RTPrescriptionSequence SQ 1 (3010,006C) Dosimetric Objective Sequence DosimetricObjectiveSequence SQ 1 (3010,006D) Dosimetric Objective Type Code Sequence DosimetricObjectiveTypeCodeSequence SQ 1 (3010,006E) Dosimetric Objective UID DosimetricObjectiveUID UI 1 (3010,006F) Referenced Dosimetric Objective UID ReferencedDosimetricObjectiveUID UI 1 (3010,0070) Dosimetric Objective Parameter Sequence DosimetricObjectiveParameterSequence SQ 1 (3010,0071) Referenced Dosimetric Objectives Sequence ReferencedDosimetricObjectivesSequence SQ 1 (3010,0073) Absolute Dosimetric Objective Flag AbsoluteDosimetricObjectiveFlag CS 1 (3010,0074) Dosimetric Objective Weight DosimetricObjectiveWeight FD 1 (3010,0075) Dosimetric Objective Purpose DosimetricObjectivePurpose CS 1 (3010,0076) Planning Input Information Sequence PlanningInputInformationSequence SQ 1 (3010,0077) Treatment Site TreatmentSite LO 1 (3010,0078) Treatment Site Code Sequence TreatmentSiteCodeSequence SQ 1 (3010,0079) Fraction Pattern Sequence FractionPatternSequence SQ 1 (3010,007A) Treatment Technique Notes TreatmentTechniqueNotes UT 1 (3010,007B) Prescription Notes PrescriptionNotes UT 1 (3010,007C) Number of Interval Fractions NumberOfIntervalFractions IS 1 (3010,007D) Number of Fractions NumberOfFractions US 1 (3010,007E) Intended Delivery Duration IntendedDeliveryDuration US 1 (3010,007F) Fractionation Notes FractionationNotes UT 1 (3010,0080) RT Treatment Technique Code Sequence RTTreatmentTechniqueCodeSequence SQ 1 (3010,0081) Prescription Notes Sequence PrescriptionNotesSequence SQ 1 (3010,0082) Fraction-Based Relationship Sequence FractionBasedRelationshipSequence SQ 1 (3010,0083) Fraction-Based Relationship Interval Anchor FractionBasedRelationshipIntervalAnchor CS 1 (3010,0084) Minimum Hours between Fractions MinimumHoursBetweenFractions FD 1 (3010,0085) Intended Fraction Start Time IntendedFractionStartTime TM 1-n (3010,0086) Intended Start Day of Week IntendedStartDayOfWeek LT 1 (3010,0087) Weekday Fraction Pattern Sequence WeekdayFractionPatternSequence SQ 1 (3010,0088) Delivery Time Structure Code Sequence DeliveryTimeStructureCodeSequence SQ 1 (4000,0010) Arbitrary Arbitrary LT 1 RET (4000,4000) Text Comments TextComments LT 1 RET (4008,0040) Results ID ResultsID SH 1 RET (4008,0042) Results ID Issuer ResultsIDIssuer LO 1 RET (4008,0050) Referenced Interpretation Sequence ReferencedInterpretationSequence SQ 1 RET (4008,00FF) Report Production Status (Trial) ReportProductionStatusTrial CS 1 RET (4008,0100) Interpretation Recorded Date InterpretationRecordedDate DA 1 RET (4008,0101) Interpretation Recorded Time InterpretationRecordedTime TM 1 RET (4008,0102) Interpretation Recorder InterpretationRecorder PN 1 RET (4008,0103) Reference to Recorded Sound ReferenceToRecordedSound LO 1 RET (4008,0108) Interpretation Transcription Date InterpretationTranscriptionDate DA 1 RET (4008,0109) Interpretation Transcription Time InterpretationTranscriptionTime TM 1 RET (4008,010A) Interpretation Transcriber InterpretationTranscriber PN 1 RET (4008,010B) Interpretation Text InterpretationText ST 1 RET (4008,010C) Interpretation Author InterpretationAuthor PN 1 RET (4008,0111) Interpretation Approver Sequence InterpretationApproverSequence SQ 1 RET (4008,0112) Interpretation Approval Date InterpretationApprovalDate DA 1 RET (4008,0113) Interpretation Approval Time InterpretationApprovalTime TM 1 RET (4008,0114) Physician Approving Interpretation PhysicianApprovingInterpretation PN 1 RET (4008,0115) Interpretation Diagnosis Description InterpretationDiagnosisDescription LT 1 RET (4008,0117) Interpretation Diagnosis Code Sequence InterpretationDiagnosisCodeSequence SQ 1 RET (4008,0118) Results Distribution List Sequence ResultsDistributionListSequence SQ 1 RET (4008,0119) Distribution Name DistributionName PN 1 RET (4008,011A) Distribution Address DistributionAddress LO 1 RET (4008,0200) Interpretation ID InterpretationID SH 1 RET (4008,0202) Interpretation ID Issuer InterpretationIDIssuer LO 1 RET (4008,0210) Interpretation Type ID InterpretationTypeID CS 1 RET (4008,0212) Interpretation Status ID InterpretationStatusID CS 1 RET (4008,0300) Impressions Impressions ST 1 RET (4008,4000) Results Comments ResultsComments ST 1 RET (4010,0001) Low Energy Detectors LowEnergyDetectors CS 1 DICOS (4010,0002) High Energy Detectors HighEnergyDetectors CS 1 DICOS (4010,0004) Detector Geometry Sequence DetectorGeometrySequence SQ 1 DICOS (4010,1001) Threat ROI Voxel Sequence ThreatROIVoxelSequence SQ 1 DICOS (4010,1004) Threat ROI Base ThreatROIBase FL 3 DICOS (4010,1005) Threat ROI Extents ThreatROIExtents FL 3 DICOS (4010,1006) Threat ROI Bitmap ThreatROIBitmap OB 1 DICOS (4010,1007) Route Segment ID RouteSegmentID SH 1 DICOS (4010,1008) Gantry Type GantryType CS 1 DICOS (4010,1009) OOI Owner Type OOIOwnerType CS 1 DICOS (4010,100A) Route Segment Sequence RouteSegmentSequence SQ 1 DICOS (4010,1010) Potential Threat Object ID PotentialThreatObjectID US 1 DICOS (4010,1011) Threat Sequence ThreatSequence SQ 1 DICOS (4010,1012) Threat Category ThreatCategory CS 1 DICOS (4010,1013) Threat Category Description ThreatCategoryDescription LT 1 DICOS (4010,1014) ATD Ability Assessment ATDAbilityAssessment CS 1 DICOS (4010,1015) ATD Assessment Flag ATDAssessmentFlag CS 1 DICOS (4010,1016) ATD Assessment Probability ATDAssessmentProbability FL 1 DICOS (4010,1017) Mass Mass FL 1 DICOS (4010,1018) Density Density FL 1 DICOS (4010,1019) Z Effective ZEffective FL 1 DICOS (4010,101A) Boarding Pass ID BoardingPassID SH 1 DICOS (4010,101B) Center of Mass CenterOfMass FL 3 DICOS (4010,101C) Center of PTO CenterOfPTO FL 3 DICOS (4010,101D) Bounding Polygon BoundingPolygon FL 6-n DICOS (4010,101E) Route Segment Start Location ID RouteSegmentStartLocationID SH 1 DICOS (4010,101F) Route Segment End Location ID RouteSegmentEndLocationID SH 1 DICOS (4010,1020) Route Segment Location ID Type RouteSegmentLocationIDType CS 1 DICOS (4010,1021) Abort Reason AbortReason CS 1-n DICOS (4010,1023) Volume of PTO VolumeOfPTO FL 1 DICOS (4010,1024) Abort Flag AbortFlag CS 1 DICOS (4010,1025) Route Segment Start Time RouteSegmentStartTime DT 1 DICOS (4010,1026) Route Segment End Time RouteSegmentEndTime DT 1 DICOS (4010,1027) TDR Type TDRType CS 1 DICOS (4010,1028) International Route Segment InternationalRouteSegment CS 1 DICOS (4010,1029) Threat Detection Algorithm and Version ThreatDetectionAlgorithmandVersion LO 1-n DICOS (4010,102A) Assigned Location AssignedLocation SH 1 DICOS (4010,102B) Alarm Decision Time AlarmDecisionTime DT 1 DICOS (4010,1031) Alarm Decision AlarmDecision CS 1 DICOS (4010,1033) Number of Total Objects NumberOfTotalObjects US 1 DICOS (4010,1034) Number of Alarm Objects NumberOfAlarmObjects US 1 DICOS (4010,1037) PTO Representation Sequence PTORepresentationSequence SQ 1 DICOS (4010,1038) ATD Assessment Sequence ATDAssessmentSequence SQ 1 DICOS (4010,1039) TIP Type TIPType CS 1 DICOS (4010,103A) DICOS Version DICOSVersion CS 1 DICOS (4010,1041) OOI Owner Creation Time OOIOwnerCreationTime DT 1 DICOS (4010,1042) OOI Type OOIType CS 1 DICOS (4010,1043) OOI Size OOISize FL 3 DICOS (4010,1044) Acquisition Status AcquisitionStatus CS 1 DICOS (4010,1045) Basis Materials Code Sequence BasisMaterialsCodeSequence SQ 1 DICOS (4010,1046) Phantom Type PhantomType CS 1 DICOS (4010,1047) OOI Owner Sequence OOIOwnerSequence SQ 1 DICOS (4010,1048) Scan Type ScanType CS 1 DICOS (4010,1051) Itinerary ID ItineraryID LO 1 DICOS (4010,1052) Itinerary ID Type ItineraryIDType SH 1 DICOS (4010,1053) Itinerary ID Assigning Authority ItineraryIDAssigningAuthority LO 1 DICOS (4010,1054) Route ID RouteID SH 1 DICOS (4010,1055) Route ID Assigning Authority RouteIDAssigningAuthority SH 1 DICOS (4010,1056) Inbound Arrival Type InboundArrivalType CS 1 DICOS (4010,1058) Carrier ID CarrierID SH 1 DICOS (4010,1059) Carrier ID Assigning Authority CarrierIDAssigningAuthority CS 1 DICOS (4010,1060) Source Orientation SourceOrientation FL 3 DICOS (4010,1061) Source Position SourcePosition FL 3 DICOS (4010,1062) Belt Height BeltHeight FL 1 DICOS (4010,1064) Algorithm Routing Code Sequence AlgorithmRoutingCodeSequence SQ 1 DICOS (4010,1067) Transport Classification TransportClassification CS 1 DICOS (4010,1068) OOI Type Descriptor OOITypeDescriptor LT 1 DICOS (4010,1069) Total Processing Time TotalProcessingTime FL 1 DICOS (4010,106C) Detector Calibration Data DetectorCalibrationData OB 1 DICOS (4010,106D) Additional Screening Performed AdditionalScreeningPerformed CS 1 DICOS (4010,106E) Additional Inspection Selection Criteria AdditionalInspectionSelectionCriteria CS 1 DICOS (4010,106F) Additional Inspection Method Sequence AdditionalInspectionMethodSequence SQ 1 DICOS (4010,1070) AIT Device Type AITDeviceType CS 1 DICOS (4010,1071) QR Measurements Sequence QRMeasurementsSequence SQ 1 DICOS (4010,1072) Target Material Sequence TargetMaterialSequence SQ 1 DICOS (4010,1073) SNR Threshold SNRThreshold FD 1 DICOS (4010,1075) Image Scale Representation ImageScaleRepresentation DS 1 DICOS (4010,1076) Referenced PTO Sequence ReferencedPTOSequence SQ 1 DICOS (4010,1077) Referenced TDR Instance Sequence ReferencedTDRInstanceSequence SQ 1 DICOS (4010,1078) PTO Location Description PTOLocationDescription ST 1 DICOS (4010,1079) Anomaly Locator Indicator Sequence AnomalyLocatorIndicatorSequence SQ 1 DICOS (4010,107A) Anomaly Locator Indicator AnomalyLocatorIndicator FL 3 DICOS (4010,107B) PTO Region Sequence PTORegionSequence SQ 1 DICOS (4010,107C) Inspection Selection Criteria InspectionSelectionCriteria CS 1 DICOS (4010,107D) Secondary Inspection Method Sequence SecondaryInspectionMethodSequence SQ 1 DICOS (4010,107E) PRCS to RCS Orientation PRCSToRCSOrientation DS 6 DICOS (4FFE,0001) MAC Parameters Sequence MACParametersSequence SQ 1 (50xx,0005) Curve Dimensions CurveDimensions US 1 RET (50xx,0010) Number of Points NumberOfPoints US 1 RET (50xx,0020) Type of Data TypeOfData CS 1 RET (50xx,0022) Curve Description CurveDescription LO 1 RET (50xx,0030) Axis Units AxisUnits SH 1-n RET (50xx,0040) Axis Labels AxisLabels SH 1-n RET (50xx,0103) Data Value Representation DataValueRepresentation US 1 RET (50xx,0104) Minimum Coordinate Value MinimumCoordinateValue US 1-n RET (50xx,0105) Maximum Coordinate Value MaximumCoordinateValue US 1-n RET (50xx,0106) Curve Range CurveRange SH 1-n RET (50xx,0110) Curve Data Descriptor CurveDataDescriptor US 1-n RET (50xx,0112) Coordinate Start Value CoordinateStartValue US 1-n RET (50xx,0114) Coordinate Step Value CoordinateStepValue US 1-n RET (50xx,1001) Curve Activation Layer CurveActivationLayer CS 1 RET (50xx,2000) Audio Type AudioType US 1 RET (50xx,2002) Audio Sample Format AudioSampleFormat US 1 RET (50xx,2004) Number of Channels NumberOfChannels US 1 RET (50xx,2006) Number of Samples NumberOfSamples UL 1 RET (50xx,2008) Sample Rate SampleRate UL 1 RET (50xx,200A) Total Time TotalTime UL 1 RET (50xx,200C) Audio Sample Data AudioSampleData OB or OW 1 RET (50xx,200E) Audio Comments AudioComments LT 1 RET (50xx,2500) Curve Label CurveLabel LO 1 RET (50xx,2600) Curve Referenced Overlay Sequence CurveReferencedOverlaySequence SQ 1 RET (50xx,2610) Curve Referenced Overlay Group CurveReferencedOverlayGroup US 1 RET (50xx,3000) Curve Data CurveData OB or OW 1 RET (5200,9229) Shared Functional Groups Sequence SharedFunctionalGroupsSequence SQ 1 (5200,9230) Per-frame Functional Groups Sequence PerFrameFunctionalGroupsSequence SQ 1 (5400,0100) Waveform Sequence WaveformSequence SQ 1 (5400,0110) Channel Minimum Value ChannelMinimumValue OB or OW 1 (5400,0112) Channel Maximum Value ChannelMaximumValue OB or OW 1 (5400,1004) Waveform Bits Allocated WaveformBitsAllocated US 1 (5400,1006) Waveform Sample Interpretation WaveformSampleInterpretation CS 1 (5400,100A) Waveform Padding Value WaveformPaddingValue OB or OW 1 (5400,1010) Waveform Data WaveformData OB or OW 1 (5600,0010) First Order Phase Correction Angle FirstOrderPhaseCorrectionAngle OF 1 (5600,0020) Spectroscopy Data SpectroscopyData OF 1 (60xx,0010) Overlay Rows OverlayRows US 1 (60xx,0011) Overlay Columns OverlayColumns US 1 (60xx,0012) Overlay Planes OverlayPlanes US 1 RET (60xx,0015) Number of Frames in Overlay NumberOfFramesInOverlay IS 1 (60xx,0022) Overlay Description OverlayDescription LO 1 (60xx,0040) Overlay Type OverlayType CS 1 (60xx,0045) Overlay Subtype OverlaySubtype LO 1 (60xx,0050) Overlay Origin OverlayOrigin SS 2 (60xx,0051) Image Frame Origin ImageFrameOrigin US 1 (60xx,0052) Overlay Plane Origin OverlayPlaneOrigin US 1 RET (60xx,0060) Overlay Compression Code OverlayCompressionCode CS 1 RET (60xx,0061) Overlay Compression Originator OverlayCompressionOriginator SH 1 RET (60xx,0062) Overlay Compression Label OverlayCompressionLabel SH 1 RET (60xx,0063) Overlay Compression Description OverlayCompressionDescription CS 1 RET (60xx,0066) Overlay Compression Step Pointers OverlayCompressionStepPointers AT 1-n RET (60xx,0068) Overlay Repeat Interval OverlayRepeatInterval US 1 RET (60xx,0069) Overlay Bits Grouped OverlayBitsGrouped US 1 RET (60xx,0100) Overlay Bits Allocated OverlayBitsAllocated US 1 (60xx,0102) Overlay Bit Position OverlayBitPosition US 1 (60xx,0110) Overlay Format OverlayFormat CS 1 RET (60xx,0200) Overlay Location OverlayLocation US 1 RET (60xx,0800) Overlay Code Label OverlayCodeLabel CS 1-n RET (60xx,0802) Overlay Number of Tables OverlayNumberOfTables US 1 RET (60xx,0803) Overlay Code Table Location OverlayCodeTableLocation AT 1-n RET (60xx,0804) Overlay Bits For Code Word OverlayBitsForCodeWord US 1 RET (60xx,1001) Overlay Activation Layer OverlayActivationLayer CS 1 (60xx,1100) Overlay Descriptor - Gray OverlayDescriptorGray US 1 RET (60xx,1101) Overlay Descriptor - Red OverlayDescriptorRed US 1 RET (60xx,1102) Overlay Descriptor - Green OverlayDescriptorGreen US 1 RET (60xx,1103) Overlay Descriptor - Blue OverlayDescriptorBlue US 1 RET (60xx,1200) Overlays - Gray OverlaysGray US 1-n RET (60xx,1201) Overlays - Red OverlaysRed US 1-n RET (60xx,1202) Overlays - Green OverlaysGreen US 1-n RET (60xx,1203) Overlays - Blue OverlaysBlue US 1-n RET (60xx,1301) ROI Area ROIArea IS 1 (60xx,1302) ROI Mean ROIMean DS 1 (60xx,1303) ROI Standard Deviation ROIStandardDeviation DS 1 (60xx,1500) Overlay Label OverlayLabel LO 1 (60xx,3000) Overlay Data OverlayData OB or OW 1 (60xx,4000) Overlay Comments OverlayComments LT 1 RET (7FE0,0001) Extended Offset Table ExtendedOffsetTable OV 1 (7FE0,0002) Extended Offset Table Lengths ExtendedOffsetTableLengths OV 1 (7FE0,0008) Float Pixel Data FloatPixelData OF 1 (7FE0,0009) Double Float Pixel Data DoubleFloatPixelData OD 1 (7FE0,0010) Pixel Data PixelData OB or OW 1 (7FE0,0020) Coefficients SDVN CoefficientsSDVN OW 1 RET (7FE0,0030) Coefficients SDHN CoefficientsSDHN OW 1 RET (7FE0,0040) Coefficients SDDN CoefficientsSDDN OW 1 RET (7Fxx,0010) Variable Pixel Data VariablePixelData OB or OW 1 RET (7Fxx,0011) Variable Next Data Group VariableNextDataGroup US 1 RET (7Fxx,0020) Variable Coefficients SDVN VariableCoefficientsSDVN OW 1 RET (7Fxx,0030) Variable Coefficients SDHN VariableCoefficientsSDHN OW 1 RET (7Fxx,0040) Variable Coefficients SDDN VariableCoefficientsSDDN OW 1 RET (FFFA,FFFA) Digital Signatures Sequence DigitalSignaturesSequence SQ 1 (FFFC,FFFC) Data Set Trailing Padding DataSetTrailingPadding OB 1 (FFFE,E000) Item Item See Note 0 (FFFE,E00D) Item Delimitation Item ItemDelimitationItem See Note 0 (FFFE,E0DD) Sequence Delimitation Item SequenceDelimitationItem See Note 0 vtk-dicom-0.8.12/Utilities/nemauids.txt000066400000000000000000003335741356440565500200540ustar00rootroot00000000000000# UID Values ==================================================== 1.2.840.10008.1.1 Verification SOP Class SOP Class PS3.4 1.2.840.10008.1.2 Implicit VR Little Endian: Default Transfer Syntax for DICOM Transfer Syntax PS3.5 1.2.840.10008.1.2.1 Explicit VR Little Endian Transfer Syntax PS3.5 1.2.840.10008.1.2.1.99 Deflated Explicit VR Little Endian Transfer Syntax PS3.5 1.2.840.10008.1.2.2 Explicit VR Big Endian (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.50 JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.51 JPEG Extended (Process 2 & 4): Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression (Process 4 only) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.52 JPEG Extended (Process 3 & 5) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.53 JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.54 JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.55 JPEG Full Progression, Non-Hierarchical (Process 10 & 12) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.56 JPEG Full Progression, Non-Hierarchical (Process 11 & 13) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.57 JPEG Lossless, Non-Hierarchical (Process 14) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.58 JPEG Lossless, Non-Hierarchical (Process 15) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.59 JPEG Extended, Hierarchical (Process 16 & 18) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.60 JPEG Extended, Hierarchical (Process 17 & 19) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.61 JPEG Spectral Selection, Hierarchical (Process 20 & 22) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.62 JPEG Spectral Selection, Hierarchical (Process 21 & 23) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.63 JPEG Full Progression, Hierarchical (Process 24 & 26) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.64 JPEG Full Progression, Hierarchical (Process 25 & 27) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.65 JPEG Lossless, Hierarchical (Process 28) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.66 JPEG Lossless, Hierarchical (Process 29) (Retired) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.70 JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]): Default Transfer Syntax for Lossless JPEG Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.80 JPEG-LS Lossless Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.81 JPEG-LS Lossy (Near-Lossless) Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.90 JPEG 2000 Image Compression (Lossless Only) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.91 JPEG 2000 Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.92 JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only) Transfer Syntax PS3.5 1.2.840.10008.1.2.4.93 JPEG 2000 Part 2 Multi-component Image Compression Transfer Syntax PS3.5 1.2.840.10008.1.2.4.94 JPIP Referenced Transfer Syntax PS3.5 1.2.840.10008.1.2.4.95 JPIP Referenced Deflate Transfer Syntax PS3.5 1.2.840.10008.1.2.4.100 MPEG2 Main Profile / Main Level Transfer Syntax PS3.5 1.2.840.10008.1.2.4.101 MPEG2 Main Profile / High Level Transfer Syntax PS3.5 1.2.840.10008.1.2.4.102 MPEG-4 AVC/H.264 High Profile / Level 4.1 Transfer Syntax PS3.5 1.2.840.10008.1.2.4.103 MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1 Transfer Syntax PS3.5 1.2.840.10008.1.2.4.104 MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video Transfer Syntax PS3.5 1.2.840.10008.1.2.4.105 MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video Transfer Syntax PS3.5 1.2.840.10008.1.2.4.106 MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2 Transfer Syntax PS3.5 1.2.840.10008.1.2.4.107 HEVC/H.265 Main Profile / Level 5.1 Transfer Syntax PS3.5 1.2.840.10008.1.2.4.108 HEVC/H.265 Main 10 Profile / Level 5.1 Transfer Syntax PS3.5 1.2.840.10008.1.2.5 RLE Lossless Transfer Syntax PS3.5 1.2.840.10008.1.2.6.1 RFC 2557 MIME encapsulation (Retired) Transfer Syntax PS3.10 1.2.840.10008.1.2.6.2 XML Encoding (Retired) Transfer Syntax PS3.10 1.2.840.10008.1.2.7.1 SMPTE ST 2110-20 Uncompressed Progressive Active Video Transfer Syntax PS3.5 1.2.840.10008.1.2.7.2 SMPTE ST 2110-20 Uncompressed Interlaced Active Video Transfer Syntax PS3.5 1.2.840.10008.1.2.7.3 SMPTE ST 2110-30 PCM Digital Audio Transfer Syntax PS3.5 1.2.840.10008.1.3.10 Media Storage Directory Storage SOP Class PS3.4 1.2.840.10008.1.4.1.1 Talairach Brain Atlas Frame of Reference Well-known frame of reference Talairach J. and Tournoux P. Co-Planar stereotactic atlas of the human brain. Stutgart: Georg Thieme Verlag, 1988. 1.2.840.10008.1.4.1.2 SPM2 T1 Frame of Reference Well-known frame of reference SPM2 /templates/T1.mnc 1.2.840.10008.1.4.1.3 SPM2 T2 Frame of Reference Well-known frame of reference SPM2 /templates/T2.mnc 1.2.840.10008.1.4.1.4 SPM2 PD Frame of Reference Well-known frame of reference SPM2 /templates/PD.mnc 1.2.840.10008.1.4.1.5 SPM2 EPI Frame of Reference Well-known frame of reference SPM2 /templates/EPI.mnc 1.2.840.10008.1.4.1.6 SPM2 FIL T1 Frame of Reference Well-known frame of reference SPM2 /templates/filT1.mnc 1.2.840.10008.1.4.1.7 SPM2 PET Frame of Reference Well-known frame of reference SPM2 /templates/PET.mnc 1.2.840.10008.1.4.1.8 SPM2 TRANSM Frame of Reference Well-known frame of reference SPM2 /templates/Transm.mnc 1.2.840.10008.1.4.1.9 SPM2 SPECT Frame of Reference Well-known frame of reference SPM2 /templates/SPECT.mnc 1.2.840.10008.1.4.1.10 SPM2 GRAY Frame of Reference Well-known frame of reference SPM2 /apriori/gray.mnc 1.2.840.10008.1.4.1.11 SPM2 WHITE Frame of Reference Well-known frame of reference SPM2 /apriori/white.mnc 1.2.840.10008.1.4.1.12 SPM2 CSF Frame of Reference Well-known frame of reference SPM2 /apriori/csf.mnc 1.2.840.10008.1.4.1.13 SPM2 BRAINMASK Frame of Reference Well-known frame of reference SPM2 /apriori/brainmask.mnc 1.2.840.10008.1.4.1.14 SPM2 AVG305T1 Frame of Reference Well-known frame of reference SPM2 /canonical/avg305T1.mnc 1.2.840.10008.1.4.1.15 SPM2 AVG152T1 Frame of Reference Well-known frame of reference SPM2 /canonical/avg152T1.mnc 1.2.840.10008.1.4.1.16 SPM2 AVG152T2 Frame of Reference Well-known frame of reference SPM2 /canonical/avg152T2.mnc 1.2.840.10008.1.4.1.17 SPM2 AVG152PD Frame of Reference Well-known frame of reference SPM2 /canonical/avg152PD.mnc 1.2.840.10008.1.4.1.18 SPM2 SINGLESUBJT1 Frame of Reference Well-known frame of reference SPM2 /canonical/single_subj_T1.mnc 1.2.840.10008.1.4.2.1 ICBM 452 T1 Frame of Reference Well-known frame of reference ICBM452 T1 Atlas 1.2.840.10008.1.4.2.2 ICBM Single Subject MRI Frame of Reference Well-known frame of reference ICBM Single Subject MRI Anatomical Template 1.2.840.10008.1.5.1 Hot Iron Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.2 PET Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.3 Hot Metal Blue Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.4 PET 20 Step Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.5 Spring Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.6 Summer Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.7 Fall Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.5.8 Winter Color Palette SOP Instance Well-known SOP Instance PS 3.6 1.2.840.10008.1.9 Basic Study Content Notification SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.1.20 Papyrus 3 Implicit VR Little Endian (Retired) Transfer Syntax 1.2.840.10008.1.20.1 Storage Commitment Push Model SOP Class SOP Class PS3.4 1.2.840.10008.1.20.1.1 Storage Commitment Push Model SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.1.20.2 Storage Commitment Pull Model SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.1.20.2.1 Storage Commitment Pull Model SOP Instance (Retired) Well-known SOP Instance PS3.4 1.2.840.10008.1.40 Procedural Event Logging SOP Class SOP Class PS3.4 1.2.840.10008.1.40.1 Procedural Event Logging SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.1.42 Substance Administration Logging SOP Class SOP Class PS3.4 1.2.840.10008.1.42.1 Substance Administration Logging SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.2.6.1 DICOM UID Registry DICOM UIDs as a Coding Scheme PS 3.6 1.2.840.10008.2.16.4 DICOM Controlled Terminology Coding Scheme PS3.16 1.2.840.10008.2.16.5 Adult Mouse Anatomy Ontology Coding Scheme PS3.16 1.2.840.10008.2.16.6 Uberon Ontology Coding Scheme PS3.16 1.2.840.10008.2.16.7 Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN) Coding Scheme PS3.16 1.2.840.10008.2.16.8 Mouse Genome Initiative (MGI) Coding Scheme PS3.16 1.2.840.10008.2.16.9 PubChem Compound CID Coding Scheme PS3.16 1.2.840.10008.2.16.10 ICD-11 Coding Scheme PS3.16 1.2.840.10008.2.16.11 New York University Melanoma Clinical Cooperative Group Coding Scheme PS3.16 1.2.840.10008.2.16.12 Mayo Clinic Non-radiological Images Specific Body Structure Anatomical Surface Region Guide Coding Scheme PS3.16 1.2.840.10008.2.16.13 Image Biomarker Standardisation Initiative Coding Scheme PS3.16 1.2.840.10008.2.16.14 Radiomics Ontology Coding Scheme PS3.16 1.2.840.10008.3.1.1.1 DICOM Application Context Name Application Context Name PS3.7 1.2.840.10008.3.1.2.1.1 Detached Patient Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.3.1.2.1.4 Detached Patient Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.3.1.2.2.1 Detached Visit Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.3.1.2.3.1 Detached Study Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.3.1.2.3.2 Study Component Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.3.1.2.3.3 Modality Performed Procedure Step SOP Class SOP Class PS3.4 1.2.840.10008.3.1.2.3.4 Modality Performed Procedure Step Retrieve SOP Class SOP Class PS3.4 1.2.840.10008.3.1.2.3.5 Modality Performed Procedure Step Notification SOP Class SOP Class PS3.4 1.2.840.10008.3.1.2.5.1 Detached Results Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.3.1.2.5.4 Detached Results Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.3.1.2.5.5 Detached Study Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.3.1.2.6.1 Detached Interpretation Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.4.2 Storage Service Class Service Class PS3.4 1.2.840.10008.5.1.1.1 Basic Film Session SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.2 Basic Film Box SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.4 Basic Grayscale Image Box SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.4.1 Basic Color Image Box SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.4.2 Referenced Image Box SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.9 Basic Grayscale Print Management Meta SOP Class Meta SOP Class PS3.4 1.2.840.10008.5.1.1.9.1 Referenced Grayscale Print Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.5.1.1.14 Print Job SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.15 Basic Annotation Box SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.16 Printer SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.16.376 Printer Configuration Retrieval SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.17 Printer SOP Instance Well-known Printer SOP Instance PS3.4 1.2.840.10008.5.1.1.17.376 Printer Configuration Retrieval SOP Instance Well-known Printer SOP Instance PS3.4 1.2.840.10008.5.1.1.18 Basic Color Print Management Meta SOP Class Meta SOP Class PS3.4 1.2.840.10008.5.1.1.18.1 Referenced Color Print Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.5.1.1.22 VOI LUT Box SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.23 Presentation LUT SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.24 Image Overlay Box SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.24.1 Basic Print Image Overlay Box SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.25 Print Queue SOP Instance (Retired) Well-known Print Queue SOP Instance PS3.4 1.2.840.10008.5.1.1.26 Print Queue Management SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.27 Stored Print Storage SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.29 Hardcopy Grayscale Image Storage SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.30 Hardcopy Color Image Storage SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.31 Pull Print Request SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.1.32 Pull Stored Print Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.5.1.1.33 Media Creation Management SOP Class UID SOP Class PS3.4 1.2.840.10008.5.1.1.40 Display System SOP Class SOP Class PS3.4 1.2.840.10008.5.1.1.40.1 Display System SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.5.1.4.1.1.1 Computed Radiography Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.1 Digital X-Ray Image Storage - For Presentation SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.1.1 Digital X-Ray Image Storage - For Processing SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.2 Digital Mammography X-Ray Image Storage - For Presentation SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.2.1 Digital Mammography X-Ray Image Storage - For Processing SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.3 Digital Intra-Oral X-Ray Image Storage - For Presentation SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.1.3.1 Digital Intra-Oral X-Ray Image Storage - For Processing SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.2 CT Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.2.1 Enhanced CT Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.2.2 Legacy Converted Enhanced CT Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.3 Ultrasound Multi-frame Image Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.3.1 Ultrasound Multi-frame Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.4 MR Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.4.1 Enhanced MR Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.4.2 MR Spectroscopy Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.4.3 Enhanced MR Color Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.4.4 Legacy Converted Enhanced MR Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.5 Nuclear Medicine Image Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.6 Ultrasound Image Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.6.1 Ultrasound Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.6.2 Enhanced US Volume Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.7 Secondary Capture Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.7.1 Multi-frame Single Bit Secondary Capture Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.7.2 Multi-frame Grayscale Byte Secondary Capture Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.7.3 Multi-frame Grayscale Word Secondary Capture Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.7.4 Multi-frame True Color Secondary Capture Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.8 Standalone Overlay Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9 Standalone Curve Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.1 Waveform Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.1.1 12-lead ECG Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.1.2 General ECG Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.1.3 Ambulatory ECG Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.2.1 Hemodynamic Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.3.1 Cardiac Electrophysiology Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.4.1 Basic Voice Audio Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.4.2 General Audio Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.5.1 Arterial Pulse Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.9.6.1 Respiratory Waveform Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.10 Standalone Modality LUT Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11 Standalone VOI LUT Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.1 Grayscale Softcopy Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.2 Color Softcopy Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.3 Pseudo-Color Softcopy Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.4 Blending Softcopy Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.5 XA/XRF Grayscale Softcopy Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.6 Grayscale Planar MPR Volumetric Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.7 Compositing Planar MPR Volumetric Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.8 Advanced Blending Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.9 Volume Rendering Volumetric Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.10 Segmented Volume Rendering Volumetric Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.11.11 Multiple Volume Rendering Volumetric Presentation State Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.1 X-Ray Angiographic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.1.1 Enhanced XA Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.2 X-Ray Radiofluoroscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.2.1 Enhanced XRF Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.3 X-Ray Angiographic Bi-Plane Image Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.12.77 1.2.840.10008.5.1.4.1.1.12.77 (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.13.1.1 X-Ray 3D Angiographic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.13.1.2 X-Ray 3D Craniofacial Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.13.1.3 Breast Tomosynthesis Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.13.1.4 Breast Projection X-Ray Image Storage - For Presentation SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.13.1.5 Breast Projection X-Ray Image Storage - For Processing SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.14.1 Intravascular Optical Coherence Tomography Image Storage - For Presentation SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.14.2 Intravascular Optical Coherence Tomography Image Storage - For Processing SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.20 Nuclear Medicine Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.30 Parametric Map Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.40 1.2.840.10008.5.1.4.1.1.40 (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66 Raw Data Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.1 Spatial Registration Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.2 Spatial Fiducials Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.3 Deformable Spatial Registration Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.4 Segmentation Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.5 Surface Segmentation Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.66.6 Tractography Results Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.67 Real World Value Mapping Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.68.1 Surface Scan Mesh Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.68.2 Surface Scan Point Cloud Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1 VL Image Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.2 VL Multi-frame Image Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.1 VL Endoscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.1.1 Video Endoscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.2 VL Microscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.2.1 Video Microscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.3 VL Slide-Coordinates Microscopic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.4 VL Photographic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.4.1 Video Photographic Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.1 Ophthalmic Photography 8 Bit Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.2 Ophthalmic Photography 16 Bit Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.3 Stereometric Relationship Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.4 Ophthalmic Tomography Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.5 Wide Field Ophthalmic Photography Stereographic Projection Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.6 Wide Field Ophthalmic Photography 3D Coordinates Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.7 Ophthalmic Optical Coherence Tomography En Face Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.5.8 Ophthalmic Optical Coherence Tomography B-scan Volume Analysis Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.77.1.6 VL Whole Slide Microscopy Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.1 Lensometry Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.2 Autorefraction Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.3 Keratometry Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.4 Subjective Refraction Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.5 Visual Acuity Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.6 Spectacle Prescription Report Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.7 Ophthalmic Axial Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.78.8 Intraocular Lens Calculations Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.79.1 Macular Grid Thickness and Volume Report Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.80.1 Ophthalmic Visual Field Static Perimetry Measurements Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.81.1 Ophthalmic Thickness Map Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.82.1 Corneal Topography Map Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.1 Text SR Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.2 Audio SR Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.3 Detail SR Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.4 Comprehensive SR Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.11 Basic Text SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.22 Enhanced SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.33 Comprehensive SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.34 Comprehensive 3D SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.35 Extensible SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.40 Procedure Log Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.50 Mammography CAD SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.59 Key Object Selection Document Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.65 Chest CAD SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.67 X-Ray Radiation Dose SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.68 Radiopharmaceutical Radiation Dose SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.69 Colon CAD SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.70 Implantation Plan SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.71 Acquisition Context SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.72 Simplified Adult Echo SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.73 Patient Radiation Dose SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.74 Planned Imaging Agent Administration SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.88.75 Performed Imaging Agent Administrator SR Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.90.1 Content Assessment Results Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.104.1 Encapsulated PDF Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.104.2 Encapsulated CDA Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.104.3 Encapsulated STL Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.128 Positron Emission Tomography Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.128.1 Legacy Converted Enhanced PET Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.129 Standalone PET Curve Storage (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.130 Enhanced PET Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.131 Basic Structured Display Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.1 CT Defined Procedure Protocol Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.2 CT Performed Procedure Protocol Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.3 Protocol Approval Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.4 Protocol Approval Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.5 Protocol Approval Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.200.6 Protocol Approval Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.1 RT Image Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.2 RT Dose Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.3 RT Structure Set Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.4 RT Beams Treatment Record Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.5 RT Plan Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.6 RT Brachy Treatment Record Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.7 RT Treatment Summary Record Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.8 RT Ion Plan Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.9 RT Ion Beams Treatment Record Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.10 RT Physician Intent Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.11 RT Segment Annotation Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.12 RT Radiation Set Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.481.13 C-Arm Photon-Electron Radiation Storage SOP Class PS3.4 1.2.840.10008.5.1.4.1.1.501.1 DICOS CT Image Storage SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.2.1 DICOS Digital X-Ray Image Storage - For Presentation SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.2.2 DICOS Digital X-Ray Image Storage - For Processing SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.3 DICOS Threat Detection Report Storage SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.4 DICOS 2D AIT Storage SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.5 DICOS 3D AIT Storage SOP Class DICOS 1.2.840.10008.5.1.4.1.1.501.6 DICOS Quadrupole Resonance (QR) Storage SOP Class DICOS 1.2.840.10008.5.1.4.1.1.601.1 Eddy Current Image Storage SOP Class DICONDE ASTM E2934 1.2.840.10008.5.1.4.1.1.601.2 Eddy Current Multi-frame Image Storage SOP Class DICONDE ASTM E2934 1.2.840.10008.5.1.4.1.2.1.1 Patient Root Query/Retrieve Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.1.2 Patient Root Query/Retrieve Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.1.3 Patient Root Query/Retrieve Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.2.1 Study Root Query/Retrieve Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.2.2 Study Root Query/Retrieve Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.2.3 Study Root Query/Retrieve Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.3.1 Patient/Study Only Query/Retrieve Information Model - FIND (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.3.2 Patient/Study Only Query/Retrieve Information Model - MOVE (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.3.3 Patient/Study Only Query/Retrieve Information Model - GET (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.4.2 Composite Instance Root Retrieve - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.4.3 Composite Instance Root Retrieve - GET SOP Class PS3.4 1.2.840.10008.5.1.4.1.2.5.3 Composite Instance Retrieve Without Bulk Data - GET SOP Class PS3.4 1.2.840.10008.5.1.4.20.1 Defined Procedure Protocol Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.20.2 Defined Procedure Protocol Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.20.3 Defined Procedure Protocol Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.31 Modality Worklist Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.32 General Purpose Worklist Management Meta SOP Class (Retired) Meta SOP Class PS3.4 1.2.840.10008.5.1.4.32.1 General Purpose Worklist Information Model - FIND (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.32.2 General Purpose Scheduled Procedure Step SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.32.3 General Purpose Performed Procedure Step SOP Class (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.33 Instance Availability Notification SOP Class SOP Class PS3.4 1.2.840.10008.5.1.4.34.1 RT Beams Delivery Instruction Storage - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.2 RT Conventional Machine Verification - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.3 RT Ion Machine Verification - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.4 Unified Worklist and Procedure Step Service Class - Trial (Retired) Service Class PS3.4 1.2.840.10008.5.1.4.34.4.1 Unified Procedure Step - Push SOP Class - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.4.2 Unified Procedure Step - Watch SOP Class - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.4.3 Unified Procedure Step - Pull SOP Class - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.4.4 Unified Procedure Step - Event SOP Class - Trial (Retired) SOP Class PS3.4 1.2.840.10008.5.1.4.34.5 UPS Global Subscription SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.5.1.4.34.5.1 UPS Filtered Global Subscription SOP Instance Well-known SOP Instance PS3.4 1.2.840.10008.5.1.4.34.6 Unified Worklist and Procedure Step Service Class Service Class PS3.4 1.2.840.10008.5.1.4.34.6.1 Unified Procedure Step - Push SOP Class SOP Class PS3.4 1.2.840.10008.5.1.4.34.6.2 Unified Procedure Step - Watch SOP Class SOP Class PS3.4 1.2.840.10008.5.1.4.34.6.3 Unified Procedure Step - Pull SOP Class SOP Class PS3.4 1.2.840.10008.5.1.4.34.6.4 Unified Procedure Step - Event SOP Class SOP Class PS3.4 1.2.840.10008.5.1.4.34.7 RT Beams Delivery Instruction Storage SOP Class PS3.4 1.2.840.10008.5.1.4.34.8 RT Conventional Machine Verification SOP Class PS3.4 1.2.840.10008.5.1.4.34.9 RT Ion Machine Verification SOP Class PS3.4 1.2.840.10008.5.1.4.34.10 RT Brachy Application Setup Delivery Instruction Storage SOP Class PS3.4 1.2.840.10008.5.1.4.37.1 General Relevant Patient Information Query SOP Class PS3.4 1.2.840.10008.5.1.4.37.2 Breast Imaging Relevant Patient Information Query SOP Class PS3.4 1.2.840.10008.5.1.4.37.3 Cardiac Relevant Patient Information Query SOP Class PS3.4 1.2.840.10008.5.1.4.38.1 Hanging Protocol Storage SOP Class PS3.4 1.2.840.10008.5.1.4.38.2 Hanging Protocol Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.38.3 Hanging Protocol Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.38.4 Hanging Protocol Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.39.1 Color Palette Storage SOP Class PS3.4 1.2.840.10008.5.1.4.39.2 Color Palette Query/Retrieve Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.39.3 Color Palette Query/Retrieve Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.39.4 Color Palette Query/Retrieve Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.41 Product Characteristics Query SOP Class PS3.4 1.2.840.10008.5.1.4.42 Substance Approval Query SOP Class PS3.4 1.2.840.10008.5.1.4.43.1 Generic Implant Template Storage SOP Class PS3.4 1.2.840.10008.5.1.4.43.2 Generic Implant Template Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.43.3 Generic Implant Template Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.43.4 Generic Implant Template Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.44.1 Implant Assembly Template Storage SOP Class PS3.4 1.2.840.10008.5.1.4.44.2 Implant Assembly Template Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.44.3 Implant Assembly Template Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.44.4 Implant Assembly Template Information Model - GET SOP Class PS3.4 1.2.840.10008.5.1.4.45.1 Implant Template Group Storage SOP Class PS3.4 1.2.840.10008.5.1.4.45.2 Implant Template Group Information Model - FIND SOP Class PS3.4 1.2.840.10008.5.1.4.45.3 Implant Template Group Information Model - MOVE SOP Class PS3.4 1.2.840.10008.5.1.4.45.4 Implant Template Group Information Model - GET SOP Class PS3.4 1.2.840.10008.7.1.1 Native DICOM Model Application Hosting Model PS3.19 1.2.840.10008.7.1.2 Abstract Multi-Dimensional Image Model Application Hosting Model PS3.19 1.2.840.10008.8.1.1 DICOM Content Mapping Resource Mapping Resource PS3.16 1.2.840.10008.10.1 Video Endoscopic Image Real-Time Communication SOP Class PS3.22 1.2.840.10008.10.2 Video Photographic Image Real-Time Communication SOP Class PS3.22 1.2.840.10008.10.3 Audio Waveform Real-Time Communication SOP Class PS3.22 1.2.840.10008.10.4 Rendition Selection Document Real-Time Communication SOP Class PS3.22 1.2.840.10008.9.1 Imaging Report Document TemplateID PS3.20 1.2.840.10008.9.2 Clinical Information Section TemplateID PS3.20 1.2.840.10008.9.3 Imaging Procedure Description Section TemplateID PS3.20 1.2.840.10008.9.4 Comparison Study Section TemplateID PS3.20 1.2.840.10008.9.5 Impression Section TemplateID PS3.20 1.2.840.10008.9.6 Addendum Section TemplateID PS3.20 1.2.840.10008.9.7 Request Section TemplateID PS3.20 1.2.840.10008.9.8 Radiation Exposure and Protection Information Section TemplateID PS3.20 1.2.840.10008.9.9 Fetus Findings Section TemplateID PS3.20 1.2.840.10008.9.10 Labeled Subsection Section TemplateID PS3.20 1.2.840.10008.9.11 Communication of Actionable Findings Section TemplateID PS3.20 1.2.840.10008.9.12 Recommendation Section TemplateID PS3.20 1.2.840.10008.9.13 Procedural Medication Entry TemplateID PS3.20 1.2.840.10008.9.14 Procedure Technique Entry TemplateID PS3.20 1.2.840.10008.9.15 Image Quality Entry TemplateID PS3.20 1.2.840.10008.9.16 Study Act Entry TemplateID PS3.20 1.2.840.10008.9.17 Series Act Entry TemplateID PS3.20 1.2.840.10008.9.18 SOP Instance Observation Entry TemplateID PS3.20 1.2.840.10008.9.19 Section Text Element Set TemplateID PS3.20 1.2.840.10008.9.20 General Header Element Set TemplateID PS3.20 1.2.840.10008.9.21 Imaging Header Element Set TemplateID PS3.20 1.2.840.10008.9.22 Parent Document Element Set TemplateID PS3.20 1.2.840.10008.9.23 General Section Entries Element Set TemplateID PS3.20 1.2.840.10008.9.24 Imaging Addendum Report Document TemplateID PS3.20 1.2.840.10008.15.0.3.1 dicomDeviceName LDAP OID PS3.15 1.2.840.10008.15.0.3.2 dicomDescription LDAP OID PS3.15 1.2.840.10008.15.0.3.3 dicomManufacturer LDAP OID PS3.15 1.2.840.10008.15.0.3.4 dicomManufacturerModelName LDAP OID PS3.15 1.2.840.10008.15.0.3.5 dicomSoftwareVersion LDAP OID PS3.15 1.2.840.10008.15.0.3.6 dicomVendorData LDAP OID PS3.15 1.2.840.10008.15.0.3.7 dicomAETitle LDAP OID PS3.15 1.2.840.10008.15.0.3.8 dicomNetworkConnectionReference LDAP OID PS3.15 1.2.840.10008.15.0.3.9 dicomApplicationCluster LDAP OID PS3.15 1.2.840.10008.15.0.3.10 dicomAssociationInitiator LDAP OID PS3.15 1.2.840.10008.15.0.3.11 dicomAssociationAcceptor LDAP OID PS3.15 1.2.840.10008.15.0.3.12 dicomHostname LDAP OID PS3.15 1.2.840.10008.15.0.3.13 dicomPort LDAP OID PS3.15 1.2.840.10008.15.0.3.14 dicomSOPClass LDAP OID PS3.15 1.2.840.10008.15.0.3.15 dicomTransferRole LDAP OID PS3.15 1.2.840.10008.15.0.3.16 dicomTransferSyntax LDAP OID PS3.15 1.2.840.10008.15.0.3.17 dicomPrimaryDeviceType LDAP OID PS3.15 1.2.840.10008.15.0.3.18 dicomRelatedDeviceReference LDAP OID PS3.15 1.2.840.10008.15.0.3.19 dicomPreferredCalledAETitle LDAP OID PS3.15 1.2.840.10008.15.0.3.20 dicomTLSCyphersuite LDAP OID PS3.15 1.2.840.10008.15.0.3.21 dicomAuthorizedNodeCertificateReference LDAP OID PS3.15 1.2.840.10008.15.0.3.22 dicomThisNodeCertificateReference LDAP OID PS3.15 1.2.840.10008.15.0.3.23 dicomInstalled LDAP OID PS3.15 1.2.840.10008.15.0.3.24 dicomStationName LDAP OID PS3.15 1.2.840.10008.15.0.3.25 dicomDeviceSerialNumber LDAP OID PS3.15 1.2.840.10008.15.0.3.26 dicomInstitutionName LDAP OID PS3.15 1.2.840.10008.15.0.3.27 dicomInstitutionAddress LDAP OID PS3.15 1.2.840.10008.15.0.3.28 dicomInstitutionDepartmentName LDAP OID PS3.15 1.2.840.10008.15.0.3.29 dicomIssuerOfPatientID LDAP OID PS3.15 1.2.840.10008.15.0.3.30 dicomPreferredCallingAETitle LDAP OID PS3.15 1.2.840.10008.15.0.3.31 dicomSupportedCharacterSet LDAP OID PS3.15 1.2.840.10008.15.0.4.1 dicomConfigurationRoot LDAP OID PS3.15 1.2.840.10008.15.0.4.2 dicomDevicesRoot LDAP OID PS3.15 1.2.840.10008.15.0.4.3 dicomUniqueAETitlesRegistryRoot LDAP OID PS3.15 1.2.840.10008.15.0.4.4 dicomDevice LDAP OID PS3.15 1.2.840.10008.15.0.4.5 dicomNetworkAE LDAP OID PS3.15 1.2.840.10008.15.0.4.6 dicomNetworkConnection LDAP OID PS3.15 1.2.840.10008.15.0.4.7 dicomUniqueAETitle LDAP OID PS3.15 1.2.840.10008.15.0.4.8 dicomTransferCapability LDAP OID PS3.15 1.2.840.10008.15.1.1 Universal Coordinated Time Synchronization Frame of Reference PS3.3 # Frames of Reference ================================================ 1.2.840.10008.1.4.1.1 Talairach Brain Atlas Frame of Reference Talairach J. and Tournoux P. Co-Planar stereotactic atlas of the human brain. Stutgart: Georg Thieme Verlag, 1988. 1.2.840.10008.1.4.1.2 SPM2 T1 Frame of Reference SPM2 /templates/T1.mnc 1.2.840.10008.1.4.1.3 SPM2 T2 Frame of Reference SPM2 /templates/T2.mnc 1.2.840.10008.1.4.1.4 SPM2 PD Frame of Reference SPM2 /templates/PD.mnc 1.2.840.10008.1.4.1.5 SPM2 EPI Frame of Reference SPM2 /templates/EPI.mnc 1.2.840.10008.1.4.1.6 SPM2 FIL T1 Frame of Reference SPM2 /templates/filT1.mnc 1.2.840.10008.1.4.1.7 SPM2 PET Frame of Reference SPM2 /templates/PET.mnc 1.2.840.10008.1.4.1.8 SPM2 TRANSM Frame of Reference SPM2 /templates/Transm.mnc 1.2.840.10008.1.4.1.9 SPM2 SPECT Frame of Reference SPM2 /templates/SPECT.mnc 1.2.840.10008.1.4.1.10 SPM2 GRAY Frame of Reference SPM2 /apriori/gray.mnc 1.2.840.10008.1.4.1.11 SPM2 WHITE Frame of Reference SPM2 /apriori/white.mnc 1.2.840.10008.1.4.1.12 SPM2 CSF Frame of Reference SPM2 /apriori/csf.mnc 1.2.840.10008.1.4.1.13 SPM2 BRAINMASK Frame of Reference SPM2 /apriori/brainmask.mnc 1.2.840.10008.1.4.1.14 SPM2 AVG305T1 Frame of Reference SPM2 /canonical/avg305T1.mnc 1.2.840.10008.1.4.1.15 SPM2 AVG152T1 Frame of Reference SPM2 /canonical/avg152T1.mnc 1.2.840.10008.1.4.1.16 SPM2 AVG152T2 Frame of Reference SPM2 /canonical/avg152T2.mnc 1.2.840.10008.1.4.1.17 SPM2 AVG152PD Frame of Reference SPM2 /canonical/avg152PD.mnc 1.2.840.10008.1.4.1.18 SPM2 SINGLESUBJT1 Frame of Reference SPM2 /canonical/single_subj_T1.mnc 1.2.840.10008.1.4.2.1 ICBM 452 T1 Frame of Reference ICBM452 T1 Atlas 1.2.840.10008.1.4.2.2 ICBM Single Subject MRI Frame of Reference ICBM Single Subject MRI Anatomical Template 1.2.840.10008.1.4.3.1 IEC 61217 Fixed Coordinate System Frame of Reference Fixed coordinate system of Section C.36.12.2.1 “IEC 61217 Fixed Reference System Frame of Reference” in PS3.3 # Context Group UID Values ================================================ 1.2.840.10008.6.1.1 CID 2 Anatomic Modifier 1.2.840.10008.6.1.2 CID 4 Anatomic Region 1.2.840.10008.6.1.3 CID 5 Transducer Approach 1.2.840.10008.6.1.4 CID 6 Transducer Orientation 1.2.840.10008.6.1.5 CID 7 Ultrasound Beam Path 1.2.840.10008.6.1.6 CID 8 Angiographic Interventional Devices 1.2.840.10008.6.1.7 CID 9 Image Guided Therapeutic Procedures 1.2.840.10008.6.1.8 CID 10 Interventional Drug 1.2.840.10008.6.1.9 CID 11 Route of Administration 1.2.840.10008.6.1.10 CID 12 Radiographic Contrast Agent 1.2.840.10008.6.1.11 CID 13 Radiographic Contrast Agent Ingredient 1.2.840.10008.6.1.12 CID 18 Isotopes in Radiopharmaceuticals 1.2.840.10008.6.1.13 CID 19 Patient Orientation 1.2.840.10008.6.1.14 CID 20 Patient Orientation Modifier 1.2.840.10008.6.1.15 CID 21 Patient Equipment Relationship 1.2.840.10008.6.1.16 CID 23 Cranio-Caudad Angulation 1.2.840.10008.6.1.17 CID 25 Radiopharmaceuticals 1.2.840.10008.6.1.18 CID 26 Nuclear Medicine Projections 1.2.840.10008.6.1.19 CID 29 Acquisition Modality 1.2.840.10008.6.1.20 CID 30 DICOM Devices 1.2.840.10008.6.1.21 CID 31 Abstract Priors 1.2.840.10008.6.1.22 CID 42 Numeric Value Qualifier 1.2.840.10008.6.1.23 CID 82 Units of Measurement 1.2.840.10008.6.1.24 CID 83 Units for Real World Value Mapping 1.2.840.10008.6.1.25 CID 220 Level of Significance 1.2.840.10008.6.1.26 CID 221 Measurement Range Concepts 1.2.840.10008.6.1.27 CID 222 Normality Codes 1.2.840.10008.6.1.28 CID 223 Normal Range Values 1.2.840.10008.6.1.29 CID 224 Selection Method 1.2.840.10008.6.1.30 CID 225 Measurement Uncertainty Concepts 1.2.840.10008.6.1.31 CID 226 Population Statistical Descriptors 1.2.840.10008.6.1.32 CID 227 Sample Statistical Descriptors 1.2.840.10008.6.1.33 CID 228 Equation or Table 1.2.840.10008.6.1.34 CID 230 Yes-No 1.2.840.10008.6.1.35 CID 240 Present-Absent 1.2.840.10008.6.1.36 CID 242 Normal-Abnormal 1.2.840.10008.6.1.37 CID 244 Laterality 1.2.840.10008.6.1.38 CID 250 Positive-Negative 1.2.840.10008.6.1.39 CID 251 Severity of Complication 1.2.840.10008.6.1.40 CID 270 Observer Type 1.2.840.10008.6.1.41 CID 271 Observation Subject Class 1.2.840.10008.6.1.42 CID 3000 Audio Channel Source 1.2.840.10008.6.1.43 CID 3001 ECG Leads 1.2.840.10008.6.1.44 CID 3003 Hemodynamic Waveform Sources 1.2.840.10008.6.1.45 CID 3010 Cardiovascular Anatomic Locations 1.2.840.10008.6.1.46 CID 3011 Electrophysiology Anatomic Locations 1.2.840.10008.6.1.47 CID 3014 Coronary Artery Segments 1.2.840.10008.6.1.48 CID 3015 Coronary Arteries 1.2.840.10008.6.1.49 CID 3019 Cardiovascular Anatomic Location Modifiers 1.2.840.10008.6.1.50 CID 3082 Cardiology Units of Measurement (Retired) 1.2.840.10008.6.1.51 CID 3090 Time Synchronization Channel Types 1.2.840.10008.6.1.52 CID 3101 Cardiac Procedural State Values 1.2.840.10008.6.1.53 CID 3240 Electrophysiology Measurement Functions and Techniques 1.2.840.10008.6.1.54 CID 3241 Hemodynamic Measurement Techniques 1.2.840.10008.6.1.55 CID 3250 Catheterization Procedure Phase 1.2.840.10008.6.1.56 CID 3254 Electrophysiology Procedure Phase 1.2.840.10008.6.1.57 CID 3261 Stress Protocols 1.2.840.10008.6.1.58 CID 3262 ECG Patient State Values 1.2.840.10008.6.1.59 CID 3263 Electrode Placement Values 1.2.840.10008.6.1.60 CID 3264 XYZ Electrode Placement Values (Retired) 1.2.840.10008.6.1.61 CID 3271 Hemodynamic Physiological Challenges 1.2.840.10008.6.1.62 CID 3335 ECG Annotations 1.2.840.10008.6.1.63 CID 3337 Hemodynamic Annotations 1.2.840.10008.6.1.64 CID 3339 Electrophysiology Annotations 1.2.840.10008.6.1.65 CID 3400 Procedure Log Titles 1.2.840.10008.6.1.66 CID 3401 Types of Log Notes 1.2.840.10008.6.1.67 CID 3402 Patient Status and Events 1.2.840.10008.6.1.68 CID 3403 Percutaneous Entry 1.2.840.10008.6.1.69 CID 3404 Staff Actions 1.2.840.10008.6.1.70 CID 3405 Procedure Action Values 1.2.840.10008.6.1.71 CID 3406 Non-coronary Transcatheter Interventions 1.2.840.10008.6.1.72 CID 3407 Purpose of Reference to Object 1.2.840.10008.6.1.73 CID 3408 Actions With Consumables 1.2.840.10008.6.1.74 CID 3409 Administration of Drugs/Contrast 1.2.840.10008.6.1.75 CID 3410 Numeric Parameters of Drugs/Contrast 1.2.840.10008.6.1.76 CID 3411 Intracoronary Devices 1.2.840.10008.6.1.77 CID 3412 Intervention Actions and Status 1.2.840.10008.6.1.78 CID 3413 Adverse Outcomes 1.2.840.10008.6.1.79 CID 3414 Procedure Urgency 1.2.840.10008.6.1.80 CID 3415 Cardiac Rhythms 1.2.840.10008.6.1.81 CID 3416 Respiration Rhythms 1.2.840.10008.6.1.82 CID 3418 Lesion Risk 1.2.840.10008.6.1.83 CID 3419 Findings Titles 1.2.840.10008.6.1.84 CID 3421 Procedure Action 1.2.840.10008.6.1.85 CID 3422 Device Use Actions 1.2.840.10008.6.1.86 CID 3423 Numeric Device Characteristics 1.2.840.10008.6.1.87 CID 3425 Intervention Parameters 1.2.840.10008.6.1.88 CID 3426 Consumables Parameters 1.2.840.10008.6.1.89 CID 3427 Equipment Events 1.2.840.10008.6.1.90 CID 3428 Imaging Procedures 1.2.840.10008.6.1.91 CID 3429 Catheterization Devices 1.2.840.10008.6.1.92 CID 3430 DateTime Qualifiers 1.2.840.10008.6.1.93 CID 3440 Peripheral Pulse Locations 1.2.840.10008.6.1.94 CID 3441 Patient Assessments 1.2.840.10008.6.1.95 CID 3442 Peripheral Pulse Methods 1.2.840.10008.6.1.96 CID 3446 Skin Condition 1.2.840.10008.6.1.97 CID 3448 Airway Assessment 1.2.840.10008.6.1.98 CID 3451 Calibration Objects 1.2.840.10008.6.1.99 CID 3452 Calibration Methods 1.2.840.10008.6.1.100 CID 3453 Cardiac Volume Methods 1.2.840.10008.6.1.101 CID 3455 Index Methods 1.2.840.10008.6.1.102 CID 3456 Sub-segment Methods 1.2.840.10008.6.1.103 CID 3458 Contour Realignment 1.2.840.10008.6.1.104 CID 3460 Circumferential Extent 1.2.840.10008.6.1.105 CID 3461 Regional Extent 1.2.840.10008.6.1.106 CID 3462 Chamber Identification 1.2.840.10008.6.1.107 CID 3465 QA Reference Methods 1.2.840.10008.6.1.108 CID 3466 Plane Identification 1.2.840.10008.6.1.109 CID 3467 Ejection Fraction 1.2.840.10008.6.1.110 CID 3468 ED Volume 1.2.840.10008.6.1.111 CID 3469 ES Volume 1.2.840.10008.6.1.112 CID 3470 Vessel Lumen Cross-sectional Area Calculation Methods 1.2.840.10008.6.1.113 CID 3471 Estimated Volumes 1.2.840.10008.6.1.114 CID 3472 Cardiac Contraction Phase 1.2.840.10008.6.1.115 CID 3480 IVUS Procedure Phases 1.2.840.10008.6.1.116 CID 3481 IVUS Distance Measurements 1.2.840.10008.6.1.117 CID 3482 IVUS Area Measurements 1.2.840.10008.6.1.118 CID 3483 IVUS Longitudinal Measurements 1.2.840.10008.6.1.119 CID 3484 IVUS Indices and Ratios 1.2.840.10008.6.1.120 CID 3485 IVUS Volume Measurements 1.2.840.10008.6.1.121 CID 3486 Vascular Measurement Sites 1.2.840.10008.6.1.122 CID 3487 Intravascular Volumetric Regions 1.2.840.10008.6.1.123 CID 3488 Min/Max/Mean 1.2.840.10008.6.1.124 CID 3489 Calcium Distribution 1.2.840.10008.6.1.125 CID 3491 IVUS Lesion Morphologies 1.2.840.10008.6.1.126 CID 3492 Vascular Dissection Classifications 1.2.840.10008.6.1.127 CID 3493 IVUS Relative Stenosis Severities 1.2.840.10008.6.1.128 CID 3494 IVUS Non Morphological Findings 1.2.840.10008.6.1.129 CID 3495 IVUS Plaque Composition 1.2.840.10008.6.1.130 CID 3496 IVUS Fiducial Points 1.2.840.10008.6.1.131 CID 3497 IVUS Arterial Morphology 1.2.840.10008.6.1.132 CID 3500 Pressure Units 1.2.840.10008.6.1.133 CID 3502 Hemodynamic Resistance Units 1.2.840.10008.6.1.134 CID 3503 Indexed Hemodynamic Resistance Units 1.2.840.10008.6.1.135 CID 3510 Catheter Size Units 1.2.840.10008.6.1.136 CID 3515 Specimen Collection 1.2.840.10008.6.1.137 CID 3520 Blood Source Type 1.2.840.10008.6.1.138 CID 3524 Blood Gas Pressures 1.2.840.10008.6.1.139 CID 3525 Blood Gas Content 1.2.840.10008.6.1.140 CID 3526 Blood Gas Saturation 1.2.840.10008.6.1.141 CID 3527 Blood Base Excess 1.2.840.10008.6.1.142 CID 3528 Blood pH 1.2.840.10008.6.1.143 CID 3529 Arterial / Venous Content 1.2.840.10008.6.1.144 CID 3530 Oxygen Administration Actions 1.2.840.10008.6.1.145 CID 3531 Oxygen Administration 1.2.840.10008.6.1.146 CID 3550 Circulatory Support Actions 1.2.840.10008.6.1.147 CID 3551 Ventilation Actions 1.2.840.10008.6.1.148 CID 3552 Pacing Actions 1.2.840.10008.6.1.149 CID 3553 Circulatory Support 1.2.840.10008.6.1.150 CID 3554 Ventilation 1.2.840.10008.6.1.151 CID 3555 Pacing 1.2.840.10008.6.1.152 CID 3560 Blood Pressure Methods 1.2.840.10008.6.1.153 CID 3600 Relative Times 1.2.840.10008.6.1.154 CID 3602 Hemodynamic Patient State 1.2.840.10008.6.1.155 CID 3604 Arterial Lesion Locations 1.2.840.10008.6.1.156 CID 3606 Arterial Source Locations 1.2.840.10008.6.1.157 CID 3607 Venous Source Locations 1.2.840.10008.6.1.158 CID 3608 Atrial Source Locations 1.2.840.10008.6.1.159 CID 3609 Ventricular Source Locations 1.2.840.10008.6.1.160 CID 3610 Gradient Source Locations 1.2.840.10008.6.1.161 CID 3611 Pressure Measurements 1.2.840.10008.6.1.162 CID 3612 Blood Velocity Measurements 1.2.840.10008.6.1.163 CID 3613 Hemodynamic Time Measurements 1.2.840.10008.6.1.164 CID 3614 Valve Areas, Non-mitral 1.2.840.10008.6.1.165 CID 3615 Valve Areas 1.2.840.10008.6.1.166 CID 3616 Hemodynamic Period Measurements 1.2.840.10008.6.1.167 CID 3617 Valve Flows 1.2.840.10008.6.1.168 CID 3618 Hemodynamic Flows 1.2.840.10008.6.1.169 CID 3619 Hemodynamic Resistance Measurements 1.2.840.10008.6.1.170 CID 3620 Hemodynamic Ratios 1.2.840.10008.6.1.171 CID 3621 Fractional Flow Reserve 1.2.840.10008.6.1.172 CID 3627 Measurement Type 1.2.840.10008.6.1.173 CID 3628 Cardiac Output Methods 1.2.840.10008.6.1.174 CID 3629 Procedure Intent 1.2.840.10008.6.1.175 CID 3630 Cardiovascular Anatomic Locations 1.2.840.10008.6.1.176 CID 3640 Hypertension 1.2.840.10008.6.1.177 CID 3641 Hemodynamic Assessments 1.2.840.10008.6.1.178 CID 3642 Degree Findings 1.2.840.10008.6.1.179 CID 3651 Hemodynamic Measurement Phase 1.2.840.10008.6.1.180 CID 3663 Body Surface Area Equations 1.2.840.10008.6.1.181 CID 3664 Oxygen Consumption Equations and Tables 1.2.840.10008.6.1.182 CID 3666 P50 Equations 1.2.840.10008.6.1.183 CID 3667 Framingham Scores 1.2.840.10008.6.1.184 CID 3668 Framingham Tables 1.2.840.10008.6.1.185 CID 3670 ECG Procedure Types 1.2.840.10008.6.1.186 CID 3671 Reason for ECG Exam 1.2.840.10008.6.1.187 CID 3672 Pacemakers 1.2.840.10008.6.1.188 CID 3673 Diagnosis (Retired) 1.2.840.10008.6.1.189 CID 3675 Other Filters (Retired) 1.2.840.10008.6.1.190 CID 3676 Lead Measurement Technique 1.2.840.10008.6.1.191 CID 3677 Summary Codes ECG 1.2.840.10008.6.1.192 CID 3678 QT Correction Algorithms 1.2.840.10008.6.1.193 CID 3679 ECG Morphology Descriptions (Retired) 1.2.840.10008.6.1.194 CID 3680 ECG Lead Noise Descriptions 1.2.840.10008.6.1.195 CID 3681 ECG Lead Noise Modifiers (Retired) 1.2.840.10008.6.1.196 CID 3682 Probability (Retired) 1.2.840.10008.6.1.197 CID 3683 Modifiers (Retired) 1.2.840.10008.6.1.198 CID 3684 Trend (Retired) 1.2.840.10008.6.1.199 CID 3685 Conjunctive Terms (Retired) 1.2.840.10008.6.1.200 CID 3686 ECG Interpretive Statements (Retired) 1.2.840.10008.6.1.201 CID 3687 Electrophysiology Waveform Durations 1.2.840.10008.6.1.202 CID 3688 Electrophysiology Waveform Voltages 1.2.840.10008.6.1.203 CID 3700 Cath Diagnosis 1.2.840.10008.6.1.204 CID 3701 Cardiac Valves and Tracts 1.2.840.10008.6.1.205 CID 3703 Wall Motion 1.2.840.10008.6.1.206 CID 3704 Myocardium Wall Morphology Findings 1.2.840.10008.6.1.207 CID 3705 Chamber Size 1.2.840.10008.6.1.208 CID 3706 Overall Contractility 1.2.840.10008.6.1.209 CID 3707 VSD Description 1.2.840.10008.6.1.210 CID 3709 Aortic Root Description 1.2.840.10008.6.1.211 CID 3710 Coronary Dominance 1.2.840.10008.6.1.212 CID 3711 Valvular Abnormalities 1.2.840.10008.6.1.213 CID 3712 Vessel Descriptors 1.2.840.10008.6.1.214 CID 3713 TIMI Flow Characteristics 1.2.840.10008.6.1.215 CID 3714 Thrombus 1.2.840.10008.6.1.216 CID 3715 Lesion Margin 1.2.840.10008.6.1.217 CID 3716 Severity 1.2.840.10008.6.1.218 CID 3717 Myocardial Wall Segments 1.2.840.10008.6.1.219 CID 3718 Myocardial Wall Segments in Projection 1.2.840.10008.6.1.220 CID 3719 Canadian Clinical Classification 1.2.840.10008.6.1.221 CID 3720 Cardiac History Dates (Retired) 1.2.840.10008.6.1.222 CID 3721 Cardiovascular Surgeries 1.2.840.10008.6.1.223 CID 3722 Diabetic Therapy 1.2.840.10008.6.1.224 CID 3723 MI Types 1.2.840.10008.6.1.225 CID 3724 Smoking History 1.2.840.10008.6.1.226 CID 3726 Indications for Coronary Intervention 1.2.840.10008.6.1.227 CID 3727 Indications for Catheterization 1.2.840.10008.6.1.228 CID 3728 Cath Findings 1.2.840.10008.6.1.229 CID 3729 Admission Status 1.2.840.10008.6.1.230 CID 3730 Insurance Payor 1.2.840.10008.6.1.231 CID 3733 Primary Cause of Death 1.2.840.10008.6.1.232 CID 3735 Acute Coronary Syndrome Time Period 1.2.840.10008.6.1.233 CID 3736 NYHA Classification 1.2.840.10008.6.1.234 CID 3737 Non-invasive Test - Ischemia 1.2.840.10008.6.1.235 CID 3738 Pre-Cath Angina Type 1.2.840.10008.6.1.236 CID 3739 Cath Procedure Type 1.2.840.10008.6.1.237 CID 3740 Thrombolytic Administration 1.2.840.10008.6.1.238 CID 3741 Medication Administration, Lab Visit 1.2.840.10008.6.1.239 CID 3742 Medication Administration, PCI 1.2.840.10008.6.1.240 CID 3743 Clopidogrel/Ticlopidine Administration 1.2.840.10008.6.1.241 CID 3744 EF Testing Method 1.2.840.10008.6.1.242 CID 3745 Calculation Method 1.2.840.10008.6.1.243 CID 3746 Percutaneous Entry Site 1.2.840.10008.6.1.244 CID 3747 Percutaneous Closure 1.2.840.10008.6.1.245 CID 3748 Angiographic EF Testing Method 1.2.840.10008.6.1.246 CID 3749 PCI Procedure Result 1.2.840.10008.6.1.247 CID 3750 Previously Dilated Lesion 1.2.840.10008.6.1.248 CID 3752 Guidewire Crossing 1.2.840.10008.6.1.249 CID 3754 Vascular Complications 1.2.840.10008.6.1.250 CID 3755 Cath Complications 1.2.840.10008.6.1.251 CID 3756 Cardiac Patient Risk Factors 1.2.840.10008.6.1.252 CID 3757 Cardiac Diagnostic Procedures 1.2.840.10008.6.1.253 CID 3758 Cardiovascular Family History 1.2.840.10008.6.1.254 CID 3760 Hypertension Therapy 1.2.840.10008.6.1.255 CID 3761 Antilipemic Agents 1.2.840.10008.6.1.256 CID 3762 Antiarrhythmic Agents 1.2.840.10008.6.1.257 CID 3764 Myocardial Infarction Therapies 1.2.840.10008.6.1.258 CID 3769 Concern Types 1.2.840.10008.6.1.259 CID 3770 Problem Status 1.2.840.10008.6.1.260 CID 3772 Health Status 1.2.840.10008.6.1.261 CID 3773 Use Status 1.2.840.10008.6.1.262 CID 3774 Social History 1.2.840.10008.6.1.263 CID 3777 Implanted Devices 1.2.840.10008.6.1.264 CID 3802 Plaque Structures 1.2.840.10008.6.1.265 CID 3804 Stenosis Measurement Methods 1.2.840.10008.6.1.266 CID 3805 Stenosis Types 1.2.840.10008.6.1.267 CID 3806 Stenosis Shape 1.2.840.10008.6.1.268 CID 3807 Volume Measurement Methods 1.2.840.10008.6.1.269 CID 3808 Aneurysm Types 1.2.840.10008.6.1.270 CID 3809 Associated Conditions 1.2.840.10008.6.1.271 CID 3810 Vascular Morphology 1.2.840.10008.6.1.272 CID 3813 Stent Findings 1.2.840.10008.6.1.273 CID 3814 Stent Composition 1.2.840.10008.6.1.274 CID 3815 Source of Vascular Finding 1.2.840.10008.6.1.275 CID 3817 Vascular Sclerosis Types 1.2.840.10008.6.1.276 CID 3820 Non-invasive Vascular Procedures 1.2.840.10008.6.1.277 CID 3821 Papillary Muscle Included/Excluded 1.2.840.10008.6.1.278 CID 3823 Respiratory Status 1.2.840.10008.6.1.279 CID 3826 Heart Rhythm 1.2.840.10008.6.1.280 CID 3827 Vessel Segments 1.2.840.10008.6.1.281 CID 3829 Pulmonary Arteries 1.2.840.10008.6.1.282 CID 3831 Stenosis Length 1.2.840.10008.6.1.283 CID 3832 Stenosis Grade 1.2.840.10008.6.1.284 CID 3833 Cardiac Ejection Fraction 1.2.840.10008.6.1.285 CID 3835 Cardiac Volume Measurements 1.2.840.10008.6.1.286 CID 3836 Time-based Perfusion Measurements 1.2.840.10008.6.1.287 CID 3837 Fiducial Feature 1.2.840.10008.6.1.288 CID 3838 Diameter Derivation 1.2.840.10008.6.1.289 CID 3839 Coronary Veins 1.2.840.10008.6.1.290 CID 3840 Pulmonary Veins 1.2.840.10008.6.1.291 CID 3843 Myocardial Subsegment 1.2.840.10008.6.1.292 CID 4005 Partial View Section for Mammography 1.2.840.10008.6.1.293 CID 4009 DX Anatomy Imaged 1.2.840.10008.6.1.294 CID 4010 DX View 1.2.840.10008.6.1.295 CID 4011 DX View Modifier 1.2.840.10008.6.1.296 CID 4012 Projection Eponymous Name 1.2.840.10008.6.1.297 CID 4013 Anatomic Region for Mammography 1.2.840.10008.6.1.298 CID 4014 View for Mammography 1.2.840.10008.6.1.299 CID 4015 View Modifier for Mammography 1.2.840.10008.6.1.300 CID 4016 Anatomic Region for Intra-oral Radiography 1.2.840.10008.6.1.301 CID 4017 Anatomic Region Modifier for Intra-oral Radiography 1.2.840.10008.6.1.302 CID 4018 Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth) 1.2.840.10008.6.1.303 CID 4019 Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth) 1.2.840.10008.6.1.304 CID 4020 PET Radionuclide 1.2.840.10008.6.1.305 CID 4021 PET Radiopharmaceutical 1.2.840.10008.6.1.306 CID 4028 Craniofacial Anatomic Regions 1.2.840.10008.6.1.307 CID 4030 CT, MR and PET Anatomy Imaged 1.2.840.10008.6.1.308 CID 4031 Common Anatomic Regions 1.2.840.10008.6.1.309 CID 4032 MR Spectroscopy Metabolites 1.2.840.10008.6.1.310 CID 4033 MR Proton Spectroscopy Metabolites 1.2.840.10008.6.1.311 CID 4040 Endoscopy Anatomic Regions 1.2.840.10008.6.1.312 CID 4042 XA/XRF Anatomy Imaged 1.2.840.10008.6.1.313 CID 4050 Drug or Contrast Agent Characteristics 1.2.840.10008.6.1.314 CID 4051 General Devices 1.2.840.10008.6.1.315 CID 4052 Phantom Devices 1.2.840.10008.6.1.316 CID 4200 Ophthalmic Imaging Agent 1.2.840.10008.6.1.317 CID 4201 Patient Eye Movement Command 1.2.840.10008.6.1.318 CID 4202 Ophthalmic Photography Acquisition Device 1.2.840.10008.6.1.319 CID 4203 Ophthalmic Photography Illumination 1.2.840.10008.6.1.320 CID 4204 Ophthalmic Filter 1.2.840.10008.6.1.321 CID 4205 Ophthalmic Lens 1.2.840.10008.6.1.322 CID 4206 Ophthalmic Channel Description 1.2.840.10008.6.1.323 CID 4207 Ophthalmic Image Position 1.2.840.10008.6.1.324 CID 4208 Mydriatic Agent 1.2.840.10008.6.1.325 CID 4209 Ophthalmic Anatomic Structure Imaged 1.2.840.10008.6.1.326 CID 4210 Ophthalmic Tomography Acquisition Device 1.2.840.10008.6.1.327 CID 4211 Ophthalmic OCT Anatomic Structure Imaged 1.2.840.10008.6.1.328 CID 5000 Languages 1.2.840.10008.6.1.329 CID 5001 Countries 1.2.840.10008.6.1.330 CID 6000 Overall Breast Composition 1.2.840.10008.6.1.331 CID 6001 Overall Breast Composition from BI-RADS(R) 1.2.840.10008.6.1.332 CID 6002 Change Since Last Mammogram or Prior Surgery 1.2.840.10008.6.1.333 CID 6003 Change Since Last Mammogram or Prior Surgery from BI-RADS(R) 1.2.840.10008.6.1.334 CID 6004 Mammography Characteristics of Shape 1.2.840.10008.6.1.335 CID 6005 Characteristics of Shape from BI-RADS(R) 1.2.840.10008.6.1.336 CID 6006 Mammography Characteristics of Margin 1.2.840.10008.6.1.337 CID 6007 Characteristics of Margin from BI-RADS(R) 1.2.840.10008.6.1.338 CID 6008 Density Modifier 1.2.840.10008.6.1.339 CID 6009 Density Modifier from BI-RADS(R) 1.2.840.10008.6.1.340 CID 6010 Mammography Calcification Types 1.2.840.10008.6.1.341 CID 6011 Calcification Types from BI-RADS(R) 1.2.840.10008.6.1.342 CID 6012 Calcification Distribution Modifier 1.2.840.10008.6.1.343 CID 6013 Calcification Distribution Modifier from BI-RADS(R) 1.2.840.10008.6.1.344 CID 6014 Mammography Single Image Finding 1.2.840.10008.6.1.345 CID 6015 Single Image Finding from BI-RADS(R) 1.2.840.10008.6.1.346 CID 6016 Mammography Composite Feature 1.2.840.10008.6.1.347 CID 6017 Composite Feature from BI-RADS(R) 1.2.840.10008.6.1.348 CID 6018 Clockface Location or Region 1.2.840.10008.6.1.349 CID 6019 Clockface Location or Region from BI-RADS(R) 1.2.840.10008.6.1.350 CID 6020 Quadrant Location 1.2.840.10008.6.1.351 CID 6021 Quadrant Location from BI-RADS(R) 1.2.840.10008.6.1.352 CID 6022 Side 1.2.840.10008.6.1.353 CID 6023 Side from BI-RADS(R) 1.2.840.10008.6.1.354 CID 6024 Depth 1.2.840.10008.6.1.355 CID 6025 Depth from BI-RADS(R) 1.2.840.10008.6.1.356 CID 6026 Mammography Assessment 1.2.840.10008.6.1.357 CID 6027 Assessment from BI-RADS(R) 1.2.840.10008.6.1.358 CID 6028 Mammography Recommended Follow-up 1.2.840.10008.6.1.359 CID 6029 Recommended Follow-up from BI-RADS(R) 1.2.840.10008.6.1.360 CID 6030 Mammography Pathology Codes 1.2.840.10008.6.1.361 CID 6031 Benign Pathology Codes from BI-RADS(R) 1.2.840.10008.6.1.362 CID 6032 High Risk Lesions Pathology Codes from BI-RADS(R) 1.2.840.10008.6.1.363 CID 6033 Malignant Pathology Codes from BI-RADS(R) 1.2.840.10008.6.1.364 CID 6034 Intended Use of CAD Output 1.2.840.10008.6.1.365 CID 6035 Composite Feature Relations 1.2.840.10008.6.1.366 CID 6036 Scope of Feature 1.2.840.10008.6.1.367 CID 6037 Mammography Quantitative Temporal Difference Type 1.2.840.10008.6.1.368 CID 6038 Mammography Qualitative Temporal Difference Type 1.2.840.10008.6.1.369 CID 6039 Nipple Characteristic 1.2.840.10008.6.1.370 CID 6040 Non-lesion Object Type 1.2.840.10008.6.1.371 CID 6041 Mammography Image Quality Finding 1.2.840.10008.6.1.372 CID 6042 Status of Results 1.2.840.10008.6.1.373 CID 6043 Types of Mammography CAD Analysis 1.2.840.10008.6.1.374 CID 6044 Types of Image Quality Assessment 1.2.840.10008.6.1.375 CID 6045 Mammography Types of Quality Control Standard 1.2.840.10008.6.1.376 CID 6046 Units of Follow-up Interval 1.2.840.10008.6.1.377 CID 6047 CAD Processing and Findings Summary 1.2.840.10008.6.1.378 CID 6048 CAD Operating Point Axis Label 1.2.840.10008.6.1.379 CID 6050 Breast Procedure Reported 1.2.840.10008.6.1.380 CID 6051 Breast Procedure Reason 1.2.840.10008.6.1.381 CID 6052 Breast Imaging Report Section Title 1.2.840.10008.6.1.382 CID 6053 Breast Imaging Report Elements 1.2.840.10008.6.1.383 CID 6054 Breast Imaging Findings 1.2.840.10008.6.1.384 CID 6055 Breast Clinical Finding or Indicated Problem 1.2.840.10008.6.1.385 CID 6056 Associated Findings for Breast 1.2.840.10008.6.1.386 CID 6057 Ductography Findings for Breast 1.2.840.10008.6.1.387 CID 6058 Procedure Modifiers for Breast 1.2.840.10008.6.1.388 CID 6059 Breast Implant Types 1.2.840.10008.6.1.389 CID 6060 Breast Biopsy Techniques 1.2.840.10008.6.1.390 CID 6061 Breast Imaging Procedure Modifiers 1.2.840.10008.6.1.391 CID 6062 Interventional Procedure Complications 1.2.840.10008.6.1.392 CID 6063 Interventional Procedure Results 1.2.840.10008.6.1.393 CID 6064 Ultrasound Findings for Breast 1.2.840.10008.6.1.394 CID 6065 Instrument Approach 1.2.840.10008.6.1.395 CID 6066 Target Confirmation 1.2.840.10008.6.1.396 CID 6067 Fluid Color 1.2.840.10008.6.1.397 CID 6068 Tumor Stages From AJCC 1.2.840.10008.6.1.398 CID 6069 Nottingham Combined Histologic Grade 1.2.840.10008.6.1.399 CID 6070 Bloom-Richardson Histologic Grade 1.2.840.10008.6.1.400 CID 6071 Histologic Grading Method 1.2.840.10008.6.1.401 CID 6072 Breast Implant Findings 1.2.840.10008.6.1.402 CID 6080 Gynecological Hormones 1.2.840.10008.6.1.403 CID 6081 Breast Cancer Risk Factors 1.2.840.10008.6.1.404 CID 6082 Gynecological Procedures 1.2.840.10008.6.1.405 CID 6083 Procedures for Breast 1.2.840.10008.6.1.406 CID 6084 Mammoplasty Procedures 1.2.840.10008.6.1.407 CID 6085 Therapies for Breast 1.2.840.10008.6.1.408 CID 6086 Menopausal Phase 1.2.840.10008.6.1.409 CID 6087 General Risk Factors 1.2.840.10008.6.1.410 CID 6088 OB-GYN Maternal Risk Factors 1.2.840.10008.6.1.411 CID 6089 Substances 1.2.840.10008.6.1.412 CID 6090 Relative Usage, Exposure Amount 1.2.840.10008.6.1.413 CID 6091 Relative Frequency of Event Values 1.2.840.10008.6.1.414 CID 6092 Quantitative Concepts for Usage, Exposure 1.2.840.10008.6.1.415 CID 6093 Qualitative Concepts for Usage, Exposure Amount 1.2.840.10008.6.1.416 CID 6094 Qualitative Concepts for Usage, Exposure Frequency 1.2.840.10008.6.1.417 CID 6095 Numeric Properties of Procedures 1.2.840.10008.6.1.418 CID 6096 Pregnancy Status 1.2.840.10008.6.1.419 CID 6097 Side of Family 1.2.840.10008.6.1.420 CID 6100 Chest Component Categories 1.2.840.10008.6.1.421 CID 6101 Chest Finding or Feature 1.2.840.10008.6.1.422 CID 6102 Chest Finding or Feature Modifier 1.2.840.10008.6.1.423 CID 6103 Abnormal Lines Finding or Feature 1.2.840.10008.6.1.424 CID 6104 Abnormal Opacity Finding or Feature 1.2.840.10008.6.1.425 CID 6105 Abnormal Lucency Finding or Feature 1.2.840.10008.6.1.426 CID 6106 Abnormal Texture Finding or Feature 1.2.840.10008.6.1.427 CID 6107 Width Descriptor 1.2.840.10008.6.1.428 CID 6108 Chest Anatomic Structure Abnormal Distribution 1.2.840.10008.6.1.429 CID 6109 Radiographic Anatomy Finding or Feature 1.2.840.10008.6.1.430 CID 6110 Lung Anatomy Finding or Feature 1.2.840.10008.6.1.431 CID 6111 Bronchovascular Anatomy Finding or Feature 1.2.840.10008.6.1.432 CID 6112 Pleura Anatomy Finding or Feature 1.2.840.10008.6.1.433 CID 6113 Mediastinum Anatomy Finding or Feature 1.2.840.10008.6.1.434 CID 6114 Osseous Anatomy Finding or Feature 1.2.840.10008.6.1.435 CID 6115 Osseous Anatomy Modifiers 1.2.840.10008.6.1.436 CID 6116 Muscular Anatomy 1.2.840.10008.6.1.437 CID 6117 Vascular Anatomy 1.2.840.10008.6.1.438 CID 6118 Size Descriptor 1.2.840.10008.6.1.439 CID 6119 Chest Border Shape 1.2.840.10008.6.1.440 CID 6120 Chest Border Definition 1.2.840.10008.6.1.441 CID 6121 Chest Orientation Descriptor 1.2.840.10008.6.1.442 CID 6122 Chest Content Descriptor 1.2.840.10008.6.1.443 CID 6123 Chest Opacity Descriptor 1.2.840.10008.6.1.444 CID 6124 Location in Chest 1.2.840.10008.6.1.445 CID 6125 General Chest Location 1.2.840.10008.6.1.446 CID 6126 Location in Lung 1.2.840.10008.6.1.447 CID 6127 Segment Location in Lung 1.2.840.10008.6.1.448 CID 6128 Chest Distribution Descriptor 1.2.840.10008.6.1.449 CID 6129 Chest Site Involvement 1.2.840.10008.6.1.450 CID 6130 Severity Descriptor 1.2.840.10008.6.1.451 CID 6131 Chest Texture Descriptor 1.2.840.10008.6.1.452 CID 6132 Chest Calcification Descriptor 1.2.840.10008.6.1.453 CID 6133 Chest Quantitative Temporal Difference Type 1.2.840.10008.6.1.454 CID 6134 Chest Qualitative Temporal Difference Type 1.2.840.10008.6.1.455 CID 6135 Image Quality Finding 1.2.840.10008.6.1.456 CID 6136 Chest Types of Quality Control Standard 1.2.840.10008.6.1.457 CID 6137 Types of CAD Analysis 1.2.840.10008.6.1.458 CID 6138 Chest Non-lesion Object Type 1.2.840.10008.6.1.459 CID 6139 Non-lesion Modifiers 1.2.840.10008.6.1.460 CID 6140 Calculation Methods 1.2.840.10008.6.1.461 CID 6141 Attenuation Coefficient Measurements 1.2.840.10008.6.1.462 CID 6142 Calculated Value 1.2.840.10008.6.1.463 CID 6143 Lesion Response 1.2.840.10008.6.1.464 CID 6144 RECIST Defined Lesion Response 1.2.840.10008.6.1.465 CID 6145 Baseline Category 1.2.840.10008.6.1.466 CID 6151 Background Echotexture 1.2.840.10008.6.1.467 CID 6152 Orientation 1.2.840.10008.6.1.468 CID 6153 Lesion Boundary 1.2.840.10008.6.1.469 CID 6154 Echo Pattern 1.2.840.10008.6.1.470 CID 6155 Posterior Acoustic Features 1.2.840.10008.6.1.471 CID 6157 Vascularity 1.2.840.10008.6.1.472 CID 6158 Correlation to Other Findings 1.2.840.10008.6.1.473 CID 6159 Malignancy Type 1.2.840.10008.6.1.474 CID 6160 Breast Primary Tumor Assessment From AJCC 1.2.840.10008.6.1.475 CID 6161 Clinical Regional Lymph Node Assessment for Breast 1.2.840.10008.6.1.476 CID 6162 Assessment of Metastasis for Breast 1.2.840.10008.6.1.477 CID 6163 Menstrual Cycle Phase 1.2.840.10008.6.1.478 CID 6164 Time Intervals 1.2.840.10008.6.1.479 CID 6165 Breast Linear Measurements 1.2.840.10008.6.1.480 CID 6166 CAD Geometry Secondary Graphical Representation 1.2.840.10008.6.1.481 CID 7000 Diagnostic Imaging Report Document Titles 1.2.840.10008.6.1.482 CID 7001 Diagnostic Imaging Report Headings 1.2.840.10008.6.1.483 CID 7002 Diagnostic Imaging Report Elements 1.2.840.10008.6.1.484 CID 7003 Diagnostic Imaging Report Purposes of Reference 1.2.840.10008.6.1.485 CID 7004 Waveform Purposes of Reference 1.2.840.10008.6.1.486 CID 7005 Contributing Equipment Purposes of Reference 1.2.840.10008.6.1.487 CID 7006 SR Document Purposes of Reference 1.2.840.10008.6.1.488 CID 7007 Signature Purpose 1.2.840.10008.6.1.489 CID 7008 Media Import 1.2.840.10008.6.1.490 CID 7010 Key Object Selection Document Title 1.2.840.10008.6.1.491 CID 7011 Rejected for Quality Reasons 1.2.840.10008.6.1.492 CID 7012 Best in Set 1.2.840.10008.6.1.493 CID 7020 Document Titles 1.2.840.10008.6.1.494 CID 7100 RCS Registration Method Type 1.2.840.10008.6.1.495 CID 7101 Brain Atlas Fiducials 1.2.840.10008.6.1.496 CID 7150 Segmentation Property Categories 1.2.840.10008.6.1.497 CID 7151 Segmentation Property Types 1.2.840.10008.6.1.498 CID 7152 Cardiac Structure Segmentation Types 1.2.840.10008.6.1.499 CID 7153 CNS Tissue Segmentation Types 1.2.840.10008.6.1.500 CID 7154 Abdominal Organ Segmentation Types 1.2.840.10008.6.1.501 CID 7155 Thoracic Tissue Segmentation Types 1.2.840.10008.6.1.502 CID 7156 Vascular Tissue Segmentation Types 1.2.840.10008.6.1.503 CID 7157 Device Segmentation Types 1.2.840.10008.6.1.504 CID 7158 Artifact Segmentation Types 1.2.840.10008.6.1.505 CID 7159 Lesion Segmentation Types 1.2.840.10008.6.1.506 CID 7160 Pelvic Organ Segmentation Types 1.2.840.10008.6.1.507 CID 7161 Physiology Segmentation Types 1.2.840.10008.6.1.508 CID 7201 Referenced Image Purposes of Reference 1.2.840.10008.6.1.509 CID 7202 Source Image Purposes of Reference 1.2.840.10008.6.1.510 CID 7203 Image Derivation 1.2.840.10008.6.1.511 CID 7205 Purpose of Reference to Alternate Representation 1.2.840.10008.6.1.512 CID 7210 Related Series Purposes of Reference 1.2.840.10008.6.1.513 CID 7250 Multi-Frame Subset Type 1.2.840.10008.6.1.514 CID 7450 Person Roles 1.2.840.10008.6.1.515 CID 7451 Family Member 1.2.840.10008.6.1.516 CID 7452 Organizational Roles 1.2.840.10008.6.1.517 CID 7453 Performing Roles 1.2.840.10008.6.1.518 CID 7454 Animal Taxonomic Rank Values 1.2.840.10008.6.1.519 CID 7455 Sex 1.2.840.10008.6.1.520 CID 7456 Units of Measure for Age 1.2.840.10008.6.1.521 CID 7460 Units of Linear Measurement 1.2.840.10008.6.1.522 CID 7461 Units of Area Measurement 1.2.840.10008.6.1.523 CID 7462 Units of Volume Measurement 1.2.840.10008.6.1.524 CID 7470 Linear Measurements 1.2.840.10008.6.1.525 CID 7471 Area Measurements 1.2.840.10008.6.1.526 CID 7472 Volume Measurements 1.2.840.10008.6.1.527 CID 7473 General Area Calculation Methods 1.2.840.10008.6.1.528 CID 7474 General Volume Calculation Methods 1.2.840.10008.6.1.529 CID 7480 Breed 1.2.840.10008.6.1.530 CID 7481 Breed Registry 1.2.840.10008.6.1.531 CID 9231 Workitem Definition 1.2.840.10008.6.1.532 CID 9232 Non-DICOM Output Types (Retired) 1.2.840.10008.6.1.533 CID 9300 Procedure Discontinuation Reasons 1.2.840.10008.6.1.534 CID 10000 Scope of Accumulation 1.2.840.10008.6.1.535 CID 10001 UID Types 1.2.840.10008.6.1.536 CID 10002 Irradiation Event Types 1.2.840.10008.6.1.537 CID 10003 Equipment Plane Identification 1.2.840.10008.6.1.538 CID 10004 Fluoro Modes 1.2.840.10008.6.1.539 CID 10006 X-Ray Filter Materials 1.2.840.10008.6.1.540 CID 10007 X-Ray Filter Types 1.2.840.10008.6.1.541 CID 10008 Dose Related Distance Measurements 1.2.840.10008.6.1.542 CID 10009 Measured/Calculated 1.2.840.10008.6.1.543 CID 10010 Dose Measurement Devices 1.2.840.10008.6.1.544 CID 10011 Effective Dose Evaluation Method 1.2.840.10008.6.1.545 CID 10013 CT Acquisition Type 1.2.840.10008.6.1.546 CID 10014 Contrast Imaging Technique 1.2.840.10008.6.1.547 CID 10015 CT Dose Reference Authorities 1.2.840.10008.6.1.548 CID 10016 Anode Target Material 1.2.840.10008.6.1.549 CID 10017 X-Ray Grid 1.2.840.10008.6.1.550 CID 12001 Ultrasound Protocol Types 1.2.840.10008.6.1.551 CID 12002 Ultrasound Protocol Stage Types 1.2.840.10008.6.1.552 CID 12003 OB-GYN Dates 1.2.840.10008.6.1.553 CID 12004 Fetal Biometry Ratios 1.2.840.10008.6.1.554 CID 12005 Fetal Biometry Measurements 1.2.840.10008.6.1.555 CID 12006 Fetal Long Bones Biometry Measurements 1.2.840.10008.6.1.556 CID 12007 Fetal Cranium 1.2.840.10008.6.1.557 CID 12008 OB-GYN Amniotic Sac 1.2.840.10008.6.1.558 CID 12009 Early Gestation Biometry Measurements 1.2.840.10008.6.1.559 CID 12011 Ultrasound Pelvis and Uterus 1.2.840.10008.6.1.560 CID 12012 OB Equations and Tables 1.2.840.10008.6.1.561 CID 12013 Gestational Age Equations and Tables 1.2.840.10008.6.1.562 CID 12014 OB Fetal Body Weight Equations and Tables 1.2.840.10008.6.1.563 CID 12015 Fetal Growth Equations and Tables 1.2.840.10008.6.1.564 CID 12016 Estimated Fetal Weight Percentile Equations and Tables 1.2.840.10008.6.1.565 CID 12017 Growth Distribution Rank 1.2.840.10008.6.1.566 CID 12018 OB-GYN Summary 1.2.840.10008.6.1.567 CID 12019 OB-GYN Fetus Summary 1.2.840.10008.6.1.568 CID 12101 Vascular Summary 1.2.840.10008.6.1.569 CID 12102 Temporal Periods Relating to Procedure or Therapy 1.2.840.10008.6.1.570 CID 12103 Vascular Ultrasound Anatomic Location 1.2.840.10008.6.1.571 CID 12104 Extracranial Arteries 1.2.840.10008.6.1.572 CID 12105 Intracranial Cerebral Vessels 1.2.840.10008.6.1.573 CID 12106 Intracranial Cerebral Vessels (Unilateral) 1.2.840.10008.6.1.574 CID 12107 Upper Extremity Arteries 1.2.840.10008.6.1.575 CID 12108 Upper Extremity Veins 1.2.840.10008.6.1.576 CID 12109 Lower Extremity Arteries 1.2.840.10008.6.1.577 CID 12110 Lower Extremity Veins 1.2.840.10008.6.1.578 CID 12111 Abdominal Arteries (Lateral) 1.2.840.10008.6.1.579 CID 12112 Abdominal Arteries (Unilateral) 1.2.840.10008.6.1.580 CID 12113 Abdominal Veins (Lateral) 1.2.840.10008.6.1.581 CID 12114 Abdominal Veins (Unilateral) 1.2.840.10008.6.1.582 CID 12115 Renal Vessels 1.2.840.10008.6.1.583 CID 12116 Vessel Segment Modifiers 1.2.840.10008.6.1.584 CID 12117 Vessel Branch Modifiers 1.2.840.10008.6.1.585 CID 12119 Vascular Ultrasound Property 1.2.840.10008.6.1.586 CID 12120 Blood Velocity Measurements by Ultrasound 1.2.840.10008.6.1.587 CID 12121 Vascular Indices and Ratios 1.2.840.10008.6.1.588 CID 12122 Other Vascular Properties 1.2.840.10008.6.1.589 CID 12123 Carotid Ratios 1.2.840.10008.6.1.590 CID 12124 Renal Ratios 1.2.840.10008.6.1.591 CID 12140 Pelvic Vasculature Anatomical Location 1.2.840.10008.6.1.592 CID 12141 Fetal Vasculature Anatomical Location 1.2.840.10008.6.1.593 CID 12200 Echocardiography Left Ventricle 1.2.840.10008.6.1.594 CID 12201 Left Ventricle Linear 1.2.840.10008.6.1.595 CID 12202 Left Ventricle Volume 1.2.840.10008.6.1.596 CID 12203 Left Ventricle Other 1.2.840.10008.6.1.597 CID 12204 Echocardiography Right Ventricle 1.2.840.10008.6.1.598 CID 12205 Echocardiography Left Atrium 1.2.840.10008.6.1.599 CID 12206 Echocardiography Right Atrium 1.2.840.10008.6.1.600 CID 12207 Echocardiography Mitral Valve 1.2.840.10008.6.1.601 CID 12208 Echocardiography Tricuspid Valve 1.2.840.10008.6.1.602 CID 12209 Echocardiography Pulmonic Valve 1.2.840.10008.6.1.603 CID 12210 Echocardiography Pulmonary Artery 1.2.840.10008.6.1.604 CID 12211 Echocardiography Aortic Valve 1.2.840.10008.6.1.605 CID 12212 Echocardiography Aorta 1.2.840.10008.6.1.606 CID 12214 Echocardiography Pulmonary Veins 1.2.840.10008.6.1.607 CID 12215 Echocardiography Vena Cavae 1.2.840.10008.6.1.608 CID 12216 Echocardiography Hepatic Veins 1.2.840.10008.6.1.609 CID 12217 Echocardiography Cardiac Shunt 1.2.840.10008.6.1.610 CID 12218 Echocardiography Congenital 1.2.840.10008.6.1.611 CID 12219 Pulmonary Vein Modifiers 1.2.840.10008.6.1.612 CID 12220 Echocardiography Common Measurements 1.2.840.10008.6.1.613 CID 12221 Flow Direction 1.2.840.10008.6.1.614 CID 12222 Orifice Flow Properties 1.2.840.10008.6.1.615 CID 12223 Echocardiography Stroke Volume Origin 1.2.840.10008.6.1.616 CID 12224 Ultrasound Image Modes 1.2.840.10008.6.1.617 CID 12226 Echocardiography Image View 1.2.840.10008.6.1.618 CID 12227 Echocardiography Measurement Method 1.2.840.10008.6.1.619 CID 12228 Echocardiography Volume Methods 1.2.840.10008.6.1.620 CID 12229 Echocardiography Area Methods 1.2.840.10008.6.1.621 CID 12230 Gradient Methods 1.2.840.10008.6.1.622 CID 12231 Volume Flow Methods 1.2.840.10008.6.1.623 CID 12232 Myocardium Mass Methods 1.2.840.10008.6.1.624 CID 12233 Cardiac Phase 1.2.840.10008.6.1.625 CID 12234 Respiration State 1.2.840.10008.6.1.626 CID 12235 Mitral Valve Anatomic Sites 1.2.840.10008.6.1.627 CID 12236 Echo Anatomic Sites 1.2.840.10008.6.1.628 CID 12237 Echocardiography Anatomic Site Modifiers 1.2.840.10008.6.1.629 CID 12238 Wall Motion Scoring Schemes 1.2.840.10008.6.1.630 CID 12239 Cardiac Output Properties 1.2.840.10008.6.1.631 CID 12240 Left Ventricle Area 1.2.840.10008.6.1.632 CID 12241 Tricuspid Valve Finding Sites 1.2.840.10008.6.1.633 CID 12242 Aortic Valve Finding Sites 1.2.840.10008.6.1.634 CID 12243 Left Ventricle Finding Sites 1.2.840.10008.6.1.635 CID 12244 Congenital Finding Sites 1.2.840.10008.6.1.636 CID 7162 Surface Processing Algorithm Families 1.2.840.10008.6.1.637 CID 3207 Stress Test Procedure Phases 1.2.840.10008.6.1.638 CID 3778 Stages 1.2.840.10008.6.1.735 CID 252 S-M-L Size Descriptor 1.2.840.10008.6.1.736 CID 3016 Major Coronary Arteries 1.2.840.10008.6.1.737 CID 3083 Units of Radioactivity 1.2.840.10008.6.1.738 CID 3102 Rest-Stress 1.2.840.10008.6.1.739 CID 3106 PET Cardiology Protocols 1.2.840.10008.6.1.740 CID 3107 PET Cardiology Radiopharmaceuticals 1.2.840.10008.6.1.741 CID 3108 NM/PET Procedures 1.2.840.10008.6.1.742 CID 3110 Nuclear Cardiology Protocols 1.2.840.10008.6.1.743 CID 3111 Nuclear Cardiology Radiopharmaceuticals 1.2.840.10008.6.1.744 CID 3112 Attenuation Correction 1.2.840.10008.6.1.745 CID 3113 Types of Perfusion Defects 1.2.840.10008.6.1.746 CID 3114 Study Quality 1.2.840.10008.6.1.747 CID 3115 Stress Imaging Quality Issues 1.2.840.10008.6.1.748 CID 3116 NM Extracardiac Findings 1.2.840.10008.6.1.749 CID 3117 Attenuation Correction Methods 1.2.840.10008.6.1.750 CID 3118 Level of Risk 1.2.840.10008.6.1.751 CID 3119 LV Function 1.2.840.10008.6.1.752 CID 3120 Perfusion Findings 1.2.840.10008.6.1.753 CID 3121 Perfusion Morphology 1.2.840.10008.6.1.754 CID 3122 Ventricular Enlargement 1.2.840.10008.6.1.755 CID 3200 Stress Test Procedure 1.2.840.10008.6.1.756 CID 3201 Indications for Stress Test 1.2.840.10008.6.1.757 CID 3202 Chest Pain 1.2.840.10008.6.1.758 CID 3203 Exerciser Device 1.2.840.10008.6.1.759 CID 3204 Stress Agents 1.2.840.10008.6.1.760 CID 3205 Indications for Pharmacological Stress Test 1.2.840.10008.6.1.761 CID 3206 Non-invasive Cardiac Imaging Procedures 1.2.840.10008.6.1.763 CID 3208 Summary Codes Exercise ECG 1.2.840.10008.6.1.764 CID 3209 Summary Codes Stress Imaging 1.2.840.10008.6.1.765 CID 3210 Speed of Response 1.2.840.10008.6.1.766 CID 3211 BP Response 1.2.840.10008.6.1.767 CID 3212 Treadmill Speed 1.2.840.10008.6.1.768 CID 3213 Stress Hemodynamic Findings 1.2.840.10008.6.1.769 CID 3215 Perfusion Finding Method 1.2.840.10008.6.1.770 CID 3217 Comparison Finding 1.2.840.10008.6.1.771 CID 3220 Stress Symptoms 1.2.840.10008.6.1.772 CID 3221 Stress Test Termination Reasons 1.2.840.10008.6.1.773 CID 3227 QTc Measurements 1.2.840.10008.6.1.774 CID 3228 ECG Timing Measurements 1.2.840.10008.6.1.775 CID 3229 ECG Axis Measurements 1.2.840.10008.6.1.776 CID 3230 ECG Findings 1.2.840.10008.6.1.777 CID 3231 ST Segment Findings 1.2.840.10008.6.1.778 CID 3232 ST Segment Location 1.2.840.10008.6.1.779 CID 3233 ST Segment Morphology 1.2.840.10008.6.1.780 CID 3234 Ectopic Beat Morphology 1.2.840.10008.6.1.781 CID 3235 Perfusion Comparison Findings 1.2.840.10008.6.1.782 CID 3236 Tolerance Comparison Findings 1.2.840.10008.6.1.783 CID 3237 Wall Motion Comparison Findings 1.2.840.10008.6.1.784 CID 3238 Stress Scoring Scales 1.2.840.10008.6.1.785 CID 3239 Perceived Exertion Scales 1.2.840.10008.6.1.786 CID 3463 Ventricle Identification 1.2.840.10008.6.1.787 CID 6200 Colon Overall Assessment 1.2.840.10008.6.1.788 CID 6201 Colon Finding or Feature 1.2.840.10008.6.1.789 CID 6202 Colon Finding or Feature Modifier 1.2.840.10008.6.1.790 CID 6203 Colon Non-lesion Object Type 1.2.840.10008.6.1.791 CID 6204 Anatomic Non-colon Findings 1.2.840.10008.6.1.792 CID 6205 Clockface Location for Colon 1.2.840.10008.6.1.793 CID 6206 Recumbent Patient Orientation for Colon 1.2.840.10008.6.1.794 CID 6207 Colon Quantitative Temporal Difference Type 1.2.840.10008.6.1.795 CID 6208 Colon Types of Quality Control Standard 1.2.840.10008.6.1.796 CID 6209 Colon Morphology Descriptor 1.2.840.10008.6.1.797 CID 6210 Location in Intestinal Tract 1.2.840.10008.6.1.798 CID 6211 Colon CAD Material Description 1.2.840.10008.6.1.799 CID 6212 Calculated Value for Colon Findings 1.2.840.10008.6.1.800 CID 4214 Ophthalmic Horizontal Directions 1.2.840.10008.6.1.801 CID 4215 Ophthalmic Vertical Directions 1.2.840.10008.6.1.802 CID 4216 Ophthalmic Visual Acuity Type 1.2.840.10008.6.1.803 CID 3004 Arterial Pulse Waveform 1.2.840.10008.6.1.804 CID 3005 Respiration Waveform 1.2.840.10008.6.1.805 CID 12030 Ultrasound Contrast/Bolus Agents 1.2.840.10008.6.1.806 CID 12031 Protocol Interval Events 1.2.840.10008.6.1.807 CID 12032 Transducer Scan Pattern 1.2.840.10008.6.1.808 CID 12033 Ultrasound Transducer Geometry 1.2.840.10008.6.1.809 CID 12034 Ultrasound Transducer Beam Steering 1.2.840.10008.6.1.810 CID 12035 Ultrasound Transducer Application 1.2.840.10008.6.1.811 CID 50 Instance Availability Status 1.2.840.10008.6.1.812 CID 9301 Modality PPS Discontinuation Reasons 1.2.840.10008.6.1.813 CID 9302 Media Import PPS Discontinuation Reasons 1.2.840.10008.6.1.814 CID 7482 DX Anatomy Imaged for Animals 1.2.840.10008.6.1.815 CID 7483 Common Anatomic Regions for Animals 1.2.840.10008.6.1.816 CID 7484 DX View for Animals 1.2.840.10008.6.1.817 CID 7030 Institutional Departments, Units and Services 1.2.840.10008.6.1.818 CID 7009 Purpose of Reference to Predecessor Report 1.2.840.10008.6.1.819 CID 4220 Visual Fixation Quality During Acquisition 1.2.840.10008.6.1.820 CID 4221 Visual Fixation Quality Problem 1.2.840.10008.6.1.821 CID 4222 Ophthalmic Macular Grid Problem 1.2.840.10008.6.1.822 CID 5002 Organizations 1.2.840.10008.6.1.823 CID 7486 Mixed Breeds 1.2.840.10008.6.1.824 CID 7040 Broselow-Luten Pediatric Size Categories 1.2.840.10008.6.1.825 CID 7042 Calcium Scoring Patient Size Categories 1.2.840.10008.6.1.826 CID 12245 Cardiac Ultrasound Report Titles 1.2.840.10008.6.1.827 CID 12246 Cardiac Ultrasound Indication for Study 1.2.840.10008.6.1.828 CID 12247 Pediatric, Fetal and Congenital Cardiac Surgical Interventions 1.2.840.10008.6.1.829 CID 12248 Cardiac Ultrasound Summary Codes 1.2.840.10008.6.1.830 CID 12249 Cardiac Ultrasound Fetal Summary Codes 1.2.840.10008.6.1.831 CID 12250 Cardiac Ultrasound Common Linear Measurements 1.2.840.10008.6.1.832 CID 12251 Cardiac Ultrasound Linear Valve Measurements 1.2.840.10008.6.1.833 CID 12252 Cardiac Ultrasound Cardiac Function 1.2.840.10008.6.1.834 CID 12253 Cardiac Ultrasound Area Measurements 1.2.840.10008.6.1.835 CID 12254 Cardiac Ultrasound Hemodynamic Measurements 1.2.840.10008.6.1.836 CID 12255 Cardiac Ultrasound Myocardium Measurements 1.2.840.10008.6.1.837 1.2.840.10008.6.1.838 CID 12257 Cardiac Ultrasound Left Ventricle 1.2.840.10008.6.1.839 CID 12258 Cardiac Ultrasound Right Ventricle 1.2.840.10008.6.1.840 CID 12259 Cardiac Ultrasound Ventricles Measurements 1.2.840.10008.6.1.841 CID 12260 Cardiac Ultrasound Pulmonary Artery 1.2.840.10008.6.1.842 CID 12261 Cardiac Ultrasound Pulmonary Vein 1.2.840.10008.6.1.843 CID 12262 Cardiac Ultrasound Pulmonary Valve 1.2.840.10008.6.1.844 CID 12263 Cardiac Ultrasound Venous Return Pulmonary Measurements 1.2.840.10008.6.1.845 CID 12264 Cardiac Ultrasound Venous Return Systemic Measurements 1.2.840.10008.6.1.846 CID 12265 Cardiac Ultrasound Atria and Atrial Septum Measurements 1.2.840.10008.6.1.847 CID 12266 Cardiac Ultrasound Mitral Valve 1.2.840.10008.6.1.848 CID 12267 Cardiac Ultrasound Tricuspid Valve 1.2.840.10008.6.1.849 CID 12268 Cardiac Ultrasound Atrioventricular Valves Measurements 1.2.840.10008.6.1.850 CID 12269 Cardiac Ultrasound Interventricular Septum Measurements 1.2.840.10008.6.1.851 CID 12270 Cardiac Ultrasound Aortic Valve 1.2.840.10008.6.1.852 CID 12271 Cardiac Ultrasound Outflow Tracts Measurements 1.2.840.10008.6.1.853 CID 12272 Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Measurements 1.2.840.10008.6.1.854 CID 12273 Cardiac Ultrasound Aortic Sinotubular Junction 1.2.840.10008.6.1.855 CID 12274 Cardiac Ultrasound Aorta Measurements 1.2.840.10008.6.1.856 CID 12275 Cardiac Ultrasound Coronary Arteries Measurements 1.2.840.10008.6.1.857 CID 12276 Cardiac Ultrasound Aorto Pulmonary Connections Measurements 1.2.840.10008.6.1.858 CID 12277 Cardiac Ultrasound Pericardium and Pleura Measurements 1.2.840.10008.6.1.859 CID 12279 Cardiac Ultrasound Fetal General Measurements 1.2.840.10008.6.1.860 CID 12280 Cardiac Ultrasound Target Sites 1.2.840.10008.6.1.861 CID 12281 Cardiac Ultrasound Target Site Modifiers 1.2.840.10008.6.1.862 CID 12282 Cardiac Ultrasound Venous Return Systemic Finding Sites 1.2.840.10008.6.1.863 CID 12283 Cardiac Ultrasound Venous Return Pulmonary Finding Sites 1.2.840.10008.6.1.864 CID 12284 Cardiac Ultrasound Atria and Atrial Septum Finding Sites 1.2.840.10008.6.1.865 CID 12285 Cardiac Ultrasound Atrioventricular Valves Finding Sites 1.2.840.10008.6.1.866 CID 12286 Cardiac Ultrasound Interventricular Septum Finding Sites 1.2.840.10008.6.1.867 CID 12287 Cardiac Ultrasound Ventricles Finding Sites 1.2.840.10008.6.1.868 CID 12288 Cardiac Ultrasound Outflow Tracts Finding Sites 1.2.840.10008.6.1.869 CID 12289 Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites 1.2.840.10008.6.1.870 CID 12290 Cardiac Ultrasound Pulmonary Arteries Finding Sites 1.2.840.10008.6.1.871 CID 12291 Cardiac Ultrasound Aorta Finding Sites 1.2.840.10008.6.1.872 CID 12292 Cardiac Ultrasound Coronary Arteries Finding Sites 1.2.840.10008.6.1.873 CID 12293 Cardiac Ultrasound Aortopulmonary Connections Finding Sites 1.2.840.10008.6.1.874 CID 12294 Cardiac Ultrasound Pericardium and Pleura Finding Sites 1.2.840.10008.6.1.876 CID 4230 Ophthalmic Ultrasound Axial Measurements Type 1.2.840.10008.6.1.877 CID 4231 Lens Status 1.2.840.10008.6.1.878 CID 4232 Vitreous Status 1.2.840.10008.6.1.879 CID 4233 Ophthalmic Axial Length Measurements Segment Names 1.2.840.10008.6.1.880 CID 4234 Refractive Surgery Types 1.2.840.10008.6.1.881 CID 4235 Keratometry Descriptors 1.2.840.10008.6.1.882 CID 4236 IOL Calculation Formula 1.2.840.10008.6.1.883 CID 4237 Lens Constant Type 1.2.840.10008.6.1.884 CID 4238 Refractive Error Types 1.2.840.10008.6.1.885 CID 4239 Anterior Chamber Depth Definition 1.2.840.10008.6.1.886 CID 4240 Ophthalmic Measurement or Calculation Data Source 1.2.840.10008.6.1.887 CID 4241 Ophthalmic Axial Length Selection Method 1.2.840.10008.6.1.888 1.2.840.10008.6.1.889 CID 4243 Ophthalmic Quality Metric Type 1.2.840.10008.6.1.890 CID 4244 Ophthalmic Agent Concentration Units 1.2.840.10008.6.1.891 CID 91 Functional Condition Present During Acquisition 1.2.840.10008.6.1.892 CID 92 Joint Position During Acquisition 1.2.840.10008.6.1.893 CID 93 Joint Positioning Method 1.2.840.10008.6.1.894 CID 94 Physical Force Applied During Acquisition 1.2.840.10008.6.1.895 CID 3690 ECG Control Variables Numeric 1.2.840.10008.6.1.896 CID 3691 ECG Control Variables Text 1.2.840.10008.6.1.897 CID 8120 WSI Referenced Image Purposes of Reference 1.2.840.10008.6.1.898 CID 8121 Microscopy Lens Type 1.2.840.10008.6.1.899 CID 8122 Microscopy Illuminator and Sensor Color 1.2.840.10008.6.1.900 CID 8123 Microscopy Illumination Method 1.2.840.10008.6.1.901 CID 8124 Microscopy Filter 1.2.840.10008.6.1.902 CID 8125 Microscopy Illuminator Type 1.2.840.10008.6.1.903 CID 400 Audit Event ID 1.2.840.10008.6.1.904 CID 401 Audit Event Type Code 1.2.840.10008.6.1.905 CID 402 Audit Active Participant Role ID Code 1.2.840.10008.6.1.906 CID 403 Security Alert Type Code 1.2.840.10008.6.1.907 CID 404 Audit Participant Object ID Type Code 1.2.840.10008.6.1.908 CID 405 Media Type Code 1.2.840.10008.6.1.909 CID 4250 Visual Field Static Perimetry Test Patterns 1.2.840.10008.6.1.910 CID 4251 Visual Field Static Perimetry Test Strategies 1.2.840.10008.6.1.911 CID 4252 Visual Field Static Perimetry Screening Test Modes 1.2.840.10008.6.1.912 CID 4253 Visual Field Static Perimetry Fixation Strategy 1.2.840.10008.6.1.913 CID 4254 Visual Field Static Perimetry Test Analysis Results 1.2.840.10008.6.1.914 CID 4255 Visual Field Illumination Color 1.2.840.10008.6.1.915 CID 4256 Visual Field Procedure Modifier 1.2.840.10008.6.1.916 CID 4257 Visual Field Global Index Name 1.2.840.10008.6.1.917 CID 7180 Abstract Multi-dimensional Image Model Component Semantics 1.2.840.10008.6.1.918 CID 7181 Abstract Multi-dimensional Image Model Component Units 1.2.840.10008.6.1.919 CID 7182 Abstract Multi-dimensional Image Model Dimension Semantics 1.2.840.10008.6.1.920 CID 7183 Abstract Multi-dimensional Image Model Dimension Units 1.2.840.10008.6.1.921 CID 7184 Abstract Multi-dimensional Image Model Axis Direction 1.2.840.10008.6.1.922 CID 7185 Abstract Multi-dimensional Image Model Axis Orientation 1.2.840.10008.6.1.923 CID 7186 Abstract Multi-dimensional Image Model Qualitative Dimension Sample Semantics 1.2.840.10008.6.1.924 CID 7320 Planning Methods 1.2.840.10008.6.1.925 CID 7050 De-identification Method 1.2.840.10008.6.1.926 CID 12118 Measurement Orientation 1.2.840.10008.6.1.927 CID 3689 ECG Global Waveform Durations 1.2.840.10008.6.1.930 CID 3692 ICDs 1.2.840.10008.6.1.931 CID 9241 Radiotherapy General Workitem Definition 1.2.840.10008.6.1.932 CID 9242 Radiotherapy Acquisition Workitem Definition 1.2.840.10008.6.1.933 CID 9243 Radiotherapy Registration Workitem Definition 1.2.840.10008.6.1.934 CID 3850 Intravascular OCT Flush Agent 1.2.840.10008.6.1.935 CID 10022 Label Types 1.2.840.10008.6.1.936 CID 4260 Ophthalmic Mapping Units for Real World Value Mapping 1.2.840.10008.6.1.937 CID 4261 Ophthalmic Mapping Acquisition Method 1.2.840.10008.6.1.938 CID 4262 Retinal Thickness Definition 1.2.840.10008.6.1.939 CID 4263 Ophthalmic Thickness Map Value Type 1.2.840.10008.6.1.940 CID 4264 Ophthalmic Map Purposes of Reference 1.2.840.10008.6.1.941 CID 4265 Ophthalmic Thickness Deviation Categories 1.2.840.10008.6.1.942 CID 4266 Ophthalmic Anatomic Structure Reference Point 1.2.840.10008.6.1.943 CID 3104 Cardiac Synchronization Technique 1.2.840.10008.6.1.944 CID 8130 Staining Protocols 1.2.840.10008.6.1.945 1.2.840.10008.6.1.946 1.2.840.10008.6.1.947 CID 10023 Size Specific Dose Estimation Method for CT 1.2.840.10008.6.1.948 CID 8131 Pathology Imaging Protocols 1.2.840.10008.6.1.949 CID 8132 Magnification Selection 1.2.840.10008.6.1.950 CID 8133 Tissue Selection 1.2.840.10008.6.1.951 CID 7464 General Region of Interest Measurement Modifiers 1.2.840.10008.6.1.952 CID 7465 Measurements Derived From Multiple ROI Measurements 1.2.840.10008.6.1.953 CID 8201 Surface Scan Acquisition Types 1.2.840.10008.6.1.954 CID 8202 Surface Scan Mode Types 1.2.840.10008.6.1.956 CID 8203 Surface Scan Registration Method Types 1.2.840.10008.6.1.957 CID 27 Basic Cardiac Views 1.2.840.10008.6.1.958 CID 10033 CT Reconstruction Algorithm 1.2.840.10008.6.1.959 CID 10030 Detector Types 1.2.840.10008.6.1.960 CID 10031 CR/DR Mechanical Configuration 1.2.840.10008.6.1.961 CID 10032 Projection X-Ray Acquisition Device Types 1.2.840.10008.6.1.962 CID 7165 Abstract Segmentation Types 1.2.840.10008.6.1.963 CID 7166 Common Tissue Segmentation Types 1.2.840.10008.6.1.964 CID 7167 Peripheral Nervous System Segmentation Types 1.2.840.10008.6.1.965 CID 4267 Corneal Topography Mapping Units for Real World Value Mapping 1.2.840.10008.6.1.966 CID 4268 Corneal Topography Map Value Type 1.2.840.10008.6.1.967 CID 7140 Brain Structures for Volumetric Measurements 1.2.840.10008.6.1.968 CID 7220 RT Dose Derivation 1.2.840.10008.6.1.969 CID 7221 RT Dose Purpose of Reference 1.2.840.10008.6.1.970 CID 7215 Spectroscopy Purpose of Reference 1.2.840.10008.6.1.971 CID 9250 Scheduled Processing Parameter Concept Codes for RT Treatment 1.2.840.10008.6.1.972 CID 10040 Radiopharmaceutical Organ Dose Reference Authority 1.2.840.10008.6.1.973 CID 10041 Source of Radioisotope Activity Information 1.2.840.10008.6.1.975 CID 10043 Intravenous Extravasation Symptoms 1.2.840.10008.6.1.976 CID 10044 Radiosensitive Organs 1.2.840.10008.6.1.977 CID 10045 Radiopharmaceutical Patient State 1.2.840.10008.6.1.978 CID 10046 GFR Measurements 1.2.840.10008.6.1.979 CID 10047 GFR Measurement Methods 1.2.840.10008.6.1.980 CID 8300 Visual Evaluation Methods 1.2.840.10008.6.1.981 CID 8301 Test Pattern Codes 1.2.840.10008.6.1.982 CID 8302 Measurement Pattern Codes 1.2.840.10008.6.1.983 CID 8303 Display Device Type 1.2.840.10008.6.1.984 CID 85 SUV Units 1.2.840.10008.6.1.985 CID 4100 T1 Measurement Methods 1.2.840.10008.6.1.986 CID 4101 Tracer Kinetic Models 1.2.840.10008.6.1.987 CID 4102 Perfusion Measurement Methods 1.2.840.10008.6.1.988 CID 4103 Arterial Input Function Measurement Methods 1.2.840.10008.6.1.989 CID 4104 Bolus Arrival Time Derivation Methods 1.2.840.10008.6.1.990 CID 4105 Perfusion Analysis Methods 1.2.840.10008.6.1.991 CID 4106 Quantitative Methods used for Perfusion And Tracer Kinetic Models 1.2.840.10008.6.1.992 CID 4107 Tracer Kinetic Model Parameters 1.2.840.10008.6.1.993 CID 4108 Perfusion Model Parameters 1.2.840.10008.6.1.994 CID 4109 Model-Independent Dynamic Contrast Analysis Parameters 1.2.840.10008.6.1.995 CID 4110 Tracer Kinetic Modeling Covariates 1.2.840.10008.6.1.996 CID 4111 Contrast Characteristics 1.2.840.10008.6.1.997 CID 7021 Measurement Report Document Titles 1.2.840.10008.6.1.998 CID 100 Quantitative Diagnostic Imaging Procedures 1.2.840.10008.6.1.999 CID 7466 PET Region of Interest Measurements 1.2.840.10008.6.1.1000 CID 7467 Grey Level Co-occurrence Matrix Measurements 1.2.840.10008.6.1.1001 CID 7468 Texture Measurements 1.2.840.10008.6.1.1002 CID 6146 Time Point Types 1.2.840.10008.6.1.1003 CID 7469 Generic Intensity and Size Measurements 1.2.840.10008.6.1.1004 CID 6147 Response Criteria 1.2.840.10008.6.1.1005 CID 12020 Fetal Biometry Anatomic Sites 1.2.840.10008.6.1.1006 CID 12021 Fetal Long Bone Anatomic Sites 1.2.840.10008.6.1.1007 CID 12022 Fetal Cranium Anatomic Sites 1.2.840.10008.6.1.1008 CID 12023 Pelvis and Uterus Anatomic Sites 1.2.840.10008.6.1.1009 CID 7222 Parametric Map Derivation Image Purpose of Reference 1.2.840.10008.6.1.1010 CID 9000 Physical Quantity Descriptors 1.2.840.10008.6.1.1011 CID 7600 Lymph Node Anatomic Sites 1.2.840.10008.6.1.1012 CID 7601 Head and Neck Cancer Anatomic Sites 1.2.840.10008.6.1.1013 CID 7701 Fiber Tracts In Brainstem 1.2.840.10008.6.1.1014 CID 7702 Projection and Thalamic Fibers 1.2.840.10008.6.1.1015 CID 7703 Association Fibers 1.2.840.10008.6.1.1016 CID 7704 Limbic System Tracts 1.2.840.10008.6.1.1017 CID 7705 Commissural Fibers 1.2.840.10008.6.1.1018 CID 7706 Cranial Nerves 1.2.840.10008.6.1.1019 CID 7707 Spinal Cord Fibers 1.2.840.10008.6.1.1020 CID 7710 Tractography Anatomic Sites 1.2.840.10008.6.1.1021 CID 4025 Primary Anatomic Structure for Intra-oral Radiography 1.2.840.10008.6.1.1022 CID 4026 Primary Anatomic Structure for Intra-oral and Craniofacial Radiography 1.2.840.10008.6.1.1023 CID 9401 IEC61217 Device Position Parameters 1.2.840.10008.6.1.1024 CID 9402 IEC61217 Gantry Position Parameters 1.2.840.10008.6.1.1025 CID 9403 IEC61217 Patient Support Position Parameters 1.2.840.10008.6.1.1026 CID 7035 Actionable Finding Classification 1.2.840.10008.6.1.1027 CID 7036 Image Quality Assessment 1.2.840.10008.6.1.1028 CID 10050 Summary Radiation Exposure Quantities 1.2.840.10008.6.1.1029 CID 4245 Wide Field Ophthalmic Photography Transformation Method 1.2.840.10008.6.1.1030 CID 84 PET Units 1.2.840.10008.6.1.1031 CID 7300 Implant Materials 1.2.840.10008.6.1.1032 CID 7301 Intervention Types 1.2.840.10008.6.1.1033 CID 7302 Implant Templates View Orientations 1.2.840.10008.6.1.1034 CID 7303 Implant Templates Modified View Orientations 1.2.840.10008.6.1.1035 CID 7304 Implant Target Anatomy 1.2.840.10008.6.1.1036 CID 7305 Implant Planning Landmarks 1.2.840.10008.6.1.1037 CID 7306 Human Hip Implant Planning Landmarks 1.2.840.10008.6.1.1038 CID 7307 Implant Component Types 1.2.840.10008.6.1.1039 CID 7308 Human Hip Implant Component Types 1.2.840.10008.6.1.1040 CID 7309 Human Trauma Implant Component Types 1.2.840.10008.6.1.1041 CID 7310 Implant Fixation Method 1.2.840.10008.6.1.1042 CID 7445 Device Participating Roles 1.2.840.10008.6.1.1043 CID 8101 Container Types 1.2.840.10008.6.1.1044 CID 8102 Container Component Types 1.2.840.10008.6.1.1045 CID 8103 Anatomic Pathology Specimen Types 1.2.840.10008.6.1.1046 CID 8104 Breast Tissue Specimen Types 1.2.840.10008.6.1.1047 CID 8109 Specimen Collection Procedure 1.2.840.10008.6.1.1048 CID 8110 Specimen Sampling Procedure 1.2.840.10008.6.1.1049 CID 8111 Specimen Preparation Procedure 1.2.840.10008.6.1.1050 CID 8112 Specimen Stains 1.2.840.10008.6.1.1051 CID 8113 Specimen Preparation Steps 1.2.840.10008.6.1.1052 CID 8114 Specimen Fixatives 1.2.840.10008.6.1.1053 CID 8115 Specimen Embedding Media 1.2.840.10008.6.1.1054 CID 10020 Source of Projection X-Ray Dose Information 1.2.840.10008.6.1.1055 CID 10021 Source of CT Dose Information 1.2.840.10008.6.1.1056 CID 10025 Radiation Dose Reference Points 1.2.840.10008.6.1.1057 CID 501 Volumetric View Description 1.2.840.10008.6.1.1058 CID 502 Volumetric View Modifier 1.2.840.10008.6.1.1059 CID 7260 Diffusion Acquisition Value Types 1.2.840.10008.6.1.1060 CID 7261 Diffusion Model Value Types 1.2.840.10008.6.1.1061 CID 7262 Diffusion Tractography Algorithm Families 1.2.840.10008.6.1.1062 CID 7263 Diffusion Tractography Measurement Types 1.2.840.10008.6.1.1063 CID 7490 Research Animal Source Registries 1.2.840.10008.6.1.1064 CID 231 Yes-No Only 1.2.840.10008.6.1.1065 CID 601 Biosafety Levels 1.2.840.10008.6.1.1066 CID 602 Biosafety Control Reasons 1.2.840.10008.6.1.1067 CID 7457 Sex - Male Female or Both 1.2.840.10008.6.1.1068 CID 603 Animal Room Types 1.2.840.10008.6.1.1069 CID 604 Device Reuse 1.2.840.10008.6.1.1070 CID 605 Animal Bedding Material 1.2.840.10008.6.1.1071 CID 606 Animal Shelter Types 1.2.840.10008.6.1.1072 CID 607 Animal Feed Types 1.2.840.10008.6.1.1073 CID 608 Animal Feed Sources 1.2.840.10008.6.1.1074 CID 609 Animal Feeding Methods 1.2.840.10008.6.1.1075 CID 610 Water Types 1.2.840.10008.6.1.1076 CID 611 Anesthesia Category Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1077 CID 612 Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1078 CID 613 Anesthesia Induction Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1079 CID 614 Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1080 CID 615 Anesthesia Maintenance Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1081 CID 616 Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1082 CID 617 Airway Management Method Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1083 CID 618 Airway Management Method Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1084 CID 619 Airway Management Sub-Method Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1085 CID 620 Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1086 CID 621 Medication Type Code Type for Small Animal Anesthesia 1.2.840.10008.6.1.1087 CID 622 Medication Type Code Type from Anesthesia Quality Initiative (AQI) 1.2.840.10008.6.1.1088 CID 623 Medication for Small Animal Anesthesia 1.2.840.10008.6.1.1089 CID 624 Inhalational Anesthesia Agents for Small Animal Anesthesia 1.2.840.10008.6.1.1090 CID 625 Injectable Anesthesia Agents for Small Animal Anesthesia 1.2.840.10008.6.1.1091 CID 626 Premedication Agents for Small Animal Anesthesia 1.2.840.10008.6.1.1092 CID 627 Neuromuscular Blocking Agents for Small Animal Anesthesia 1.2.840.10008.6.1.1093 CID 628 Ancillary Medications for Small Animal Anesthesia 1.2.840.10008.6.1.1094 CID 629 Carrier Gases for Small Animal Anesthesia 1.2.840.10008.6.1.1095 CID 630 Local Anesthetics for Small Animal Anesthesia 1.2.840.10008.6.1.1096 CID 631 Phase of Procedure Requiring Anesthesia 1.2.840.10008.6.1.1097 CID 632 Phase of Surgical Procedure Requiring Anesthesia 1.2.840.10008.6.1.1098 CID 633 Phase of Imaging Procedure Requiring Anesthesia 1.2.840.10008.6.1.1099 CID 634 Phase of Animal Handling 1.2.840.10008.6.1.1100 CID 635 Heating Method 1.2.840.10008.6.1.1101 CID 636 Temperature Sensor Device Component Type for Small Animal Procedures 1.2.840.10008.6.1.1102 CID 637 Exogenous Substance Types 1.2.840.10008.6.1.1103 CID 638 Exogenous Substance 1.2.840.10008.6.1.1104 CID 639 Tumor Graft Histologic Type 1.2.840.10008.6.1.1105 CID 640 Fibrils 1.2.840.10008.6.1.1106 CID 641 Viruses 1.2.840.10008.6.1.1107 CID 642 Cytokines 1.2.840.10008.6.1.1108 CID 643 Toxins 1.2.840.10008.6.1.1109 CID 644 Exogenous Substance Administration Sites 1.2.840.10008.6.1.1110 CID 645 Exogenous Substance Tissue of Origin 1.2.840.10008.6.1.1111 CID 646 Preclinical Small Animal Imaging Procedures 1.2.840.10008.6.1.1112 CID 647 Position Reference Indicator for Frame of Reference 1.2.840.10008.6.1.1113 CID 241 Present-Absent Only 1.2.840.10008.6.1.1114 CID 10024 Water Equivalent Diameter Method 1.2.840.10008.6.1.1115 CID 7022 Radiotherapy Purposes of Reference 1.2.840.10008.6.1.1116 CID 701 Content Assessment Types 1.2.840.10008.6.1.1117 CID 702 RT Content Assessment Types 1.2.840.10008.6.1.1118 CID 703 Basis of Assessment 1.2.840.10008.6.1.1119 CID 7449 Reader Specialty 1.2.840.10008.6.1.1120 CID 9233 Requested Report Types 1.2.840.10008.6.1.1121 CID 1000 CT Transverse Plane Reference Basis 1.2.840.10008.6.1.1122 CID 1001 Anatomical Reference Basis 1.2.840.10008.6.1.1123 CID 1002 Anatomical Reference Basis - Head 1.2.840.10008.6.1.1124 CID 1003 Anatomical Reference Basis - Spine 1.2.840.10008.6.1.1125 CID 1004 Anatomical Reference Basis - Chest 1.2.840.10008.6.1.1126 CID 1005 Anatomical Reference Basis - Abdomen/Pelvis 1.2.840.10008.6.1.1127 CID 1006 Anatomical Reference Basis - Extremities 1.2.840.10008.6.1.1128 CID 1010 Reference Geometry - Planes 1.2.840.10008.6.1.1129 CID 1011 Reference Geometry - Points 1.2.840.10008.6.1.1130 CID 1015 Patient Alignment Methods 1.2.840.10008.6.1.1131 CID 1200 Contraindications For CT Imaging 1.2.840.10008.6.1.1132 CID 7110 Fiducials Categories 1.2.840.10008.6.1.1133 CID 7111 Fiducials 1.2.840.10008.6.1.1134 CID 7013 Source Instance Purposes of Reference 1.2.840.10008.6.1.1135 CID 7023 RT Process Output 1.2.840.10008.6.1.1136 CID 7024 RT Process Input 1.2.840.10008.6.1.1137 CID 7025 RT Process Input Used 1.2.840.10008.6.1.1138 CID 6300 Prostate Sector Anatomy 1.2.840.10008.6.1.1139 CID 6301 Prostate Sector Anatomy from PI-RADS v2 1.2.840.10008.6.1.1140 CID 6302 Prostate Sector Anatomy from European Concensus 16 Sector (Minimal) Model 1.2.840.10008.6.1.1141 CID 6303 Prostate Sector Anatomy from European Concensus 27 Sector (Optimal) Model 1.2.840.10008.6.1.1142 CID 12301 Measurement Selection Reasons 1.2.840.10008.6.1.1143 CID 12302 Echo Finding Observation Types 1.2.840.10008.6.1.1144 CID 12303 Echo Measurement Types 1.2.840.10008.6.1.1145 CID 12304 Echo Measured Properties 1.2.840.10008.6.1.1146 CID 12305 Basic Echo Anatomic Sites 1.2.840.10008.6.1.1147 CID 12306 Echo Flow Directions 1.2.840.10008.6.1.1148 CID 12307 Cardiac Phases and Time Points 1.2.840.10008.6.1.1149 CID 12300 Core Echo Measurements 1.2.840.10008.6.1.1150 CID 4270 OCT-A Processing Algorithm Families 1.2.840.10008.6.1.1151 CID 4271 En Face Image Types 1.2.840.10008.6.1.1152 CID 4272 Opt Scan Pattern Types 1.2.840.10008.6.1.1153 CID 4273 Retinal Segmentation Surfaces 1.2.840.10008.6.1.1154 CID 10060 Organs for Radiation Dose Estimates 1.2.840.10008.6.1.1155 CID 10061 Absorbed Radiation Dose Types 1.2.840.10008.6.1.1156 CID 10062 Equivalent Radiation Dose Types 1.2.840.10008.6.1.1157 CID 10063 Radiation Dose Estimate Distribution Representation 1.2.840.10008.6.1.1158 CID 10064 Patient Model Type 1.2.840.10008.6.1.1159 CID 10065 Radiation Transport Model Type 1.2.840.10008.6.1.1160 CID 10066 Attenuator Category 1.2.840.10008.6.1.1161 CID 10067 Radiation Attenuator Materials 1.2.840.10008.6.1.1162 CID 10068 Estimate Method Types 1.2.840.10008.6.1.1163 CID 10069 Radiation Dose Estimation Parameter 1.2.840.10008.6.1.1164 CID 10070 Radiation Dose Types 1.2.840.10008.6.1.1165 CID 7270 MR Diffusion Component Semantics 1.2.840.10008.6.1.1166 CID 7271 MR Diffusion Anisotropy Indices 1.2.840.10008.6.1.1167 CID 7272 MR Diffusion Model Parameters 1.2.840.10008.6.1.1168 CID 7273 MR Diffusion Models 1.2.840.10008.6.1.1169 CID 7274 MR Diffusion Model Fitting Methods 1.2.840.10008.6.1.1170 CID 7275 MR Diffusion Model Specific Methods 1.2.840.10008.6.1.1171 CID 7276 MR Diffusion Model Inputs 1.2.840.10008.6.1.1172 CID 7277 Units of Diffusion Rate Area Over Time 1.2.840.10008.6.1.1173 CID 7039 Pediatric Size Categories 1.2.840.10008.6.1.1174 CID 7041 Calcium Scoring Patient Size Categories 1.2.840.10008.6.1.1175 CID 10034 Reason for Repeating Acquisition 1.2.840.10008.6.1.1176 CID 800 Protocol Assertion Codes 1.2.840.10008.6.1.1177 CID 7026 Radiotherapeutic Dose Measurement Devices 1.2.840.10008.6.1.1178 CID 7014 Export Additional Information Document Titles 1.2.840.10008.6.1.1179 CID 7015 Export Delay Reasons 1.2.840.10008.6.1.1180 CID 7016 Level of Difficulty 1.2.840.10008.6.1.1181 CID 7017 Category of Teaching Material - Imaging 1.2.840.10008.6.1.1182 CID 7018 Miscellaneous Document Titles 1.2.840.10008.6.1.1183 CID 7019 Segmentation Non-Image Source Purposes of Reference 1.2.840.10008.6.1.1184 CID 280 Longitudinal Temporal Event Types 1.2.840.10008.6.1.1185 CID 6401 Non-lesion Object Type - Physical Objects 1.2.840.10008.6.1.1186 CID 6402 Non-lesion Object Type - Substances 1.2.840.10008.6.1.1187 CID 6403 Non-lesion Object Type - Tissues 1.2.840.10008.6.1.1188 CID 6404 Chest Non-lesion Object Type - Physical Objects 1.2.840.10008.6.1.1189 CID 6405 Chest Non-lesion Object Type - Tissues 1.2.840.10008.6.1.1190 CID 7191 Tissue Segmentation Property Types 1.2.840.10008.6.1.1191 CID 7192 Anatomical Structure Segmentation Property Types 1.2.840.10008.6.1.1192 CID 7193 Physical Object Segmentation Property Types 1.2.840.10008.6.1.1193 CID 7194 Morphologically Abnormal Structure Segmentation Property Types 1.2.840.10008.6.1.1194 CID 7195 Function Segmentation Property Types 1.2.840.10008.6.1.1195 CID 7196 Spatial and Relational Concept Segmentation Property Types 1.2.840.10008.6.1.1196 CID 7197 Body Substance Segmentation Property Types 1.2.840.10008.6.1.1197 CID 7198 Substance Segmentation Property Types 1.2.840.10008.6.1.1198 CID 9303 Interpretation Request Discontinuation Reasons 1.2.840.10008.6.1.1199 CID 7475 Gray Level Run Length Based Features 1.2.840.10008.6.1.1200 CID 7476 Gray Level Size Zone Based Features 1.2.840.10008.6.1.1201 CID 7060 Encapsulated Document Source Purposes of Reference 1.2.840.10008.6.1.1202 CID 7061 Model Document Titles 1.2.840.10008.6.1.1203 CID 7062 Purpose of Reference to Predecessor 3D Model 1.2.840.10008.6.1.1204 CID 7063 Model Scale Units 1.2.840.10008.6.1.1205 CID 7064 Model Usage 1.2.840.10008.6.1.1206 CID 10071 Radiation Dose Units 1.2.840.10008.6.1.1207 CID 7112 Radiotherapy Fiducials 1.2.840.10008.6.1.1208 CID 300 Multi-energy Relevant Materials 1.2.840.10008.6.1.1209 CID 301 Multi-energy Material Units 1.2.840.10008.6.1.1210 CID 9500 Dosimetric Objective Types 1.2.840.10008.6.1.1211 CID 9501 Prescription Anatomy Categories 1.2.840.10008.6.1.1212 CID 9502 RT Segment Annotation Categories 1.2.840.10008.6.1.1213 CID 9503 Radiotherapy Therapeutic Role Categories 1.2.840.10008.6.1.1214 CID 9504 RT Geometric Information 1.2.840.10008.6.1.1215 CID 9505 Fixation or Positioning Devices 1.2.840.10008.6.1.1216 CID 9506 Brachytherapy Devices 1.2.840.10008.6.1.1217 CID 9507 External Body Models 1.2.840.10008.6.1.1218 CID 9508 Non-specific Volumes 1.2.840.10008.6.1.1219 CID 9509 Purpose of Reference For RT Physician Intent Input 1.2.840.10008.6.1.1220 CID 9510 Purpose of Reference For RT Treatment Planning Input 1.2.840.10008.6.1.1221 CID 9511 General External Radiotherapy Procedure Techniques 1.2.840.10008.6.1.1222 CID 9512 Tomotherapeutic Radiotherapy Procedure Techniques 1.2.840.10008.6.1.1223 CID 9513 Fixation Devices 1.2.840.10008.6.1.1224 CID 9514 Anatomical Structures For Radiotherapy 1.2.840.10008.6.1.1225 CID 9515 RT Patient Support Devices 1.2.840.10008.6.1.1226 CID 9516 Radiotherapy Bolus Device Types 1.2.840.10008.6.1.1227 CID 9517 Radiotherapy Block Device Types 1.2.840.10008.6.1.1228 CID 9518 Radiotherapy Accessory No-slot Holder Device Types 1.2.840.10008.6.1.1229 CID 9519 Radiotherapy Accessory Slot Holder Device Types 1.2.840.10008.6.1.1230 CID 9520 Segmented RT Accessory Devices 1.2.840.10008.6.1.1231 CID 9521 Radiotherapy Treatment Energy Unit 1.2.840.10008.6.1.1232 CID 9522 Multi-source Radiotherapy Procedure Techniques 1.2.840.10008.6.1.1233 CID 9523 Robotic Radiotherapy Procedure Techniques 1.2.840.10008.6.1.1234 CID 9524 Radiotherapy Procedure Techniques 1.2.840.10008.6.1.1235 CID 9525 Radiation Therapy Particle 1.2.840.10008.6.1.1236 CID 9526 Ion Therapy Particle 1.2.840.10008.6.1.1237 CID 9527 Teletherapy Isotope 1.2.840.10008.6.1.1238 CID 9528 Brachytherapy Isotope 1.2.840.10008.6.1.1239 CID 9529 Single Dose Dosimetric Objectives 1.2.840.10008.6.1.1240 CID 9530 Percentage and Dose Dosimetric Objectives 1.2.840.10008.6.1.1241 CID 9531 Volume and Dose Dosimetric Objectives 1.2.840.10008.6.1.1242 CID 9532 No-Parameter Dosimetric Objectives 1.2.840.10008.6.1.1243 CID 9533 Delivery Time Structure 1.2.840.10008.6.1.1244 CID 9534 Radiotherapy Targets 1.2.840.10008.6.1.1245 CID 9535 Radiotherapy Dose Calculation Roles 1.2.840.10008.6.1.1246 CID 9536 Radiotherapy Prescribing and Segmenting Person Roles 1.2.840.10008.6.1.1247 CID 9537 Effective Dose Calculation Method Categories 1.2.840.10008.6.1.1248 CID 9538 Radiation Transport-based Effective Dose Method Modifiers 1.2.840.10008.6.1.1249 CID 9539 Fractionation-based Effective Dose Method Modifiers 1.2.840.10008.6.1.1250 CID 60 Imaging Agent Administration Adverse Events 1.2.840.10008.6.1.1251 CID 61 Time Relative to Procedure 1.2.840.10008.6.1.1252 CID 62 Imaging Agent Administration Phase Type 1.2.840.10008.6.1.1253 CID 63 Imaging Agent Administration Mode 1.2.840.10008.6.1.1254 CID 64 Imaging Agent Administration Patient State 1.2.840.10008.6.1.1255 CID 65 Pre-medication For Imaging Agent Administration 1.2.840.10008.6.1.1256 CID 66 Medication For Imaging Agent Administration 1.2.840.10008.6.1.1257 CID 67 Imaging Agent Administration Completion Status 1.2.840.10008.6.1.1258 CID 68 Imaging Agent Administration Pharmaceutical Unit of Presentation 1.2.840.10008.6.1.1259 CID 69 Imaging Agent Administration Consumables 1.2.840.10008.6.1.1260 CID 70 Flush 1.2.840.10008.6.1.1261 CID 71 Imaging Agent Administration Injector Event Type 1.2.840.10008.6.1.1262 CID 72 Imaging Agent Administration Step Type 1.2.840.10008.6.1.1263 CID 73 Bolus Shaping Curves 1.2.840.10008.6.1.1264 CID 74 Imaging Agent Administration Consumable Catheter Type 1.2.840.10008.6.1.1265 CID 75 Low-high-equal 1.2.840.10008.6.1.1266 CID 76 Type of Pre-medication 1.2.840.10008.6.1.1267 CID 245 Laterality with Median 1.2.840.10008.6.1.1268 CID 4029 Dermatology Anatomic Sites 1.2.840.10008.6.1.1269 CID 218 Quantitative Image Features 1.2.840.10008.6.1.1270 CID 7477 Global Shape Descriptors 1.2.840.10008.6.1.1271 CID 7478 Intensity Histogram Features 1.2.840.10008.6.1.1272 CID 7479 Grey Level Distance Zone Based Features 1.2.840.10008.6.1.1273 CID 7500 Neighbourhood Grey Tone Difference Based Features 1.2.840.10008.6.1.1274 CID 7501 Neighbouring Grey Level Dependence Based Features 1.2.840.10008.6.1.1275 CID 4242 Cornea Measurement Method Descriptors 1.2.840.10008.6.1.1276 CID 7027 Segmented Radiotherapeutic Dose Measurement Devices 1.2.840.10008.6.1.1277 CID 6098 Clinical Course of Disease 1.2.840.10008.6.1.1278 CID 6099 Racial Group 1.2.840.10008.6.1.1279 CID 246 Relative Laterality 1.2.840.10008.6.1.1280 CID 7168 Brain Lesion Segmentation Types With Necrosis 1.2.840.10008.6.1.1281 CID 7169 Brain Lesion Segmentation Types Without Necrosis 1.2.840.10008.6.1.1282 CID 32 Non-Acquisition Modality 1.2.840.10008.6.1.1283 CID 33 Modality 1.2.840.10008.6.1.1284 CID 247 Laterality Left-Right Only 1.2.840.10008.6.1.1285 CID 210 Qualitative Evaluation Modifier Types 1.2.840.10008.6.1.1286 CID 211 Qualitative Evaluation Modifier Values 1.2.840.10008.6.1.1287 CID 212 Generic Anatomic Location Modifiers 1.2.840.10008.6.1.1288 CID 9541 Beam Limiting Device Types 1.2.840.10008.6.1.1289 CID 9542 Compensator Device Types 1.2.840.10008.6.1.1290 CID 9543 Radiotherapy Treatment Machine Modes 1.2.840.10008.6.1.1291 CID 9544 Radiotherapy Distance Reference Locations 1.2.840.10008.6.1.1292 CID 9545 Fixed Beam Limiting Device Types 1.2.840.10008.6.1.1293 CID 9546 Radiotherapy Wedge Types 1.2.840.10008.6.1.1294 CID 9547 RT Beam Limiting Device Orientation Labels 1.2.840.10008.6.1.1295 CID 9548 General Accessory Device Types 1.2.840.10008.6.1.1296 CID 9549 Radiation Generation Mode Types 1.2.840.10008.6.1.1297 CID 9550 C-Arm Photon-Electron Delivery Rate Units 1.2.840.10008.6.1.1298 CID 9551 Treatment Delivery Device Types 1.2.840.10008.6.1.1299 CID 9552 C-Arm Photon-Electron Dosimeter Units 1.2.840.10008.6.1.1300 CID 9553 Treatment Points 1.2.840.10008.6.1.1301 CID 9554 Equipment Reference Points 1.2.840.10008.6.1.1302 CID 9555 Radiotherapy Treatment Planning Person Roles 1.2.840.10008.6.1.1303 CID 7070 Real Time Video Rendition Titles 1.2.840.10008.6.1.1304 CID 219 Geometry Graphical Representation 1.2.840.10008.6.1.1305 CID 217 Visual Explanation vtk-dicom-0.8.12/Utilities/parsedic.py000066400000000000000000000012601356440565500176320ustar00rootroot00000000000000""" Parse a DCMTK dict file and produce a flat file. """ import sys import string import re r = re.compile(r'\(([^,]*),"([^"]*)",([^,]*)\)[ \t]*(..)[ \t]*([^ \t]*)[ \t]*(.*)') s = r'(\1,00\3)\n\5\n\5\n\4\n\6\n\2\n' for filename in sys.argv[1:]: f = open(filename) for line in f.readlines(): l = line.strip() if line[0] == '(': g = re.sub(r,r'\1',l) e = re.sub(r,r'\3',l) if len(g) > 4: g0 = int(g[0:4],16) g1 = int(g[7:11],16) tail = re.sub(r,s[3:],l) for g in range(g0,g1+1,2): sys.stdout.write("(%04.4x" % (g,) + tail) elif len(e) > 4: continue else: sys.stdout.write(re.sub(r,s,l)) vtk-dicom-0.8.12/Utilities/parsetpl.py000066400000000000000000000027301356440565500176750ustar00rootroot00000000000000""" Parse one of Dave Clunie's tpl files and generate a flat file. """ import sys import string blocks = {} def parseline(line): if line[0] != '(': return entries = {} tag = line[0:11] i = 12 while 1: try: while line[i] in string.whitespace: i = i + 1 except IndexError: break j = i try: while line[j] != '=': j = j + 1 except IndexError: break key = line[i:j] if line[j+1] != '\"': break i = j + 2 j = i while line[j] != '\"': j = j + 1 val = line[i:j] i = j + 1 entries[key] = val.strip() try: entries['Name'] entries['Keyword'] entries['VR'] entries['VM'] entries['Owner'] except KeyError: sys.stderr.write("Missing key: %s\n" % (line,)) return try: block = blocks[entries['Owner']] except KeyError: block = {} blocks[entries['Owner']] = block block[tag] = entries #g = int(tag[1:5], 16) #e = int(tag[6:10], 16) #tag = "(%04x,%04x)" % (g,e) for filename in sys.argv[1:]: f = open(filename) for line in f.readlines(): parseline(line) #print len(blocks) for owner, block in blocks.items(): lines = [] tags = block.keys() tags.sort() for tag in tags: entries = block[tag] lines.append(tag) lines.append(entries['Name']) lines.append(entries['Keyword']) lines.append(entries['VR']) lines.append(entries['VM']) lines.append(owner) for line in lines: print line vtk-dicom-0.8.12/Utilities/parseuid.py000066400000000000000000000120771356440565500176640ustar00rootroot00000000000000""" Generate a C++ table for use as a UID dictionary. """ import sys if len(sys.argv) != 2: sys.stderr.write( """usage: python parseuid.py nemauids.txt > vtkDICOMUtilitiesUIDTable.cxx""") sys.exit(1) f = open(sys.argv[1], 'r') lines = f.readlines() f.close() root = [0, 0, 0, 0, "", ""] part = "" l = 0 maxlevel = 0 while l < len(lines): text = lines[l] if text[0] == '#': l += 1 continue uid = lines[l].strip() name = lines[l+1].strip() utype = lines[l+2].strip() if l+3 < len(lines): cite = lines[l+3].strip() else: cite = "1.2.840.10008." if uid[0:14] != "1.2.840.10008.": print "oops at line", l l += 1 continue if cite[0:14] != "1.2.840.10008." and cite[0] != '#': l += 4 elif uid[0:18] == "1.2.840.10008.6.1.": cite = name name = utype utype = "Context Group" l += 3 else: cite = utype utype = "Frame of Reference" l += 3 uid = uid[14:] ret = " (Retired)" if len(name) > 10 and name[-10:] == ret: name = name[0:-10] else: ret = "" k = name.find(": Default") if k > 0: name = name[0:k] parts = map(int, uid.split('.')) node = root for level in range(len(parts)): idx = parts[level] if node[0] == 0: node[1] = 1 node[2] = idx node[0] = [ [0, 0, 0, 0, "", ""] ] if node[2] > idx: for i in range(idx, node[2]): node[0].insert(0, [0, 0, 0, 0, "", ""]) node[1] += node[2] - idx node[2] = idx if node[2] + node[1] - 1 < idx: for i in range(node[2] + node[1] - 1, idx): node[0].append([0, 0, 0, 0, "", ""]) node[1] += idx - (node[2] + node[1] - 1) node = node[0][idx - node[2]] if level == len(parts)-1: if cite[0:4] == "CID ": node[3] = int(cite[4:]) else: node[3] = 0 node[4] = " // 1.2.840.10008." + uid + ret node[5] = name if level > maxlevel: maxlevel = level print "/*=========================================================================" print "This is an automatically generated file. Include errata for any changes." print "=========================================================================*/" print "\n#include \"vtkDICOMUtilitiesUIDTable.h\"" print "\nnamespace {\n" print "struct UIDTableEntry" print "{" print " unsigned short Next;" print " unsigned short Size;" print " unsigned short First;" print " unsigned short CID;" print " const char *Name;" print "};" def printnode(node): if node[0]: child = node[0][0][6] if node[3] or node[5]: print "{ %d, %d, %d, %d,%s\n \"%s\" }," % tuple([child]+node[1:6]) else: print "{ %d, %d, %d, 0, 0 }," % tuple([child]+node[1:3]) else: if node[3] or node[5]: print "{ 0, %d, %d, %d,%s\n \"%s\" }," % tuple(node[1:6]) else: print "{ 0, %d, %d, 0, 0 }," % tuple(node[1:3]) def recursetrie(node, counter): if node[0]: for child in node[0]: if counter: counter[0] += 1 child.append(counter[0]) else: printnode(child) for child in node[0]: recursetrie(child, counter) print "\nconst UIDTableEntry UIDTable[] = {" recursetrie(root, [0]) printnode(root) recursetrie(root, None) print "};" getterfunc = \ """ const UIDTableEntry *GetUIDTableEntry(const char *uid) { if (uid == 0) { return 0; } const char *prefix = "1.2.840.10008."; while (*prefix != '\\0' && *uid != '\\0' && *prefix == *uid) { prefix++; uid++; } if (*prefix != '\\0') { return 0; } const UIDTableEntry *table = UIDTable; while (*uid != '\\0') { int i = -1; if (*uid >= '0' && *uid <= '9') { if (uid[0] != '0' || uid[1] != '0') { i = 0; do { i *= 10; i += (*uid - '0'); uid++; } while (*uid >= '0' && *uid <= '9' && i < 214748364); } } if (*uid == '.') { uid++; if (*uid == '\\0') { table = 0; break; } } else if (*uid != '\\0') { table = 0; break; } i -= table->First; if (i < 0 || i >= static_cast(table->Size)) { table = 0; break; } table = &UIDTable[table->Next + i]; } return table; } """ print getterfunc print "} // anonymous namespace" exportedcode = \ """ const char *vtkDICOMUtilities::GetUIDName(const char *uid) { const char *result = ""; const UIDTableEntry *table = GetUIDTableEntry(uid); if (table) { if (table->Name) { result = table->Name; } } return result; } unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid) { unsigned short result = 0; const UIDTableEntry *table = GetUIDTableEntry(uid); if (table) { result = table->CID; } return result; }""" print exportedcode vtk-dicom-0.8.12/module.cmake000066400000000000000000000010511356440565500160000ustar00rootroot00000000000000set(DOCUMENTATION "This package contains a set of classes for managing DICOM files and metadata from within VTK, and some utility programs for interrogating and converting DICOM files." ) vtk_module(vtkDICOM DESCRIPTION "${DOCUMENTATION}" DEPENDS vtkCommonCore vtkCommonDataModel vtkCommonExecutionModel vtkIOImage PRIVATE_DEPENDS vtkCommonMisc vtkImagingCore vtkIOCore vtkzlib COMPILE_DEPENDS vtkImagingStatistics vtkInteractionStyle vtkRenderingImage vtkRendering${VTK_RENDERING_BACKEND} ) vtk-dicom-0.8.12/vtk.module000066400000000000000000000004111356440565500155230ustar00rootroot00000000000000NAME VTK::DICOM LIBRARY_NAME vtkDICOM GROUPS StandAlone DEPENDS VTK::CommonCore VTK::CommonDataModel VTK::CommonExecutionModel VTK::IOImage PRIVATE_DEPENDS VTK::CommonMisc VTK::ImagingCore VTK::IOCore VTK::zlib TEST_DEPENDS VTK::TestingCore