def sendSyncReply(self, src_ipp, cont, uncont):
        ad = Ad().setRawIPPort(src_ipp)
        osm = self.main.osm

        CHECK(osm and osm.syncd)

        # Build Packet
        packet = ['YR']

        # My IP:Port
        packet.append(osm.me.ipp)

        # My last pktnum
        packet.append(struct.pack('!I', osm.me.status_pktnum))

        # If we send a YR which is almost expired, followed closely by
        # an NH with an extended expire time, then a race condition exists,
        # because the target could discard the NH before receiving the YR.

        # So, if we're about to expire, go send a status update NOW so that
        # we'll have a big expire time to give to the target.

        expire = dcall_timeleft(osm.sendStatus_dcall)
        if expire <= 5.0:
            osm.sendMyStatus(sendfull=False)
            expire = dcall_timeleft(osm.sendStatus_dcall)

        # Exact time left before my status expires.
        # (The receiver will add a few buffer seconds.)
        packet.append(struct.pack('!H', int(expire)))

        # Session ID, Uptime, Flags, Nick, Info
        packet.extend(osm.getStatus())

        # If I think I set the topic last, then put it in here.
        # It's up to the receiving end whether they'll believe me.
        if osm.tm.topic_node is osm.me:
            topic = osm.tm.topic
        else:
            topic = ""
        packet.append(struct.pack('!B', len(topic)))
        packet.append(topic)

        # Contacted Nodes
        packet.append(struct.pack('!B', len(cont)))
        packet.extend(cont)

        # Uncontacted Nodes
        packet.append(struct.pack('!B', len(uncont)))
        packet.extend(uncont)

        self.main.ph.sendPacket(''.join(packet), ad.getAddrTuple())