code: def riseset(self, crd, ev="5deg"):
          
  
          a = self.rise(crd, ev)
          if isinstance(a['rise'], str):
              return {"rise": {"last": a[0], "utc": a[0]},
                      "set": {"last": a[1], "utc": a[1]},
                      "solved": False}
          ofe = self.measure(self._framestack["epoch"], "utc")
          if not is_measure(ofe):
              ofe = self.epoch('utc', 'today')
          x = a.copy()
          for k in x:
              x[k] = self.measure(
                  self.epoch("last",
                             a[k].totime(),
                             off=self.epoch("r_utc",
                                            (dq.quantity(ofe["m0"])
                                             + dq.quantity("0.5d")
                                             ))
                             ),
                  "utc")
          return {"rise": {"last": self.epoch("last",
                                              a["rise"].totime()),
                           "utc": x["rise"]},
  
                  "set": {"last": self.epoch("last",
                                             a["set"].totime()),
                          "utc": x["set"]},
                  "solved": True
                  }
docs: This will give the rise/set times of a source. It needs the
          position in the frame, and a time. If the latter is not set, the
          current time will be used.
  
          :param crd: a direction measure
          :param ev: the elevation limit as a quantity or string
          :returns: The returned value is a `dict` with a
                    'solved' key, which is `False` if the source is always
                    below or above the horizon. In that case the rise and set
                    fields will all have a string value. The `dict` also returns
                    a rise and set `dict`, with  'last'  and 'utc' keys showing
                    the rise and set times as epochs.