If you have a backup code you exported from another copy of Toast Wallet you can import it here. Doing so will create a copy of that wallet on this device.
@@ -347,42 +344,34 @@
The data below is your encrypted wal
-
+
IMPORTANT!!!
-
-
-
-
This is what you must keep secure:
-
-
Passphrase — you just set this
-
Recovery phrase — appears below
-
Backup code — you will get this later
-
-
-
Your recovery phrase can ONLY change your passphrase. It is not a backup.
-
We cannot help you if you lose both your passphrase and recovery phrase. Nor can we help you if you lose your backup code. No data is sent to our servers. You are responsible for your data.
-
-
-
-
+
Your six(6) word recovery phrase appears below. Write it down on paper and store it in a safe location. If you ever forget your passphrase this code will be the
-
-
I sincerely promise I've written my recovery phrase down.
-
-
-
-
I understand that the recovery phrase IS NOT A WALLET BACKUP.
-
+ color:red;
+
+ ">only way for you to regain access to your XRP.
+ Never share your recovery phrase with anyone.
+
+
This recovery phrase is useless without a backup. Please make a backup using the settings menu after you finish adding or generating all of your addresses. Toast Wallet backups are data backups, this means you will only have access to the addresses you had in your wallet at the time you made the backup!
+
+
-
+
+
+I sincerely promise I've written my recovery phrase down.
+
+
+I understand that the recovery phrase IS NOT A WALLET BACKUP.
WARNING—You must import this address into your wallet before you send anything to it.
+
@@ -661,7 +651,7 @@
IMPORTANT!!!
-
Once imported your address will need to be activated by sending XRP to it. You cannot send to it until you have imported it.
+
Once imported your address will need to be activated by sending XRP to it.
@@ -713,7 +703,7 @@
IMPORTANT!!!
-
+
@@ -738,11 +728,7 @@
IMPORTANT!!!
-
-
-
-
-
+
Connection Issue
Toast Wallet is unable to connect either because your device has no network connectivity, or because the public gateway servers Toast Wallet uses to connect to the Ripple network are down or under heavy load—this has nothing to do with the Ripple network itself, only the servers that Toast Wallet uses to access the network.
@@ -767,8 +753,8 @@
Connection Issue
-
Version: 2.1.38
-
+
Version: 2.1.37
+
Connected to:
@@ -793,7 +779,7 @@
Connection Issue
-
+
Your recovery phrase is NOT a backup
@@ -813,7 +799,7 @@
Your recovery phrase is NOT a backup
-
+
Toast Wallet
@@ -833,7 +819,7 @@
Toast Wallet
-
+
IMPORTANT NOTICE—
@@ -943,12 +929,9 @@
Toast Wallet
-
-
-
If you do not agree then close and uninstall this application.
}
function refreshAccounts() {
- // delete all accounts in the list then readd them from pouchdb
+ // delete all accounts in the list then readd them from puchdb
var acc = $(".accountitem");
-/* for (var i = 0; i < acc.length; i++) {
+ for (var i = 0; i < acc.length; i++) {
acc[i].remove();
}
-*/
+
$("#payfromaccount").empty();
getAccounts(function(acc) {
accountbalances = {};
for (var i in acc) {
var nickname = ( acc[i].nickname == undefined ? "" : acc[i].nickname.replace(/[^a-zA-Z0-9 ]/g, "").trim() );
-
- var html = '
var userkey = ""; // user's sha1 of passphrase used to decrypt wallet secrets
var screentabpaddingbottom = 0; // we use this when calcualting keyboard offset
-function showTab(tab, dontClearText, isReverseTransition) {
-
- var reverseTransition = ( isReverseTransition != undefined && isReverseTransition );
- var transitioncss = "all .15s ease";
-
-
- if (debug) console.log("showTab(" + tab + ")");
+function showTab(tab, dontClearText) {
if (tab == currenttab) return;
blockInput(true);
- setTimeout(()=>{
- unblockInput();
- renderMoreContentIndicator();
- }, 350);
+ if (debug) console.log("showTab(" + tab + ")");
document.activeElement.blur();
@@ -1876,40 +1843,10 @@
Toast Wallet
}
}
-
-
$("#navheader").show();
-
- // arrange such that the other primary tabs are to the left or right of the current tab depending on their order in the menu
- // do this before we change tabs of course
- var currentprimary = $(currenttab).data('primarytab') ? currenttab : "";
- if (currentprimary == "") {
- for (var n = 0; n < previoustabs.length; n++) {
- if ($(previoustabs[n]).data('primarytab')) {
- currentprimary = previoustabs[n];
- break;
- }
- }
- }
-
- $('#tablogin').css('left', '-100vw');
-
- if (currentprimary == '#tabaccounts') {
- $('#tabpayments').css('left', '100vw');
- $('#tabsettings').css('left', '100vw');
- } else if (currentprimary == '#tabpayments') {
- $('#tabaccounts').css('left', '-100vw');
- $('#tabsettings').css('left', '100vw');
- } else if (currentprimary == '#tabsettings') {
- $('#tabpayments').css('left', '-100vw');
- $('#tabaccounts').css('left', '-100vw');
- }
-
-
-
if (tab == -1) {
@@ -1920,9 +1857,7 @@
currenttab = tab;
}
- if ($(tab).data('primarytab')) {
- // check if the tab we're about to show is in the unwind list and if so reverse the slide transition
- for (var i = 0; i < previoustabs.length; i++) {
- if (previoustabs[i] == tab) {
- reverseTransition = true;
- break;
- }
- }
- previoustabs = [];
-
- }
+ if ($(tab).data('primarytab')) previoustabs = [];
if (tab != "#tabqrscan" && scanner != undefined) {
scanner.stop();
@@ -2022,34 +1947,10 @@
var updateaccs = function(exchangerate, after){
getAccounts(function(acc) {
accountbalances = {};
+ accountbalancestl = {};
+ accountflags = {};
var lastacc;
for (var i in acc) lastacc = i;
@@ -2241,13 +2436,21 @@
Toast Wallet
trustlinesdropdown[account] = {};
+ accountbalancestl[account] = {};
+
+ // store the account's set flags for use later
+ if (res['flags'] != undefined) {
+ accountflags[account] = res['flags'];
+ }
+
if (res['trustlines'] != undefined && typeof(res['trustlines']) == 'object' &&
res['trustlines'].length != undefined && res['trustlines'].length > 0) {
-
+ // these are cumulative balances for display purposes that discard issuer; true balances are kept in accountbalancestl
tlbalances = {};
+
for (t in res['trustlines']) {
var tl = res['trustlines'][t];
var issuer, currency, balance;
@@ -2257,17 +2460,19 @@
Toast Wallet
// in the specification there is an optional 40 character setting for currency, we can't display that here and displaying a turncated
// version may lead to people being manipulated into thinking they have another currency.
if (currency.length > 3) currency = 'UNKNOWN';
-
- if (currency == 'USD') currency = '*USD';
-
+
+ // update display balance record
if (currency in tlbalances) {
tlbalances[currency] += parseFloat("" + balance);
} else {
tlbalances[currency] = parseFloat("" + balance);
}
- // populate the dropdown for this account
+ // update the official balance record
+ if (!(currency in accountbalancestl[account])) accountbalancestl[account][currency] = {};
+ accountbalancestl[account][currency][issuer] = parseFloat("" + balance);
+ // populate the dropdown for this account
if (trustlinesdropdown[account] == undefined) trustlinesdropdown[account] = {};
trustlinesdropdown[account]["" + currency + issuer] = '';
@@ -2591,6 +2796,9 @@
Toast Wallet
var previoustabs = [];
var activeaccount = "";
var accountbalances = {};
+var accountbalancestl = {};
+var accountflags = {};
+
var userkey = ""; // user's sha1 of passphrase used to decrypt wallet secrets
var screentabpaddingbottom = 0; // we use this when calcualting keyboard offset
@@ -2663,9 +2871,11 @@
Toast Wallet
}
if (tab == "#tabaccounts" || tab == "#tabpayments") {
- // force refresh this box to default XRP entry because the load time might be long depending on the connection
- $('#payasset')[0].innerHTML = '';
- refreshAccounts( onPaymentSelectFromAccount );
+ if ( dontClearText == undefined || dontClearText == false ) {
+ $('#payasset')[0].innerHTML = '';
+ if (tab == "#tabpayments") clearPaymentScreen();
+ refreshAccounts( onPaymentSelectFromAccount );
+ }
} else if (tab == "#tabaccountsecret") {
$("#divrsecaccpassword").show();
$("#lblacpassword").show();
@@ -2682,7 +2892,15 @@
Toast Wallet
$("#atltabredqr").append(kjua({text: account, fill:"#ff0000"}));
$('#atlofflinecodediv').css('display', 'block')
+ } else if (tab == '#tabaccountflags' && offlinemode) {
+
+ var account = $("#afaddress").data('content');
+ $("#aftabredqr").empty();
+ $("#aftabredqr").append(kjua({text: account, fill:"#ff0000"}));
+ $('#afofflinecodediv').css('display', 'block')
+
}
+
if (tab == '#tabpayments') {
var to = $('#toaddress').val();
if (to == 'rToastMYRQh8boeo5Ys1CnPySmt3c9x3Y') {
@@ -2960,6 +3178,17 @@
navigator.notification.alert("A QR code of this signed transaction has been generated. Scan it using your online device to complete the transaction.",
function(){
- return sendXRPOffline(passphrase, confirmpay.payfrom, parseFloat(confirmpay.amount), confirmpay.payto, 0, confirmpay.dest, confirmpay.invid, confirmpay.accseqid, confirmpay.ledseqid, confirmpay.fee);
+ return sendPaymentOffline(passphrase, confirmpay.payfrom, parseFloat(confirmpay.amount), confirmpay.payto, 0, confirmpay.dest, confirmpay.invid, confirmpay.asset, confirmpay.issuer, confirmpay.accseqid, confirmpay.ledseqid, confirmpay.fee);
},
"Offline Transaction",
"OK"
@@ -3003,7 +3232,7 @@
}
+function doConfirmAccountFlags(passphrase) {
+ if (debug) console.log("doConfirmAccountFlags");
+ if (confirmfl.nonce == lastsetflagsnonce) {
+ // this is an accidental double tap
+ return;
+ }
+ blockInput();
+
+ lastsetflagsnonce = confirmfl.nonce;
+ validatePassphrase(passphrase, false,
+ function() {
+ if (confirmfl == undefined || confirmfl.nonce == undefined || sodium.crypto_generichash(16, JSON.stringify(confirmfl), ''+confirmfl.nonce, 'hex') != confirmflhash ) {
+ navigator.notification.alert("An error occured when trying to submit your settings change request. No settings change occured.",
+ function(){
+ showTab(-1);
+ unblockInput();
+ },
+ "Error",
+ "OK"
+ );
+ return;
+ }
+
+
+ if (offlinemode) {
+ // we're just going to create the tx as a QR code and display it
+
+ navigator.notification.alert("A QR code of this signed account-flags transaction has been generated. Scan it using your online device to complete the transaction.",
+ function(){
+ return sendAccountFlagsTxOffline(passphrase, confirmfl.afaddress, confirmfl.defaultRipple, confirmfl.depositAuth, confirmfl.disableMasterKey, confirmfl.disallowIncomingXRP, confirmfl.globalFreeze, confirmfl.noFreeze, confirmfl.requireAuthorization, confirmfl.requireDestinationTag, confirmfl.accseqid, confirmfl.ledseqid, confirmfl.fee);
+ },
+ "Offline Transaction",
+ "OK"
+ );
+
+ return;
+ }
+
+ checkConnection(
+ function(){
+ sendAccountFlagsTx(passphrase, confirmfl.afaddress, confirmfl.defaultRipple, confirmfl.depositAuth, confirmfl.disableMasterKey, confirmfl.disallowIncomingXRP, confirmfl.globalFreeze, confirmfl.noFreeze, confirmfl.requireAuthorization, confirmfl.requireDestinationTag,
+ function(wasqueued){
+ navigator.notification.alert("Your account flags transaction was " + ( wasqueued ? "queued, and should be executed shortly." : "executed." ),
+ function(){
+ clearPaymentScreen();
+ showTab("#tabaccounts");
+ unblockInput();
+ }, "Success", "OK");
+ },
+ function(err) {
+ navigator.notification.alert("An error occured when trying to set your account flags. " + err,
+ function(){
+ lasttrustlinenonce = "";
+ showTab(-1);
+ unblockInput();
+ },
+ "Error", "OK");
+ }
+ );
+ }
+ );
+ },
+ function() {
+ navigator.notification.alert("Your passphrase is incorrect. You cannot use a recoveryphrase here.",
+ function(){
+ lasttrustlinenonce = "";
+ unblockInput();
+ },
+ "Error", "OK"
+ );
+ },
+ function() {
+ navigator.notification.alert("Could not set account flags due to possible wallet corruption. We recommend backing up your wallet and reinstalling.",
+ function(){
+ lasttrustlinenonce = "";
+ unblockInput();
+ },
+ "Error",
+ "OK"
+ );
+ }
+ );
+}
+
+
function doConfirmTrustline(passphrase) {
if (debug) console.log("doConfirmTrustline");
if (confirmtl.nonce == lasttrustlinenonce) {
@@ -3282,7 +3596,7 @@
Toast Wallet
};
- checkAccountIsFunded(atladdress, 5, function(){
+ checkAccountIsFunded(atladdress, 5, 'XRP', '', function(){
navigator.notification.confirm("You must have " + xrpreserve + " XRP + 5 XRP for each trustline in the account you are sending from. This reserve is a Ripple network requirement. In some circumstances this message may appear in error if you believe that to be the case you can opt to attempt the transaction however this will attract a Ripple network fee." ,
function(b){
if (debug) console.log("button selected: " + b);
@@ -3305,6 +3619,104 @@
Toast Wallet
}
+
+
+var lastsetflagsnonce;
+var confirmfl = {};
+var confirmflhash = "";
+
+function doSetAccountFlags(nonce) {
+
+ if (debug) console.log("doSetAccountFlags");
+ blockInput();
+
+ var afaddress = $("#afaddress").val().trim();
+
+ var defaultRipple = $('#tglDefaultRipple').data('checked');
+ var depositAuth = $('#tglDepositAuth').data('checked');
+ var disableMasterKey = $('#tglDisableMasterKey').data('checked');
+ var disallowIncomingXRP = $('#tglDisallowIncomingXRP').data('checked');
+ var globalFreeze = $('#tglGlobalFreeze').data('checked');
+ var noFreeze = $('#tglNoFreeze').data('checked');
+ var requireAuthorization = $('#tglRequireAuthorization').data('checked');
+ var requireDestinationTag = $('#tglRequireDestinationTag').data('checked');
+
+
+ var offlinecode = $('#afofflinecode').val().trim().replace(/ /g, "").toUpperCase();
+ var accID = '';
+ var ledID = '';
+ var fee = '';
+
+
+ if (offlinemode) {
+ ofl = validateOfflineCode(offlinecode, '#atlofflinecode');
+ if (ofl === false) return;
+
+ accID = ofl.accID;
+ ledID = ofl.ledID;
+ fee = ofl.fee;
+ }
+
+
+ var nextscreen = function() {
+ confirmfl = {
+ afaddress: afaddress,
+ defaultRipple: defaultRipple,
+ depositAuth: depositAuth,
+ disableMasterKey: disableMasterKey,
+ disallowIncomingXRP: disallowIncomingXRP,
+ globalFreeze: globalFreeze,
+ noFreeze: noFreeze,
+ requireAuthorization: requireAuthorization,
+ requireDestinationTag: requireDestinationTag,
+ nonce: nonce,
+ accseqid: accID, // used for offline tx
+ ledseqid: ledID,
+ fee: fee
+ };
+
+ confirmflhash = sodium.crypto_generichash(16, JSON.stringify(confirmfl), ''+nonce, 'hex');
+
+ $('#cafaddress')[0].innerText = afaddress;
+ $('#cafdefaultripple')[0].innerText = '' + defaultRipple;
+ $('#cafdepositauth')[0].innerText = '' + depositAuth;
+ $('#cafdisablemasterkey')[0].innerText = '' + disableMasterKey;
+ $('#cafdisallowincomingxrp')[0].innerText = '' + disallowIncomingXRP;
+ $('#cafglobalfreeze')[0].innerText = '' + globalFreeze;
+ $('#cafnofreeze')[0].innerText = '' + noFreeze;
+ $('#cafrequireauthorization')[0].innerText = '' + requireAuthorization;
+ $('#cafrequiredestinationtag')[0].innerText = '' + requireDestinationTag;
+
+ showTab("#tabaccountflagsconfirm");
+
+ unblockInput();
+ };
+
+
+ checkAccountIsFunded(afaddress, 0.1, 'XRP', '', function(){
+ navigator.notification.confirm("You must have " + xrpreserve + " XRP + 5 XRP for each trustline in the account you are sending from. This reserve is a Ripple network requirement. In some circumstances this message may appear in error if you believe that to be the case you can opt to attempt the transaction however this will attract a Ripple network fee." ,
+ function(b){
+ if (debug) console.log("button selected: " + b);
+ if (b == 1) {
+ nextscreen();
+ } else {
+ $('#atladdress').focus();
+ unblockInput();
+ }
+ },
+ "XRP Reserve not met",
+ [ "Try anyway", "Cancel" ]
+ );},
+ function() {
+ $('#atladdress').focus();
+ unblockInput();
+ }, nextscreen);
+
+
+}
+
+
+
function validateOfflineCode(offlinecode, offlinecodefield) {
var codevalid = /^[A-F0-9]+$/m.test(offlinecode);
@@ -3394,20 +3806,16 @@
Toast Wallet
var invid = ($("#invoiceid").val().trim() + "").toUpperCase();
var amount = $("#payamount").val().trim();
+ var owncurrencytgl = $('#tglIssueOwnCurrency').data('checked') == 'true';
- var asset;
- var issuer;
+ var asset = ( $('#payasset').is(':visible') ? ("" + $('#payasset').find(':selected').data('asset')).trim().toUpperCase() : $('#payassetofl').val().trim().toUpperCase() );
+ var issuer = ( $('#payasset').is(':visible') ? $('#payasset').find(':selected').data('issuer') : $('#payissuerofl').val().trim() );
- if (!offlinemode) {
- asset = $('#payasset').find(':selected').data('asset');
- issuer = $('#payasset').find(':selected').data('issuer');
- } else {
- asset = $('#payassetofl').val().trim();
- issuer = $('#payissuerofl').val().trim();
+ if (owncurrencytgl) {
+ issuer = payfrom;
}
if (asset == '') asset = 'XRP';
- if (asset == 'XRP') issuer = '';
var offlinecode = $('#payofflinecode').val().trim().replace(/ /g, "").toUpperCase();
var accID = '';
@@ -3527,6 +3935,25 @@
Toast Wallet
}
+ if (asset == 'XRP' && ( issuer != '' || owncurrencytgl)) {
+ navigator.notification.alert("You cannot specify an issuer for XRP.",
+ function(){
+ if ($('#oflcurrencydiv').is(':visible')) {
+ $("#payassetofl").focus();
+ } else {
+ $("#payasset").focus();
+ }
+
+ unblockInput();
+ },
+ "Select a payment amount",
+ "OK"
+ );
+ return;
+ }
+
+ if ( asset == 'XRP' ) issuer = '';
+
if (amount == "" || parseFloat(amount)+ "" != (""+amount).trim()) {
navigator.notification.alert("You must select a valid amount to send",
function(){
@@ -3569,7 +3996,12 @@
unblockInput();
};
- checkAccountIsFunded(payfrom, amount, function(){
+ checkAccountIsFunded(payfrom, amount, asset, issuer, function(){
navigator.notification.confirm("You must leave " + xrpreserve + " XRP reserve in the account you are sending from. This is a Ripple network requirement. In some circumstances this message may appear in error if you believe that to be the case you can opt to attempt the transaction however this will attract a Ripple network fee." ,
function(b){
if (debug) console.log("button selected: " + b);
@@ -3598,19 +4030,33 @@
Toast Wallet
}
-function checkAccountIsFunded(payfrom, amount, failurefunc, silentfailurefunc, successfunc) {
- if (payfrom in accountbalances) {
+function checkAccountIsFunded(payfrom, amount, asset, issuer, failurefunc, silentfailurefunc, successfunc) {
+
+ if (offlinemode) return successfunc(); // skip this warning if we already know we can't check the balance
+
+ if ( payfrom == issuer ) return successfunc();
+ //todo: check if receiver has trustline setup to receive your currency
+
+ if (asset == 'XRP' && payfrom in accountbalances) {
var balance = accountbalances[payfrom] - amount;
if (balance < xrpreserve) {
return failurefunc();
} else {
return successfunc();
}
- } else {
+ }
- if (offlinemode) return successfunc(); // skip this warning if we already know we can't check the balance
-
- navigator.notification.confirm("Toast Wallet was unable to check your account balance at this time. Please confirm that you have left " + xrpreserve + " XRP reserve in your account after the " + amount + " XRP transaction before continuing.",
+
+ if ( asset != 'XRP' && accountbalancestl[payfrom] != undefined && accountbalancestl[payfrom][asset] != undefined && accountbalancestl[payfrom][asset][issuer] != undefined ) {
+ var balance = accountbalancestl[payfrom][asset][issuer] - amount;
+ if (balance >= 0) {
+ return successfunc();
+ } else {
+ return failurefunc();
+ }
+ }
+
+ return navigator.notification.confirm("Toast Wallet was unable to check your account balance at this time. Please confirm that you have left " + xrpreserve + " XRP reserve in your account after the " + amount + " XRP transaction before continuing.",
function(b){
if (b == 1) {
return successfunc();
@@ -3620,9 +4066,8 @@
}
+
+// decode a payment URI passed to the application from the OS and display payment tab
+function doPayLink(paylink) {
+ showTab("#tabpayments");
+ decodePaymentURI(paylink,'#toaddress','#desttag','#payamount', ()=>{});
+
+ if (activeaccount == "")
+ refreshAccounts();
+}
+
+
var pinpadvalidate = function(pin) { return false ; }
var pinpadsuccess = function() {}
var pinpadfailure = function() {}
@@ -3409,10 +3472,20 @@
Toast Wallet
**/
function doShowLogin() {
if (debug) console.log("doShowLogin");
- runPinPad("#tablogin", function(pin) {
+
+ if (paylink_pending != null) $('#tablogin>center>div').addClass('pinpad_pending');
+
+ runPinPad("#tablogin", function(pin) {
validatePin(pin, function() {
$("#btnbootstrapsequence").hide();
- showTab("#tabaccounts");
+
+ if (paylink_pending == null) {
+ showTab("#tabaccounts");
+ } else {
+ $('#tablogin>center>div').removeClass('pinpad_pending');
+ doPayLink(paylink_pending);
+ paylink_pending = null;
+ }
}, function() {
$("#btnbootstrapsequence").hide();
setTimeout(function() {
From 66e4df5909ca5201b14279db5081b9ea386f7935 Mon Sep 17 00:00:00 2001
From: Omar Bohsali
Date: Sat, 2 Mar 2019 18:47:17 -0800
Subject: [PATCH 119/220] [Chore] Cleans up swapfiles
---
utils-build/.package.json.swp | Bin 12288 -> 0 bytes
utils-build/.rippleutils.js.swp | Bin 12288 -> 0 bytes
.../node_modules/are-we-there-yet/CHANGES.md~ | 27 -
.../console-control-strings/README.md~ | 140 ----
utils-build/package.json~ | 20 -
utils-build/rippleutils.js~ | 14 -
utils-build/update~ | 3 -
www/css/app.css~ | 645 ------------------
www/js/.instascan.min.js.swp | Bin 1613824 -> 0 bytes
www/js/instascan.min.js~ | 48 --
10 files changed, 897 deletions(-)
delete mode 100644 utils-build/.package.json.swp
delete mode 100644 utils-build/.rippleutils.js.swp
delete mode 100644 utils-build/node_modules/are-we-there-yet/CHANGES.md~
delete mode 100644 utils-build/node_modules/console-control-strings/README.md~
delete mode 100644 utils-build/package.json~
delete mode 100644 utils-build/rippleutils.js~
delete mode 100644 utils-build/update~
delete mode 100644 www/css/app.css~
delete mode 100644 www/js/.instascan.min.js.swp
delete mode 100644 www/js/instascan.min.js~
diff --git a/utils-build/.package.json.swp b/utils-build/.package.json.swp
deleted file mode 100644
index 88e42b74e3af10fb16c60501a755ac99255987b8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 12288
zcmeI2KX21O7{;%a7z>Dg0oSb9asH4%m}ooDp%MzE2nM9HeQmBW_Q`e-R@8|vfz&U7
z#Eyi7#KO!cU}s?lo^#?rk%-i>=sD@9B=0@g0^8lV9hpaB}70UDqI
z8lV9hxU>dNh2vNp$IZ1diSiO1xVTw22>vGR;
zxBWZIx-69Us-EZ~->K_vtc*%yl}5Tg%nZ6t7tZRp=xyE}$(jE#_51a-01c73l&!((JX
zd
z-1QIN#|Wu0y`{N^|8eT7Rf^?&trXcTP7Nca8?m~raj~PBCKUybnMO>vT^jQQGkK)Z
zH@M7kOxm|Z+kARK^dbQya0&v8WI36LU%$2_UA?k(iaZQO0!RP}AOR$R1dsp{Kmtf$
z9ta3$f&7FMIRm-`S{Ml4a3KLCfCP{L50KUP?XV6>F3(zBw0{Xs4$OjMuWkEk6=L_f^=oQGX;fsUbTp;8bCiNB{{S0VIF~kN^@u0&__~w=FKDmd0CcF6AVb9(v5BitJn90asZi8t2p%
zithFtVMq6=D1(b~MU65`H_1O1m??jTph<1akT&7uMp>hSzpA@XmLNCYIhDY_N_yf5Z>eb
zQSXU7E*W&6Hw>3@ep35d;2!or&gN8ilBskj0sT$|fgT2;i&(WCs
z+XX#f+ZnjRNyD;XN<&*XF8B!uM+KH}OmIPkV*-mG!QVt+{mO-1$
TqK2$WPl@btDska5T>!&hH&@2}
diff --git a/utils-build/node_modules/are-we-there-yet/CHANGES.md~ b/utils-build/node_modules/are-we-there-yet/CHANGES.md~
deleted file mode 100644
index a932721f..00000000
--- a/utils-build/node_modules/are-we-there-yet/CHANGES.md~
+++ /dev/null
@@ -1,27 +0,0 @@
-Hi, figured we could actually use a changelog now:
-
-## 1.1.3 2017-04-21
-
-* Improve documentation and limit files included in the distribution.
-
-## 1.1.2 2016-03-15
-
-* Add tracker group cycle detection and tests for it
-
-## 1.1.1 2016-01-29
-
-* Fix a typo in stream completion tracker
-
-## 1.1.0 2016-01-29
-
-* Rewrote completion percent computation to be low impact– no more walking a
- tree of completion groups every time we need this info. Previously, with
- medium sized tree of completion groups, even a relatively modest number of
- calls to the top level `completed()` method would result in absurd numbers
- of calls overall as it walked down the tree. We now, instead, keep track as
- we bubble up changes, so the computation is limited to when data changes and
- to the depth of that one branch, instead of _every_ node. (Plus, we were already
- incurring _this_ cost, since we already bubbled out changes.)
-* Moved different tracker types out to their own files.
-* Made tests test for TOO MANY events too.
-* Standarized the source code formatting
diff --git a/utils-build/node_modules/console-control-strings/README.md~ b/utils-build/node_modules/console-control-strings/README.md~
deleted file mode 100644
index 6eb34e89..00000000
--- a/utils-build/node_modules/console-control-strings/README.md~
+++ /dev/null
@@ -1,140 +0,0 @@
-# Console Control Strings
-
-A library of cross-platform tested terminal/console command strings for
-doing things like color and cursor positioning. This is a subset of both
-ansi and vt100. All control codes included work on both Windows & Unix-like
-OSes, except where noted.
-
-## Usage
-
-```js
-var consoleControl = require('console-control-strings')
-
-console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
-process.stdout.write(consoleControl.goto(75, 10))
-```
-
-## Why Another?
-
-There are tons of libraries similar to this one. I wanted one that was:
-
-1. Very clear about compatibility goals.
-2. Could emit, for instance, a start color code without an end one.
-3. Returned strings w/o writing to streams.
-4. Was not weighed down with other unrelated baggage.
-
-## Functions
-
-### var code = consoleControl.up(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up.
-
-### var code = consoleControl.down(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down.
-
-### var code = consoleControl.forward(_num = 1_)
-
-Returns the escape sequence to move _num_ lines righ.
-
-### var code = consoleControl.back(_num = 1_)
-
-Returns the escape sequence to move _num_ lines left.
-
-### var code = consoleControl.nextLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down and to the beginning of
-the line.
-
-### var code = consoleControl.previousLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up and to the beginning of
-the line.
-
-### var code = consoleControl.eraseData()
-
-Returns the escape sequence to erase everything from the current cursor
-position to the bottom right of the screen. This is line based, so it
-erases the remainder of the current line and all following lines.
-
-### var code = consoleControl.eraseLine()
-
-Returns the escape sequence to erase to the end of the current line.
-
-### var code = consoleControl.goto(_x_, _y_)
-
-Returns the escape sequence to move the cursor to the designated position.
-Note that the origin is _1, 1_ not _0, 0_.
-
-### var code = consoleControl.gotoSOL()
-
-Returns the escape sequence to move the cursor to the beginning of the
-current line. (That is, it returns a carriage return, `\r`.)
-
-### var code = consoleControl.hideCursor()
-
-Returns the escape sequence to hide the cursor.
-
-### var code = consoleControl.showCursor()
-
-Returns the escape sequence to show the cursor.
-
-### var code = consoleControl.color(_colors = []_)
-
-### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)
-
-Returns the escape sequence to set the current terminal display attributes
-(mostly colors). Arguments can either be a list of attributes or an array
-of attributes. The difference between passing in an array or list of colors
-and calling `.color` separately for each one, is that in the former case a
-single escape sequence will be produced where as in the latter each change
-will have its own distinct escape sequence. Each attribute can be one of:
-
-* Reset:
- * **reset** – Reset all attributes to the terminal default.
-* Styles:
- * **bold** – Display text as bold. In some terminals this means using a
- bold font, in others this means changing the color. In some it means
- both.
- * **italic** – Display text as italic. This is not available in most Windows terminals.
- * **underline** – Underline text. This is not available in most Windows Terminals.
- * **inverse** – Invert the foreground and background colors.
- * **stopBold** – Do not display text as bold.
- * **stopItalic** – Do not display text as italic.
- * **stopUnderline** – Do not underline text.
- * **stopInverse** – Do not invert foreground and background.
-* Colors:
- * **white**
- * **black**
- * **blue**
- * **cyan**
- * **green**
- * **magenta**
- * **red**
- * **yellow**
- * **grey** / **brightBlack**
- * **brightRed**
- * **brightGreen**
- * **brightYellow**
- * **brightBlue**
- * **brightMagenta**
- * **brightCyan**
- * **brightWhite**
-* Background Colors:
- * **bgWhite**
- * **bgBlack**
- * **bgBlue**
- * **bgCyan**
- * **bgGreen**
- * **bgMagenta**
- * **bgRed**
- * **bgYellow**
- * **bgGrey** / **bgBrightBlack**
- * **bgBrightRed**
- * **bgBrightGreen**
- * **bgBrightYellow**
- * **bgBrightBlue**
- * **bgBrightMagenta**
- * **bgBrightCyan**
- * **bgBrightWhite**
-
diff --git a/utils-build/package.json~ b/utils-build/package.json~
deleted file mode 100644
index e5868606..00000000
--- a/utils-build/package.json~
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "scripts": {
- "build": "node rippleutils.js"
- },
- "dependencies": {
- "base-x": "^3.0.2",
- "bignum": "^0.12.5",
- "bn.js": "^4.11.8",
- "buffer": "^5.0.7",
- "crypto": "^1.0.1",
- "elliptic": "^6.4.0",
- "hashjs": "^1.2.0",
- "node-pre-gyp": "^0.6.36",
- "random-bytes": "^1.0.0",
- "ripple-address-codec": "^2.0.1",
- "ripple-binary-codec": "^0.1.10",
- "ripple-keypairs": "^0.10.0",
- "ripple-lib": "^0.17.7"
- }
-}
diff --git a/utils-build/rippleutils.js~ b/utils-build/rippleutils.js~
deleted file mode 100644
index 0e83d445..00000000
--- a/utils-build/rippleutils.js~
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-if (typeof window !== 'undefined') {
- window['assert'] = require('assert');
- window['elliptic'] = require('elliptic');
- window['rippleKeypairs'] = require('ripple-keypairs');
- window['secp256k1'] = elliptic.ec('secp256k1');
- window['rippleAddressCodec'] = require('ripple-address-codec');
- window['R_B58_DICT'] = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz';
- window['base58'] = require('base-x')(R_B58_DICT);
- window['rippleBinaryCodec'] = require('ripple-binary-codec')
- window['rippleHashes'] = require('ripple-hashes')
- window['BN'] = require('bn.js');
- window['hashjs'] = require('hash.js')
-}
diff --git a/utils-build/update~ b/utils-build/update~
deleted file mode 100644
index 3a90b7db..00000000
--- a/utils-build/update~
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-npm run build
-browserify rippleutils.js -o rippleutils-build.js
diff --git a/www/css/app.css~ b/www/css/app.css~
deleted file mode 100644
index 4cf21285..00000000
--- a/www/css/app.css~
+++ /dev/null
@@ -1,645 +0,0 @@
-
-html {
- height: 100vh;
- min-height: 100vh;
- max-height: 100vh;
- width: 100vw;
- min-width: 100vw;
- max-height: 100vw;
-}
-body {
- font-family: sans-serif;
- font-family: sans-serif;
- color:white;
- font-size: 1.5em;
-}
-
-#walletbackup {
- height: calc(100vh - 17em);
-}
-
-textarea {
- width: 100%;
- overflow-y: scroll;
- overflow-wrap: break-word;
- min-height: 4em;
-}
-#generatedaddress, #accdetailssecretaddress, #accsecret, #accdetailsaddress {
- font-size: 1.2em !important;
- color: black;
- border: 1px dashed black;
- box-shadow: none;
- text-align: center;
- overflow-wrap: break-word;
- padding: 0.2em;
-/* display: inline-block; */
- max-width: 100%;
- overflow: hidden;
- text-overflow: clip;
- word-wrap: break-word;
- width: 100%;
-}
-#generatedaddress {
- position:relative;
-
-}
-
-/* pinpad lettering contributed by https://github.com/WietseWind */
-.pinpad button i.char {
- font-size: .4em;
- text-transform: uppercase;
- font-style: normal;
- display: block;
- line-height: .4em;
- position: absolute;
- width: 100%;
- margin-top: -20%;
- letter-spacing: 2px;
- font-weight: normal;
- padding-left: 2px;
-}
-
-#generatedaddress:before {
- display: block;
- content: "xxxxxxxxxxxxxxxx";
- text-align: left;
- color: black;
- background-color: white;
- position: absolute;
- right: 0;
- top: 0;
- width: 50%;
- height: 100%;
- /* filter: blur(5px); */
- font-size: 1.3em !important;
- line-height: 1.15em;
- filter: blur(3px);
-}
-
-#tabbackup2 h3 {
- margin-top: 0;
-}
-#tabsettings button, #tabaddaccount button, #tabgenaccount button,
-#tabsetpassphrase button, #tabchangepassphrase button, #tabshowrecovery button,
-#tabcorruptionprompt button, #tabgenaccount1 button, #btnimport, #tabpaymentconfirm button,
-#tabrestore button {
- min-width: 20em;
- margin-bottom: 1em;
-}
-.toggleswitch {
- font-size: 2em;
- vertical-align: middle;
- opacity: 0.5;
- margin-left: 0.5em;
- color: black;
- float: right;
- margin-left: 0.5em;
-}
-
-.paygrouping {
- margin-bottom: 0.5em;
- border: 1px solid rgba(0,0,0,0.2);
-}
-
-.paygrouping > div {
- text-align: right;
- margin: 0;
- padding-left: 1em;
-}
-
-.paygrouping {
- padding: 0.2em;
-}
-
-.paygrouping > label {
- float: left;
- min-width: 50%;
-}
-
-#tabpaymentconfirm div[id^="confirm"] {
- color: blue;
- font-size: 1em;
- overflow-wrap: break-word;
- display: block;
- vertical-align: middle;
-}
-
-
-.accountdetailsselector {
- z-index: 89 !important;
- width: 100%;
- overflow: hidden;
- text-overflow: clip;
- padding: 0 !important;
-}
-
-.accountdetailsselector > *:not(.accdetailsinnertabselected) {
- background: rgb(0, 81, 185) !important;
- color: white !important;
-}
-
-.accountdetailsselector > .accdetailsinnertabselected {
- background: white !important;
- color: rgb(0, 81, 185) !important;
-}
-
-.accountdetailsselector > li {
- text-align: center;
- padding: 0.5em 0 0.5em 0;
- width: calc(50% - 3px);
- display: inline-block;
-}
-
-.txrow {
- color: black;
-}
-
-.transactionlist {
- list-style: none !important;
-}
-
-.txrow>span:first-of-type {
- text-overflow: ellipsis;
- overflow: hidden;
- display: inline-block;
- max-width: 60vw;
- vertical-align: middle;
-}
-
-.txrow>span:last-of-type {
- float: right;
-}
-
-.txrow>i {
- margin-right: 0.5em;
- vertical-align: middle;
-}
-
-.txrow * {
- display: inline;
-}
-
-.txrow fa {
-}
-
-.txrow i {
- margin-right: 1em;
- vertical-align: middle;
-}
-
-.txrow {
- border-bottom: 1px solid rgba(0,0,0,0.2);
-}
-
-
-#showrecoveryphrase {
- color: blue;
- font-size: 2em;
- text-align: center;
- font-weight: bold;
- border: 1px dashed;
- padding-bottom: 0.5em;
- padding-top: 0.2em;
-}
-
-#tabshowrecovery h1 {
- margin-top: 0 !important;
-}
-
-
-.moreindicatorabovenav {
- bottom: calc(10px + 1.6em) !important;
-}
-
-.moreindicatordark {
- color: black !important;
-}
-#inputblocker {
- position: fixed;
- z-index: 100;
- opacity: 0;
- left: 0;
- top: 0;
- margin: 0;
- padding: 0;
- width: 100vw;
- height: 100vh;
-}
-
-.liteloading:after {
- display: block;
- animation: fa-spin 2s infinite linear;
- z-index: 101;
- content: "\f021";
- color: #307ee0;
- font: normal normal normal 4em/1 FontAwesome;
- -webkit-animation: fa-spin 2s infinite linear;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- position: fixed;
- left: calc(50% - 0.5em);
- top: calc(50% - 0.5em);
-}
-.loading:before {
- display: block;
- animation: fa-spin 2s infinite linear;
- z-index: 102;
- background: white;
- content: "\f110";
- color: #307ee0;
- font: normal normal normal 4em/1 FontAwesome;
- -webkit-animation: fa-spin 2s infinite linear;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- position: fixed;
- left: calc(50% - 0.5em);
- top: calc(50% - 0.5em);
- z-index: 104;
-}
-.loading:after {
- position: fixed;
- display: block;
- background: white;
- content: " ";
- width: 100vw;
- height: 100vh;
- top: 0px;
- left: 0px;
- z-index: 103;
-}
-button:not(.varsize) {
- min-width: 6em;
-}
-a:hover, a:visited, a:active, a:focus {
- text-decoration: none !important;
-}
-
-.suppressbottommargin, .suppressbottommargin > * {
- margin-bottom: 0 !important;
-}
-
-.bottom-list-button {
- text-align: center;
- vertical-align: middle;
-}
-.list-group-item {
- width: 100%;
-}
-.active a {
- color: white !important;
-}
-
-.accountitem {
- color: hsla(0, 0%, 35%, 1);
-}
-#navheader a, #navheader a:visited, #navheader a:active, #navheader a:hover {
- color: white !important;
-}
-ul {
- list-style: none;
- padding-left: 0;
-}
-ul.verticalform > li {
- height: 100%;
-}
-
-
-.address {
- text-overflow: ellipsis;
- overflow: hidden;
-}
-video#qrpreview {
- max-height: 50vh;
- margin: 0;
- width: 100%;
- padding: 0;
-}
-
-img.loader {
- vertical-align: middle;
- top: calc(50% - 25px);
- position: absolute;
- left: calc(50% - 25px);
-}
-.amount {
- float: right;
-}
-#accountslist > li {
- text-overflow: ellipsis;
- overflow: hidden;
- min-height: 4em;
-}
-#btnaddaccount > * {
- vertical-align: middle;
-}
-i.fa {
- font-size: 1.3em !important;
-}
-label {
- color: black;
-}
-#fromaccountslist {
- margin-bottom: 0 !important;
-}
-
-.screentab {
- overflow-y: scroll;
- margin-top: 4.0em;
- height: calc(100vh - 4em);
- position: absolute;
- top: 0;
- left: 0;
- width: calc(100vw - 2em);
- margin-left: 1em;
- margin-right: 1em;
- padding-top: 0.5em;
- padding-bottom: 4em;
- touch-action: pan-y;
- -ms-touch-action: pan-y;
- -webkit-overflow-scrolling: touch;
- scroll-behavior: smooth;
- z-index: 1;
-}
-
-.screentab * {
- z-index: 2;
-}
-
-
-
-
-::-webkit-scrollbar {
- width: 0px; /* remove scrollbar space */
- background: transparent; /* optional: just make scrollbar invisible */
-}
-
-div.input-group>span.input-group-btn>button {
- min-width: 5em;
-}
-
-#navfooter {
- position: absolute;
- bottom: 0;
- width: 100vw;
- left: 0;
- background: linear-gradient(45deg, #1959ab, #317fe2);
- list-style: none;
- margin: 0;
- text-align: center;
- z-index: 90;
- border-top: 1px solid hsla(214, 50%, 25%, 0.25);
- height: 3.5em !important;
-}
-
-
-#navheader {
- position: absolute;
- top: 0;
- left: 0;
- width: 100vw;
- background: linear-gradient(45deg, #1959ab, #317fe2);
- margin: 0;
- list-style: none;
- z-index: 90;
- border-bottom: 1px solid hsla(214, 50%, 25%, 0.2);
- height: 4em !important;
-}
-#accdetailsqr {
- padding-top: 1em;
- padding-bottom: 1em;
-}
-button, button:focus, button:active, button:hover {
- outline: none !important;
-}
-
-.copybtn {
- max-width: 2.5em;
- max-height: 2.4em;
- min-width: 2.5em !important;
- min-height: 2.4em;
- padding: 0;
- margin: 0;
- color: black;
- background: rgba(0,0,0,0.1);
- border: none;
- float: right;
-}
-
-#navheader > li {
- vertical-align: middle;
- margin: 0;
- display: inline-block;
-}
-#navheader > li > * {
- padding-left: 0.5em;
- padding-right: 0.5em;
- padding-top: 1em;
- padding-bottom: 1em;
-}
-ul.iosheader > li > * {
- padding-left: 0.5em;
- padding-right: 0.5em;
- padding-top: 1.5em !important;
- padding-bottom: 0.5em !important;
-}
-.headerleft {
- width: 25%;
- text-align: left;
-}
-
-.headerright {
- width: 25%;
- text-align: right;
-}
-
-.headermiddle {
- width: 50%;
- text-align: center;
-}
-#navfooter > li {
- text-align: center;
- vertical-align: top;
- position: relative;
- cursor: pointer;
- display: inline-block;
- min-width: calc(33% - 1em);
- padding: 1em 0.5em 1em 0.5em;
-}
-#navfooter div {
- display: none;
-}
-#navfooter > li > div {
- font-size: 0.8em;
-}
-
-
-
-.pinpad {
- text-align: center;
- margin-top: calc(50vh - 17em);
-}
-
-
-
-.logobackground {
- background: url('images/toastwallet4finalgrd2new.png') no-repeat;
- background-size: 100%;
- height: 100vh;
-}
-
-
-
-.darkbackground {
- background: linear-gradient(45deg, #1959ab, #317fe2), #1959ab;
- background-repeat: no-repeat;
-}
-.darkbackground2 {
- background: linear-gradient(45deg, #19ab4c, #317fe2), #1959ab;
- background-repeat: no-repeat;
-}
-
-#tablicense h1 {
- margin: 0 0 0.3em 0 !important;
- padding: 0 !important;
-}
-#morecontentindicator {
- position: fixed;
- bottom: 10px;
- right: 10px;
- opacity: 0.5;
- z-index: 91;
- font-size: 2em !important;
-}
-.pinnumber {
- color: rgba(255,255,255,0.7);
-}
-
-.darkbackground:after {
- content: " ";
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- width: 100vw;
- height: 100vh;
- background: url(../images/background.png);
- opacity: 0.1;
- background-size: 100%;
- background-repeat: no-repeat;
- background-position-y: 50%;
- z-index: -1;
-}
-.pinpad button {
- border: 1px solid rgba(255, 255, 255, 0.1);
- background: rgba(255,255,255,0.1);
- border-radius: 50%;
- padding: 0px;
- margin: 0.2em 0.4em 0.2em 0.4em;
- line-height: 3em;
- font-size: 1.4em;
- min-width: 3.6em !important;
- min-height: 3.6em !important;
- position: relative;
- text-align: center;
-}
-
-
-.pinpad *:focus {
- outline: none;
-}
-.pinpad button:active {
- background-color: rgba(255,0,0,0.6);
- -moz-transition: all 0.1s ease-in-out;
- -webkit-transition: all 0.1s ease-in-out;
- -o-transition: all 0.1s ease-in-out;
- transition: all 0.1s ease-in-out;
-}
-
-
-button, label, .screendiv > *, #navheader *, #navfooter * {
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-* {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-}
-
-* {
- touch-action: pan-y;
- -ms-touch-action: pan-y;
- -webkit-overflow-scrolling: touch;
- scroll-behavior: smooth;
-}
-
-input
-{
- -webkit-user-select: text;
- -khtml-user-select: text;
- -moz-user-select: text;
- -ms-user-select: text;
- user-select: text;
-}
-
-#tabrecovery div {
- margin-bottom: 1em;
-}
-
-.shake {
- animation: shakeanimation 0.82s cubic-bezier(.36,.07,.19,.97) both;
- transform: translate3d(0, 0, 0);
- backface-visibility: hidden;
- perspective: 1000px;
-}
-.bounce {
- animation: bounceanimation 0.82s cubic-bezier(.36,.07,.19,.97) both;
- transform: translate3d(0, 0, 0);
- backface-visibility: hidden;
- perspective: 1000px;
-}
-
-
-@keyframes shakeanimation {
- 10%, 90% {
- transform: translate3d(-1px, 0, 0);
- }
-
- 20%, 80% {
- transform: translate3d(2px, 0, 0);
- }
-
- 30%, 50%, 70% {
- transform: translate3d(-4px, 0, 0);
- }
-
- 40%, 60% {
- transform: translate3d(4px, 0, 0);
- }
-}
-@keyframes bounceanimation {
- 0%, 20%, 50%, 80%, 100% {
- transform: translate3d(0, 0, 0);
- }
- 40% {
- transform: translate3d(0, -30px, 0);
- }
- 60% {
- transform: translate3d(0, -15px, 0);
- }
-}
-
diff --git a/www/js/.instascan.min.js.swp b/www/js/.instascan.min.js.swp
deleted file mode 100644
index 8bb0b76cd7b0f8cf5e18c185f31cd3d41bcedf2e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1613824
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