Blog

rust

String #

fn main()
{
	//String和&str的区别可自行百度
	//空字符串
	let s=String::new();
	//可变字符串
	let mut s1=String:from("123");
	//追加字符串
	s1.push_str("456");
	//追加字符
	s1.push("1");
}

json #

use std::fs::File;

use serde_json::Value;
fn main(){
	//解析io流文件
    let f=File::open("test.txt").unwrap();
    let json:Value=serde_json::from_reader(f).unwrap();
    //let json:Value=serde_json::from_str(text).unwrap();
    for i in json["data"].as_array().unwrap(){
        println!("{}",i["name"].as_str().unwrap());
    }
}

reqwest #


use std::{time::{SystemTime, UNIX_EPOCH}};

fn get_time() -> String{
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_millis()
        .to_string()
}



async fn post() -> Result<String, reqwest::Error>{
    let client = reqwest::Client::new();
    // let mut headers = HeaderMap::new();
    // headers.insert("Content-Type", "application/json".parse().unwrap());

    let time=get_time();
    let data=[("phone","17340307464"),("password","d41d8cd98f00b204e9800998ecf8427e"),("countrycode",""),("rememberLogin","true"),("timerstamp",&time)];
    Ok(client.post("https://music.163.com/weapi/login/cellphone").json(&data).send().await?.text().await?)
}

#[tokio::main]
async fn main() {
    if let Ok(res) = post().await {
        println!("{:#?}", res);
    }
}

集合相关 #

fn main() {
    let a = vec![(2, "aa"), (4, "c"), (3, "cc")];
    let b = vec![(3, "cc"), (5, "ee"), (2, "aa")];
 
    // 取交集
    let intersect = a.iter().filter(|&u| b.contains(u)).collect::<Vec<_>>();
    println!("a 和 b 交集是:{:?}", intersect);
 
    // 取差集
    let minusion = a.iter().filter(|&u| !b.contains(u)).collect::<Vec<_>>();
    println!("a 和 b 差集是:{:?}", minusion);
 
    // 取并集
    let union = a
        .iter()
        .filter(|&u| !b.contains(u))
        .chain(&b)
        .collect::<Vec<_>>();
    println!("a 和 b 并集是:{:?}", union);
 
    // 取补集
    let complement = a
        .iter()
        .filter(|&u| !b.contains(u))
        .chain(b.iter().filter(|&u| !a.contains(u)))
        .collect::<Vec<_>>();
    println!("a 和 b 补集是:{:?}", complement);
}

lyric and add_pic #


use metaflac::Tag;
use metaflac::block::PictureType::Media;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error>{
    let lyc="[00:09.74]群青色の空\n[00:11.88]自由なんてものは\n[00:14.02]手を伸ばすほどに遠く遠く飛んでく\n[00:16.80]ほら、海猫の歌が僕を笑っているんだ\n[00:21.28]夏の島に縛られた十六年間\n[00:25.08]長い前髪も伸び過ぎて捨てられたあの日みたい\n[00:29.32]どんな愛情も\n[00:30.50]ねえ、たったひと切れのパンより軽い(ライト)\n[00:32.80]生きているよ\n[00:34.43]神様にもきっと見捨てられている僕でも\n[00:40.10]追い風に白い帆を上げよう\n[00:43.92]君が留まり僕がゆくなら\n[00:47.76]いつか遠い海で会えるんだろう\n[00:51.56]きっとこの星はまあるいから\n[00:55.40]追い風に白い帆を上げよう\n[00:59.14]君が留まり僕がゆくなら\n[01:02.88]いつか遠い海で会えるんだろう\n[01:06.78]きっとこの星はまあるいから\n[01:25.62]潮の香りが染み込んでいる日だ\n[01:29.76]薄汚れた白い背中を押す風が吹いた\n[01:33.68]もし叶うなら愛されたいな\n[01:37.52]あたたかな胸に頰を埋め眠りたいな\n[01:41.38]雲を追うよ、風を切るマスト\n[01:45.02]僕を乗せた船はどこまでも\n[01:48.72]黄金島にもゆけるよ\n[01:50.60]地図はないけど\n[01:52.32]さあ、人魚たちの歌に手を叩こう\n[01:56.54]ナナナ……\n[02:11.53]追い風に白い帆を上げよう\n[02:15.30]君が留まり僕がゆくなら\n[02:19.16]いつか遠い海で会えるんだろう\n[02:22.92]きっとこの星はまあるいから\n[02:26.94]追い風に白い帆を上げよう\n[02:30.48]君が留まり僕がゆくなら\n[02:34.24]いつか遠い海で会えるんだろう\n[02:38.16]きっとこの星はまあるいから\n[02:47.54]まあるいから\n[02:55.42]まあるいから\n";
    let mut tag = Tag::read_from_path("C:/test/rust/demo1/file/wcat.flac").unwrap();
    
    let data=reqwest::get("https://p2.music.126.net/mog628G4JLNEMi-GpWxccQ==/109951164647211717.jpg").await?.bytes().await?.to_vec();
    
    tag.add_picture("image/jpeg", Media, data);

    let comment=tag.vorbis_comments_mut();

    comment.set_lyrics(vec![lyc]);

    tag.save().unwrap();
    Ok(())
}

