#include <bits/stdc++.h>
int sign(double x) { return x < -1E-6 ? -1 : x > 1E-6; }
double sqr(double x) { return x * x; }
typedef struct point {
  double x, y;
} point;
double dist(point a, point b) { return hypot(a.x - b.x, a.y - b.y); }
double cross(point a, point b, point c) {
  return (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);
}
double dot(point p, point a, point b) {
  return (a.x - p.x) * (b.x - p.x) + (a.y - p.y) * (b.y - p.y);
}
double delta_angle(point a, point b, point c) {
  return acos(dot(b, a, c) / (dist(a, b) * dist(b, c)));
}
point *__o;
int angle_cmp(point *p, point *q) {
  int c;
  if (c = sign(cross(*__o, *p, *q))) return -c;
  return sign(dist(*p, *__o) - dist(*q, *__o));
}
point stack[100000];
int convex_hull(point *ps, int n) {
  int i, k, top;
  point q;
  k = 0;
  for (i = 1; i < n; i++)
    if (sign(ps[i].y - ps[k].y) < 0 ||
        sign(ps[i].y - ps[k].y) == 0 && ps[i].x < ps[k].x)
      k = i;
  q = ps[k];
  ps[k] = ps[0];
  ps[0] = q;
  __o = &ps[0];
  qsort(ps + 1, n - 1, sizeof(point),
        (int (*)(const void *, const void *))angle_cmp);
  top = 0;
  for (i = 0; i < n; i++) {
    while (top >= 2 && sign(cross(stack[top - 2], stack[top - 1], ps[i])) <= 0)
      top--;
    stack[top++] = ps[i];
  }
  memcpy(ps, stack, sizeof(point) * top);
  return top;
}
double cccr(point A, point B, point C) {
  double a, b, c, cos_B, sin_B, R;
  a = dist(B, C);
  b = dist(A, C);
  c = dist(A, B);
  cos_B = (a * a + c * c - b * b) / (2 * a * c);
  sin_B = sqrt(1.0 - cos_B * cos_B);
  return b / sin_B / 2.0;
}
int too_straight(point A, point B, point C, double r) {
  return sign(dot(B, A, C)) < 0 && sign(cccr(A, B, C) - r) > 0;
}
double area_bow(double r, double l) {
  double tri = l * sqrt(sqr(r) - sqr(l / 2)) / 2;
  double theta = 2 * asin(l / (r + r));
  double sector = theta * r * r / 2;
  return sector - tri;
}
double area_polygon(const point a[], int n) {
  int i, j;
  double area = 0.0;
  for (j = 0, i = n - 1; j < n; i = j++)
    area += a[i].x * a[j].y - a[i].y * a[j].x;
  return fabs(area) / 2;
}
void die() { *(char *)NULL = 0; }
int main() {
  static point ps[100000];
  int n;
  double r;
  double ans, R, Rmin;
  int i, j, k, z, top, s, ch;
  scanf("%d %lf", &n, &r);
  for (i = 0; i < n; i++) scanf("%lf %lf", &ps[i].x, &ps[i].y);
  if (n == 1) {
    puts("0");
  } else if (n == 2) {
    ans = area_bow(r, dist(ps[0], ps[1])) * 2.0;
    printf("%.9lf\n", ans);
  } else {
    n = convex_hull(ps, n);
    top = 0;
    for (i = 0; i < n; i++) {
      while (top >= 2 && too_straight(stack[top - 2], stack[top - 1], ps[i], r))
        top--;
      stack[top++] = ps[i];
    }
    s = 0;
    ch = 1;
    while (ch) {
      ch = 0;
      while (top - s >= 3 &&
             too_straight(stack[top - 2], stack[top - 1], stack[s], r))
        top--, ch = 1;
      while (top - s >= 3 &&
             too_straight(stack[top - 1], stack[s], stack[s + 1], r))
        s++, ch = 1;
    }
    memcpy(stack, stack + s, sizeof(stack[0]) * (top -= s));
    ans = area_polygon(stack, top);
    for (i = 0, j = 1 % top; i < top; i++, j = (j + 1) % top) {
      ans += area_bow(r, dist(stack[i], stack[j]));
    }
    printf("%.9lf\n", ans);
    if (top >= 3)
      for (i = 0, j = 1 % top, k = 2 % top; i < top;
           i++, j = (j + 1) % top, k = (k + 1) % top)
        if (too_straight(stack[i], stack[j], stack[k], r)) die();
  }
  return 0;
}
