#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool cmax(T& x, T y) {
  return y > x ? x = y, true : false;
}
template <typename T>
inline bool cmin(T& x, T y) {
  return y < x ? x = y, true : false;
}
template <typename T>
inline T dmax(T x, T y) {
  return x > y ? x : y;
}
template <typename T>
inline T dmin(T x, T y) {
  return x < y ? x : y;
}
const int MAXN = 2e3 + 5;
char s[MAXN];
int N, K;
vector<int> cnt[MAXN][3];
int main() {
  scanf("%d%d", &N, &K);
  scanf("%s", s);
  for (int i = 0; i <= N - 1; i++) {
    int o = s[i] == '0' ? 0 : 1;
    if (s[i] == '.') o = 2;
    cnt[i % K][o].push_back(i);
  }
  bool vaild = 0;
  for (int i = 0; i <= K - 1; i++) {
    if ((int)cnt[i][2].size() > 1) {
      int x = cnt[i][2][0], y = cnt[i][2][1];
      s[x] = '0';
      s[y] = '1';
      vaild = 1;
      break;
    } else if (((int)cnt[i][0].size() > 0) && ((int)cnt[i][1].size() > 0)) {
      vaild = 1;
      break;
    } else if ((((int)cnt[i][0].size() > 0) || ((int)cnt[i][1].size() > 0)) &&
               (int)cnt[i][2].size() > 0) {
      int x, y = cnt[i][2][0];
      if ((int)cnt[i][0].size() > 0)
        x = cnt[i][0][0];
      else
        x = cnt[i][1][0];
      s[y] = ((s[x] - '0') ^ 1) + '0';
      vaild = 1;
      break;
    }
  }
  if (!vaild) return 0 * puts("No");
  for (int i = 0; i <= N - 1; i++)
    if (s[i] == '.') s[i] = '0';
  printf("%s\n", s);
  return 0;
}
