<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _read_para_locator_set(self, code, cbit, clen, *, desc, length, version):
 """Read HIP LOCATOR_SET parameter. Structure of HIP LOCATOR_SET parameter [RFC 8046]: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Traffic Type | Locator Type | Locator Length | Reserved |P| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Locator Lifetime | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Locator | | | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . . . . +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Traffic Type | Locator Type | Locator Length | Reserved |P| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Locator Lifetime | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Locator | | | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Octets Bits Name Description 0 0 locator_set.type Parameter Type 1 15 locator_set.critical Critical Bit 2 16 locator_set.length Length of Contents 4 32 locator.traffic Traffic Type 5 40 locator.type Locator Type 6 48 locator.length Locator Length 7 56 - Reserved 7 63 locator.preferred Preferred Locator 8 64 locator.lifetime Locator Lifetime 12 96 locator.object Locator """

        def _read_locator(kind, size):
            if kind == 0 and size == 16:
                return ipaddress.ip_address(self._read_fileng(16))
            elif kind == 1 and size == 20:
                return dict(
                    spi=self._read_unpack(4),
                    ip=ipaddress.ip_address(self._read_fileng(16)),
                )
            else:
                raise ProtocolError(f'HIPv{version}: [Parano {code}] invalid format')

        _size = 0           # length of read locators
        _locs = list()      # list of locators

        while _size < clen:
            _traf = self._read_unpack(1)
            _loct = self._read_unpack(1)
            _locl = self._read_unpack(1) * 4
            _resp = self._read_binary(1)
            _life = self._read_unpack(4)
            _lobj = _read_locator(_loct, _locl)

            _locs.append(Info(
                traffic=_traf,
                type=_loct,
                length=_locl,
                preferred=int(_resp[7], base=2),
                lifetime=_life,
                object=_lobj,
            ))

        locator_set = dict(
            type=desc,
            critical=cbit,
            length=clen,
            locator=tuple(_locs),
        )

        return locator_set