python Notes

清华源 #

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple model

linux中python2和3的pip
python{2,3} -m pip install xxx

Base64 #

import base64
import string
base64.b64decode() #解码
base64.b64encode() #编码

处理变表base64

str1 = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==" #解码字符串

string1 = "TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #变换后的码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print(base64.b64decode(str1.translate(str.maketrans(string1,string2))))

正则 #

取AB中间字符

(?<=A).*?(?=B)   #不包含AB
A.*?B            #包含AB
A.*?(?=B)        #包含A不包含B
import re
re.findall(r"(?<=A).*?(?=B)",str)

n位字符取一次

re.findall(r'.{2}',str)

requests #

import requests


url='http://example.com'
data={'example':'123'}     # data 即from-data
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47'}     #header  请求头
proxy={'http':'127.0.0.1:7890','https':'127.0.0.1:7890'}     #设置代理

# from-data
result=requests.post(url,data=data,headers=header)           # 发起一个post请求

# 发送json
# result=requests.post(url,json=data,headers=header)

result.status_code='utf-8'     #设置编码,一般无需

print(result.text)             #返回文本内容
print(result.json())           # 解析json,得到字典
print(result.content)          # 获得二进制内容,如mp3,常用写入文件
print(result.headers)          

线程池 #

from concurrent.futures import ThreadPoolExecutor
def test(x):
    pass
with ThreadPoolExecutor(max_workers=5) as t:
    for x in range(10):
        t.submit(test,x)

hash #

import hashlib
m = hashlib.md5()
m.update(b'123')
m.hexdigest()

hashlib.md5(b'123').hexdigest()

hashlib.new('md5', b'123').hexdigest()

指定md5结尾

...

flutter

起因 #

放假在家闲的皮爆,有空学习写了个(其实在很久之前就有打算了) 因为网易云音乐下载有很多但是加密的,虽然可以解密,但是也不方便管理,所以就有了这个软件,可以嵌入元数据(mp3和flac),包括歌词封面等。同步网易云歌单,可以删除本地文件

开发 #

至于学习flutter,最开始知道flutter是因为逆向系列了解到的,听说写ui很方便,之前也有用过java开发。java的语法还也不是很喜欢。 网易云的api 参考: NeteaseCloudMusicApi

学习编程语言我不是很喜欢看视频来,慢得很,需要什么直接去搜代码就行了。 先看看官方的文档,demo,自己需要什么功能直接百度 虽然可能了解不深刻,但是跟着视频写代码更烦人

使用 #

设置里面要先设置cookie,只需要cookie中的MUSIC_U的部分,以及保存路径,这个保存路径是歌单的保存路径,如果下载的话会根据歌单名为文件夹保存在下级。

元数据默认嵌入所有

先根据歌单id获取歌曲,若要下载需要收藏歌单,下载完成会检测本地歌单中多余歌曲并徐闻是否删除。

似乎就这点鸟功能

某H视频-mls

分析流程 #

这个软件呢,其实分析主要就是想要看他拉人获得vip的操作

