lscontests 2.4.0 → 2.5.2
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +77 -108
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/lib/oj/codeforces.js +48 -1
- package/dist/lib/oj/codeforces.js.map +1 -1
- package/dist/server.js +20 -7
- package/dist/server.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
@@ -38,7 +38,7 @@ Usage: lsct [options]
|
|
38
38
|
|
39
39
|
Options:
|
40
40
|
-V, --version output the version number
|
41
|
-
-d, --days, <day> number of days to display, set to
|
41
|
+
-d, --days, <day> number of days to display, set to -1 to get all
|
42
42
|
contests infomation (default: "3")
|
43
43
|
-l, --list list all supported OJ and it's abbreviation
|
44
44
|
-s, --silent do not print log
|
@@ -56,29 +56,43 @@ Options:
|
|
56
56
|
It performs as follows:
|
57
57
|
|
58
58
|
<!-- block_cli begin -->
|
59
|
-
(*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on
|
59
|
+
(*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on Thu, 30 Jun 2022 09:00:29 GMT*)
|
60
60
|
|
61
61
|
<details>
|
62
62
|
<summary> <code>> lsct -L en</code> </summary>
|
63
63
|
|
64
64
|
```text
|
65
|
-
There are
|
65
|
+
There are no running contests on AtCoder,Codeforces,LeetCode,Luogu,NowCoder
|
66
|
+
|
67
|
+
There are 4 contests on NowCoder,AtCoder,LeetCode in the next 3 days
|
66
68
|
|
67
69
|
OJ: NowCoder
|
68
|
-
Contest name:
|
70
|
+
Contest name: 第 20 届上海大学程序设计联赛夏季赛(校外同步赛)
|
69
71
|
Rule: ICPC
|
70
|
-
Start time:
|
71
|
-
End time:
|
72
|
-
https://ac.nowcoder.com/acm/contest/
|
72
|
+
Start time: 7/2/2022, 05:00:00
|
73
|
+
End time: 7/2/2022, 08:30:00
|
74
|
+
https://ac.nowcoder.com/acm/contest/36652
|
73
75
|
|
74
|
-
|
76
|
+
OJ: AtCoder
|
77
|
+
Contest name: Ⓐ AtCoder Beginner Contest 258
|
78
|
+
Rule: AtCoder
|
79
|
+
Start time: 7/2/2022, 12:00:00
|
80
|
+
End time: 7/2/2022, 13:40:00
|
81
|
+
https://atcoder.jp/contests/abc258
|
75
82
|
|
76
|
-
OJ:
|
77
|
-
Contest name:
|
78
|
-
Rule:
|
79
|
-
Start time:
|
80
|
-
End time:
|
81
|
-
https://
|
83
|
+
OJ: LeetCode
|
84
|
+
Contest name: Weekly Contest 300
|
85
|
+
Rule: AtCoder
|
86
|
+
Start time: 7/3/2022, 02:30:00
|
87
|
+
End time: 7/3/2022, 04:00:00
|
88
|
+
https://leetcode.com/contest/weekly-contest-300
|
89
|
+
|
90
|
+
OJ: AtCoder
|
91
|
+
Contest name: Ⓗ AtCoder Heuristic Contest 012
|
92
|
+
Rule: AtCoder
|
93
|
+
Start time: 7/3/2022, 06:00:00
|
94
|
+
End time: 7/3/2022, 10:00:00
|
95
|
+
https://atcoder.jp/contests/ahc012
|
82
96
|
```
|
83
97
|
|
84
98
|
</details>
|
@@ -89,49 +103,28 @@ https://codeforces.com/contests/1692
|
|
89
103
|
```text
|
90
104
|
There are no running contests on AtCoder,Codeforces
|
91
105
|
|
92
|
-
There are
|
106
|
+
There are 3 contests on AtCoder,Codeforces in the next 7 days
|
93
107
|
|
94
|
-
OJ:
|
95
|
-
Contest name:
|
96
|
-
Rule:
|
97
|
-
Start time:
|
98
|
-
End time:
|
99
|
-
https://
|
100
|
-
|
101
|
-
OJ: Codeforces
|
102
|
-
Contest name: Codeforces Round #800 (Div. 1)
|
103
|
-
Rule: Codeforces
|
104
|
-
Start time: 6/16/2022, 14:35:00
|
105
|
-
End time: 6/16/2022, 16:35:00
|
106
|
-
https://codeforces.com/contests/1693
|
107
|
-
|
108
|
-
OJ: Codeforces
|
109
|
-
Contest name: Codeforces Round #800 (Div. 2)
|
110
|
-
Rule: Codeforces
|
111
|
-
Start time: 6/16/2022, 14:35:00
|
112
|
-
End time: 6/16/2022, 16:35:00
|
113
|
-
https://codeforces.com/contests/1694
|
108
|
+
OJ: AtCoder
|
109
|
+
Contest name: Ⓐ AtCoder Beginner Contest 258
|
110
|
+
Rule: AtCoder
|
111
|
+
Start time: 7/2/2022, 12:00:00
|
112
|
+
End time: 7/2/2022, 13:40:00
|
113
|
+
https://atcoder.jp/contests/abc258
|
114
114
|
|
115
115
|
OJ: AtCoder
|
116
|
-
Contest name:
|
116
|
+
Contest name: Ⓗ AtCoder Heuristic Contest 012
|
117
117
|
Rule: AtCoder
|
118
|
-
Start time:
|
119
|
-
End time:
|
120
|
-
https://atcoder.jp/contests/
|
118
|
+
Start time: 7/3/2022, 06:00:00
|
119
|
+
End time: 7/3/2022, 10:00:00
|
120
|
+
https://atcoder.jp/contests/ahc012
|
121
121
|
|
122
122
|
OJ: Codeforces
|
123
|
-
Contest name: Codeforces Round #
|
123
|
+
Contest name: Codeforces Round #804 (Div. 2)
|
124
124
|
Rule: Codeforces
|
125
|
-
Start time:
|
126
|
-
End time:
|
127
|
-
https://codeforces.com/contests/
|
128
|
-
|
129
|
-
OJ: AtCoder
|
130
|
-
Contest name: Ⓐ AtCoder Regular Contest 142
|
131
|
-
Rule: AtCoder
|
132
|
-
Start time: 6/19/2022, 12:00:00
|
133
|
-
End time: 6/19/2022, 14:00:00
|
134
|
-
https://atcoder.jp/contests/arc142
|
125
|
+
Start time: 7/4/2022, 14:35:00
|
126
|
+
End time: 7/4/2022, 16:35:00
|
127
|
+
https://codeforces.com/contests/1699
|
135
128
|
```
|
136
129
|
|
137
130
|
</details>
|
@@ -145,91 +138,67 @@ https://atcoder.jp/contests/arc142
|
|
145
138
|
"upcoming": [
|
146
139
|
{
|
147
140
|
"ojName": "AtCoder",
|
148
|
-
"name": "Ⓐ
|
141
|
+
"name": "Ⓐ AtCoder Beginner Contest 258",
|
149
142
|
"rule": "AtCoder",
|
150
|
-
"startTime": "2022-
|
151
|
-
"endTime": "2022-
|
152
|
-
"url": "https://atcoder.jp/contests/
|
143
|
+
"startTime": "2022-07-02T12:00:00.000Z",
|
144
|
+
"endTime": "2022-07-02T13:40:00.000Z",
|
145
|
+
"url": "https://atcoder.jp/contests/abc258"
|
153
146
|
},
|
154
147
|
{
|
155
148
|
"ojName": "AtCoder",
|
156
|
-
"name": "
|
149
|
+
"name": "Ⓗ AtCoder Heuristic Contest 012",
|
157
150
|
"rule": "AtCoder",
|
158
|
-
"startTime": "2022-
|
159
|
-
"endTime": "2022-
|
160
|
-
"url": "https://atcoder.jp/contests/
|
151
|
+
"startTime": "2022-07-03T06:00:00.000Z",
|
152
|
+
"endTime": "2022-07-03T10:00:00.000Z",
|
153
|
+
"url": "https://atcoder.jp/contests/ahc012"
|
161
154
|
},
|
162
155
|
{
|
163
156
|
"ojName": "AtCoder",
|
164
|
-
"name": "Ⓐ
|
157
|
+
"name": "Ⓐ AtCoder Beginner Contest 259",
|
165
158
|
"rule": "AtCoder",
|
166
|
-
"startTime": "2022-
|
167
|
-
"endTime": "2022-
|
168
|
-
"url": "https://atcoder.jp/contests/
|
159
|
+
"startTime": "2022-07-09T12:00:00.000Z",
|
160
|
+
"endTime": "2022-07-09T13:40:00.000Z",
|
161
|
+
"url": "https://atcoder.jp/contests/abc259"
|
169
162
|
},
|
170
163
|
{
|
171
164
|
"ojName": "AtCoder",
|
172
|
-
"name": "Ⓐ AtCoder Regular Contest
|
165
|
+
"name": "Ⓐ AtCoder Regular Contest 144",
|
173
166
|
"rule": "AtCoder",
|
174
|
-
"startTime": "2022-
|
175
|
-
"endTime": "2022-
|
176
|
-
"url": "https://atcoder.jp/contests/
|
167
|
+
"startTime": "2022-07-16T12:00:00.000Z",
|
168
|
+
"endTime": "2022-07-16T14:00:00.000Z",
|
169
|
+
"url": "https://atcoder.jp/contests/arc144"
|
177
170
|
},
|
178
171
|
{
|
179
172
|
"ojName": "AtCoder",
|
180
|
-
"name": "Ⓐ AtCoder Beginner Contest
|
173
|
+
"name": "Ⓐ AtCoder Beginner Contest 260",
|
181
174
|
"rule": "AtCoder",
|
182
|
-
"startTime": "2022-07-
|
183
|
-
"endTime": "2022-07-
|
184
|
-
"url": "https://atcoder.jp/contests/
|
175
|
+
"startTime": "2022-07-17T12:00:00.000Z",
|
176
|
+
"endTime": "2022-07-17T13:40:00.000Z",
|
177
|
+
"url": "https://atcoder.jp/contests/abc260"
|
185
178
|
},
|
186
179
|
{
|
187
180
|
"ojName": "AtCoder",
|
188
|
-
"name": "
|
181
|
+
"name": "Ⓐ AtCoder Regular Contest 145",
|
189
182
|
"rule": "AtCoder",
|
190
|
-
"startTime": "2022-07-
|
191
|
-
"endTime": "2022-07-
|
192
|
-
"url": "https://atcoder.jp/contests/
|
193
|
-
},
|
194
|
-
{
|
195
|
-
"ojName": "Codeforces",
|
196
|
-
"name": "Codeforces Round #799 (Div. 4)",
|
197
|
-
"rule": "ICPC",
|
198
|
-
"startTime": "2022-06-14T14:35:00.000Z",
|
199
|
-
"endTime": "2022-06-14T16:50:00.000Z",
|
200
|
-
"url": "https://codeforces.com/contests/1692"
|
183
|
+
"startTime": "2022-07-30T12:00:00.000Z",
|
184
|
+
"endTime": "2022-07-30T14:00:00.000Z",
|
185
|
+
"url": "https://atcoder.jp/contests/arc145"
|
201
186
|
},
|
202
187
|
{
|
203
|
-
"ojName": "
|
204
|
-
"name": "
|
205
|
-
"rule": "
|
206
|
-
"startTime": "2022-
|
207
|
-
"endTime": "2022-
|
208
|
-
"url": "https://
|
209
|
-
},
|
210
|
-
{
|
211
|
-
"ojName": "Codeforces",
|
212
|
-
"name": "Codeforces Round #800 (Div. 2)",
|
213
|
-
"rule": "Codeforces",
|
214
|
-
"startTime": "2022-06-16T14:35:00.000Z",
|
215
|
-
"endTime": "2022-06-16T16:35:00.000Z",
|
216
|
-
"url": "https://codeforces.com/contests/1694"
|
217
|
-
},
|
218
|
-
{
|
219
|
-
"ojName": "Codeforces",
|
220
|
-
"name": "Codeforces Round #TBA (Div. 2)",
|
221
|
-
"rule": "Codeforces",
|
222
|
-
"startTime": "2022-06-18T14:35:00.000Z",
|
223
|
-
"endTime": "2022-06-18T16:35:00.000Z",
|
224
|
-
"url": "https://codeforces.com/contests/1695"
|
188
|
+
"ojName": "AtCoder",
|
189
|
+
"name": "Ⓐ AtCoder Grand Contest 058",
|
190
|
+
"rule": "AtCoder",
|
191
|
+
"startTime": "2022-08-14T12:00:00.000Z",
|
192
|
+
"endTime": "2022-08-14T15:00:00.000Z",
|
193
|
+
"url": "https://atcoder.jp/contests/agc058"
|
225
194
|
},
|
226
195
|
{
|
227
196
|
"ojName": "Codeforces",
|
228
|
-
"name": "Codeforces
|
197
|
+
"name": "Codeforces Round #804 (Div. 2)",
|
229
198
|
"rule": "Codeforces",
|
230
|
-
"startTime": "2022-
|
231
|
-
"endTime": "2022-
|
232
|
-
"url": "https://codeforces.com/contests/
|
199
|
+
"startTime": "2022-07-04T14:35:00.000Z",
|
200
|
+
"endTime": "2022-07-04T16:35:00.000Z",
|
201
|
+
"url": "https://codeforces.com/contests/1699"
|
233
202
|
}
|
234
203
|
]
|
235
204
|
}
|
package/dist/cli.js
CHANGED
@@ -24,7 +24,7 @@ const locale_1 = require("./locale");
|
|
24
24
|
function initCmd() {
|
25
25
|
return new commander_1.default.Command()
|
26
26
|
.version(package_json_1.version)
|
27
|
-
.option("-d, --days, <day>", "number of days to display, set to
|
27
|
+
.option("-d, --days, <day>", "number of days to display, set to -1 to get all contests infomation", "3")
|
28
28
|
.option("-l, --list", "list all supported OJ and it's abbreviation")
|
29
29
|
.option("-s, --silent", "do not print log")
|
30
30
|
.addOption(new commander_1.default.Option("-o, --oj <ojs...>", "OJs to display").choices(Object.keys(oj_1.alloj)))
|
package/dist/cli.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,0DAAkC;AAClC,oDAAuB;AACvB,sDAA8B;AAC9B,yCAA2B;AAC3B,kDAA+C;AAC/C,iCAAiC;AACjC,qCAAoC;AAEpC,SAAS,OAAO;IAEZ,OAAO,IAAI,mBAAS,CAAC,OAAO,EAAE;SACzB,OAAO,CAAC,sBAAO,CAAC;SAChB,MAAM,CAAC,mBAAmB,EAAE,
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
@@ -19,6 +19,52 @@ const ruleRecord = {
|
|
19
19
|
CF: "Codeforces",
|
20
20
|
ICPC: "ICPC"
|
21
21
|
};
|
22
|
+
function mergeDuplicate(data) {
|
23
|
+
const testRe = /Codeforces Round #(\d{2,4}) \(Div. (\d)\)/;
|
24
|
+
const tmpMap = new Map();
|
25
|
+
const rets = [];
|
26
|
+
data.forEach((item) => {
|
27
|
+
if (testRe.test(item.name)) {
|
28
|
+
const reRet = item.name.match(testRe);
|
29
|
+
if (reRet !== null) {
|
30
|
+
const round = parseInt(reRet[1]);
|
31
|
+
const div = parseInt(reRet[2]);
|
32
|
+
const i = tmpMap.get(round);
|
33
|
+
if (i !== undefined) {
|
34
|
+
i.push([div, item]);
|
35
|
+
}
|
36
|
+
else {
|
37
|
+
tmpMap.set(round, [[div, item]]);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
throw new Error("MergeDuplicate: regex failed");
|
42
|
+
}
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
rets.push(item);
|
46
|
+
}
|
47
|
+
});
|
48
|
+
tmpMap.forEach((v, k) => {
|
49
|
+
if (v.length === 1) {
|
50
|
+
rets.push(v[0][1]);
|
51
|
+
}
|
52
|
+
else {
|
53
|
+
const divs = v.map(([div]) => div).sort().join("/");
|
54
|
+
const urls = v.map(([, item]) => item.url).join("\n");
|
55
|
+
const item = {
|
56
|
+
name: `Codeforces Round #${k} (Div. ${divs})`,
|
57
|
+
ojName: exports.cf.name,
|
58
|
+
rule: ruleRecord.CF,
|
59
|
+
startTime: v[0][1].startTime,
|
60
|
+
endTime: v[0][1].endTime,
|
61
|
+
url: urls
|
62
|
+
};
|
63
|
+
rets.push(item);
|
64
|
+
}
|
65
|
+
});
|
66
|
+
return rets;
|
67
|
+
}
|
22
68
|
exports.cf = {
|
23
69
|
name: "Codeforces",
|
24
70
|
get() {
|
@@ -29,7 +75,7 @@ exports.cf = {
|
|
29
75
|
throw new Error($.text());
|
30
76
|
}
|
31
77
|
const resList = response.data.result;
|
32
|
-
|
78
|
+
const ret = resList.map((res) => {
|
33
79
|
return {
|
34
80
|
ojName: exports.cf.name,
|
35
81
|
name: res.name,
|
@@ -39,6 +85,7 @@ exports.cf = {
|
|
39
85
|
url: `https://codeforces.com/contests/${res.id}`
|
40
86
|
};
|
41
87
|
}).filter(contest => contest.endTime >= new Date());
|
88
|
+
return mergeDuplicate(ret);
|
42
89
|
});
|
43
90
|
}
|
44
91
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,qCAA+B;AAe/B,MAAM,UAAU,GAAyB;IACrC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,MAAM;CACf,CAAC;
|
1
|
+
{"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
@@ -24,6 +24,7 @@ const commander_1 = require("commander");
|
|
24
24
|
const package_json_1 = require("../package.json");
|
25
25
|
const lodash_1 = __importDefault(require("lodash"));
|
26
26
|
const fs_1 = require("fs");
|
27
|
+
const await_lock_1 = __importDefault(require("await-lock"));
|
27
28
|
const app = (0, express_1.default)();
|
28
29
|
function assertType(obj) {
|
29
30
|
}
|
@@ -77,6 +78,7 @@ const contestsCache = {
|
|
77
78
|
contests: [],
|
78
79
|
lastUpdate: 0
|
79
80
|
};
|
81
|
+
const lock = new await_lock_1.default();
|
80
82
|
function icsPostProcess(value) {
|
81
83
|
return value
|
82
84
|
.replace("X-PUBLISHED-TTL:PT1H", "X-PUBLISHED-TTL:PT1H\r\nREFRESH-INTERVAL:PT1H")
|
@@ -93,14 +95,25 @@ function icsPostProcess(value) {
|
|
93
95
|
"END:STANDARD\r\n" +
|
94
96
|
"END:VTIMEZONE");
|
95
97
|
}
|
96
|
-
function
|
98
|
+
function checkCache() {
|
97
99
|
return __awaiter(this, void 0, void 0, function* () {
|
98
|
-
|
99
|
-
|
100
|
-
contestsCache.
|
101
|
-
|
102
|
-
|
100
|
+
yield lock.acquireAsync();
|
101
|
+
try {
|
102
|
+
if (contestsCache.lastUpdate < Date.now() - 1000 * 60 * 5) {
|
103
|
+
const c = yield new _1.default({ days: -1 }).getContests();
|
104
|
+
contestsCache.contests = lodash_1.default.uniqBy(contestsCache.contests.concat(c.running.concat(c.upcoming)), JSON.stringify);
|
105
|
+
contestsCache.contests = contestsCache.contests.filter(c => c.endTime.getTime() - c.startTime.getTime() < 1000 * 60 * 60 * 24 * 2); // ignore too long contests
|
106
|
+
contestsCache.lastUpdate = Date.now();
|
107
|
+
}
|
108
|
+
}
|
109
|
+
finally {
|
110
|
+
lock.release();
|
103
111
|
}
|
112
|
+
});
|
113
|
+
}
|
114
|
+
function getIcs(lang, ojs) {
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
116
|
+
yield checkCache();
|
104
117
|
const contests = contestsCache.contests.filter(c => ojs.some(oj => c.ojName === oj_1.alloj[oj].name));
|
105
118
|
const langDict = yield (0, locale_1.getLangDict)(lang);
|
106
119
|
const events = contests.map((c) => {
|
@@ -114,10 +127,10 @@ function getIcs(lang, ojs) {
|
|
114
127
|
start: (0, ics_1.convertTimestampToArray)(c.startTime.getTime(), "local"),
|
115
128
|
startOutputType: "local",
|
116
129
|
end: (0, ics_1.convertTimestampToArray)(c.endTime.getTime(), "local"),
|
130
|
+
endOutputType: "local",
|
117
131
|
calName: "算法竞赛",
|
118
132
|
productId: "-//StableAgOH//LSCT//CN",
|
119
133
|
title: c.name,
|
120
|
-
url: c.url,
|
121
134
|
location: c.ojName,
|
122
135
|
categories: [c.rule],
|
123
136
|
uid: `${(0, crypto_1.randomUUID)()}@LSCT`,
|
package/dist/server.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,sDAA8B;AAC9B,yCAAwC;AACxC,iCAAiC;AACjC,qCAAuC;AACvC,6BAA6E;AAC7E,kDAA0B;AAC1B,mCAAoC;AACpC,yCAAoC;AACpC,kDAA+C;AAC/C,oDAAuB;AACvB,2BAAkC;
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "lscontests",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.5.2",
|
4
4
|
"description": "A tool to get information about the contests on each OJ",
|
5
5
|
"keywords": [
|
6
6
|
"cli",
|
@@ -35,6 +35,7 @@
|
|
35
35
|
"start-s": "tsx src/server.ts"
|
36
36
|
},
|
37
37
|
"dependencies": {
|
38
|
+
"await-lock": "^2.2.2",
|
38
39
|
"axios": "^0.27.2",
|
39
40
|
"axios-retry": "^3.2.5",
|
40
41
|
"cheerio": "^1.0.0-rc.11",
|
@@ -48,7 +49,7 @@
|
|
48
49
|
"devDependencies": {
|
49
50
|
"@types/express": "^4.17.13",
|
50
51
|
"@types/lodash": "^4.14.182",
|
51
|
-
"@types/node": "^
|
52
|
+
"@types/node": "^18.0.0",
|
52
53
|
"@types/pangu": "^3.3.0",
|
53
54
|
"@typescript-eslint/eslint-plugin": "^5.27.1",
|
54
55
|
"@typescript-eslint/parser": "^5.27.1",
|