1 | ;
|
2 | /**
|
3 | * URL识别模块
|
4 | *
|
5 | * @author 老雷<leizongmin@gmail.com>
|
6 | */
|
7 | var debug = console.log;
|
8 | /** 模块类型 */
|
9 | exports.type = 'tokenizer';
|
10 | /**
|
11 | * 模块初始化
|
12 | *
|
13 | * @param {Segment} segment 分词接口
|
14 | */
|
15 | exports.init = function (segment) {
|
16 | exports.segment = segment;
|
17 | };
|
18 | /**
|
19 | * 对未识别的单词进行分词
|
20 | *
|
21 | * @param {array} words 单词数组
|
22 | * @return {array}
|
23 | */
|
24 | exports.split = function (words) {
|
25 | var POSTAG = exports.segment.POSTAG;
|
26 | var ret = [];
|
27 | for (var i = 0, word; word = words[i]; i++) {
|
28 | if (word.p > 0) {
|
29 | ret.push(word);
|
30 | continue;
|
31 | }
|
32 | // 仅对未识别的词进行匹配
|
33 | var urlinfo = matchURL(word.w);
|
34 | if (urlinfo.length < 1) {
|
35 | ret.push(word);
|
36 | continue;
|
37 | }
|
38 | // 分离出URL
|
39 | var lastc = 0;
|
40 | for (var ui = 0, url; url = urlinfo[ui]; ui++) {
|
41 | if (url.c > lastc) {
|
42 | ret.push({ w: word.w.substr(lastc, url.c - lastc) });
|
43 | }
|
44 | ret.push({ w: url.w, p: POSTAG.URL });
|
45 | lastc = url.c + url.w.length;
|
46 | }
|
47 | var lasturl = urlinfo[urlinfo.length - 1];
|
48 | if (lasturl.c + lasturl.w.length < word.w.length) {
|
49 | ret.push({ w: word.w.substr(lasturl.c + lasturl.w.length) });
|
50 | }
|
51 | }
|
52 | // debug(ret);
|
53 | return ret;
|
54 | };
|
55 | // =================================================================
|
56 | // 协议URL头
|
57 | var PROTOTAL = ['http://', 'https://', 'ftp://', 'news://', 'telnet://'];
|
58 | // 协议头最小长度
|
59 | var MIN_PROTOTAL_LEN = 100;
|
60 | for (var i in PROTOTAL) {
|
61 | if (PROTOTAL[i].length < MIN_PROTOTAL_LEN) {
|
62 | MIN_PROTOTAL_LEN = PROTOTAL[i].length;
|
63 | }
|
64 | }
|
65 | // 允许出现在URL中的字符
|
66 | var _URLCHAR = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
67 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
68 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
69 | '!', '#', '$', '%', '&', '‘', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '=', '?', '@', '[', '\\', ']', '^', '_', '`', '|', '~'];
|
70 | var URLCHAR = {};
|
71 | for (var i in _URLCHAR) {
|
72 | URLCHAR[_URLCHAR[i]] = 1;
|
73 | }
|
74 | // =================================================================
|
75 | /**
|
76 | * 匹配包含的网址,返回相关信息
|
77 | *
|
78 | * @param {string} text 文本
|
79 | * @param {int} cur 开始位置
|
80 | * @return {array} 返回格式 {w: '网址', c: 开始位置}
|
81 | */
|
82 | var matchURL = function (text, cur) {
|
83 | if (isNaN(cur))
|
84 | cur = 0;
|
85 | var ret = [];
|
86 | var s = false;
|
87 | while (cur < text.length) {
|
88 | // 判断是否为 http:// 之类的文本开头
|
89 | if (s === false && cur < text.length - MIN_PROTOTAL_LEN) {
|
90 | for (var i = 0, prot; prot = PROTOTAL[i]; i++) {
|
91 | if (text.substr(cur, prot.length) == prot) {
|
92 | s = cur;
|
93 | cur += prot.length - 1;
|
94 | break;
|
95 | }
|
96 | }
|
97 | }
|
98 | else if (s !== false && !(text.charAt(cur) in URLCHAR)) {
|
99 | // 如果以http://之类开头,遇到了非URL字符,则结束
|
100 | ret.push({
|
101 | w: text.substr(s, cur - s),
|
102 | c: s
|
103 | });
|
104 | s = false;
|
105 | }
|
106 | cur++;
|
107 | }
|
108 | // 检查剩余部分
|
109 | if (s !== false) {
|
110 | ret.push({
|
111 | w: text.substr(s, cur - s),
|
112 | c: s
|
113 | });
|
114 | }
|
115 | return ret;
|
116 | };
|
117 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVJMVG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiVVJMVG9rZW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViOzs7O0dBSUc7QUFFSCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBRXhCLFdBQVc7QUFDWCxPQUFPLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztBQUUzQjs7OztHQUlHO0FBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxVQUFVLE9BQU87SUFDOUIsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxPQUFPLENBQUMsS0FBSyxHQUFHLFVBQVUsS0FBSztJQUM3QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVM7U0FDVjtRQUNELGNBQWM7UUFDZCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVM7U0FDVjtRQUNELFNBQVM7UUFDVCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO2dCQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUNwRDtZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7WUFDcEMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDOUI7UUFDRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDaEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQzVEO0tBQ0Y7SUFDRCxjQUFjO0lBQ2QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixvRUFBb0U7QUFDcEUsU0FBUztBQUNULElBQUksUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3pFLFVBQVU7QUFDVixJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtJQUN0QixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLEVBQUU7UUFDekMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUN2QztDQUNGO0FBQ0QsZUFBZTtBQUNmLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDeEksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDaEksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUNoRCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hKLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNqQixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtJQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzFCO0FBQ0Qsb0VBQW9FO0FBRXBFOzs7Ozs7R0FNRztBQUNILElBQUksUUFBUSxHQUFHLFVBQVUsSUFBSSxFQUFFLEdBQUc7SUFDaEMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN4QixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDZCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ3hCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLEVBQUU7WUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDekMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztvQkFDUixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3ZCLE1BQU07aUJBQ1A7YUFDRjtTQUNGO2FBQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxFQUFFO1lBQ3hELCtCQUErQjtZQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUNQLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLEVBQUcsQ0FBQzthQUNOLENBQUMsQ0FBQztZQUNILENBQUMsR0FBRyxLQUFLLENBQUM7U0FDWDtRQUNELEdBQUcsRUFBRSxDQUFDO0tBQ1A7SUFDRCxTQUFTO0lBQ1QsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUMsRUFBRyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVUkzor4bliKvmqKHlnZdcbiAqXG4gKiBAYXV0aG9yIOiAgembtzxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG52YXIgZGVidWcgPSBjb25zb2xlLmxvZztcblxuLyoqIOaooeWdl+exu+WeiyAqL1xuZXhwb3J0cy50eXBlID0gJ3Rva2VuaXplcic7XG5cbi8qKlxuICog5qih5Z2X5Yid5aeL5YyWXG4gKlxuICogQHBhcmFtIHtTZWdtZW50fSBzZWdtZW50IOWIhuivjeaOpeWPo1xuICovXG5leHBvcnRzLmluaXQgPSBmdW5jdGlvbiAoc2VnbWVudCkge1xuICBleHBvcnRzLnNlZ21lbnQgPSBzZWdtZW50O1xufTtcblxuLyoqXG4gKiDlr7nmnKror4bliKvnmoTljZXor43ov5vooYzliIbor41cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSB3b3JkcyDljZXor43mlbDnu4RcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5leHBvcnRzLnNwbGl0ID0gZnVuY3Rpb24gKHdvcmRzKSB7XG4gIHZhciBQT1NUQUcgPSBleHBvcnRzLnNlZ21lbnQuUE9TVEFHO1xuICB2YXIgcmV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCB3b3JkOyB3b3JkID0gd29yZHNbaV07IGkrKykge1xuICAgIGlmICh3b3JkLnAgPiAwKSB7XG4gICAgICByZXQucHVzaCh3b3JkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyDku4Xlr7nmnKror4bliKvnmoTor43ov5vooYzljLnphY1cbiAgICB2YXIgdXJsaW5mbyA9IG1hdGNoVVJMKHdvcmQudyk7XG4gICAgaWYgKHVybGluZm8ubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0LnB1c2god29yZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8g5YiG56a75Ye6VVJMXG4gICAgdmFyIGxhc3RjID0gMDtcbiAgICBmb3IgKHZhciB1aSA9IDAsIHVybDsgdXJsID0gdXJsaW5mb1t1aV07IHVpKyspIHtcbiAgICAgIGlmICh1cmwuYyA+IGxhc3RjKSB7XG4gICAgICAgIHJldC5wdXNoKHt3OiB3b3JkLncuc3Vic3RyKGxhc3RjLCB1cmwuYyAtIGxhc3RjKX0pO1xuICAgICAgfVxuICAgICAgcmV0LnB1c2goe3c6IHVybC53LCBwOiBQT1NUQUcuVVJMfSk7XG4gICAgICBsYXN0YyA9IHVybC5jICsgdXJsLncubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgbGFzdHVybCA9IHVybGluZm9bdXJsaW5mby5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdHVybC5jICsgbGFzdHVybC53Lmxlbmd0aCA8IHdvcmQudy5sZW5ndGgpIHtcbiAgICAgIHJldC5wdXNoKHt3OiB3b3JkLncuc3Vic3RyKGxhc3R1cmwuYyArIGxhc3R1cmwudy5sZW5ndGgpfSk7XG4gICAgfVxuICB9XG4gIC8vIGRlYnVnKHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g5Y2P6K6uVVJM5aS0XG52YXIgUFJPVE9UQUwgPSBbJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCAnZnRwOi8vJywgJ25ld3M6Ly8nLCAndGVsbmV0Oi8vJ107XG4vLyDljY/orq7lpLTmnIDlsI/plb/luqZcbnZhciBNSU5fUFJPVE9UQUxfTEVOID0gMTAwO1xuZm9yICh2YXIgaSBpbiBQUk9UT1RBTCkge1xuICBpZiAoUFJPVE9UQUxbaV0ubGVuZ3RoIDwgTUlOX1BST1RPVEFMX0xFTikge1xuICAgIE1JTl9QUk9UT1RBTF9MRU4gPSBQUk9UT1RBTFtpXS5sZW5ndGg7XG4gIH1cbn1cbi8vIOWFgeiuuOWHuueOsOWcqFVSTOS4reeahOWtl+esplxudmFyIF9VUkxDSEFSID0gWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLFxuICAgICAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJyxcbiAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLFxuICAgICAgICAnIScsICcjJywgJyQnLCAnJScsICcmJywgJ+KAmCcsICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLCAnOicsICc7JywgJz0nLCAnPycsICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsICdgJywgJ3wnLCAnfiddO1xudmFyIFVSTENIQVIgPSB7fTtcbmZvciAodmFyIGkgaW4gX1VSTENIQVIpIHtcbiAgVVJMQ0hBUltfVVJMQ0hBUltpXV0gPSAxO1xufVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiDljLnphY3ljIXlkKvnmoTnvZHlnYDvvIzov5Tlm57nm7jlhbPkv6Hmga9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCDmlofmnKxcbiAqIEBwYXJhbSB7aW50fSBjdXIg5byA5aeL5L2N572uXG4gKiBAcmV0dXJuIHthcnJheX0gIOi/lOWbnuagvOW8jyAgIHt3OiAn572R5Z2AJywgYzog5byA5aeL5L2N572ufVxuICovXG52YXIgbWF0Y2hVUkwgPSBmdW5jdGlvbiAodGV4dCwgY3VyKSB7XG4gIGlmIChpc05hTihjdXIpKSBjdXIgPSAwO1xuICB2YXIgcmV0ID0gW107XG4gIHZhciBzID0gZmFsc2U7XG4gIHdoaWxlIChjdXIgPCB0ZXh0Lmxlbmd0aCkge1xuICAgIC8vIOWIpOaWreaYr+WQpuS4uiBodHRwOi8vIOS5i+exu+eahOaWh+acrOW8gOWktFxuICAgIGlmIChzID09PSBmYWxzZSAmJiBjdXIgPCB0ZXh0Lmxlbmd0aCAtIE1JTl9QUk9UT1RBTF9MRU4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwcm90OyBwcm90ID0gUFJPVE9UQUxbaV07IGkrKykge1xuICAgICAgICBpZiAodGV4dC5zdWJzdHIoY3VyLCBwcm90Lmxlbmd0aCkgPT0gcHJvdCkge1xuICAgICAgICAgIHMgPSBjdXI7XG4gICAgICAgICAgY3VyICs9IHByb3QubGVuZ3RoIC0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocyAhPT0gZmFsc2UgJiYgISh0ZXh0LmNoYXJBdChjdXIpIGluIFVSTENIQVIpKSB7XG4gICAgICAvLyDlpoLmnpzku6VodHRwOi8v5LmL57G75byA5aS077yM6YGH5Yiw5LqG6Z2eVVJM5a2X56ym77yM5YiZ57uT5p2fXG4gICAgICByZXQucHVzaCh7XG4gICAgICAgIHc6ICB0ZXh0LnN1YnN0cihzLCBjdXIgLSBzKSxcbiAgICAgICAgYzogIHNcbiAgICAgIH0pO1xuICAgICAgcyA9IGZhbHNlO1xuICAgIH1cbiAgICBjdXIrKztcbiAgfVxuICAvLyDmo4Dmn6XliankvZnpg6jliIZcbiAgaWYgKHMgIT09IGZhbHNlKSB7XG4gICAgcmV0LnB1c2goe1xuICAgICAgdzogIHRleHQuc3Vic3RyKHMsIGN1ciAtIHMpLFxuICAgICAgYzogIHNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuLy8gZGVidWcobWF0Y2hVUkwoJ2h0dHA6Ly93d3cuYmFpZHUuY29t5ZOI5ZWKaHR0cDovL+WTh2ZkZ2dnZ2h0dHA6Ly9iYWlkdS5jb20vc3MvJykpO1xuIl19 |
\ | No newline at end of file |