pydicom / pynetdicom

A Python implementation of the DICOM networking protocol
https://pydicom.github.io/pynetdicom
MIT License
512 stars 180 forks source link

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128) #560

Closed mijuny closed 3 years ago

mijuny commented 3 years ago

Hi!

I'm getting the error above when running a simple pynetdicom storage SCP.

I'm a bit new to python so it is sure to be a simple thing. Have been googling around for a while now without luck. Any help would really welcome!

from pynetdicom import (
     AE, debug_logger, evt, AllStoragePresentationContexts,
     ALL_TRANSFER_SYNTAXES
 )

debug_logger()

def handle_store(event):
     """Handle EVT_C_STORE events."""
     ds = event.dataset(encoding="utf-8")

     return 0x0000

handlers = [(evt.EVT_C_STORE, handle_store)]

ae = AE(ae_title=b'TEST')

storage_sop_classes = [
     cx.abstract_syntax for cx in AllStoragePresentationContexts
 ]
for uid in storage_sop_classes:
     ae.add_supported_context(uid, ALL_TRANSFER_SYNTAXES)

ae.start_server(('', 11112), block=False, evt_handlers=handlers)

And the error:

E: Unable to decode the received PDU data
E: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128)
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/dul.py", line 301, in _read_pdu_data
    pdu, event = self._decode_pdu(bytestream)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/dul.py", line 133, in _decode_pdu
    pdu.decode(bytestream)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu.py", line 83, in decode
    self, attr_name, func(bytestream[sl], *args)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu.py", line 283, in _wrap_generate_items
    item.decode(item_bytes)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 93, in decode
    setattr(self, attr_name, func(bytestream[sl], *args))
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 307, in _wrap_generate_items
    item.decode(item_bytes)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 93, in decode
    setattr(self, attr_name, func(bytestream[sl], *args))
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 1386, in abstract_syntax_name
    value = UID(value.decode('ascii'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128)
D: Abort Parameters:
D: =========================== OUTGOING A-ABORT PDU ===========================
D: Abort Source: DUL service-user
D: Abort Reason: No reason given
D: ============================= END A-ABORT PDU ==============================
mijuny commented 3 years ago

And the Dockerfile for the container where this is run:

FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y update
RUN apt-get install -y locales apt-utils

# Set the locale
RUN locale-gen fi_FI.UTF-8  
ENV LANG fi_FI.UTF-8  
ENV LANGUAGE fi_FI:en
ENV LC_MESSAGES C  
ENV LC_ALL fi_FI.UTF-8

RUN apt-get install -y build-essential python3.6 python3-pip python3-dev locales console-common

# python3 packages
RUN pip3 -q install pip --upgrade
RUN pip3 install jupyter pynetdicom pydicom

EXPOSE 8888 11112 

CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root"]
scaramallion commented 3 years ago

Why have you done ds = event.dataset(encoding="utf-8")? It should be just event.dataset.

Anyway, it seems like whatever you're associating with is using non-conformant UIDs (they're supposed to be encoded as ASCII). Could you bind the following to EVT_DATA_RECV and post the output?

from pydicom.utils import pretty_bytes

def debug_data(event):
    data = event.data
    LOGGER.debug(f"{' DEBUG - ENCODED PDU ':=^76}")
    slist = pretty_bytes(
        data, prefix=' ', delimiter=' ', max_size=None, items_per_line=25
    )
    for s in slist:
        LOGGER.debug(s)

    LOGGER.debug(f"{' END ENCODED PDU ':=^76}")

handlers = [(evt.EVT_C_STORE, handle_store), (evt.EVT_DATA_RECV, debug_data)]
mijuny commented 3 years ago

Thank You for your help!

Fixed that event-dataset, it was a part of my uninformed debugging.

The code I run now is this:

import logging

from pynetdicom import AE, evt, AllStoragePresentationContexts, debug_logger

from pynetdicom.utils import pretty_bytes

debug_logger()

# Implement a handler for evt.EVT_C_STORE
def handle_store(event):
    """Handle a C-STORE request event."""
    # Decode the C-STORE request's *Data Set* parameter to a pydicom Dataset
    ds = event.dataset

    # Add the File Meta Information
    ds.file_meta = event.file_meta

    # Save the dataset using the SOP Instance UID as the filename
    ds.save_as(ds.SOPInstanceUID, write_like_original=False)

    # Return a 'Success' status
    return 0x0000

