Complete user registration, added idle inactivity timeout

This commit is contained in:
Deon George 2020-07-09 23:12:17 +10:00
parent 8b6db8df92
commit 141382c499
7 changed files with 235 additions and 83 deletions

View File

@ -41,6 +41,8 @@ var ERR_NOT_IMPLEMENTED ='\1n\1h\1RNOT IMPLEMENTED YET?';
var ERR_ROUTE ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ERR_METHOD_NOT_EXIST ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ACCESS_DENIED ='\1n\1h\1RACCESS DENIED. \1RMISTAKE? TRY AGAIN OR TELL US *08';
var INACTIVITY ='\1n\1h\1RINACTIVITY ALERT';
var INACTIVE ='\1n\1h\1RINACTIVITY DISCONNECT';
var NO_HISTORY_FRAMES =['980a','98b','981a'];

View File

@ -1,42 +1,60 @@
/**
* This handles user registration.
*
* The form must have the following fields:
* + UID The user's user id to login
* + EMAIL The users's email address - to receive tokens
* + FULLNAME The user's full name
* + PASS The users's preferred password
* + CITY The user's city
* + COUNTRY The user's country - 3 letter ISO code
* + PCODE THe user's postal code
*/
var CONTROL_REGISTER ='1';
var EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
var cValChars='ACDEFHJKLMNPQRTUVWXY23456789!@#$%&*';
var cValChars='ACDEFHJKLMNPQRTUVWXY23456789!@$%&';
log(LOG_DEBUG,'Control REGISTER loaded');
log(LOG_DEBUG,'+ Control REGISTER loaded');
function register() {
var code = '';
var complete = false;
this.handle=function(read) {
log(LOG_DEBUG,'Control REGISTER handle() start. ('+read+')');
log(LOG_DEBUG,'Field '+cf.fname+'('+JSON.stringify(cf)+')');
log(LOG_DEBUG,'- Field '+cf.fname+'('+JSON.stringify(cf)+')');
if ((cf.fname == 'TOKEN') && (read == '#' || read == '\r')) {
if (cf.fvalue !== code) {
if (cf.fvalue == code) {
complete = true;
} else {
sendBaseline('\1n\1h\1RINVAID CODE, PLEASE TRY AGAIN *00',false);
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
read = '';
}
}
log(LOG_DEBUG,'Field Value '+cf.fvalue+'('+JSON.stringify(code)+')');
log(LOG_DEBUG,'- Field Value ['+cf.fvalue+'] ('+code+')');
return read;
}
// Called before processing for a field
this.prefield=function() {
log(LOG_DEBUG,'Field '+cf.fname+'('+JSON.stringify(cf)+')');
log(LOG_DEBUG,'- Field '+cf.fname+'('+JSON.stringify(cf)+')');
if (cf.fname == 'TOKEN') {
log(LOG_DEBUG,'BASELINE '+cf.fname+'('+JSON.stringify(cf)+')');
if (! code.length) {
log(LOG_DEBUG,'- BASELINE '+cf.fname+'('+JSON.stringify(cf)+')');
sendBaseline('\1n\1h\1RPlease wait, while a token is emailed to you...',false);
var email = fo.fieldValue('EMAIL');
var user = fo.fieldValue('UID');
var name = fo.fieldValue('FULLNAME');
log(LOG_DEBUG,'VALIDATE EMAIL TO ('+system.matchuserdata(U_NETMAIL,email)+')');
log(LOG_DEBUG,'- VALIDATE EMAIL TO ('+system.matchuserdata(U_NETMAIL,email)+')');
// Make sure we got an email
// Validate Email hasnt been used
if ((email.indexOf('@') === -1) || ! EMAIL_REGEX.test(email) || (system.matchuserdata(U_NETMAIL,email) !== 0)) {
@ -48,6 +66,7 @@ function register() {
if (! system.check_name(user)) {
log(LOG_DEBUG,'Cannot use user_id: ('+user+')');
sendBaseline('\1n\1h\1RINVAID USER ID, PLEASE TRY AGAIN *00',false);
return;
}
var msgbase = new MsgBase('mail');
@ -87,10 +106,71 @@ function register() {
return;
}
msgbase.close();
}
log(LOG_DEBUG,'SEND EMAIL TO ('+x+')');
sendBaseline('\1n\1h\1RTOKEN SENT, PLEASE ENTER TOKEN',false);
log(LOG_DEBUG,'SENT EMAIL TOKEN ('+code+') ['+JSON.stringify(hdrs)+']');
}
}
this.process=function() {
log(LOG_DEBUG,'Creating user: '+fo.fieldValue('EMAIL'));
try {
var newuser = system.new_user(fo.fieldValue('UID'));
} catch (e) {
sendBaseline('\1n\1h\1RERROR USER EXISTS, PLEASE TRY AGAIN *00',false);
log(LOG_ERROR,"New user couldn't be created (user created while signing up)");
log(LOG_ERROR,JSON.stringify(e));
return;
}
if (typeof newuser === 'number') {
sendBaseline('\1n\1h\1RERROR CREATING USER, PLEASE TRY AGAIN *00',false);
log(LOG_ERROR,"New user couldn't be created (error code "+newuser+")");
return;
}
newuser.security.password = '';
if (bbs.login(newuser.alias,null)) {
user.number = newuser.number;
user.security.password = fo.fieldValue('PASS');
user.name = fo.fieldValue('FULLNAME');
user.handle = fo.fieldValue('UID');
user.location = fo.fieldValue('CITY')+', '+fo.fieldValue('COUNTRY');
user.zipcode = fo.fieldValue('PCODE');
user.netmail = fo.fieldValue('EMAIL');
bbs.user_sync();
bbs.logon();
log(LOG_INFO,"Created user record #"+user.number+": "+user.alias);
action = ACTION_EXIT;
return;
} else {
sendBaseline('\1n\1h\1RERROR LOGGING IN, PLEASE TRY AGAIN *00',false);
log(LOG_INFO,"bbs.login() failed");
user.comment = 'Initial login failed!';
newuser.settings |= USER_DELETED;
delete newuser;
return;
}
return 'processed';
}
Object.defineProperty(this,'getName', {
get: function() {
return 'Control-Registration';
}
});
Object.defineProperty(this,'isComplete', {
get: function() {
return complete;
}
});
}
this;

112
main.js
View File

@ -26,7 +26,7 @@ while(bbs.online) {
var next_page = user.number ? { frame: 98,index: 'b' } : { frame: 980,index: 'a' }; // Start Frame
var action = ACTION_GOTO; // Initial action
var inkey_timeout = 10000; // Timeout waiting for input @todo required? check if idle timeout occurs
var inkey_timeout = 60000; // Timeout waiting for input
var fo = null; // Current Frame
var fn = null; // Current Field Number for an Input Frame
var history = []; // Page history
@ -34,6 +34,7 @@ while(bbs.online) {
var cf = null; // Current Input Field
var cc = null; // Current Control Method
var timeout = 0; // Track our inactivity timeout
var control = []; // Methods that need to process input
ansi.send('ext_mode','clear','cursor');
@ -47,19 +48,46 @@ while(bbs.online) {
read = console.inkey(K_NONE,inkey_timeout);
}
log(LOG_DEBUG,'READ: ['+read+'] ('+read.charCodeAt(0)+')');
inkey_timeout = 60000; // Set our key timeout to 60s
if (read == '' && ! (user.security.exemptions&UFLAG_H) ) {
if (timeout++ > 1) {
sendBaseline(INACTIVE,false);
bbs.hangup();
} else {
sendBaseline(INACTIVITY,false);
if (cf)
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
}
} else {
if (timeout) {
sendBaseline('',false);
if (cf)
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
}
timeout = 0;
}
system.node_list[bbs.node_num-1].action=0xff; // to ensure our node status is updated correctly
if (mode != MODE_BL && control.length) {
cc = control[control.length-1];
log(LOG_DEBUG,'CONTROL START: ['+read+'] ('+cc+')');
log(LOG_DEBUG,'CONTROL START: ['+read+'] ('+cc.getName+')');
read = cc.handle(read);
log(LOG_DEBUG,'CONTROL RETURN: ['+read+'] ('+cc.isComplete+')');
if (cc.isComplete) {
control = control.pop();
log(LOG_DEBUG,'CONTROL COMPLETE: ['+read+'] ('+control.length+')');
}
log(LOG_DEBUG,'CONTROL END: ['+read+']');
}
log(LOG_DEBUG,'MODE START: ['+read+']');
log(LOG_DEBUG,'MODE START: ['+read.charCodeAt(0)+']');
switch (mode) {
case false:
log(LOG_DEBUG,'- false: ['+read+']');
@ -259,7 +287,7 @@ while(bbs.online) {
// End of field entry.
case '#':
case '\r':
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: ['+read+']');
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: # ['+read+']');
// Next Field
fn++;
@ -292,7 +320,7 @@ while(bbs.online) {
// Delete Key pressed
case CTRL_H:
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: ['+read+']'+' cf:'+(cf ? cf.fvalue.length : '{}')+' ct:'+cf.ftype);
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: DEL ['+read+']'+' cf:'+(cf ? cf.fvalue.length : '{}')+' ct:'+cf.ftype);
if (cf.fvalue.length > 0) {
cf.fvalue = cf.fvalue.substring(0,cf.fvalue.length-1);
@ -302,7 +330,52 @@ while(bbs.online) {
break;
case KEY_ESC:
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: ['+read+'] D');
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: ESC ['+read+']');
break;
case KEY_DOWN:
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: DOWN ['+read+']');
// Next Field
fn++;
cf = fo.frame_fields[fn];
log(LOG_DEBUG,'fn:'+fn+', cf'+JSON.stringify(cf));
if (! cf) {
fn = 0;
cf = fo.frame_fields[fn];
}
// If there is a control for this field,
if (cc)
cc.prefield();
mode = MODE_FIELD;
console.gotoxy(cf.c+cf.fvalue.length,cf.r);
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
break;
case KEY_UP:
log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_RESPONSE: UP ['+read+']');
// Next Field
fn--;
if (fn < 0) {
fn = fo.frame_fields.length-1;
}
cf = fo.frame_fields[fn];
log(LOG_DEBUG,'fn:'+fn+', cf'+JSON.stringify(cf));
// If there is a control for this field,
if (cc)
cc.prefield();
mode = MODE_FIELD;
console.gotoxy(cf.c+cf.fvalue.length,cf.r);
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
break;
// Record Data Entry
@ -363,6 +436,12 @@ while(bbs.online) {
log(LOG_DEBUG,' ! Login failed for User:'+JSON.stringify(fo.frame_fields[0].fvalue));
break;
default:
// Its assumed that you get here after completing a form and you have pressed 1 to submit that form.
log(LOG_DEBUG,' ! EVAL method:'+JSON.stringify(fo.key));
x = cc.process();
log(LOG_DEBUG,' = EVAL method:'+JSON.stringify(x));
}
/*
@ -421,6 +500,9 @@ while(bbs.online) {
break;
}
// Destroy the object.
cc = null;
break;
// Response form after Sent processing
@ -651,18 +733,6 @@ while(bbs.online) {
case FRAME_TYPE_LOGIN:
action = false;
/*
// If this is the registration page
// @todo Should be evaluated out of the DB
if ($this->fo->page() == '981a') {
$control = CONTROL_METHOD;
$method->push(Control::factory('register',$this));
$method->last()->state['control'] = $control;
$method->last()->state['action'] = FALSE;
$method->last()->state['mode'] = MODE_FIELD;
}
*/
case FRAME_TYPE_RESPONSE:
//log(LOG_DEBUG,'FRAME_TYPE_RESPONSE :'+fo.page+', FIELDS: '+fo.frame_fields.count);
fn = 0;
@ -693,8 +763,8 @@ while(bbs.online) {
// @todo this needs to be configurable
if (fo.page == '981a') {
log(LOG_DEBUG,'Adding REGISTER to control stack');
require('ansitex/load/register.js','CONTROL_REGISTER');
control.push(new register());
require('ansitex/load/'+fo.key[1]+'.js','CONTROL_REGISTER');
control.push(eval("new "+fo.key[1]+'();'));
}
break;

View File

@ -63,10 +63,10 @@ if (! send || ! frame || file) {
// Public
if (argv.indexOf('-P') >= 0)
frame.isPublic = 1;
frame.isPublic = true;
if (argv.indexOf('-A') >= 0)
frame.isAccessible = 1;
frame.isAccessible = true;
if (cost)
frame.cost = cost;

View File

@ -1 +1 @@
{"version":1,"frame":11,"index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"G1swbRtbMW3fG1swbdsbWzE7MzBt3xtbMG3fG1sxbdsbWzBtICDfICAgIBtbMTszMG3fG1swbdsgICAgICAgIBtbMW3bG1swbdwgIBtbMW3bG1swbSAgICAgICAg2yAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFtXxtbMG0NChtbMW0gG1swbdsbWzE7MzBt3BtbMG3cICAbWzFt3xtbMG3bICAg3BtbMTszMG3cG1swbdsgIBtbMW3cG1swbd8bWzE7MzBt3xtbMG3fG1sxbdwbWzBtIBtbMW3bG1swbSAbWzE7MzBt3xtbMG3cG1sxbdsbWzBtIBtbMW3cG1swbd8bWzE7MzBt3xtbMG3fG1sxbdwbWzBtIBtbMW3fG1swbdsbWzE7MzBt3xtbMG3fICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMW0vICBcG1swbQ0KG1sxbSAbWzBt2xtbMTszMG0gICAgIBtbMG3bICAbWzFt2xtbMG0gINsgIBtbMW3bG1swbSAgIBtbMW3bG1swbSAbWzFt2xtbMG0gICAbWzFt2xtbMG0gG1sxbdsbWzBt3xtbMTszMG3fG1swbd8bWzFt3xtbMG0gINsbWzE7MzBtIBtbMG3cIBtbMW13b3JrcxtbMG0uICAgICAgICAgICAgICAgICAgICAbWzFtL3xvbyBcG1swbQ0KG1sxbd8bWzBt3xtbMTszMG3fG1swbSAgIBtbMW3fG1swbd8bWzE7MzBt3xtbMG0gIN8bWzE7MzBt3xtbMG0gG1sxbd8bWzBtICDfG1sxOzMwbd8bWzBt3yAgG1sxbd8bWzBtICAgG1sxbd8bWzBtICDfG1sxOzMwbd8bWzBt3yAgICAbWzE7MzBt3xtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFtKF98ICAvXykbWzBtDQobWzMxbUZUTjogG1sxbUZpZG8gVGVjaG5vbG9neSBOZXR3b3JrcxtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzMxbV8bWzE7MzdtYEAvG1swOzMxbV8bWzM3bSAbWzFtXCAgICBfG1swbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMzFtfCAgICAgfBtbMzdtIBtbMW1cICAgXFwbWzBtDQogG1szMm0xG1sxbSAbWzM3bVByaXZhdGVOZXQgKEludGVybmFsIFRlc3QgTmV0d29yaykbWzBtIBtbMzJtKjMwMDEwIxtbMzdtICAgICAgICAgICAgICAgICAgIBtbMzFtfCAbWzE7MzBtKCopG1swbSAbWzMxbXwbWzM3bSAgG1sxbVwbWzBtICAgG1sxbSkpG1swbQ0KIBtbMTszMm0yIBtbMzdtZnN4TmV0IChGdW4gU2ltcGxlIEV4cGVyaW1lbnRhbCBOZXR3b3JrKRtbMG0gG1sxOzMybSozMDAyMSMbWzBtICAgIBtbMTszMG1fX19fX18gICAbWzA7MzFtfF9fG1sxOzMwbVUbWzA7MzFtX198G1szN20gG1sxbS8gIFwvLxtbMG0NCiAbWzMybTMbWzE7MzdtIERPVkVuZXQbWzMybSAbWzA7MzJtKjMwNzIzIxtbMzdtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxOzMwbS8gG1swbUZJRE8gG1sxOzMwbVwbWzBtICAgG1sxbV8vL3x8IF9cICAgLxtbMG0NCiAbWzMybTQbWzFtIBtbMzdtdHF3TmV0IChUaGUgUXVhbnRvbSBXb3Jtd2hvbGUpG1swbSAbWzMybSozMTMzNyMbWzM3bSAgICAgICAgICAgIBtbMTszMG0oX19fX19fX18pG1swbSAbWzFtKF8vKF98KF9fX18vG1swbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqbSkNCiAbWzE7MzBtT3RoZXIgbmV0d29ya3Mgd2lsbCBiZSBhZGRlZCBpbiB0aW1lLi4uG1swbQ0K","isPublic":true,"isAccessible":true,"key":[1,30010,30021,30723,31337,null,null,null,null,null],"date":"2019-10-17T05:22:13.225Z","type":"i"}
{"version":1,"frame":11,"index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"G1swbRtbMW3fG1swbdsbWzE7MzBt3xtbMG3fG1sxbdsbWzBtICDfICAgIBtbMTszMG3fG1swbdsgICAgICAgIBtbMW3bG1swbdwgIBtbMW3bG1swbSAgICAgICAg2yAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFtXxtbMG0NChtbMW0gG1swbdsbWzE7MzBt3BtbMG3cICAbWzFt3xtbMG3bICAg3BtbMTszMG3cG1swbdsgIBtbMW3cG1swbd8bWzE7MzBt3xtbMG3fG1sxbdwbWzBtIBtbMW3bG1swbSAbWzE7MzBt3xtbMG3cG1sxbdsbWzBtIBtbMW3cG1swbd8bWzE7MzBt3xtbMG3fG1sxbdwbWzBtIBtbMW3fG1swbdsbWzE7MzBt3xtbMG3fICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMW0vICBcG1swbQ0KG1sxbSAbWzBt2xtbMTszMG0gICAgIBtbMG3bICAbWzFt2xtbMG0gINsgIBtbMW3bG1swbSAgIBtbMW3bG1swbSAbWzFt2xtbMG0gICAbWzFt2xtbMG0gG1sxbdsbWzBt3xtbMTszMG3fG1swbd8bWzFt3xtbMG0gINsbWzE7MzBtIBtbMG3cIBtbMW13b3JrcxtbMG0uICAgICAgICAgICAgICAgICAgICAbWzFtL3xvbyBcG1swbQ0KG1sxbd8bWzBt3xtbMTszMG3fG1swbSAgIBtbMW3fG1swbd8bWzE7MzBt3xtbMG0gIN8bWzE7MzBt3xtbMG0gG1sxbd8bWzBtICDfG1sxOzMwbd8bWzBt3yAgG1sxbd8bWzBtICAgG1sxbd8bWzBtICDfG1sxOzMwbd8bWzBt3yAgICAbWzE7MzBt3xtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFtKF98ICAvXykbWzBtDQobWzMxbUZUTjogG1sxbUZpZG8gVGVjaG5vbG9neSBOZXR3b3JrcxtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzMxbV8bWzE7MzdtYEAvG1swOzMxbV8bWzM3bSAbWzFtXCAgICBfG1swbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMzFtfCAgICAgfBtbMzdtIBtbMW1cICAgXFwbWzBtDQogG1szMm0xG1sxbSAbWzM3bVByaXZhdGVOZXQgKEludGVybmFsIFRlc3QgTmV0d29yaykbWzBtIBtbMzJtKjEwMDEwIxtbMzdtICAgICAgICAgICAgICAgICAgIBtbMzFtfCAbWzE7MzBtKCopG1swbSAbWzMxbXwbWzM3bSAgG1sxbVwbWzBtICAgG1sxbSkpG1swbQ0KIBtbMTszMm0yIBtbMzdtZnN4TmV0IChGdW4gU2ltcGxlIEV4cGVyaW1lbnRhbCBOZXR3b3JrKRtbMG0gG1sxOzMybSoxMDAyMSMbWzBtICAgIBtbMTszMG1fX19fX18gICAbWzA7MzFtfF9fG1sxOzMwbVUbWzA7MzFtX198G1szN20gG1sxbS8gIFwvLxtbMG0NCiAbWzMybTMbWzE7MzdtIERPVkVuZXQbWzMybSAbWzA7MzJtKjEwNzIzIxtbMzdtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxOzMwbS8gG1swbUZJRE8gG1sxOzMwbVwbWzBtICAgG1sxbV8vL3x8IF9cICAgLxtbMG0NCiAbWzMybTQbWzFtIBtbMzdtdHF3TmV0IChUaGUgUXVhbnRvbSBXb3Jtd2hvbGUpG1swbSAbWzMybSoxMTMzNyMbWzM3bSAgICAgICAgICAgIBtbMTszMG0oX19fX19fX18pG1swbSAbWzFtKF8vKF98KF9fX18vG1swbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqbSkNCiAbWzE7MzBtT3RoZXIgbmV0d29ya3Mgd2lsbCBiZSBhZGRlZCBpbiB0aW1lLi4uG1swbQ0K","isPublic":false,"isAccessible":true,"type":"i","key":[1,10010,10021,10723,11337,null,null,null,null,null],"frame_fields":[],"date":"2020-07-08T05:24:57.759Z"}

View File

@ -1 +1 @@
{"version":1,"frame":"981","index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQogG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbSAgICAgICAgIBtbMW0uG1szNm0gICAgICAgICAgG1szN20uG1swbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtICAgG1sxbcK/wr/Cv7/av8Mtwr/Cv8Mtv9q/2r8NChtbMG0gG1sxOzMxbbGwG1swbSAbWzE7MzFtsBtbMG0gG1sxOzMybbGwG1swbSAbWzE7MzJtsBtbMG0gG1sxOzM0bbGwG1swbSAbWzE7MzRtsBtbMG0gG1sxOzMzbbGwG1swbSAbWzMwOzQ3bSCxsCCwILGwILAgsbAgsCAbWzM3OzQwbSAgILMgw9mzs7PAv7MgsyDCtLMgs7Ozs7MNCiAbWzE7MzFt39/E3xtbMG0gG1sxOzMybd/fG1swbSAbWzE7MzJt3xtbMG0gG1sxOzM0bd/fxN8bWzBtIBtbMTszM23f3xtbMG0gG1szMDs0N20g39/E3yDf38TfIN/fIN8gG1szNzs0MG0gICAbWzE7MzBt2RtbMzZtIBtbMzBtwdnBtNnA2cDZ2RtbMzZtIBtbMzBtwcHA2dnA2dnZG1swbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0gICAgICAbWzE7MzBtxNkbWzM3bQ0KG1swbQ0KG1sxbSBQbGVhc2UgY29tcGxldGUgdGhlIHVzZXIgcmVnaXN0cmF0aW9uOhtbMG0NCg0KICAgICAgG1sxOzMxbUVtYWlsOhtbMG0gG1sxbRtfRU1BSUw7NjB0O/kbXBtbMG0NCiAgICAbWzE7MzFtVXNlciBJRDobWzBtIBtbMW0bX1VJRDsyNXQ7+RtcG1swbQ0KICAgG1sxOzMxbVBhc3N3b3JkOhtbMG0gG1sxbRtfUEFTUzs0MHA7+RtcG1swbQ0KICAbWzE7MzFtRnVsbCBOYW1lOhtbMG0gG1sxbRtfRlVMTE5BTUU7MjV0O/kbXBtbMG0NCiAgICAgICAbWzE7MzFtQ2l0eTobWzBtIBtbMW0bX0NJVFk7MjV0O/kbXBtbMG0NCiAgICAbWzE7MzFtQ291bnRyeTobWzBtIBtbMW0bX0NOVFJZOzN0O/kbXBtbMG0NChtbMTszMW1Qb3N0YWwgQ29kZTobWzBtIBtbMW0bX1BDT0RFOzEwdDv5G1wbWzBtDQogICAgICAbWzE7MzFtVG9rZW46G1swbSAbWzFtG19UT0tFTjs2dDv5G1wbWzBtDQoNCiAbWzFtUmVnaXN0ZXJpbmcgYW5kIHVzaW5nIHRoaXMgc3lzdGVtLCB5b3UgYWdyZWUgdG8gYWJpZGUgYnkgdGhlIHN5c3RlbSBydWxlcy4bWzBtDQogG1sxbVlvdSBjYW4gdmlldyB0aG9zZSBydWxlcyBvbiBwYWdlIBtbMzJtKjk4OCMbWzM3bS4bWzBtDQo=","isPublic":true,"isAccessible":true,"type":"r","key":[980,"register",null,null,null,null,null,null,null,null],"frame_fields":[],"date":"2020-07-06T11:09:47.037Z"}
{"version":1,"frame":"981","index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"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","isPublic":true,"isAccessible":true,"type":"r","key":[980,"register",null,null,null,null,null,null,null,null],"frame_fields":[],"date":"2020-07-09T11:42:40.643Z"}

View File

@ -1 +1 @@
{"version":1,"frame":98,"index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"G1swbRtbNjlDG1sxOzMybTAwMDEwMDAxMDEbWzBtDQobWzU1QxtbMW1AREFURVRJTUVAG1swbQ0KG1syMkMbWzFt2iC/wr+z2r/av9rCv8K/G1swbSAbWzFtwy3avxtbMG0NChtbMjJDs7Ozw9mzsyCzs7Mgs8PZG1szMG3bG1szN22zILOzDQobWzIyQxtbMTszMG3AwdnB2cDA2cDZwCDZwdkbWzBtIBtbMTszMG3A2cDZG1swbSAbWzE7MzBt+vr6G1swbQ0KG1syMkMbWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbQ0KG1syM0MbWzE7MzFt3NzE3BtbMzdtIBtbMzJt3NzE3BtbMzdtIBtbMzRt3NzE3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtINzcICAg3NzE3CDc3CDcIBtbMzc7NDBtDQobWzIzQxtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtDQobWzIzQxtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0NChtbMjNDG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtDQobWzIyQxtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQobWzRDG1sxbS4gICAgIC4gICDaG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMW2/G1swbQ0KG1syQxtbMW3av7/Cv9q/IL/avxtbMG0gG1sxOzMwbbMbWzBtIBtbMTszMW1VU0VSOhtbMG0gG1sxbRtfVVNFUjsyNXQ7+RtcG1swbSAgICAgICAgICAgICAgICAbWzE7MzBtsxtbMG0NChtbMkPAv7Ozs7OzILOzsyAbWzE7MzBtwxtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzE7MzBttBtbMG0NChtbMkMbWzE7MzBtwNnZwbTZ2RtbMzdtIBtbMzBt2dnZG1szN20gG1szMG2zG1swbSAbWzE7MzFtUEFTUzobWzBtIBtbMW0bX1BBU1M7NDBwO/kbXBtbMG0gG1sxOzMwbbMbWzBtDQobWzVDG1sxOzMwbcTZG1swbSAgICAgICAbWzFtwBtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFt2RtbMG0NCg0KDQoNCg0KG1sxM0MbWzE7MzBtVG8gcmVnaXN0ZXIgYW4gYWNjb3VudCBlbnRlchtbMG0gG1sxbU5FVxtbMG0gG1sxOzMwbWZvciB0aGUgdXNlciBuYW1lG1swbQ0KG1sxNkMbWzE7MzBtVXNlG1swbSAbWzE7MzJtKiobWzBtIBtbMTszMG10byBjbGVhciB5b3VyIGlucHV0G1swbSAbWzE7MzJtKjAwG1swbSAbWzE7MzBtdG8gc3RhcnQgYWdhaW4bWzBtDQo=","isPublic":true,"isAccessible":true,"type":"l","key":[null,"login",null,null,null,null,null,null,null,null],"frame_fields":[],"date":"2020-07-06T13:38:58.689Z"}
{"version":1,"frame":98,"index":"a","owner":"AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==","cost":0,"content":"G1swbRtbNjlDG1sxOzMybTAwMDEwMDAxMDEbWzBtDQobWzU1QxtbMW1AREFURVRJTUVAG1swbQ0KG1syMkMbWzFt2iC/wr+z2r/av9rCv8K/G1swbSAbWzFtwy3avxtbMG0NChtbMjJDs7Ozw9mzsyCzs7Mgs8PZG1szMG3bG1szN22zILOzDQobWzIyQxtbMTszMG3AwdnB2cDA2cDZwCDZwdkbWzBtIBtbMTszMG3A2cDZG1swbSAbWzE7MzBt+vr6G1swbQ0KG1syMkMbWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbQ0KG1syM0MbWzE7MzFt3NzE3BtbMzdtIBtbMzJt3NzE3BtbMzdtIBtbMzRt3NzE3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtINzcICAg3NzE3CDc3CDcIBtbMzc7NDBtDQobWzIzQxtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtDQobWzIzQxtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0NChtbMjNDG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtDQobWzIyQxtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQobWzRDG1sxbS4gICAgIC4gICAbWzMwbbMbWzBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxOzMwbbMbWzBtDQobWzJDG1sxbdq/v8K/2r8gv9q/G1swbSAbWzE7MzBtsxtbMG0gG1sxOzMxbVVTRVI6G1swbSAbWzFtG19VU0VSOzI1dDv5G1wbWzBtICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KG1syQ8C/s7Ozs7Mgs7OzIBtbMTszMG2zG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KG1syQxtbMTszMG3A2dnBtNnZG1szN20gG1szMG3Z2dkbWzM3bSAbWzMwbbMbWzBtIBtbMTszMW1QQVNTOhtbMG0gG1sxbRtfUEFTUzs0MHA7+RtcG1swbSAbWzE7MzBtsxtbMG0NChtbNUMbWzE7MzBtxNkbWzBtICAgICAgIBtbMTszMG2zG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KDQoNCg0KDQobWzEzQxtbMTszMG1UbyByZWdpc3RlciBhbiBhY2NvdW50IGVudGVyG1swbSAbWzFtTkVXG1swbSAbWzE7MzBtZm9yIHRoZSB1c2VyIG5hbWUbWzBtDQobWzE2QxtbMTszMG1Vc2UbWzBtIBtbMTszMm0qKhtbMG0gG1sxOzMwbXRvIGNsZWFyIHlvdXIgaW5wdXQbWzBtIBtbMTszMm0qMDAbWzBtIBtbMTszMG10byBzdGFydCBhZ2FpbhtbMG0NCg==","isPublic":true,"isAccessible":true,"type":"l","key":[null,"login",null,null,null,null,null,null,null,null],"frame_fields":[],"date":"2020-07-08T05:17:35.174Z"}