抓包可以找到一个api

api/user/traveler

这之前token还没有得到,参数

{"deviceId": device, "dev": 随机3字符, "code": '{"p":"PDTVPD"}'}

这个code参数其实开始我也不知道是啥,走了一遍拉人的流程,发现app给我们的邀请链接有p参数,就是邀请码

https://z6mhir31k.xyz?p=PDTVPD

在进到网页中点击下载软件会将邀请码复制到我们的粘贴板上

{"p":"PDTVPD"}

当你进入app时,读取粘贴板的第一条数据

 public static String u() {
        ClipData v0 = FragmentAnim.f.getSystemService("clipboard").getPrimaryClip();
        String v1 = "";
        if(v0 != null && v0.getItemCount() > 0) {
            CharSequence v0_1 = v0.getItemAt(0).getText();
            if(TextUtils.isEmpty(v0_1)) {
                return v1;
            }
            else {
                return v0_1.toString();
            }
        }

        return v1;
    }

deviceId #

顺着上去就发现了deviceId的生成

public final void C() {
        String v0_2;
        String v3_1;
        String v1 = "everb";
        String v2 = "";
        if(a.a.exists()) {
            try {
                ObjectInputStream v0_1 = new ObjectInputStream(new FileInputStream(a.a));
                Object v3 = v0_1.readObject();
                try {
                    v0_1.close();
                    goto label_21;
                }
                catch(Exception v0) {
                }
            }
            catch(Exception v0) {
                v3_1 = v2;
            }

            Log.d(v1, v0.toString());
        }
        else {
            v3_1 = v2;
        }

    label_21:
        if(v3_1 == null) {
            Log.d(v1, "data == null");
            v3_1 = v2;
        }

        if(TextUtils.isEmpty(((CharSequence)v3_1))) {
            v0_2 = String.valueOf(System.currentTimeMillis() + UUID.randomUUID().getLeastSignificantBits());
            try {
                byte[] v0_4 = MessageDigest.getInstance("MD5").digest(v0_2.getBytes());
                StringBuilder v1_1 = new StringBuilder();
                int v5;
                for(v5 = 0; v5 < v0_4.length; ++v5) {
                    String v6 = Integer.toHexString(v0_4[v5] & 0xFF);
                    if(v6.length() < 2) {
                        v1_1.append(0);
                    }

                    v1_1.append(v6);
                }

                v3_1 = v1_1.toString();
            }

他会打开是个名为.CAD的文件,把deviceid写进去,如果像要看一遍生成新device,记得删除这个文件

...

某洗衣小程序

小程序逆向 #

  1. 抓包

    电脑版微信最新版抓不了包,用3.7.6一下的

    微信在登陆时,右上角把代理填上

    把AppData\Roaming\Tencent\WeChat\XPlugin\Plugins里面的东西删了,不影响使用

  1. 解密

    下载aen516954023/wxappUnpacker: 微信小程序本地应用包逆向工具 (github.com)

    解密wxapkg文件,在C:\Users\xxx\Documents\WeChat Files\Applet

    在解密的时候出现各种几把问题,均可参考百度,google等

    可能因为解密不出来wml和wss不能动态调试很难受

    wxapkg文件解包

    其他的单独解

  2. 逆向

    因为没有拿到wml和wss,所以只能静态分析

    还好比较简单

    image-20221018221138862

​ 因为不能调试,不知道最后一个sign传的什么参数,是做的md5

import requests
import execjs

phone='17628818007'
url='https://www.sharewash.cn/saywash/WashCallApi/common/user/requestVerifyCode.api'
data={'phoneNumber':phone,'ssid':'','tokenId':'','sign':''}

with open('../js/2.js','r',encoding='utf-8') as fp:
    js1=fp.read()
ssid=execjs.compile(js1).call('getTime')
data['ssid']=ssid
data['sign']=execjs.compile(js1).call('getsign',ssid,phone)
print(data)
function getsign() {
    var i, g = arguments;
    i = { 'phoneNumber': '17628818007', 'ssid': '', 'tokenId': '' }
    return i.ssid = getTime(), i.tokenId = false || "", i.sign = sign(i)
}
    function r(r) {
        var a = new Array(), n = r.length, s = parseInt(n / 4), f = n % 4, o = 0;
        for (o = 0; o < s; o++) a[o] = e(r.substring(4 * o + 0, 4 * o + 4));
        return f > 0 && (a[o] = e(r.substring(4 * o + 0, n))), a;
    }

    function e(r) {
        var e = r.length, a = new Array(64), n = 0, s = 0, f = 0, o = 0;
        if (e < 4) {
            for (n = 0; n < e; n++) {
                var c = r.charCodeAt(n);
                for (s = 0; s < 16; s++) {
                    var t = 1, l = 0;
                    for (l = 15; l > s; l--) t *= 2;
                    a[16 * n + s] = parseInt(c / t) % 2;
                }
            }
            for (f = e; f < 4; f++) {
                c = 0;
                for (o = 0; o < 16; o++) {
                    t = 1, l = 0;
                    for (l = 15; l > o; l--) t *= 2;
                    a[16 * f + o] = parseInt(c / t) % 2;
                }
            }
        } else for (n = 0; n < 4; n++) {
            c = r.charCodeAt(n);
            for (s = 0; s < 16; s++) {
                t = 1;
                for (l = 15; l > s; l--) t *= 2;
                a[16 * n + s] = parseInt(c / t) % 2;
            }
        }
        return a;
    }

    function a(r) {
        var e;
        switch (r) {
            case "0000":
                e = "0";
                break;

            case "0001":
                e = "1";
                break;

            case "0010":
                e = "2";
                break;

            case "0011":
                e = "3";
                break;

            case "0100":
                e = "4";
                break;

            case "0101":
                e = "5";
                break;

            case "0110":
                e = "6";
                break;

            case "0111":
                e = "7";
                break;

            case "1000":
                e = "8";
                break;

            case "1001":
                e = "9";
                break;

            case "1010":
                e = "A";
                break;

            case "1011":
                e = "B";
                break;

            case "1100":
                e = "C";
                break;

            case "1101":
                e = "D";
                break;

            case "1110":
                e = "E";
                break;

            case "1111":
                e = "F";
        }
        return e;
    }

    function n(r) {
        for (var e = "", n = 0; n < 16; n++) {
            for (var s = "", f = 0; f < 4; f++) s += r[4 * n + f];
            e += a(s);
        }
        return e;
    }

    function s(r, e) {
        var a = k(e), n = f(r), s = new Array(32), b = new Array(32), i = new Array(32), w = 0, v = 0, A = 0, y = 0, h = 0;
        for (A = 0; A < 32; A++) s[A] = n[A], b[A] = n[32 + A];
        for (w = 0; w < 16; w++) {
            for (v = 0; v < 32; v++) i[v] = s[v], s[v] = b[v];
            var g = new Array(48);
            for (y = 0; y < 48; y++) g[y] = a[w][y];
            var p = c(l(t(c(o(b), g))), i);
            for (h = 0; h < 32; h++) b[h] = p[h];
        }
        var I = new Array(64);
        for (w = 0; w < 32; w++) I[w] = b[w], I[32 + w] = s[w];
        return u(I);
    }

    function f(r) {
        for (var e = new Array(64), a = 0, n = 1, s = 0; a < 4; a++, n += 2, s += 2) for (var f = 7, o = 0; f >= 0; f--,
            o++) e[8 * a + o] = r[8 * f + n], e[8 * a + o + 32] = r[8 * f + s];
        return e;
    }

    function o(r) {
        for (var e = new Array(48), a = 0; a < 8; a++) e[6 * a + 0] = 0 == a ? r[31] : r[4 * a - 1],
            e[6 * a + 1] = r[4 * a + 0], e[6 * a + 2] = r[4 * a + 1], e[6 * a + 3] = r[4 * a + 2],
            e[6 * a + 4] = r[4 * a + 3], e[6 * a + 5] = 7 == a ? r[0] : r[4 * a + 4];
        return e;
    }

    function c(r, e) {
        for (var a = new Array(r.length), n = 0; n < r.length; n++) a[n] = r[n] ^ e[n];
        return a;
    }

    function t(r) {
        for (var e = new Array(32), a = "", n = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7], [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8], [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0], [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]], s = [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10], [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5], [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15], [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]], f = [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8], [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1], [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7], [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]], o = [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15], [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9], [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4], [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]], c = [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9], [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6], [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14], [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]], t = [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11], [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8], [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6], [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]], l = [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1], [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6], [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2], [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]], u = [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7], [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2], [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8], [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]], k = 0; k < 8; k++) {
            var i, w;
            switch (i = 2 * r[6 * k + 0] + r[6 * k + 5], w = 2 * r[6 * k + 1] * 2 * 2 + 2 * r[6 * k + 2] * 2 + 2 * r[6 * k + 3] + r[6 * k + 4],
            k) {
                case 0:
                    a = b(n[i][w]);
                    break;

                case 1:
                    a = b(s[i][w]);
                    break;

                case 2:
                    a = b(f[i][w]);
                    break;

                case 3:
                    a = b(o[i][w]);
                    break;

                case 4:
                    a = b(c[i][w]);
                    break;

                case 5:
                    a = b(t[i][w]);
                    break;

                case 6:
                    a = b(l[i][w]);
                    break;

                case 7:
                    a = b(u[i][w]);
            }
            e[4 * k + 0] = parseInt(a.substring(0, 1)), e[4 * k + 1] = parseInt(a.substring(1, 2)),
                e[4 * k + 2] = parseInt(a.substring(2, 3)), e[4 * k + 3] = parseInt(a.substring(3, 4));
        }
        return e;
    }

    function l(r) {
        var e = new Array(32);
        return e[0] = r[15], e[1] = r[6], e[2] = r[19], e[3] = r[20], e[4] = r[28], e[5] = r[11],
            e[6] = r[27], e[7] = r[16], e[8] = r[0], e[9] = r[14], e[10] = r[22], e[11] = r[25],
            e[12] = r[4], e[13] = r[17], e[14] = r[30], e[15] = r[9], e[16] = r[1], e[17] = r[7],
            e[18] = r[23], e[19] = r[13], e[20] = r[31], e[21] = r[26], e[22] = r[2], e[23] = r[8],
            e[24] = r[18], e[25] = r[12], e[26] = r[29], e[27] = r[5], e[28] = r[21], e[29] = r[10],
            e[30] = r[3], e[31] = r[24], e;
    }

    function u(r) {
        var e = new Array(64);
        return e[0] = r[39], e[1] = r[7], e[2] = r[47], e[3] = r[15], e[4] = r[55], e[5] = r[23],
            e[6] = r[63], e[7] = r[31], e[8] = r[38], e[9] = r[6], e[10] = r[46], e[11] = r[14],
            e[12] = r[54], e[13] = r[22], e[14] = r[62], e[15] = r[30], e[16] = r[37], e[17] = r[5],
            e[18] = r[45], e[19] = r[13], e[20] = r[53], e[21] = r[21], e[22] = r[61], e[23] = r[29],
            e[24] = r[36], e[25] = r[4], e[26] = r[44], e[27] = r[12], e[28] = r[52], e[29] = r[20],
            e[30] = r[60], e[31] = r[28], e[32] = r[35], e[33] = r[3], e[34] = r[43], e[35] = r[11],
            e[36] = r[51], e[37] = r[19], e[38] = r[59], e[39] = r[27], e[40] = r[34], e[41] = r[2],
            e[42] = r[42], e[43] = r[10], e[44] = r[50], e[45] = r[18], e[46] = r[58], e[47] = r[26],
            e[48] = r[33], e[49] = r[1], e[50] = r[41], e[51] = r[9], e[52] = r[49], e[53] = r[17],
            e[54] = r[57], e[55] = r[25], e[56] = r[32], e[57] = r[0], e[58] = r[40], e[59] = r[8],
            e[60] = r[48], e[61] = r[16], e[62] = r[56], e[63] = r[24], e;
    }

    function b(r) {
        var e = "";
        switch (r) {
            case 0:
                e = "0000";
                break;

            case 1:
                e = "0001";
                break;

            case 2:
                e = "0010";
                break;

            case 3:
                e = "0011";
                break;

            case 4:
                e = "0100";
                break;

            case 5:
                e = "0101";
                break;

            case 6:
                e = "0110";
                break;

            case 7:
                e = "0111";
                break;

            case 8:
                e = "1000";
                break;

            case 9:
                e = "1001";
                break;

            case 10:
                e = "1010";
                break;

            case 11:
                e = "1011";
                break;

            case 12:
                e = "1100";
                break;

            case 13:
                e = "1101";
                break;

            case 14:
                e = "1110";
                break;

            case 15:
                e = "1111";
        }
        return e;
    }

    function k(r) {
        var e = new Array(56), a = new Array();
        a[0] = new Array(), a[1] = new Array(), a[2] = new Array(), a[3] = new Array(),
            a[4] = new Array(), a[5] = new Array(), a[6] = new Array(), a[7] = new Array(),
            a[8] = new Array(), a[9] = new Array(), a[10] = new Array(), a[11] = new Array(),
            a[12] = new Array(), a[13] = new Array(), a[14] = new Array(), a[15] = new Array();
        for (var n = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1], s = 0; s < 7; s++) for (var f = 0, o = 7; f < 8; f++,
            o--) e[8 * s + f] = r[8 * o + s];
        s = 0;
        for (s = 0; s < 16; s++) {
            var c = 0, t = 0;
            for (f = 0; f < n[s]; f++) {
                for (c = e[0], t = e[28], o = 0; o < 27; o++) e[o] = e[o + 1], e[28 + o] = e[29 + o];
                e[27] = c, e[55] = t;
            }
            var l = new Array(48);
            switch (l[0] = e[13], l[1] = e[16], l[2] = e[10], l[3] = e[23], l[4] = e[0], l[5] = e[4],
            l[6] = e[2], l[7] = e[27], l[8] = e[14], l[9] = e[5], l[10] = e[20], l[11] = e[9],
            l[12] = e[22], l[13] = e[18], l[14] = e[11], l[15] = e[3], l[16] = e[25], l[17] = e[7],
            l[18] = e[15], l[19] = e[6], l[20] = e[26], l[21] = e[19], l[22] = e[12], l[23] = e[1],
            l[24] = e[40], l[25] = e[51], l[26] = e[30], l[27] = e[36], l[28] = e[46], l[29] = e[54],
            l[30] = e[29], l[31] = e[39], l[32] = e[50], l[33] = e[44], l[34] = e[32], l[35] = e[47],
            l[36] = e[43], l[37] = e[48], l[38] = e[38], l[39] = e[55], l[40] = e[33], l[41] = e[52],
            l[42] = e[45], l[43] = e[41], l[44] = e[49], l[45] = e[35], l[46] = e[28], l[47] = e[31],
            s) {
                case 0:
                    for (var u = 0; u < 48; u++) a[0][u] = l[u];
                    break;

                case 1:
                    for (u = 0; u < 48; u++) a[1][u] = l[u];
                    break;

                case 2:
                    for (u = 0; u < 48; u++) a[2][u] = l[u];
                    break;

                case 3:
                    for (u = 0; u < 48; u++) a[3][u] = l[u];
                    break;

                case 4:
                    for (u = 0; u < 48; u++) a[4][u] = l[u];
                    break;

                case 5:
                    for (u = 0; u < 48; u++) a[5][u] = l[u];
                    break;

                case 6:
                    for (u = 0; u < 48; u++) a[6][u] = l[u];
                    break;

                case 7:
                    for (u = 0; u < 48; u++) a[7][u] = l[u];
                    break;

                case 8:
                    for (u = 0; u < 48; u++) a[8][u] = l[u];
                    break;

                case 9:
                    for (u = 0; u < 48; u++) a[9][u] = l[u];
                    break;

                case 10:
                    for (u = 0; u < 48; u++) a[10][u] = l[u];
                    break;

                case 11:
                    for (u = 0; u < 48; u++) a[11][u] = l[u];
                    break;

                case 12:
                    for (u = 0; u < 48; u++) a[12][u] = l[u];
                    break;

                case 13:
                    for (u = 0; u < 48; u++) a[13][u] = l[u];
                    break;

                case 14:
                    for (u = 0; u < 48; u++) a[14][u] = l[u];
                    break;

                case 15:
                    for (u = 0; u < 48; u++) a[15][u] = l[u];
            }
        }
        return a;
    }

    // module.exports = {
    function getTime() {
        return function (a, f, o, c) {
            var t, l, u, b, k, i, w = a.length, v = "";
            null != f && "" != f && (t = r(f), b = t.length);
            null != o && "" != o && (l = r(o), k = l.length);
            null != c && "" != c && (u = r(c), i = u.length);
            if (w > 0) if (w < 4) {
                var A = e(a);
                if (null != f && "" != f && null != o && "" != o && null != c && "" != c) {
                    for ($ = A, y = 0; y < b; y++) $ = s($, t[y]);
                    for (C = 0; C < k; C++) $ = s($, l[C]);
                    for (d = 0; d < i; d++) $ = s($, u[d]);
                    x = $;
                } else if (null != f && "" != f && null != o && "" != o) {
                    for ($ = A, y = 0; y < b; y++) $ = s($, t[y]);
                    for (C = 0; C < k; C++) $ = s($, l[C]);
                    x = $;
                } else if (null != f && "" != f) {
                    var y = 0;
                    for ($ = A, y = 0; y < b; y++) $ = s($, t[y]);
                    x = $;
                }
                v = n(x);
            } else {
                var h = parseInt(w / 4), g = w % 4, p = 0;
                for (p = 0; p < h; p++) {
                    var I = e(a.substring(4 * p + 0, 4 * p + 4));
                    if (null != f && "" != f && null != o && "" != o && null != c && "" != c) {
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        for (C = 0; C < k; C++) $ = s($, l[C]);
                        for (d = 0; d < i; d++) $ = s($, u[d]);
                        x = $;
                    } else if (null != f && "" != f && null != o && "" != o) {
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        for (C = 0; C < k; C++) $ = s($, l[C]);
                        x = $;
                    } else if (null != f && "" != f) {
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        x = $;
                    }
                    v += n(x);
                }
                if (g > 0) {
                    var x;
                    I = e(a.substring(4 * h + 0, w));
                    if (null != f && "" != f && null != o && "" != o && null != c && "" != c) {
                        var d;
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        for (C = 0; C < k; C++) $ = s($, l[C]);
                        for (d = 0; d < i; d++) $ = s($, u[d]);
                        x = $;
                    } else if (null != f && "" != f && null != o && "" != o) {
                        var C;
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        for (C = 0; C < k; C++) $ = s($, l[C]);
                        x = $;
                    } else if (null != f && "" != f) {
                        var $;
                        for ($ = I, y = 0; y < b; y++) $ = s($, t[y]);
                        x = $;
                    }
                    v += n(x);
                }
            }
            return v;
        }("saywash#" + new Date().valueOf(), "hlF#$1x)", "hlG#$2x)", "hlH#$3x)");
    }


