import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.math.*;
import javax.net.ssl.*;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.text.*;
import javax.imageio.metadata.*;
import javax.imageio.stream.*;
import java.text.NumberFormat;
import java.awt.datatransfer.StringSelection;
class main {
public static void main(final String[] args) throws Exception { pExperiment();
for (int i = 1; i <= 2; i++) {
assertEqualsVerbose("bla", extractLastNLinesOfString(i, "bla"));
assertEqualsVerbose("bla\n", extractLastNLinesOfString(i, "bla\n"));
}
assertEqualsVerbose("blubb", extractLastNLinesOfString(1, "bla\nblubb"));
for (int i = 2; i <= 3; i++)
assertEqualsVerbose("bla\nblubb", extractLastNLinesOfString(print(i), "bla\nblubb"));
assertEqualsVerbose("bla\nblubb", extractLastNLinesOfString(2, "ya\n\nbla\nblubb"));
assertEqualsVerbose("\nbla\nblubb", extractLastNLinesOfString(3, "ya\n\nbla\nblubb"));
}
static void pExperiment() {
if (!isMain()) return;
//substance();
autoRestart(5);
experimentIcon();
centerHigherConsole();
tt();
}
static A assertEqualsVerbose(Object x, A y) {
assertEqualsVerbose((String) null, x, y);
return y;
}
static A assertEqualsVerbose(String msg, Object x, A y) {
if (!eq(x, y)) {
throw fail((msg != null ? msg + ": " : "") + /*sfu*/(y) + " != " + /*sfu*/(x));
} else
print("OK: " + /*sfu*/(x));
return y;
}
static String extractLastNLinesOfString(int n, String s) {
int i = l(s)-1;
// skip trailing new line
if (i >= 0 && s.charAt(i) == '\n') --i;
if (i >= 0 && s.charAt(i) == '\r') --i;
while (n > 0 && i >= 0) {
if (s.charAt(i) == '\n')
if (--n == 0) break;
--i;
}
return substring(s, i+1);
}
static String extractLastNLinesOfString(String s, int n) {
return extractLastNLinesOfString(n, s);
}
static volatile StringBuffer local_log = new StringBuffer(); // not redirected
static volatile Appendable print_log = local_log; // might be redirected, e.g. to main bot
// in bytes - will cut to half that
static volatile int print_log_max = 1024*1024;
static volatile int local_log_max = 100*1024;
//static int print_maxLineLength = 0; // 0 = unset
static boolean print_silent; // total mute if set
static Object print_byThread_lock = new Object();
static volatile ThreadLocal