// ==UserScript==
// @name shitaraba_option
// @namespace john1851
// @description shitaraba_option
// @include http://c...content-available-to-author-only...a.net/internet/21187/config/data/thread_delete*
// @exclude http://c...content-available-to-author-only...a.net/internet/21187/config/data/thread_delete_confirm
// @exclude http://c...content-available-to-author-only...a.net/internet/21187/config/data/thread_delete_finish
// @grant none
// @version 0.5.0.00
// ==/UserScript==
(function (_, count) {
_('content', function (board, threads) {
console.log('今日は' + count + '回目の起動の日です。おめでとうございます。');
board.click(function (type, isForward) {
board.draw(sort(threads, type, isForward));
});
board.draw(threads);
});
function align(array, name, isForward, action) {
if (isForward)
return array.sort(function (x, y) { return action(x[name], y[name]); });
return array.sort(function (x, y) { return action(y[name], x[name]); });
}
function sort(threads, type, isForward) {
if (['no', 'title', 'response', 'newResponse', 'vigor'].indexOf(type) < 0)
throw new RangeError('not support type: ' + type);
if (type === 'title') {
return align(threads, type, isForward, function (x, y) {
return x < y ? -1 : x > y ? 1 : 0;
});
}
return align(threads, type, isForward, function (x, y) {
return x - y;
});
}
})((function () {
function array(str) {
return new Function('return [' + str + '];')();
}
function project(array, name) {
return array.map(function (x) { return x[name]; });
}
function zip() {
var results = [],
arrays = [].slice.call(arguments, 0),
length = Math.max.apply(null, project(arrays, 'length'));
for (var i = 0; i < length; i++) {
results.push(project(arrays, i));
}
return results;
}
function format(date) {
var m = (date.getMonth() + 1) + '/',
d = date.getDate() + '/',
h = date.getHours() + ':',
min = date.getMinutes();
return m + d + h + min;
}
function interval(date) {
var sec = Math.floor(new Date() / 1000 - date / 1000),
min, hour, day, mon, times, unit, result;
min = Math.floor(sec / 60);
sec = sec % 60;
hour = Math.floor(min / 60);
min = min % 60;
day = Math.floor(hour / 24);
hour = hour % 24;
mon = Math.floor(day / 30);
day = day % 30;
times = [mon, day, hour, min, sec];
unit = ['ヶ月', '日', '時間', '分', '秒'];
result = '';
for (var i = 0; i < times.length; i++) if (times[i] !== 0) {
result += times[i] + unit[i];
if (i != times.length - 1)
result += times[i + 1] + unit[i + 1];
break;
}
return result + '前';
}
function $(tag, option) {
var children = [].slice.call(arguments, 2),
element = document.createElement(tag);
$.option(element, option || {});
children.forEach(function (x) { element.appendChild(x); });
return element;
}
$.attribute = function (element, attributes) {
Object.keys(attributes).filter(function (x) {
return ['klass', 'text'].indexOf(x) < 0;
}).forEach(function (x) {
element.setAttribute(x, attributes[x]);
});
return element;
};
$.option = function (element, option) {
if (option.klass)
element.classList.add(option.klass);
if (option.text)
element.textContent = option.text;
return $.attribute(element, option);
};
$.find = function (id, child) {
if (child)
return document.getElementById(id).getElementsByTagName(child)[0];
return document.getElementById(id);
};
$.clone = function (node, option) {
var element = node.cloneNode(true);
return $.option(element, option || {});
};
$.prepend = function (node, child) {
node.insertBefore(child, node.firstElementChild);
return node;
};
function threads(id) {
var table = $.find(id).getElementsByTagName('table')[0],
tr = table.getElementsByTagName('tr'),
th = tr[0].children;
return [].slice.call(tr, 1).map(function (x) {
return x.children;
}).map(function (x, i) {
var date = new Date(),
response = parseInt(x[3].textContent, 10),
url = x[2].children[1].textContent.split('/').pop();
date.setTime(parseInt(url, 10) * 1000);
return {
check: x[0].children[0].checked,
no: parseInt(x[1].textContent, 10),
title: x[2].children[0].textContent,
url: url,
date: date,
response: response,
vigor: (function () {
var timestamp = new Date() / 1000 - date / 1000,
vigor = response / (timestamp / (60 * 60 * 24));
if (response <= 1)
return 0;
else if (response <= 10)
return vigor * response / 10;
return vigor;
})()
};
});
}
function view() {
return $('tbody', {},
$('tr', {},
$('th', { klass: 'checkbox', text: '削除' }),
$('th', { klass: 'no', 'data-type': 'no', text: 'No.', style: 'cursor: pointer;' }),
$('th', { klass: 'title', 'data-type': 'title', text: 'タイトル', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'response', text: 'レス数', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'newResponse', text: '新レス数', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'vigor', text: '勢い', style: 'cursor: pointer;' }),
$('th', { klass: 'individualDeletion' }),
$('th', { klass: 'infectionDeletion' })
)
);
}
view.row = function (thread, i) {
function checkbox(url) {
return $('td', { klass: 'checkbox' },
$('input', {
type: 'checkbox', name: 'key_' + url
})
);
}
function no(no) {
return $('td', { klass: 'no', text: no });
}
function title(title, url, date, isNew) {
var element = $('td', { klass: 'title' },
$('a', {
target: '_blank', text: title,
href: 'http://j...content-available-to-author-only...a.net/bbs/read.cgi/internet/' + url + '/1405372778/l50'
}),
$('p', {
klass: 'searchURL', text: format(date) + ' '
}, $('b', { text: interval(date) }))
);
if (isNew)
$.prepend(element, $('span', { text: '(New) ', style: 'color: #eb6101;' }));
return element;
}
function response(response) {
return $('td', { klass: 'resNumber', text: response });
}
function newResponse(newResponse, isNew) {
var element = $('td', { klass: 'resNumber' },
$('i', { text: '(' + newResponse + ')' })
);
if (isNew)
$.option(element.firstElementChild, { style: 'color: red;' });
else
$.option(element.firstElementChild, { style: 'color: blue;' });
return element;
}
function vigor(vigor) {
return $('td', { klass: 'resNumber', style: 'overflow: hidden;' },
$('b', {
text: (function () {
if (vigor < 1)
return vigor.toFixed(2);
else if (vigor < 100)
return vigor.toFixed(1);
else if (vigor < 1000)
return vigor.toFixed(0);
return '999+';
})()
})
);
}
function save(url) {
return $('td', { klass: 'individualDeletion' },
$('a', {
text: '倉庫へ送る',
href: './thread_delete_confirm?key=' + url + '&subcommand=save'
})
);
}
function remove(url) {
return $('td', { klass: 'infectionDeletion' },
$('a', {
text: '完全削除',
href: './thread_delete_confirm?key=' + url + '&subcommand=remove'
})
);
}
return $('tr', { klass: i % 2 === 0 ? 'even' : 'odd' },
checkbox(thread.url),
no(thread.no),
title(thread.title, thread.url, thread.date, thread.isNew),
response(thread.response),
newResponse(thread.newResponse, thread.isNew),
vigor(thread.vigor),
save(thread.url),
remove(thread.url)
);
};
function board(id) {
var table = $.find(id, 'table');
table.replaceChild(view(), table.firstElementChild);
return {
draw: function (threads) {
[].slice.call(table.firstElementChild.children, 1).forEach(function (x) {
table.firstElementChild.removeChild(x);
});
threads.forEach(function (x, i) {
table.firstElementChild.appendChild(view.row(x, i));
});
},
click: function (callback) {
[].slice.call(table.firstElementChild.firstElementChild.children, 1, -2).forEach(function (x) {
x.addEventListener('click', function () {
var type = x.dataset['type'],
value = sessionStorage[type],
isForward = typeof value === 'undefined' ? true : value === 'true';
callback(type, isForward);
sessionStorage[type] = !isForward;
}, false);
});
}
};
}
function autoCheck(id) {
var form = $.find(id, 'table').parentNode,
button = $('input', { type: 'button', value: '自動チェック' }),
tip = $('b', { text: '現在の総スレ数: ' + threads(id).length });
button.addEventListener('click', function () {
var elements = document.forms[0].elements,
value = sessionStorage['autoCheck'],
toggle = typeof value === 'undefined' ? true : value === 'true';
if (toggle)
{
zip(threads(id), elements).filter(function (x) {
return typeof x[0] !== 'undefined';
}).sort(function (x, y) {
return x[0].vigor - y[0].vigor;
}).slice(0, 30).forEach(function (x) {
x[1].checked = true;
});
}
else
{
for (var i = 0, length = elements.length; i < length; i++) {
elements[i].checked = false;
}
}
sessionStorage['autoCheck'] = !toggle;
}, false);
form.parentNode.insertBefore(button, form);
form.parentNode.insertBefore(tip, form);
}
return function (id, callback) {
var _threads = threads(id),
responses = array(localStorage['responses'] || project(_threads, 'response'));
responses = new Array(_threads.length - responses.length).concat(responses);
zip(_threads, responses).forEach(function (x) {
x[0].newResponse = x[0].response - (x[1] || 0);
x[0].isNew = typeof x[1] === 'undefined';
});
autoCheck(id);
callback(board(id), _threads);
localStorage['responses'] = project(_threads, 'response').toString();
localStorage['count'] = (parseInt(localStorage['count'], 10) || 1) + 1;
};
})(), parseInt(localStorage['count'], 10) || 1);
Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIHNoaXRhcmFiYV9vcHRpb24KLy8gQG5hbWVzcGFjZSAgIGpvaG4xODUxCi8vIEBkZXNjcmlwdGlvbiBzaGl0YXJhYmFfb3B0aW9uCi8vIEBpbmNsdWRlICAgICBodHRwOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5uZXQvaW50ZXJuZXQvMjExODcvY29uZmlnL2RhdGEvdGhyZWFkX2RlbGV0ZSoKLy8gQGV4Y2x1ZGUgICAgIGh0dHA6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm5ldC9pbnRlcm5ldC8yMTE4Ny9jb25maWcvZGF0YS90aHJlYWRfZGVsZXRlX2NvbmZpcm0KLy8gQGV4Y2x1ZGUgICAgIGh0dHA6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm5ldC9pbnRlcm5ldC8yMTE4Ny9jb25maWcvZGF0YS90aHJlYWRfZGVsZXRlX2ZpbmlzaAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyBAdmVyc2lvbiAgICAgMC41LjAuMDAKLy8gPT0vVXNlclNjcmlwdD09CgoKKGZ1bmN0aW9uIChfLCBjb3VudCkgewoJXygnY29udGVudCcsIGZ1bmN0aW9uIChib2FyZCwgdGhyZWFkcykgewoJCWNvbnNvbGUubG9nKCfku4rml6Xjga8nICsgY291bnQgKyAn5Zue55uu44Gu6LW35YuV44Gu5pel44Gn44GZ44CC44GK44KB44Gn44Go44GG44GU44GW44GE44G+44GZ44CCJyk7CgoJCWJvYXJkLmNsaWNrKGZ1bmN0aW9uICh0eXBlLCBpc0ZvcndhcmQpIHsKCQkJYm9hcmQuZHJhdyhzb3J0KHRocmVhZHMsIHR5cGUsIGlzRm9yd2FyZCkpOwoJCX0pOwoJCWJvYXJkLmRyYXcodGhyZWFkcyk7Cgl9KTsKCglmdW5jdGlvbiBhbGlnbihhcnJheSwgbmFtZSwgaXNGb3J3YXJkLCBhY3Rpb24pIHsKCQlpZiAoaXNGb3J3YXJkKQoJCQlyZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4gYWN0aW9uKHhbbmFtZV0sIHlbbmFtZV0pOyB9KTsKCQlyZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4gYWN0aW9uKHlbbmFtZV0sIHhbbmFtZV0pOyB9KTsKCX0KCWZ1bmN0aW9uIHNvcnQodGhyZWFkcywgdHlwZSwgaXNGb3J3YXJkKSB7CgkJaWYgKFsnbm8nLCAndGl0bGUnLCAncmVzcG9uc2UnLCAnbmV3UmVzcG9uc2UnLCAndmlnb3InXS5pbmRleE9mKHR5cGUpIDwgMCkKCQkJdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ25vdCBzdXBwb3J0IHR5cGU6ICcgKyB0eXBlKTsKCgkJaWYgKHR5cGUgPT09ICd0aXRsZScpIHsKCQkJcmV0dXJuIGFsaWduKHRocmVhZHMsIHR5cGUsIGlzRm9yd2FyZCwgZnVuY3Rpb24gKHgsIHkpIHsKCQkJCXJldHVybiB4IDwgeSA/IC0xIDogeCA+IHkgPyAxIDogMDsKCQkJfSk7CgkJfQoJCXJldHVybiBhbGlnbih0aHJlYWRzLCB0eXBlLCBpc0ZvcndhcmQsIGZ1bmN0aW9uICh4LCB5KSB7CgkJCXJldHVybiB4IC0geTsKCQl9KTsKCX0KfSkoKGZ1bmN0aW9uICgpIHsKCWZ1bmN0aW9uIGFycmF5KHN0cikgewoJCXJldHVybiBuZXcgRnVuY3Rpb24oJ3JldHVybiBbJyArIHN0ciArICddOycpKCk7Cgl9CglmdW5jdGlvbiBwcm9qZWN0KGFycmF5LCBuYW1lKSB7CgkJcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geFtuYW1lXTsgfSk7Cgl9CglmdW5jdGlvbiB6aXAoKSB7CgkJdmFyIHJlc3VsdHMgPSBbXSwKCQkJYXJyYXlzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLAoJCQlsZW5ndGggPSBNYXRoLm1heC5hcHBseShudWxsLCBwcm9qZWN0KGFycmF5cywgJ2xlbmd0aCcpKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCXJlc3VsdHMucHVzaChwcm9qZWN0KGFycmF5cywgaSkpOwoJCX0KCQlyZXR1cm4gcmVzdWx0czsKCX0KCWZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7CgkJdmFyIG0gPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyAnLycsCgkJCWQgPSBkYXRlLmdldERhdGUoKSArICcvJywKCQkJaCA9IGRhdGUuZ2V0SG91cnMoKSArICc6JywKCQkJbWluID0gZGF0ZS5nZXRNaW51dGVzKCk7CgkJcmV0dXJuIG0gKyBkICsgaCArIG1pbjsKCX0KCWZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHsKCQl2YXIgc2VjID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpIC8gMTAwMCAtIGRhdGUgLyAxMDAwKSwKCQkJbWluLCBob3VyLCBkYXksIG1vbiwgdGltZXMsIHVuaXQsIHJlc3VsdDsKCQltaW4gPSBNYXRoLmZsb29yKHNlYyAvIDYwKTsKCQlzZWMgPSBzZWMgJSA2MDsKCQlob3VyID0gTWF0aC5mbG9vcihtaW4gLyA2MCk7CgkJbWluID0gbWluICUgNjA7CgkJZGF5ID0gTWF0aC5mbG9vcihob3VyIC8gMjQpOwoJCWhvdXIgPSBob3VyICUgMjQ7CgkJbW9uID0gTWF0aC5mbG9vcihkYXkgLyAzMCk7CgkJZGF5ID0gZGF5ICUgMzA7CgoJCXRpbWVzID0gW21vbiwgZGF5LCBob3VyLCBtaW4sIHNlY107CgkJdW5pdCA9IFsn44O25pyIJywgJ+aXpScsICfmmYLplpMnLCAn5YiGJywgJ+enkiddOwoJCXJlc3VsdCA9ICcnOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGltZXMubGVuZ3RoOyBpKyspIGlmICh0aW1lc1tpXSAhPT0gMCkgewoJCQlyZXN1bHQgKz0gdGltZXNbaV0gKyB1bml0W2ldOwoJCQlpZiAoaSAhPSB0aW1lcy5sZW5ndGggLSAxKQoJCQkJcmVzdWx0ICs9IHRpbWVzW2kgKyAxXSArIHVuaXRbaSArIDFdOwoJCQlicmVhazsKCQl9CgkJcmV0dXJuIHJlc3VsdCArICfliY0nOwoJfQoKCWZ1bmN0aW9uICQodGFnLCBvcHRpb24pIHsKCQl2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksCgkJCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CgkJJC5vcHRpb24oZWxlbWVudCwgb3B0aW9uIHx8IHt9KTsKCQljaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7IGVsZW1lbnQuYXBwZW5kQ2hpbGQoeCk7IH0pOwoJCXJldHVybiBlbGVtZW50OwoJfQoJJC5hdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykgewoJCU9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZpbHRlcihmdW5jdGlvbiAoeCkgewoJCQlyZXR1cm4gWydrbGFzcycsICd0ZXh0J10uaW5kZXhPZih4KSA8IDA7CgkJfSkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQllbGVtZW50LnNldEF0dHJpYnV0ZSh4LCBhdHRyaWJ1dGVzW3hdKTsKCQl9KTsKCQlyZXR1cm4gZWxlbWVudDsKCX07CgkkLm9wdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb24pIHsKCQlpZiAob3B0aW9uLmtsYXNzKQoJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQob3B0aW9uLmtsYXNzKTsKCQlpZiAob3B0aW9uLnRleHQpCgkJCWVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24udGV4dDsKCQlyZXR1cm4gJC5hdHRyaWJ1dGUoZWxlbWVudCwgb3B0aW9uKTsKCX07CgkkLmZpbmQgPSBmdW5jdGlvbiAoaWQsIGNoaWxkKSB7CgkJaWYgKGNoaWxkKQoJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkKVswXTsKCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJfTsKCSQuY2xvbmUgPSBmdW5jdGlvbiAobm9kZSwgb3B0aW9uKSB7CgkJdmFyIGVsZW1lbnQgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKCQlyZXR1cm4gJC5vcHRpb24oZWxlbWVudCwgb3B0aW9uIHx8IHt9KTsKCX07CgkkLnByZXBlbmQgPSBmdW5jdGlvbiAobm9kZSwgY2hpbGQpIHsKCQlub2RlLmluc2VydEJlZm9yZShjaGlsZCwgbm9kZS5maXJzdEVsZW1lbnRDaGlsZCk7CgkJcmV0dXJuIG5vZGU7Cgl9OwoKCWZ1bmN0aW9uIHRocmVhZHMoaWQpIHsKCQl2YXIgdGFibGUgPSAkLmZpbmQoaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0YWJsZScpWzBdLAoJCQl0ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpLAoJCQl0aCA9IHRyWzBdLmNoaWxkcmVuOwoKCQlyZXR1cm4gW10uc2xpY2UuY2FsbCh0ciwgMSkubWFwKGZ1bmN0aW9uICh4KSB7CgkJCXJldHVybiB4LmNoaWxkcmVuOwoJCX0pLm1hcChmdW5jdGlvbiAoeCwgaSkgewoJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKCksCgkJCQlyZXNwb25zZSA9IHBhcnNlSW50KHhbM10udGV4dENvbnRlbnQsIDEwKSwKCQkJCXVybCA9IHhbMl0uY2hpbGRyZW5bMV0udGV4dENvbnRlbnQuc3BsaXQoJy8nKS5wb3AoKTsKCQkJZGF0ZS5zZXRUaW1lKHBhcnNlSW50KHVybCwgMTApICogMTAwMCk7CgkJCXJldHVybiB7CgkJCQljaGVjazogeFswXS5jaGlsZHJlblswXS5jaGVja2VkLAoJCQkJbm86IHBhcnNlSW50KHhbMV0udGV4dENvbnRlbnQsIDEwKSwKCQkJCXRpdGxlOiB4WzJdLmNoaWxkcmVuWzBdLnRleHRDb250ZW50LAoJCQkJdXJsOiB1cmwsCgkJCQlkYXRlOiBkYXRlLAoJCQkJcmVzcG9uc2U6IHJlc3BvbnNlLAoJCQkJdmlnb3I6IChmdW5jdGlvbiAoKSB7CgkJCQkJdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkgLyAxMDAwIC0gZGF0ZSAvIDEwMDAsCgkJCQkJCXZpZ29yID0gcmVzcG9uc2UgLyAodGltZXN0YW1wIC8gKDYwICogNjAgKiAyNCkpOwoJCQkJCWlmIChyZXNwb25zZSA8PSAxKQoJCQkJCQlyZXR1cm4gMDsKCQkJCQllbHNlIGlmIChyZXNwb25zZSA8PSAxMCkKCQkJCQkJcmV0dXJuIHZpZ29yICogcmVzcG9uc2UgLyAxMDsKCQkJCQlyZXR1cm4gdmlnb3I7CgkJCQl9KSgpCgkJCX07CgkJfSk7Cgl9CgoJZnVuY3Rpb24gdmlldygpIHsKCQlyZXR1cm4gJCgndGJvZHknLCB7fSwKCQkJJCgndHInLCB7fSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ2NoZWNrYm94JywgdGV4dDogJ+WJiumZpCcgfSksCgkJCQkkKCd0aCcsIHsga2xhc3M6ICdubycsICdkYXRhLXR5cGUnOiAnbm8nLCB0ZXh0OiAnTm8uJywgc3R5bGU6ICdjdXJzb3I6IHBvaW50ZXI7JyB9KSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ3RpdGxlJywgJ2RhdGEtdHlwZSc6ICd0aXRsZScsIHRleHQ6ICfjgr/jgqTjg4jjg6snLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICdyZXNwb25zZScsIHRleHQ6ICfjg6zjgrnmlbAnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICduZXdSZXNwb25zZScsIHRleHQ6ICfmlrDjg6zjgrnmlbAnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICd2aWdvcicsIHRleHQ6ICfli6LjgYQnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAnaW5kaXZpZHVhbERlbGV0aW9uJyB9KSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ2luZmVjdGlvbkRlbGV0aW9uJyB9KQoJCQkpCgkJKTsKCX0KCXZpZXcucm93ID0gZnVuY3Rpb24gKHRocmVhZCwgaSkgewoJCWZ1bmN0aW9uIGNoZWNrYm94KHVybCkgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAnY2hlY2tib3gnIH0sCgkJCQkkKCdpbnB1dCcsIHsKCQkJCQl0eXBlOiAnY2hlY2tib3gnLCBuYW1lOiAna2V5XycgKyB1cmwKCQkJCX0pCgkJCSk7CgkJfQoJCWZ1bmN0aW9uIG5vKG5vKSB7CgkJCXJldHVybiAkKCd0ZCcsIHsga2xhc3M6ICdubycsIHRleHQ6IG5vIH0pOwoJCX0KCQlmdW5jdGlvbiB0aXRsZSh0aXRsZSwgdXJsLCBkYXRlLCBpc05ldykgewoJCQl2YXIgZWxlbWVudCA9ICQoJ3RkJywgeyBrbGFzczogJ3RpdGxlJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0YXJnZXQ6ICdfYmxhbmsnLCB0ZXh0OiB0aXRsZSwKCQkJCQlocmVmOiAnaHR0cDovL2ouLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEubmV0L2Jicy9yZWFkLmNnaS9pbnRlcm5ldC8nICsgdXJsICsgJy8xNDA1MzcyNzc4L2w1MCcKCQkJCX0pLAoJCQkJJCgncCcsIHsKCQkJCQlrbGFzczogJ3NlYXJjaFVSTCcsIHRleHQ6IGZvcm1hdChkYXRlKSArICcgJwoJCQkJfSwgJCgnYicsIHsgdGV4dDogaW50ZXJ2YWwoZGF0ZSkgfSkpCgkJCSk7CgkJCWlmIChpc05ldykKCQkJCSQucHJlcGVuZChlbGVtZW50LCAkKCdzcGFuJywgeyB0ZXh0OiAnKE5ldykgJywgc3R5bGU6ICdjb2xvcjogI2ViNjEwMTsnIH0pKTsKCQkJcmV0dXJuIGVsZW1lbnQ7CgkJfQoJCWZ1bmN0aW9uIHJlc3BvbnNlKHJlc3BvbnNlKSB7CgkJCXJldHVybiAkKCd0ZCcsIHsga2xhc3M6ICdyZXNOdW1iZXInLCB0ZXh0OiByZXNwb25zZSB9KTsKCQl9CgkJZnVuY3Rpb24gbmV3UmVzcG9uc2UobmV3UmVzcG9uc2UsIGlzTmV3KSB7CgkJCXZhciBlbGVtZW50ID0gJCgndGQnLCB7IGtsYXNzOiAncmVzTnVtYmVyJyB9LAoJCQkJJCgnaScsIHsgdGV4dDogJygnICsgbmV3UmVzcG9uc2UgKyAnKScgfSkKCQkJKTsKCQkJaWYgKGlzTmV3KQoJCQkJJC5vcHRpb24oZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgeyBzdHlsZTogJ2NvbG9yOiByZWQ7JyB9KTsKCQkJZWxzZQoJCQkJJC5vcHRpb24oZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgeyBzdHlsZTogJ2NvbG9yOiBibHVlOycgfSk7CgkJCXJldHVybiBlbGVtZW50OwoJCX0KCQlmdW5jdGlvbiB2aWdvcih2aWdvcikgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgc3R5bGU6ICdvdmVyZmxvdzogaGlkZGVuOycgfSwKCQkJCSQoJ2InLCB7CgkJCQkJdGV4dDogKGZ1bmN0aW9uICgpIHsKCQkJCQkJaWYgKHZpZ29yIDwgMSkKCQkJCQkJCXJldHVybiB2aWdvci50b0ZpeGVkKDIpOwoJCQkJCQllbHNlIGlmICh2aWdvciA8IDEwMCkKCQkJCQkJCXJldHVybiB2aWdvci50b0ZpeGVkKDEpOwoJCQkJCQllbHNlIGlmICh2aWdvciA8IDEwMDApCgkJCQkJCQlyZXR1cm4gdmlnb3IudG9GaXhlZCgwKTsKCQkJCQkJcmV0dXJuICc5OTkrJzsKCQkJCQl9KSgpCgkJCQl9KQoJCQkpOwoJCX0KCQlmdW5jdGlvbiBzYXZlKHVybCkgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAnaW5kaXZpZHVhbERlbGV0aW9uJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0ZXh0OiAn5YCJ5bqr44G46YCB44KLJywKCQkJCQlocmVmOiAnLi90aHJlYWRfZGVsZXRlX2NvbmZpcm0/a2V5PScgKyB1cmwgKyAnJnN1YmNvbW1hbmQ9c2F2ZScKCQkJCX0pCgkJCSk7CgkJfQoJCWZ1bmN0aW9uIHJlbW92ZSh1cmwpIHsKCQkJcmV0dXJuICQoJ3RkJywgeyBrbGFzczogJ2luZmVjdGlvbkRlbGV0aW9uJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0ZXh0OiAn5a6M5YWo5YmK6ZmkJywKCQkJCQlocmVmOiAnLi90aHJlYWRfZGVsZXRlX2NvbmZpcm0/a2V5PScgKyB1cmwgKyAnJnN1YmNvbW1hbmQ9cmVtb3ZlJwoJCQkJfSkKCQkJKTsKCQl9CgoJCXJldHVybiAkKCd0cicsIHsga2xhc3M6IGkgJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCcgfSwKCQkJY2hlY2tib3godGhyZWFkLnVybCksCgkJCW5vKHRocmVhZC5ubyksCgkJCXRpdGxlKHRocmVhZC50aXRsZSwgdGhyZWFkLnVybCwgdGhyZWFkLmRhdGUsIHRocmVhZC5pc05ldyksCgkJCXJlc3BvbnNlKHRocmVhZC5yZXNwb25zZSksCgkJCW5ld1Jlc3BvbnNlKHRocmVhZC5uZXdSZXNwb25zZSwgdGhyZWFkLmlzTmV3KSwKCQkJdmlnb3IodGhyZWFkLnZpZ29yKSwKCQkJc2F2ZSh0aHJlYWQudXJsKSwKCQkJcmVtb3ZlKHRocmVhZC51cmwpCgkJKTsKCX07CgoJZnVuY3Rpb24gYm9hcmQoaWQpIHsKCQl2YXIgdGFibGUgPSAkLmZpbmQoaWQsICd0YWJsZScpOwoJCXRhYmxlLnJlcGxhY2VDaGlsZCh2aWV3KCksIHRhYmxlLmZpcnN0RWxlbWVudENoaWxkKTsKCQlyZXR1cm4gewoJCQlkcmF3OiBmdW5jdGlvbiAodGhyZWFkcykgewoJCQkJW10uc2xpY2UuY2FsbCh0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbiwgMSkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQkJCXRhYmxlLmZpcnN0RWxlbWVudENoaWxkLnJlbW92ZUNoaWxkKHgpOwoJCQkJfSk7CgkJCQl0aHJlYWRzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHsKCQkJCQl0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZCh2aWV3LnJvdyh4LCBpKSk7CgkJCQl9KTsKCQkJfSwKCQkJY2xpY2s6IGZ1bmN0aW9uIChjYWxsYmFjaykgewoJCQkJW10uc2xpY2UuY2FsbCh0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbiwgMSwgLTIpLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKCQkJCQl4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewoJCQkJCQl2YXIgdHlwZSA9IHguZGF0YXNldFsndHlwZSddLAoJCQkJCQkJdmFsdWUgPSBzZXNzaW9uU3RvcmFnZVt0eXBlXSwKCQkJCQkJCWlzRm9yd2FyZCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogdmFsdWUgPT09ICd0cnVlJzsKCQkJCQkJY2FsbGJhY2sodHlwZSwgaXNGb3J3YXJkKTsKCQkJCQkJc2Vzc2lvblN0b3JhZ2VbdHlwZV0gPSAhaXNGb3J3YXJkOwoJCQkJCX0sIGZhbHNlKTsKCQkJCX0pOwoJCQl9CgkJfTsKCX0KCglmdW5jdGlvbiBhdXRvQ2hlY2soaWQpIHsKCQl2YXIgZm9ybSA9ICQuZmluZChpZCwgJ3RhYmxlJykucGFyZW50Tm9kZSwKCQkJYnV0dG9uID0gJCgnaW5wdXQnLCB7IHR5cGU6ICdidXR0b24nLCB2YWx1ZTogJ+iHquWLleODgeOCp+ODg+OCrycgfSksCgkJCXRpcCA9ICQoJ2InLCB7IHRleHQ6ICfnj77lnKjjga7nt4/jgrnjg6zmlbA6ICcgKyB0aHJlYWRzKGlkKS5sZW5ndGggfSk7CgoJCWJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKCQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHMsCgkJCQl2YWx1ZSA9IHNlc3Npb25TdG9yYWdlWydhdXRvQ2hlY2snXSwKCQkJCXRvZ2dsZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogdmFsdWUgPT09ICd0cnVlJzsKCQkJaWYgKHRvZ2dsZSkKCQkJewoJCQkJemlwKHRocmVhZHMoaWQpLCBlbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uICh4KSB7CgkJCQkJcmV0dXJuIHR5cGVvZiB4WzBdICE9PSAndW5kZWZpbmVkJzsKCQkJCX0pLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHsKCQkJCQlyZXR1cm4geFswXS52aWdvciAtIHlbMF0udmlnb3I7CgkJCQl9KS5zbGljZSgwLCAzMCkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQkJCXhbMV0uY2hlY2tlZCA9IHRydWU7CgkJCQl9KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewoJCQkJCWVsZW1lbnRzW2ldLmNoZWNrZWQgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCQlzZXNzaW9uU3RvcmFnZVsnYXV0b0NoZWNrJ10gPSAhdG9nZ2xlOwoJCX0sIGZhbHNlKTsKCQlmb3JtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJ1dHRvbiwgZm9ybSk7CgkJZm9ybS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aXAsIGZvcm0pOwoJfQoKCXJldHVybiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7CgkJdmFyIF90aHJlYWRzID0gdGhyZWFkcyhpZCksCgkJCXJlc3BvbnNlcyA9IGFycmF5KGxvY2FsU3RvcmFnZVsncmVzcG9uc2VzJ10gfHwgcHJvamVjdChfdGhyZWFkcywgJ3Jlc3BvbnNlJykpOwoJCXJlc3BvbnNlcyA9IG5ldyBBcnJheShfdGhyZWFkcy5sZW5ndGggLSByZXNwb25zZXMubGVuZ3RoKS5jb25jYXQocmVzcG9uc2VzKTsKCgkJemlwKF90aHJlYWRzLCByZXNwb25zZXMpLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKCQkJeFswXS5uZXdSZXNwb25zZSA9IHhbMF0ucmVzcG9uc2UgLSAoeFsxXSB8fCAwKTsKCQkJeFswXS5pc05ldyA9IHR5cGVvZiB4WzFdID09PSAndW5kZWZpbmVkJzsKCQl9KTsKCgkJYXV0b0NoZWNrKGlkKTsKCQljYWxsYmFjayhib2FyZChpZCksIF90aHJlYWRzKTsKCgkJbG9jYWxTdG9yYWdlWydyZXNwb25zZXMnXSA9IHByb2plY3QoX3RocmVhZHMsICdyZXNwb25zZScpLnRvU3RyaW5nKCk7CgkJbG9jYWxTdG9yYWdlWydjb3VudCddID0gKHBhcnNlSW50KGxvY2FsU3RvcmFnZVsnY291bnQnXSwgMTApIHx8IDEpICsgMTsKCX07Cn0pKCksIHBhcnNlSW50KGxvY2FsU3RvcmFnZVsnY291bnQnXSwgMTApIHx8IDEpOwo=