daniwalter001 commited on
Commit
f1445b2
1 Parent(s): 310c8c6
Files changed (13) hide show
  1. .gitignore +1 -0
  2. Dockerfile +23 -0
  3. README.md +1 -2
  4. config.js +18 -0
  5. fixes.sh +20 -0
  6. helper.js +403 -0
  7. index.js +313 -0
  8. notes.txt +27 -0
  9. package-lock.json +2001 -0
  10. package.json +31 -0
  11. redis.js +25 -0
  12. servers.txt +1 -0
  13. utils.js +770 -0
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ node_modules/
Dockerfile ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Node.js 18 base image
2
+ FROM node:18-slim
3
+
4
+ # Set the working directory inside the container
5
+ WORKDIR /usr/src/app
6
+
7
+ # Copy the package.json and package-lock.json if available
8
+ COPY package*.json ./
9
+
10
+ # Install the app dependencies
11
+ RUN npm install --production
12
+
13
+ # Copy the rest of the application code to the container
14
+ COPY . .
15
+
16
+ # Set environment variable to production
17
+ ENV NODE_ENV=production
18
+
19
+ # Expose the port Hugging Face Spaces will bind to
20
+ EXPOSE 3000
21
+
22
+ # Command to start the app
23
+ CMD ["npm", "start"]
README.md CHANGED
@@ -6,6 +6,5 @@ colorTo: pink
6
  sdk: docker
7
  pinned: false
8
  short_description: Public indexer
 
9
  ---
10
-
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
6
  sdk: docker
7
  pinned: false
8
  short_description: Public indexer
9
+ app_port:3000
10
  ---
 
 
