Skip to content

Instantly share code, notes, and snippets.

@Delivator
Last active August 12, 2020 11:26
Show Gist options
  • Save Delivator/6fc71d715d62bfdf832ec830f17ada5e to your computer and use it in GitHub Desktop.
Save Delivator/6fc71d715d62bfdf832ec830f17ada5e to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<head>
<title>Skychat</title>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js"></script>
<script>
var snsPortal = `sns.redirectme.net`;
var skynetPortal = window.location.hostname;
if (sessionStorage.getItem("skychat_state") === null) {
sessionStorage.setItem("skychat_state", "chat");
}
window.onload = function() {
var snsComments = document.getElementById("sns_comments").getElementsByTagName("sns_comment");
for (var i=0, max=snsComments.length; i < max; i++) {
var comment = snsComments[i];
var user = atob(comment.getElementsByTagName("user")[0].innerHTML).replace(/</g,"&lt;").replace(/>/g,"&gt;");
if (!user) {
user = `<i>Anonomous</i>`
}
var epoch = comment.getElementsByTagName("epoch")[0].innerHTML;
var contact = atob(comment.getElementsByTagName("contact")[0].innerHTML).replace(/</g,"&lt;").replace(/>/g,"&gt;");
var contactImg = "";
if (contact.length == 46 && contact.indexOf("@") == -1) {
contactImg = `/${contact}/`;
} else {
contactImg = `https://www.gravatar.com/avatar/${CryptoJS.MD5(contact)}`
}
var content = atob(comment.getElementsByTagName("content")[0].innerHTML).replace(/</g,"&lt;").replace(/>/g,"&gt;");
var innerHtml = `<div class='row'><div class='col-1 px-2 py-2 border-bottom'><center><img class='rounded-circle' width='50px' height='50px' src='${contactImg}'/></center></div><div class='col-11 px-2 py-2 border-bottom'><b>${user}</b> <i>posted at ${new Date(epoch * 1000)}</i><br/>${content}</div></div>`;
var comments = document.getElementById("comments").innerHTML;
document.getElementById("comments").innerHTML += innerHtml;
}
var json = JSON.parse(new URLSearchParams(window.location.search).get(`json`));
if (json !== null && json.message !== null && json.message.length > 0) {
alert(json.message);
}
window.scrollTo(0,document.body.scrollHeight);
setTimeout(function(){refresh();}, 3000);
if (sessionStorage.getItem("skychat_state") == "compose") {
clickToComment();
} else if (sessionStorage.getItem("skychat_state") == "login") {
clickToLogin();
} else if (sessionStorage.getItem("skychat_state") == "portal") {
clickToChangePortal();
}
if (localStorage.getItem("user") === null) {
clickToLogin();
}
if (localStorage.getItem("contact") !== null) {
var contact = localStorage.getItem("contact");
var contactImg = "";
var skylinkRegex = /^[a-zA-Z0-9-_]{46}$/;
if (skylinkRegex.test(contact)) {
contactImg = `/${contact}/`;
} else {
contactImg = `https://www.gravatar.com/avatar/${CryptoJS.MD5(contact)}`
}
document.getElementById("comment_modal_avatar").innerHTML = `<img class='rounded-circle' width='50px' height='50px' src='${contactImg}'/> ${localStorage.getItem("user")}`;
}
}
function getHost() {
return document.getElementById("skychat_host").innerHTML;
}
function refresh() {
if(sessionStorage.getItem("skychat_state") == "chat"){
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
}
function generateUUID() {
let uuid = '';
const cs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let i = 0; i < 16; i++) {
uuid += cs.charAt(Math.floor(Math.random() * cs.length));
};
return uuid;
}
function clickToLogin() {
sessionStorage.setItem("skychat_state", "login");
document.getElementById("login_modal").style.display = "block";
document.getElementById("portal_modal").style.display = "none";
document.getElementById("comment_modal").style.display = "none";
$("#resultsModal").modal("show");
}
function clickToChangePortal() {
sessionStorage.setItem("skychat_state", "portal");
document.getElementById("login_modal").style.display = "none";
document.getElementById("portal_modal").style.display = "block";
document.getElementById("comment_modal").style.display = "none";
document.getElementById('portal').value = skynetPortal;
$("#resultsModal").modal("show");
}
function clickToComment() {
sessionStorage.setItem("skychat_state", "compose");
document.getElementById("login_modal").style.display = "none";
document.getElementById("portal_modal").style.display = "none";
document.getElementById("comment_modal").style.display = "block";
$("#resultsModal").modal("show");
}
function cancel() {
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
function portal() {
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${document.getElementById('portal').value}`;
}
function login() {
document.getElementById('login-trigger-container').innerHTML
= `<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>`;
localStorage.setItem("user", document.getElementById('user').value);
localStorage.setItem("contact", "");
var file = document.getElementById('contact').files[0];
if (file != null) {
$.ajax({
url: `/skynet/skyfile/${generateUUID()}?filename=${file.name}`,
type: 'POST',
data: file,
mimeType: "multipart/form-data",
contentType: false,
cache: false,
processData: false,
dataType: 'json',
success: function (data, textStatus, jqXHR) {
localStorage.setItem("contact", data.skylink);
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
},
error: function (jqXHR, textStatus, errorThrown) {
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
});
} else {
localStorage.setItem("contact", data.skylink);
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
}
function anonomous_login() {
localStorage.setItem("user", "Anonomous");
localStorage.setItem("contact", "");
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
function logout() {
localStorage.removeItem("user");
localStorage.removeItem("contact");
document.getElementById("comment_modal_avatar").innerHTML = "";
window.location.href = `http://${snsPortal}/${getHost()}?portal=${skynetPortal}`;
}
function save() {
document.getElementById('save-trigger-container').innerHTML
= `<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>`;
var pin = window.location.pathname.substring(1, 47);
var user = btoa(localStorage.getItem('user'));
var epoch = Math.round(new Date().getTime() / 1000);
var contact = btoa(localStorage.getItem('contact'));
var content = btoa(document.getElementById('content').value);
var snsComment = `<sns_comment>`
+ `<pin>${pin}</pin>`
+ `<user>${user}</user>`
+ `<epoch>${epoch}</epoch>`
+ `<contact>${contact}</contact>`
+ `<content>${content}</content>`
+ `</sns_comment>`;
var snsComments = "</sns_comments></body>";
fetch(`/${pin}/`)
.then(response => response.text())
.then(result => {
var newPage = result.substring(0, result.length-snsComments.length)+snsComment+snsComments;
var blob = new Blob([newPage],{ type: 'text/html' });
var formData = new FormData();
formData.append('file', blob);
const uuid = generateUUID();
fetch(`/skynet/skyfile/${uuid}?filename=comment.html`, {method: 'POST',body: formData})
.then(response => response.json())
.then(result => {
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/comment?host=${getHost()}&pin=${result.skylink}&user=${encodeURIComponent(user)}&epoch=${epoch}&contact=${encodeURIComponent(contact)}&content=${encodeURIComponent(content)}&redirect=${result.skylink}&portal=${skynetPortal}`;
})
.catch(error => {console.error('Error:', error)});
})
}
function newChat() {
sessionStorage.setItem("skychat_state", "newChat");
var pin = window.location.pathname.substring(1, 47);
fetch(`/${pin}/`)
.then(response => response.text())
.then(result => {
var host = `${generateUUID()}.sns`;
var skychatDiv = `<skychat id="skychat_host" style="display: none">`;
var endingIndex = result.lastIndexOf(skychatDiv);
var newPage = result.substring(0, endingIndex)
+ `${skychatDiv}${host}</skychat><sns_comments id="sns_comments" style="display: none"></sns_comments></body>`;
var blob = new Blob([newPage],{ type: 'text/html' });
var formData = new FormData();
formData.append('file', blob);
const uuid = generateUUID();
fetch(`/skynet/skyfile/${uuid}?filename=comment.html`, {method: 'POST',body: formData})
.then(response => response.json())
.then(result => {
sessionStorage.setItem("skychat_state", "chat");
window.location.href = `http://${snsPortal}/register?host=${host}&pin=${result.skylink}&password=${generateUUID()}&redirect=${result.skylink}&portal=${skynetPortal}`;
})
.catch(error => {console.error('Error:', error)});
})
}
</script>
</head>
<body class="bg-dark text-white">
<nav class="navbar navbar-expand-lg navbar-dark fixed-top bg-success">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link text-dark" href="#" onclick="logout()">Logout</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="#" onclick="clickToChangePortal()">Portals</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="#" onclick="newChat()">New</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="https://github.com/geo-gs/skychat">About</a>
</li>
<li class="nav-item" style="display: none;">
<a class="nav-link" href="#manage">Manage</a>
</li>
</ul>
</div>
</nav>
<br/><br/><br/>
<div id='comments' class='container'></div>
<div class="container">
<div class="modal" id="resultsModal" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static" style="display: none;">
<div class="modal-dialog">
<div id="login_modal" class="modal-content" style="display: none;">
<div class="modal-header bg-success">
<h5 class="modal-title">Login</h5>
</div>
<div class="modal-body">
<div class="md-form">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">User Name</span>
</div>
<input id="user" type="text" class="form-control">
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">Avatar</span>
</div>
<form id="contact_form">
<input id="contact" type="file" class="form-control">
</form>
</div>
</div>
</div>
<div class="modal-footer bg-success">
<div id='login-trigger-container'>
<button type='button' class="btn btn-secondary" onclick='login()'>Submit</button>
<button type='button' class="btn btn-secondary" onclick='anonomous_login()'>Skip</button>
</div>
</div>
</div>
<div id="portal_modal" class="modal-content" style="display: none;">
<div class="modal-header bg-success">
<h5 class="modal-title">Portal</h5>
</div>
<div class="modal-body">
<div class="md-form">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">Portal</span>
</div>
<input id="portal" type="text" class="form-control">
</div>
</div>
</div>
<div class="modal-footer bg-success">
<div id='login-trigger-container'>
<button type='button' class="btn btn-secondary" onclick='portal()'>Change</button>
<button type='button' class="btn btn-secondary" data-dismiss="modal" onclick='cancel()'>Cancel</button><br/>
</div>
</div>
</div>
<div id="comment_modal" class="modal-content" style="display: none;">
<div class="modal-header bg-success">
<h5 id="comment_modal_avatar" class="modal-title"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick='cancel()'>
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="md-form">
<textarea id="content" class="md-textarea form-control" rows="3" placeholder="Message group..."></textarea>
</div>
<p id="results"></p>
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>
</div>
<div class="modal-footer bg-success">
<div id='save-trigger-container'>
<button id='save-trigger' type='button' class="btn btn-secondary" onclick='save()'>Comment</button>
<button type='button' class="btn btn-secondary" data-dismiss="modal" onclick='cancel()'>Cancel</button><br/>
</div>
</div>
</div>
</div>
</div>
</div>
<br/><br/><br/>
<nav class="navbar navbar-expand-lg navbar-dark fixed-bottom bg-success">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">✎</span>
</div>
<input type="text" class="form-control" placeholder="Message group..." onclick='clickToComment();$("#resultsModal").modal("show")'>
</div>
</nav>
<skychat id="skychat_host" style="display: none">chat.sns</skychat><sns_comments id="sns_comments" style="display: none"><sns_comment><pin>IACjWstApCT3GUIw3SXIAh7EkG7XK_JwZ_L-qktEmXoCDA</pin><user>ZGluZ2xlcw==</user><epoch>1597197995</epoch><contact>SUFCTDRXM1dSSVF5bXh6dExVTm1FRkhjbUppRVNnTDctejhXRzhyaExjU2IyUQ==</contact><content>SGVsbG8gV29ybGQhISE=</content></sns_comment><sns_comment><pin>IADnRO6dBuJEGKaqG-ru4ChCaayFLnUPSHCP0FNxoGo6yQ</pin><user>QW5vbm9tb3Vz</user><epoch>1597199713</epoch><contact></contact><content>SGVsbG8gV29ybGQhISEgMg==</content></sns_comment><sns_comment><pin>IAC7XcL9GJBUciBTSmo9hKZyOkUy_ZroncxsQoP5y-J1xw</pin><user>ZGluZ2xlcw==</user><epoch>1597200469</epoch><contact>Q0FCZkdVN19zV01YNVJmaGZkRDdWaklWVUNiVXgtTXFDdHdfaGxCMHZBQ19sZw==</contact><content>SGVsbG8gd29ybGQgZnJvbSBzaWFza3kubmV0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2t5cG9ydGFsLnh5eiEh</content></sns_comment><sns_comment><pin>IADXkBC7LSeBOks3zQWjCxpjYADW5guGZcItByQpUPEPaA</pin><user>QW5vbm9tb3Vz</user><epoch>1597201238</epoch><contact></contact><content>VEVTVA==</content></sns_comment><sns_comment><pin>IAA5NGwzxqXrjRLKDPd6vejnRCyoU4ALYd8kzj3FXDU-oA</pin><user>Q292YWxlbnQ=</user><epoch>1597201341</epoch><contact>WEFCa1ZxdzlxV00yZFZCbHBKMGt6OHpoVHYwdXJhS2pYUU15TGg5ZlhFb3pqUQ==</contact><content>VGhpcyBpcyBsb29raW5nIHdheSBiZXR0ZXIgaW4ganVzdCBhIGRheSBvciBzbyE=</content></sns_comment><sns_comment><pin>IADFVubmbj7XIupjF69TGd-y_w_QCSCig5QQcZnunGJYyQ</pin><user>Q292YWxlbnQ=</user><epoch>1597201366</epoch><contact>WEFCa1ZxdzlxV00yZFZCbHBKMGt6OHpoVHYwdXJhS2pYUU15TGg5ZlhFb3pqUQ==</contact><content>PHNjaXB0Pg==</content></sns_comment><sns_comment><pin>IADjx6lnRmKVN-FoDZ6HaJ9P1Vsg3FQZhZEYejedUMV4VA</pin><user>Q292YWxlbnQ=</user><epoch>1597201417</epoch><contact>WEFCa1ZxdzlxV00yZFZCbHBKMGt6OHpoVHYwdXJhS2pYUU15TGg5ZlhFb3pqUQ==</contact><content>PHNjcmlwdD4Kd2luZG93LmFsZXJ0KDUgKyA2KTsKPC9zY3JpcHQ+</content></sns_comment><sns_comment><pin>IACGuMV78wJEFQ9TCi5yLznWItF-L_P_61mVAaVg7yzJOQ</pin><user>Q292YWxlbnQ=</user><epoch>1597201478</epoch><contact>WEFCa1ZxdzlxV00yZFZCbHBKMGt6OHpoVHYwdXJhS2pYUU15TGg5ZlhFb3pqUQ==</contact><content>QXcgdGhhdCdzIG5vIGZ1biBub3QgbGV0dGluZyB0aGUgc2NyaXB0IHRhZyB3b3JrKEknbSBnb25uYSB0cnkgdGhhdCBldmVyeSB0aW1lIHNvbWVvbmUgbWFrZXMgYSBwdWJsaWMgZm9ydW0gb24gU2lhIGJ0dyBmb3IgeW91IGZ1dHVyZSBkZXZzIG91dCB0aGVyZSk=</content></sns_comment><sns_comment><pin>IACA0el0geMWE_LW4YlT3c_me4EgpVtmEUIUwEaAkZZSyg</pin><user>ZGluZ2xlcw==</user><epoch>1597201624</epoch><contact>Q0FCZkdVN19zV01YNVJmaGZkRDdWaklWVUNiVXgtTXFDdHdfaGxCMHZBQ19sZw==</contact><content>SGkgQ292YWxlbnQhIFRoYW5rcyBmb3IgdGVzdGluZyB0aGF0IGFnYWluISBJIHRoaW5rIEkgZmluYWxseSBsZWFybmVkIG15IGxlc3Nvbi4gOi0p</content></sns_comment><sns_comment><pin>IACQmeudRminINkVLqFeghJFqdCW4LKXdh0_ul6b66zZhw</pin><user>ZGluZ2xlcw==</user><epoch>1597202967</epoch><contact>SUFCTDRXM1dSSVF5bXh6dExVTm1FRkhjbUppRVNnTDctejhXRzhyaExjU2IyUQ==</contact><content>Q3Jvc3MtcG9zdGluZyBmcm9tIFNpYSdzIERpc2NvcmQgc2VydmVyOgoKT25lIGlkZWEgSSd2ZSBzdHVtYmxlZCBvbiBpcyB0aGF0IHdpdGggc2t5bGluayB3ZWJwYWdlcyB5b3UgY2FuIGp1c3QgY2hlY2sgdG8gc2VlIGlmIHRoZSBxdWVyeSBzdHJpbmcgaGFzIGA/bGF0ZXN0PXRydWVgIGluIGl0IGFuZCBpZiBub3QgdGhlbiBqYXZhc2NyaXB0IHJlZGlyZWN0IHRvIGh0dHBzOi8veW91cmRvbWFpbm5hbWUuY29tL3BhdGgvdG8vZmlsZS8/bGF0ZXN0PXRydWUuIERvaW5nIHNvIHdpbGwgcHJldmVudCBvbGQgc2t5bmV0IHdlYnBhZ2VzIGZyb20gZ29pbmcgc3RhbGUuIEEgZ29vZCBleGFtcGxlIG9mIHRoaXMgaXMgaHR0cHM6Ly9za3lwb3J0YWwueHl6L0NBQnZMZG03ZElmY0F2cDJvd0toQ25ySmxJNzI2TzdIeTl0UXhBai12aGlyWUEvICh0aGUgb3JpZ2luYWwgc2t5Y2hhdCkgd2hpY2ggc2VsZi1oZWFscyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2Ygc2t5Y2hhdCE=</content></sns_comment><sns_comment><pin>KADUgKgM7faIG4uiQCnI5Db8jwl-o3fuvfb3ib2ftdQ5Pg</pin><user>ZGluZ2xlcw==</user><epoch>1597205436</epoch><contact></contact><content></content></sns_comment><sns_comment><pin>KAAaJX2V48v0y8oLAH3Q-iUQYdEjp-4a6VYhmRHL9hpq_w</pin><user>ZGluZ2xlcw==</user><epoch>1597205519</epoch><contact></contact><content>SnVzdCB3YW50ZWQgdG8gdGVzdCBzdWJtaXR0aW5nIGFuIGVtcHR5IGNvbW1lbnQuIExvb2tzIGxpa2UgaXQgd29ya2VkLiBVbnN1cmUgaWYgSSB3YW50IGl0IHRvIHdvcmsgdGhvdWdoLiBTZWVtcyBvZGQgdG8gYWxsb3cgZW1wdHkgY29tbWVudHMu</content></sns_comment><sns_comment><pin>KADSjn8KeR9HvddoXPPyLNTpyazYWL_KMKjPTMu9svAMWQ</pin><user>ZGluZ2xlcw==</user><epoch>1597205725</epoch><contact></contact><content>QW55b25lIGhhdmUgYW4gb3BpbmlvbiBvbiBlbXB0eSBjaGF0IGNvbW1lbnRzPyBZYXkgb3IgbmF5Pw==</content></sns_comment><sns_comment><pin>KAB86WBO6asuiXEULW_mvFdRWvXplRCDDR49mCoZkAD1Tg</pin><user>U2t5c3BhY2U=</user><epoch>1597206898</epoch><contact>SUFCWVBNaG1PdlRaN1VwOUs0V0FhSWxKNzVkWmFnb05vWnpLX0dWVlZpdHJ6UQ==</contact><content>QXdlc29tZSBBcHAgISBIZWxsbyBmcmllbmRzIDop</content></sns_comment><sns_comment><pin>KACQ9BGAzIPTNpXRAWuH4V7-BbDavH6CqoskBr0EhIkPnA</pin><user>QW5vbm9tb3Vz</user><epoch>1597210448</epoch><contact></contact><content>TG92ZSB0aGlzISEhIQ==</content></sns_comment><sns_comment><pin>KAD4x5pv8aBHFRjp7YMTJnZDd1d32F9BqwAHfk9fYMVNRA</pin><user>RGVsaXZhdG9y</user><epoch>1597223359</epoch><contact>X0JsdU54SG1laDZZRW9OS1JaWkItNWFveWVldWx1LTlhY1pnVmxWNnJPazJ6UQ==</contact><content>VGhpcyBpcyBuaWNlIQ==</content></sns_comment><sns_comment><pin>KADmGBCku6L2CNIh7Jbz996ccpuE1wmLZ21YEJzPNmv2Hw</pin><user>QW5vbm9tb3Vz</user><epoch>1597228606</epoch><contact></contact><content>Jmx0O3NjcmlwdCZndDthbGVydCgidGVzdCIpJmx0Oy9zY3JpcHQmZ3Q7</content></sns_comment><sns_comment><pin>KABrF_s3e8sNTYiRD5NR3KCiIEtQsiNQ1HuvePXI8Q_PqQ</pin><user>QW5vbm9tb3Vz</user><epoch>1597229156</epoch><contact></contact><content>RWNobw==</content></sns_comment><sns_comment><pin>KACeGpKR6n7jOBgbCBpe3sX6hJyY3FdB1RCbNEjh598Grw</pin><user>SXMgdGhlcmUgYSBsaW1pdCBmb3IgdXNlcm5hbWUgbGVuZ3RoIG9yIGNhbiBpdCBiZSBvZiBhbnkgY2hhcmFjdGVyIGNvdW50PyBCZWNhdXNlIGlmIHNvIEkgdGhpbmsgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYWRkIGEgbGltaXQgaGVyZSBhcyB3ZWxsIQ==</user><epoch>1597229516</epoch><contact>JyBvbmVycm9yPSJhbGVydCgnVGhpcyBpcyBhbiBYU1MgdGVzdCBvbiBzYycpIg==</contact><content>VGVzdA==</content></sns_comment></sns_comments></body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment