docs: async def _borrow_exported_sender(self, dc_id):
          """
          Borrows a connected `MTProtoSender` for the given `dc_id`.
          If it's not cached, creates a new one if it doesn't exist yet,
          and imports a freshly exported authorization key for it to be usable.
  
          Once its job is over it should be `_return_exported_sender`.
          """
          async with self._borrow_sender_lock:
              n, sender = self._borrowed_senders.get(dc_id, (0, None))
              if not sender:
                  sender = await self._create_exported_sender(dc_id)
                  sender.dc_id = dc_id
              elif not n:
                  dc = await self._get_dc(dc_id)
                  await sender.connect(self._connection(
                      dc.ip_address,
                      dc.port,
                      dc.id,
                      loop=self._loop,
                      loggers=self._log,
                      proxy=self._proxy
                  ))
  
              self._borrowed_senders[dc_id] = (n + 1, sender)
  
          return sender