def debug_data(event):
    data = event.data
    LOGGER = logging.getLogger('pynetdicom')
    LOGGER.debug(f"{' DEBUG - ENCODED PDU ':=^76}")
    slist = pretty_bytes(
        data, prefix=' ', delimiter=' ', max_size=None, items_per_line=25
    )
    for s in slist:
        LOGGER.debug(s)

    LOGGER.debug(f"{' END ENCODED PDU ':=^76}")

handlers = [(evt.EVT_C_STORE, handle_store), (evt.EVT_DATA_RECV, debug_data)]

# Initialise the Application Entity
ae = AE(ae_title=b'TEST')

# Support presentation contexts for all storage SOP Classes
ae.supported_contexts = AllStoragePresentationContexts

# Start listening for incoming association requests
ae.start_server(('', 11112), evt_handlers=handlers)

And it gives me this after I send an MRI image using OsiriX a to it:

D: =========================== DEBUG - ENCODED PDU ============================
D:  01 00 00 00 25 9c 00 01 00 00 54 45 53 54 20 20 20 20 20 20 20 20 20 20 20
D:  20 54 39 34 32 4d 42 50 30 30 31 20 20 20 20 20 20 00 00 00 00 00 00 00 00
D:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
D:  00 00 15 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 33 2e 31 2e 31 2e 31 20
D:  00 00 3c 01 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  35 2e 31 2e 34 2e 31 2e 31 2e 39 2e 31 2e 33 40 00 00 13 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 03 00 ff 00 30 00 00 1d
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 39
D:  2e 31 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00
D:  00 3c 05 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35
D:  2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 31 31 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 07 00 ff 00 30 00 00 1d 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38
D:  2e 31 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e
D:  32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00
D:  3c 09 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 39 2e 34 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 0b 00 ff 00 30 00 00 1d 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 39 2e 34
D:  2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32
D:  40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3b
D:  0d 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31
D:  2e 34 2e 31 2e 31 2e 31 31 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 2e 31 20 00 00 50 0f 00 ff 00 30 00 00 1c 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 31 2e 34 40
D:  00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00
D:  11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3d 11 00 ff
D:  00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e
D:  31 2e 31 2e 31 33 2e 31 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 2e 31 20 00 00 52 13 00 ff 00 30 00 00 1e 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 33 2e 31 2e 33
D:  40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00
D:  00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c 15 00
D:  ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 39 2e 33 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 2e 31 20 00 00 51 17 00 ff 00 30 00 00 1d 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 39 2e 33 2e 31 40
D:  00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00
D:  11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c 19 00 ff
D:  00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e
D:  31 2e 31 2e 38 38 2e 36 35 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 31 20 00 00 51 1b 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 36 35 40 00
D:  00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c 1d 00 ff 00
D:  30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31
D:  2e 31 2e 38 38 2e 36 39 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 31 20 00 00 51 1f 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 36 39 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3b 21 00 ff 00 30
D:  00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 31 31 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 2e 31 20 00 00 50 23 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 31 2e 32 40 00 00 13 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c 25 00 ff 00 30 00 00 1d
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38
D:  38 2e 33 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 31 20 00 00 51 27 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 33 33 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 38 29 00 ff 00 30 00 00 19 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 40
D:  00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00
D:  4d 2b 00 ff 00 30 00 00 19 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 20 00 00 38 2d 00 ff 00 30 00 00 19 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 32 40 00 00 13 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4d 2f 00 ff 00 30 00 00 19
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 32
D:  40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00
D:  00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 31 00
D:  ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 31 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 31 20 00 00 4f 33 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 33 40 00 00 13 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c 35 00 ff 00 30 00 00
D:  1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e
D:  31 2e 33 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 2e 31 20 00 00 51 37 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 33 2e 31 40 00 00 13 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 39 00 ff 00 30 00 00 1b
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31
D:  2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31
D:  20 00 00 4f 3b 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 32 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 20 00 00 3c 3d 00 ff 00 30 00 00 1d 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 32 2e 31 40
D:  00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00
D:  51 3f 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 31 2e 32 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 20 00 00 3a 41 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 31 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f 43 00
D:  ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3c 45 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 47 00 ff 00 30
D:  00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 20 00 00 3c 49 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 30 34 2e 31 40 00 00 13 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 4b 00 ff 00 30 00
D:  00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31
D:  2e 31 30 34 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  20 00 00 51 4d 00 ff 00 30 00 00 32 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e e2 80 8b 35 2e e2 80 8b 31 2e e2 80 8b 34 2e e2 80 8b 31 2e e2 80 8b 31
D:  2e e2 80 8b 31 30 34 2e e2 80 8b 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 2e 31 20 00 00 66 4f 00 ff 00 30 00 00 32 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e e2 80 8b 35 2e e2 80 8b 31 2e e2 80 8b 34
D:  2e e2 80 8b 31 2e e2 80 8b 31 2e e2 80 8b 31 30 34 2e e2 80 8b 33 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 51 00 ff 00 30
D:  00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 32 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 2e 31 20 00 00 4f 53 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 32 2e 31 40 00 00 13 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 55 00 ff 00 30 00 00 1b 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 2e 31
D:  40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00
D:  00 4f 57 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35
D:  2e 31 2e 34 2e 31 2e 31 2e 34 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 20 00 00 3c 59 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 32 32 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 5b
D:  00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 38 38 2e 32 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 20 00 00 3d 5d 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32 2e 31 2e 31 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 52 5f
D:  00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 31 32 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 20 00 00 3d 61 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32 2e 32 2e 31 40 00
D:  00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 52
D:  63 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31
D:  2e 34 2e 31 2e 31 2e 31 32 2e 32 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 20 00 00 3c 65 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 39 2e 31 2e 32 40 00
D:  00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51
D:  67 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31
D:  2e 34 2e 31 2e 31 2e 39 2e 31 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 20 00 00 3b 69 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 31 2e 31 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 50 6b 00
D:  ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 31 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 20 00 00 3c 6d 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 35 39 40 00 00 13 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 6f 00 ff 00
D:  30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31
D:  2e 31 2e 38 38 2e 35 39 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3c 71 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 35 30 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 73 00 ff 00 30
D:  00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 38 38 2e 35 30 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 20 00 00 38 75 00 ff 00 30 00 00 19 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4d 77 00 ff 00 30 00 00 19 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 40 00
D:  00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 79 00 ff 00
D:  30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31
D:  2e 31 2e 34 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 2e 31 20 00 00 4f 7b 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 2e 32 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3a 7d 00 ff 00 30 00 00 1b 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 2e
D:  32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20
D:  00 00 4f 7f 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  35 2e 31 2e 34 2e 31 2e 31 2e 37 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 20 00 00 3a 81 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 2e 33 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f 83 00
D:  ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 37 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3a 85 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 2e 31 40 00 00 13 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f 87 00 ff 00 30 00 00
D:  1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e
D:  37 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e
D:  32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00
D:  3a 89 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 37 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 2e 31 20 00 00 4f 8b 00 ff 00 30 00 00 1b 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 2e 34 40 00
D:  00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 39 8d 00 ff 00
D:  30 00 00 1a 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31
D:  2e 31 2e 32 30 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 2e 31 20 00 00 4e 8f 00 ff 00 30 00 00 1a 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 32 30 40 00 00 13 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3f 91 00 ff 00 30 00 00 20 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31
D:  2e 35 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 31 20 00 00 54 93 00 ff 00 30 00 00 20 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 35 2e 32 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3f 95 00 ff 00 30 00
D:  00 20 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31
D:  2e 37 37 2e 31 2e 35 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 31 20 00 00 54 97 00 ff 00 30 00 00 20 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 35 2e
D:  31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40
D:  00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3f 99
D:  00 ff 00 30 00 00 20 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 37 37 2e 31 2e 35 2e 34 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 54 9b 00 ff 00 30 00 00 20 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37
D:  2e 31 2e 35 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  20 00 00 3a 9d 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32 38 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f 9f 00 ff 00 30 00 00 1b 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32
D:  38 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40
D:  00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c a1
D:  00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 38 38 2e 34 30 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 2e 31 20 00 00 51 a3 00 ff 00 30 00 00 1d 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 34 30
D:  40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00
D:  00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3b a5 00
D:  ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 31 31 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 31 20 00 00 50 a7 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 31 2e 33 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 39 a9 00 ff 00 30
D:  00 00 1a 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 36 36 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 31 20 00 00 4e ab 00 ff 00 30 00 00 1a 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 36 36 40 00 00 13 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 20 00 00 39 ad 00 ff 00 30 00 00 1a 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 36 37 40 00 00
D:  13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4e af
D:  00 ff 00 30 00 00 1a 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 36 37 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3c b1 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 34 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 b3 00 ff 00 30
D:  00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 34 38 31 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 20 00 00 3c b5 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 36 40 00 00 13 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 b7 00 ff 00 30 00
D:  00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31
D:  2e 34 38 31 2e 36 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  20 00 00 3c b9 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 32 40 00 00 13 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 bb 00 ff 00 30 00 00
D:  1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e
D:  34 38 31 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20
D:  00 00 3c bd 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 31 40 00 00 13 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 bf 00 ff 00 30 00 00 1d
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34
D:  38 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00
D:  00 3c c1 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35
D:  2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 c3 00 ff 00 30 00 00 1d 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38
D:  31 2e 35 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e
D:  32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00
D:  3c c5 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 34 38 31 2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 c7 00 ff 00 30 00 00 1d 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31
D:  2e 33 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32
D:  40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3c
D:  c9 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31
D:  2e 34 2e 31 2e 31 2e 34 38 31 2e 37 40 00 00 13 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 cb 00 ff 00 30 00 00 1d 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e
D:  37 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40
D:  00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 38 cd
D:  00 ff 00 30 00 00 19 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e
D:  34 2e 31 2e 31 2e 37 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 2e 31 20 00 00 4d cf 00 ff 00 30 00 00 19 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 40 00 00 13 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00 3b d1 00 ff 00 30 00 00 1c 31 2e
D:  32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 36 36 2e
D:  31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20
D:  00 00 50 d3 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  35 2e 31 2e 34 2e 31 2e 31 2e 36 36 2e 31 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 31 2e 32 20 00 00 3c d5 00 ff 00 30 00 00 1d 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 39 2e 31 2e 31 40
D:  00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00
D:  51 d7 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 39 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 20 00 00 3a d9 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34
D:  30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 36 2e 31 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f db 00
D:  ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 36 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3a dd 00 ff 00 30 00 00 1b 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 33 2e 31 40 00 00 13 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 4f df 00 ff 00 30 00 00
D:  1b 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e
D:  33 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e
D:  32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00 00
D:  3d e1 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e
D:  31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30
D:  2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 52 e3 00 ff 00 30 00 00 1e 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37
D:  2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00
D:  00 3f e5 00 ff 00 30 00 00 20 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35
D:  2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32 2e
D:  38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 54 e7 00 ff 00 30 00
D:  00 20 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31
D:  2e 37 37 2e 31 2e 31 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 20 00 00 3d e9 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 32 40 00 00 13 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 52 eb 00 ff
D:  00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e
D:  31 2e 31 2e 37 37 2e 31 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 20 00 00 3d ed 00 ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31
D:  30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 37 37 2e 31 2e 34 40 00 00 13
D:  31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 52 ef 00
D:  ff 00 30 00 00 1e 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34
D:  2e 31 2e 31 2e 37 37 2e 31 2e 34 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30
D:  30 30 38 2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 31 2e 32 20 00 00 3b f1 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e
D:  31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32 2e 31 40 00 00 13 31
D:  2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 50 f3 00 ff
D:  00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e
D:  31 2e 31 2e 31 32 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 20 00 00 3c f5 00 ff 00 30 00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30
D:  30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 38 38 2e 36 37 40 00 00 13 31 2e 32
D:  2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 51 f7 00 ff 00 30
D:  00 00 1d 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e
D:  31 2e 38 38 2e 36 37 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e
D:  31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e
D:  32 20 00 00 3b f9 00 ff 00 30 00 00 1c 31 2e 32 2e 38 34 30 2e 31 30 30 30
D:  38 2e 35 2e 31 2e 34 2e 31 2e 31 2e 31 32 2e 32 40 00 00 13 31 2e 32 2e 38
D:  34 30 2e 31 30 30 30 38 2e 31 2e 32 2e 31 20 00 00 50 fb 00 ff 00 30 00 00
D:  1c 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 31 2e 31 2e
D:  31 32 2e 32 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 20 00
D:  00 32 fd 00 ff 00 30 00 00 13 31 2e 33 2e 31 32 2e 32 2e 31 31 30 37 2e 35
D:  2e 39 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32
D:  2e 31 20 00 00 47 ff 00 ff 00 30 00 00 13 31 2e 33 2e 31 32 2e 32 2e 31 31
D:  30 37 2e 35 2e 39 2e 31 40 00 00 13 31 2e 32 2e 38 34 30 2e 31 30 30 30 38
D:  2e 31 2e 32 2e 32 40 00 00 11 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 31
D:  2e 32 50 00 00 35 51 00 00 04 00 00 40 00 52 00 00 1b 31 2e 32 2e 32 37 36
D:  2e 30 2e 37 32 33 30 30 31 30 2e 33 2e 30 2e 33 2e 36 2e 31 55 00 00 0a 4f
D:  53 49 52 49 58 5f 33 36 31
D: ============================= END ENCODED PDU ==============================
E: Unable to decode the received PDU data
E: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128)
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/dul.py", line 301, in _read_pdu_data
    pdu, event = self._decode_pdu(bytestream)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/dul.py", line 133, in _decode_pdu
    pdu.decode(bytestream)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu.py", line 83, in decode
    self, attr_name, func(bytestream[sl], *args)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu.py", line 283, in _wrap_generate_items
    item.decode(item_bytes)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 93, in decode
    setattr(self, attr_name, func(bytestream[sl], *args))
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 307, in _wrap_generate_items
    item.decode(item_bytes)
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 93, in decode
    setattr(self, attr_name, func(bytestream[sl], *args))
  File "/usr/local/lib/python3.8/dist-packages/pynetdicom/pdu_items.py", line 1386, in abstract_syntax_name
    value = UID(value.decode('ascii'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128)
D: Abort Parameters:
D: =========================== OUTGOING A-ABORT PDU ===========================
D: Abort Source: DUL service-user
D: Abort Reason: No reason given
D: ============================= END A-ABORT PDU ==============================
scaramallion commented 3 years ago

Yeah, there are two presentation contexts containing UIDs that aren't encoded in ASCII:

>>> raw = (
... b"\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30\x30\x30\x38"
... b"\x2e\xe2\x80\x8b\x35\x2e\xe2\x80\x8b\x31\x2e\xe2\x80\x8b\x34\x2e\xe2\x80\x8b\x31\x2e\xe2\x80\x8b\x31"
... b"\x2e\xe2\x80\x8b\x31\x30\x34\x2e\xe2\x80\x8b\x33"
... )
>>> raw.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 14: ordinal not in range(128)
>>> raw.decode('utf-8')
'1.2.840.10008.​5.​1.​4.​1.​1.​104.​3'

0xe2 isn't part of the ASCII character set.

mijuny commented 3 years ago

Ok, good to know! This is odd, it is just normal clinical dicom images. Any hints how I should fix this?

scaramallion commented 3 years ago

The two non-conformant presentation contexts both have an invalid '1.2.840.10008.​5.​1.​4.​1.​1.​104.​3', which should be Encapsulated STL Storage. I'd take a look in the configuration for Osirix and make sure the entry there is in ASCII rather than UTF-8 (they'll look identical, but if you copy the UID in ASCII and use it to overwrite the value maybe it'll fix it?). Alternatively you could just remove Encapsulated STL Storage from the config, provided you don't need it.

It'd be nice to let Osirix know about the issue, but from a brief googling it looks like you need to pay for the privilege :roll_eyes:

I'm trying to decide if I should add UTF-8 decoding as a fallback... in the meantime I think you can do the following as a workaround (should be done before importing anything else):


from pydicom.uid import UID
from pynetdicom.pdu_items import AbstractSyntaxSubItem
from pynetdicom.utils import validate_uid

def my_setter(self, value):
    if isinstance(value, UID):
        pass
    elif isinstance(value, str):
        value = UID(value)
    elif isinstance(value, bytes):
        try:
            value = UID(value.decode('ascii'))
        except UnicodeDecodeError:
            value = UID(value.decode('utf-8'))
    elif value is None:
        pass
    else:
        raise TypeError(
            'Abstract Syntax Name must be a pydicom.uid.UID, str or bytes'
        )

    if value is not None and not validate_uid(value):
        LOGGER.error("Abstract Syntax Name is an invalid UID")
        raise ValueError("Abstract Syntax Name is an invalid UID")

    self._abstract_syntax_name = value

AbstractSyntaxSubItem.abstract_syntax_name = AbstractSyntaxSubItem.abstract_syntax_name.setter(my_setter)

from pynetdicom import pdu
pdu.AbstractSyntaxSubItem = AbstractSyntaxSubItem

from pynetdicom import AE

# ... etc
JoKuebler commented 2 years ago

@mijuny I know this has been closed for a while now but I recently encountered the same issue with Osirix and it seems like there is still no fix/way around. This solution here works fine but would require me to change the pynetdicom code. So I was wondering if you ever found another solution maybe within Osirix?

mijuny commented 1 year ago

Hi!

I'm not aware if any other solution. For me, this simple and crude node is working with OsiriX:

import logging

from pydicom.uid import UID
from pynetdicom import AE, evt, AllStoragePresentationContexts, debug_logger, pdu
from pynetdicom.pdu_items import AbstractSyntaxSubItem
from pynetdicom.utils import validate_uid

def my_setter(self, value):
    if isinstance(value, UID):
        pass
    elif isinstance(value, str):
        value = UID(value)
    elif isinstance(value, bytes):
        try:
            value = UID(value.decode('ascii'))
        except UnicodeDecodeError:
            value = UID(value.decode('utf-8'))
    elif value is None:
        pass
    else:
        raise TypeError(
            'Abstract Syntax Name must be a pydicom.uid.UID, str or bytes'
        )

    if value is not None and not validate_uid(value):
        LOGGER.error("Abstract Syntax Name is an invalid UID")
        raise ValueError("Abstract Syntax Name is an invalid UID")

    self._abstract_syntax_name = value

AbstractSyntaxSubItem.abstract_syntax_name = AbstractSyntaxSubItem.abstract_syntax_name.setter(my_setter)

pdu.AbstractSyntaxSubItem = AbstractSyntaxSubItem

debug_logger()

# Implement a handler for evt.EVT_C_STORE
def handle_store(event):
    """Handle a C-STORE request event."""
    # Decode the C-STORE request's *Data Set* parameter to a pydicom Dataset
    ds = event.dataset

    # Add the File Meta Information
    ds.file_meta = event.file_meta

    # Save the dataset using the SOP Instance UID as the filename
    ds.save_as(ds.SOPInstanceUID, write_like_original=False)

    # Return a 'Success' status
    return 0x0000

handlers = [(evt.EVT_C_STORE, handle_store)]

# Initialise the Application Entity
ae = AE(ae_title=b'TEST')

# Support presentation contexts for all storage SOP Classes
ae.supported_contexts = AllStoragePresentationContexts

# Start listening for incoming association requests
ae.start_server(('', 11112), evt_handlers=handlers)

Running this in this conda env in macOS:

# Name                    Version                   Build  Channel
bzip2                     1.0.8                h620ffc9_4  
ca-certificates           2022.12.7            h4653dfc_0    conda-forge
certifi                   2022.12.7          pyhd8ed1ab_0    conda-forge
libffi                    3.4.2                hca03da5_6  
ncurses                   6.3                  h1a28f6b_3  
openssl                   1.1.1s               h03a7124_1    conda-forge
pip                       22.3.1          py310hca03da5_0  
pydicom                   2.3.1              pyh1a96a4e_0    conda-forge
pynetdicom                2.0.2              pyhd8ed1ab_0    conda-forge
python                    3.10.8               hc0d8a6c_1  
readline                  8.2                  h1a28f6b_0  
setuptools                65.5.0          py310hca03da5_0  
sqlite                    3.40.0               h7a7dc30_0  
tk                        8.6.12               hb8d0fd4_0  
tzdata                    2022g                h04d1e81_0  
wheel                     0.37.1             pyhd3eb1b0_0  
xz                        5.2.8                h80987f9_0  
zlib                      1.2.13               h5a0b063_0 
scaramallion commented 1 year ago

For anyone else, the easier way to workaround this issue is by setting the _config.CODECS variable to include UTF-8.

Or pester Osirix for a fix.