/**
* Kelas Logarithm untuk menghitung logaritma. Metode perhitungan menggunakan Binary
* Logarithm, yaitu logaritma dalam basis 2.
*
* @author Hendra Jaya
* @since 17 Oktober 2010
*/
class Logarithm {
/**
* Nilai lb(10) dan lb(e).
* Dipersiapkan untuk Common Logarithm dan Natural Logarithm.
* Kedua nilai dihitung menggunakan toleransi galat {10}^{-20}
*/
private static final double lb_10 = 3.321928094887362D;
private static final double lb_e = 1.4426950408889634D;
/**
* Toleransi galat. Di-set ke {10}^{-20}. Cukup untuk penggunaan sehari-hari
*/
private static final double err = 1E-20D;
/**
* Common Logarithm. Logaritma dalam basis 10
* @param x bilangan real positif
* @return log_10(x)
*/
public static double log(double x){
return lb(x) / lb_10;
}
/**
* Logarithm. Logaritma dalam basis sesuai keinginan user
* @param base bilangan real positif yang akan dijadikan basis logaritma
* @param x bilangan real positif
* @return log_base(x)
*/
public static double log(double base, double x){
return lb(x) / lb(base);
}
/**
* Natural Logarithm. Logaritma dalam basis e. Yang dimaksud dengan e adalah
* bilangan Euler, yaitu 2.71828182845904523536...
* @param x bilangan real positif
* @return log_e(x)
*/
public static double ln(double x){
return lb(x) / lb_e;
}
/**
* Binary Logarithm. Logaritma dalam basis 2
* @param x
* @return log_2(x)
*/
public static double lb(double x){
assert(x > 0D);
double result = 0D;
while (x < 1){
result -= 1D;
x *= 2D;
}
while (x >= 2){
result += 1D;
x /= 2D;
}
double frac = 1D;
while(frac > err){
frac /= 2D;
x *= x;
if (x >= 2D){
x /= 2D;
result += frac;
}
}
return result;
}
public static void main
(String[] args
) { System.
out.
println(4.5 + "\t" + lb
(4.5) + "\t" + ln
(4.5) + "\t" + log
(4.5) + "\t" + log
(4.5,
Math.
PI) + "\t" + log
(4.5,
4.5)); System.
out.
println(1.125 + "\t" + lb
(1.125) + "\t" + ln
(1.125) + "\t" + log
(1.125) + "\t" + log
(1.125,
Math.
PI) + "\t" + log
(1.125,
1.125)); System.
out.
println(1.28289 + "\t" + lb
(1.28289) + "\t" + ln
(1.28289) + "\t" + log
(1.28289) + "\t" + log
(1.28289,
Math.
PI) + "\t" + log
(1.28289,
1.28289)); System.
out.
println(1.6 + "\t" + lb
(1.6) + "\t" + ln
(1.6) + "\t" + log
(1.6) + "\t" + log
(1.6,
Math.
PI) + "\t" + log
(1.6,
1.6)); System.
out.
println(1.999999 + "\t" + lb
(1.999999) + "\t" + ln
(1.999999) + "\t" + log
(1.999999) + "\t" + log
(1.999999,
Math.
PI) + "\t" + log
(1.999999,
1.999999)); System.
out.
println(0.999999 + "\t" + lb
(0.999999) + "\t" + ln
(0.999999) + "\t" + log
(0.999999) + "\t" + log
(0.999999,
Math.
PI) + "\t" + log
(0.999999,
0.999999)); System.
out.
println(9.999999 + "\t" + lb
(9.999999) + "\t" + ln
(9.999999) + "\t" + log
(9.999999) + "\t" + log
(9.999999,
Math.
PI) + "\t" + log
(9.999999,
9.999999)); System.
out.
println(0.3 + "\t" + lb
(0.3) + "\t" + ln
(0.3) + "\t" + log
(0.3) + "\t" + log
(0.3,
Math.
PI) + "\t" + log
(0.3,
0.3)); System.
out.
println(0.9 + "\t" + lb
(0.9) + "\t" + ln
(0.9) + "\t" + log
(0.9) + "\t" + log
(0.9,
Math.
PI) + "\t" + log
(0.9,
0.9)); System.
out.
println(0.8 + "\t" + lb
(0.8) + "\t" + ln
(0.8) + "\t" + log
(0.8) + "\t" + log
(0.8,
Math.
PI) + "\t" + log
(0.8,
0.8)); System.
out.
println(1.4 + "\t" + lb
(1.4) + "\t" + ln
(1.4) + "\t" + log
(1.4) + "\t" + log
(1.4,
Math.
PI) + "\t" + log
(1.4,
1.4)); System.
out.
println(10 + "\t" + lb
(10) + "\t" + ln
(10) + "\t" + log
(10) + "\t" + log
(10,
Math.
PI) + "\t" + log
(10,
10)); System.
out.
println(100 + "\t" + lb
(100) + "\t" + ln
(100) + "\t" + log
(100) + "\t" + log
(100,
Math.
PI) + "\t" + log
(100,
100)); System.
out.
println(1 + "\t" + lb
(1) + "\t" + ln
(1) + "\t" + log
(1) + "\t" + log
(1,
Math.
PI) + "\t" + log
(1,
1)); System.
out.
println(1000 + "\t" + lb
(1000) + "\t" + ln
(1000) + "\t" + log
(1000) + "\t" + log
(1000,
Math.
PI) + "\t" + log
(1000,
1000)); System.
out.
println(0.1 + "\t" + lb
(0.1) + "\t" + ln
(0.1) + "\t" + log
(0.1) + "\t" + log
(0.1,
Math.
PI) + "\t" + log
(0.1,
0.1)); System.
out.
println(0.01 + "\t" + lb
(0.01) + "\t" + ln
(0.01) + "\t" + log
(0.01) + "\t" + log
(0.01,
Math.
PI) + "\t" + log
(0.01,
0.01)); System.
out.
println(0.001 + "\t" + lb
(0.001) + "\t" + ln
(0.001) + "\t" + log
(0.001) + "\t" + log
(0.001,
Math.
PI) + "\t" + log
(0.001,
0.001)); System.
out.
println(2.71828182845904523536 + "\t" + lb
(2.71828182845904523536) + "\t" + ln
(2.71828182845904523536) + "\t" + log
(2.71828182845904523536) + "\t" + log
(2.71828182845904523536,
Math.
PI) + "\t" + log
(2.71828182845904523536,
2.71828182845904523536)); System.
out.
println(2 + "\t" + lb
(2) + "\t" + ln
(2) + "\t" + log
(2) + "\t" + log
(2,
Math.
PI) + "\t" + log
(2,
2)); System.
out.
println(8 + "\t" + lb
(8) + "\t" + ln
(8) + "\t" + log
(8) + "\t" + log
(8,
Math.
PI) + "\t" + log
(8,
8)); System.
out.
println(1024 + "\t" + lb
(1024) + "\t" + ln
(1024) + "\t" + log
(1024) + "\t" + log
(1024,
Math.
PI) + "\t" + log
(1024,
1024)); System.
out.
println(11 + "\t" + lb
(11) + "\t" + ln
(11) + "\t" + log
(11) + "\t" + log
(11,
Math.
PI) + "\t" + log
(11,
11)); System.
out.
println(13 + "\t" + lb
(13) + "\t" + ln
(13) + "\t" + log
(13) + "\t" + log
(13,
Math.
PI) + "\t" + log
(13,
13)); System.
out.
println(2.13 + "\t" + lb
(2.13) + "\t" + ln
(2.13) + "\t" + log
(2.13) + "\t" + log
(2.13,
Math.
PI) + "\t" + log
(2.13,
2.13)); System.
out.
println(1.212121212 + "\t" + lb
(1.212121212) + "\t" + ln
(1.212121212) + "\t" + log
(1.212121212) + "\t" + log
(1.212121212,
Math.
PI) + "\t" + log
(1.212121212,
1.212121212)); System.
out.
println(1.001 + "\t" + lb
(1.001) + "\t" + ln
(1.001) + "\t" + log
(1.001) + "\t" + log
(1.001,
Math.
PI) + "\t" + log
(1.001,
1.001)); System.
out.
println(694 + "\t" + lb
(694) + "\t" + ln
(694) + "\t" + log
(694) + "\t" + log
(694,
Math.
PI) + "\t" + log
(694,
694)); System.
out.
println(1.6180339887 + "\t" + lb
(1.6180339887) + "\t" + ln
(1.6180339887) + "\t" + log
(1.6180339887) + "\t" + log
(1.6180339887,
Math.
PI) + "\t" + log
(1.6180339887,
1.6180339887)); System.
out.
println(2.4142135623 + "\t" + lb
(2.4142135623) + "\t" + ln
(2.4142135623) + "\t" + log
(2.4142135623) + "\t" + log
(2.4142135623,
Math.
PI) + "\t" + log
(2.4142135623,
2.4142135623)); System.
out.
println(1.4142135623 + "\t" + lb
(1.4142135623) + "\t" + ln
(1.4142135623) + "\t" + log
(1.4142135623) + "\t" + log
(1.4142135623,
Math.
PI) + "\t" + log
(1.4142135623,
1.4142135623)); System.
out.
println(17.1085 + "\t" + lb
(17.1085) + "\t" + ln
(17.1085) + "\t" + log
(17.1085) + "\t" + log
(17.1085,
Math.
PI) + "\t" + log
(17.1085,
17.1085)); System.
out.
println(27.0684 + "\t" + lb
(27.0684) + "\t" + ln
(27.0684) + "\t" + log
(27.0684) + "\t" + log
(27.0684,
Math.
PI) + "\t" + log
(27.0684,
27.0684)); System.
out.
println(17.1008 + "\t" + lb
(17.1008) + "\t" + ln
(17.1008) + "\t" + log
(17.1008) + "\t" + log
(17.1008,
Math.
PI) + "\t" + log
(17.1008,
17.1008)); System.
out.
println(10.1112 + "\t" + lb
(10.1112) + "\t" + ln
(10.1112) + "\t" + log
(10.1112) + "\t" + log
(10.1112,
Math.
PI) + "\t" + log
(10.1112,
10.1112)); }
}
LyoqCiAqIEtlbGFzIExvZ2FyaXRobSB1bnR1ayBtZW5naGl0dW5nIGxvZ2FyaXRtYS4gTWV0b2RlIHBlcmhpdHVuZ2FuIG1lbmdndW5ha2FuIEJpbmFyeQogKiBMb2dhcml0aG0sIHlhaXR1IGxvZ2FyaXRtYSBkYWxhbSBiYXNpcyAyLgogKiAKICogQGF1dGhvciBIZW5kcmEgSmF5YQogKiBAc2luY2UgMTcgT2t0b2JlciAyMDEwCiAqLwpjbGFzcyBMb2dhcml0aG0gewoJLyoqCgkgKiBOaWxhaSBsYigxMCkgZGFuIGxiKGUpLgoJICogRGlwZXJzaWFwa2FuIHVudHVrIENvbW1vbiBMb2dhcml0aG0gZGFuIE5hdHVyYWwgTG9nYXJpdGhtLgoJICogS2VkdWEgbmlsYWkgZGloaXR1bmcgbWVuZ2d1bmFrYW4gdG9sZXJhbnNpIGdhbGF0IHsxMH1eey0yMH0gCgkgKi8KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBsYl8xMCA9IDMuMzIxOTI4MDk0ODg3MzYyRDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBsYl9lICA9IDEuNDQyNjk1MDQwODg4OTYzNEQ7CgogICAgLyoqCiAgICAgKiBUb2xlcmFuc2kgZ2FsYXQuIERpLXNldCBrZSB7MTB9XnstMjB9LiBDdWt1cCB1bnR1ayBwZW5nZ3VuYWFuIHNlaGFyaS1oYXJpCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBlcnIgPSAxRS0yMEQ7CiAgICAKICAgIC8qKgogICAgICogQ29tbW9uIExvZ2FyaXRobS4gTG9nYXJpdG1hIGRhbGFtIGJhc2lzIDEwCiAgICAgKiBAcGFyYW0geCBiaWxhbmdhbiByZWFsIHBvc2l0aWYKICAgICAqIEByZXR1cm4gbG9nXzEwKHgpCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGxvZyhkb3VibGUgeCl7CiAgICAgICAgcmV0dXJuIGxiKHgpIC8gbGJfMTA7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTG9nYXJpdGhtLiBMb2dhcml0bWEgZGFsYW0gYmFzaXMgc2VzdWFpIGtlaW5naW5hbiB1c2VyCiAgICAgKiBAcGFyYW0gYmFzZSBiaWxhbmdhbiByZWFsIHBvc2l0aWYgeWFuZyBha2FuIGRpamFkaWthbiBiYXNpcyBsb2dhcml0bWEKICAgICAqIEBwYXJhbSB4IGJpbGFuZ2FuIHJlYWwgcG9zaXRpZgogICAgICogQHJldHVybiBsb2dfYmFzZSh4KQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBsb2coZG91YmxlIGJhc2UsIGRvdWJsZSB4KXsKICAgICAgICByZXR1cm4gbGIoeCkgLyBsYihiYXNlKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBOYXR1cmFsIExvZ2FyaXRobS4gTG9nYXJpdG1hIGRhbGFtIGJhc2lzIGUuIFlhbmcgZGltYWtzdWQgZGVuZ2FuIGUgYWRhbGFoCiAgICAgKiBiaWxhbmdhbiBFdWxlciwgeWFpdHUgMi43MTgyODE4Mjg0NTkwNDUyMzUzNi4uLgogICAgICogQHBhcmFtIHggYmlsYW5nYW4gcmVhbCBwb3NpdGlmCiAgICAgKiBAcmV0dXJuIGxvZ19lKHgpCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGxuKGRvdWJsZSB4KXsKICAgICAgICByZXR1cm4gbGIoeCkgLyBsYl9lOwogICAgfQogICAgCiAgICAvKioKICAgICAqIEJpbmFyeSBMb2dhcml0aG0uIExvZ2FyaXRtYSBkYWxhbSBiYXNpcyAyCiAgICAgKiBAcGFyYW0geAogICAgICogQHJldHVybiBsb2dfMih4KQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBsYihkb3VibGUgeCl7CiAgICAgICAgYXNzZXJ0KHggPiAwRCk7CiAgICAgICAgCiAgICAgICAgZG91YmxlIHJlc3VsdCA9IDBEOwoKICAgICAgICB3aGlsZSAoeCA8IDEpewogICAgICAgICAgICByZXN1bHQgLT0gMUQ7CiAgICAgICAgICAgIHggKj0gMkQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHdoaWxlICh4ID49IDIpewogICAgICAgICAgICByZXN1bHQgKz0gMUQ7CiAgICAgICAgICAgIHggLz0gMkQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRvdWJsZSBmcmFjID0gMUQ7CiAgICAgICAgd2hpbGUoZnJhYyA+IGVycil7CiAgICAgICAgICAgIGZyYWMgLz0gMkQ7CiAgICAgICAgICAgIHggKj0geDsKCiAgICAgICAgICAgIGlmICh4ID49IDJEKXsKICAgICAgICAgICAgICAgIHggLz0gMkQ7CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZnJhYzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbig0LjUgKyAiXHQiICsgbGIoNC41KSArICJcdCIgKyBsbig0LjUpICsgIlx0IiArIGxvZyg0LjUpICsgIlx0IiArIGxvZyg0LjUsIE1hdGguUEkpICsgIlx0IiArIGxvZyg0LjUsIDQuNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxLjEyNSArICJcdCIgKyBsYigxLjEyNSkgKyAiXHQiICsgbG4oMS4xMjUpICsgIlx0IiArIGxvZygxLjEyNSkgKyAiXHQiICsgbG9nKDEuMTI1LCBNYXRoLlBJKSArICJcdCIgKyBsb2coMS4xMjUsIDEuMTI1KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEuMjgyODkgKyAiXHQiICsgbGIoMS4yODI4OSkgKyAiXHQiICsgbG4oMS4yODI4OSkgKyAiXHQiICsgbG9nKDEuMjgyODkpICsgIlx0IiArIGxvZygxLjI4Mjg5LCBNYXRoLlBJKSArICJcdCIgKyBsb2coMS4yODI4OSwgMS4yODI4OSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxLjYgKyAiXHQiICsgbGIoMS42KSArICJcdCIgKyBsbigxLjYpICsgIlx0IiArIGxvZygxLjYpICsgIlx0IiArIGxvZygxLjYsIE1hdGguUEkpICsgIlx0IiArIGxvZygxLjYsIDEuNikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxLjk5OTk5OSArICJcdCIgKyBsYigxLjk5OTk5OSkgKyAiXHQiICsgbG4oMS45OTk5OTkpICsgIlx0IiArIGxvZygxLjk5OTk5OSkgKyAiXHQiICsgbG9nKDEuOTk5OTk5LCBNYXRoLlBJKSArICJcdCIgKyBsb2coMS45OTk5OTksIDEuOTk5OTk5KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDAuOTk5OTk5ICsgIlx0IiArIGxiKDAuOTk5OTk5KSArICJcdCIgKyBsbigwLjk5OTk5OSkgKyAiXHQiICsgbG9nKDAuOTk5OTk5KSArICJcdCIgKyBsb2coMC45OTk5OTksIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjk5OTk5OSwgMC45OTk5OTkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oOS45OTk5OTkgKyAiXHQiICsgbGIoOS45OTk5OTkpICsgIlx0IiArIGxuKDkuOTk5OTk5KSArICJcdCIgKyBsb2coOS45OTk5OTkpICsgIlx0IiArIGxvZyg5Ljk5OTk5OSwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDkuOTk5OTk5LCA5Ljk5OTk5OSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigwLjMgKyAiXHQiICsgbGIoMC4zKSArICJcdCIgKyBsbigwLjMpICsgIlx0IiArIGxvZygwLjMpICsgIlx0IiArIGxvZygwLjMsIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjMsIDAuMykpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigwLjkgKyAiXHQiICsgbGIoMC45KSArICJcdCIgKyBsbigwLjkpICsgIlx0IiArIGxvZygwLjkpICsgIlx0IiArIGxvZygwLjksIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjksIDAuOSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigwLjggKyAiXHQiICsgbGIoMC44KSArICJcdCIgKyBsbigwLjgpICsgIlx0IiArIGxvZygwLjgpICsgIlx0IiArIGxvZygwLjgsIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjgsIDAuOCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxLjQgKyAiXHQiICsgbGIoMS40KSArICJcdCIgKyBsbigxLjQpICsgIlx0IiArIGxvZygxLjQpICsgIlx0IiArIGxvZygxLjQsIE1hdGguUEkpICsgIlx0IiArIGxvZygxLjQsIDEuNCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxMCArICJcdCIgKyBsYigxMCkgKyAiXHQiICsgbG4oMTApICsgIlx0IiArIGxvZygxMCkgKyAiXHQiICsgbG9nKDEwLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMTAsIDEwKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEwMCArICJcdCIgKyBsYigxMDApICsgIlx0IiArIGxuKDEwMCkgKyAiXHQiICsgbG9nKDEwMCkgKyAiXHQiICsgbG9nKDEwMCwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEwMCwgMTAwKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEgKyAiXHQiICsgbGIoMSkgKyAiXHQiICsgbG4oMSkgKyAiXHQiICsgbG9nKDEpICsgIlx0IiArIGxvZygxLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMSwgMSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxMDAwICsgIlx0IiArIGxiKDEwMDApICsgIlx0IiArIGxuKDEwMDApICsgIlx0IiArIGxvZygxMDAwKSArICJcdCIgKyBsb2coMTAwMCwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEwMDAsIDEwMDApKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMC4xICsgIlx0IiArIGxiKDAuMSkgKyAiXHQiICsgbG4oMC4xKSArICJcdCIgKyBsb2coMC4xKSArICJcdCIgKyBsb2coMC4xLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMC4xLCAwLjEpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMC4wMSArICJcdCIgKyBsYigwLjAxKSArICJcdCIgKyBsbigwLjAxKSArICJcdCIgKyBsb2coMC4wMSkgKyAiXHQiICsgbG9nKDAuMDEsIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjAxLCAwLjAxKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDAuMDAxICsgIlx0IiArIGxiKDAuMDAxKSArICJcdCIgKyBsbigwLjAwMSkgKyAiXHQiICsgbG9nKDAuMDAxKSArICJcdCIgKyBsb2coMC4wMDEsIE1hdGguUEkpICsgIlx0IiArIGxvZygwLjAwMSwgMC4wMDEpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMi43MTgyODE4Mjg0NTkwNDUyMzUzNiArICJcdCIgKyBsYigyLjcxODI4MTgyODQ1OTA0NTIzNTM2KSArICJcdCIgKyBsbigyLjcxODI4MTgyODQ1OTA0NTIzNTM2KSArICJcdCIgKyBsb2coMi43MTgyODE4Mjg0NTkwNDUyMzUzNikgKyAiXHQiICsgbG9nKDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYsIE1hdGguUEkpICsgIlx0IiArIGxvZygyLjcxODI4MTgyODQ1OTA0NTIzNTM2LCAyLjcxODI4MTgyODQ1OTA0NTIzNTM2KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDIgKyAiXHQiICsgbGIoMikgKyAiXHQiICsgbG4oMikgKyAiXHQiICsgbG9nKDIpICsgIlx0IiArIGxvZygyLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMiwgMikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbig4ICsgIlx0IiArIGxiKDgpICsgIlx0IiArIGxuKDgpICsgIlx0IiArIGxvZyg4KSArICJcdCIgKyBsb2coOCwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDgsIDgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMTAyNCArICJcdCIgKyBsYigxMDI0KSArICJcdCIgKyBsbigxMDI0KSArICJcdCIgKyBsb2coMTAyNCkgKyAiXHQiICsgbG9nKDEwMjQsIE1hdGguUEkpICsgIlx0IiArIGxvZygxMDI0LCAxMDI0KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDExICsgIlx0IiArIGxiKDExKSArICJcdCIgKyBsbigxMSkgKyAiXHQiICsgbG9nKDExKSArICJcdCIgKyBsb2coMTEsIE1hdGguUEkpICsgIlx0IiArIGxvZygxMSwgMTEpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMTMgKyAiXHQiICsgbGIoMTMpICsgIlx0IiArIGxuKDEzKSArICJcdCIgKyBsb2coMTMpICsgIlx0IiArIGxvZygxMywgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEzLCAxMykpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigyLjEzICsgIlx0IiArIGxiKDIuMTMpICsgIlx0IiArIGxuKDIuMTMpICsgIlx0IiArIGxvZygyLjEzKSArICJcdCIgKyBsb2coMi4xMywgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDIuMTMsIDIuMTMpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMS4yMTIxMjEyMTIgKyAiXHQiICsgbGIoMS4yMTIxMjEyMTIpICsgIlx0IiArIGxuKDEuMjEyMTIxMjEyKSArICJcdCIgKyBsb2coMS4yMTIxMjEyMTIpICsgIlx0IiArIGxvZygxLjIxMjEyMTIxMiwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEuMjEyMTIxMjEyLCAxLjIxMjEyMTIxMikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxLjAwMSArICJcdCIgKyBsYigxLjAwMSkgKyAiXHQiICsgbG4oMS4wMDEpICsgIlx0IiArIGxvZygxLjAwMSkgKyAiXHQiICsgbG9nKDEuMDAxLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMS4wMDEsIDEuMDAxKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDY5NCArICJcdCIgKyBsYig2OTQpICsgIlx0IiArIGxuKDY5NCkgKyAiXHQiICsgbG9nKDY5NCkgKyAiXHQiICsgbG9nKDY5NCwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDY5NCwgNjk0KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEuNjE4MDMzOTg4NyArICJcdCIgKyBsYigxLjYxODAzMzk4ODcpICsgIlx0IiArIGxuKDEuNjE4MDMzOTg4NykgKyAiXHQiICsgbG9nKDEuNjE4MDMzOTg4NykgKyAiXHQiICsgbG9nKDEuNjE4MDMzOTg4NywgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEuNjE4MDMzOTg4NywgMS42MTgwMzM5ODg3KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDIuNDE0MjEzNTYyMyArICJcdCIgKyBsYigyLjQxNDIxMzU2MjMpICsgIlx0IiArIGxuKDIuNDE0MjEzNTYyMykgKyAiXHQiICsgbG9nKDIuNDE0MjEzNTYyMykgKyAiXHQiICsgbG9nKDIuNDE0MjEzNTYyMywgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDIuNDE0MjEzNTYyMywgMi40MTQyMTM1NjIzKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEuNDE0MjEzNTYyMyArICJcdCIgKyBsYigxLjQxNDIxMzU2MjMpICsgIlx0IiArIGxuKDEuNDE0MjEzNTYyMykgKyAiXHQiICsgbG9nKDEuNDE0MjEzNTYyMykgKyAiXHQiICsgbG9nKDEuNDE0MjEzNTYyMywgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDEuNDE0MjEzNTYyMywgMS40MTQyMTM1NjIzKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDE3LjEwODUgKyAiXHQiICsgbGIoMTcuMTA4NSkgKyAiXHQiICsgbG4oMTcuMTA4NSkgKyAiXHQiICsgbG9nKDE3LjEwODUpICsgIlx0IiArIGxvZygxNy4xMDg1LCBNYXRoLlBJKSArICJcdCIgKyBsb2coMTcuMTA4NSwgMTcuMTA4NSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigyNy4wNjg0ICsgIlx0IiArIGxiKDI3LjA2ODQpICsgIlx0IiArIGxuKDI3LjA2ODQpICsgIlx0IiArIGxvZygyNy4wNjg0KSArICJcdCIgKyBsb2coMjcuMDY4NCwgTWF0aC5QSSkgKyAiXHQiICsgbG9nKDI3LjA2ODQsIDI3LjA2ODQpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMTcuMTAwOCArICJcdCIgKyBsYigxNy4xMDA4KSArICJcdCIgKyBsbigxNy4xMDA4KSArICJcdCIgKyBsb2coMTcuMTAwOCkgKyAiXHQiICsgbG9nKDE3LjEwMDgsIE1hdGguUEkpICsgIlx0IiArIGxvZygxNy4xMDA4LCAxNy4xMDA4KSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEwLjExMTIgKyAiXHQiICsgbGIoMTAuMTExMikgKyAiXHQiICsgbG4oMTAuMTExMikgKyAiXHQiICsgbG9nKDEwLjExMTIpICsgIlx0IiArIGxvZygxMC4xMTEyLCBNYXRoLlBJKSArICJcdCIgKyBsb2coMTAuMTExMiwgMTAuMTExMikpOwogICAgfQp9