// The text to decipher. It was created using a substitution cipher
var text = """
Fxr nb, ekb dmrdxjb xf upfb pj, ie ubije direuo, ex kizb txo.
Drxlrinnbrj xfeby fbbu txo akby ekbo qiy qxyqbyerieb xy ekb qrbiepzb
jpwb xf drxlrinnpyl, Jx Rmho pj wbjplybw ex nigb drxlrinnbrj kiddo.
Rmho pykbrpebw ekb Dbru dkpuxjxdko xf kizpyl nxrb ekiy xyb aio
ex wx ekb jinb ekpyl. P pykbrpebw ekie dkpuxjxdko frxn Uirro Aiuu,
akx pj no kbrx iqemiuuo. P aiye ex nigb Rmho mjbrj frbb. P aiye ex
lpzb ekbn ekb frbbwxn ex qkxxjb. Dbxdub irb wpffbrbye. Dbxdub qkxxjb
wpffbrbye qrpebrpi. Hme pf ekbrb pj i hbeebr aio inxyl niyo
iuebryiepzbj, P aiye ex byqxmrilb ekie aio ho nigpyl pe qxnfxreihub.
Jx ekie'j akie P'zb erpbw ex wx.
P aiye ex jxuzb drxhubnj P nbbe py ekb wipuo upfb ho mjpyl qxndmebrj,
jx P ybbw ex arpeb drxlrinj. Ho mjpyl Rmho, P aiye ex qxyqbyerieb ekb
ekpylj P wx, yxe ekb nilpqiu rmubj xf ekb uiylmilb, upgb jeirepyl apek
dmhupq zxpw  jxnbekpyl jxnbekpyl jxnbekpyl ex jio, "drpye kbuux axruw."
P tmje aiye ex jio, "drpye ekpj!" P wxy'e aiye iuu ekb jmrrxmywpyl
nilpq gboaxrwj. P tmje aiye ex qxyqbyerieb xy ekb eijg. Ekie'j ekb hijpq
pwbi. Jx P kizb erpbw ex nigb Rmho qxwb qxyqpjb iyw jmqqpyqe.
Omgpkprx Niejmnxex. (lxllub keed://aaa.irepni.qxn/pyez/rmhoD.kenu)
"""

// This is the frequency table of the language of the original text
// (from more frequent to less frequent).
var freqLang = "TEOIARNSHMLYGCPUDWFBVKJXQZ"

// Create frequency table for the encrypted text.
var len = string.len(text)
var frequency = []

for (var k = 0; k < len; k += 1) {
    var c = string.upper(string.sub(text, k, k));
    // Check if character is an uppercase letter.
    if (string.find(c, "%u") != null) {
        if (frequency[c] == null) {
            frequency[c] = 1
        }
        else {
            frequency[c] += 1
        }
    }
}

// Create table for sorting the text frequency.
var sortFreq = {}
for each (var k,v in pairs(frequency)) {
    table.insert(sortFreq, {key: k, value: v})
}

// Sort in descending order.
table.sort(sortFreq, function(a, b) { return (a.value > b.value) })

// Create dictionary for deciphering.
var dic = {}
var freqText = ''
var index = 0

for each (var _,v in pairs(sortFreq)) {
    freqText ..= v.key
    dic[v.key] = string.sub(freqLang, index, index)
    index += 1
}

// Deciphering text by replacing characters.
var decrypted = ''
for (var k = 0; k < len; k += 1) {
    var uppercase = false;
    var c = string.sub(text, k, k)
    if (string.find(c, "%u")) {
        uppercase = true
    }
    else {
        c = string.upper(c);
    }
    if (dic[c] != null) {
        if (uppercase)  {
            decrypted ..= dic[c]
        }
        else {
            decrypted ..= string.lower(dic[c])
        }
    }
    else {
        decrypted ..= c
    }
}
print(decrypted)