function sign(e) {
    Array.prototype.indexVf = function (r) {
        for (var e = 0; e < this.length; e++) if (this[e] == r) return e;
    }
    var t = [], n = [], i = [];
    for (var s in e) t.push(s), i.push(s), n.push(e[s]);
    for (var o = i.sort(), u = "SING=HLYF", f = 0; f < o.length; f++) if ("tokenId" != o[f] && "ssid" != o[f] && "sign" != o[f]) {
        var a = t.indexVf(o[f]);
        "" != n[a] && null != n[a] && (u = u + "&" + o[f] + "=" + n[a]);
    }

    return "SING=HLYF" == (u = u.toUpperCase()) && (u = "SING=HLYF&"), u = md5(u);
}

function md5(string) {
    function md5_RotateLeft(lValue, iShiftBits) {
        return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
    }

    function md5_AddUnsigned(lX, lY) {
        var lX4, lY4, lX8, lY8, lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function md5_F(x, y, z) {
        return (x & y) | ((~x) & z);
    }

    function md5_G(x, y, z) {
        return (x & z) | (y & (~z));
    }

    function md5_H(x, y, z) {
        return (x ^ y ^ z);
    }

    function md5_I(x, y, z) {
        return (y ^ (x | (~z)));
    }

    function md5_FF(a, b, c, d, x, s, ac) {
        a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_F(b, c, d), x), ac));
        return md5_AddUnsigned(md5_RotateLeft(a, s), b);
    };

    function md5_GG(a, b, c, d, x, s, ac) {
        a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_G(b, c, d), x), ac));
        return md5_AddUnsigned(md5_RotateLeft(a, s), b);
    };

    function md5_HH(a, b, c, d, x, s, ac) {
        a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_H(b, c, d), x), ac));
        return md5_AddUnsigned(md5_RotateLeft(a, s), b);
    };

    function md5_II(a, b, c, d, x, s, ac) {
        a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_I(b, c, d), x), ac));
        return md5_AddUnsigned(md5_RotateLeft(a, s), b);
    };

    function md5_ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1 = lMessageLength + 8;
        var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
        var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
        var lWordArray = Array(lNumberOfWords - 1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while (lByteCount < lMessageLength) {
            lWordCount = (lByteCount - (lByteCount % 4)) / 4;
            lBytePosition = (lByteCount % 4) * 8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount - (lByteCount % 4)) / 4;
        lBytePosition = (lByteCount % 4) * 8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
        lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
        lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
        return lWordArray;
    };

    function md5_WordToHex(lValue) {
        var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
        for (lCount = 0; lCount <= 3; lCount++) {
            lByte = (lValue >>> (lCount * 8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
        }
        return WordToHexValue;
    };

    function md5_Utf8Encode(string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    };
    var x = Array();
    var k, AA, BB, CC, DD, a, b, c, d;
    var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
    var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
    var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
    var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
    string = md5_Utf8Encode(string);
    x = md5_ConvertToWordArray(string);
    a = 0x67452301;
    b = 0xEFCDAB89;
    c = 0x98BADCFE;
    d = 0x10325476;
    for (k = 0; k < x.length; k += 16) {
        AA = a;
        BB = b;
        CC = c;
        DD = d;
        a = md5_FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
        d = md5_FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
        c = md5_FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
        b = md5_FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
        a = md5_FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
        d = md5_FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
        c = md5_FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
        b = md5_FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
        a = md5_FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
        d = md5_FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
        c = md5_FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
        b = md5_FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
        a = md5_FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
        d = md5_FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
        c = md5_FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
        b = md5_FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
        a = md5_GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
        d = md5_GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
        c = md5_GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
        b = md5_GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
        a = md5_GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
        d = md5_GG(d, a, b, c, x[k + 10], S22, 0x2441453);
        c = md5_GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
        b = md5_GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
        a = md5_GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
        d = md5_GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
        c = md5_GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
        b = md5_GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
        a = md5_GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
        d = md5_GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
        c = md5_GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
        b = md5_GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
        a = md5_HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
        d = md5_HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
        c = md5_HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
        b = md5_HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
        a = md5_HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
        d = md5_HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
        c = md5_HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
        b = md5_HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
        a = md5_HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
        d = md5_HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
        c = md5_HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
        b = md5_HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
        a = md5_HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
        d = md5_HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
        c = md5_HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
        b = md5_HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
        a = md5_II(a, b, c, d, x[k + 0], S41, 0xF4292244);
        d = md5_II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
        c = md5_II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
        b = md5_II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
        a = md5_II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
        d = md5_II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
        c = md5_II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
        b = md5_II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
        a = md5_II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
        d = md5_II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
        c = md5_II(c, d, a, b, x[k + 6], S43, 0xA3014314);
        b = md5_II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
        a = md5_II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
        d = md5_II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
        c = md5_II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
        b = md5_II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
        a = md5_AddUnsigned(a, AA);
        b = md5_AddUnsigned(b, BB);
        c = md5_AddUnsigned(c, CC);
        d = md5_AddUnsigned(d, DD);
    }
    return (md5_WordToHex(a) + md5_WordToHex(b) + md5_WordToHex(c) + md5_WordToHex(d)).toLowerCase();
}