@mtkruto/node 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +165 -0
- package/README.md +1 -0
- package/esm/_dnt.shims.js +68 -0
- package/esm/client/client.js +169 -0
- package/esm/client/client_abstract.js +51 -0
- package/esm/client/client_plain.js +112 -0
- package/esm/connection/connection.js +2 -0
- package/esm/connection/connection_web_socket.js +90 -0
- package/esm/constants.js +60 -0
- package/esm/deps/deno.land/std@0.186.0/fmt/colors.js +474 -0
- package/esm/deps/deno.land/std@0.186.0/testing/_diff.js +311 -0
- package/esm/deps/deno.land/std@0.186.0/testing/_format.js +23 -0
- package/esm/deps/deno.land/std@0.186.0/testing/asserts.js +633 -0
- package/esm/deps/deno.land/x/crc32@v0.2.0/mod.js +105 -0
- package/esm/deps/deno.land/x/tgcrypto@0.1.1/mod.js +68 -0
- package/esm/deps/deno.land/x/tgcrypto@0.1.1/tgcrypto.js +1127 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/gzip/gzip.js +239 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/utils/uint8.js +10 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/deflate.js +139 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/inflate.js +176 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/mod.js +2 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/adler32.js +19 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/crc32.js +25 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/deflate.js +1941 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/gzheader.js +85 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inffast.js +321 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inflate.js +1658 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inftrees.js +355 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/messages.js +11 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/status.js +42 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/trees.js +1107 -0
- package/esm/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/zstream.js +86 -0
- package/esm/deps.js +4 -0
- package/esm/mod.js +4 -0
- package/esm/package.json +3 -0
- package/esm/tl/0_tl_raw_reader.js +62 -0
- package/esm/tl/0_tl_raw_writer.js +60 -0
- package/esm/tl/1_tl_object.js +149 -0
- package/esm/tl/2_types.js +48220 -0
- package/esm/tl/3_functions.js +19856 -0
- package/esm/tl/3_tl_object_deserializer.js +72 -0
- package/esm/tl/3_tl_reader.js +16 -0
- package/esm/tl/3_tl_writer.js +7 -0
- package/esm/tl/4_rpc_result.js +27 -0
- package/esm/tl/5_message.js +54 -0
- package/esm/tl/6_message_container.js +35 -0
- package/esm/transport/transport.js +32 -0
- package/esm/transport/transport_intermediate.js +56 -0
- package/esm/transport/transport_provider.js +23 -0
- package/esm/types.js +1 -0
- package/esm/utilities/0_bigint.js +37 -0
- package/esm/utilities/0_buffer.js +33 -0
- package/esm/utilities/0_crypto.js +35 -0
- package/esm/utilities/0_hash.js +7 -0
- package/esm/utilities/1_auth.js +29 -0
- package/esm/utilities/1_message.js +94 -0
- package/esm/utilities/1_obfuscation.js +33 -0
- package/package.json +40 -0
- package/script/_dnt.shims.js +77 -0
- package/script/client/client.js +173 -0
- package/script/client/client_abstract.js +55 -0
- package/script/client/client_plain.js +116 -0
- package/script/connection/connection.js +6 -0
- package/script/connection/connection_web_socket.js +117 -0
- package/script/constants.js +63 -0
- package/script/deps/deno.land/std@0.186.0/fmt/colors.js +548 -0
- package/script/deps/deno.land/std@0.186.0/testing/_diff.js +317 -0
- package/script/deps/deno.land/std@0.186.0/testing/_format.js +50 -0
- package/script/deps/deno.land/std@0.186.0/testing/asserts.js +659 -0
- package/script/deps/deno.land/x/crc32@v0.2.0/mod.js +113 -0
- package/script/deps/deno.land/x/tgcrypto@0.1.1/mod.js +82 -0
- package/script/deps/deno.land/x/tgcrypto@0.1.1/tgcrypto.js +1152 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/gzip/gzip.js +271 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/utils/uint8.js +14 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/deflate.js +172 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/inflate.js +208 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/mod.js +18 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/adler32.js +22 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/crc32.js +30 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/deflate.js +1976 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/gzheader.js +88 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inffast.js +324 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inflate.js +1674 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inftrees.js +358 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/messages.js +14 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/status.js +44 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/trees.js +1115 -0
- package/script/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/zstream.js +89 -0
- package/script/deps.js +30 -0
- package/script/mod.js +32 -0
- package/script/package.json +3 -0
- package/script/tl/0_tl_raw_reader.js +66 -0
- package/script/tl/0_tl_raw_writer.js +64 -0
- package/script/tl/1_tl_object.js +156 -0
- package/script/tl/2_types.js +49824 -0
- package/script/tl/3_functions.js +20413 -0
- package/script/tl/3_tl_object_deserializer.js +76 -0
- package/script/tl/3_tl_reader.js +20 -0
- package/script/tl/3_tl_writer.js +11 -0
- package/script/tl/4_rpc_result.js +31 -0
- package/script/tl/5_message.js +58 -0
- package/script/tl/6_message_container.js +39 -0
- package/script/transport/transport.js +36 -0
- package/script/transport/transport_intermediate.js +60 -0
- package/script/transport/transport_provider.js +27 -0
- package/script/types.js +2 -0
- package/script/utilities/0_bigint.js +67 -0
- package/script/utilities/0_buffer.js +38 -0
- package/script/utilities/0_crypto.js +39 -0
- package/script/utilities/0_hash.js +35 -0
- package/script/utilities/1_auth.js +56 -0
- package/script/utilities/1_message.js +102 -0
- package/script/utilities/1_obfuscation.js +60 -0
- package/types/_dnt.shims.d.ts +10 -0
- package/types/client/client.d.ts +19 -0
- package/types/client/client_abstract.d.ts +20 -0
- package/types/client/client_plain.d.ts +10 -0
- package/types/connection/connection.d.ts +7 -0
- package/types/connection/connection_web_socket.d.ts +13 -0
- package/types/constants.d.ts +2 -0
- package/types/deps/deno.land/std@0.186.0/fmt/colors.d.ts +270 -0
- package/types/deps/deno.land/std@0.186.0/testing/_diff.d.ts +26 -0
- package/types/deps/deno.land/std@0.186.0/testing/_format.d.ts +1 -0
- package/types/deps/deno.land/std@0.186.0/testing/asserts.d.ts +284 -0
- package/types/deps/deno.land/x/crc32@v0.2.0/mod.d.ts +15 -0
- package/types/deps/deno.land/x/tgcrypto@0.1.1/mod.d.ts +47 -0
- package/types/deps/deno.land/x/tgcrypto@0.1.1/tgcrypto.d.ts +2 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/gzip/gzip.d.ts +16 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/utils/uint8.d.ts +1 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/deflate.d.ts +29 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/inflate.d.ts +23 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/mod.d.ts +2 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/adler32.d.ts +1 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/crc32.d.ts +2 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/deflate.d.ts +78 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/gzheader.d.ts +12 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inffast.d.ts +1 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inflate.d.ts +47 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/inftrees.d.ts +1 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/messages.d.ts +12 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/status.d.ts +30 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/trees.d.ts +5 -0
- package/types/deps/raw.githubusercontent.com/MTKruto/compress/master/zlib/zlib/zstream.d.ts +14 -0
- package/types/deps.d.ts +4 -0
- package/types/mod.d.ts +4 -0
- package/types/tl/0_tl_raw_reader.d.ts +13 -0
- package/types/tl/0_tl_raw_writer.d.ts +13 -0
- package/types/tl/1_tl_object.d.ts +36 -0
- package/types/tl/2_types.d.ts +14815 -0
- package/types/tl/3_functions.d.ts +6122 -0
- package/types/tl/3_tl_object_deserializer.d.ts +3 -0
- package/types/tl/3_tl_reader.d.ts +4 -0
- package/types/tl/3_tl_writer.d.ts +5 -0
- package/types/tl/4_rpc_result.d.ts +8 -0
- package/types/tl/5_message.d.ts +11 -0
- package/types/tl/6_message_container.d.ts +9 -0
- package/types/transport/transport.d.ts +15 -0
- package/types/transport/transport_intermediate.d.ts +11 -0
- package/types/transport/transport_provider.d.ts +12 -0
- package/types/types.d.ts +1 -0
- package/types/utilities/0_bigint.d.ts +4 -0
- package/types/utilities/0_buffer.d.ts +2 -0
- package/types/utilities/0_crypto.d.ts +8 -0
- package/types/utilities/0_hash.d.ts +2 -0
- package/types/utilities/1_auth.d.ts +1 -0
- package/types/utilities/1_message.d.ts +10 -0
- package/types/utilities/1_obfuscation.d.ts +6 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _Crc32Stream_crc32;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.uint8ArrayToHex = exports.hexToUint8Array = exports.numberToHex = exports.Crc32Stream = exports.crc32 = void 0;
|
|
16
|
+
function crc32(arr) {
|
|
17
|
+
if (typeof arr === "string") {
|
|
18
|
+
arr = new TextEncoder().encode(arr);
|
|
19
|
+
}
|
|
20
|
+
let crc = -1, i, j, l, temp, poly = 0xEDB88320;
|
|
21
|
+
for (i = 0, l = arr.length; i < l; i += 1) {
|
|
22
|
+
temp = (crc ^ arr[i]) & 0xff;
|
|
23
|
+
for (j = 0; j < 8; j += 1) {
|
|
24
|
+
if ((temp & 1) === 1) {
|
|
25
|
+
temp = (temp >>> 1) ^ poly;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
temp = (temp >>> 1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
crc = (crc >>> 8) ^ temp;
|
|
32
|
+
}
|
|
33
|
+
return numberToHex(crc ^ -1);
|
|
34
|
+
}
|
|
35
|
+
exports.crc32 = crc32;
|
|
36
|
+
class Crc32Stream {
|
|
37
|
+
constructor() {
|
|
38
|
+
Object.defineProperty(this, "bytes", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: []
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(this, "poly", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: 0xEDB88320
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(this, "crc", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
writable: true,
|
|
54
|
+
value: 0 ^ -1
|
|
55
|
+
});
|
|
56
|
+
Object.defineProperty(this, "encoder", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: new TextEncoder()
|
|
61
|
+
});
|
|
62
|
+
_Crc32Stream_crc32.set(this, "");
|
|
63
|
+
this.reset();
|
|
64
|
+
}
|
|
65
|
+
get crc32() {
|
|
66
|
+
return __classPrivateFieldGet(this, _Crc32Stream_crc32, "f");
|
|
67
|
+
}
|
|
68
|
+
reset() {
|
|
69
|
+
__classPrivateFieldSet(this, _Crc32Stream_crc32, "", "f");
|
|
70
|
+
this.crc = 0 ^ -1;
|
|
71
|
+
for (let n = 0; n < 256; n += 1) {
|
|
72
|
+
let c = n;
|
|
73
|
+
for (let k = 0; k < 8; k += 1) {
|
|
74
|
+
if (c & 1) {
|
|
75
|
+
c = this.poly ^ (c >>> 1);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
c = c >>> 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
this.bytes[n] = c >>> 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
append(arr) {
|
|
85
|
+
if (typeof arr === "string") {
|
|
86
|
+
arr = this.encoder.encode(arr);
|
|
87
|
+
}
|
|
88
|
+
let crc = this.crc;
|
|
89
|
+
for (let i = 0, l = arr.length; i < l; i += 1) {
|
|
90
|
+
crc = (crc >>> 8) ^ this.bytes[(crc ^ arr[i]) & 0xff];
|
|
91
|
+
}
|
|
92
|
+
this.crc = crc;
|
|
93
|
+
__classPrivateFieldSet(this, _Crc32Stream_crc32, numberToHex(crc ^ -1), "f");
|
|
94
|
+
return __classPrivateFieldGet(this, _Crc32Stream_crc32, "f");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.Crc32Stream = Crc32Stream;
|
|
98
|
+
_Crc32Stream_crc32 = new WeakMap();
|
|
99
|
+
function numberToHex(n) {
|
|
100
|
+
return (n >>> 0).toString(16);
|
|
101
|
+
}
|
|
102
|
+
exports.numberToHex = numberToHex;
|
|
103
|
+
function hexToUint8Array(str) {
|
|
104
|
+
if (str.length === 0 || str.length % 2 !== 0) {
|
|
105
|
+
throw new Error(`The string "${str}" is not valid hex.`);
|
|
106
|
+
}
|
|
107
|
+
return new Uint8Array(str.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
108
|
+
}
|
|
109
|
+
exports.hexToUint8Array = hexToUint8Array;
|
|
110
|
+
function uint8ArrayToHex(bytes) {
|
|
111
|
+
return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
|
|
112
|
+
}
|
|
113
|
+
exports.uint8ArrayToHex = uint8ArrayToHex;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.factorize = exports.cbc256Decrypt = exports.cbc256Encrypt = exports.ctr256Decrypt = exports.ctr256Encrypt = exports.ige256Decrypt = exports.ige256Encrypt = exports.init = void 0;
|
|
7
|
+
const tgcrypto_js_1 = __importDefault(require("./tgcrypto.js"));
|
|
8
|
+
// deno-lint-ignore no-explicit-any
|
|
9
|
+
let module_;
|
|
10
|
+
const promise = (0, tgcrypto_js_1.default)().then((v) => module_ = v);
|
|
11
|
+
async function init() {
|
|
12
|
+
await promise;
|
|
13
|
+
}
|
|
14
|
+
exports.init = init;
|
|
15
|
+
/**
|
|
16
|
+
* Performs IGE-256 encryption.
|
|
17
|
+
*
|
|
18
|
+
* @param data The unencrypted data, larger than a byte, divisible by 16
|
|
19
|
+
* @param key 32-byte encryption key
|
|
20
|
+
* @param iv 32-byte initialization vector
|
|
21
|
+
*/
|
|
22
|
+
function ige256Encrypt(data, key, iv) {
|
|
23
|
+
return module_.ige256Encrypt(data, key, iv);
|
|
24
|
+
}
|
|
25
|
+
exports.ige256Encrypt = ige256Encrypt;
|
|
26
|
+
/**
|
|
27
|
+
* Performs IGE-256 decryption.
|
|
28
|
+
*
|
|
29
|
+
* @param data The encrypted data, larger than a byte, divisible by 16
|
|
30
|
+
* @param key 32-byte encryption key
|
|
31
|
+
* @param iv 32-byte initialization vector
|
|
32
|
+
*/
|
|
33
|
+
function ige256Decrypt(data, key, iv) {
|
|
34
|
+
return module_.ige256Decrypt(data, key, iv);
|
|
35
|
+
}
|
|
36
|
+
exports.ige256Decrypt = ige256Decrypt;
|
|
37
|
+
/**
|
|
38
|
+
* Performs CTR-256 encryption.
|
|
39
|
+
*
|
|
40
|
+
* @param data The data, larger than a byte
|
|
41
|
+
* @param key 32-byte encryption key
|
|
42
|
+
* @param iv 16-byte initialization vector
|
|
43
|
+
* @param state 1-byte state
|
|
44
|
+
*/
|
|
45
|
+
function ctr256Encrypt(data, key, iv, state) {
|
|
46
|
+
return module_.ctr256Encrypt(data, key, iv, state);
|
|
47
|
+
}
|
|
48
|
+
exports.ctr256Encrypt = ctr256Encrypt;
|
|
49
|
+
/**
|
|
50
|
+
* Alias of `ctr256Encrypt`
|
|
51
|
+
*/
|
|
52
|
+
function ctr256Decrypt(data, key, iv, state) {
|
|
53
|
+
return module_.ctr256Decrypt(data, key, iv, state);
|
|
54
|
+
}
|
|
55
|
+
exports.ctr256Decrypt = ctr256Decrypt;
|
|
56
|
+
/**
|
|
57
|
+
* Performs CBC-256 encryption.
|
|
58
|
+
*
|
|
59
|
+
* @param data The unencrypted data, larger than a byte, divisible by 16
|
|
60
|
+
* @param key 32-byte encryption key
|
|
61
|
+
* @param iv 16-byte initialization vector
|
|
62
|
+
*/
|
|
63
|
+
function cbc256Encrypt(data, key, iv) {
|
|
64
|
+
return module_.cbc256Encrypt(data, key, iv);
|
|
65
|
+
}
|
|
66
|
+
exports.cbc256Encrypt = cbc256Encrypt;
|
|
67
|
+
/**
|
|
68
|
+
* Performs CBC-256 decryption.
|
|
69
|
+
*
|
|
70
|
+
* @param data The encrypted data, larger than a byte, divisible by 16
|
|
71
|
+
* @param key 32-byte encryption key
|
|
72
|
+
* @param iv 16-byte initialization vector
|
|
73
|
+
*/
|
|
74
|
+
function cbc256Decrypt(data, key, iv) {
|
|
75
|
+
return module_.cbc256Decrypt(data, key, iv);
|
|
76
|
+
}
|
|
77
|
+
exports.cbc256Decrypt = cbc256Decrypt;
|
|
78
|
+
function factorize(pq) {
|
|
79
|
+
const vector = module_.factorize(pq);
|
|
80
|
+
return [vector.get(0), vector.get(1)];
|
|
81
|
+
}
|
|
82
|
+
exports.factorize = factorize;
|