#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define int long long
#define pb push_back
const int MAXN = 115;
const int oo = 1e18;
struct Node {
int i;
int j;
int s;
int D;
};
struct trace {
int i;
int j;
int s;
};
struct cmp {
bool operator() (const Node &a, const Node &b) const {
return a.D > b.D;
}
};
int d[MAXN][MAXN][7];
char A[MAXN][MAXN];
trace pre[MAXN][MAXN][7];
int premove[MAXN][MAXN][7];
bool vis[MAXN][MAXN][7], dg[MAXN][MAXN];
int N, M, X, Y, Z, T;
vector<int> di[7], dj[7], ns[7];
inline bool inside(int Ni, int Nj, int Ns) {
if (Ni < 1 || Nj < 1 || Ni > N || Nj > M) return false;
if (Ns == 0) return true;
if (Ns == 1) return (Ni + 2 <= N);
if (Ns == 2) return (Nj - 2 >= 1);
if (Ns == 3) return (Ni - 2 >= 1);
if (Ns == 4) return (Nj + 2 <= M);
return false;
}
void djk() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
for (int s = 0; s <= 4; s++) {
d[i][j][s] = oo;
vis[i][j][s] = false;
premove[i][j][s] = -1;
pre[i][j][s] = {0,0,0};
}
}
}
d[X][Y][0] = 0;
priority_queue<Node, vector<Node>, cmp> q;
q.push({X, Y, 0, 0});
while (!q.empty()) {
Node top = q.top();
q.pop();
int i = top.i;
int j = top.j;
int s = top.s;
if (vis[i][j][s]) continue;
vis[i][j][s] = true;
for (int k = 0; k < 4; k++) {
int Ni = i + di[s][k];
int Nj = j + dj[s][k];
int Ns = ns[s][k];
if (!inside(Ni, Nj, Ns) || vis[Ni][Nj][Ns]) continue;
bool blocked = false;
if (Ns == 0) {
if (dg[Ni][Nj]) blocked = true;
} else if (Ns == 1) {
if (dg[Ni][Nj] || dg[Ni + 1][Nj] || dg[Ni + 2][Nj]) blocked = true;
} else if (Ns == 2) {
if (dg[Ni][Nj] || dg[Ni][Nj - 1] || dg[Ni][Nj - 2]) blocked = true;
} else if (Ns == 3) {
if (dg[Ni][Nj] || dg[Ni - 1][Nj] || dg[Ni - 2][Nj]) blocked = true;
} else if (Ns == 4) {
if (dg[Ni][Nj] || dg[Ni][Nj + 1] || dg[Ni][Nj + 2]) blocked = true;
}
if (blocked) continue;
if (d[Ni][Nj][Ns] > d[i][j][s] + 1) {
d[Ni][Nj][Ns] = d[i][j][s] + 1;
pre[Ni][Nj][Ns] = {i, j, s};
int outmove = -1;
if (s == 0) {
if (Ns == 3) outmove = 1;
else if (Ns == 1) outmove = 3;
else if (Ns == 4) outmove = 2;
else if (Ns == 2) outmove = 0;
} else {
if (k == 0) outmove = 3;
else if (k == 1) outmove = 0;
else if (k == 2) outmove = 1;
else if (k == 3) outmove = 2;
}
premove[Ni][Nj][Ns] = outmove;
q.push({Ni, Nj, Ns, (int)d[Ni][Nj][Ns]});
}
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> M >> X >> Y >> Z >> T;
X++; Y++; Z++; T++;
memset(dg, 0, sizeof(dg));
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> A[i][j];
if (A[i][j] == '1') dg[i][j] = true;
}
}
di[0] = {3, -3, 0, 0};
dj[0] = {0, 0, -3, 3};
ns[0] = {3, 1, 4, 2};
di[1] = {-1, 0, 3, 0};
dj[1] = {0, 1, 0, -1};
ns[1] = {0, 1, 0, 1};
di[2] = {-1, 0, 1, 0};
dj[2] = {0, 1, 0, -3};
ns[2] = {2, 0, 2, 0};
di[3] = {-3, 0, 1, 0};
dj[3] = {0, 1, 0, -1};
ns[3] = {0, 3, 0, 3};
di[4] = {-1, 0, 1, 0};
dj[4] = {0, 3, 0, -1};
ns[4] = {4, 0, 4, 0};
djk();
if (!vis[Z][T][0]) {
cout << -1 << '\n';
return 0;
}
cout << d[Z][T][0] << '\n';
vector<int> res;
trace a = {Z, T, 0};
while (!(a.i == X && a.j == Y && a.s == 0)) {
int mv = premove[a.i][a.j][a.s];
if (mv == -1) break;
res.pb(mv);
trace tmp = pre[a.i][a.j][a.s];
a = tmp;
}
reverse(res.begin(), res.end());
for (size_t idx = 0; idx < res.size(); ++idx) {
if (idx) cout << ' ';
cout << res[idx];
}
if (!res.empty()) cout << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJ1bnJvbGwtbG9vcHMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgzKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiaW5saW5lIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZ2NzZSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmdjc2UtbG0iKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZpcGEtc3JhIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS1wcmUiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZ0cmVlLXZycCIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnBlZXBob2xlMiIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmZhc3QtbWF0aCIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnNjaGVkLXNwZWMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZhbGlnbi1qdW1wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmFsaWduLWxvb3BzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mYWxpZ24tbGFiZWxzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZGV2aXJ0dWFsaXplIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY2FsbGVyLXNhdmVzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY3Jvc3NqdW1waW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdGhyZWFkLWp1bXBzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mcmVvcmRlci1ibG9ja3MiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZzY2hlZHVsZS1pbnNucyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUtZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS10YWlsLW1lcmdlIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mc2NoZWR1bGUtaW5zbnMyIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mc3RyaWN0LWFsaWFzaW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mYWxpZ24tZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY3NlLWZvbGxvdy1qdW1wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnNjaGVkLWludGVyYmxvY2siKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZwYXJ0aWFsLWlubGluaW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIm5vLXN0YWNrLXByb3RlY3RvciIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnJlb3JkZXItZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1maW5kaXJlY3QtaW5saW5pbmciKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZob2lzdC1hZGphY2VudC1sb2FkcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnJlcnVuLWNzZS1hZnRlci1sb29wIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoImlubGluZS1zbWFsbC1mdW5jdGlvbnMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZpbmxpbmUtc21hbGwtZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS1zd2l0Y2gtY29udmVyc2lvbiIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZm9wdGltaXplLXNpYmxpbmctY2FsbHMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MiKQojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBwYiBwdXNoX2JhY2sKCmNvbnN0IGludCBNQVhOID0gMTE1Owpjb25zdCBpbnQgb28gICA9IDFlMTg7CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IHM7CiAgICBpbnQgRDsKfTsKCnN0cnVjdCB0cmFjZSB7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IHM7Cn07CgpzdHJ1Y3QgY21wIHsKICAgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgTm9kZSAmYSwgY29uc3QgTm9kZSAmYikgY29uc3QgewogICAgICAgIHJldHVybiBhLkQgPiBiLkQ7CiAgICB9Cn07CgppbnQgZFtNQVhOXVtNQVhOXVs3XTsKY2hhciBBW01BWE5dW01BWE5dOwp0cmFjZSBwcmVbTUFYTl1bTUFYTl1bN107CmludCBwcmVtb3ZlW01BWE5dW01BWE5dWzddOwpib29sIHZpc1tNQVhOXVtNQVhOXVs3XSwgZGdbTUFYTl1bTUFYTl07CmludCBOLCBNLCBYLCBZLCBaLCBUOwp2ZWN0b3I8aW50PiBkaVs3XSwgZGpbN10sIG5zWzddOwoKaW5saW5lIGJvb2wgaW5zaWRlKGludCBOaSwgaW50IE5qLCBpbnQgTnMpIHsKICAgIGlmIChOaSA8IDEgfHwgTmogPCAxIHx8IE5pID4gTiB8fCBOaiA+IE0pIHJldHVybiBmYWxzZTsKICAgIGlmIChOcyA9PSAwKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChOcyA9PSAxKSByZXR1cm4gKE5pICsgMiA8PSBOKTsKICAgIGlmIChOcyA9PSAyKSByZXR1cm4gKE5qIC0gMiA+PSAxKTsKICAgIGlmIChOcyA9PSAzKSByZXR1cm4gKE5pIC0gMiA+PSAxKTsKICAgIGlmIChOcyA9PSA0KSByZXR1cm4gKE5qICsgMiA8PSBNKTsKICAgIHJldHVybiBmYWxzZTsKfQoKdm9pZCBkamsoKSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBNOyBqKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPD0gNDsgcysrKSB7CiAgICAgICAgICAgICAgICBkW2ldW2pdW3NdID0gb287CiAgICAgICAgICAgICAgICB2aXNbaV1bal1bc10gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHByZW1vdmVbaV1bal1bc10gPSAtMTsKICAgICAgICAgICAgICAgIHByZVtpXVtqXVtzXSA9IHswLDAsMH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBkW1hdW1ldWzBdID0gMDsKICAgIHByaW9yaXR5X3F1ZXVlPE5vZGUsIHZlY3RvcjxOb2RlPiwgY21wPiBxOwogICAgcS5wdXNoKHtYLCBZLCAwLCAwfSk7CiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIE5vZGUgdG9wID0gcS50b3AoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGludCBpID0gdG9wLmk7CiAgICAgICAgaW50IGogPSB0b3AuajsKICAgICAgICBpbnQgcyA9IHRvcC5zOwogICAgICAgIGlmICh2aXNbaV1bal1bc10pIGNvbnRpbnVlOwogICAgICAgIHZpc1tpXVtqXVtzXSA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKICAgICAgICAgICAgaW50IE5pID0gaSArIGRpW3NdW2tdOwogICAgICAgICAgICBpbnQgTmogPSBqICsgZGpbc11ba107CiAgICAgICAgICAgIGludCBOcyA9IG5zW3NdW2tdOwogICAgICAgICAgICBpZiAoIWluc2lkZShOaSwgTmosIE5zKSB8fCB2aXNbTmldW05qXVtOc10pIGNvbnRpbnVlOwogICAgICAgICAgICBib29sIGJsb2NrZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKE5zID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChkZ1tOaV1bTmpdKSBibG9ja2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChOcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoZGdbTmldW05qXSB8fCBkZ1tOaSArIDFdW05qXSB8fCBkZ1tOaSArIDJdW05qXSkgYmxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoTnMgPT0gMikgewogICAgICAgICAgICAgICAgaWYgKGRnW05pXVtOal0gfHwgZGdbTmldW05qIC0gMV0gfHwgZGdbTmldW05qIC0gMl0pIGJsb2NrZWQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKE5zID09IDMpIHsKICAgICAgICAgICAgICAgIGlmIChkZ1tOaV1bTmpdIHx8IGRnW05pIC0gMV1bTmpdIHx8IGRnW05pIC0gMl1bTmpdKSBibG9ja2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChOcyA9PSA0KSB7CiAgICAgICAgICAgICAgICBpZiAoZGdbTmldW05qXSB8fCBkZ1tOaV1bTmogKyAxXSB8fCBkZ1tOaV1bTmogKyAyXSkgYmxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJsb2NrZWQpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoZFtOaV1bTmpdW05zXSA+IGRbaV1bal1bc10gKyAxKSB7CiAgICAgICAgICAgICAgICBkW05pXVtOal1bTnNdID0gZFtpXVtqXVtzXSArIDE7CiAgICAgICAgICAgICAgICBwcmVbTmldW05qXVtOc10gPSB7aSwgaiwgc307CiAgICAgICAgICAgICAgICBpbnQgb3V0bW92ZSA9IC0xOwogICAgICAgICAgICAgICAgaWYgKHMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChOcyA9PSAzKSBvdXRtb3ZlID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChOcyA9PSAxKSBvdXRtb3ZlID0gMzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChOcyA9PSA0KSBvdXRtb3ZlID0gMjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChOcyA9PSAyKSBvdXRtb3ZlID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gMCkgb3V0bW92ZSA9IDM7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoayA9PSAxKSBvdXRtb3ZlID0gMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrID09IDIpIG91dG1vdmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gMykgb3V0bW92ZSA9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmVtb3ZlW05pXVtOal1bTnNdID0gb3V0bW92ZTsKICAgICAgICAgICAgICAgIHEucHVzaCh7TmksIE5qLCBOcywgKGludClkW05pXVtOal1bTnNdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIGNpbiA+PiBOID4+IE0gPj4gWCA+PiBZID4+IFogPj4gVDsKICAgIFgrKzsgWSsrOyBaKys7IFQrKzsKICAgIG1lbXNldChkZywgMCwgc2l6ZW9mKGRnKSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBNOyBqKyspIHsKICAgICAgICAgICAgY2luID4+IEFbaV1bal07CiAgICAgICAgICAgIGlmIChBW2ldW2pdID09ICcxJykgZGdbaV1bal0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBkaVswXSA9IHszLCAtMywgMCwgMH07CiAgICBkalswXSA9IHswLCAwLCAtMywgM307CiAgICBuc1swXSA9IHszLCAxLCA0LCAyfTsKCiAgICBkaVsxXSA9IHstMSwgMCwgMywgMH07CiAgICBkalsxXSA9IHswLCAxLCAwLCAtMX07CiAgICBuc1sxXSA9IHswLCAxLCAwLCAxfTsKCiAgICBkaVsyXSA9IHstMSwgMCwgMSwgMH07CiAgICBkalsyXSA9IHswLCAxLCAwLCAtM307CiAgICBuc1syXSA9IHsyLCAwLCAyLCAwfTsKCiAgICBkaVszXSA9IHstMywgMCwgMSwgMH07CiAgICBkalszXSA9IHswLCAxLCAwLCAtMX07CiAgICBuc1szXSA9IHswLCAzLCAwLCAzfTsKCiAgICBkaVs0XSA9IHstMSwgMCwgMSwgMH07CiAgICBkals0XSA9IHswLCAzLCAwLCAtMX07CiAgICBuc1s0XSA9IHs0LCAwLCA0LCAwfTsKCiAgICBkamsoKTsKICAgIGlmICghdmlzW1pdW1RdWzBdKSB7CiAgICAgICAgY291dCA8PCAtMSA8PCAnXG4nOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgY291dCA8PCBkW1pdW1RdWzBdIDw8ICdcbic7CgogICAgdmVjdG9yPGludD4gcmVzOwogICAgdHJhY2UgYSA9IHtaLCBULCAwfTsKICAgIHdoaWxlICghKGEuaSA9PSBYICYmIGEuaiA9PSBZICYmIGEucyA9PSAwKSkgewogICAgICAgIGludCBtdiA9IHByZW1vdmVbYS5pXVthLmpdW2Euc107CiAgICAgICAgaWYgKG12ID09IC0xKSBicmVhazsKICAgICAgICByZXMucGIobXYpOwogICAgICAgIHRyYWNlIHRtcCA9IHByZVthLmldW2Eual1bYS5zXTsKICAgICAgICBhID0gdG1wOwogICAgfQogICAgcmV2ZXJzZShyZXMuYmVnaW4oKSwgcmVzLmVuZCgpKTsKICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IHJlcy5zaXplKCk7ICsraWR4KSB7CiAgICAgICAgaWYgKGlkeCkgY291dCA8PCAnICc7CiAgICAgICAgY291dCA8PCByZXNbaWR4XTsKICAgIH0KICAgIGlmICghcmVzLmVtcHR5KCkpIGNvdXQgPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9Cgo=