config.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const config = {
2
+ id: "daiki.jackettrd52Btpm.stream",
3
+ version: "1.0.0",
4
+ name: "Jackett Addon LOL PM",
5
+ description: "Movie & TV Streams from Jackett ",
6
+ logo: "https://ia804607.us.archive.org/13/items/github.com-Jackett-Jackett_-_2022-01-03_07-53-24/__ia_thumb.jpg",
7
+ resources: [
8
+ {
9
+ name: "stream",
10
+ types: ["movie", "series", "anime"],
11
+ idPrefixes: ["tt", "kitsu"],
12
+ },
13
+ ],
14
+ types: ["movie", "series", "anime", "other"],
15
+ catalogs: [],
16
+ };
17
+
18
+ module.exports = config;
fixes.sh ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #! /usr/bin/bash
2
+
3
+ echo 'checking fixes.sh permissions:'
4
+ ls -l fixes.sh
5
+ echo Done
6
+
7
+ echo 'Checking simple-get > index.js file content'
8
+ file_found=$(find node_modules/simple-get -type f -exec grep -l "else return simpleGet(opts, cb)" {} \;)
9
+ echo "Found $file_found"
10
+
11
+ echo "check if $file_found is fixed"
12
+
13
+ checked=$(grep 'cb(null, res, opts.url)' $file_found)
14
+ if [ -n "$checked" ]; then
15
+ echo "Already fixed"
16
+ else
17
+ echo "Replacing..."
18
+ sed -i s/.*'else return simpleGet(opts, cb)'.*/'else if(opts.url.startsWith("magnet")) return cb(null, res, opts.url) \n else return simpleGet(opts, cb)'/ $file_found
19
+ echo "Replaced"
20
+ fi
helper.js ADDED
@@ -0,0 +1,403 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const fetch = require("node-fetch");
2
+ const { exec } = require("child_process");
3
+
4
+ const PM_KEYS = ["9rg4e6tpe2zp23d5", "mmsfyc59gwtis3g8", "tia5hhs9pddz6m7c"];
5
+ const apikey = PM_KEYS[Math.floor(Math.random() * PM_KEYS.length)];
6
+
7
+ const VIDEO_EXTENSIONS = [
8
+ "3g2",
9
+ "3gp",
10
+ "avi",
11
+ "flv",
12
+ "mkv",
13
+ "mk3d",
14
+ "mov",
15
+ "mp2",
16
+ "mp4",
17
+ "m4v",
18
+ "mpe",
19
+ "mpeg",
20
+ "mpg",
21
+ "mpv",
22
+ "webm",
23
+ "wmv",
24
+ "ogm",
25
+ "ts",
26
+ "m2ts",
27
+ ];
28
+ const SUBTITLE_EXTENSIONS = [
29
+ "aqt",
30
+ "gsub",
31
+ "jss",
32
+ "sub",
33
+ "ttxt",
34
+ "pjs",
35
+ "psb",
36
+ "rt",
37
+ "smi",
38
+ "slt",
39
+ "ssf",
40
+ "srt",
41
+ "ssa",
42
+ "ass",
43
+ "usf",
44
+ "idx",
45
+ "vtt",
46
+ ];
47
+
48
+ let checkPremiumizeRes = (res = {}) => {
49
+ if ("status" in res) {
50
+ return res["status"] == "success";
51
+ }
52
+ return false;
53
+ };
54
+
55
+ let checkAccount = async () => {
56
+ let url = `https://www.premiumize.me/api/account/info?apikey=${apikey}`;
57
+ try {
58
+ let res = await fetch(url);
59
+ return checkPremiumizeRes(await res.json());
60
+ } catch (error) {
61
+ console.log({ errorcheckAccount: error });
62
+ return false;
63
+ }
64
+ };
65
+
66
+ let checkCached = async (hash = "") => {
67
+ if (!hash) return false;
68
+ let url = `https://www.premiumize.me/api/cache/check?apikey=${apikey}&items[]=${hash}`;
69
+ try {
70
+ let res = await fetch(url);
71
+ let resJson = (await res.json()) ?? {};
72
+
73
+ if (checkPremiumizeRes(resJson)) {
74
+ if (
75
+ "response" in resJson &&
76
+ resJson["response"][0] &&
77
+ "transcoded" in resJson &&
78
+ resJson["transcoded"][0]
79
+ )
80
+ return resJson["filename"][0];
81
+ }
82
+ return false;
83
+ } catch (error) {
84
+ console.log({ errorCheckCached: error });
85
+ return false;
86
+ }
87
+ };
88
+
89
+ let getDirectDl = async (hash = "") => {
90
+ if (!hash) return false;
91
+ let url = `https://www.premiumize.me/api/transfer/directdl?apikey=${apikey}`;
92
+
93
+ let form = new URLSearchParams();
94
+ form.append("src", `magnet:?xt=urn:btih:${hash}`);
95
+
96
+ try {
97
+ let res = await fetch(url, {
98
+ method: "POST",
99
+ body: form,
100
+ timeout: 5000,
101
+ headers: {
102
+ "Content-Type": "application/x-www-form-urlencoded",
103
+ },
104
+ });
105
+ let resJson = (await res.json()) ?? {};
106
+
107
+ if (checkPremiumizeRes(resJson)) {
108
+ if ("content" in resJson && resJson["content"]) return resJson["content"];
109
+ }
110
+ return false;
111
+ } catch (error) {
112
+ console.log({ errorCached: error });
113
+ return false;
114
+ }
115
+ };
116
+
117
+ let pmTransferList = async (id = "") => {
118
+ let url = `https://www.premiumize.me/api/transfer/list?apikey=${apikey}`;
119
+
120
+ try {
121
+ let res = await fetch(url, {
122
+ method: "GET",
123
+ timeout: 10000,
124
+ });
125
+
126
+ let resJson = (await res.json()) ?? {};
127
+
128
+ if (checkPremiumizeRes(resJson)) {
129
+ return "transfers" in resJson ? resJson["transfers"] : [];
130
+ }
131
+
132
+ return [];
133
+ } catch (error) {
134
+ return [];
135
+ }
136
+ };
137
+
138
+ let pmFolderList = async () => {
139
+ let url = `https://www.premiumize.me/api/folder/list?apikey=${apikey}`;
140
+
141
+ try {
142
+ let res = await fetch(url, {
143
+ method: "GET",
144
+ timeout: 10000,
145
+ });
146
+
147
+ let resJson = (await res.json()) ?? {};
148
+
149
+ if (checkPremiumizeRes(resJson)) {
150
+ return "content" in resJson ? resJson["content"] : [];
151
+ }
152
+
153
+ return [];
154
+ } catch (error) {
155
+ return [];
156
+ }
157
+ };
158
+
159
+ let pmItemList = async () => {
160
+ let url = `https://www.premiumize.me/api/item/listall?apikey=${apikey}`;
161
+
162
+ try {
163
+ let res = await fetch(url, {
164
+ method: "GET",
165
+ timeout: 10000,
166
+ });
167
+
168
+ let resJson = (await res.json()) ?? {};
169
+
170
+ if (checkPremiumizeRes(resJson)) {
171
+ return "files" in resJson ? resJson["files"] : [];
172
+ }
173
+
174
+ return [];
175
+ } catch (error) {
176
+ return [];
177
+ }
178
+ };
179
+
180
+ let pmItemDetails = async (id = "") => {
181
+ let url = `https://www.premiumize.me/api/item/details?apikey=${apikey}&id=${id}`;
182
+
183
+ try {
184
+ let res = await fetch(url, {
185
+ method: "GET",
186
+ timeout: 5000,
187
+ });
188
+ let resJson = (await res.json()) ?? {};
189
+ if ("id" in resJson && resJson["id"]) {
190
+ return resJson;
191
+ }
192
+
193
+ return {};
194
+ } catch (error) {
195
+ return {};
196
+ }
197
+ };
198
+
199
+ let pmFolderDetails = async (id = "") => {
200
+ let url = `https://www.premiumize.me/api/folder/list?apikey=${apikey}&id=${id}`;
201
+
202
+ try {
203
+ let res = await fetch(url, {
204
+ method: "GET",
205
+ timeout: 5000,
206
+ });
207
+
208
+ let resJson = (await res.json()) ?? {};
209
+
210
+ let response = [];
211
+
212
+ if (checkPremiumizeRes(resJson)) {
213
+ let tmp = "content" in resJson ? resJson["content"] : [];
214
+ for (const el of tmp) {
215
+ if (el["type"] == "file") {
216
+ response.push(el);
217
+ } else if ((el["type"] = "folder")) {
218
+ let res_temp = await pmFolderDetails(el["id"]);
219
+ response = response.concat(res_temp);
220
+ }
221
+ }
222
+
223
+ return response;
224
+ }
225
+
226
+ return [];
227
+ } catch (error) {
228
+ return [];
229
+ }
230
+ };
231
+
232
+ let checkTorrentFileinPM = async (param = "", type = "file") => {
233
+ if (!param) return null;
234
+ try {
235
+ let itemList = await pmFolderList();
236
+
237
+ if (!itemList || !itemList.length) return null;
238
+
239
+ let file = await new Promise((resolve, reject) => {
240
+ resolve(
241
+ itemList.find((el) => {
242
+ return el["name"] == param;
243
+ })
244
+ );
245
+ });
246
+
247
+ return "id" in file ? file : null;
248
+ } catch (error) {
249
+ return null;
250
+ }
251
+ };
252
+
253
+ let pmFolderId = async (transferId = "") => {
254
+ try {
255
+ let tranfers = await pmTransferList();
256
+
257
+ if (!tranfers || !tranfers.length) return null;
258
+
259
+ let folder = await new Promise((resolve, reject) => {
260
+ resolve(
261
+ tranfers.find((el) => {
262
+ return el["id"] == transferId || el["name"] == transferId;
263
+ })
264
+ );
265
+ });
266
+
267
+ return "folder_id" in folder ? folder["folder_id"] : null;
268
+ } catch (error) {
269
+ return null;
270
+ }
271
+ };
272
+
273
+ let addMagnetToPM = async (magnet = "") => {
274
+ // let check = await checkAccount();
275
+ // if (!check) return null;
276
+
277
+ let url = `https://www.premiumize.me/api/transfer/create?apikey=${apikey}`;
278
+ let form = new URLSearchParams();
279
+
280
+ form.append("src", magnet);
281
+
282
+ try {
283
+ let res = await fetch(url, {
284
+ method: "POST",
285
+ body: form,
286
+ headers: {
287
+ "Content-Type": "application/x-www-form-urlencoded",
288
+ },
289
+ timeout: 5000,
290
+ });
291
+ let resJson = (await res.json()) ?? {};
292
+ // console.log({ resJson });
293
+
294
+ if (checkPremiumizeRes(resJson)) {
295
+ return "id" in resJson ? resJson["id"] : false;
296
+ // {
297
+ // "status": "success",
298
+ // "id": "WsaYYCdDzDIHckfkf8dD0g",
299
+ // "name": "Game Of Thrones Saison 1 [1080p] MULTI BluRay-Pop .Le Trône De Fer 2011",
300
+ // "type": "torrent"
301
+ // }
302
+ }
303
+ } catch (error) {
304
+ console.log({ addreserror: error });
305
+ return false;
306
+ }
307
+ };
308
+
309
+ let deleteMagnetFromPM = async (id = "") => {
310
+ let url = `https://www.premiumize.me/api/transfer/delete?apikey=${apikey}`;
311
+ // let form = new FormData();
312
+ let form = new URLSearchParams();
313
+
314
+ form.append("id", id);
315
+ console.log(`FORM: id: ${form.get("id")}`);
316
+ try {
317
+ let res = await fetch(url, {
318
+ method: "POST",
319
+ body: form,
320
+ timeout: 5000,
321
+ headers: {
322
+ "Content-Type": "application/x-www-form-urlencoded",
323
+ },
324
+ });
325
+
326
+ let resJson = (await res.json()) ?? {};
327
+
328
+ console.log({ resJson });
329
+ if (checkPremiumizeRes(resJson)) {
330
+ return resJson;
331
+ // {
332
+ // "status": "success",
333
+ // }
334
+ }
335
+ return false;
336
+ } catch (error) {
337
+ return false;
338
+ }
339
+ };
340
+
341
+ // let deleteMagnetFromPM = async (id = "") => {
342
+ // if (!id) return false;
343
+
344
+ // let res = exec(
345
+ // `
346
+ // curl --request POST \
347
+ // --url 'https://www.premiumize.me/api/transfer/delete?apikey=${apikey}' \
348
+ // --form id=${id}
349
+ // `,
350
+ // (error, stdout, stderr) => {
351
+ // console.log(stdout);
352
+ // console.log({ stderr });
353
+ // if (error !== null) {
354
+ // console.log(`exec error: ${error}`);
355
+ // }
356
+ // }
357
+ // );
358
+ // };
359
+
360
+ let pmDeleteAllStagnedTransfer = async () => {
361
+ let list = await pmTransferList();
362
+
363
+ let res = await Promise.all(
364
+ list
365
+ .filter((el) => {
366
+ return (
367
+ el["status"] == "running" &&
368
+ (el["message"].includes("unknown left") || el["progress"] == 0)
369
+ );
370
+ })
371
+ .map((el) => {
372
+ return deleteMagnetFromPM(el["id"]);
373
+ })
374
+ );
375
+
376
+ return res;
377
+ };
378
+
379
+ let removeDuplicate = (data = [], key = "name") => {
380
+ let response = [];
381
+ data.forEach((one, i) => {
382
+ let index_ = response.findIndex((el) => el[key] == one[key]);
383
+ index_ == -1 ? response.push(one) : null;
384
+ });
385
+ return response;
386
+ };
387
+
388
+ module.exports = {
389
+ apikey,
390
+ checkAccount,
391
+ checkPremiumizeRes,
392
+ addMagnetToPM,
393
+ pmFolderDetails,
394
+ pmFolderId,
395
+ checkTorrentFileinPM,
396
+ pmItemDetails,
397
+ pmItemList,
398
+ removeDuplicate,
399
+ deleteMagnetFromPM,
400
+ pmDeleteAllStagnedTransfer,
401
+ checkCached,
402
+ getDirectDl,
403
+ };
index.js ADDED
@@ -0,0 +1,313 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require("dotenv").config();
2
+ const express = require("express");
3
+ const app = express();
4
+ const { removeDuplicate } = require("./helper");
5
+ const UTILS = require("./utils");
6
+ const redisClient = require("./redis");
7
+ const config = require("./config");
8
+
9
+ const REGEX = {
10
+ season_range:
11
+ /S(?:(eason )|(easons )|(eason )|(easons )|(aisons )|(aison ))?(?<start>\d{1,2})\s*?(?:-|&|à|et)\s*?(?<end>\d{1,2})/, //start and end Sxx-xx|Season(s) xx-xx|Sxx à xx
12
+ ep_range: /((?:e)|(?:ep))?(?: )?(?<start>\d{1,4})\s?(-|~)\s?(?<end>\d{1,4})/, //xxx-xxx
13
+ ep_rangewithS:
14
+ /((?:e)|(?:pisode))\s*(?<start>\d{1,3}(?!\d)|\d\d\d??)(?:-?e?(?<end>\d{1,3}))?(?!\d)/, //Exxx-xxx
15
+ };
16
+
17
+ const redis = redisClient();
18
+
19
+ // ----------------------------------------------
20
+ app.get("/", (req, res) => {
21
+ return res.status(200).send("okok");
22
+ });
23
+
24
+ app
25
+ .get("/manifest.json", (req, res) => {
26
+ res.setHeader("Access-Control-Allow-Origin", "*");
27
+ res.setHeader("Access-Control-Allow-Headers", "*");
28
+ res.setHeader("Content-Type", "application/json");
29
+
30
+ //
31
+ var json = { ...config };
32
+
33
+ return res.send(json);
34
+ })
35
+ .get("/stream/:type/:id", async (req, res) => {
36
+ res.setHeader("Access-Control-Allow-Origin", "*");
37
+ res.setHeader("Access-Control-Allow-Headers", "*");
38
+ res.setHeader("Content-Type", "application/json");
39
+
40
+ try {
41
+ await redis.connect();
42
+ let ping = await redis.ping();
43
+ console.log({ ping });
44
+ } catch (error) {}
45
+
46
+ //
47
+ media = req.params.type;
48
+ let id = req.params.id;
49
+ id = id.replace(".json", "");
50
+
51
+ try {
52
+ //TODO: check if stream is cached
53
+ let stream_cached = await redis.json.get(config.id + "|" + id);
54
+ if (!!stream_cached) {
55
+ console.log(
56
+ `Returning results from cache: ${stream_cached?.length} found`
57
+ );
58
+ // await redis.disconnect();
59
+ return res.send({ streams: stream_cached });
60
+ }
61
+ } catch (error) {
62
+ console.log(`Failed to get ${id} from cache`);
63
+ }
64
+
65
+ let tmp = [];
66
+
67
+ if (id.includes("kitsu")) {
68
+ tmp = await UTILS.getImdbFromKitsu(id);
69
+ if (!tmp) {
70
+ return res.send({ stream: {} });
71
+ }
72
+ } else {
73
+ tmp = id.split(":");
74
+ }
75
+
76
+ let [tt, s, e, abs_season, abs_episode, abs] = tmp;
77
+
78
+ console.log(tmp);
79
+
80
+ let meta = await UTILS.getMeta(tt, media);
81
+
82
+ console.log({ meta: id });
83
+ console.log({ name: meta?.name, year: meta?.year });
84
+
85
+ let query = "";
86
+ query = meta?.name ?? "";
87
+
88
+ let result = [];
89
+
90
+ query = query.replace(/['<>:]/g, "");
91
+
92
+ if (media == "movie") {
93
+ query += " " + meta?.year;
94
+ result = await UTILS.fetchTorrent2(encodeURIComponent(query), "movie");
95
+ } else if (media == "series") {
96
+ let promises = [
97
+ UTILS.fetchTorrent2(
98
+ encodeURIComponent(
99
+ `${UTILS.simplifiedName(query)} S${(s ?? "1").padStart(2, "0")}`
100
+ )
101
+ ),
102
+ UTILS.fetchTorrent2(
103
+ encodeURIComponent(
104
+ `${UTILS.simplifiedName(query)} Season ${s ?? "1"}`
105
+ )
106
+ ),
107
+ UTILS.fetchTorrent2(
108
+ encodeURIComponent(`${UTILS.simplifiedName(query)} Complet`)
109
+ ),
110
+ UTILS.fetchTorrent2(
111
+ encodeURIComponent(
112
+ `${UTILS.simplifiedName(query)} S${s?.padStart(
113
+ 2,
114
+ "0"
115
+ )}E${e?.padStart(2, "0")}`
116
+ )
117
+ ),
118
+ ];
119
+
120
+ if (+s == 1) {
121
+ promises.push(
122
+ UTILS.fetchTorrent2(
123
+ encodeURIComponent(
124
+ `${UTILS.simplifiedName(query)} ${e?.padStart(2, "0")}`
125
+ )
126
+ )
127
+ );
128
+ }
129
+
130
+ if (abs) {
131
+ promises.push(
132
+ UTILS.fetchTorrent2(
133
+ encodeURIComponent(
134
+ `${UTILS.simplifiedName(query)} ${abs_episode?.padStart(2, "0")}`
135
+ )
136
+ )
137
+ );
138
+ promises.push(
139
+ UTILS.fetchTorrent2(
140
+ encodeURIComponent(
141
+ `${UTILS.simplifiedName(query)} ${abs_episode?.padStart(3, "0")}`
142
+ )
143
+ )
144
+ );
145
+ }
146
+
147
+ result = await Promise.all(promises);
148
+
149
+ result = result.reduce((resArr, curr) => {
150
+ if (curr) {
151
+ resArr = [...resArr, ...curr];
152
+ }
153
+ return resArr;
154
+ }, []);
155
+ }
156
+
157
+ result = removeDuplicate(result, "Title");
158
+
159
+ // ------------------------------- FOR RANGE THINGS ---------------------------------------------
160
+
161
+ let matches = [];
162
+
163
+ for (const key in result) {
164
+ const element = result[key];
165
+
166
+ let r = new RegExp(REGEX.season_range, "gmi");
167
+ let match = r.exec(element["Title"]);
168
+ if (match && match["groups"] != null) {
169
+ if (
170
+ ![match["groups"]["start"], match["groups"]["end"]].includes(
171
+ meta?.year
172
+ )
173
+ ) {
174
+ if (s >= +match["groups"]["start"] && s <= +match["groups"]["end"]) {
175
+ matches.push(result[key]);
176
+ result.splice(key, 1);
177
+ continue;
178
+ }
179
+ }
180
+ }
181
+
182
+ r = new RegExp(REGEX.ep_range, "gmi");
183
+ match = r.exec(element["Title"]);
184
+
185
+ if (match && match["groups"] != null) {
186
+ if (
187
+ ![match["groups"]["start"], match["groups"]["end"]].includes(
188
+ meta?.year
189
+ )
190
+ ) {
191
+ if (
192
+ abs_episode >= +match["groups"]["start"] &&
193
+ abs_episode <= +match["groups"]["end"]
194
+ ) {
195
+ matches.push(result[key]);
196
+ result.splice(key, 1);
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ console.log({ matches: matches.map((el) => el["Title"]) });
203
+
204
+ result = [...matches, ...result];
205
+ result.sort((a, b) => {
206
+ return -(+a["Peers"] - +b["Peers"]) ?? 0;
207
+ });
208
+
209
+ console.log({ "Retenus for filtering": result.length });
210
+
211
+ const MAX_RES = process.env.MAX_RES ?? 20;
212
+ result = result?.length >= MAX_RES ? result.splice(0, MAX_RES) : result;
213
+
214
+ // ----------------------------------------------------------------------------
215
+
216
+ result = (result ?? []).filter(
217
+ (torrent) =>
218
+ (torrent["MagnetUri"] != "" || torrent["Link"] != "") &&
219
+ torrent["Peers"] >= 0
220
+ );
221
+
222
+ console.log({ "Result after removing low peers items": result.length });
223
+
224
+ let torrentParsed = await Promise.all(
225
+ result.map((torrent) =>
226
+ UTILS.getParsedFromMagnetorTorrentFile(
227
+ torrent,
228
+ torrent["MagnetUri"] || torrent["Link"]
229
+ )
230
+ )
231
+ );
232
+ console.log({
233
+ "After parsing (non parsed included)": torrentParsed.length,
234
+ });
235
+
236
+ // engine ? engine.destroy() : null;
237
+
238
+ torrentParsed = torrentParsed.filter(
239
+ (torrent) =>
240
+ torrent &&
241
+ torrent?.parsedTor != null &&
242
+ torrent?.parsedTor?.files?.length > 0
243
+ );
244
+
245
+ console.log({ "Parsed torrents": torrentParsed.length });
246
+
247
+ // for (let index = 0; index < torrentParsed.length; index++) {
248
+ // const torrr = torrentParsed[index];
249
+
250
+ // console.log({ Name: torrr["Title"] });
251
+ // for (const element of torrr?.parsedTor?.files) {
252
+ // console.log({ element: element.name });
253
+ // }
254
+ // console.log("--------------------------------------");
255
+ // }
256
+
257
+ let stream_results = await Promise.all(
258
+ torrentParsed.map((torrent) =>
259
+ UTILS.toStream(
260
+ torrent,
261
+ media,
262
+ s,
263
+ e,
264
+ abs_season,
265
+ abs_episode,
266
+ abs,
267
+ torrentParsed.length
268
+ )
269
+ )
270
+ );
271
+
272
+ stream_results = Array.from(new Set(stream_results)).filter((e) => !!e);
273
+
274
+ stream_results = [
275
+ ...UTILS.filterBasedOnQuality(stream_results, UTILS.qualities["4k"]),
276
+ ...UTILS.filterBasedOnQuality(stream_results, UTILS.qualities.fhd),
277
+ ...UTILS.filterBasedOnQuality(stream_results, UTILS.qualities.hd),
278
+ ...UTILS.filterBasedOnQuality(stream_results, UTILS.qualities.sd),
279
+ ...UTILS.filterBasedOnQuality(stream_results, UTILS.qualities.unknown),
280
+ ];
281
+ nbreAdded = 0;
282
+
283
+ if (stream_results.length != 0) {
284
+ try {
285
+ let cache_ok = await redis.json.set(
286
+ `${config.id}|${id}`,
287
+ "$",
288
+ stream_results
289
+ );
290
+ if (cache_ok) {
291
+ await redis.expireAt(
292
+ `${config.id}|${id}`,
293
+ new Date(Date.now() + 1000 * 60 * 60 * 24 * 0)
294
+ );
295
+ }
296
+ console.log({ cache_ok });
297
+ } catch (error) {
298
+ console.log("Failed to cache " + id.toString() + ": ", error);
299
+ }
300
+ }
301
+
302
+ console.log({ Final: stream_results.length });
303
+ // try {
304
+ // await redis.disconnect();
305
+ // } catch (error) {
306
+ // console.log("Failed to disconnect from redis");
307
+ // }
308
+
309
+ return res.send({ streams: stream_results });
310
+ })
311
+ .listen(process.env.PORT || 3000, () => {
312
+ console.log("The server is working on " + process.env.PORT || 3000);
313
+ });
notes.txt ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // const host = "http://1.156.186.156:9117";
2
+ // const apiKey = "lfc52616kbv1ziq9iyidtyzccjgjfvqf";
3
+
4
+ //ygg
5
+ // const host = "http://5.196.95.143:9117/jackett";
6
+ // const apiKey = "vb9cal5ks6k23hebeodgs9v9f6gn413j";
7
+
8
+ //ygg2
9
+ // const host = "http://195.154.253.11:9117";
10
+ // const apiKey = "slk4nam3ebkvr0cp6kemwtsdrd9jwk7x";
11
+
12
+ //demonoid
13
+ const host = "http://122.9.138.6:9117";
14
+ const apiKey = "1nzknaz17g814h2vt9imounhf006sad1";
15
+
16
+ //private=[torrentleech, blutopia, broadcasthenet, hdsky, iptorrents morethantv]
17
+ // const host = "http://163.172.91.22:9117";
18
+ // const apiKey = "dh0jpr5kffjz0vniizt3xo1gbu45eh6e";
19
+
20
+
21
+
22
+ #xtor
23
+ #http://82.64.107.217:9117|3uch97aczznwj1cjvyhqyoxkfbea6wn3
24
+ #http://195.154.176.233:9117|wditbmg7gimijom3ayxdicceshdbl7ou
25
+
26
+ abn
27
+ http://37.187.96.240:9117/jackett|nn6a4ekizom285jrsgs5koivj7wlyx9s
package-lock.json ADDED
@@ -0,0 +1,2001 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "addon",
3
+ "version": "1.0.1",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "addon",
9
+ "version": "1.0.1",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "body-parser": "^1.20.2",
13
+ "cors": "^2.8.5",
14
+ "dotenv": "^16.3.1",
15
+ "express": "^4.18.2",
16
+ "fast-xml-parser": "^4.3.6",
17
+ "node-fetch": "^2.6.12",
18
+ "parse-torrent": "^9.1.5",
19
+ "parse-torrent-name": "^0.5.4",
20
+ "redis": "^4.7.0",
21
+ "torrent-stream": "^1.2.1"
22
+ }
23
+ },
24
+ "node_modules/@redis/bloom": {
25
+ "version": "1.2.0",
26
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
27
+ "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
28
+ "license": "MIT",
29
+ "peerDependencies": {
30
+ "@redis/client": "^1.0.0"
31
+ }
32
+ },
33
+ "node_modules/@redis/client": {
34
+ "version": "1.6.0",
35
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz",
36
+ "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "cluster-key-slot": "1.1.2",
40
+ "generic-pool": "3.9.0",
41
+ "yallist": "4.0.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=14"
45
+ }
46
+ },
47
+ "node_modules/@redis/graph": {
48
+ "version": "1.1.1",
49
+ "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz",
50
+ "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==",
51
+ "license": "MIT",
52
+ "peerDependencies": {
53
+ "@redis/client": "^1.0.0"
54
+ }
55
+ },
56
+ "node_modules/@redis/json": {
57
+ "version": "1.0.7",
58
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz",
59
+ "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==",
60
+ "license": "MIT",
61
+ "peerDependencies": {
62
+ "@redis/client": "^1.0.0"
63
+ }
64
+ },
65
+ "node_modules/@redis/search": {
66
+ "version": "1.2.0",
67
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz",
68
+ "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==",
69
+ "license": "MIT",
70
+ "peerDependencies": {
71
+ "@redis/client": "^1.0.0"
72
+ }
73
+ },
74
+ "node_modules/@redis/time-series": {
75
+ "version": "1.1.0",
76
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz",
77
+ "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==",
78
+ "license": "MIT",
79
+ "peerDependencies": {
80
+ "@redis/client": "^1.0.0"
81
+ }
82
+ },
83
+ "node_modules/accepts": {
84
+ "version": "1.3.8",
85
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
86
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
87
+ "dependencies": {
88
+ "mime-types": "~2.1.34",
89
+ "negotiator": "0.6.3"
90
+ },
91
+ "engines": {
92
+ "node": ">= 0.6"
93
+ }
94
+ },
95
+ "node_modules/addr-to-ip-port": {
96
+ "version": "1.5.4",
97
+ "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.5.4.tgz",
98
+ "integrity": "sha512-ByxmJgv8vjmDcl3IDToxL2yrWFrRtFpZAToY0f46XFXl8zS081t7El5MXIodwm7RC6DhHBRoOSMLFSPKCtHukg=="
99
+ },
100
+ "node_modules/array-flatten": {
101
+ "version": "1.1.1",
102
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
103
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
104
+ },
105
+ "node_modules/balanced-match": {
106
+ "version": "1.0.2",
107
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
108
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
109
+ },
110
+ "node_modules/bencode": {
111
+ "version": "2.0.3",
112
+ "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz",
113
+ "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w=="
114
+ },
115
+ "node_modules/bep53-range": {
116
+ "version": "1.1.1",
117
+ "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-1.1.1.tgz",
118
+ "integrity": "sha512-ct6s33iiwRCUPp9KXnJ4QMWDgHIgaw36caK/5XEQ9L8dCzSQlJt1Vk6VmHh1VD4AlGCAI4C2zmtfItifBBPrhQ=="
119
+ },
120
+ "node_modules/bitfield": {
121
+ "version": "0.1.0",
122
+ "resolved": "https://registry.npmjs.org/bitfield/-/bitfield-0.1.0.tgz",
123
+ "integrity": "sha512-M15ypXCxXd81FSOWL2ejHpB1TDKmz7Y55/VuqfExJi72sHW0JzE5dfV+hrSZafZtWRg/tdMsdte5dgwrlOM7nA=="
124
+ },
125
+ "node_modules/bittorrent-dht": {
126
+ "version": "6.4.2",
127
+ "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-6.4.2.tgz",
128
+ "integrity": "sha512-DeBunF1nL/ckThYyU3AVtHFR195zNV06Ob6bKNXA1y6X56GSKMfkNCABB45YcbZevGMW1dytFlm59D/fws5lTg==",
129
+ "dependencies": {
130
+ "bencode": "^0.7.0",
131
+ "buffer-equals": "^1.0.3",
132
+ "debug": "^2.2.0",
133
+ "inherits": "^2.0.1",
134
+ "k-bucket": "^0.6.0",
135
+ "k-rpc": "^3.6.0",
136
+ "lru": "^2.0.0"
137
+ }
138
+ },
139
+ "node_modules/bittorrent-dht/node_modules/bencode": {
140
+ "version": "0.7.0",
141
+ "resolved": "https://registry.npmjs.org/bencode/-/bencode-0.7.0.tgz",
142
+ "integrity": "sha512-MG5AM/hkQIZoz/layZ1JK3xBTfqkLcJ3dJ7u2lx+6vZT1JWyK3OgEFGx1WFzWt6grGH6OSGQvRcCnhWKLp4f1Q=="
143
+ },
144
+ "node_modules/bittorrent-tracker": {
145
+ "version": "7.7.0",
146
+ "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-7.7.0.tgz",
147
+ "integrity": "sha512-YFgPTVRhUMncZr8tM3ige7gnViMGhKoGF23qaiISRG8xtYebTGHrMSMXsTXo6O1KbtdEI+4jzvGY1K/wdT9GUA==",
148
+ "dependencies": {
149
+ "bencode": "^0.8.0",
150
+ "bn.js": "^4.4.0",
151
+ "compact2string": "^1.2.0",
152
+ "debug": "^2.0.0",
153
+ "hat": "0.0.3",
154
+ "inherits": "^2.0.1",
155
+ "ip": "^1.0.1",
156
+ "minimist": "^1.1.1",
157
+ "once": "^1.3.0",
158
+ "random-iterate": "^1.0.1",
159
+ "run-parallel": "^1.1.2",
160
+ "run-series": "^1.0.2",
161
+ "simple-get": "^2.0.0",
162
+ "simple-peer": "^6.0.0",
163
+ "simple-websocket": "^4.0.0",
164
+ "string2compact": "^1.1.1",
165
+ "uniq": "^1.0.1",
166
+ "ws": "^1.0.0",
167
+ "xtend": "^4.0.0"
168
+ },
169
+ "bin": {
170
+ "bittorrent-tracker": "bin/cmd.js"
171
+ }
172
+ },
173
+ "node_modules/bittorrent-tracker/node_modules/bencode": {
174
+ "version": "0.8.0",
175
+ "resolved": "https://registry.npmjs.org/bencode/-/bencode-0.8.0.tgz",
176
+ "integrity": "sha512-MWs3FqaWOGg5l+quIT9JTx7+SlcMbfPqqpWy+GOYi5rjZkX8i03tkNhAQn3pD2GAKENPpP3ScUR97ZUMffhHZA=="
177
+ },
178
+ "node_modules/bittorrent-tracker/node_modules/decompress-response": {
179
+ "version": "3.3.0",
180
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
181
+ "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
182
+ "dependencies": {
183
+ "mimic-response": "^1.0.0"
184
+ },
185
+ "engines": {
186
+ "node": ">=4"
187
+ }
188
+ },
189
+ "node_modules/bittorrent-tracker/node_modules/mimic-response": {
190
+ "version": "1.0.1",
191
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
192
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
193
+ "engines": {
194
+ "node": ">=4"
195
+ }
196
+ },
197
+ "node_modules/bittorrent-tracker/node_modules/simple-get": {
198
+ "version": "2.8.2",
199
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz",
200
+ "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==",
201
+ "dependencies": {
202
+ "decompress-response": "^3.3.0",
203
+ "once": "^1.3.1",
204
+ "simple-concat": "^1.0.0"
205
+ }
206
+ },
207
+ "node_modules/blob-to-buffer": {
208
+ "version": "1.2.9",
209
+ "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.9.tgz",
210
+ "integrity": "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==",
211
+ "funding": [
212
+ {
213
+ "type": "github",
214
+ "url": "https://github.com/sponsors/feross"
215
+ },
216
+ {
217
+ "type": "patreon",
218
+ "url": "https://www.patreon.com/feross"
219
+ },
220
+ {
221
+ "type": "consulting",
222
+ "url": "https://feross.org/support"
223
+ }
224
+ ]
225
+ },
226
+ "node_modules/bn.js": {
227
+ "version": "4.12.0",
228
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
229
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
230
+ },
231
+ "node_modules/bncode": {
232
+ "version": "0.5.3",
233
+ "resolved": "https://registry.npmjs.org/bncode/-/bncode-0.5.3.tgz",
234
+ "integrity": "sha512-0P5VuWobU5Gwbeio8n9Jsdv0tE1IikrV9n4f7RsnXHNtxmdd/oeIO6QyoSEUAEyo5P6i3XMfBppi82WqNsT4JA=="
235
+ },
236
+ "node_modules/body-parser": {
237
+ "version": "1.20.2",
238
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
239
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
240
+ "dependencies": {
241
+ "bytes": "3.1.2",
242
+ "content-type": "~1.0.5",
243
+ "debug": "2.6.9",
244
+ "depd": "2.0.0",
245
+ "destroy": "1.2.0",
246
+ "http-errors": "2.0.0",
247
+ "iconv-lite": "0.4.24",
248
+ "on-finished": "2.4.1",
249
+ "qs": "6.11.0",
250
+ "raw-body": "2.5.2",
251
+ "type-is": "~1.6.18",
252
+ "unpipe": "1.0.0"
253
+ },
254
+ "engines": {
255
+ "node": ">= 0.8",
256
+ "npm": "1.2.8000 || >= 1.4.16"
257
+ }
258
+ },
259
+ "node_modules/brace-expansion": {
260
+ "version": "1.1.11",
261
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
262
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
263
+ "dependencies": {
264
+ "balanced-match": "^1.0.0",
265
+ "concat-map": "0.0.1"
266
+ }
267
+ },
268
+ "node_modules/buffer-alloc": {
269
+ "version": "1.2.0",
270
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
271
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
272
+ "dependencies": {
273
+ "buffer-alloc-unsafe": "^1.1.0",
274
+ "buffer-fill": "^1.0.0"
275
+ }
276
+ },
277
+ "node_modules/buffer-alloc-unsafe": {
278
+ "version": "1.1.0",
279
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
280
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
281
+ },
282
+ "node_modules/buffer-equal": {
283
+ "version": "0.0.1",
284
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
285
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
286
+ "engines": {
287
+ "node": ">=0.4.0"
288
+ }
289
+ },
290
+ "node_modules/buffer-equals": {
291
+ "version": "1.0.4",
292
+ "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz",
293
+ "integrity": "sha512-99MsCq0j5+RhubVEtKQgKaD6EM+UP3xJgIvQqwJ3SOLDUekzxMX1ylXBng+Wa2sh7mGT0W6RUly8ojjr1Tt6nA==",
294
+ "engines": {
295
+ "node": ">=0.10.0"
296
+ }
297
+ },
298
+ "node_modules/buffer-fill": {
299
+ "version": "1.0.0",
300
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
301
+ "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="
302
+ },
303
+ "node_modules/buffer-from": {
304
+ "version": "1.1.2",
305
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
306
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
307
+ },
308
+ "node_modules/bytes": {
309
+ "version": "3.1.2",
310
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
311
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
312
+ "engines": {
313
+ "node": ">= 0.8"
314
+ }
315
+ },
316
+ "node_modules/call-bind": {
317
+ "version": "1.0.7",
318
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
319
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
320
+ "dependencies": {
321
+ "es-define-property": "^1.0.0",
322
+ "es-errors": "^1.3.0",
323
+ "function-bind": "^1.1.2",
324
+ "get-intrinsic": "^1.2.4",
325
+ "set-function-length": "^1.2.1"
326
+ },
327
+ "engines": {
328
+ "node": ">= 0.4"
329
+ },
330
+ "funding": {
331
+ "url": "https://github.com/sponsors/ljharb"
332
+ }
333
+ },
334
+ "node_modules/chrome-dgram": {
335
+ "version": "3.0.6",
336
+ "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz",
337
+ "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==",
338
+ "funding": [
339
+ {
340
+ "type": "github",
341
+ "url": "https://github.com/sponsors/feross"
342
+ },
343
+ {
344
+ "type": "patreon",
345
+ "url": "https://www.patreon.com/feross"
346
+ },
347
+ {
348
+ "type": "consulting",
349
+ "url": "https://feross.org/support"
350
+ }
351
+ ],
352
+ "dependencies": {
353
+ "inherits": "^2.0.4",
354
+ "run-series": "^1.1.9"
355
+ }
356
+ },
357
+ "node_modules/chrome-dns": {
358
+ "version": "1.0.1",
359
+ "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz",
360
+ "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==",
361
+ "dependencies": {
362
+ "chrome-net": "^3.3.2"
363
+ }
364
+ },
365
+ "node_modules/chrome-net": {
366
+ "version": "3.3.4",
367
+ "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz",
368
+ "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==",
369
+ "funding": [
370
+ {
371
+ "type": "github",
372
+ "url": "https://github.com/sponsors/feross"
373
+ },
374
+ {
375
+ "type": "patreon",
376
+ "url": "https://www.patreon.com/feross"
377
+ },
378
+ {
379
+ "type": "consulting",
380
+ "url": "https://feross.org/support"
381
+ }
382
+ ],
383
+ "dependencies": {
384
+ "inherits": "^2.0.1"
385
+ }
386
+ },
387
+ "node_modules/cluster-key-slot": {
388
+ "version": "1.1.2",
389
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
390
+ "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
391
+ "license": "Apache-2.0",
392
+ "engines": {
393
+ "node": ">=0.10.0"
394
+ }
395
+ },
396
+ "node_modules/compact2string": {
397
+ "version": "1.4.1",
398
+ "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz",
399
+ "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==",
400
+ "dependencies": {
401
+ "ipaddr.js": ">= 0.1.5"
402
+ }
403
+ },
404
+ "node_modules/concat-map": {
405
+ "version": "0.0.1",
406
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
407
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
408
+ },
409
+ "node_modules/content-disposition": {
410
+ "version": "0.5.4",
411
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
412
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
413
+ "dependencies": {
414
+ "safe-buffer": "5.2.1"
415
+ },
416
+ "engines": {
417
+ "node": ">= 0.6"
418
+ }
419
+ },
420
+ "node_modules/content-type": {
421
+ "version": "1.0.5",
422
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
423
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
424
+ "engines": {
425
+ "node": ">= 0.6"
426
+ }
427
+ },
428
+ "node_modules/cookie": {
429
+ "version": "0.6.0",
430
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
431
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
432
+ "engines": {
433
+ "node": ">= 0.6"
434
+ }
435
+ },
436
+ "node_modules/cookie-signature": {
437
+ "version": "1.0.6",
438
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
439
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
440
+ },
441
+ "node_modules/core-util-is": {
442
+ "version": "1.0.3",
443
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
444
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
445
+ },
446
+ "node_modules/cors": {
447
+ "version": "2.8.5",
448
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
449
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
450
+ "dependencies": {
451
+ "object-assign": "^4",
452
+ "vary": "^1"
453
+ },
454
+ "engines": {
455
+ "node": ">= 0.10"
456
+ }
457
+ },
458
+ "node_modules/cyclist": {
459
+ "version": "0.1.1",
460
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.1.1.tgz",
461
+ "integrity": "sha512-w8a8nQk9YSCkMmH2wDbFqpH1XMz7l409mSvWnnG6Iu6D0Ydhvq61XASE7QIaA46FxfG2Ag524ZuGgAy2cXPfsw=="
462
+ },
463
+ "node_modules/debug": {
464
+ "version": "2.6.9",
465
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
466
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
467
+ "dependencies": {
468
+ "ms": "2.0.0"
469
+ }
470
+ },
471
+ "node_modules/decompress-response": {
472
+ "version": "6.0.0",
473
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
474
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
475
+ "dependencies": {
476
+ "mimic-response": "^3.1.0"
477
+ },
478
+ "engines": {
479
+ "node": ">=10"
480
+ },
481
+ "funding": {
482
+ "url": "https://github.com/sponsors/sindresorhus"
483
+ }
484
+ },
485
+ "node_modules/define-data-property": {
486
+ "version": "1.1.4",
487
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
488
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
489
+ "dependencies": {
490
+ "es-define-property": "^1.0.0",
491
+ "es-errors": "^1.3.0",
492
+ "gopd": "^1.0.1"
493
+ },
494
+ "engines": {
495
+ "node": ">= 0.4"
496
+ },
497
+ "funding": {
498
+ "url": "https://github.com/sponsors/ljharb"
499
+ }
500
+ },
501
+ "node_modules/depd": {
502
+ "version": "2.0.0",
503
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
504
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
505
+ "engines": {
506
+ "node": ">= 0.8"
507
+ }
508
+ },
509
+ "node_modules/destroy": {
510
+ "version": "1.2.0",
511
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
512
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
513
+ "engines": {
514
+ "node": ">= 0.8",
515
+ "npm": "1.2.8000 || >= 1.4.16"
516
+ }
517
+ },
518
+ "node_modules/dotenv": {
519
+ "version": "16.4.5",
520
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
521
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
522
+ "engines": {
523
+ "node": ">=12"
524
+ },
525
+ "funding": {
526
+ "url": "https://dotenvx.com"
527
+ }
528
+ },
529
+ "node_modules/ee-first": {
530
+ "version": "1.1.1",
531
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
532
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
533
+ },
534
+ "node_modules/encodeurl": {
535
+ "version": "1.0.2",
536
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
537
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
538
+ "engines": {
539
+ "node": ">= 0.8"
540
+ }
541
+ },
542
+ "node_modules/end-of-stream": {
543
+ "version": "0.1.5",
544
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
545
+ "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==",
546
+ "dependencies": {
547
+ "once": "~1.3.0"
548
+ }
549
+ },
550
+ "node_modules/end-of-stream/node_modules/once": {
551
+ "version": "1.3.3",
552
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
553
+ "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
554
+ "dependencies": {
555
+ "wrappy": "1"
556
+ }
557
+ },
558
+ "node_modules/es-define-property": {
559
+ "version": "1.0.0",
560
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
561
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
562
+ "dependencies": {
563
+ "get-intrinsic": "^1.2.4"
564
+ },
565
+ "engines": {
566
+ "node": ">= 0.4"
567
+ }
568
+ },
569
+ "node_modules/es-errors": {
570
+ "version": "1.3.0",
571
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
572
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
573
+ "engines": {
574
+ "node": ">= 0.4"
575
+ }
576
+ },
577
+ "node_modules/escape-html": {
578
+ "version": "1.0.3",
579
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
580
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
581
+ },
582
+ "node_modules/etag": {
583
+ "version": "1.8.1",
584
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
585
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
586
+ "engines": {
587
+ "node": ">= 0.6"
588
+ }
589
+ },
590
+ "node_modules/events": {
591
+ "version": "3.3.0",
592
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
593
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
594
+ "engines": {
595
+ "node": ">=0.8.x"
596
+ }
597
+ },
598
+ "node_modules/express": {
599
+ "version": "4.19.2",
600
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
601
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
602
+ "dependencies": {
603
+ "accepts": "~1.3.8",
604
+ "array-flatten": "1.1.1",
605
+ "body-parser": "1.20.2",
606
+ "content-disposition": "0.5.4",
607
+ "content-type": "~1.0.4",
608
+ "cookie": "0.6.0",
609
+ "cookie-signature": "1.0.6",
610
+ "debug": "2.6.9",
611
+ "depd": "2.0.0",
612
+ "encodeurl": "~1.0.2",
613
+ "escape-html": "~1.0.3",
614
+ "etag": "~1.8.1",
615
+ "finalhandler": "1.2.0",
616
+ "fresh": "0.5.2",
617
+ "http-errors": "2.0.0",
618
+ "merge-descriptors": "1.0.1",
619
+ "methods": "~1.1.2",
620
+ "on-finished": "2.4.1",
621
+ "parseurl": "~1.3.3",
622
+ "path-to-regexp": "0.1.7",
623
+ "proxy-addr": "~2.0.7",
624
+ "qs": "6.11.0",
625
+ "range-parser": "~1.2.1",
626
+ "safe-buffer": "5.2.1",
627
+ "send": "0.18.0",
628
+ "serve-static": "1.15.0",
629
+ "setprototypeof": "1.2.0",
630
+ "statuses": "2.0.1",
631
+ "type-is": "~1.6.18",
632
+ "utils-merge": "1.0.1",
633
+ "vary": "~1.1.2"
634
+ },
635
+ "engines": {
636
+ "node": ">= 0.10.0"
637
+ }
638
+ },
639
+ "node_modules/fast-xml-parser": {
640
+ "version": "4.4.1",
641
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz",
642
+ "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
643
+ "funding": [
644
+ {
645
+ "type": "github",
646
+ "url": "https://github.com/sponsors/NaturalIntelligence"
647
+ },
648
+ {
649
+ "type": "paypal",
650
+ "url": "https://paypal.me/naturalintelligence"
651
+ }
652
+ ],
653
+ "dependencies": {
654
+ "strnum": "^1.0.5"
655
+ },
656
+ "bin": {
657
+ "fxparser": "src/cli/cli.js"
658
+ }
659
+ },
660
+ "node_modules/fifo": {
661
+ "version": "0.1.4",
662
+ "resolved": "https://registry.npmjs.org/fifo/-/fifo-0.1.4.tgz",
663
+ "integrity": "sha512-CpKgwraLo4YWY9cUEICNJ1WcOVR2WE1Jvot3Nvr7FGBiGOKgkn1CmF4zuCl9VxvEh1nQsdYXtQg+V0etPiED6g=="
664
+ },
665
+ "node_modules/finalhandler": {
666
+ "version": "1.2.0",
667
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
668
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
669
+ "dependencies": {
670
+ "debug": "2.6.9",
671
+ "encodeurl": "~1.0.2",
672
+ "escape-html": "~1.0.3",
673
+ "on-finished": "2.4.1",
674
+ "parseurl": "~1.3.3",
675
+ "statuses": "2.0.1",
676
+ "unpipe": "~1.0.0"
677
+ },
678
+ "engines": {
679
+ "node": ">= 0.8"
680
+ }
681
+ },
682
+ "node_modules/flatten": {
683
+ "version": "0.0.1",
684
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-0.0.1.tgz",
685
+ "integrity": "sha512-pzNZh42/A2HmcRIpddSP0T+zBofd119o5rNB2u1YHv36CM2C/ietI2ZsjWZ2LSL7J0BNVkFn1a9Ad+cmO2lDQg==",
686
+ "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.",
687
+ "engines": {
688
+ "node": "*"
689
+ }
690
+ },
691
+ "node_modules/forwarded": {
692
+ "version": "0.2.0",
693
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
694
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
695
+ "engines": {
696
+ "node": ">= 0.6"
697
+ }
698
+ },
699
+ "node_modules/fresh": {
700
+ "version": "0.5.2",
701
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
702
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
703
+ "engines": {
704
+ "node": ">= 0.6"
705
+ }
706
+ },
707
+ "node_modules/fs-chunk-store": {
708
+ "version": "1.7.0",
709
+ "resolved": "https://registry.npmjs.org/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz",
710
+ "integrity": "sha512-KhjJmZAs2eqfhCb6PdPx4RcZtheGTz86tpTC5JTvqBn/xda+Nb+0C7dCyjOSN7T76H6a56LvH0SVXQMchLXDRw==",
711
+ "dependencies": {
712
+ "mkdirp": "^0.5.1",
713
+ "random-access-file": "^2.0.1",
714
+ "randombytes": "^2.0.3",
715
+ "rimraf": "^2.4.2",
716
+ "run-parallel": "^1.1.2",
717
+ "thunky": "^1.0.1"
718
+ }
719
+ },
720
+ "node_modules/fs-chunk-store/node_modules/mkdirp": {
721
+ "version": "0.5.6",
722
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
723
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
724
+ "dependencies": {
725
+ "minimist": "^1.2.6"
726
+ },
727
+ "bin": {
728
+ "mkdirp": "bin/cmd.js"
729
+ }
730
+ },
731
+ "node_modules/fs.realpath": {
732
+ "version": "1.0.0",
733
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
734
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
735
+ },
736
+ "node_modules/function-bind": {
737
+ "version": "1.1.2",
738
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
739
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
740
+ "funding": {
741
+ "url": "https://github.com/sponsors/ljharb"
742
+ }
743
+ },
744
+ "node_modules/generic-pool": {
745
+ "version": "3.9.0",
746
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
747
+ "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
748
+ "license": "MIT",
749
+ "engines": {
750
+ "node": ">= 4"
751
+ }
752
+ },
753
+ "node_modules/get-browser-rtc": {
754
+ "version": "1.1.0",
755
+ "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz",
756
+ "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ=="
757
+ },
758
+ "node_modules/get-intrinsic": {
759
+ "version": "1.2.4",
760
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
761
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
762
+ "dependencies": {
763
+ "es-errors": "^1.3.0",
764
+ "function-bind": "^1.1.2",
765
+ "has-proto": "^1.0.1",
766
+ "has-symbols": "^1.0.3",
767
+ "hasown": "^2.0.0"
768
+ },
769
+ "engines": {
770
+ "node": ">= 0.4"
771
+ },
772
+ "funding": {
773
+ "url": "https://github.com/sponsors/ljharb"
774
+ }
775
+ },
776
+ "node_modules/get-stdin": {
777
+ "version": "8.0.0",
778
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
779
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
780
+ "engines": {
781
+ "node": ">=10"
782
+ },
783
+ "funding": {
784
+ "url": "https://github.com/sponsors/sindresorhus"
785
+ }
786
+ },
787
+ "node_modules/glob": {
788
+ "version": "7.2.3",
789
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
790
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
791
+ "deprecated": "Glob versions prior to v9 are no longer supported",
792
+ "dependencies": {
793
+ "fs.realpath": "^1.0.0",
794
+ "inflight": "^1.0.4",
795
+ "inherits": "2",
796
+ "minimatch": "^3.1.1",
797
+ "once": "^1.3.0",
798
+ "path-is-absolute": "^1.0.0"
799
+ },
800
+ "engines": {
801
+ "node": "*"
802
+ },
803
+ "funding": {
804
+ "url": "https://github.com/sponsors/isaacs"
805
+ }
806
+ },
807
+ "node_modules/gopd": {
808
+ "version": "1.0.1",
809
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
810
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
811
+ "dependencies": {
812
+ "get-intrinsic": "^1.1.3"
813
+ },
814
+ "funding": {
815
+ "url": "https://github.com/sponsors/ljharb"
816
+ }
817
+ },
818
+ "node_modules/has-property-descriptors": {
819
+ "version": "1.0.2",
820
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
821
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
822
+ "dependencies": {
823
+ "es-define-property": "^1.0.0"
824
+ },
825
+ "funding": {
826
+ "url": "https://github.com/sponsors/ljharb"
827
+ }
828
+ },
829
+ "node_modules/has-proto": {
830
+ "version": "1.0.3",
831
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
832
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
833
+ "engines": {
834
+ "node": ">= 0.4"
835
+ },
836
+ "funding": {
837
+ "url": "https://github.com/sponsors/ljharb"
838
+ }
839
+ },
840
+ "node_modules/has-symbols": {
841
+ "version": "1.0.3",
842
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
843
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
844
+ "engines": {
845
+ "node": ">= 0.4"
846
+ },
847
+ "funding": {
848
+ "url": "https://github.com/sponsors/ljharb"
849
+ }
850
+ },
851
+ "node_modules/hasown": {
852
+ "version": "2.0.2",
853
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
854
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
855
+ "dependencies": {
856
+ "function-bind": "^1.1.2"
857
+ },
858
+ "engines": {
859
+ "node": ">= 0.4"
860
+ }
861
+ },
862
+ "node_modules/hat": {
863
+ "version": "0.0.3",
864
+ "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz",
865
+ "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==",
866
+ "engines": {
867
+ "node": "*"
868
+ }
869
+ },
870
+ "node_modules/http-errors": {
871
+ "version": "2.0.0",
872
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
873
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
874
+ "dependencies": {
875
+ "depd": "2.0.0",
876
+ "inherits": "2.0.4",
877
+ "setprototypeof": "1.2.0",
878
+ "statuses": "2.0.1",
879
+ "toidentifier": "1.0.1"
880
+ },
881
+ "engines": {
882
+ "node": ">= 0.8"
883
+ }
884
+ },
885
+ "node_modules/iconv-lite": {
886
+ "version": "0.4.24",
887
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
888
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
889
+ "dependencies": {
890
+ "safer-buffer": ">= 2.1.2 < 3"
891
+ },
892
+ "engines": {
893
+ "node": ">=0.10.0"
894
+ }
895
+ },
896
+ "node_modules/immediate-chunk-store": {
897
+ "version": "1.0.8",
898
+ "resolved": "https://registry.npmjs.org/immediate-chunk-store/-/immediate-chunk-store-1.0.8.tgz",
899
+ "integrity": "sha512-0tQyTytUaIUskpv5j5L5ZeQuEjYDl9QIekwDUisdqpAM81OZjBaEIriW7hoiRLaLNxj1fXE8e1yx5JaCGrrE7A=="
900
+ },
901
+ "node_modules/inflight": {
902
+ "version": "1.0.6",
903
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
904
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
905
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
906
+ "dependencies": {
907
+ "once": "^1.3.0",
908
+ "wrappy": "1"
909
+ }
910
+ },
911
+ "node_modules/inherits": {
912
+ "version": "2.0.4",
913
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
914
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
915
+ },
916
+ "node_modules/ip": {
917
+ "version": "1.1.9",
918
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz",
919
+ "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ=="
920
+ },
921
+ "node_modules/ip-set": {
922
+ "version": "1.0.2",
923
+ "resolved": "https://registry.npmjs.org/ip-set/-/ip-set-1.0.2.tgz",
924
+ "integrity": "sha512-Mb6kv78bTi4RNAIIWL8Bbre7hXOR2pNUi3j8FaQkLaitf/ZWxkq3/iIwXNYk2ACO3IMfdVdQrOkUtwZblO7uBA==",
925
+ "dependencies": {
926
+ "ip": "^1.1.3"
927
+ }
928
+ },
929
+ "node_modules/ipaddr.js": {
930
+ "version": "1.9.1",
931
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
932
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
933
+ "engines": {
934
+ "node": ">= 0.10"
935
+ }
936
+ },
937
+ "node_modules/isarray": {
938
+ "version": "0.0.1",
939
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
940
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
941
+ },
942
+ "node_modules/k-bucket": {
943
+ "version": "0.6.0",
944
+ "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-0.6.0.tgz",
945
+ "integrity": "sha512-1zJpqkrLYgolqdO1TE1/FWf+mHfhJKLC2Wpi4JaMFZKi4b6tFEn9/d+JqscBIJw5auWFewp16CSAEetFGEC4NQ==",
946
+ "dependencies": {
947
+ "buffer-equal": "0.0.1",
948
+ "inherits": "^2.0.1"
949
+ }
950
+ },
951
+ "node_modules/k-rpc": {
952
+ "version": "3.7.0",
953
+ "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-3.7.0.tgz",
954
+ "integrity": "sha512-XFL8PatIToQ/qhSSAq9FSK73wk4fX4DcHqjnkvSCrWC59PV02Oj1KeYa3KnREAXgA1DlCSzcKjk7M8usnT/dUw==",
955
+ "dependencies": {
956
+ "buffer-equals": "^1.0.3",
957
+ "k-bucket": "^2.0.0",
958
+ "k-rpc-socket": "^1.5.0"
959
+ }
960
+ },
961
+ "node_modules/k-rpc-socket": {
962
+ "version": "1.11.1",
963
+ "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz",
964
+ "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==",
965
+ "dependencies": {
966
+ "bencode": "^2.0.0",
967
+ "chrome-dgram": "^3.0.2",
968
+ "chrome-dns": "^1.0.0",
969
+ "chrome-net": "^3.3.2"
970
+ }
971
+ },
972
+ "node_modules/k-rpc/node_modules/k-bucket": {
973
+ "version": "2.0.1",
974
+ "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-2.0.1.tgz",
975
+ "integrity": "sha512-Xuye90xBBDJJbvNSuy3z/Yl8ceVX02/sopqGUEwJkMgRw+//TQXx0/Hbgp60GsoVfZcCBllQXXp6AWe2INu8pw==",
976
+ "dependencies": {
977
+ "buffer-equal": "0.0.1",
978
+ "randombytes": "^2.0.3"
979
+ }
980
+ },
981
+ "node_modules/lru": {
982
+ "version": "2.0.1",
983
+ "resolved": "https://registry.npmjs.org/lru/-/lru-2.0.1.tgz",
984
+ "integrity": "sha512-JGRd3IHM64MPsGVw1Mqbz2Y2HDIePqi/MLfPtdrkHQwvvJnSrS9b6gM3KS9PFR5xJnufXJczHHZSmGqfuII1ew==",
985
+ "dependencies": {
986
+ "inherits": "^2.0.1"
987
+ },
988
+ "engines": {
989
+ "node": ">= 0.4.0"
990
+ }
991
+ },
992
+ "node_modules/magnet-uri": {
993
+ "version": "6.2.0",
994
+ "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-6.2.0.tgz",
995
+ "integrity": "sha512-O9AgdDwT771fnUj0giPYu/rACpz8173y8UXCSOdLITjOVfBenZ9H9q3FqQmveK+ORUMuD+BkKNSZP8C3+IMAKQ==",
996
+ "funding": [
997
+ {
998
+ "type": "github",
999
+ "url": "https://github.com/sponsors/feross"
1000
+ },
1001
+ {
1002
+ "type": "patreon",
1003
+ "url": "https://www.patreon.com/feross"
1004
+ },
1005
+ {
1006
+ "type": "consulting",
1007
+ "url": "https://feross.org/support"
1008
+ }
1009
+ ],
1010
+ "dependencies": {
1011
+ "bep53-range": "^1.1.0",
1012
+ "thirty-two": "^1.0.2"
1013
+ }
1014
+ },
1015
+ "node_modules/media-typer": {
1016
+ "version": "0.3.0",
1017
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1018
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1019
+ "engines": {
1020
+ "node": ">= 0.6"
1021
+ }
1022
+ },
1023
+ "node_modules/merge-descriptors": {
1024
+ "version": "1.0.1",
1025
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1026
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1027
+ },
1028
+ "node_modules/methods": {
1029
+ "version": "1.1.2",
1030
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1031
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1032
+ "engines": {
1033
+ "node": ">= 0.6"
1034
+ }
1035
+ },
1036
+ "node_modules/mime": {
1037
+ "version": "1.6.0",
1038
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1039
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1040
+ "bin": {
1041
+ "mime": "cli.js"
1042
+ },
1043
+ "engines": {
1044
+ "node": ">=4"
1045
+ }
1046
+ },
1047
+ "node_modules/mime-db": {
1048
+ "version": "1.52.0",
1049
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1050
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1051
+ "engines": {
1052
+ "node": ">= 0.6"
1053
+ }
1054
+ },
1055
+ "node_modules/mime-types": {
1056
+ "version": "2.1.35",
1057
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1058
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1059
+ "dependencies": {
1060
+ "mime-db": "1.52.0"
1061
+ },
1062
+ "engines": {
1063
+ "node": ">= 0.6"
1064
+ }
1065
+ },
1066
+ "node_modules/mimic-response": {
1067
+ "version": "3.1.0",
1068
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
1069
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
1070
+ "engines": {
1071
+ "node": ">=10"
1072
+ },
1073
+ "funding": {
1074
+ "url": "https://github.com/sponsors/sindresorhus"
1075
+ }
1076
+ },
1077
+ "node_modules/minimatch": {
1078
+ "version": "3.1.2",
1079
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1080
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1081
+ "dependencies": {
1082
+ "brace-expansion": "^1.1.7"
1083
+ },
1084
+ "engines": {
1085
+ "node": "*"
1086
+ }
1087
+ },
1088
+ "node_modules/minimist": {
1089
+ "version": "1.2.8",
1090
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
1091
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
1092
+ "funding": {
1093
+ "url": "https://github.com/sponsors/ljharb"
1094
+ }
1095
+ },
1096
+ "node_modules/mkdirp": {
1097
+ "version": "0.3.5",
1098
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
1099
+ "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==",
1100
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)"
1101
+ },
1102
+ "node_modules/mkdirp-classic": {
1103
+ "version": "0.5.3",
1104
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
1105
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
1106
+ },
1107
+ "node_modules/ms": {
1108
+ "version": "2.0.0",
1109
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1110
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1111
+ },
1112
+ "node_modules/negotiator": {
1113
+ "version": "0.6.3",
1114
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1115
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1116
+ "engines": {
1117
+ "node": ">= 0.6"
1118
+ }
1119
+ },
1120
+ "node_modules/node-fetch": {
1121
+ "version": "2.7.0",
1122
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1123
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1124
+ "dependencies": {
1125
+ "whatwg-url": "^5.0.0"
1126
+ },
1127
+ "engines": {
1128
+ "node": "4.x || >=6.0.0"
1129
+ },
1130
+ "peerDependencies": {
1131
+ "encoding": "^0.1.0"
1132
+ },
1133
+ "peerDependenciesMeta": {
1134
+ "encoding": {
1135
+ "optional": true
1136
+ }
1137
+ }
1138
+ },
1139
+ "node_modules/object-assign": {
1140
+ "version": "4.1.1",
1141
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1142
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1143
+ "engines": {
1144
+ "node": ">=0.10.0"
1145
+ }
1146
+ },
1147
+ "node_modules/object-inspect": {
1148
+ "version": "1.13.2",
1149
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
1150
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
1151
+ "engines": {
1152
+ "node": ">= 0.4"
1153
+ },
1154
+ "funding": {
1155
+ "url": "https://github.com/sponsors/ljharb"
1156
+ }
1157
+ },
1158
+ "node_modules/on-finished": {
1159
+ "version": "2.4.1",
1160
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1161
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1162
+ "dependencies": {
1163
+ "ee-first": "1.1.1"
1164
+ },
1165
+ "engines": {
1166
+ "node": ">= 0.8"
1167
+ }
1168
+ },
1169
+ "node_modules/once": {
1170
+ "version": "1.4.0",
1171
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1172
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1173
+ "dependencies": {
1174
+ "wrappy": "1"
1175
+ }
1176
+ },
1177
+ "node_modules/options": {
1178
+ "version": "0.0.6",
1179
+ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
1180
+ "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==",
1181
+ "engines": {
1182
+ "node": ">=0.4.0"
1183
+ }
1184
+ },
1185
+ "node_modules/parse-torrent": {
1186
+ "version": "9.1.5",
1187
+ "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-9.1.5.tgz",
1188
+ "integrity": "sha512-K8FXRwTOaZMI0/xuv0dpng1MVHZRtMJ0jRWBJ3qZWVNTrC1MzWUxm9QwaXDz/2qPhV2XC4UIHI92IGHwseAwaA==",
1189
+ "funding": [
1190
+ {
1191
+ "type": "github",
1192
+ "url": "https://github.com/sponsors/feross"
1193
+ },
1194
+ {
1195
+ "type": "patreon",
1196
+ "url": "https://www.patreon.com/feross"
1197
+ },
1198
+ {
1199
+ "type": "consulting",
1200
+ "url": "https://feross.org/support"
1201
+ }
1202
+ ],
1203
+ "dependencies": {
1204
+ "bencode": "^2.0.2",
1205
+ "blob-to-buffer": "^1.2.9",
1206
+ "get-stdin": "^8.0.0",
1207
+ "magnet-uri": "^6.2.0",
1208
+ "queue-microtask": "^1.2.3",
1209
+ "simple-get": "^4.0.1",
1210
+ "simple-sha1": "^3.1.0"
1211
+ },
1212
+ "bin": {
1213
+ "parse-torrent": "bin/cmd.js"
1214
+ }
1215
+ },
1216
+ "node_modules/parse-torrent-file": {
1217
+ "version": "2.1.4",
1218
+ "resolved": "https://registry.npmjs.org/parse-torrent-file/-/parse-torrent-file-2.1.4.tgz",
1219
+ "integrity": "sha512-u2MgLOjZPDDer1oRg1c+H/+54iIQYY5TKgQ5G8KrGLT1Dcwdo7Lj+QfQR123+u8J0AMSFGbQUvsBlSB7uIJcCA==",
1220
+ "deprecated": "Use the parse-torrent package instead",
1221
+ "dependencies": {
1222
+ "bencode": "^0.7.0",
1223
+ "simple-sha1": "^2.0.0"
1224
+ },
1225
+ "bin": {
1226
+ "parse-torrent-file": "bin/cmd.js"
1227
+ }
1228
+ },
1229
+ "node_modules/parse-torrent-file/node_modules/bencode": {
1230
+ "version": "0.7.0",
1231
+ "resolved": "https://registry.npmjs.org/bencode/-/bencode-0.7.0.tgz",
1232
+ "integrity": "sha512-MG5AM/hkQIZoz/layZ1JK3xBTfqkLcJ3dJ7u2lx+6vZT1JWyK3OgEFGx1WFzWt6grGH6OSGQvRcCnhWKLp4f1Q=="
1233
+ },
1234
+ "node_modules/parse-torrent-file/node_modules/simple-sha1": {
1235
+ "version": "2.1.2",
1236
+ "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.2.tgz",
1237
+ "integrity": "sha512-TQl9rm4rdKAVmhO++sXAb8TNN0D6JAD5iyI1mqEPNpxUzTRrtm4aOG1pDf/5W/qCFihiaoK6uuL9rvQz1x1VKw==",
1238
+ "dependencies": {
1239
+ "rusha": "^0.8.1"
1240
+ }
1241
+ },
1242
+ "node_modules/parse-torrent-name": {
1243
+ "version": "0.5.4",
1244
+ "resolved": "https://registry.npmjs.org/parse-torrent-name/-/parse-torrent-name-0.5.4.tgz",
1245
+ "integrity": "sha512-digWcT7Zp/oZX8I7iTQSfWd3z3C/0zszo/xYQsmogO2a6XDU0sTlQXYffHRhuwXNivBvMB8mS+EAwciyyVBlGQ=="
1246
+ },
1247
+ "node_modules/parseurl": {
1248
+ "version": "1.3.3",
1249
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1250
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1251
+ "engines": {
1252
+ "node": ">= 0.8"
1253
+ }
1254
+ },
1255
+ "node_modules/path-is-absolute": {
1256
+ "version": "1.0.1",
1257
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1258
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1259
+ "engines": {
1260
+ "node": ">=0.10.0"
1261
+ }
1262
+ },
1263
+ "node_modules/path-to-regexp": {
1264
+ "version": "0.1.7",
1265
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1266
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1267
+ },
1268
+ "node_modules/peer-wire-protocol": {
1269
+ "version": "0.7.1",
1270
+ "resolved": "https://registry.npmjs.org/peer-wire-protocol/-/peer-wire-protocol-0.7.1.tgz",
1271
+ "integrity": "sha512-V9oTa/ZcfNNz9fAST28Gg0fXbPeFPk3SBImsYO8GDDG5D0E195vxXmjZ+SPrzr4BJyMQmdDmwUfTf9MZ62z4mw==",
1272
+ "dependencies": {
1273
+ "bitfield": "^0.1.0",
1274
+ "bncode": "^0.2.3",
1275
+ "buffer-alloc": "^1.1.0",
1276
+ "buffer-from": "^1.0.0",
1277
+ "readable-stream": "^1.0.2",
1278
+ "speedometer": "^0.1.2"
1279
+ }
1280
+ },
1281
+ "node_modules/peer-wire-protocol/node_modules/bncode": {
1282
+ "version": "0.2.3",
1283
+ "resolved": "https://registry.npmjs.org/bncode/-/bncode-0.2.3.tgz",
1284
+ "integrity": "sha512-IXGfySD68R/J2X/it8GZqAM+Vb3ByZvAlUi0Gysq4ZACq6hXGQ3YshKo0QS/f3S9wOWKjJnEjP6x3ELxqBnAOA=="
1285
+ },
1286
+ "node_modules/peer-wire-swarm": {
1287
+ "version": "0.12.2",
1288
+ "resolved": "https://registry.npmjs.org/peer-wire-swarm/-/peer-wire-swarm-0.12.2.tgz",
1289
+ "integrity": "sha512-sIWZ1nTL9l6mI9J18kW1AeByBwagvNzGJlMmQA9pM+otKQtTIwnigK8SR0nEFrNZYqZelI6RQ6g4udvtQ2TI1g==",
1290
+ "dependencies": {
1291
+ "buffer-from": "^1.0.0",
1292
+ "fifo": "^0.1.4",
1293
+ "once": "^1.1.1",
1294
+ "peer-wire-protocol": "^0.7.0",
1295
+ "speedometer": "^0.1.2",
1296
+ "utp": "0.0.7"
1297
+ }
1298
+ },
1299
+ "node_modules/process-nextick-args": {
1300
+ "version": "2.0.1",
1301
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1302
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1303
+ },
1304
+ "node_modules/proxy-addr": {
1305
+ "version": "2.0.7",
1306
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1307
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1308
+ "dependencies": {
1309
+ "forwarded": "0.2.0",
1310
+ "ipaddr.js": "1.9.1"
1311
+ },
1312
+ "engines": {
1313
+ "node": ">= 0.10"
1314
+ }
1315
+ },
1316
+ "node_modules/qs": {
1317
+ "version": "6.11.0",
1318
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1319
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1320
+ "dependencies": {
1321
+ "side-channel": "^1.0.4"
1322
+ },
1323
+ "engines": {
1324
+ "node": ">=0.6"
1325
+ },
1326
+ "funding": {
1327
+ "url": "https://github.com/sponsors/ljharb"
1328
+ }
1329
+ },
1330
+ "node_modules/queue-microtask": {
1331
+ "version": "1.2.3",
1332
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1333
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1334
+ "funding": [
1335
+ {
1336
+ "type": "github",
1337
+ "url": "https://github.com/sponsors/feross"
1338
+ },
1339
+ {
1340
+ "type": "patreon",
1341
+ "url": "https://www.patreon.com/feross"
1342
+ },
1343
+ {
1344
+ "type": "consulting",
1345
+ "url": "https://feross.org/support"
1346
+ }
1347
+ ]
1348
+ },
1349
+ "node_modules/queue-tick": {
1350
+ "version": "1.0.1",
1351
+ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
1352
+ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
1353
+ },
1354
+ "node_modules/random-access-file": {
1355
+ "version": "2.2.1",
1356
+ "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.2.1.tgz",
1357
+ "integrity": "sha512-RGU0xmDqdOyEiynob1KYSeh8+9c9Td1MJ74GT1viMEYAn8SJ9oBtWCXLsYZukCF46yududHOdM449uRYbzBrZQ==",
1358
+ "dependencies": {
1359
+ "mkdirp-classic": "^0.5.2",
1360
+ "random-access-storage": "^1.1.1"
1361
+ }
1362
+ },
1363
+ "node_modules/random-access-storage": {
1364
+ "version": "1.4.3",
1365
+ "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.4.3.tgz",
1366
+ "integrity": "sha512-D5e2iIC5dNENWyBxsjhEnNOMCwZZ64TARK6dyMN+3g4OTC4MJxyjh9hKLjTGoNhDOPrgjI+YlFEHFnrp/cSnzQ==",
1367
+ "dependencies": {
1368
+ "events": "^3.3.0",
1369
+ "inherits": "^2.0.3",
1370
+ "queue-tick": "^1.0.0"
1371
+ }
1372
+ },
1373
+ "node_modules/random-iterate": {
1374
+ "version": "1.0.1",
1375
+ "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz",
1376
+ "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA=="
1377
+ },
1378
+ "node_modules/randombytes": {
1379
+ "version": "2.1.0",
1380
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1381
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1382
+ "dependencies": {
1383
+ "safe-buffer": "^5.1.0"
1384
+ }
1385
+ },
1386
+ "node_modules/range-parser": {
1387
+ "version": "1.2.1",
1388
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1389
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1390
+ "engines": {
1391
+ "node": ">= 0.6"
1392
+ }
1393
+ },
1394
+ "node_modules/raw-body": {
1395
+ "version": "2.5.2",
1396
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1397
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1398
+ "dependencies": {
1399
+ "bytes": "3.1.2",
1400
+ "http-errors": "2.0.0",
1401
+ "iconv-lite": "0.4.24",
1402
+ "unpipe": "1.0.0"
1403
+ },
1404
+ "engines": {
1405
+ "node": ">= 0.8"
1406
+ }
1407
+ },
1408
+ "node_modules/re-emitter": {
1409
+ "version": "1.1.4",
1410
+ "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.4.tgz",
1411
+ "integrity": "sha512-C0SIXdXDSus2yqqvV7qifnb4NoWP7mEBXJq3axci301mXHCZb8Djwm4hrEZo4UeXRaEnfjH98uQ8EBppk2oNWA=="
1412
+ },
1413
+ "node_modules/readable-stream": {
1414
+ "version": "1.1.14",
1415
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1416
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
1417
+ "dependencies": {
1418
+ "core-util-is": "~1.0.0",
1419
+ "inherits": "~2.0.1",
1420
+ "isarray": "0.0.1",
1421
+ "string_decoder": "~0.10.x"
1422
+ }
1423
+ },
1424
+ "node_modules/redis": {
1425
+ "version": "4.7.0",
1426
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz",
1427
+ "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==",
1428
+ "license": "MIT",
1429
+ "workspaces": [
1430
+ "./packages/*"
1431
+ ],
1432
+ "dependencies": {
1433
+ "@redis/bloom": "1.2.0",
1434
+ "@redis/client": "1.6.0",
1435
+ "@redis/graph": "1.1.1",
1436
+ "@redis/json": "1.0.7",
1437
+ "@redis/search": "1.2.0",
1438
+ "@redis/time-series": "1.1.0"
1439
+ }
1440
+ },
1441
+ "node_modules/rimraf": {
1442
+ "version": "2.7.1",
1443
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1444
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1445
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
1446
+ "dependencies": {
1447
+ "glob": "^7.1.3"
1448
+ },
1449
+ "bin": {
1450
+ "rimraf": "bin.js"
1451
+ }
1452
+ },
1453
+ "node_modules/run-parallel": {
1454
+ "version": "1.2.0",
1455
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1456
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1457
+ "funding": [
1458
+ {
1459
+ "type": "github",
1460
+ "url": "https://github.com/sponsors/feross"
1461
+ },
1462
+ {
1463
+ "type": "patreon",
1464
+ "url": "https://www.patreon.com/feross"
1465
+ },
1466
+ {
1467
+ "type": "consulting",
1468
+ "url": "https://feross.org/support"
1469
+ }
1470
+ ],
1471
+ "dependencies": {
1472
+ "queue-microtask": "^1.2.2"
1473
+ }
1474
+ },
1475
+ "node_modules/run-series": {
1476
+ "version": "1.1.9",
1477
+ "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
1478
+ "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==",
1479
+ "funding": [
1480
+ {
1481
+ "type": "github",
1482
+ "url": "https://github.com/sponsors/feross"
1483
+ },
1484
+ {
1485
+ "type": "patreon",
1486
+ "url": "https://www.patreon.com/feross"
1487
+ },
1488
+ {
1489
+ "type": "consulting",
1490
+ "url": "https://feross.org/support"
1491
+ }
1492
+ ]
1493
+ },
1494
+ "node_modules/rusha": {
1495
+ "version": "0.8.14",
1496
+ "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz",
1497
+ "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA=="
1498
+ },
1499
+ "node_modules/safe-buffer": {
1500
+ "version": "5.2.1",
1501
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1502
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1503
+ "funding": [
1504
+ {
1505
+ "type": "github",
1506
+ "url": "https://github.com/sponsors/feross"
1507
+ },
1508
+ {
1509
+ "type": "patreon",
1510
+ "url": "https://www.patreon.com/feross"
1511
+ },
1512
+ {
1513
+ "type": "consulting",
1514
+ "url": "https://feross.org/support"
1515
+ }
1516
+ ]
1517
+ },
1518
+ "node_modules/safer-buffer": {
1519
+ "version": "2.1.2",
1520
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1521
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1522
+ },
1523
+ "node_modules/send": {
1524
+ "version": "0.18.0",
1525
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1526
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1527
+ "dependencies": {
1528
+ "debug": "2.6.9",
1529
+ "depd": "2.0.0",
1530
+ "destroy": "1.2.0",
1531
+ "encodeurl": "~1.0.2",
1532
+ "escape-html": "~1.0.3",
1533
+ "etag": "~1.8.1",
1534
+ "fresh": "0.5.2",
1535
+ "http-errors": "2.0.0",
1536
+ "mime": "1.6.0",
1537
+ "ms": "2.1.3",
1538
+ "on-finished": "2.4.1",
1539
+ "range-parser": "~1.2.1",
1540
+ "statuses": "2.0.1"
1541
+ },
1542
+ "engines": {
1543
+ "node": ">= 0.8.0"
1544
+ }
1545
+ },
1546
+ "node_modules/send/node_modules/ms": {
1547
+ "version": "2.1.3",
1548
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1549
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1550
+ },
1551
+ "node_modules/serve-static": {
1552
+ "version": "1.15.0",
1553
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1554
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1555
+ "dependencies": {
1556
+ "encodeurl": "~1.0.2",
1557
+ "escape-html": "~1.0.3",
1558
+ "parseurl": "~1.3.3",
1559
+ "send": "0.18.0"
1560
+ },
1561
+ "engines": {
1562
+ "node": ">= 0.8.0"
1563
+ }
1564
+ },
1565
+ "node_modules/set-function-length": {
1566
+ "version": "1.2.2",
1567
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1568
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1569
+ "dependencies": {
1570
+ "define-data-property": "^1.1.4",
1571
+ "es-errors": "^1.3.0",
1572
+ "function-bind": "^1.1.2",
1573
+ "get-intrinsic": "^1.2.4",
1574
+ "gopd": "^1.0.1",
1575
+ "has-property-descriptors": "^1.0.2"
1576
+ },
1577
+ "engines": {
1578
+ "node": ">= 0.4"
1579
+ }
1580
+ },
1581
+ "node_modules/setprototypeof": {
1582
+ "version": "1.2.0",
1583
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1584
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1585
+ },
1586
+ "node_modules/side-channel": {
1587
+ "version": "1.0.6",
1588
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1589
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1590
+ "dependencies": {
1591
+ "call-bind": "^1.0.7",
1592
+ "es-errors": "^1.3.0",
1593
+ "get-intrinsic": "^1.2.4",
1594
+ "object-inspect": "^1.13.1"
1595
+ },
1596
+ "engines": {
1597
+ "node": ">= 0.4"
1598
+ },
1599
+ "funding": {
1600
+ "url": "https://github.com/sponsors/ljharb"
1601
+ }
1602
+ },
1603
+ "node_modules/simple-concat": {
1604
+ "version": "1.0.1",
1605
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
1606
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
1607
+ "funding": [
1608
+ {
1609
+ "type": "github",
1610
+ "url": "https://github.com/sponsors/feross"
1611
+ },
1612
+ {
1613
+ "type": "patreon",
1614
+ "url": "https://www.patreon.com/feross"
1615
+ },
1616
+ {
1617
+ "type": "consulting",
1618
+ "url": "https://feross.org/support"
1619
+ }
1620
+ ]
1621
+ },
1622
+ "node_modules/simple-get": {
1623
+ "version": "4.0.1",
1624
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
1625
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
1626
+ "funding": [
1627
+ {
1628
+ "type": "github",
1629
+ "url": "https://github.com/sponsors/feross"
1630
+ },
1631
+ {
1632
+ "type": "patreon",
1633
+ "url": "https://www.patreon.com/feross"
1634
+ },
1635
+ {
1636
+ "type": "consulting",
1637
+ "url": "https://feross.org/support"
1638
+ }
1639
+ ],
1640
+ "dependencies": {
1641
+ "decompress-response": "^6.0.0",
1642
+ "once": "^1.3.1",
1643
+ "simple-concat": "^1.0.0"
1644
+ }
1645
+ },
1646
+ "node_modules/simple-peer": {
1647
+ "version": "6.4.4",
1648
+ "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-6.4.4.tgz",
1649
+ "integrity": "sha512-sY35UHankz0ba02Dd8YzdyXhEeTAnW6ZUyDfKOSwUht1GLp9VuMT4jQUXF/wG7C9vpwvitV7Ig7a6IkY/qizwg==",
1650
+ "dependencies": {
1651
+ "debug": "^2.1.0",
1652
+ "get-browser-rtc": "^1.0.0",
1653
+ "inherits": "^2.0.1",
1654
+ "randombytes": "^2.0.3",
1655
+ "readable-stream": "^2.0.5"
1656
+ }
1657
+ },
1658
+ "node_modules/simple-peer/node_modules/isarray": {
1659
+ "version": "1.0.0",
1660
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1661
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
1662
+ },
1663
+ "node_modules/simple-peer/node_modules/readable-stream": {
1664
+ "version": "2.3.8",
1665
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1666
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1667
+ "dependencies": {
1668
+ "core-util-is": "~1.0.0",
1669
+ "inherits": "~2.0.3",
1670
+ "isarray": "~1.0.0",
1671
+ "process-nextick-args": "~2.0.0",
1672
+ "safe-buffer": "~5.1.1",
1673
+ "string_decoder": "~1.1.1",
1674
+ "util-deprecate": "~1.0.1"
1675
+ }
1676
+ },
1677
+ "node_modules/simple-peer/node_modules/safe-buffer": {
1678
+ "version": "5.1.2",
1679
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1680
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1681
+ },
1682
+ "node_modules/simple-peer/node_modules/string_decoder": {
1683
+ "version": "1.1.1",
1684
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1685
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1686
+ "dependencies": {
1687
+ "safe-buffer": "~5.1.0"
1688
+ }
1689
+ },
1690
+ "node_modules/simple-sha1": {
1691
+ "version": "3.1.0",
1692
+ "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-3.1.0.tgz",
1693
+ "integrity": "sha512-ArTptMRC1v08H8ihPD6l0wesKvMfF9e8XL5rIHPanI7kGOsSsbY514MwVu6X1PITHCTB2F08zB7cyEbfc4wQjg==",
1694
+ "dependencies": {
1695
+ "queue-microtask": "^1.2.2",
1696
+ "rusha": "^0.8.13"
1697
+ }
1698
+ },
1699
+ "node_modules/simple-websocket": {
1700
+ "version": "4.3.1",
1701
+ "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-4.3.1.tgz",
1702
+ "integrity": "sha512-knEO6ub2Pw00c7ueOV6snKE1hr7jIdY068+239v0I8DVKofyd7IQmYHXrM9pZL1zuI0H7sd+Y5kedndBi5GXIA==",
1703
+ "dependencies": {
1704
+ "debug": "^2.1.3",
1705
+ "inherits": "^2.0.1",
1706
+ "randombytes": "^2.0.3",
1707
+ "readable-stream": "^2.0.5",
1708
+ "ws": "^2.0.0",
1709
+ "xtend": "^4.0.1"
1710
+ }
1711
+ },
1712
+ "node_modules/simple-websocket/node_modules/isarray": {
1713
+ "version": "1.0.0",
1714
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1715
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
1716
+ },
1717
+ "node_modules/simple-websocket/node_modules/readable-stream": {
1718
+ "version": "2.3.8",
1719
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1720
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1721
+ "dependencies": {
1722
+ "core-util-is": "~1.0.0",
1723
+ "inherits": "~2.0.3",
1724
+ "isarray": "~1.0.0",
1725
+ "process-nextick-args": "~2.0.0",
1726
+ "safe-buffer": "~5.1.1",
1727
+ "string_decoder": "~1.1.1",
1728
+ "util-deprecate": "~1.0.1"
1729
+ }
1730
+ },
1731
+ "node_modules/simple-websocket/node_modules/safe-buffer": {
1732
+ "version": "5.1.2",
1733
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1734
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1735
+ },
1736
+ "node_modules/simple-websocket/node_modules/string_decoder": {
1737
+ "version": "1.1.1",
1738
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1739
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1740
+ "dependencies": {
1741
+ "safe-buffer": "~5.1.0"
1742
+ }
1743
+ },
1744
+ "node_modules/simple-websocket/node_modules/ultron": {
1745
+ "version": "1.1.1",
1746
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
1747
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
1748
+ },
1749
+ "node_modules/simple-websocket/node_modules/ws": {
1750
+ "version": "2.3.1",
1751
+ "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz",
1752
+ "integrity": "sha512-61a+9LgtYZxTq1hAonhX8Xwpo2riK4IOR/BIVxioFbCfc3QFKmpE4x9dLExfLHKtUfVZigYa36tThVhO57erEw==",
1753
+ "dependencies": {
1754
+ "safe-buffer": "~5.0.1",
1755
+ "ultron": "~1.1.0"
1756
+ }
1757
+ },
1758
+ "node_modules/simple-websocket/node_modules/ws/node_modules/safe-buffer": {
1759
+ "version": "5.0.1",
1760
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
1761
+ "integrity": "sha512-cr7dZWLwOeaFBLTIuZeYdkfO7UzGIKhjYENJFAxUOMKWGaWDm2nJM2rzxNRm5Owu0DH3ApwNo6kx5idXZfb/Iw=="
1762
+ },
1763
+ "node_modules/speedometer": {
1764
+ "version": "0.1.4",
1765
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
1766
+ "integrity": "sha512-phdEoDlA6EUIVtzwq1UiNMXDUogczp204aYF/yfOhjNePWFfIpBJ1k5wLMuXQhEOOMjuTJEcc4vdZa+vuP+n/Q=="
1767
+ },
1768
+ "node_modules/statuses": {
1769
+ "version": "2.0.1",
1770
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1771
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1772
+ "engines": {
1773
+ "node": ">= 0.8"
1774
+ }
1775
+ },
1776
+ "node_modules/string_decoder": {
1777
+ "version": "0.10.31",
1778
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1779
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
1780
+ },
1781
+ "node_modules/string2compact": {
1782
+ "version": "1.3.2",
1783
+ "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-1.3.2.tgz",
1784
+ "integrity": "sha512-3XUxUgwhj7Eqh2djae35QHZZT4mN3fsO7kagZhSGmhhlrQagVvWSFuuFIWnpxFS0CdTB2PlQcaL16RDi14I8uw==",
1785
+ "dependencies": {
1786
+ "addr-to-ip-port": "^1.0.1",
1787
+ "ipaddr.js": "^2.0.0"
1788
+ }
1789
+ },
1790
+ "node_modules/string2compact/node_modules/ipaddr.js": {
1791
+ "version": "2.2.0",
1792
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
1793
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
1794
+ "engines": {
1795
+ "node": ">= 10"
1796
+ }
1797
+ },
1798
+ "node_modules/strnum": {
1799
+ "version": "1.0.5",
1800
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
1801
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
1802
+ },
1803
+ "node_modules/thirty-two": {
1804
+ "version": "1.0.2",
1805
+ "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
1806
+ "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==",
1807
+ "engines": {
1808
+ "node": ">=0.2.6"
1809
+ }
1810
+ },
1811
+ "node_modules/thunky": {
1812
+ "version": "1.1.0",
1813
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
1814
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
1815
+ },
1816
+ "node_modules/toidentifier": {
1817
+ "version": "1.0.1",
1818
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1819
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1820
+ "engines": {
1821
+ "node": ">=0.6"
1822
+ }
1823
+ },
1824
+ "node_modules/torrent-discovery": {
1825
+ "version": "5.4.0",
1826
+ "resolved": "https://registry.npmjs.org/torrent-discovery/-/torrent-discovery-5.4.0.tgz",
1827
+ "integrity": "sha512-bPTDIA7XEjRlw6vQyt7kM/h1mg1INBsibjbujISITonx4POENZgxfyCSEXZpDhbAkluSPH4HKRKs4/YTmNLC6w==",
1828
+ "dependencies": {
1829
+ "bittorrent-dht": "^6.0.0",
1830
+ "bittorrent-tracker": "^7.0.0",
1831
+ "debug": "^2.0.0",
1832
+ "inherits": "^2.0.1",
1833
+ "re-emitter": "^1.0.0",
1834
+ "run-parallel": "^1.1.2",
1835
+ "xtend": "^4.0.0"
1836
+ }
1837
+ },
1838
+ "node_modules/torrent-piece": {
1839
+ "version": "1.1.2",
1840
+ "resolved": "https://registry.npmjs.org/torrent-piece/-/torrent-piece-1.1.2.tgz",
1841
+ "integrity": "sha512-ElXPyXKKG73o+uziHJ8qlYE9EuyDVxnK2zWL+pW/2bma7RsLpSwFFIJAb8Qui7/tel2hsHQW1z3zBnfQNREpWA=="
1842
+ },
1843
+ "node_modules/torrent-stream": {
1844
+ "version": "1.2.1",
1845
+ "resolved": "https://registry.npmjs.org/torrent-stream/-/torrent-stream-1.2.1.tgz",
1846
+ "integrity": "sha512-F+3tYmXnpO2gyhZQ7o8yakELJH3FtKISI/FU0iWvchOWFUXiFnjbEBoumSzfcK1P71Qxzx2az4lVK4Dkq4KSew==",
1847
+ "dependencies": {
1848
+ "bitfield": "^0.1.0",
1849
+ "bncode": "^0.5.2",
1850
+ "buffer-from": "^1.0.0",
1851
+ "end-of-stream": "^0.1.4",
1852
+ "fs-chunk-store": "^1.3.0",
1853
+ "hat": "0.0.3",
1854
+ "immediate-chunk-store": "^1.0.5",
1855
+ "ip-set": "^1.0.0",
1856
+ "mkdirp": "^0.3.5",
1857
+ "parse-torrent": "^4.0.0",
1858
+ "peer-wire-swarm": "^0.12.0",
1859
+ "rimraf": "^2.2.5",
1860
+ "torrent-discovery": "^5.2.0",
1861
+ "torrent-piece": "^1.0.0"
1862
+ }
1863
+ },
1864
+ "node_modules/torrent-stream/node_modules/magnet-uri": {
1865
+ "version": "4.2.3",
1866
+ "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-4.2.3.tgz",
1867
+ "integrity": "sha512-aHhR49CRBOq3BX6jQOBdGMXhNT2+9LIH3CCIwHlR+aFE8nWMfBD1aNYxfm2u2LsCOwvfPeyCsdIg9KXSwdsOLQ==",
1868
+ "dependencies": {
1869
+ "flatten": "0.0.1",
1870
+ "thirty-two": "^0.0.2",
1871
+ "xtend": "^4.0.0"
1872
+ }
1873
+ },
1874
+ "node_modules/torrent-stream/node_modules/parse-torrent": {
1875
+ "version": "4.1.0",
1876
+ "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-4.1.0.tgz",
1877
+ "integrity": "sha512-FeoGe8bOYmSzxO31kYy44A03FjuULCMOIMom8KyuGvO8/lLVPJyo2nr9CwH/iYmNHm74hk7h70o59DOfk9Rq+A==",
1878
+ "dependencies": {
1879
+ "magnet-uri": "^4.0.0",
1880
+ "parse-torrent-file": "^2.0.0"
1881
+ },
1882
+ "bin": {
1883
+ "parse-torrent": "bin/cmd.js"
1884
+ }
1885
+ },
1886
+ "node_modules/torrent-stream/node_modules/thirty-two": {
1887
+ "version": "0.0.2",
1888
+ "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz",
1889
+ "integrity": "sha512-0j1A9eqbP8dSEtkqqEJGpYFN2lPgQR1d0qKS2KNAmIxkK6gV37D5hRa5b/mYzVL1fyAVWBkeUDIXybZdCLVBzA==",
1890
+ "engines": {
1891
+ "node": ">=0.2.6"
1892
+ }
1893
+ },
1894
+ "node_modules/tr46": {
1895
+ "version": "0.0.3",
1896
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1897
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
1898
+ },
1899
+ "node_modules/type-is": {
1900
+ "version": "1.6.18",
1901
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1902
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1903
+ "dependencies": {
1904
+ "media-typer": "0.3.0",
1905
+ "mime-types": "~2.1.24"
1906
+ },
1907
+ "engines": {
1908
+ "node": ">= 0.6"
1909
+ }
1910
+ },
1911
+ "node_modules/ultron": {
1912
+ "version": "1.0.2",
1913
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
1914
+ "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow=="
1915
+ },
1916
+ "node_modules/uniq": {
1917
+ "version": "1.0.1",
1918
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
1919
+ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA=="
1920
+ },
1921
+ "node_modules/unpipe": {
1922
+ "version": "1.0.0",
1923
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1924
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1925
+ "engines": {
1926
+ "node": ">= 0.8"
1927
+ }
1928
+ },
1929
+ "node_modules/util-deprecate": {
1930
+ "version": "1.0.2",
1931
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1932
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1933
+ },
1934
+ "node_modules/utils-merge": {
1935
+ "version": "1.0.1",
1936
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1937
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1938
+ "engines": {
1939
+ "node": ">= 0.4.0"
1940
+ }
1941
+ },
1942
+ "node_modules/utp": {
1943
+ "version": "0.0.7",
1944
+ "resolved": "https://registry.npmjs.org/utp/-/utp-0.0.7.tgz",
1945
+ "integrity": "sha512-2ZLjisH0HQkpqZTg2m7TK0Yn7TETTg7DxM0EpCKIIIV2ky9w9nSxW5a7gzdk4nH2h+pomrrGw0uywrUJfsm2eA==",
1946
+ "dependencies": {
1947
+ "cyclist": "~0.1.0"
1948
+ }
1949
+ },
1950
+ "node_modules/vary": {
1951
+ "version": "1.1.2",
1952
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1953
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1954
+ "engines": {
1955
+ "node": ">= 0.8"
1956
+ }
1957
+ },
1958
+ "node_modules/webidl-conversions": {
1959
+ "version": "3.0.1",
1960
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1961
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
1962
+ },
1963
+ "node_modules/whatwg-url": {
1964
+ "version": "5.0.0",
1965
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1966
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1967
+ "dependencies": {
1968
+ "tr46": "~0.0.3",
1969
+ "webidl-conversions": "^3.0.0"
1970
+ }
1971
+ },
1972
+ "node_modules/wrappy": {
1973
+ "version": "1.0.2",
1974
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1975
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1976
+ },
1977
+ "node_modules/ws": {
1978
+ "version": "1.1.5",
1979
+ "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
1980
+ "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
1981
+ "dependencies": {
1982
+ "options": ">=0.0.5",
1983
+ "ultron": "1.0.x"
1984
+ }
1985
+ },
1986
+ "node_modules/xtend": {
1987
+ "version": "4.0.2",
1988
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1989
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1990
+ "engines": {
1991
+ "node": ">=0.4"
1992
+ }
1993
+ },
1994
+ "node_modules/yallist": {
1995
+ "version": "4.0.0",
1996
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1997
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1998
+ "license": "ISC"
1999
+ }
2000
+ }
2001
+ }
package.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "addon",
3
+ "version": "1.0.1",
4
+ "description": "NZB addon",
5
+ "main": "index.js",
6
+ "repository": "https://github.com/daniwalter001/jackett-addon.git",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "start": "node index.js"
10
+ },
11
+ "keywords": [
12
+ "addon",
13
+ "stremio",
14
+ "nzb",
15
+ "nzbhydra"
16
+ ],
17
+ "author": "daniwalter001",
18
+ "license": "ISC",
19
+ "dependencies": {
20
+ "body-parser": "^1.20.2",
21
+ "cors": "^2.8.5",
22
+ "dotenv": "^16.3.1",
23
+ "express": "^4.18.2",
24
+ "fast-xml-parser": "^4.3.6",
25
+ "node-fetch": "^2.6.12",
26
+ "parse-torrent": "^9.1.5",
27
+ "parse-torrent-name": "^0.5.4",
28
+ "redis": "^4.7.0",
29
+ "torrent-stream": "^1.2.1"
30
+ }
31
+ }
redis.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { createClient } = require("redis");
2
+
3
+ const redisClient = () => {
4
+ const pass = process.env.REDIS_PASSWORD;
5
+ const url = process.env.REDIS_URL;
6
+ const port = process.env.REDIS_PORT;
7
+
8
+ if (!pass || !url || !port) return null;
9
+
10
+ const client = createClient({
11
+ url: `rediss://default:${pass}@${url}:${port}`,
12
+ socket: {
13
+ timeout: 10000,
14
+ },
15
+ });
16
+
17
+ client.on("error", function (err) {
18
+ console.log("Redis Client Error", err);
19
+ return null;
20
+ });
21
+
22
+ return client;
23
+ };
24
+
25
+ module.exports = redisClient;
servers.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ http://89.234.183.80:9117|lr9infchvzdonx8su36c01ir84kfey7j
utils.js ADDED
@@ -0,0 +1,770 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require("dotenv").config();
2
+ var torrentStream = require("torrent-stream");
3
+ const parseTorrent = require("parse-torrent");
4
+ const express = require("express");
5
+ const app = express();
6
+ const fetch = require("node-fetch");
7
+ // var WebTorrent = require("webtorrent");
8
+ var torrentStream = require("torrent-stream");
9
+ const { XMLParser } = require("fast-xml-parser");
10
+ const {
11
+ checkCached,
12
+ getDirectDl,
13
+ checkTorrentFileinPM,
14
+ pmFolderDetails,
15
+ addMagnetToPM,
16
+ pmFolderId,
17
+ } = require("./helper");
18
+
19
+ let nbreAdded = 0;
20
+
21
+ let containEandS = (name = "", s, e, abs = false, abs_season, abs_episode) =>
22
+ //SxxExx ./ /~/-
23
+ //SxExx
24
+ //SxExx
25
+ //axb
26
+ //Sxx - Exx
27
+ //Sxx.Exx
28
+ //Season xx Exx
29
+ //SasEae selon abs
30
+ //SasEaex selon abs
31
+ //SasEaexx selon abs
32
+ //SxxEaexx selon abs
33
+ //SxxEaexxx selon abs
34
+ name?.includes(`s${s?.padStart(2, "0")}e${e?.padStart(2, "0")} `) ||
35
+ name?.includes(`s${s?.padStart(2, "0")}e${e?.padStart(2, "0")}.`) ||
36
+ name?.includes(`s${s?.padStart(2, "0")}e${e?.padStart(2, "0")}-`) ||
37
+ name?.includes(`s${s}e${e?.padStart(2, "0")} `) ||
38
+ name?.includes(`s${s}e${e?.padStart(2, "0")}.`) ||
39
+ name?.includes(`s${s}e${e?.padStart(2, "0")}-`) ||
40
+ name?.includes(`${s}x${e}`) ||
41
+ name?.includes(`s${s?.padStart(2, "0")} - e${e?.padStart(2, "0")}`) ||
42
+ name?.includes(`s${s?.padStart(2, "0")}.e${e?.padStart(2, "0")}`) ||
43
+ name?.includes(`s${s}e${e?.padStart(2, "0")} `) ||
44
+ name?.includes(`s${s}e${e?.padStart(2, "0")}.`) ||
45
+ name?.includes(`s${s}e${e?.padStart(2, "0")}-`) ||
46
+ name?.includes(`s${s?.padStart(2, "0")}e${e} `) ||
47
+ name?.includes(`s${s?.padStart(2, "0")}e${e}.`) ||
48
+ name?.includes(`s${s?.padStart(2, "0")}e${e}-`) ||
49
+ name?.includes(`season ${s} e${e}`) ||
50
+ (abs &&
51
+ (name?.includes(
52
+ `s${abs_season?.padStart(2, "0")}e${abs_episode?.padStart(2, "0")}`
53
+ ) ||
54
+ name?.includes(
55
+ `s${s?.padStart(2, "0")}e${abs_episode?.padStart(2, "0")}`
56
+ ) ||
57
+ name?.includes(
58
+ `s${s?.padStart(2, "0")}e${abs_episode?.padStart(3, "0")}`
59
+ ) ||
60
+ name?.includes(
61
+ `s${abs_season?.padStart(2, "0")}e${abs_episode?.padStart(3, "0")}`
62
+ ) ||
63
+ name?.includes(
64
+ `s${abs_season?.padStart(2, "0")}e${abs_episode?.padStart(4, "0")}`
65
+ )));
66
+
67
+ let containE_S = (name = "", s, e, abs = false, abs_season, abs_episode) =>
68
+ //Sxx - xx
69
+ //Sx - xx
70
+ //Sx - x
71
+ //Season x - x
72
+ //Season x - xx
73
+ name?.includes(`s${s?.padStart(2, "0")} - ${e?.padStart(2, "0")}`) ||
74
+ name?.includes(`s${s} - ${e?.padStart(2, "0")}`) ||
75
+ // name?.includes(`s${s} - ${e}`) ||
76
+ // name?.includes(`season ${s} - ${e}`) ||
77
+ name?.includes(`season ${s} - ${e?.padStart(2, "0")}`) ||
78
+ name?.includes(`season ${s} - ${e?.padStart(2, "0")}`);
79
+
80
+ let containsAbsoluteE = (
81
+ name = "",
82
+ s,
83
+ e,
84
+ abs = false,
85
+ abs_season,
86
+ abs_episode
87
+ ) => {
88
+ //- xx
89
+ //- xxx
90
+ //- xxxx
91
+ //- 0x
92
+
93
+ return (
94
+ name?.includes(` ${abs_episode?.padStart(2, "0")} `) ||
95
+ name?.includes(` ${abs_episode?.padStart(3, "0")} `) ||
96
+ name?.includes(` 0${abs_episode} `) ||
97
+ name?.includes(` ${abs_episode?.padStart(4, "0")} `)
98
+ );
99
+ };
100
+
101
+ let containsAbsoluteE_ = (
102
+ name = "",
103
+ s,
104
+ e,
105
+ abs = false,
106
+ abs_season,
107
+ abs_episode
108
+ ) =>
109
+ // xx.
110
+ // xxx.
111
+ // xxxx.
112
+ // 0x.
113
+ name?.includes(` ${abs_episode?.padStart(2, "0")}.`) ||
114
+ name?.includes(` ${abs_episode?.padStart(3, "0")}.`) ||
115
+ name?.includes(` 0${abs_episode}.`) ||
116
+ name?.includes(` ${abs_episode?.padStart(4, "0")}.`);
117
+
118
+ let hosts = [];
119
+
120
+ const raw_content = require("fs").readFileSync("./servers.txt");
121
+ let content = Buffer.isBuffer(raw_content)
122
+ ? raw_content.toString()
123
+ : raw_content;
124
+ hosts = content
125
+ .split("\n")
126
+ .map((el) => el.trim())
127
+ .map((el) => {
128
+ if (!el.includes("|")) return null;
129
+ return {
130
+ host: el.split("|")[0],
131
+ apiKey: el.split("|").pop(),
132
+ };
133
+ });
134
+
135
+ hosts = hosts.filter((el) => !!el);
136
+
137
+ let fetchTorrent = async (query, type = "series") => {
138
+ let hostdata = hosts[Math.floor(Math.random() * hosts.length)];
139
+ if (!hostdata) return [];
140
+
141
+ let url = `${
142
+ hostdata.host
143
+ }/api/v2.0/indexers/abnormal/results/torznab/api?apikey=${hostdata.apiKey}&${
144
+ type == "movie" ? "t=movie" : "t=tvsearch"
145
+ }&${type == "movie" ? "cat=2000" : "cat=5000"}&q=${query}&cache=false`;
146
+
147
+ return await fetch(url, {
148
+ headers: {
149
+ accept: "*/*",
150
+ "accept-language": "en-US,en;q=0.9",
151
+ "x-requested-with": "XMLHttpRequest",
152
+ cookie:
153
+ "Jackett=CfDJ8AG_XUDhxS5AsRKz0FldsDJIHUJANrfynyi54VzmYuhr5Ha5Uaww2hSQytMR8fFWjPvDH2lKCzaQhRYI9RuK613PZxJWz2tgHqg1wUAcPTMfi8b_8rm1Igw1-sZB_MnimHHK7ZSP7HfkWicMDaJ4bFGZwUf0xJOwcgjrwcUcFzzsVSTALt97-ibhc7PUn97v5AICX2_jsd6khO8TZosaPFt0cXNgNofimAkr5l6yMUjShg7R3TpVtJ1KxD8_0_OyBjR1mwtcxofJam2aZeFqVRxluD5hnzdyxOWrMRLSGzMPMKiaPXNCsxWy_yQhZhE66U_bVFadrsEeQqqaWb3LIFA",
154
+ },
155
+ referrerPolicy: "no-referrer",
156
+ method: "GET",
157
+ })
158
+ .then(async (res) => {
159
+ try {
160
+ // return await res.json();
161
+ const parser = new XMLParser({ ignoreAttributes: false });
162
+ let jObj = parser.parse(await res.text());
163
+
164
+ let results =
165
+ "rss" in jObj &&
166
+ "channel" in jObj["rss"] &&
167
+ "item" in jObj["rss"]["channel"]
168
+ ? jObj["rss"]["channel"]["item"]
169
+ : [];
170
+
171
+ return results;
172
+ } catch (error) {
173
+ console.log({ error });
174
+ return [];
175
+ }
176
+ })
177
+ .then(async (results) => {
178
+ results = Array.isArray(results) ? results : [results];
179
+ console.log({ Initial: results?.length });
180
+ if (results.length != 0) {
181
+ // return [];
182
+ torrent_results = await Promise.all(
183
+ results.map((result) => {
184
+ let torznab_attr = {};
185
+ result["torznab:attr"]?.length
186
+ ? result["torznab:attr"]?.forEach((el) => {
187
+ torznab_attr[el["@_name"]] = el["@_value"];
188
+ })
189
+ : false;
190
+ return new Promise((resolve, reject) => {
191
+ resolve({
192
+ Tracker:
193
+ "#text" in result["jackettindexer"]
194
+ ? result["jackettindexer"]["#text"]
195
+ : "Torrent",
196
+ Title: result["title"],
197
+ Seeders: torznab_attr ? torznab_attr["seeders"] : "",
198
+ Peers: torznab_attr ? torznab_attr["peers"] : "",
199
+ Link: result["link"],
200
+ MagnetUri:
201
+ "@_url" in result["enclosure"]
202
+ ? result["enclosure"]["@_url"]
203
+ : null,
204
+ });
205
+ });
206
+ })
207
+ );
208
+ return torrent_results;
209
+ } else {
210
+ return [];
211
+ }
212
+ })
213
+ .catch((err) => {
214
+ return [];
215
+ });
216
+ };
217
+
218
+ let fetchTorrent2 = async (query, type = "series") => {
219
+ let hostdata = hosts[Math.floor(Math.random() * hosts.length)];
220
+ if (!hostdata) return [];
221
+
222
+ let url = `${hostdata.host}/api/v2.0/indexers/all/results?apikey=${hostdata.apiKey}&Query=${query}&Tracker%5B%5D=thepiratebay&Tracker%5B%5D=knaben&Tracker%5B%5D=therarbg&Category%5B%5D=2000&Category%5B%5D=5000&cache=false`;
223
+
224
+ const controller = new AbortController();
225
+ const TIMEOUT = +process.env.TIMEOUT ?? 5000;
226
+ const timeoutId = setTimeout(() => controller.abort(), TIMEOUT);
227
+
228
+ try {
229
+ return await fetch(url, {
230
+ headers: {
231
+ accept: "*/*",
232
+ "accept-language": "en-US,en;q=0.9",
233
+ "x-requested-with": "XMLHttpRequest",
234
+ },
235
+ referrerPolicy: "no-referrer",
236
+ method: "GET",
237
+ signal: controller.signal,
238
+ })
239
+ .then((res) => res.json())
240
+ .then(async (results) => {
241
+ console.log({ Initial: results["Results"]?.length });
242
+ if (results["Results"].length != 0) {
243
+ torrent_results = await Promise.all(
244
+ results["Results"].map((result) => {
245
+ return new Promise((resolve, reject) => {
246
+ resolve({
247
+ Tracker: result["Tracker"],
248
+ Category: result["CategoryDesc"],
249
+ Title: result["Title"],
250
+ Seeders: result["Seeders"],
251
+ Peers: result["Peers"],
252
+ Link: result["Link"],
253
+ MagnetUri: result["MagnetUri"],
254
+ });
255
+ });
256
+ })
257
+ );
258
+ clearTimeout(timeoutId);
259
+ return torrent_results;
260
+ } else {
261
+ clearTimeout(timeoutId);
262
+ return [];
263
+ }
264
+ })
265
+ .catch((err) => {
266
+ clearTimeout(timeoutId);
267
+ return [];
268
+ });
269
+ } catch (error) {
270
+ clearTimeout(timeoutId);
271
+ return [];
272
+ }
273
+ };
274
+
275
+ function getMeta(id, type) {
276
+ var [tt, s, e] = id.split(":");
277
+
278
+ return fetch(`https://v3-cinemeta.strem.io/meta/${type}/${tt}.json`)
279
+ .then((res) => res.json())
280
+ .then((json) => {
281
+ return {
282
+ name: json.meta["name"],
283
+ year: json.meta["releaseInfo"]?.substring(0, 4) ?? 0,
284
+ };
285
+ })
286
+ .catch((err) =>
287
+ fetch(`https://v2.sg.media-imdb.com/suggestion/t/${tt}.json`)
288
+ .then((res) => res.json())
289
+ .then((json) => {
290
+ return json.d[0];
291
+ })
292
+ .then(({ l, y }) => ({ name: l, year: y }))
293
+ );
294
+ }
295
+
296
+ async function getImdbFromKitsu(id) {
297
+ var [kitsu, _id, e] = id.split(":");
298
+
299
+ return fetch(`https://anime-kitsu.strem.fun/meta/anime/${kitsu}:${_id}.json`)
300
+ .then((_res) => _res.json())
301
+ .then((json) => {
302
+ return json["meta"];
303
+ })
304
+ .then((json) => {
305
+ try {
306
+ let imdb = json["imdb_id"];
307
+ let meta = json["videos"].find((el) => el.id == id);
308
+ return [
309
+ imdb,
310
+ (meta["imdbSeason"] ?? 1).toString(),
311
+ (meta["imdbEpisode"] ?? 1).toString(),
312
+ (meta["season"] ?? 1).toString(),
313
+ (meta["imdbSeason"] ?? 1).toString() == 1
314
+ ? (meta["imdbEpisode"] ?? 1).toString()
315
+ : (meta["episode"] ?? 1).toString(),
316
+ meta["imdbEpisode"] != meta["episode"] || meta["imdbSeason"] == 1,
317
+ ];
318
+ } catch (error) {
319
+ return null;
320
+ }
321
+ })
322
+ .catch((err) => null);
323
+ }
324
+
325
+ let isRedirect = async (url) => {
326
+ try {
327
+ const controller = new AbortController();
328
+ // 5 second timeout:
329
+ const timeoutId = setTimeout(() => controller.abort(), 6000);
330
+
331
+ const response = await fetch(url, {
332
+ redirect: "manual",
333
+ signal: controller.signal,
334
+ });
335
+
336
+ clearTimeout(timeoutId);
337
+
338
+ if (response.status === 301 || response.status === 302) {
339
+ const locationURL = new URL(
340
+ response.headers.get("location"),
341
+ response.url
342
+ );
343
+ if (response.headers.get("location").startsWith("http")) {
344
+ await isRedirect(locationURL);
345
+ } else {
346
+ return response.headers.get("location");
347
+ }
348
+ } else if (response.status >= 200 && response.status < 300) {
349
+ return response.url;
350
+ } else {
351
+ return response.url;
352
+ // return null;
353
+ }
354
+ } catch (error) {
355
+ // console.log({ error });
356
+ return null;
357
+ }
358
+ };
359
+
360
+ const getParsedFromMagnetorTorrentFile = async (tor, uri) => {
361
+ return new Promise(async (resolve, reject) => {
362
+ //follow redirection cause some http url sent magnet url
363
+ let realUrl = uri?.startsWith("magnet:?") ? uri : await isRedirect(uri);
364
+ realUrl = realUrl ?? null;
365
+
366
+ if (realUrl) {
367
+ let parsedTorrent = null;
368
+ if (realUrl?.startsWith("magnet:?")) {
369
+ parsedTorrent = parseTorrent(realUrl);
370
+ } else if (realUrl?.startsWith("http")) {
371
+ parsedTorrent = await new Promise((resolve, reject) => {
372
+ parseTorrent.remote(realUrl, (err, parsed) => {
373
+ if (!err) {
374
+ resolve(parsed);
375
+ } else {
376
+ // console.log({ err });
377
+ resolve(null);
378
+ }
379
+ });
380
+ });
381
+ } else {
382
+ console.log({ WhatTF: realUrl });
383
+ resolve(null);
384
+ }
385
+
386
+ if (!parsedTorrent?.infoHash) resolve(null);
387
+
388
+ if (!parsedTorrent?.files) {
389
+ console.log("no files");
390
+ if (!parsedTorrent?.files && realUrl.startsWith("magnet:?")) {
391
+ try {
392
+ let res = await new Promise((resolve, reject) => {
393
+ var engine = torrentStream(realUrl, {
394
+ connections: 40,
395
+ });
396
+ engine.on("ready", function () {
397
+ resolve(engine.files);
398
+ });
399
+ setTimeout(() => {
400
+ resolve([]);
401
+ }, 15000); //
402
+ });
403
+
404
+ if (res && res.length > 0) {
405
+ console.log("got no files but parsed");
406
+ }
407
+
408
+ parsedTorrent.files = [...res];
409
+ } catch (error) {
410
+ console.log("Done with that error");
411
+ }
412
+ }
413
+ } else {
414
+ console.log("got files directly");
415
+ }
416
+
417
+ if (!(parsedTorrent?.files && parsedTorrent?.files.length)) {
418
+ resolve(null);
419
+ }
420
+
421
+ resolve({ parsedTor: parsedTorrent, ...tor });
422
+ } else {
423
+ resolve(null);
424
+ }
425
+ });
426
+ };
427
+
428
+ const toStream = async (
429
+ tor,
430
+ type,
431
+ s,
432
+ e,
433
+ abs_season,
434
+ abs_episode,
435
+ abs,
436
+ max_element
437
+ ) => {
438
+ let parsed = tor?.parsedTor;
439
+ if (!parsed) return null;
440
+
441
+ const infoHash = parsed.infoHash.toLowerCase();
442
+ let title = tor.extraTag || parsed.name;
443
+ let index = -1;
444
+
445
+ if (!parsed.files) {
446
+ return null;
447
+ }
448
+
449
+ if (media == "series") {
450
+ index = (parsed?.files ?? []).findIndex((element, index) => {
451
+ if (!element["name"]) {
452
+ return false;
453
+ }
454
+
455
+ let name = element["name"].toLowerCase();
456
+
457
+ if (name.includes("live") || name.includes("ova")) {
458
+ return false;
459
+ }
460
+
461
+ return (
462
+ isVideo(element["name"] ?? "") &&
463
+ getFittedFile(name, s, e, abs, abs_season, abs_episode)
464
+ );
465
+ });
466
+
467
+ if (index == -1) {
468
+ return null;
469
+ }
470
+
471
+ title = !!title ? title + "\n" + parsed.files[index]["name"] : null;
472
+ } else if (media == "movie") {
473
+ index = (parsed?.files ?? []).findIndex((element, index) => {
474
+ return isVideo(element["name"] ?? "");
475
+ });
476
+ //
477
+ if (index == -1) {
478
+ return null;
479
+ }
480
+ }
481
+
482
+ // ======================== PM ================================
483
+
484
+ console.log("Trynna some PM");
485
+ let folderId = null;
486
+ let details = [];
487
+
488
+ let isCached = await checkCached(infoHash);
489
+ console.log({ isCached });
490
+ if (isCached) {
491
+ let cache = await getDirectDl(infoHash);
492
+ if (cache && cache.length) {
493
+ if (media == "series") {
494
+ index = (cache ?? []).findIndex((element, _) => {
495
+ element["name"] =
496
+ element["path"].toLowerCase()?.split("/")?.pop() ??
497
+ (isCached ?? "").toLowerCase();
498
+
499
+ if (!element["name"]) return false;
500
+
501
+ if (
502
+ // element["name"].match(/\W+movie\W+/) ||
503
+ element["name"].includes("live") ||
504
+ element["name"].includes("ova")
505
+ ) {
506
+ return false;
507
+ }
508
+
509
+ return (
510
+ isVideo(element["name"] ?? "") &&
511
+ getFittedFile(element["name"], s, e, abs, abs_season, abs_episode)
512
+ );
513
+ });
514
+
515
+ if (index == -1) {
516
+ return null;
517
+ }
518
+ } else if (media == "movie") {
519
+ index = (cache ?? []).findIndex((element, index) => {
520
+ element["name"] =
521
+ element["path"].toLowerCase() ?? (isCached ?? "").toLowerCase();
522
+ return isVideo(element["name"] ?? "");
523
+ });
524
+ if (index == -1) {
525
+ return null;
526
+ }
527
+ }
528
+ details = [cache[index]];
529
+ console.log(`Cached index: ${index}`);
530
+ }
531
+ } else {
532
+ let data = null;
533
+ data = await checkTorrentFileinPM(parsed.name);
534
+ if (data) {
535
+ if (data["type"] == "folder") {
536
+ folderId = data["id"];
537
+ if (folderId) {
538
+ details = await pmFolderDetails(folderId);
539
+ console.log({ status: details.length ? "found" : "nothing" });
540
+ }
541
+ } else if (data["type"] == "file") {
542
+ details = [data];
543
+ }
544
+ } else {
545
+ console.log("should add to pm");
546
+ // let addRes = null;
547
+ if (nbreAdded <= 5) {
548
+ let addRes = await addMagnetToPM(parseTorrent.toMagnetURI(parsed));
549
+ console.log({ added: !!addRes });
550
+ !!addRes ? nbreAdded++ : null;
551
+ folderId = !!addRes ? await pmFolderId(addRes ?? parsed["name"]) : null;
552
+ if (folderId) {
553
+ details = await pmFolderDetails(folderId);
554
+ console.log({ status: details.length ? "found2" : "nothing2" });
555
+ }
556
+ }
557
+ }
558
+ }
559
+
560
+ title = title ?? parsed.files[index]["name"];
561
+
562
+ title += "\n" + getQuality(title);
563
+
564
+ const subtitle = "S:" + tor["Seeders"] + " | P:" + tor["Peers"];
565
+ title += ` | ${
566
+ index == -1 || parsed.files == []
567
+ ? `${getSize(0)}`
568
+ : `${getSize(parsed.files[index]["length"] ?? 0)}`
569
+ } | ${subtitle}`;
570
+
571
+ if (
572
+ details.length > 0 &&
573
+ details[details.length > 1 ? index : 0]["stream_link"]
574
+ ) {
575
+ return {
576
+ name: `PM-${tor["Tracker"]}`,
577
+ url:
578
+ details[details.length > 1 ? index : 0]["link"] ??
579
+ details[details.length > 1 ? index : 0]["stream_link"],
580
+ title: title ?? details[details.length > 1 ? index : 0]["name"],
581
+ behaviorHints: {
582
+ bingeGroup: `Jackett-Addon|${infoHash}`,
583
+ },
584
+ };
585
+ }
586
+
587
+ if (process.env.PUBLIC == "1")
588
+ return {
589
+ name: `${tor["Tracker"]}`,
590
+ type: type,
591
+ infoHash: infoHash,
592
+ fileIdx: index == -1 ? 0 : index,
593
+ sources: (parsed.announce || [])
594
+ .map((x) => {
595
+ return "tracker:" + x;
596
+ })
597
+ .concat(["dht:" + infoHash]),
598
+ title: title + getFlagFromName(title),
599
+ behaviorHints: {
600
+ bingeGroup: `Jackett-Addon|${infoHash}`,
601
+ notWebReady: true,
602
+ },
603
+ };
604
+ };
605
+
606
+ const qualities = {
607
+ "4k": "🌟4k",
608
+ fhd: "🎥FHD",
609
+ hd: "📺HD",
610
+ sd: "📱SD",
611
+ unknown: "none",
612
+ };
613
+
614
+ const vf = ["vf", "vff", "french", "frn"];
615
+ const multi = ["multi"];
616
+ const vostfr = ["vostfr", "english", "eng"];
617
+
618
+ let isVideo = (str) => {
619
+ if (!str) return false;
620
+ let name = `${str}`.toLowerCase();
621
+ return (
622
+ name?.toLowerCase()?.includes(`.mkv`) ||
623
+ name?.toLowerCase()?.includes(`.mp4`) ||
624
+ name?.toLowerCase()?.includes(`.avi`) ||
625
+ name?.toLowerCase()?.includes(`.flv`)
626
+ );
627
+ };
628
+
629
+ function getSize(size) {
630
+ var gb = 1024 * 1024 * 1024;
631
+ var mb = 1024 * 1024;
632
+
633
+ return (
634
+ "💾 " +
635
+ (size / gb > 1
636
+ ? `${(size / gb).toFixed(2)} GB`
637
+ : `${(size / mb).toFixed(2)} MB`)
638
+ );
639
+ }
640
+
641
+ function getQuality(name) {
642
+ if (!name) {
643
+ return name;
644
+ }
645
+ name = name.toLowerCase();
646
+
647
+ if (["2160", "4k", "uhd"].filter((x) => name.includes(x)).length > 0)
648
+ return " " + qualities["4k"];
649
+ if (["1080", "fhd"].filter((x) => name.includes(x)).length > 0)
650
+ return " " + qualities.fhd;
651
+ if (["720", "hd"].filter((x) => name.includes(x)).length > 0)
652
+ return " " + qualities.hd;
653
+ if (["480p", "380p", "sd"].filter((x) => name.includes(x)).length > 0)
654
+ return " " + qualities.sd;
655
+ return "";
656
+ }
657
+
658
+ const isSomeContent = (file_name = "", langKeywordsArray = []) => {
659
+ file_name = file_name.toLowerCase();
660
+ return langKeywordsArray.some((word) => file_name.includes(word));
661
+ };
662
+
663
+ const isVfContent = (file_name) => isSomeContent(file_name, vf);
664
+ const isMultiContent = (file_name) => isSomeContent(file_name, multi);
665
+ const isVostfrContent = (file_name) => isSomeContent(file_name, vostfr);
666
+
667
+ const bringFrenchVideoToTheTopOfList = (streams = []) => {
668
+ streams.sort((a, b) => {
669
+ let a_lower = a.title.toLowerCase();
670
+ let b_lower = b.title.toLowerCase();
671
+ return isVfContent(a_lower) ||
672
+ isVostfrContent(a_lower) ||
673
+ isMultiContent(a_lower)
674
+ ? -1
675
+ : isVfContent(b_lower) ||
676
+ isVostfrContent(b_lower) ||
677
+ isMultiContent(a_lower)
678
+ ? 1
679
+ : 0;
680
+ });
681
+ return streams;
682
+ };
683
+
684
+ const filterBasedOnQuality = (streams = [], quality = "") => {
685
+ if (!quality) return [];
686
+ if (!Object.values(qualities).includes(quality)) return [];
687
+
688
+ if (quality == qualities.unknown) {
689
+ streams = streams.filter((el) => {
690
+ const l = `${el?.title}`;
691
+ return (
692
+ !l.includes(qualities["4k"]) &&
693
+ !l.includes(qualities.fhd) &&
694
+ !l.includes(qualities.hd) &&
695
+ !l.includes(qualities.sd)
696
+ );
697
+ });
698
+ } else {
699
+ streams = streams.filter((el) => el.title.includes(quality));
700
+ }
701
+ return bringFrenchVideoToTheTopOfList(streams);
702
+ };
703
+
704
+ const getFlagFromName = (file_name) => {
705
+ switch (true) {
706
+ case isVfContent(file_name):
707
+ return "| 🇫🇷";
708
+ case isMultiContent(file_name):
709
+ return "| 🌐";
710
+ case isVostfrContent(file_name):
711
+ return "| 🇬🇧";
712
+ default:
713
+ return "| 🏴󠁰󠁴󠀰󠀶󠁿";
714
+ }
715
+ };
716
+
717
+ let cleanName = (name = "") => {
718
+ return name.replace(/[^a-zA-Z0-9 ]/g, "").replace(/\s{2,}/g, " ");
719
+ };
720
+
721
+ let simplifiedName = (name = "") => {
722
+ name = name.includes("-") ? name.split("-")[0] : name;
723
+ name = name.includes(":") ? name.split(":")[0] : name;
724
+ name = name.trim();
725
+ console.log(cleanName(name));
726
+ return cleanName(name);
727
+ };
728
+
729
+ const getFittedFile = (name, s, e, abs = false, abs_season, abs_episode) => {
730
+ return (
731
+ containEandS(name, s, e, abs, abs_season, abs_episode) ||
732
+ containE_S(name, s, e, abs, abs_season, abs_episode) ||
733
+ (s == 1 &&
734
+ (containsAbsoluteE(name, s, e, true, s, e) ||
735
+ containsAbsoluteE_(name, s, e, true, s, e))) ||
736
+ (((abs && containsAbsoluteE(name, s, e, abs, abs_season, abs_episode)) ||
737
+ (abs && containsAbsoluteE_(name, s, e, abs, abs_season, abs_episode))) &&
738
+ !(
739
+ name?.includes("s0") ||
740
+ name?.includes(`s${abs_season}`) ||
741
+ name?.includes("e0") ||
742
+ name?.includes(`e${abs_episode}`) ||
743
+ name?.includes("season")
744
+ ))
745
+ );
746
+ };
747
+
748
+ module.exports = {
749
+ containEandS,
750
+ containE_S,
751
+ containsAbsoluteE,
752
+ containsAbsoluteE_,
753
+ fetchTorrent,
754
+ fetchTorrent2,
755
+ getMeta,
756
+ getImdbFromKitsu,
757
+ isRedirect,
758
+ getParsedFromMagnetorTorrentFile,
759
+ toStream,
760
+ isVideo,
761
+ getSize,
762
+ getQuality,
763
+ filterBasedOnQuality,
764
+ qualities,
765
+ bringFrenchVideoToTheTopOfList,
766
+ getFlagFromName,
767
+ cleanName,
768
+ simplifiedName,
769
+ getFittedFile,
770
+ };