Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ad1080133 | ||
|
|
4717619f76 | ||
|
|
7f761b5b9e | ||
|
|
7334e6ab19 | ||
|
|
137b499538 | ||
|
|
3acd1eaecc | ||
|
|
435cf91ec7 | ||
|
|
6e451f58b8 | ||
|
|
7a9f291df9 | ||
|
|
9dfce63e55 | ||
|
|
139a246436 | ||
|
|
343cc2b7b2 | ||
|
|
0375e0064b | ||
|
|
57e35f836e | ||
|
|
685757b04b | ||
|
|
210a312fbf | ||
|
|
c366ee20b8 | ||
|
|
b9baacac3a | ||
|
|
45fea0e790 | ||
|
|
cded6f80f6 | ||
|
|
9c1bee300d | ||
|
|
ef4cda2cc6 | ||
|
|
d315dd6684 | ||
|
|
8a5891ede2 | ||
|
|
bce81f304e | ||
|
|
3971fc9b4e | ||
|
|
4edbd507e5 | ||
|
|
b162582e66 | ||
|
|
be32695e16 | ||
|
|
9893338020 | ||
|
|
cfdec9ff90 | ||
|
|
ce6139e604 | ||
|
|
a23354f018 | ||
|
|
41fd563144 | ||
|
|
9bcecd4e2e | ||
|
|
e48b15e859 | ||
|
|
a732952677 | ||
|
|
b60ab119b2 | ||
|
|
381d3e1444 | ||
|
|
b97eaf2c52 | ||
|
|
513847fd80 | ||
|
|
7b2500bfd6 | ||
|
|
882d5a86d3 | ||
|
|
235982362c | ||
|
|
30b88113a8 | ||
|
|
994895af6d | ||
|
|
a61ba2e140 | ||
|
|
a5a03c40f2 | ||
|
|
83fe87d012 | ||
|
|
3713d282d8 | ||
|
|
8aa65d06f5 | ||
|
|
fd97fead60 | ||
|
|
453da35f51 | ||
|
|
d254d69ee2 | ||
|
|
ff19ba8e33 | ||
|
|
fcde7be62a | ||
|
|
45b4429712 | ||
|
|
9942dc384d | ||
|
|
56f9d423fe | ||
|
|
716a8d5926 | ||
|
|
9593cb0cc8 | ||
|
|
7ed7505ce4 | ||
|
|
6ff4ae7194 | ||
|
|
9e863d0377 | ||
|
|
13d4ab6f8d | ||
|
|
0d7ecd9129 | ||
|
|
dd096c2e8b | ||
|
|
0decd77253 | ||
|
|
2bfe74490a | ||
|
|
0fe59df2e9 | ||
|
|
a3ce881897 | ||
|
|
58c50f08db | ||
|
|
984e027c87 | ||
|
|
b853aa4929 | ||
|
|
4fd630ec5c | ||
|
|
ec96c40fde | ||
|
|
cf8fa10205 | ||
|
|
d8d9d904b5 | ||
|
|
4a13813941 | ||
|
|
cd7911a3d4 | ||
|
|
3625a2278d | ||
|
|
7d108999ff | ||
|
|
e3dc36c123 | ||
|
|
11541be4ae | ||
|
|
ceffb35445 | ||
|
|
e1957ae6aa | ||
|
|
5a05db727c | ||
|
|
1f692ed047 | ||
|
|
c3eea02855 | ||
|
|
c6d66d7b0d | ||
|
|
9c0ce1d742 | ||
|
|
ac7db87fd0 | ||
|
|
8b3b7535c6 | ||
|
|
c8b500c182 | ||
|
|
24feaabd9a | ||
|
|
8c980bc30d | ||
|
|
6f21385cd8 | ||
|
|
83f9d59d91 | ||
|
|
2cee66909b | ||
|
|
da8151b1b5 | ||
|
|
a3cb34fbf1 | ||
|
|
9a1162d7f2 | ||
|
|
591b09a62b | ||
|
|
f6f3e78e2c | ||
|
|
048b10ebf6 | ||
|
|
c882dcc353 | ||
|
|
82897ed56c | ||
|
|
cd06786d16 | ||
|
|
74d91a6bdd | ||
|
|
4a1ebbfb56 | ||
|
|
86c9b3f92c | ||
|
|
4fbd1adaa9 | ||
|
|
004ea61b83 | ||
|
|
9be57f72f0 | ||
|
|
e5ee76ded4 | ||
|
|
87f21f14a1 | ||
|
|
ef16811268 | ||
|
|
989f5873f5 | ||
|
|
307744be66 | ||
|
|
768539a57c | ||
|
|
22c4197a1d | ||
|
|
d4b75e4909 | ||
|
|
4b5de031ea | ||
|
|
b66b0aae18 | ||
|
|
36a1c5b922 | ||
|
|
63f711e634 | ||
|
|
516903e29e | ||
|
|
5cf9423699 | ||
|
|
dbb2320e83 | ||
|
|
0cb6138cd0 | ||
|
|
bf21097430 | ||
|
|
55d6daf8ee | ||
|
|
6e1e63e666 | ||
|
|
b27d5bb08d | ||
|
|
e63831febc | ||
|
|
4ab79c908a | ||
|
|
b85083c3e8 | ||
|
|
97f592ce8b | ||
|
|
70da707569 | ||
|
|
63f24be2b9 | ||
|
|
0d6be9e03e | ||
|
|
3cbb21a966 | ||
|
|
1fd7348938 | ||
|
|
ae32893732 | ||
|
|
4f82cf26f0 | ||
|
|
b67b65cd1e | ||
|
|
0eeec13653 | ||
|
|
5d1f744282 | ||
|
|
387d5b056d | ||
|
|
cbf7419601 | ||
|
|
5c1a4a7d01 | ||
|
|
cbc6d7ce32 | ||
|
|
b80832ac4c | ||
|
|
3716aad202 | ||
|
|
efbd542964 | ||
|
|
888070830d | ||
|
|
9905e2aa1d | ||
|
|
a59af6606b | ||
|
|
d1213e5656 | ||
|
|
0e14798d69 | ||
|
|
c8ab687fa0 | ||
|
|
e5f5c2baf2 | ||
|
|
2f861602c8 | ||
|
|
4f0cc01485 | ||
|
|
dd41ab38bb | ||
|
|
255cb5de3a | ||
|
|
b44a11c42e | ||
|
|
90b2f0e6a1 | ||
|
|
811aa9c413 | ||
|
|
842c7132ec | ||
|
|
efb67edc36 | ||
|
|
ed7741e006 | ||
|
|
cfe936a0b4 | ||
|
|
4ddf91dbbe | ||
|
|
59be054ca1 | ||
|
|
b794dc017d | ||
|
|
4443ed69c7 | ||
|
|
ab9b84898e | ||
|
|
a41e183b88 | ||
|
|
949239dbdc | ||
|
|
421ccc5695 | ||
|
|
5d68ed6e5e | ||
|
|
021f8c1ba0 | ||
|
|
f456b14b3f | ||
|
|
7a1ef19146 | ||
|
|
b9cbdf6a0d | ||
|
|
7639131c12 | ||
|
|
289b4eeb23 | ||
|
|
404a285eaf | ||
|
|
b20fe80f9b | ||
|
|
ff9814a40d | ||
|
|
855964fbe1 | ||
|
|
606c68dd0c | ||
|
|
735dfb4710 | ||
|
|
ab69bfbb32 | ||
|
|
70771430b5 | ||
|
|
6741e92cc6 | ||
|
|
31ce5c1826 | ||
|
|
1f113b1d29 | ||
|
|
41f6ee4f6d | ||
|
|
6e546c0f30 | ||
|
|
7cae8e51ca | ||
|
|
bf4dd7de60 | ||
|
|
ff6ef1b63a | ||
|
|
34034b849f | ||
|
|
f2d8709dd8 | ||
|
|
e137530581 | ||
|
|
be7788dda6 | ||
|
|
7c471f5389 | ||
|
|
9e62c8692f | ||
|
|
18fb134910 | ||
|
|
454fd4bfb1 | ||
|
|
131e6ff949 | ||
|
|
c51fa238ff | ||
|
|
2e3f9e7094 | ||
|
|
76a3dbf883 | ||
|
|
07cf029497 | ||
|
|
c8017345f1 | ||
|
|
0d2cc7489e | ||
|
|
f3a37a9522 | ||
|
|
6a71717751 | ||
|
|
dc822787d0 | ||
|
|
5011e629b1 | ||
|
|
bc35f28f51 | ||
|
|
97feb64e94 | ||
|
|
94bbc4e09d | ||
|
|
ad7d2262ec | ||
|
|
1114977a21 | ||
|
|
a8c5b159a9 | ||
|
|
a91e0e234a | ||
|
|
af5b3f704e | ||
|
|
45c9763092 | ||
|
|
db8ba17147 | ||
|
|
1972bf4bb3 | ||
|
|
62cf0936dc | ||
|
|
a9d6686e14 | ||
|
|
99aa142cef | ||
|
|
f8f1355155 | ||
|
|
ae28814041 | ||
|
|
183fd2fe79 | ||
|
|
8324462b32 | ||
|
|
93e5996422 | ||
|
|
f089b997c0 | ||
|
|
51d2064061 | ||
|
|
712b91a971 | ||
|
|
cbe6c64a92 | ||
|
|
64ed8309a1 | ||
|
|
b5ba9ae771 | ||
|
|
18f6556061 | ||
|
|
1dbe7b3a8c | ||
|
|
6dc49b7d01 | ||
|
|
987be07a70 | ||
|
|
760837e5cb | ||
|
|
dc759a93bc | ||
|
|
1ec7b91a98 | ||
|
|
c218eebb24 | ||
|
|
8040e3de4a | ||
|
|
ff400bfcdc | ||
|
|
35ea593806 | ||
|
|
f02903a6df | ||
|
|
182426dd0f | ||
|
|
d0f45fee25 | ||
|
|
1462b30c88 | ||
|
|
c302bc9f17 | ||
|
|
01d841fec6 | ||
|
|
1124f1fc7f | ||
|
|
cab097c09c | ||
|
|
43adf0ef70 | ||
|
|
3c6cab1491 | ||
|
|
5550bfd90b | ||
|
|
04ccb638b4 | ||
|
|
5c05471993 | ||
|
|
1e32d26a85 | ||
|
|
6105975308 | ||
|
|
cd24f7a26c | ||
|
|
2ac5a8da49 | ||
|
|
e849629533 | ||
|
|
983af8fac2 | ||
|
|
74a6dfb197 | ||
|
|
73e0db1912 | ||
|
|
62d6c242fc | ||
|
|
e7b4e002f4 | ||
|
|
d190bc0531 | ||
|
|
fb1d902804 | ||
|
|
12cd6ea0e4 | ||
|
|
69ebb3e53e | ||
|
|
f2fe8ca08b | ||
|
|
bbac1801e5 | ||
|
|
a6a4bf0817 | ||
|
|
9ade1f0a5d | ||
|
|
f8fbdf31fa | ||
|
|
e8666cafc9 | ||
|
|
db95442af6 | ||
|
|
fc2af1d806 | ||
|
|
106704b5d8 | ||
|
|
a0f390ef54 | ||
|
|
af375eadb4 | ||
|
|
098a3d0804 | ||
|
|
3bdc069f19 | ||
|
|
3313716c87 | ||
|
|
735ffdd2ce | ||
|
|
8588199fdb | ||
|
|
f726c1fd0d | ||
|
|
e60704255f | ||
|
|
aeae40e110 | ||
|
|
08af2ebeea | ||
|
|
0202659c38 | ||
|
|
edadb6e0f1 | ||
|
|
39abf8aecf | ||
|
|
65b6901170 | ||
|
|
14725d0b0d | ||
|
|
c41a4b5168 | ||
|
|
d61aa6e470 | ||
|
|
544fa67851 | ||
|
|
6a48022a45 | ||
|
|
a4ee723665 | ||
|
|
dc59f33ccf | ||
|
|
ec156f62e1 | ||
|
|
833d814499 | ||
|
|
327b16ac2e | ||
|
|
a3958a1cba | ||
|
|
7c8b64aaf1 | ||
|
|
b13826441c | ||
|
|
0bdf1e8265 | ||
|
|
5506af5322 | ||
|
|
6439aca1d8 | ||
|
|
65850c1c20 | ||
|
|
963db4d2fd | ||
|
|
5c061195c0 | ||
|
|
0104e4214e | ||
|
|
baaf61b3a3 | ||
|
|
9feb10efc5 | ||
|
|
58f3793cd4 | ||
|
|
93715c455d | ||
|
|
b9976c3d17 | ||
|
|
069b489fb6 | ||
|
|
fe53e1a091 | ||
|
|
e6c6e0766a | ||
|
|
2c065b66be | ||
|
|
1dce76dbbb | ||
|
|
9c62a817d0 | ||
|
|
3a3f3db56e | ||
|
|
bd55ce841e | ||
|
|
6c54c6cded | ||
|
|
c12394a687 | ||
|
|
2e23dd34e0 | ||
|
|
8225b94d34 | ||
|
|
4db4fcb40a | ||
|
|
177edfa66e | ||
|
|
d454a50a84 | ||
|
|
7358890a31 | ||
|
|
4c6f18c36f | ||
|
|
70747e84a1 | ||
|
|
8f1a629b48 | ||
|
|
b87fe53b94 | ||
|
|
a22b5c0faa | ||
|
|
92e85e0ce5 | ||
|
|
038260b92a | ||
|
|
d17c08a32f | ||
|
|
c1f18c33cc | ||
|
|
1cceda6052 | ||
|
|
3e734fab79 | ||
|
|
c41b35ae9c | ||
|
|
e478918ea7 | ||
|
|
3798b28aa2 | ||
|
|
e539a59e26 | ||
|
|
027bc9535e | ||
|
|
8d41c4c603 | ||
|
|
7e0a484000 | ||
|
|
14498104fc | ||
|
|
e1c99b28f0 | ||
|
|
45c6008b27 | ||
|
|
a74f7ba196 | ||
|
|
fba4f5f261 | ||
|
|
bce0cce74d | ||
|
|
c2d78e57d0 | ||
|
|
46f35064e3 | ||
|
|
8f263fb987 | ||
|
|
f56f4520d0 | ||
|
|
a13562bf45 | ||
|
|
067acd8803 | ||
|
|
df02dacdc4 | ||
|
|
4e6b089216 | ||
|
|
01c95168f2 | ||
|
|
f3ecbea3e8 | ||
|
|
11aa193074 | ||
|
|
2ebc5d904d | ||
|
|
bb8e06592c | ||
|
|
d85d353772 | ||
|
|
a9d3e61794 | ||
|
|
16abf71b78 | ||
|
|
421a885acd | ||
|
|
d62e4e25b7 | ||
|
|
ec9f2702eb | ||
|
|
f554f53bda | ||
|
|
49565c2fcf | ||
|
|
a338def801 | ||
|
|
a9a1d37a1e | ||
|
|
e55a234b53 | ||
|
|
4e20b48aa0 | ||
|
|
616958e2c6 | ||
|
|
e4726192f1 | ||
|
|
4f59363331 | ||
|
|
73686e66c6 | ||
|
|
b97cedcf5b | ||
|
|
d981a9fe6c | ||
|
|
903ec3c910 | ||
|
|
eb6ff003da | ||
|
|
6e3cd2cb23 | ||
|
|
ec8593fe46 | ||
|
|
891fbd6b80 | ||
|
|
39fcbe61c0 | ||
|
|
e4abd4dd8a | ||
|
|
78a63d4860 | ||
|
|
47df04976c | ||
|
|
d33c340de5 | ||
|
|
57a9948e8d | ||
|
|
ec17fb9179 | ||
|
|
682eb2f861 | ||
|
|
a9f69965fe | ||
|
|
1f79860aaf | ||
|
|
5133f25fb7 | ||
|
|
cfd00529eb | ||
|
|
a9b7ef5dc3 | ||
|
|
90c8c85c09 | ||
|
|
9f8098c55b | ||
|
|
b8f2832ed4 | ||
|
|
2f5029205d | ||
|
|
0645fe582f | ||
|
|
9c4ef2fd86 | ||
|
|
8d5ed6fc75 | ||
|
|
1b48f2cd6d | ||
|
|
15dd1e6bec | ||
|
|
b4b4456225 | ||
|
|
b89f9666e6 | ||
|
|
2253e666e7 | ||
|
|
777603b5cd | ||
|
|
0379ef7bc7 | ||
|
|
b1beee3595 | ||
|
|
83921c0b26 | ||
|
|
0f04f9fbb4 | ||
|
|
abfa58fca9 | ||
|
|
4588d15738 | ||
|
|
307dd0fd68 | ||
|
|
53e1f83bb5 | ||
|
|
70236f6818 | ||
|
|
78d734117b | ||
|
|
f48da12c16 | ||
|
|
3fa4b4941f | ||
|
|
222c42f7ea | ||
|
|
34eb08952c | ||
|
|
e9b55930d8 | ||
|
|
1e9fb8696a | ||
|
|
5888cd7938 | ||
|
|
0e870d106f | ||
|
|
8d3bdad7e4 | ||
|
|
f02ead309b | ||
|
|
80f13792a3 | ||
|
|
691f8a7567 | ||
|
|
81b4d8fe9c | ||
|
|
23bd60a733 | ||
|
|
85c02f10bf | ||
|
|
70489e5035 | ||
|
|
46f684621c | ||
|
|
adcbb1ae3f | ||
|
|
a7101b5bcb | ||
|
|
1e41b11319 | ||
|
|
cc80114748 | ||
|
|
5a147f201f | ||
|
|
2a187a26e0 | ||
|
|
2311d7d66b | ||
|
|
bbc9a010b9 | ||
|
|
b75f52734d | ||
|
|
a19b05f813 | ||
|
|
b7c0ca11fe | ||
|
|
e49d844284 | ||
|
|
d0ef868215 | ||
|
|
a36a17928d | ||
|
|
50ed83ca64 | ||
|
|
c46304c716 | ||
|
|
be18507df6 | ||
|
|
f6da87f3b4 | ||
|
|
248fbccfd9 | ||
|
|
eac14a149f | ||
|
|
d90f48b210 | ||
|
|
eb1110e3f5 | ||
|
|
82e7fe5a1b | ||
|
|
1bf084921e | ||
|
|
25972d1e06 | ||
|
|
b3c8923709 | ||
|
|
13d1020308 | ||
|
|
b98f10625f | ||
|
|
09605dba16 | ||
|
|
1509f88dbf | ||
|
|
884c7c631d | ||
|
|
b66578a4ca | ||
|
|
b0b6c8d878 | ||
|
|
9f1f86c316 | ||
|
|
80a1c2bd50 | ||
|
|
09139cc350 | ||
|
|
019eb30b68 | ||
|
|
58f80c404f | ||
|
|
22f860536d | ||
|
|
e9ec1bda3d | ||
|
|
9a743ef301 | ||
|
|
0de2d3846a | ||
|
|
a490051dda | ||
|
|
edc80acd4d | ||
|
|
0dd9b8d025 | ||
|
|
e20d2caa0e | ||
|
|
6b98d0999b | ||
|
|
a846e8c08d | ||
|
|
c332aeb51f | ||
|
|
bb830eb1ae | ||
|
|
57c4571204 | ||
|
|
6580cdec6b | ||
|
|
49b1b381a1 | ||
|
|
e8b787d057 | ||
|
|
6d1064fc01 | ||
|
|
5ca15cfe3b | ||
|
|
17964a517c | ||
|
|
8cb7a9dabe | ||
|
|
0819759814 | ||
|
|
ecc1055c10 | ||
|
|
490e46ce0c | ||
|
|
bc3984a0bf | ||
|
|
ac1023dac6 | ||
|
|
72d946e089 | ||
|
|
478c054075 | ||
|
|
ef5beb6706 | ||
|
|
f65aeba684 | ||
|
|
4d16c5e9e8 | ||
|
|
cf2116ff6a | ||
|
|
8c4e6b0e5b | ||
|
|
2660e0ecff | ||
|
|
f24a94b341 | ||
|
|
5dc38008f3 | ||
|
|
98d25607a9 | ||
|
|
55f885809e | ||
|
|
37a1220ee7 | ||
|
|
9518d20c4e | ||
|
|
5dc57a1305 | ||
|
|
b4e52b2334 | ||
|
|
0d65cb3f69 | ||
|
|
ae957ecb3e | ||
|
|
d03f5b0c2a | ||
|
|
0f7365999f | ||
|
|
e5d57b08c8 | ||
|
|
83ef7668be | ||
|
|
aaf0991195 | ||
|
|
399779692d | ||
|
|
8263b5f0ba | ||
|
|
c1d20afc64 | ||
|
|
da604ff69c | ||
|
|
eeda380b67 | ||
|
|
9c5aaed441 | ||
|
|
9f85790ad1 | ||
|
|
41c2c07a74 | ||
|
|
80450450e9 | ||
|
|
c9b672e0c6 | ||
|
|
8830820821 | ||
|
|
e39d10e12f | ||
|
|
6fec430e32 | ||
|
|
d81e304ce7 | ||
|
|
052dc15d55 | ||
|
|
8d54735321 | ||
|
|
31cc0c30c1 | ||
|
|
510de73996 | ||
|
|
2547858efb | ||
|
|
4c4684295e | ||
|
|
47a50acc55 | ||
|
|
616f0f9d36 | ||
|
|
981da3d9e6 | ||
|
|
4f144dc6eb | ||
|
|
6822070222 | ||
|
|
51de968fde | ||
|
|
f12eb5367b | ||
|
|
007410995a | ||
|
|
3638eb2d4f | ||
|
|
0c81ec7e95 | ||
|
|
bc424b2f37 | ||
|
|
0b90feab1e | ||
|
|
18b86a1cbc | ||
|
|
b798463d27 | ||
|
|
2865d935b6 | ||
|
|
fc7cf6b917 | ||
|
|
a6899c74d8 | ||
|
|
935e972348 | ||
|
|
1877e7019d | ||
|
|
923bb05b8d | ||
|
|
354b857bbe | ||
|
|
e18416a636 | ||
|
|
b0020fc0ac | ||
|
|
c90c24cecf | ||
|
|
0637191d77 | ||
|
|
95de0e83b9 | ||
|
|
9c4ff54f22 | ||
|
|
8478aa7a51 | ||
|
|
dbec3a32f8 | ||
|
|
b7438d57cf | ||
|
|
4b46a777d7 | ||
|
|
3921457bf3 | ||
|
|
86653f70a8 | ||
|
|
b96286be51 | ||
|
|
05cbe41d39 | ||
|
|
54f616623a | ||
|
|
6cefa13a4e | ||
|
|
e262ba473e | ||
|
|
280a100c12 | ||
|
|
d9e9fa3ff7 | ||
|
|
aaa7e91855 | ||
|
|
3d9aefbb2d | ||
|
|
e2910ca5c8 | ||
|
|
36a155dd1a | ||
|
|
8cb410bd9c | ||
|
|
79cdaa8d3b | ||
|
|
1dbcf70cee | ||
|
|
29143baa3a | ||
|
|
11c9dd3288 | ||
|
|
9a8916ff77 | ||
|
|
cb7c6151e8 | ||
|
|
aa5a9911de | ||
|
|
d7f6f96ba6 | ||
|
|
2fbc0be98d | ||
|
|
664c0f0f77 | ||
|
|
0ca1318284 | ||
|
|
f2befc0c06 | ||
|
|
6c3af6e19a | ||
|
|
d81df46453 | ||
|
|
a90493a9af | ||
|
|
5c81fe6cdc | ||
|
|
59759c718b | ||
|
|
700a10f3f4 | ||
|
|
8ece306dbe | ||
|
|
a27a4e627e | ||
|
|
2fc723b3ac | ||
|
|
1586363b2e | ||
|
|
c2b3853aa7 | ||
|
|
65afb34b8b | ||
|
|
ac71f13361 | ||
|
|
3d2687768f | ||
|
|
d3b25364cc | ||
|
|
5d49db54ee | ||
|
|
81b6469aad | ||
|
|
1d76cc921a | ||
|
|
6026bd44c3 | ||
|
|
7bc7bb0ab9 | ||
|
|
2e8410da4b | ||
|
|
cf6c11db14 | ||
|
|
ed6e2e5055 | ||
|
|
1ee6af2f82 | ||
|
|
ef62b3bf55 | ||
|
|
76faad67d9 | ||
|
|
a4b06ea86e | ||
|
|
355d5970a6 | ||
|
|
a53ca789ea | ||
|
|
6fa08d3cc0 | ||
|
|
73b804f42d | ||
|
|
151eac6f4f | ||
|
|
a6efda6120 | ||
|
|
822b31f7b7 | ||
|
|
0684e05877 | ||
|
|
8346ab12be | ||
|
|
00554390e1 | ||
|
|
5cdd1bee42 | ||
|
|
db6695435d | ||
|
|
899929afc6 | ||
|
|
a1fcafd50c | ||
|
|
a622b97a94 | ||
|
|
e86aebaa41 | ||
|
|
c1ec68091a | ||
|
|
c1ad9dba2a | ||
|
|
b1449880be | ||
|
|
b6c886837f | ||
|
|
5e639c75f7 | ||
|
|
a56edd65a7 | ||
|
|
09c9cb4508 | ||
|
|
058de25977 | ||
|
|
eb57cc3e9e | ||
|
|
1b2bac7aef | ||
|
|
b06eb44c45 | ||
|
|
5bf81934cd | ||
|
|
635cf268d4 | ||
|
|
3c2614ade7 | ||
|
|
265057a716 | ||
|
|
06b9f1db87 | ||
|
|
356a14bb16 | ||
|
|
be8ddb11db | ||
|
|
108534a4fe | ||
|
|
0a08d6389a | ||
|
|
f36ba01460 | ||
|
|
22af08d86e | ||
|
|
2ab06779f9 | ||
|
|
0ac093e19c | ||
|
|
e693c9e86b | ||
|
|
7cfc108fb4 | ||
|
|
2a126cf1dc | ||
|
|
0e732a7d41 | ||
|
|
66688c19a6 | ||
|
|
966f5c1f32 | ||
|
|
ea8bd8dc1c | ||
|
|
56da538ca0 | ||
|
|
42d5cb671e | ||
|
|
95f68a41d7 | ||
|
|
4c4c392479 | ||
|
|
907d9de965 | ||
|
|
6f69207a67 | ||
|
|
29be4f6a92 | ||
|
|
b1214063d2 | ||
|
|
da4e3e6e9f | ||
|
|
e0c28bc7d2 | ||
|
|
58259f8bd9 | ||
|
|
4828c4a6fa | ||
|
|
3e29a03f87 | ||
|
|
fa86f31f36 | ||
|
|
feb2b958a4 | ||
|
|
e3d69d78a0 | ||
|
|
ef5e393510 | ||
|
|
a9a131699f | ||
|
|
3813e3f6df | ||
|
|
499c8288eb | ||
|
|
91d22e3d84 | ||
|
|
a8174398f5 | ||
|
|
0dafd0a38b | ||
|
|
13d46476c8 | ||
|
|
bc2dce7a50 | ||
|
|
3f467b33e4 | ||
|
|
313d1e6fec | ||
|
|
a4485b8c09 | ||
|
|
a2389d5c5b | ||
|
|
8243eef67c | ||
|
|
0b54df14e2 | ||
|
|
79c07d436e | ||
|
|
40fdd00b9e | ||
|
|
65f5f1c38c | ||
|
|
c4da8325ac | ||
|
|
c815310418 | ||
|
|
9b6c4e046f | ||
|
|
94586b669f | ||
|
|
5f62c7607d | ||
|
|
ce681fe481 | ||
|
|
cdcedd6b34 | ||
|
|
1f49879298 | ||
|
|
691ab2b02c | ||
|
|
0cf9f1d536 | ||
|
|
3d743e5bdb | ||
|
|
bc824ad6a5 | ||
|
|
b9872c9a67 | ||
|
|
ea0c2285bc | ||
|
|
a611fee7af | ||
|
|
c2502bf0b0 | ||
|
|
e8d784a47d | ||
|
|
8bdc8fb7a2 | ||
|
|
aca7ab63e8 | ||
|
|
c2b765f3ff | ||
|
|
068c0743a1 | ||
|
|
0a58628f74 | ||
|
|
b225866c27 | ||
|
|
872c007a29 | ||
|
|
402cebc76c | ||
|
|
3656617044 | ||
|
|
5538481833 | ||
|
|
a52b9feeea | ||
|
|
136c82f9ad | ||
|
|
ead45fe4d0 | ||
|
|
69982dc16a | ||
|
|
d030206195 | ||
|
|
30cac21003 | ||
|
|
cd21a24ee4 | ||
|
|
73d3164426 | ||
|
|
cf32452917 | ||
|
|
403fd3cd4f | ||
|
|
6899e01fc1 | ||
|
|
6181262c76 | ||
|
|
2114bc4837 | ||
|
|
1897f0f51a | ||
|
|
91aa8c51fc | ||
|
|
903ed1917e | ||
|
|
ac23be134b | ||
|
|
ae741348a6 | ||
|
|
052e0b5a94 | ||
|
|
6c06d83525 | ||
|
|
e442512087 | ||
|
|
0e3518409e | ||
|
|
9bb675462f | ||
|
|
948eedba89 | ||
|
|
0c19bc9c28 | ||
|
|
75b91c618e | ||
|
|
e3051ea1dc | ||
|
|
48391c3108 | ||
|
|
3a8327de66 | ||
|
|
ea8dbbd29f | ||
|
|
4eb356f6be | ||
|
|
67962a5e55 | ||
|
|
e960a0a82c | ||
|
|
66c891df5b | ||
|
|
fb90c98f81 | ||
|
|
b69ff5d31a | ||
|
|
a883029044 | ||
|
|
2f168da1dc | ||
|
|
f87213790e | ||
|
|
7b199ac17f | ||
|
|
5c2d5dcd27 | ||
|
|
1e728d453b | ||
|
|
46b0857ef6 | ||
|
|
0dc24cf800 | ||
|
|
8e07af04e3 | ||
|
|
da1e3b40cc | ||
|
|
9506c01824 | ||
|
|
1f38c2f467 | ||
|
|
6f6f17f5dc | ||
|
|
a35cf02208 | ||
|
|
1c3028c59f | ||
|
|
a17950290c | ||
|
|
ff31f34551 | ||
|
|
0bfdff0b39 | ||
|
|
247b63a0e3 | ||
|
|
29a7ee30f3 | ||
|
|
e77f1a9287 | ||
|
|
7934e05083 | ||
|
|
e123dd1849 | ||
|
|
36778186e1 | ||
|
|
e518ea04c5 | ||
|
|
17731c3de3 | ||
|
|
b30cb58ff4 | ||
|
|
923ea7247c | ||
|
|
5619abe12d | ||
|
|
2d1a1bfb76 | ||
|
|
48b37453ea | ||
|
|
bc3470c272 | ||
|
|
a3297b0017 | ||
|
|
deb47e29bf | ||
|
|
5a4851630e | ||
|
|
fd4e9d8a1b | ||
|
|
8427f7490d | ||
|
|
7973b26e7a | ||
|
|
c94e87428d | ||
|
|
7ccac09b6b | ||
|
|
c5a6d96a62 | ||
|
|
4f81cdfe8c | ||
|
|
8039fd35e6 | ||
|
|
24a98f2fa8 | ||
|
|
66d41feab6 | ||
|
|
c92a2f964a | ||
|
|
9cabb93b8b | ||
|
|
ee4b71c8e7 | ||
|
|
b8732a25a3 | ||
|
|
32a3c9812d | ||
|
|
ae72e1c51e | ||
|
|
6dd6d0391f | ||
|
|
36a723c4cc | ||
|
|
cf7237d2a4 | ||
|
|
06b54585a1 | ||
|
|
f8ece108c6 | ||
|
|
4919c40b57 | ||
|
|
dc1e727613 | ||
|
|
b57b94ad0b | ||
|
|
6ee8e9126a | ||
|
|
5cd189e2e0 | ||
|
|
b0653fec68 | ||
|
|
70764a74af | ||
|
|
1f444b1913 | ||
|
|
bf95333275 | ||
|
|
2c9dbc6191 | ||
|
|
de4fcb9241 | ||
|
|
bc3bdacdaa | ||
|
|
62fea4d3ed | ||
|
|
076156b66e | ||
|
|
3fc500b291 | ||
|
|
882d7e4a30 | ||
|
|
848c85c1eb | ||
|
|
81d93b8fbf | ||
|
|
42e5b3473d | ||
|
|
510940389c | ||
|
|
9323833fcc | ||
|
|
6588e9e01b | ||
|
|
15c73ef94f | ||
|
|
c88824155f | ||
|
|
1998675dc0 | ||
|
|
fe7b424ab8 | ||
|
|
a91380a76f | ||
|
|
fd18f7cba7 | ||
|
|
4a9143ab31 | ||
|
|
d3650d9d80 | ||
|
|
dff3d16831 | ||
|
|
d601f0aec2 | ||
|
|
3d1bb2c60f | ||
|
|
5953bbab42 | ||
|
|
7aff45c2dc | ||
|
|
a224ed7cc7 | ||
|
|
1291dc5571 | ||
|
|
6a0b9bd209 | ||
|
|
d93a80398d | ||
|
|
129633a66d | ||
|
|
18e1134e61 | ||
|
|
2cb6593b6b | ||
|
|
5961bdbd9e | ||
|
|
0db42e2056 | ||
|
|
137847e85c | ||
|
|
5ce39d3c81 | ||
|
|
e98794a0a7 | ||
|
|
640cd18515 | ||
|
|
c6d4c73c8a | ||
|
|
575c10114b | ||
|
|
a57e511fa3 | ||
|
|
38c66e7c1a | ||
|
|
5ca7c7e640 | ||
|
|
6b8b32015d | ||
|
|
6900b4dadf | ||
|
|
bc86664726 | ||
|
|
54cf30ae68 | ||
|
|
41463d8eb5 | ||
|
|
a2161532db | ||
|
|
9a8b7a4d8d | ||
|
|
bfdc468d4b | ||
|
|
b706383687 | ||
|
|
6e9d60d76d | ||
|
|
79c5f64dd4 | ||
|
|
81cbeb1d5a | ||
|
|
877e1e5eb3 | ||
|
|
75ff924be1 | ||
|
|
d69a01193d | ||
|
|
e6c1ba29d9 | ||
|
|
725ec80983 | ||
|
|
7f49bd99c2 | ||
|
|
abe32272dd | ||
|
|
8bc2242d9f | ||
|
|
cea3dd60b6 | ||
|
|
7645bdd418 | ||
|
|
eda9443b1a | ||
|
|
a0d8e3c666 | ||
|
|
f25104789e | ||
|
|
f983e4eb6b | ||
|
|
c984013e1e | ||
|
|
8fdedd4da1 | ||
|
|
e848d6afbe | ||
|
|
81cb30833f | ||
|
|
f520e27f40 | ||
|
|
fa015d91fe | ||
|
|
34e1ee2bf6 | ||
|
|
5ab047ea0f | ||
|
|
9ab17dec80 | ||
|
|
1f930c112b | ||
|
|
42c3eff3f7 | ||
|
|
121143515a | ||
|
|
147fef74c6 | ||
|
|
668b25eeb2 | ||
|
|
34f5b2cb8a | ||
|
|
380f950d4d | ||
|
|
6e2ca0af12 | ||
|
|
fd8b62610f | ||
|
|
4474f29ebf | ||
|
|
cd29c83a64 | ||
|
|
b0164e1f96 | ||
|
|
e4e2fbf885 | ||
|
|
92ac427d00 | ||
|
|
3ba3638ab7 | ||
|
|
2f60c241ee | ||
|
|
ae0d5e4ffb | ||
|
|
68cd79db34 | ||
|
|
8a6bff42c9 | ||
|
|
c88f50125b | ||
|
|
b5fc054fa5 | ||
|
|
0bb5ff8b09 | ||
|
|
1d6f71d680 | ||
|
|
3beb1f5c7c | ||
|
|
c41bd81526 | ||
|
|
2f1380a31d | ||
|
|
d8717d64ba | ||
|
|
96c9d50ee2 | ||
|
|
3027b1d3d4 | ||
|
|
8c94ef8aa0 | ||
|
|
44ed0b9ceb | ||
|
|
8a1f365a7e | ||
|
|
6b46e0837f | ||
|
|
fd51d0acf3 | ||
|
|
0eab4d68f6 | ||
|
|
245f62685a | ||
|
|
f3d375a7a8 | ||
|
|
39328d6e0c | ||
|
|
7b0d0e810c | ||
|
|
9dd1083918 | ||
|
|
aa438c8b83 | ||
|
|
cc7c310eee | ||
|
|
4ab6500c1c | ||
|
|
14c555fcfb | ||
|
|
bf7dc2f8dd | ||
|
|
d583163ac8 | ||
|
|
a3f7b36986 | ||
|
|
7c3189379c | ||
|
|
fcd2ba78bb | ||
|
|
48b9173f2e | ||
|
|
184f49d909 | ||
|
|
b8127b0d16 | ||
|
|
1a50671823 | ||
|
|
ea07bf8f69 | ||
|
|
996eb1b06f | ||
|
|
ad1a42d210 | ||
|
|
0b1711fb79 | ||
|
|
bb526aaa88 | ||
|
|
91bf3197ae | ||
|
|
17c3ec0d0c | ||
|
|
8a17ac1baa | ||
|
|
a7aee75025 | ||
|
|
0902b92f79 | ||
|
|
9659f29e50 | ||
|
|
f21d5f25ec | ||
|
|
3b787824d3 | ||
|
|
a0ce9a79a9 | ||
|
|
acefa1a423 | ||
|
|
b42a9039cc | ||
|
|
b3ad3eff8b | ||
|
|
28c85b8fb9 | ||
|
|
e9b0867bd2 | ||
|
|
f52b43b380 | ||
|
|
fd61c8e874 | ||
|
|
c2bb507fe4 | ||
|
|
091854df0e | ||
|
|
a1b91e1f96 | ||
|
|
b95d789821 | ||
|
|
de8947f3d0 | ||
|
|
b1c6a97839 | ||
|
|
8c46f1b6ba | ||
|
|
fb6cbbdaad | ||
|
|
e7ee3ec63c | ||
|
|
a57f55dcbf | ||
|
|
27f7679494 | ||
|
|
26977b370e | ||
|
|
109d467b95 | ||
|
|
63268318ed | ||
|
|
45157d80c6 | ||
|
|
687a5e2efb | ||
|
|
b07c0e4d23 | ||
|
|
9358bf24db | ||
|
|
24932b16d7 | ||
|
|
6cdd5a6405 | ||
|
|
a28d9f1456 | ||
|
|
3f5b4f49f2 | ||
|
|
fb6b173fe7 | ||
|
|
1361ff8e22 | ||
|
|
0731f28615 | ||
|
|
f7b58d0718 | ||
|
|
6cf2e8753e | ||
|
|
33cc78c987 | ||
|
|
7cd8d1ec74 | ||
|
|
e0809d526e | ||
|
|
ae3169e6ae | ||
|
|
2878d978c4 | ||
|
|
56ec6ed22c | ||
|
|
d46003843b | ||
|
|
13619d427a | ||
|
|
f03d00a497 | ||
|
|
3d20c2f266 | ||
|
|
f9fce53cc4 | ||
|
|
aee474b53e | ||
|
|
8a0bcf6b79 | ||
|
|
ad25905783 | ||
|
|
0b5ff47cc0 | ||
|
|
da50e33aa8 | ||
|
|
e6b431d92f | ||
|
|
7d1c5d1ac6 | ||
|
|
8903bddb17 | ||
|
|
41c335c0e6 | ||
|
|
2104dccec5 | ||
|
|
db5b908d62 | ||
|
|
6f749b196a | ||
|
|
f5ba386c01 | ||
|
|
0079677e43 | ||
|
|
106eda7067 | ||
|
|
f13455965c | ||
|
|
5bc0ad879b | ||
|
|
72e85a352a | ||
|
|
49c1ca3f57 | ||
|
|
bcff69b79c | ||
|
|
3f7fec8c91 | ||
|
|
3479614c73 | ||
|
|
34f075a8cc | ||
|
|
ff165e8627 | ||
|
|
cdcbf60e44 | ||
|
|
2d4e617c95 | ||
|
|
6ea7758ab1 | ||
|
|
604959a319 | ||
|
|
6a3b39b428 | ||
|
|
9e80a12462 | ||
|
|
0e0ecc2d6a | ||
|
|
f872ced863 | ||
|
|
9a30b98880 | ||
|
|
f36bd24e1e | ||
|
|
23dd3d7a67 | ||
|
|
79965708ab | ||
|
|
80a83ff8d9 | ||
|
|
2e9177a032 | ||
|
|
bbb5daa575 | ||
|
|
739bd05037 | ||
|
|
f7197c10df | ||
|
|
e56f710cd1 | ||
|
|
18f3cc77e5 | ||
|
|
e3ded61122 | ||
|
|
f8e3fa5a99 | ||
|
|
05d308a37a | ||
|
|
cd5827e69b | ||
|
|
20048d31a1 | ||
|
|
598a729fc0 | ||
|
|
6ed5c9e64d | ||
|
|
1232c00dd1 | ||
|
|
5d87b54390 | ||
|
|
6733c6ce1f | ||
|
|
ba2d0e8df2 | ||
|
|
1722248065 | ||
|
|
dd0fcb6320 | ||
|
|
b965d0a0af | ||
|
|
48dab494db | ||
|
|
42eacba09a | ||
|
|
e2c993ebcd | ||
|
|
634f4e29aa | ||
|
|
59f75555bc | ||
|
|
cb5a452c90 | ||
|
|
58b9f712df | ||
|
|
f09918f0d2 | ||
|
|
4e35904392 | ||
|
|
82b3beb921 | ||
|
|
2806288489 | ||
|
|
0d498fcd52 | ||
|
|
83efc9afc4 | ||
|
|
393b411acc | ||
|
|
4effe1f1d9 | ||
|
|
de82bd00ae | ||
|
|
d222eec9f7 | ||
|
|
2cda163bcf | ||
|
|
9025d91f12 | ||
|
|
6810de85e1 | ||
|
|
4626e19b75 | ||
|
|
d75e0b99d5 | ||
|
|
73b4bfb5f8 | ||
|
|
bbafdd3d06 | ||
|
|
8ede1fc9d2 | ||
|
|
95cb6f30bb | ||
|
|
c94fdaecb2 | ||
|
|
e2b43a4ced | ||
|
|
1fd087e5d3 | ||
|
|
6df6aad303 | ||
|
|
5140c83649 | ||
|
|
1b6ce6dab6 | ||
|
|
1cc0d43aa4 | ||
|
|
0af4b17c20 | ||
|
|
2275601bf7 | ||
|
|
7cfc2ffa32 | ||
|
|
9e95024a9d | ||
|
|
87b76aadb7 | ||
|
|
adc657898c | ||
|
|
43b47abaa7 | ||
|
|
2ebc926f4e | ||
|
|
af58643ee7 | ||
|
|
9a358b2258 | ||
|
|
25fc01cb81 | ||
|
|
d3fe3a1960 | ||
|
|
01453e9d40 | ||
|
|
27f0eaf71d | ||
|
|
9bd52820e7 | ||
|
|
86c5aa023f | ||
|
|
4df8d3aada | ||
|
|
8fab079ad6 | ||
|
|
e59d1f7a98 | ||
|
|
5f817e88e7 | ||
|
|
38de6cb46a | ||
|
|
e287edb6fe | ||
|
|
29545a90c6 | ||
|
|
e849e3f206 | ||
|
|
c3011cd3ea | ||
|
|
e4770de9f2 | ||
|
|
99061c672c | ||
|
|
27fcd7c260 | ||
|
|
4c0e7b2462 | ||
|
|
decd81bc1e | ||
|
|
73970ec5a2 | ||
|
|
c62923fb1d | ||
|
|
c13b86a885 | ||
|
|
2564592c09 | ||
|
|
4b0cf2ffce | ||
|
|
fab039ddf3 | ||
|
|
3c0e142f73 | ||
|
|
80f7a37118 | ||
|
|
11de0d0ca0 | ||
|
|
5e815de82a | ||
|
|
0536862b8f | ||
|
|
b520e2fd35 | ||
|
|
740d4a45f9 | ||
|
|
cb53cdd728 | ||
|
|
2b92996d7c | ||
|
|
b8944beea9 | ||
|
|
67435edad7 | ||
|
|
fc9a0f15db | ||
|
|
8a57489966 | ||
|
|
3a8c1b3fcd | ||
|
|
0c2f079670 | ||
|
|
d266d995ab | ||
|
|
0ea2e9cfd6 | ||
|
|
9b8cb03c55 | ||
|
|
729f646a28 | ||
|
|
85c892c218 | ||
|
|
7f5e72dbdb | ||
|
|
479fb0e782 | ||
|
|
8ba11a2bd0 | ||
|
|
abc3f3b94d | ||
|
|
67bc0456e0 | ||
|
|
3e8ddd1966 | ||
|
|
6223342890 | ||
|
|
9ddabb3fee | ||
|
|
af0030b580 | ||
|
|
b93271d9cd | ||
|
|
934ca6508f | ||
|
|
7e210c7e6b | ||
|
|
e4970266d8 | ||
|
|
0a5d7a7bd2 | ||
|
|
31aab8ea6f | ||
|
|
857d9bcf2a | ||
|
|
7463166aec | ||
|
|
f80159fedc | ||
|
|
3180a6f6ec | ||
|
|
35d26f1d27 | ||
|
|
ca03f8928d | ||
|
|
0b3d1e50a8 | ||
|
|
401886c7c3 | ||
|
|
4eac7661c2 | ||
|
|
b8163cfbbf | ||
|
|
a9f82907ee | ||
|
|
57f4ae5320 | ||
|
|
d1712424c8 | ||
|
|
16f865987d | ||
|
|
f071531494 | ||
|
|
618768c7ed | ||
|
|
cfe22e6fd2 | ||
|
|
3961dd5a44 | ||
|
|
471e332036 | ||
|
|
467e8c563a | ||
|
|
5971630f64 | ||
|
|
f7cc1058c7 | ||
|
|
645a5920da | ||
|
|
baccca843c | ||
|
|
19381454ad | ||
|
|
f95bc64971 | ||
|
|
0c7c307de3 | ||
|
|
1c84881d00 | ||
|
|
f1252abbbe | ||
|
|
11d6ca2aa1 | ||
|
|
eb59b90790 | ||
|
|
4c3aa97917 | ||
|
|
ba54f25b8c | ||
|
|
af268f4968 | ||
|
|
f93b24acc7 | ||
|
|
6854def13c | ||
|
|
63d63c27e7 | ||
|
|
ef1e2ab9e2 | ||
|
|
7b46940772 | ||
|
|
6f5f68df1a | ||
|
|
dc165175cf | ||
|
|
32f1782c84 | ||
|
|
8811d96a8b | ||
|
|
d11d74688e | ||
|
|
8e79d53d78 | ||
|
|
6dbc476cdc | ||
|
|
57921e3fe0 | ||
|
|
75b74ac4ff | ||
|
|
1c659841fa | ||
|
|
9573357778 | ||
|
|
f11362a80d | ||
|
|
a01fbb636a | ||
|
|
320fb55ddc | ||
|
|
4b170ca43f | ||
|
|
c6e7fb74ab | ||
|
|
b05814e6a5 | ||
|
|
07882c42dc | ||
|
|
a59b2f8433 | ||
|
|
7f2e94c30c | ||
|
|
95aed8fcb0 | ||
|
|
663d3b24cd | ||
|
|
a87303f375 | ||
|
|
259858fac2 | ||
|
|
a4514ee98a | ||
|
|
39151e4354 | ||
|
|
d27b7bfa7a | ||
|
|
ce61795c38 | ||
|
|
528f06bc62 | ||
|
|
5360277594 | ||
|
|
b957130787 | ||
|
|
f88dcd160c | ||
|
|
7d8f698096 | ||
|
|
d3f5a06517 | ||
|
|
9cc878cea7 | ||
|
|
087acf8a9a | ||
|
|
7612180276 | ||
|
|
201e3e4dab | ||
|
|
55f51ad169 | ||
|
|
405d1ee52d | ||
|
|
5f9ad5c19e | ||
|
|
280b698a50 | ||
|
|
8d12881a1c | ||
|
|
c5cfa409b1 | ||
|
|
2a0f44b0fb | ||
|
|
7d0e585c44 | ||
|
|
a5ced5d909 | ||
|
|
0a99f65f01 | ||
|
|
c33814a7a6 | ||
|
|
0950369a5c | ||
|
|
346b5177bc | ||
|
|
9246d524cb | ||
|
|
6480933861 | ||
|
|
a889fef752 | ||
|
|
6075498c24 | ||
|
|
ee1da73a69 | ||
|
|
29ac6a153e | ||
|
|
264757e964 | ||
|
|
e88a9ffd89 | ||
|
|
d56a611a19 | ||
|
|
28ed7772c6 | ||
|
|
a047359f81 | ||
|
|
b81c165bea | ||
|
|
4405f5e163 | ||
|
|
2012c8c91d | ||
|
|
f719a4e91b | ||
|
|
5d33727ae4 | ||
|
|
1343b83fc3 | ||
|
|
9e47ec9af2 | ||
|
|
9c459aacc7 | ||
|
|
72724abac8 | ||
|
|
9a86eeb333 | ||
|
|
46f6fd18b0 | ||
|
|
603f22a7bb | ||
|
|
13c401cbaa | ||
|
|
b812991072 | ||
|
|
2b2431824f | ||
|
|
7147787441 | ||
|
|
ec3bf1139d | ||
|
|
d0b603d033 | ||
|
|
2621be819e | ||
|
|
f380153f42 | ||
|
|
fd91c5e1a8 | ||
|
|
f61d852f3c | ||
|
|
5bc1112151 | ||
|
|
59cc0b675e | ||
|
|
db8ded2a02 | ||
|
|
4b7279146a | ||
|
|
c4a2f7911d | ||
|
|
db9fe53af3 | ||
|
|
d3865ad23f | ||
|
|
8b1067d180 | ||
|
|
a53a0acd65 | ||
|
|
42724c7f42 | ||
|
|
616f069538 | ||
|
|
11cec31da6 | ||
|
|
d9991b25a4 | ||
|
|
cb6533f3a6 | ||
|
|
54e7f65d4e | ||
|
|
ec61f3acf0 | ||
|
|
910aa1ad7f | ||
|
|
24bed01fa4 | ||
|
|
f7d6ab5f2a | ||
|
|
0716cffd7d | ||
|
|
e29ab29441 | ||
|
|
9f271de803 | ||
|
|
43c796a781 | ||
|
|
25152e4441 | ||
|
|
3846fe0a7d | ||
|
|
b3b2bd1faf | ||
|
|
2c3d98abc8 | ||
|
|
0dc3dd0336 | ||
|
|
c4762e7228 | ||
|
|
35b32b721e | ||
|
|
ccf1a047d3 | ||
|
|
db0338cbcf | ||
|
|
06742eb507 | ||
|
|
0fab4ff5d1 | ||
|
|
d2b0d514f8 | ||
|
|
ab40908fa4 | ||
|
|
a5c48c891e | ||
|
|
70e35de56b | ||
|
|
c323e0ad4a | ||
|
|
4d32826891 | ||
|
|
13088f55a0 | ||
|
|
ea008411e4 | ||
|
|
e63fdf580b | ||
|
|
597c6939c8 | ||
|
|
293ae18a11 | ||
|
|
32b34cbe4c | ||
|
|
2f6d05f99d | ||
|
|
ad3ae67e70 | ||
|
|
b594407cd5 | ||
|
|
207c4cf961 | ||
|
|
fe11837a61 | ||
|
|
fee912023f | ||
|
|
a95ac990ff | ||
|
|
aad8439542 | ||
|
|
1a777edffe | ||
|
|
537018f71f | ||
|
|
67ca3a9334 | ||
|
|
5fb30979c1 | ||
|
|
cf863d4849 | ||
|
|
47814847f9 | ||
|
|
9ec8974545 | ||
|
|
c887c6e0f6 | ||
|
|
6c8949bba1 | ||
|
|
508d3ab68c | ||
|
|
6dad013783 | ||
|
|
0532e5cbf0 | ||
|
|
abcdf3e252 | ||
|
|
3baa6b9237 | ||
|
|
23e6a475ee | ||
|
|
65256c8751 | ||
|
|
b36d8780fd | ||
|
|
70fda99415 | ||
|
|
2221f70ff0 | ||
|
|
daad8d9c04 | ||
|
|
03d26e39c7 | ||
|
|
64d3c089a2 | ||
|
|
938c011e63 | ||
|
|
66f6b88333 | ||
|
|
35f746c925 | ||
|
|
944da28089 | ||
|
|
8f3e2b645a | ||
|
|
82b2a5305f | ||
|
|
6a2852ee26 | ||
|
|
526d6c4da9 | ||
|
|
46d62f4972 | ||
|
|
5cafcdb695 | ||
|
|
2674258ead | ||
|
|
b38be3a1d0 | ||
|
|
18a9f05626 | ||
|
|
bf34980c43 | ||
|
|
d2f8f9dc1a | ||
|
|
df13469b6e | ||
|
|
584ec681af | ||
|
|
0c5b5cca4a | ||
|
|
64663bf4a8 | ||
|
|
fe8334a873 | ||
|
|
c74fd40e2a | ||
|
|
0f8ff67451 | ||
|
|
8b0032c210 | ||
|
|
d9254ef2d9 | ||
|
|
66be05a962 | ||
|
|
0e85a09dd3 | ||
|
|
0c4ba9fd67 | ||
|
|
aca81c764a | ||
|
|
6b3ddb97d1 | ||
|
|
26ccf2a316 | ||
|
|
361894194a | ||
|
|
8c2db8ddb8 | ||
|
|
5546baa927 | ||
|
|
d814009721 | ||
|
|
08fd050c3f | ||
|
|
0b096d7d55 | ||
|
|
44cfb2dc87 | ||
|
|
b0624cadb7 | ||
|
|
045f361b0d | ||
|
|
cb77b9dc1a | ||
|
|
0723dac596 | ||
|
|
365f9b4c1b | ||
|
|
2cf90d90f7 | ||
|
|
da14f64d1b | ||
|
|
ef1b1c8ffc | ||
|
|
adde8ab2c3 | ||
|
|
22cc8079dc | ||
|
|
6d25706300 | ||
|
|
81419c980b | ||
|
|
097e21f641 | ||
|
|
b68180b97b | ||
|
|
d9059d18c0 | ||
|
|
5225a6e27a | ||
|
|
9055bace96 | ||
|
|
eb25e88754 | ||
|
|
0cb8ecc6f7 | ||
|
|
8cf76cc6e9 | ||
|
|
3c3a646d42 | ||
|
|
ff29fd69a3 | ||
|
|
91994a399c | ||
|
|
bef7137c92 | ||
|
|
11f62bab34 | ||
|
|
b66776a047 | ||
|
|
2c151f444c | ||
|
|
d8f8b060cb | ||
|
|
ea9376019c | ||
|
|
008d1df106 | ||
|
|
ec91a6c7f4 | ||
|
|
4b2ae6a79f | ||
|
|
2ec756fd6b | ||
|
|
f0d5b40121 | ||
|
|
31a0996b2f | ||
|
|
0bbd8f0a16 | ||
|
|
3d721a95bb | ||
|
|
dc3a136704 | ||
|
|
43cb4f471f | ||
|
|
6b5ced0078 | ||
|
|
c7e8498166 | ||
|
|
2b4c019f13 | ||
|
|
335850380e |
@@ -0,0 +1 @@
|
||||
* text=auto
|
||||
@@ -13,6 +13,13 @@ npm-debug.log
|
||||
.env
|
||||
build/
|
||||
.vscode/
|
||||
.DS_Store
|
||||
fixtures/typings-test/*.js
|
||||
package-lock.json
|
||||
|
||||
# Directories needed for code coverage
|
||||
/coverage/
|
||||
|
||||
# Keep bundled code out of Git
|
||||
dist/
|
||||
demo/dist/
|
||||
|
||||
+44
-12
@@ -1,16 +1,48 @@
|
||||
node_modules/
|
||||
*.swp
|
||||
.lock-wscript
|
||||
lib/*.test.js
|
||||
lib/*.test.js.map
|
||||
# Blacklist - exclude everything except npm defaults such as LICENSE, etc
|
||||
*
|
||||
!*/
|
||||
|
||||
# Whitelist - entries to be included must be negated with "!"
|
||||
!*.js
|
||||
!*.json
|
||||
|
||||
# Whitelist - dist/
|
||||
!dist/**/*.js
|
||||
!dist/**/*.js.map
|
||||
|
||||
!dist/**/*.css
|
||||
|
||||
# Whitelist - lib/
|
||||
!lib/**/*.d.ts
|
||||
|
||||
!lib/**/*.js
|
||||
!lib/**/*.js.map
|
||||
|
||||
!lib/**/*.css
|
||||
|
||||
# Whitelist - src/
|
||||
!src/**/*.ts
|
||||
!src/**/*.d.ts
|
||||
|
||||
!src/**/*.js
|
||||
!src/**/*.js.map
|
||||
|
||||
!src/**/*.css
|
||||
|
||||
# Whitelist - typings/
|
||||
!typings/*.d.ts
|
||||
|
||||
# Blacklist - (normal behavior) these will override any whitelist
|
||||
*.test.ts
|
||||
*.test.d.ts
|
||||
*.test.js
|
||||
*.test.js.map
|
||||
lib/test/
|
||||
Makefile.gyp
|
||||
*.Makefile
|
||||
*.target.gyp.mk
|
||||
*.node
|
||||
example/*.log
|
||||
|
||||
docs/
|
||||
npm-debug.log
|
||||
/.idea/
|
||||
.env
|
||||
.vscode/
|
||||
build/
|
||||
fixtures/
|
||||
coverage/
|
||||
demo/
|
||||
|
||||
+9
-9
@@ -1,19 +1,19 @@
|
||||
language: node_js
|
||||
os:
|
||||
- linux
|
||||
node_js:
|
||||
- 6
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq install g++-4.8 ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export CXX=g++-4.8 ; fi
|
||||
- npm install -g npm@5.1.0
|
||||
env:
|
||||
global:
|
||||
- CXX=g++-4.8
|
||||
matrix:
|
||||
- NPM_COMMAND=tsc
|
||||
- NPM_COMMAND=lint
|
||||
- NPM_COMMAND=test
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
notifications:
|
||||
email: false
|
||||
script: npm run $NPM_COMMAND
|
||||
after_success: npm run coveralls
|
||||
|
||||
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"search.exclude": {
|
||||
"**/node_modules": true,
|
||||
"**/dist": true,
|
||||
"**/build": true,
|
||||
"**/lib": true
|
||||
}
|
||||
}
|
||||
@@ -1,45 +1,120 @@
|
||||
List of xterm.js contributors. Updated before every release.
|
||||
|
||||
Adrian Labbé <adrilabbelol@gmail.com>
|
||||
Aleksandr Andrienko <aandrienko@codenvy.com>
|
||||
Aleksandr Andriienko <oandriie@redhat.com>
|
||||
Alessandro Nadalin <alessandro.nadalin@gmail.com>
|
||||
Alexander Olsson <noseglid@gmail.com>
|
||||
Alexandre Petit-Pas <petitpasalexandre@gmail.com>
|
||||
Alexey Kontsevoy <alexey@gravitational.com>
|
||||
Andres Mejia <amejia004@gmail.com>
|
||||
Anish Athalye <me@anishathalye.com>
|
||||
Anthony Lapenna <lapenna.anthony@gmail.com>
|
||||
Antonin Stefanutti <antonin@stefanutti.fr>
|
||||
Antonis Kalipetis <akalipetis@sourcelair.com>
|
||||
Anton Skshidlevsky <meefik@gmail.com>
|
||||
Anton Yurovskykh <anton.yurovskykh@gmail.com>
|
||||
Artem Arbatskiy <artyom.arbatskiy@gmail.com>
|
||||
Austin Robertson <austinrobertson@gmail.com>
|
||||
ayapi <colors.aya@gmail.com>
|
||||
Ben Hall <ben@benhall.me.uk>
|
||||
Benjamin Fischer <benjamin.fischer@rwth-aachen.de>
|
||||
Benjamin Woodruff <github@benjam.info>
|
||||
Bill Church <billchurch@users.noreply.github.com>
|
||||
Bob Reid <bobreid@Bobs-MacBook-Pro.local>
|
||||
bottleofwater <nison.mael+bottleofwater@gmail.com>
|
||||
Brandon Bayer <b@bayer.ws>
|
||||
Brian Mock <brian@mockbrian.com>
|
||||
Bruno Ribeiro <b.m.fernandes.ribeiro@gmail.com>
|
||||
Bruno Ribeito <b.m.fernandes.ribeiro@gmail.com>
|
||||
Carson Anderson <carson@betterservers.com>
|
||||
CHaBou <chabup@delean.fr>
|
||||
Christian Budde Christensen <budde377@gmail.com>
|
||||
Christof Marti <chrmarti@microsoft.com>
|
||||
Christopher Jeffrey <chjjeffrey@gmail.com>
|
||||
coderaiser <mnemonic.enemy@gmail.com>
|
||||
Damien Tournoud <damien@platform.sh>
|
||||
Dan Brown <jdanbrown@gmail.com>
|
||||
Daniel Griffen <dagriffe@microsoft.com>
|
||||
Daniel Griffen <daniel@griffen.io>
|
||||
Daniel Imms <daimms@microsoft.com>
|
||||
Daniel Risacher <drisacher@gmail.com>
|
||||
Dan Kaplun <dbkaplun@twitch.tv>
|
||||
Darin Morrison <freebroccolo@users.noreply.github.com>
|
||||
dcylabs <dcylabs@gmail.com>
|
||||
Dominik Csapak <d.csapak@proxmox.com>
|
||||
Edgar Andrés Margffoy Tuay <andfoy@gmail.com>
|
||||
Elliot Saba <staticfloat@gmail.com>
|
||||
Exile <exile@chamber.ee>
|
||||
Felipe Gasper <felipe@felipegasper.com>
|
||||
Felix <30559812+felixse@users.noreply.github.com>
|
||||
ficristo <ficristo.work@gmail.com>
|
||||
Gary Ritchie <gary@rstudio.com>
|
||||
hiro-su <h.sugipon@gmail.com>
|
||||
Ian Lewis <ianlewis@google.com>
|
||||
imoses <ido@twiggle.com>
|
||||
InDieTasten <indietasten@gmail.com>
|
||||
irokas <akasidiari@inf.uth.gr>
|
||||
Jakob Gillich <jakob@gillich.me>
|
||||
Jan Kuri <jkuri88@gmail.com>
|
||||
Jean Bruenn <himself@jeanbruenn.info>
|
||||
Jeremy Danyow <jedanyow@microsoft.com>
|
||||
Jianhui Zhao <jianhuizhao329@gmail.com>
|
||||
Joao Moreno <jomo@microsoft.com>
|
||||
Joao Moreno <mail@joaomoreno.com>
|
||||
Johannes Zellner <johannes@nebulon.de>
|
||||
Jon Austin <jon.i.austin@gmail.com>
|
||||
Jon Masters <jon.masters@sky.com>
|
||||
Jörg Breitbart <jerch@rockborn.de>
|
||||
jpoth <poth.john@gmail.com>
|
||||
Justin Luk <jluk@users.noreply.github.com>
|
||||
Justin Mecham <justin@mecham.me>
|
||||
Kirill Merkushev <lanwen@yandex.ru>
|
||||
Krasimir Tsonev <krasimir@outset.ws>
|
||||
Ledion Bitincka <lbitincka@gmail.com>
|
||||
Linus Unnebäck <linus@folkdatorn.se>
|
||||
Luca <LucaT1@users.noreply.github.com>
|
||||
Lucian Buzzo <lucian.buzzo@gmail.com>
|
||||
Lukas Drgon <lukas.drgon@gmail.com>
|
||||
Maël Nison <nison.mael@gmail.com>
|
||||
Marc Dumais <marc.dumais@ericsson.com>
|
||||
Marek Libra <mlibra@redhat.com>
|
||||
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||
Martin Chloride <i@martincl2.me>
|
||||
Martin Koppehel <martin.koppehel@st.ovgu.de>
|
||||
Martin Wang <jiahaow@ca.ibm.com>
|
||||
Matt Bierner <matb@microsoft.com>
|
||||
Matthew James <matthew.d.james87@gmail.com>
|
||||
Michael Irwin <mikesir87@gmail.com>
|
||||
Mikko Karvonen <mikko.karvonen@arm.com>
|
||||
mofux <t.zilz@mofux.org>
|
||||
Nicolas Ramz <nicolas.ramz@gmail.com>
|
||||
npezza93 <npezza93@gmail.com>
|
||||
Oleksandr Andriienko <oandriie@redhat.com>
|
||||
Paris Kasidiaris <pariskasidiaris@gmail.com>
|
||||
Paris Kasidiaris <paris@sourcelair.com>
|
||||
Peng Xiao <pengxiao@outlook.com>
|
||||
Peter Baumgarten <me@peterbaumgarten.com>
|
||||
Philip Olson <philip.olson@protonmail.ch>
|
||||
pro-src <34285059+pro-src@users.noreply.github.com>
|
||||
pro-src <rodneyd.teal@gmail.com>
|
||||
Rick Baker <rick@ricktbaker.com>
|
||||
runarberg <runar@greenqloud.com>
|
||||
Saad Malik <simfox3@gmail.com>
|
||||
Samuel Williams <samuel.williams@oriontransfer.co.nz>
|
||||
Saswat Das <saswatds@users.noreply.github.com>
|
||||
Saul Costa <saul@codevolve.com>
|
||||
Shuanglei Tao <tsl0922@gmail.com>
|
||||
sitzmar <sitzmar@gmail.com>
|
||||
Steven Silvester <steven.silvester@ieee.org>
|
||||
stuicey <stuicey@users.noreply.github.com>
|
||||
t-amqi <umberos@gmail.com>
|
||||
Thanasis Daglis <thanasis@sourcelair.com>
|
||||
thomas <thomas@kreativkonzentrat.de>
|
||||
Thomas Zilz <t.zilz@mofux.org>
|
||||
Tine Jozelj <tine.jozelj@outlook.com>
|
||||
Tyler Jewell <tjewell@codenvy.com>
|
||||
Vincent Woo <me@vincentwoo.com>
|
||||
yutaka <shigure@refy.net>
|
||||
YuviPanda <yuvipanda@gmail.com>
|
||||
ZHAO Xudong <zxdong@gmail.com>
|
||||
|
||||
@@ -50,3 +50,7 @@ By contributing code to xterm.js you
|
||||
holder has explicitly granted the right to use it like this,
|
||||
through a compatible open source license or through a direct
|
||||
agreement with you.)
|
||||
|
||||
### Third party dependencies
|
||||
|
||||
We prefer to not include any non-dev third party dependencies in order to keep our code minimal, performant and secure. If you plan on adding a dependency on a third party library it's a good idea to discuss the need in an issue with the maintainers first.
|
||||
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
FROM node:6.9
|
||||
FROM node:8
|
||||
MAINTAINER Paris Kasidiaris <paris@sourcelair.com>
|
||||
|
||||
# Set the working directory
|
||||
@@ -6,7 +6,7 @@ WORKDIR /usr/src/app
|
||||
|
||||
# Set an entrypoint, to automatically install node modules
|
||||
ENTRYPOINT ["/bin/bash", "-c", "if [[ ! -d node_modules ]]; then npm install; fi; exec \"${@:0}\";"]
|
||||
CMD ["npm", "run", "dev"]
|
||||
CMD ["npm", "run", "start"]
|
||||
|
||||
# First, install dependencies to improve layer caching
|
||||
COPY package.json /usr/src/app/
|
||||
@@ -16,4 +16,4 @@ RUN npm install
|
||||
COPY . /usr/src/app
|
||||
|
||||
# Run the tests and build, to make sure everything is working nicely
|
||||
RUN npm run build && npm run test
|
||||
RUN npm run build && npm run webpack && npm run test
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
web: npm run dev
|
||||
@@ -1,6 +1,6 @@
|
||||
# xterm.js
|
||||
# [](https://xtermjs.org)
|
||||
|
||||
[](https://travis-ci.org/sourcelair/xterm.js) [](https://coveralls.io/github/sourcelair/xterm.js) [](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||
[](https://travis-ci.org/xtermjs/xterm.js) [](https://coveralls.io/github/xtermjs/xterm.js?branch=master) [](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](https://www.jsdelivr.com/package/npm/xterm)
|
||||
|
||||
Xterm.js is a terminal front-end component written in JavaScript that works in the browser.
|
||||
|
||||
@@ -19,6 +19,94 @@ It enables applications to provide fully featured terminals to their users and c
|
||||
- Xterm.js is not a terminal application that you can download and use on your computer
|
||||
- Xterm.js is not `bash`. Xterm.js can be connected to processes like `bash` and let you interact with them (provide input, receive output)
|
||||
|
||||
## Getting Started
|
||||
|
||||
First you need to install the module, we ship exclusively through [npm](https://www.npmjs.com/) so you need that installed and then add xterm.js as a dependency by running:
|
||||
|
||||
```
|
||||
npm install xterm
|
||||
```
|
||||
|
||||
To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your html page. Then create a `<div id="terminal"></div>` onto which xterm can attach itself.
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="node_modules/xterm/dist/xterm.css" />
|
||||
<script src="node_modules/xterm/dist/xterm.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="terminal"></div>
|
||||
<script>
|
||||
var term = new Terminal();
|
||||
term.open(document.getElementById('terminal'));
|
||||
term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ')
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
Finally instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`.
|
||||
|
||||
### Importing
|
||||
|
||||
The proposed way to load xterm.js is via the ES6 module syntax.
|
||||
|
||||
```javascript
|
||||
import { Terminal } from 'xterm';
|
||||
```
|
||||
|
||||
### Addons
|
||||
|
||||
Addons are JavaScript modules that extend the `Terminal` prototype with new methods and attributes to provide additional functionality. There are a handful available in the main repository in the `src/addons` directory and you can even write your own, by using xterm.js' public API.
|
||||
|
||||
To use an addon, just import the JavaScript module and pass it to `Terminal`'s `applyAddon` method:
|
||||
|
||||
```javascript
|
||||
import { Terminal } from xterm;
|
||||
import * as fit from 'xterm/lib/addons/fit/fit';
|
||||
|
||||
|
||||
Terminal.applyAddon(fit);
|
||||
|
||||
var xterm = new Terminal(); // Instantiate the terminal
|
||||
xterm.fit(); // Use the `fit` method, provided by the `fit` addon
|
||||
```
|
||||
|
||||
#### Importing Addons in TypeScript
|
||||
|
||||
There are currently no typings for addons if they are accessed via extending Terminal prototype, so you will need to upcast if using TypeScript, eg. `(<any>xterm).fit()`.
|
||||
|
||||
Alternatively, you can import addon function and enhance the terminal on demand. This would have better typing support and is friendly to treeshaking. E.g.:
|
||||
|
||||
```typescript
|
||||
import { Terminal } from 'xterm';
|
||||
import { fit } from 'xterm/lib/addons/fit/fit';
|
||||
const xterm = new Terminal();
|
||||
|
||||
// Fit the terminal when necessary:
|
||||
fit(xterm);
|
||||
```
|
||||
|
||||
#### Third party addons
|
||||
|
||||
There are also the following third party addons available:
|
||||
|
||||
- [xterm-webfont](https://www.npmjs.com/package/xterm-webfont)
|
||||
|
||||
## Browser Support
|
||||
|
||||
Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support:
|
||||
|
||||
- Chrome latest
|
||||
- Edge latest
|
||||
- Firefox latest
|
||||
- Safari latest
|
||||
- IE11
|
||||
|
||||
Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working.
|
||||
|
||||
## Real-world uses
|
||||
Xterm.js is used in several world-class applications to provide great terminal experiences.
|
||||
|
||||
@@ -30,86 +118,110 @@ Xterm.js is used in several world-class applications to provide great terminal e
|
||||
- [**Codenvy**](http://www.codenvy.com): Cloud workspaces for development teams.
|
||||
- [**CoderPad**](https://coderpad.io): Online interviewing platform for programmers. Run code in many programming languages, with results displayed by `xterm.js`.
|
||||
- [**WebSSH2**](https://github.com/billchurch/WebSSH2): A web based SSH2 client using `xterm.js`, socket.io, and ssh2.
|
||||
- [**Spyder Terminal**](https://github.com/spyder-ide/spyder-terminal): A full fledged system terminal embedded on Spyder IDE.
|
||||
- [**Cloud Commander**](https://cloudcmd.io "Cloud Commander"): Orthodox web file manager with console and editor.
|
||||
- [**Codevolve**](https://www.codevolve.com "Codevolve"): Online platform for interactive coding and web development courses. Live container-backed terminal uses `xterm.js`.
|
||||
- [**RStudio**](https://www.rstudio.com/products/RStudio "RStudio"): RStudio is an integrated development environment (IDE) for R.
|
||||
- [**Terminal for Atom**](https://github.com/jsmecham/atom-terminal-tab): A simple terminal for the Atom text editor.
|
||||
- [**Eclipse Orion**](https://orionhub.org): A modern, open source software development environment that runs in the cloud. Code, deploy and run in the cloud.
|
||||
- [**Gravitational Teleport**](https://github.com/gravitational/teleport): Gravitational Teleport is a modern SSH server for remotely accessing clusters of Linux servers via SSH or HTTPS.
|
||||
- [**Hexlet**](https://en.hexlet.io): Practical programming courses (JavaScript, PHP, Unix, databases, functional programming). A steady path from the first line of code to the first job.
|
||||
- [**Selenoid UI**](https://github.com/aerokube/selenoid-ui): Simple UI for the scallable golang implementation of Selenium Hub named Selenoid. We use XTerm for streaming logs over websockets from docker containers.
|
||||
- [**Portainer**](https://portainer.io): Simple management UI for Docker.
|
||||
- [**SSHy**](https://github.com/stuicey/SSHy): HTML5 Based SSHv2 Web Client with E2E encryption utilising `xterm.js`, SJCL & websockets.
|
||||
- [**JupyterLab**](https://github.com/jupyterlab/jupyterlab): An extensible
|
||||
computational environment for Jupyter, supporting interactive data science and scientific computing across all programming languages.
|
||||
- [**Theia**](https://github.com/theia-ide/theia): Theia is a cloud & desktop IDE framework implemented in TypeScript.
|
||||
- [**Opshell**](https://github.com/ricktbaker/opshell) Ops Helper tool to make life easier working with AWS instances across multiple organizations.
|
||||
- [**Proxmox VE**](https://www.proxmox.com/en/proxmox-ve): Proxmox VE is a complete open-source platform for enterprise virtualization. It uses xterm.js for container terminals and the host shell.
|
||||
- [**Script Runner**](https://github.com/ioquatix/script-runner): Run scripts (or a shell) in Atom.
|
||||
- [**Whack Whack Terminal**](https://github.com/Microsoft/WhackWhackTerminal): Terminal emulator for Visual Studio 2017.
|
||||
- [**VTerm**](https://github.com/vterm/vterm): Extensible terminal emulator based on Electron and React.
|
||||
- [**electerm**](http://electerm.html5beta.com): electerm is a terminal/ssh/sftp client(mac, win, linux) based on electron/node-pty/xterm.
|
||||
- [**Kubebox**](https://github.com/astefanutti/kubebox): Terminal console for Kubernetes clusters.
|
||||
- [**Azure Cloud Shell**](https://shell.azure.com): Azure Cloud Shell is a Microsoft-managed admin machine built on Azure, for Azure.
|
||||
- [**atom-xterm**](https://atom.io/packages/atom-xterm): Atom plugin for providing terminals inside your Atom workspace.
|
||||
- [**rtty**](https://github.com/zhaojh329/rtty): A reverse proxy WebTTY. It is composed of the client and the server.
|
||||
- [**Pisth**](https://github.com/ColdGrub1384/Pisth): An SFTP and SSH client for iOS
|
||||
- [**abstruse**](https://github.com/bleenco/abstruse): Abstruse CI is a continuous integration platform based on Node.JS and Docker.
|
||||
- [**Microsoft SQL Operations Studio**](https://github.com/Microsoft/sqlopsstudio): A data management tool that enables working with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux
|
||||
- [**FreeMAN**](https://github.com/matthew-matvei/freeman): A free, cross-platform file manager for power users
|
||||
- [**Fluent Terminal**](https://github.com/felixse/FluentTerminal): A terminal emulator based on UWP and web technologies.
|
||||
- [**Hyper**](https://hyper.is): A terminal built on web technologies
|
||||
- [**Diag**](https://diag.ai): A better way to troubleshoot problems faster. Capture, share and reapply troubleshooting knowledge so you can focus on solving problems that matter.
|
||||
|
||||
Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it in our list.
|
||||
|
||||
## Browser Support
|
||||
|
||||
Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support:
|
||||
|
||||
- Chrome 48+
|
||||
- Edge 13+
|
||||
- Firefox 44+
|
||||
- Internet Explorer 11+
|
||||
- Opera 35+
|
||||
- Safari 8+
|
||||
|
||||
Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working.
|
||||
|
||||
## Demo
|
||||
|
||||
Xterm.js ships with a barebones demo implementation, designed for the development and evaluation of the library only. Exposing the demo to the public as is would introduce security risks for the host.
|
||||
|
||||
Below you can find instructions on how to run the demo on different platforms.
|
||||
|
||||
### SourceLair
|
||||
|
||||
SourceLair will run the demo and builder in parallel automatically. Just make sure to choose the "Node.js" project type, when cloning the xterm.js repo (or just use this shortcut; https://lair.io/xtermjs/xtermjs).
|
||||
|
||||
Then open your project's [Public URL](https://help.sourcelair.com/projects/the-public-url/) to access the demo.
|
||||
|
||||
### Docker
|
||||
|
||||
First, make sure you have Docker Engine 1.13.0 (or newer) and Docker Compose 1.10.0 (or newer).
|
||||
|
||||
Xterm.js [provides a pre-built Docker image](https://hub.docker.com/r/xtermjs/xterm.js/) to help run the demo easily (Git tags are built as [tagged Docker images](https://hub.docker.com/r/xtermjs/xterm.js/tags/) too).
|
||||
|
||||
To run the just demo (with no editing access). run the following command in your terminal:
|
||||
|
||||
```
|
||||
docker run -p 3000:3000 xtermjs/xterm.js
|
||||
```
|
||||
|
||||
Then open http://0.0.0.0:3000 in a web browser to access the demo.
|
||||
|
||||
To run the demo and builder in parallel, run the following command in your terminal:
|
||||
|
||||
```
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
Then open http://0.0.0.0:3000 in a web browser to access the demo. If you prefer a different port than `3000` to access the xterm.js demo, then set the `XTERMJS_PORT` environment variable to the desired port.
|
||||
|
||||
### Foreman (or other Procfile runner)
|
||||
|
||||
First, be sure that a C++ compiler such as GCC-C++ or Clang is installed, then run the following commands in your terminal:
|
||||
|
||||
```
|
||||
npm install
|
||||
foreman start # Replace foreman with "honcho", "forego" etc. depending on your runner
|
||||
```
|
||||
|
||||
Then open http://0.0.0.0:3000 in a web browser to access the demo.
|
||||
|
||||
### Linux or macOS
|
||||
|
||||
Run the following commands:
|
||||
First, be sure that a C++ compiler such as GCC-C++ or Clang is installed, then run the following commands in your terminal:
|
||||
|
||||
```
|
||||
$ npm install
|
||||
$ npm start
|
||||
npm install
|
||||
npm start # Run this in its own terminal
|
||||
npm run watch # Run this in its own terminal
|
||||
```
|
||||
|
||||
Then open http://0.0.0.0:3000 in a web browser.
|
||||
Then open http://0.0.0.0:3000 in a web browser to access the demo.
|
||||
|
||||
### Windows
|
||||
|
||||
First, ensure [node-gyp](https://github.com/nodejs/node-gyp) is installed and configured correctly, then run these commands.
|
||||
|
||||
Note: Do not use ConEmu, as it seems to break the demo for some reason.
|
||||
First, ensure [node-gyp](https://github.com/nodejs/node-gyp) is installed and configured correctly, then run the following commands in your terminal:
|
||||
|
||||
```
|
||||
> npm install
|
||||
> npm start
|
||||
npm install
|
||||
npm start # Run this in its own terminal
|
||||
npm run watch # Run this in its own terminal
|
||||
```
|
||||
|
||||
Then open http://127.0.0.1:3000 in a web browser.
|
||||
Then open http://127.0.0.1:3000 in a web browser to access the demo.
|
||||
|
||||
## Getting Started
|
||||
|
||||
To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your html page. Then create a `<div id="terminal"></div>` onto which xterm can attach itself.
|
||||
```html
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="bower_components/xterm.js/dist/xterm.css" />
|
||||
<script src="bower_components/xterm.js/dist/xterm.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="terminal"></div>
|
||||
<script>
|
||||
var term = new Terminal();
|
||||
term.open(document.getElementById('#terminal'));
|
||||
term.write('Hello from \033[1;3;31mxterm.js\033[0m $ ')
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
Finally instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`.
|
||||
|
||||
## Addons
|
||||
|
||||
Addons are JavaScript modules that attach functions to the `Terminal` prototype to extend its functionality. There are a handful available in the main repository in the `dist/addons` directory, you can even write your own (though they may break when the internals of xterm.js change across versions).
|
||||
|
||||
To use an addon, just include the JavaScript file after xterm.js and before the `Terminal` object has been instantiated. The function should then be exposed on the `Terminal` object:
|
||||
|
||||
```html
|
||||
<script src="node_modules/dist/xterm.js"></script>
|
||||
<script src="node_modules/dist/addons/fit/fit.js"></script>
|
||||
```
|
||||
|
||||
```js
|
||||
var xterm = new Terminal();
|
||||
// init code...
|
||||
xterm.fit();
|
||||
```
|
||||
*Note: Do not use ConEmu, as it seems to break the demo for some reason.*
|
||||
|
||||
## Releases
|
||||
|
||||
@@ -121,32 +233,16 @@ The existing releases are available at this GitHub repo's [Releases](https://git
|
||||
|
||||
Xterm.js is maintained by [SourceLair](https://www.sourcelair.com/) and a few external contributors, but we would love to receive contributions from everyone!
|
||||
|
||||
To contribute either code, documentation or issues to xterm.js please read the [Contributing document](CONTRIBUTING.md) before.
|
||||
To contribute either code, documentation or issues to xterm.js please read the [Contributing document](CONTRIBUTING.md) beforehand. The development of xterm.js does not require any special tool. All you need is an editor that supports JavaScript/TypeScript and a browser. You will need Node.js installed locally to get all the features working in the demo.
|
||||
|
||||
The development of xterm.js does not require any special tool. All you need is an editor that supports JavaScript and a browser (if you would like to run the demo you will need Node.js to get all features).
|
||||
### Code structure
|
||||
|
||||
It is recommended though to use a development tool that uses xterm.js internally, to develop for xterm.js. [Eating our own dogfood](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) has been proved extremely beneficial for this project. Known tools that use xterm.js internally are:
|
||||
|
||||
#### [SourceLair](https://www.sourcelair.com)
|
||||
|
||||
Visit https://lair.io/sourcelair/xterm and follow the instructions. All development will happen in your browser.
|
||||
|
||||
#### [Visual Studio Code](http://code.visualstudio.com/)
|
||||
|
||||
[Download Visual Studio Code](http://code.visualstudio.com/Download), clone xterm.js and you are all set.
|
||||
|
||||
#### [Eclipse Che](http://www.eclipse.org/che)
|
||||
|
||||
You can start Eclipse Che with `docker run eclipse/che start`.
|
||||
|
||||
#### [Codenvy](http://www.codenvy.io)
|
||||
|
||||
You can create a trial account or install an enterprise version with `docker run codenvy/cli start`.
|
||||
`src/` is roughly split up into areas of functionality such as `renderer/` that handles all rendering and `utils/` which provides general utility functions. The `shared/` folder contains code that can be used from either the main thread or a web worker thread, all code inside a `shared/` folder should only ever import other code from a `shared/` folder to minimize the amount of code run what launching a web worker.
|
||||
|
||||
## License Agreement
|
||||
|
||||
If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license. You are also implicitly verifying that all code is your original work.
|
||||
|
||||
Copyright (c) 2014-2016, SourceLair, Private Company ([www.sourcelair.com](https://www.sourcelair.com/home)) (MIT License)
|
||||
|
||||
Copyright (c) 2017-2018, [The xterm.js authors](https://github.com/xtermjs/xterm.js/graphs/contributors) (MIT License)
|
||||
Copyright (c) 2014-2017, SourceLair, Private Company ([www.sourcelair.com](https://www.sourcelair.com/home)) (MIT License)
|
||||
Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
||||
|
||||
+1
-8
@@ -12,12 +12,6 @@ CURRENT_PACKAGE_JSON_VERSION=$(cat package.json \
|
||||
| awk -F: '{ print $2 }' \
|
||||
| sed 's/[",]//g' \
|
||||
| tr -d '[[:space:]]')
|
||||
CURRENT_BOWER_JSON_VERSION=$(cat bower.json \
|
||||
| grep version \
|
||||
| head -1 \
|
||||
| awk -F: '{ print $2 }' \
|
||||
| sed 's/[",]//g' \
|
||||
| tr -d '[[:space:]]')
|
||||
|
||||
# Build xterm.js into `dist`
|
||||
export BUILD_DIR=dist
|
||||
@@ -26,9 +20,8 @@ npm run build
|
||||
# Update AUTHORS file
|
||||
sh bin/generate-authors
|
||||
|
||||
# Update version in package.json and bower.json
|
||||
# Update version in package.json
|
||||
sed -i "s/\"version\": \"$CURRENT_PACKAGE_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" package.json
|
||||
sed -i "s/\"version\": \"$CURRENT_BOWER_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" bower.json
|
||||
|
||||
git commit -S -s -a -m "Bump version to $NEW_VERSION"
|
||||
git tag $NEW_VERSION
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "xterm.js",
|
||||
"version": "2.4.0",
|
||||
"ignore": ["demo", "test", ".gitignore"],
|
||||
"main": [
|
||||
"dist/xterm.js",
|
||||
"dist/xterm.css"
|
||||
]
|
||||
}
|
||||
+6
-2
@@ -17,8 +17,12 @@ app.get('/style.css', function(req, res){
|
||||
res.sendFile(__dirname + '/style.css');
|
||||
});
|
||||
|
||||
app.get('/main.js', function(req, res){
|
||||
res.sendFile(__dirname + '/main.js');
|
||||
app.get('/dist/bundle.js', function(req, res){
|
||||
res.sendFile(__dirname + '/dist/bundle.js');
|
||||
});
|
||||
|
||||
app.get('/dist/bundle.js.map', function(req, res){
|
||||
res.sendFile(__dirname + '/dist/bundle.js.map');
|
||||
});
|
||||
|
||||
app.post('/terminals', function (req, res) {
|
||||
|
||||
+57
-7
@@ -5,26 +5,67 @@
|
||||
<link rel="stylesheet" href="/build/xterm.css" />
|
||||
<link rel="stylesheet" href="/build/addons/fullscreen/fullscreen.css" />
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/4.1.1/es6-promise.auto.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/1.0.0/fetch.min.js"></script>
|
||||
<script src="/build/xterm.js" ></script>
|
||||
<script src="/build/addons/attach/attach.js" ></script>
|
||||
<script src="/build/addons/fit/fit.js" ></script>
|
||||
<script src="/build/addons/fullscreen/fullscreen.js" ></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>xterm.js: xterm, in the browser</h1>
|
||||
<h1 style="color: #2D2E2C">xterm.js: A terminal for the <em style="color: #5DA5D5">web</em></h1>
|
||||
<div id="terminal-container"></div>
|
||||
<div>
|
||||
<h2>Actions</h2>
|
||||
<p>
|
||||
<label>Find next <input id="find-next"/></label>
|
||||
<label>Find previous <input id="find-previous"/></label>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Options</h2>
|
||||
<p>
|
||||
<label><input type="checkbox" id="option-cursor-blink"> cursorBlink</label>
|
||||
</p>
|
||||
<p>
|
||||
<label><input type="checkbox" id="option-mac-option-is-meta"> macOptionIsMeta</label>
|
||||
</p>
|
||||
<p>
|
||||
<label><input type="checkbox" id="option-transparency"> transparency</label>
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
cursorStyle
|
||||
<select id="option-cursor-style">
|
||||
<option value="block">block</option>
|
||||
<option value="underline">underline</option>
|
||||
<option value="bar">bar</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
bellStyle
|
||||
<select id="option-bell-style">
|
||||
<option value="">none</option>
|
||||
<option value="sound">sound</option>
|
||||
<option value="visual">visual</option>
|
||||
<option value="both">both</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label>scrollback <input type="number" id="option-scrollback" value="1000" /></label>
|
||||
</p>
|
||||
<p>
|
||||
<label>tabStopWidth <input type="number" id="option-tabstopwidth" value="8" /></label>
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
experimentalCharAtlas
|
||||
<select id="option-experimental-char-atlas">
|
||||
<option value="static" selected>static</option>
|
||||
<option value="dynamic">dynamic</option>
|
||||
<option value="none">none</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<div>
|
||||
<h3>Size</h3>
|
||||
<div>
|
||||
@@ -36,10 +77,19 @@
|
||||
<label for="rows">Rows</label>
|
||||
<input type="number" id="rows" />
|
||||
</div>
|
||||
<div style="display: inline-block; margin-right: 16px;">
|
||||
<label for="padding">Padding</label>
|
||||
<input type="number" id="padding" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Accessibility</h3>
|
||||
<p>
|
||||
<label><input type="checkbox" id="option-screen-reader-mode"> screenReaderMode</label>
|
||||
</p>
|
||||
</div>
|
||||
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for xterm.js evaluation purposes only. Exposing the demo to the public as is would introduce security risks for the host.</p>
|
||||
<script src="main.js" defer ></script>
|
||||
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for the development and evaluation of xterm.js only. Exposing the demo to the public as is would introduce security risks for the host.</p>
|
||||
<script src="dist/bundle.js" defer ></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+100
-30
@@ -1,43 +1,107 @@
|
||||
import * as Terminal from '../build/xterm';
|
||||
import * as attach from '../build/addons/attach/attach';
|
||||
import * as fit from '../build/addons/fit/fit';
|
||||
import * as fullscreen from '../build/addons/fullscreen/fullscreen';
|
||||
import * as search from '../build/addons/search/search';
|
||||
import * as webLinks from '../build/addons/webLinks/webLinks';
|
||||
import * as winptyCompat from '../build/addons/winptyCompat/winptyCompat';
|
||||
|
||||
|
||||
Terminal.applyAddon(attach);
|
||||
Terminal.applyAddon(fit);
|
||||
Terminal.applyAddon(fullscreen);
|
||||
Terminal.applyAddon(search);
|
||||
Terminal.applyAddon(webLinks);
|
||||
Terminal.applyAddon(winptyCompat);
|
||||
|
||||
|
||||
var term,
|
||||
protocol,
|
||||
socketURL,
|
||||
socket,
|
||||
pid,
|
||||
charWidth,
|
||||
charHeight;
|
||||
pid;
|
||||
|
||||
var terminalContainer = document.getElementById('terminal-container'),
|
||||
actionElements = {
|
||||
findNext: document.querySelector('#find-next'),
|
||||
findPrevious: document.querySelector('#find-previous')
|
||||
},
|
||||
optionElements = {
|
||||
cursorBlink: document.querySelector('#option-cursor-blink'),
|
||||
cursorStyle: document.querySelector('#option-cursor-style'),
|
||||
macOptionIsMeta: document.querySelector('#option-mac-option-is-meta'),
|
||||
scrollback: document.querySelector('#option-scrollback'),
|
||||
tabstopwidth: document.querySelector('#option-tabstopwidth')
|
||||
transparency: document.querySelector('#option-transparency'),
|
||||
tabstopwidth: document.querySelector('#option-tabstopwidth'),
|
||||
experimentalCharAtlas: document.querySelector('#option-experimental-char-atlas'),
|
||||
bellStyle: document.querySelector('#option-bell-style'),
|
||||
screenReaderMode: document.querySelector('#option-screen-reader-mode')
|
||||
},
|
||||
colsElement = document.getElementById('cols'),
|
||||
rowsElement = document.getElementById('rows');
|
||||
|
||||
function setTerminalSize () {
|
||||
var cols = parseInt(colsElement.value, 10),
|
||||
rows = parseInt(rowsElement.value, 10),
|
||||
width = (cols * charWidth).toString() + 'px',
|
||||
height = (rows * charHeight).toString() + 'px';
|
||||
rowsElement = document.getElementById('rows'),
|
||||
paddingElement = document.getElementById('padding');
|
||||
|
||||
function setTerminalSize() {
|
||||
var cols = parseInt(colsElement.value, 10);
|
||||
var rows = parseInt(rowsElement.value, 10);
|
||||
var width = (cols * term.renderer.dimensions.actualCellWidth + term.viewport.scrollBarWidth).toString() + 'px';
|
||||
var height = (rows * term.renderer.dimensions.actualCellHeight).toString() + 'px';
|
||||
terminalContainer.style.width = width;
|
||||
terminalContainer.style.height = height;
|
||||
term.resize(cols, rows);
|
||||
term.fit();
|
||||
}
|
||||
|
||||
function setPadding() {
|
||||
term.element.style.padding = parseInt(paddingElement.value, 10).toString() + 'px';
|
||||
term.fit();
|
||||
}
|
||||
|
||||
colsElement.addEventListener('change', setTerminalSize);
|
||||
rowsElement.addEventListener('change', setTerminalSize);
|
||||
paddingElement.addEventListener('change', setPadding);
|
||||
|
||||
actionElements.findNext.addEventListener('keypress', function (e) {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
term.findNext(actionElements.findNext.value);
|
||||
}
|
||||
});
|
||||
actionElements.findPrevious.addEventListener('keypress', function (e) {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
term.findPrevious(actionElements.findPrevious.value);
|
||||
}
|
||||
});
|
||||
|
||||
optionElements.cursorBlink.addEventListener('change', function () {
|
||||
term.setOption('cursorBlink', optionElements.cursorBlink.checked);
|
||||
});
|
||||
optionElements.macOptionIsMeta.addEventListener('change', function () {
|
||||
term.setOption('macOptionIsMeta', optionElements.macOptionIsMeta.checked);
|
||||
});
|
||||
optionElements.transparency.addEventListener('change', function () {
|
||||
var checked = optionElements.transparency.checked;
|
||||
term.setOption('allowTransparency', checked);
|
||||
term.setOption('theme', checked ? {background: 'rgba(0, 0, 0, .5)'} : {});
|
||||
});
|
||||
optionElements.cursorStyle.addEventListener('change', function () {
|
||||
term.setOption('cursorStyle', optionElements.cursorStyle.value);
|
||||
});
|
||||
optionElements.bellStyle.addEventListener('change', function () {
|
||||
term.setOption('bellStyle', optionElements.bellStyle.value);
|
||||
});
|
||||
optionElements.scrollback.addEventListener('change', function () {
|
||||
term.setOption('scrollback', parseInt(optionElements.scrollback.value, 10));
|
||||
});
|
||||
optionElements.tabstopwidth.addEventListener('change', function () {
|
||||
term.setOption('tabStopWidth', parseInt(optionElements.tabstopwidth.value, 10));
|
||||
});
|
||||
optionElements.experimentalCharAtlas.addEventListener('change', function () {
|
||||
term.setOption('experimentalCharAtlas', optionElements.experimentalCharAtlas.value);
|
||||
});
|
||||
optionElements.screenReaderMode.addEventListener('change', function () {
|
||||
term.setOption('screenReaderMode', optionElements.screenReaderMode.checked);
|
||||
});
|
||||
|
||||
createTerminal();
|
||||
|
||||
@@ -47,10 +111,13 @@ function createTerminal() {
|
||||
terminalContainer.removeChild(terminalContainer.children[0]);
|
||||
}
|
||||
term = new Terminal({
|
||||
macOptionIsMeta: optionElements.macOptionIsMeta.enabled,
|
||||
cursorBlink: optionElements.cursorBlink.checked,
|
||||
scrollback: parseInt(optionElements.scrollback.value, 10),
|
||||
tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
|
||||
tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10),
|
||||
screenReaderMode: optionElements.screenReaderMode.checked
|
||||
});
|
||||
window.term = term; // Expose `term` to window for debugging purposes
|
||||
term.on('resize', function (size) {
|
||||
if (!pid) {
|
||||
return;
|
||||
@@ -65,29 +132,32 @@ function createTerminal() {
|
||||
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
|
||||
|
||||
term.open(terminalContainer);
|
||||
term.winptyCompatInit();
|
||||
term.webLinksInit();
|
||||
term.fit();
|
||||
term.focus();
|
||||
|
||||
var initialGeometry = term.proposeGeometry(),
|
||||
cols = initialGeometry.cols,
|
||||
rows = initialGeometry.rows;
|
||||
// fit is called within a setTimeout, cols and rows need this.
|
||||
setTimeout(function () {
|
||||
colsElement.value = term.cols;
|
||||
rowsElement.value = term.rows;
|
||||
paddingElement.value = 0;
|
||||
|
||||
colsElement.value = cols;
|
||||
rowsElement.value = rows;
|
||||
// Set terminal size again to set the specific dimensions on the demo
|
||||
setTerminalSize();
|
||||
|
||||
fetch('/terminals?cols=' + cols + '&rows=' + rows, {method: 'POST'}).then(function (res) {
|
||||
fetch('/terminals?cols=' + term.cols + '&rows=' + term.rows, {method: 'POST'}).then(function (res) {
|
||||
|
||||
charWidth = Math.ceil(term.element.offsetWidth / cols);
|
||||
charHeight = Math.ceil(term.element.offsetHeight / rows);
|
||||
|
||||
res.text().then(function (pid) {
|
||||
window.pid = pid;
|
||||
socketURL += pid;
|
||||
socket = new WebSocket(socketURL);
|
||||
socket.onopen = runRealTerminal;
|
||||
socket.onclose = runFakeTerminal;
|
||||
socket.onerror = runFakeTerminal;
|
||||
res.text().then(function (processId) {
|
||||
pid = processId;
|
||||
socketURL += processId;
|
||||
socket = new WebSocket(socketURL);
|
||||
socket.onopen = runRealTerminal;
|
||||
socket.onclose = runFakeTerminal;
|
||||
socket.onerror = runFakeTerminal;
|
||||
});
|
||||
});
|
||||
});
|
||||
}, 0);
|
||||
}
|
||||
|
||||
function runRealTerminal() {
|
||||
|
||||
@@ -14,9 +14,3 @@ h1 {
|
||||
margin: 0 auto;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
#terminal-container .terminal {
|
||||
background-color: #111;
|
||||
color: #fafafa;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
var express = require('express');
|
||||
var app = express();
|
||||
var expressWs = require('express-ws')(app);
|
||||
var os = require('os');
|
||||
var pty = require('node-pty');
|
||||
|
||||
var terminals = {},
|
||||
logs = {};
|
||||
|
||||
app.use('/build', express.static(__dirname + '/../../build'));
|
||||
app.use('/demo', express.static(__dirname + '/../../demo'));
|
||||
app.use('/zmodemjs', express.static(__dirname + '/../../node_modules/zmodem.js/dist'));
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.sendFile(__dirname + '/index.html');
|
||||
});
|
||||
|
||||
app.get('/style.css', function(req, res){
|
||||
res.sendFile(__dirname + '../style.css');
|
||||
});
|
||||
|
||||
app.get('/main.js', function(req, res){
|
||||
res.sendFile(__dirname + '/main.js');
|
||||
});
|
||||
|
||||
app.post('/terminals', function (req, res) {
|
||||
var cols = parseInt(req.query.cols),
|
||||
rows = parseInt(req.query.rows),
|
||||
term = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], {
|
||||
encoding: null,
|
||||
name: 'xterm-color',
|
||||
cols: cols || 80,
|
||||
rows: rows || 24,
|
||||
cwd: process.env.PWD,
|
||||
env: process.env
|
||||
});
|
||||
|
||||
console.log('Created terminal with PID: ' + term.pid);
|
||||
terminals[term.pid] = term;
|
||||
logs[term.pid] = '';
|
||||
term.on('data', function(data) {
|
||||
logs[term.pid] += data;
|
||||
});
|
||||
res.send(term.pid.toString());
|
||||
res.end();
|
||||
});
|
||||
|
||||
app.post('/terminals/:pid/size', function (req, res) {
|
||||
var pid = parseInt(req.params.pid),
|
||||
cols = parseInt(req.query.cols),
|
||||
rows = parseInt(req.query.rows),
|
||||
term = terminals[pid];
|
||||
|
||||
term.resize(cols, rows);
|
||||
console.log('Resized terminal ' + pid + ' to ' + cols + ' cols and ' + rows + ' rows.');
|
||||
res.end();
|
||||
});
|
||||
|
||||
app.ws('/terminals/:pid', function (ws, req) {
|
||||
var term = terminals[parseInt(req.params.pid)];
|
||||
console.log('Connected to terminal ' + term.pid);
|
||||
ws.send(logs[term.pid]);
|
||||
|
||||
term.on('data', function(data) {
|
||||
try {
|
||||
ws.send(data);
|
||||
} catch (ex) {
|
||||
// The WebSocket is not open, ignore
|
||||
}
|
||||
});
|
||||
ws.on('message', function(msg) {
|
||||
term.write(msg);
|
||||
});
|
||||
ws.on('close', function () {
|
||||
term.kill();
|
||||
console.log('Closed terminal ' + term.pid);
|
||||
// Clean things up
|
||||
delete terminals[term.pid];
|
||||
delete logs[term.pid];
|
||||
});
|
||||
});
|
||||
|
||||
var port = process.env.PORT || 3000,
|
||||
host = os.platform() === 'win32' ? '127.0.0.1' : '0.0.0.0';
|
||||
|
||||
console.log('App listening to http://' + host + ':' + port);
|
||||
app.listen(port, host);
|
||||
@@ -0,0 +1,128 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>xterm.js demo</title>
|
||||
<link rel="stylesheet" href="/build/xterm.css" />
|
||||
<link rel="stylesheet" href="/build/addons/fullscreen/fullscreen.css" />
|
||||
<link rel="stylesheet" href="/demo/style.css" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/4.1.1/es6-promise.auto.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/1.0.0/fetch.min.js"></script>
|
||||
<script src="/build/xterm.js" ></script>
|
||||
|
||||
<script src="/build/addons/attach/attach.js" ></script>
|
||||
<script src="/zmodemjs/zmodem.js"></script>
|
||||
<script src="/build/addons/zmodem/zmodem.js" ></script>
|
||||
|
||||
<script src="/build/addons/fit/fit.js" ></script>
|
||||
<script src="/build/addons/fullscreen/fullscreen.js" ></script>
|
||||
<script src="/build/addons/search/search.js" ></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>xterm.js: xterm, in the browser</h1>
|
||||
|
||||
<div id="terminal-container"></div>
|
||||
|
||||
<div id="zmodem_controls">
|
||||
<form id="zm_start" style="display: none" action="javascript:void(0)">
|
||||
ZMODEM detected: Start ZMODEM session?
|
||||
<label><input id="zmstart_yes" name="zmstart" type=radio checked value="1"> Yes</label>
|
||||
|
||||
<label><input name="zmstart" type=radio value=""> No</label>
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<form id="zm_offer" style="display: none" action="javascript:void(0)">
|
||||
<p>ZMODEM File offered!</p>
|
||||
|
||||
<label><input id="zmaccept_yes" name="zmaccept" type=radio checked value="1"> Accept</label>
|
||||
|
||||
<label><input name="zmaccept" type=radio value=""> Skip</label>
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<div id="zm_file" style="display: none">
|
||||
<div>Name: <span id="name"></span></div>
|
||||
<div>Size: <span id="size"></span></div>
|
||||
<div>Last modified: <span id="mtime"></span></div>
|
||||
<div>Mode: <span id="mode"></span></div>
|
||||
<br>
|
||||
<div>Conversion: <span id="zfile_conversion"></span></div>
|
||||
<div>Management: <span id="zfile_management"></span></div>
|
||||
<div>Transport: <span id="zfile_transport"></span></div>
|
||||
<div>Sparse? <span id="zfile_sparse"></span></div>
|
||||
<br>
|
||||
<div>Files remaining in batch: <span id="files_remaining"></span></div>
|
||||
<div>Bytes remaining in batch: <span id="bytes_remaining"></span></div>
|
||||
</div>
|
||||
|
||||
<form id="zm_progress" style="display: none" action="javascript:void(0)">
|
||||
<div><span id="percent_received"></span>% (<span id="bytes_received"></span> bytes) received</div>
|
||||
<button id="zm_progress_skipper" type="button" onclick="skip_current_file();">Skip File</button>
|
||||
</form>
|
||||
|
||||
<form id="zm_choose" style="display: none" action="javascript:void(0)">
|
||||
<label>Choose file(s): <input id="zm_files" type="file" multiple></label>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2>Actions</h2>
|
||||
<p>
|
||||
<label>Find next <input id="find-next"/></label>
|
||||
<label>Find previous <input id="find-previous"/></label>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Options</h2>
|
||||
<p>
|
||||
<label><input type="checkbox" id="option-cursor-blink"> cursorBlink</label>
|
||||
</p>
|
||||
<p>
|
||||
<label><input type="checkbox" checked id="zmodem-auto"> Accept all ZMODEM prompts<sup>*</sup></label>
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
cursorStyle
|
||||
<select id="option-cursor-style">
|
||||
<option value="block">block</option>
|
||||
<option value="underline">underline</option>
|
||||
<option value="bar">bar</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label>
|
||||
bellStyle
|
||||
<select id="option-bell-style">
|
||||
<option value="">none</option>
|
||||
<option value="sound">sound</option>
|
||||
<option value="visual">visual</option>
|
||||
<option value="both">both</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label>scrollback <input type="number" id="option-scrollback" value="1000" /></label>
|
||||
</p>
|
||||
<p>
|
||||
<label>tabStopWidth <input type="number" id="option-tabstopwidth" value="8" /></label>
|
||||
</p>
|
||||
<div>
|
||||
<h3>Size</h3>
|
||||
<div>
|
||||
<div style="display: inline-block; margin-right: 16px;">
|
||||
<label for="cols">Columns</label>
|
||||
<input type="number" id="cols" />
|
||||
</div>
|
||||
<div style="display: inline-block; margin-right: 16px;">
|
||||
<label for="rows">Rows</label>
|
||||
<input type="number" id="rows" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for xterm.js evaluation purposes only. Exposing the demo to the public as is would introduce security risks for the host.</p>
|
||||
<p><sup>*</sup> ZMODEM file transfers are supported via an addon. To try it out, install <a href="https://ohse.de/uwe/software/lrzsz.html"><code>lrzsz</code></a> onto the remote peer, then run <code>rz</code> to send from your browser or <code>sz <file></code> to send from the remote peer.</p>
|
||||
<script src="main.js" defer ></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,388 @@
|
||||
"use strict";
|
||||
|
||||
var term,
|
||||
protocol,
|
||||
socketURL,
|
||||
socket,
|
||||
pid;
|
||||
|
||||
Terminal.applyAddon(fit);
|
||||
Terminal.applyAddon(attach);
|
||||
Terminal.applyAddon(zmodem);
|
||||
Terminal.applyAddon(search);
|
||||
|
||||
var terminalContainer = document.getElementById('terminal-container'),
|
||||
actionElements = {
|
||||
findNext: document.querySelector('#find-next'),
|
||||
findPrevious: document.querySelector('#find-previous')
|
||||
},
|
||||
optionElements = {
|
||||
cursorBlink: document.querySelector('#option-cursor-blink'),
|
||||
cursorStyle: document.querySelector('#option-cursor-style'),
|
||||
scrollback: document.querySelector('#option-scrollback'),
|
||||
tabstopwidth: document.querySelector('#option-tabstopwidth'),
|
||||
bellStyle: document.querySelector('#option-bell-style')
|
||||
},
|
||||
colsElement = document.getElementById('cols'),
|
||||
rowsElement = document.getElementById('rows');
|
||||
|
||||
function setTerminalSize() {
|
||||
var cols = parseInt(colsElement.value, 10);
|
||||
var rows = parseInt(rowsElement.value, 10);
|
||||
var viewportElement = document.querySelector('.xterm-viewport');
|
||||
var scrollBarWidth = viewportElement.offsetWidth - viewportElement.clientWidth;
|
||||
var width = (cols * term.charMeasure.width + 20 /*room for scrollbar*/).toString() + 'px';
|
||||
var height = (rows * term.charMeasure.height).toString() + 'px';
|
||||
|
||||
terminalContainer.style.width = width;
|
||||
terminalContainer.style.height = height;
|
||||
term.resize(cols, rows);
|
||||
}
|
||||
|
||||
colsElement.addEventListener('change', setTerminalSize);
|
||||
rowsElement.addEventListener('change', setTerminalSize);
|
||||
|
||||
actionElements.findNext.addEventListener('keypress', function (e) {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
term.findNext(actionElements.findNext.value);
|
||||
}
|
||||
});
|
||||
actionElements.findPrevious.addEventListener('keypress', function (e) {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
term.findPrevious(actionElements.findPrevious.value);
|
||||
}
|
||||
});
|
||||
|
||||
optionElements.cursorBlink.addEventListener('change', function () {
|
||||
term.setOption('cursorBlink', optionElements.cursorBlink.checked);
|
||||
});
|
||||
optionElements.cursorStyle.addEventListener('change', function () {
|
||||
term.setOption('cursorStyle', optionElements.cursorStyle.value);
|
||||
});
|
||||
optionElements.bellStyle.addEventListener('change', function () {
|
||||
term.setOption('bellStyle', optionElements.bellStyle.value);
|
||||
});
|
||||
optionElements.scrollback.addEventListener('change', function () {
|
||||
term.setOption('scrollback', parseInt(optionElements.scrollback.value, 10));
|
||||
});
|
||||
optionElements.tabstopwidth.addEventListener('change', function () {
|
||||
term.setOption('tabStopWidth', parseInt(optionElements.tabstopwidth.value, 10));
|
||||
});
|
||||
|
||||
createTerminal();
|
||||
|
||||
function createTerminal() {
|
||||
// Clean terminal
|
||||
while (terminalContainer.children.length) {
|
||||
terminalContainer.removeChild(terminalContainer.children[0]);
|
||||
}
|
||||
term = new Terminal({
|
||||
cursorBlink: optionElements.cursorBlink.checked,
|
||||
scrollback: parseInt(optionElements.scrollback.value, 10),
|
||||
tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
|
||||
});
|
||||
term.on('resize', function (size) {
|
||||
if (!pid) {
|
||||
return;
|
||||
}
|
||||
var cols = size.cols,
|
||||
rows = size.rows,
|
||||
url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows;
|
||||
|
||||
fetch(url, {method: 'POST'});
|
||||
});
|
||||
protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://';
|
||||
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
|
||||
|
||||
term.open(terminalContainer);
|
||||
term.fit();
|
||||
|
||||
// fit is called within a setTimeout, cols and rows need this.
|
||||
setTimeout(function () {
|
||||
colsElement.value = term.cols;
|
||||
rowsElement.value = term.rows;
|
||||
|
||||
// Set terminal size again to set the specific dimensions on the demo
|
||||
setTerminalSize();
|
||||
|
||||
fetch('/terminals?cols=' + term.cols + '&rows=' + term.rows, {method: 'POST'}).then(function (res) {
|
||||
|
||||
res.text().then(function (pid) {
|
||||
window.pid = pid;
|
||||
socketURL += pid;
|
||||
socket = new WebSocket(socketURL);
|
||||
socket.onopen = runRealTerminal;
|
||||
socket.onclose = runFakeTerminal;
|
||||
socket.onerror = runFakeTerminal;
|
||||
|
||||
term.zmodemAttach(socket, {
|
||||
noTerminalWriteOutsideSession: true,
|
||||
} );
|
||||
|
||||
term.on("zmodemRetract", () => {
|
||||
start_form.style.display = "none";
|
||||
start_form.onsubmit = null;
|
||||
});
|
||||
|
||||
term.on("zmodemDetect", (detection) => {
|
||||
function do_zmodem() {
|
||||
term.detach();
|
||||
let zsession = detection.confirm();
|
||||
|
||||
var promise;
|
||||
|
||||
if (zsession.type === "receive") {
|
||||
promise = _handle_receive_session(zsession);
|
||||
}
|
||||
else {
|
||||
promise = _handle_send_session(zsession);
|
||||
}
|
||||
|
||||
promise.catch( console.error.bind(console) ).then( () => {
|
||||
term.attach(socket);
|
||||
} );
|
||||
}
|
||||
|
||||
if (_auto_zmodem()) {
|
||||
do_zmodem();
|
||||
}
|
||||
else {
|
||||
start_form.style.display = "";
|
||||
start_form.onsubmit = function(e) {
|
||||
start_form.style.display = "none";
|
||||
|
||||
if (document.getElementById("zmstart_yes").checked) {
|
||||
do_zmodem();
|
||||
}
|
||||
else {
|
||||
detection.deny();
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}, 0);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// UI STUFF
|
||||
|
||||
function _show_file_info(xfer) {
|
||||
var file_info = xfer.get_details();
|
||||
|
||||
document.getElementById("name").textContent = file_info.name;
|
||||
document.getElementById("size").textContent = file_info.size;
|
||||
document.getElementById("mtime").textContent = file_info.mtime;
|
||||
document.getElementById("files_remaining").textContent = file_info.files_remaining;
|
||||
document.getElementById("bytes_remaining").textContent = file_info.bytes_remaining;
|
||||
|
||||
document.getElementById("mode").textContent = "0" + file_info.mode.toString(8);
|
||||
|
||||
var xfer_opts = xfer.get_options();
|
||||
["conversion", "management", "transport", "sparse"].forEach( (lbl) => {
|
||||
document.getElementById(`zfile_${lbl}`).textContent = xfer_opts[lbl];
|
||||
} );
|
||||
|
||||
document.getElementById("zm_file").style.display = "";
|
||||
}
|
||||
function _hide_file_info() {
|
||||
document.getElementById("zm_file").style.display = "none";
|
||||
}
|
||||
|
||||
function _save_to_disk(xfer, buffer) {
|
||||
return Zmodem.Browser.save_to_disk(buffer, xfer.get_details().name);
|
||||
}
|
||||
|
||||
var skipper_button = document.getElementById("zm_progress_skipper");
|
||||
var skipper_button_orig_text = skipper_button.textContent;
|
||||
|
||||
function _show_progress() {
|
||||
skipper_button.disabled = false;
|
||||
skipper_button.textContent = skipper_button_orig_text;
|
||||
|
||||
document.getElementById("bytes_received").textContent = 0;
|
||||
document.getElementById("percent_received").textContent = 0;
|
||||
|
||||
document.getElementById("zm_progress").style.display = "";
|
||||
}
|
||||
|
||||
function _update_progress(xfer) {
|
||||
var total_in = xfer.get_offset();
|
||||
|
||||
document.getElementById("bytes_received").textContent = total_in;
|
||||
|
||||
var percent_received = 100 * total_in / xfer.get_details().size;
|
||||
document.getElementById("percent_received").textContent = percent_received.toFixed(2);
|
||||
}
|
||||
|
||||
function _hide_progress() {
|
||||
document.getElementById("zm_progress").style.display = "none";
|
||||
}
|
||||
|
||||
var start_form = document.getElementById("zm_start");
|
||||
|
||||
function _auto_zmodem() {
|
||||
return document.getElementById("zmodem-auto").checked;
|
||||
}
|
||||
|
||||
// END UI STUFF
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
function _handle_receive_session(zsession) {
|
||||
zsession.on("offer", function(xfer) {
|
||||
current_receive_xfer = xfer;
|
||||
|
||||
_show_file_info(xfer);
|
||||
|
||||
var offer_form = document.getElementById("zm_offer");
|
||||
|
||||
function on_form_submit() {
|
||||
offer_form.style.display = "none";
|
||||
|
||||
//START
|
||||
//if (offer_form.zmaccept.value) {
|
||||
if (_auto_zmodem() || document.getElementById("zmaccept_yes").checked) {
|
||||
_show_progress();
|
||||
|
||||
var FILE_BUFFER = [];
|
||||
xfer.on("input", (payload) => {
|
||||
_update_progress(xfer);
|
||||
FILE_BUFFER.push( new Uint8Array(payload) );
|
||||
});
|
||||
xfer.accept().then(
|
||||
() => {
|
||||
_save_to_disk(xfer, FILE_BUFFER);
|
||||
},
|
||||
console.error.bind(console)
|
||||
);
|
||||
}
|
||||
else {
|
||||
xfer.skip();
|
||||
}
|
||||
//END
|
||||
}
|
||||
|
||||
if (_auto_zmodem()) {
|
||||
on_form_submit();
|
||||
}
|
||||
else {
|
||||
offer_form.onsubmit = on_form_submit;
|
||||
offer_form.style.display = "";
|
||||
}
|
||||
} );
|
||||
|
||||
var promise = new Promise( (res) => {
|
||||
zsession.on("session_end", () => {
|
||||
_hide_file_info();
|
||||
_hide_progress();
|
||||
res();
|
||||
} );
|
||||
} );
|
||||
|
||||
zsession.start();
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
||||
function _handle_send_session(zsession) {
|
||||
var choose_form = document.getElementById("zm_choose");
|
||||
choose_form.style.display = "";
|
||||
|
||||
var file_el = document.getElementById("zm_files");
|
||||
|
||||
var promise = new Promise( (res) => {
|
||||
file_el.onchange = function(e) {
|
||||
choose_form.style.display = "none";
|
||||
|
||||
var files_obj = file_el.files;
|
||||
|
||||
Zmodem.Browser.send_files(
|
||||
zsession,
|
||||
files_obj,
|
||||
{
|
||||
on_offer_response(obj, xfer) {
|
||||
if (xfer) _show_progress();
|
||||
//console.log("offer", xfer ? "accepted" : "skipped");
|
||||
},
|
||||
on_progress(obj, xfer) {
|
||||
_update_progress(xfer);
|
||||
},
|
||||
on_file_complete(obj) {
|
||||
//console.log("COMPLETE", obj);
|
||||
_hide_progress();
|
||||
},
|
||||
}
|
||||
).then(_hide_progress).then(
|
||||
zsession.close.bind(zsession),
|
||||
console.error.bind(console)
|
||||
).then( () => {
|
||||
_hide_file_info();
|
||||
_hide_progress();
|
||||
res();
|
||||
} );
|
||||
};
|
||||
} );
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
||||
//This is here to allow canceling of an in-progress ZMODEM transfer.
|
||||
var current_receive_xfer;
|
||||
|
||||
//Called from HTML directly.
|
||||
function skip_current_file() {
|
||||
current_receive_xfer.skip();
|
||||
|
||||
skipper_button.disabled = true;
|
||||
skipper_button.textContent = "Waiting for server to acknowledge skip …";
|
||||
}
|
||||
|
||||
function runRealTerminal() {
|
||||
term.attach(socket);
|
||||
|
||||
term._initialized = true;
|
||||
}
|
||||
|
||||
function runFakeTerminal() {
|
||||
if (term._initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
term._initialized = true;
|
||||
|
||||
var shellprompt = '$ ';
|
||||
|
||||
term.prompt = function () {
|
||||
term.write('\r\n' + shellprompt);
|
||||
};
|
||||
|
||||
term.writeln('Welcome to xterm.js');
|
||||
term.writeln('This is a local terminal emulation, without a real terminal in the back-end.');
|
||||
term.writeln('Type some keys and commands to play around.');
|
||||
term.writeln('');
|
||||
term.prompt();
|
||||
|
||||
term.on('key', function (key, ev) {
|
||||
var printable = (
|
||||
!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey
|
||||
);
|
||||
|
||||
if (ev.keyCode == 13) {
|
||||
term.prompt();
|
||||
} else if (ev.keyCode == 8) {
|
||||
// Do not delete the prompt
|
||||
if (term.x > 2) {
|
||||
term.write('\b \b');
|
||||
}
|
||||
} else if (printable) {
|
||||
term.write(key);
|
||||
}
|
||||
});
|
||||
|
||||
term.on('paste', function (data, ev) {
|
||||
term.write(data);
|
||||
});
|
||||
}
|
||||
Vendored
-126
@@ -1,126 +0,0 @@
|
||||
/**
|
||||
* Implements the attach method, that attaches the terminal to a WebSocket stream.
|
||||
* @module xterm/addons/attach/attach
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
(function (attach) {
|
||||
if (typeof exports === 'object' && typeof module === 'object') {
|
||||
/*
|
||||
* CommonJS environment
|
||||
*/
|
||||
module.exports = attach(require('../../xterm'));
|
||||
} else if (typeof define == 'function') {
|
||||
/*
|
||||
* Require.js is available
|
||||
*/
|
||||
define(['../../xterm'], attach);
|
||||
} else {
|
||||
/*
|
||||
* Plain browser environment
|
||||
*/
|
||||
attach(window.Terminal);
|
||||
}
|
||||
})(function (Xterm) {
|
||||
'use strict';
|
||||
|
||||
var exports = {};
|
||||
|
||||
/**
|
||||
* Attaches the given terminal to the given socket.
|
||||
*
|
||||
* @param {Xterm} term - The terminal to be attached to the given socket.
|
||||
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||
* to the socket as well.
|
||||
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||
* should happen instantly or at a maximum
|
||||
* frequency of 1 rendering per 10ms.
|
||||
*/
|
||||
exports.attach = function (term, socket, bidirectional, buffered) {
|
||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
||||
term.socket = socket;
|
||||
|
||||
term._flushBuffer = function () {
|
||||
term.write(term._attachSocketBuffer);
|
||||
term._attachSocketBuffer = null;
|
||||
clearTimeout(term._attachSocketBufferTimer);
|
||||
term._attachSocketBufferTimer = null;
|
||||
};
|
||||
|
||||
term._pushToBuffer = function (data) {
|
||||
if (term._attachSocketBuffer) {
|
||||
term._attachSocketBuffer += data;
|
||||
} else {
|
||||
term._attachSocketBuffer = data;
|
||||
setTimeout(term._flushBuffer, 10);
|
||||
}
|
||||
};
|
||||
|
||||
term._getMessage = function (ev) {
|
||||
if (buffered) {
|
||||
term._pushToBuffer(ev.data);
|
||||
} else {
|
||||
term.write(ev.data);
|
||||
}
|
||||
};
|
||||
|
||||
term._sendData = function (data) {
|
||||
socket.send(data);
|
||||
};
|
||||
|
||||
socket.addEventListener('message', term._getMessage);
|
||||
|
||||
if (bidirectional) {
|
||||
term.on('data', term._sendData);
|
||||
}
|
||||
|
||||
socket.addEventListener('close', term.detach.bind(term, socket));
|
||||
socket.addEventListener('error', term.detach.bind(term, socket));
|
||||
};
|
||||
|
||||
/**
|
||||
* Detaches the given terminal from the given socket
|
||||
*
|
||||
* @param {Xterm} term - The terminal to be detached from the given socket.
|
||||
* @param {WebSocket} socket - The socket from which to detach the current
|
||||
* terminal.
|
||||
*/
|
||||
exports.detach = function (term, socket) {
|
||||
term.off('data', term._sendData);
|
||||
|
||||
socket = (typeof socket == 'undefined') ? term.socket : socket;
|
||||
|
||||
if (socket) {
|
||||
socket.removeEventListener('message', term._getMessage);
|
||||
}
|
||||
|
||||
delete term.socket;
|
||||
};
|
||||
|
||||
/**
|
||||
* Attaches the current terminal to the given socket
|
||||
*
|
||||
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||
* to the socket as well.
|
||||
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||
* should happen instantly or at a maximum
|
||||
* frequency of 1 rendering per 10ms.
|
||||
*/
|
||||
Xterm.prototype.attach = function (socket, bidirectional, buffered) {
|
||||
return exports.attach(this, socket, bidirectional, buffered);
|
||||
};
|
||||
|
||||
/**
|
||||
* Detaches the current terminal from the given socket.
|
||||
*
|
||||
* @param {WebSocket} socket - The socket from which to detach the current
|
||||
* terminal.
|
||||
*/
|
||||
Xterm.prototype.detach = function (socket) {
|
||||
return exports.detach(this, socket);
|
||||
};
|
||||
|
||||
return exports;
|
||||
});
|
||||
Vendored
-86
@@ -1,86 +0,0 @@
|
||||
/**
|
||||
* Fit terminal columns and rows to the dimensions of its DOM element.
|
||||
*
|
||||
* ## Approach
|
||||
* - Rows: Truncate the division of the terminal parent element height by the terminal row height.
|
||||
*
|
||||
* - Columns: Truncate the division of the terminal parent element width by the terminal character
|
||||
* width (apply display: inline at the terminal row and truncate its width with the current
|
||||
* number of columns).
|
||||
* @module xterm/addons/fit/fit
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
(function (fit) {
|
||||
if (typeof exports === 'object' && typeof module === 'object') {
|
||||
/*
|
||||
* CommonJS environment
|
||||
*/
|
||||
module.exports = fit(require('../../xterm'));
|
||||
} else if (typeof define == 'function') {
|
||||
/*
|
||||
* Require.js is available
|
||||
*/
|
||||
define(['../../xterm'], fit);
|
||||
} else {
|
||||
/*
|
||||
* Plain browser environment
|
||||
*/
|
||||
fit(window.Terminal);
|
||||
}
|
||||
})(function (Xterm) {
|
||||
var exports = {};
|
||||
|
||||
exports.proposeGeometry = function (term) {
|
||||
if (!term.element.parentElement) {
|
||||
return null;
|
||||
}
|
||||
var parentElementStyle = window.getComputedStyle(term.element.parentElement),
|
||||
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
|
||||
parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')) - 17),
|
||||
elementStyle = window.getComputedStyle(term.element),
|
||||
elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
|
||||
elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
|
||||
availableHeight = parentElementHeight - elementPaddingVer,
|
||||
availableWidth = parentElementWidth - elementPaddingHor,
|
||||
container = term.rowContainer,
|
||||
subjectRow = term.rowContainer.firstElementChild,
|
||||
contentBuffer = subjectRow.innerHTML,
|
||||
characterHeight,
|
||||
rows,
|
||||
characterWidth,
|
||||
cols,
|
||||
geometry;
|
||||
|
||||
subjectRow.style.display = 'inline';
|
||||
subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace
|
||||
characterWidth = subjectRow.getBoundingClientRect().width;
|
||||
subjectRow.style.display = ''; // Revert style before calculating height, since they differ.
|
||||
characterHeight = parseInt(subjectRow.offsetHeight);
|
||||
subjectRow.innerHTML = contentBuffer;
|
||||
|
||||
rows = parseInt(availableHeight / characterHeight);
|
||||
cols = parseInt(availableWidth / characterWidth);
|
||||
|
||||
geometry = {cols: cols, rows: rows};
|
||||
return geometry;
|
||||
};
|
||||
|
||||
exports.fit = function (term) {
|
||||
var geometry = exports.proposeGeometry(term);
|
||||
|
||||
if (geometry) {
|
||||
term.resize(geometry.cols, geometry.rows);
|
||||
}
|
||||
};
|
||||
|
||||
Xterm.prototype.proposeGeometry = function () {
|
||||
return exports.proposeGeometry(this);
|
||||
};
|
||||
|
||||
Xterm.prototype.fit = function () {
|
||||
return exports.fit(this);
|
||||
};
|
||||
|
||||
return exports;
|
||||
});
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
.xterm.fullscreen {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
z-index: 255;
|
||||
}
|
||||
Vendored
-50
@@ -1,50 +0,0 @@
|
||||
/**
|
||||
* Fullscreen addon for xterm.js
|
||||
* @module xterm/addons/fullscreen/fullscreen
|
||||
* @license MIT
|
||||
*/
|
||||
(function (fullscreen) {
|
||||
if (typeof exports === 'object' && typeof module === 'object') {
|
||||
/*
|
||||
* CommonJS environment
|
||||
*/
|
||||
module.exports = fullscreen(require('../../xterm'));
|
||||
} else if (typeof define == 'function') {
|
||||
/*
|
||||
* Require.js is available
|
||||
*/
|
||||
define(['../../xterm'], fullscreen);
|
||||
} else {
|
||||
/*
|
||||
* Plain browser environment
|
||||
*/
|
||||
fullscreen(window.Terminal);
|
||||
}
|
||||
})(function (Xterm) {
|
||||
var exports = {};
|
||||
|
||||
/**
|
||||
* Toggle the given terminal's fullscreen mode.
|
||||
* @param {Xterm} term - The terminal to toggle full screen mode
|
||||
* @param {boolean} fullscreen - Toggle fullscreen on (true) or off (false)
|
||||
*/
|
||||
exports.toggleFullScreen = function (term, fullscreen) {
|
||||
var fn;
|
||||
|
||||
if (typeof fullscreen == 'undefined') {
|
||||
fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add';
|
||||
} else if (!fullscreen) {
|
||||
fn = 'remove';
|
||||
} else {
|
||||
fn = 'add';
|
||||
}
|
||||
|
||||
term.element.classList[fn]('fullscreen');
|
||||
};
|
||||
|
||||
Xterm.prototype.toggleFullscreen = function (fullscreen) {
|
||||
exports.toggleFullScreen(this, fullscreen);
|
||||
};
|
||||
|
||||
return exports;
|
||||
});
|
||||
Vendored
-207
@@ -1,207 +0,0 @@
|
||||
/**
|
||||
* Methods for turning URL subscrings in the terminal's content into links (`a` DOM elements).
|
||||
* @module xterm/addons/linkify/linkify
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
(function (linkify) {
|
||||
if (typeof exports === 'object' && typeof module === 'object') {
|
||||
/*
|
||||
* CommonJS environment
|
||||
*/
|
||||
module.exports = linkify(require('../../xterm'));
|
||||
} else if (typeof define == 'function') {
|
||||
/*
|
||||
* Require.js is available
|
||||
*/
|
||||
define(['../../xterm'], linkify);
|
||||
} else {
|
||||
/*
|
||||
* Plain browser environment
|
||||
*/
|
||||
linkify(window.Terminal);
|
||||
}
|
||||
})(function (Xterm) {
|
||||
'use strict';
|
||||
|
||||
var exports = {},
|
||||
protocolClause = '(https?:\\/\\/)',
|
||||
domainCharacterSet = '[\\da-z\\.-]+',
|
||||
negatedDomainCharacterSet = '[^\\da-z\\.-]+',
|
||||
domainBodyClause = '(' + domainCharacterSet + ')',
|
||||
tldClause = '([a-z\\.]{2,6})',
|
||||
ipClause = '((\\d{1,3}\\.){3}\\d{1,3})',
|
||||
portClause = '(:\\d{1,5})',
|
||||
hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + ')' + portClause + '?',
|
||||
pathClause = '(\\/[\\/\\w\\.-]*)*',
|
||||
negatedPathCharacterSet = '[^\\/\\w\\.-]+',
|
||||
bodyClause = hostClause + pathClause,
|
||||
start = '(?:^|' + negatedDomainCharacterSet + ')(',
|
||||
end = ')($|' + negatedPathCharacterSet + ')',
|
||||
lenientUrlClause = start + protocolClause + '?' + bodyClause + end,
|
||||
strictUrlClause = start + protocolClause + bodyClause + end,
|
||||
lenientUrlRegex = new RegExp(lenientUrlClause),
|
||||
strictUrlRegex = new RegExp(strictUrlClause);
|
||||
|
||||
/**
|
||||
* Converts all valid URLs found in the given terminal line into
|
||||
* hyperlinks. The terminal line can be either the HTML element itself
|
||||
* or the index of the termina line in the children of the terminal
|
||||
* rows container.
|
||||
*
|
||||
* @param {Xterm} terminal - The terminal that owns the given line.
|
||||
* @param {number|HTMLDivElement} line - The terminal line that should get
|
||||
* "linkified".
|
||||
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||
* false, the regex requires a protocol clause. Defaults to true.
|
||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
||||
* Default doesn't set target attribute
|
||||
* @emits linkify
|
||||
* @emits linkify:line
|
||||
*/
|
||||
exports.linkifyTerminalLine = function (terminal, line, lenient, target) {
|
||||
if (typeof line == 'number') {
|
||||
line = terminal.rowContainer.children[line];
|
||||
} else if (! (line instanceof HTMLDivElement)) {
|
||||
var message = 'The "line" argument should be either a number';
|
||||
message += ' or an HTMLDivElement';
|
||||
|
||||
throw new TypeError(message);
|
||||
}
|
||||
|
||||
if (typeof target === 'undefined') {
|
||||
target = '';
|
||||
} else {
|
||||
target = 'target="' + target + '"';
|
||||
}
|
||||
|
||||
var buffer = document.createElement('span'),
|
||||
nodes = line.childNodes;
|
||||
|
||||
for (var j=0; j<nodes.length; j++) {
|
||||
var node = nodes[j],
|
||||
match;
|
||||
|
||||
/**
|
||||
* Since we cannot access the TextNode's HTML representation
|
||||
* from the instance itself, we assign its data as textContent
|
||||
* to a dummy buffer span, in order to retrieve the TextNode's
|
||||
* HTML representation from the buffer's innerHTML.
|
||||
*/
|
||||
buffer.textContent = node.data;
|
||||
|
||||
var nodeHTML = buffer.innerHTML;
|
||||
|
||||
/**
|
||||
* Apply function only on TextNodes
|
||||
*/
|
||||
if (node.nodeType != node.TEXT_NODE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var url = exports.findLinkMatch(node.data, lenient);
|
||||
|
||||
if (!url) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var startsWithProtocol = new RegExp('^' + protocolClause),
|
||||
urlHasProtocol = url.match(startsWithProtocol),
|
||||
href = (urlHasProtocol) ? url : 'http://' + url,
|
||||
link = '<a href="' + href + '" ' + target + '>' + url + '</a>',
|
||||
newHTML = nodeHTML.replace(url, link);
|
||||
|
||||
line.innerHTML = line.innerHTML.replace(nodeHTML, newHTML);
|
||||
}
|
||||
|
||||
/**
|
||||
* This event gets emitted when conversion of all URL susbtrings
|
||||
* to HTML anchor elements (links) has finished, for a specific
|
||||
* line of the current Xterm instance.
|
||||
*
|
||||
* @event linkify:line
|
||||
*/
|
||||
terminal.emit('linkify:line', line);
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds a link within a block of text.
|
||||
*
|
||||
* @param {string} text - The text to search .
|
||||
* @param {boolean} lenient - Whether to use the lenient search.
|
||||
* @return {string} A URL.
|
||||
*/
|
||||
exports.findLinkMatch = function (text, lenient) {
|
||||
var match = text.match(lenient ? lenientUrlRegex : strictUrlRegex);
|
||||
if (!match || match.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return match[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts all valid URLs found in the terminal view into hyperlinks.
|
||||
*
|
||||
* @param {Xterm} terminal - The terminal that should get "linkified".
|
||||
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||
* false, the regex requires a protocol clause. Defaults to true.
|
||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
||||
* Default doesn't set target attribute
|
||||
* @emits linkify
|
||||
* @emits linkify:line
|
||||
*/
|
||||
exports.linkify = function (terminal, lenient, target) {
|
||||
var rows = terminal.rowContainer.children;
|
||||
|
||||
lenient = (typeof lenient == "boolean") ? lenient : true;
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
var line = rows[i];
|
||||
|
||||
exports.linkifyTerminalLine(terminal, line, lenient, target);
|
||||
}
|
||||
|
||||
/**
|
||||
* This event gets emitted when conversion of all URL substrings to
|
||||
* HTML anchor elements (links) has finished for the current Xterm
|
||||
* instance's view.
|
||||
*
|
||||
* @event linkify
|
||||
*/
|
||||
terminal.emit('linkify');
|
||||
};
|
||||
|
||||
/**
|
||||
* Extend Xterm prototype.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Converts all valid URLs found in the current terminal linte into
|
||||
* hyperlinks.
|
||||
*
|
||||
* @memberof Xterm
|
||||
* @param {number|HTMLDivElement} line - The terminal line that should get
|
||||
* "linkified".
|
||||
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||
* false, the regex requires a protocol clause. Defaults to true.
|
||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
||||
* Default doesn't set target attribute
|
||||
*/
|
||||
Xterm.prototype.linkifyTerminalLine = function (line, lenient, target) {
|
||||
return exports.linkifyTerminalLine(this, line, lenient, target);
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts all valid URLs found in the current terminal into hyperlinks.
|
||||
*
|
||||
* @memberof Xterm
|
||||
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||
* false, the regex requires a protocol clause. Defaults to true.
|
||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
||||
* Default doesn't set target attribute
|
||||
*/
|
||||
Xterm.prototype.linkify = function (lenient, target) {
|
||||
return exports.linkify(this, lenient, target);
|
||||
};
|
||||
|
||||
return exports;
|
||||
});
|
||||
Vendored
-135
@@ -1,135 +0,0 @@
|
||||
/**
|
||||
* This module provides methods for attaching a terminal to a terminado WebSocket stream.
|
||||
*
|
||||
* @module xterm/addons/terminado/terminado
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
(function (attach) {
|
||||
if (typeof exports === 'object' && typeof module === 'object') {
|
||||
/*
|
||||
* CommonJS environment
|
||||
*/
|
||||
module.exports = attach(require('../../xterm'));
|
||||
} else if (typeof define == 'function') {
|
||||
/*
|
||||
* Require.js is available
|
||||
*/
|
||||
define(['../../xterm'], attach);
|
||||
} else {
|
||||
/*
|
||||
* Plain browser environment
|
||||
*/
|
||||
attach(window.Terminal);
|
||||
}
|
||||
})(function (Xterm) {
|
||||
'use strict';
|
||||
|
||||
var exports = {};
|
||||
|
||||
/**
|
||||
* Attaches the given terminal to the given socket.
|
||||
*
|
||||
* @param {Xterm} term - The terminal to be attached to the given socket.
|
||||
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||
* to the socket as well.
|
||||
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||
* should happen instantly or at a maximum
|
||||
* frequency of 1 rendering per 10ms.
|
||||
*/
|
||||
exports.terminadoAttach = function (term, socket, bidirectional, buffered) {
|
||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
||||
term.socket = socket;
|
||||
|
||||
term._flushBuffer = function () {
|
||||
term.write(term._attachSocketBuffer);
|
||||
term._attachSocketBuffer = null;
|
||||
clearTimeout(term._attachSocketBufferTimer);
|
||||
term._attachSocketBufferTimer = null;
|
||||
};
|
||||
|
||||
term._pushToBuffer = function (data) {
|
||||
if (term._attachSocketBuffer) {
|
||||
term._attachSocketBuffer += data;
|
||||
} else {
|
||||
term._attachSocketBuffer = data;
|
||||
setTimeout(term._flushBuffer, 10);
|
||||
}
|
||||
};
|
||||
|
||||
term._getMessage = function (ev) {
|
||||
var data = JSON.parse(ev.data)
|
||||
if( data[0] == "stdout" ) {
|
||||
if (buffered) {
|
||||
term._pushToBuffer(data[1]);
|
||||
} else {
|
||||
term.write(data[1]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
term._sendData = function (data) {
|
||||
socket.send(JSON.stringify(['stdin', data]));
|
||||
};
|
||||
|
||||
term._setSize = function (size) {
|
||||
socket.send(JSON.stringify(['set_size', size.rows, size.cols]));
|
||||
};
|
||||
|
||||
socket.addEventListener('message', term._getMessage);
|
||||
|
||||
if (bidirectional) {
|
||||
term.on('data', term._sendData);
|
||||
}
|
||||
term.on('resize', term._setSize);
|
||||
|
||||
socket.addEventListener('close', term.terminadoDetach.bind(term, socket));
|
||||
socket.addEventListener('error', term.terminadoDetach.bind(term, socket));
|
||||
};
|
||||
|
||||
/**
|
||||
* Detaches the given terminal from the given socket
|
||||
*
|
||||
* @param {Xterm} term - The terminal to be detached from the given socket.
|
||||
* @param {WebSocket} socket - The socket from which to detach the current
|
||||
* terminal.
|
||||
*/
|
||||
exports.terminadoDetach = function (term, socket) {
|
||||
term.off('data', term._sendData);
|
||||
|
||||
socket = (typeof socket == 'undefined') ? term.socket : socket;
|
||||
|
||||
if (socket) {
|
||||
socket.removeEventListener('message', term._getMessage);
|
||||
}
|
||||
|
||||
delete term.socket;
|
||||
};
|
||||
|
||||
/**
|
||||
* Attaches the current terminal to the given socket
|
||||
*
|
||||
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||
* to the socket as well.
|
||||
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||
* should happen instantly or at a maximum
|
||||
* frequency of 1 rendering per 10ms.
|
||||
*/
|
||||
Xterm.prototype.terminadoAttach = function (socket, bidirectional, buffered) {
|
||||
return exports.terminadoAttach(this, socket, bidirectional, buffered);
|
||||
};
|
||||
|
||||
/**
|
||||
* Detaches the current terminal from the given socket.
|
||||
*
|
||||
* @param {WebSocket} socket - The socket from which to detach the current
|
||||
* terminal.
|
||||
*/
|
||||
Xterm.prototype.terminadoDetach = function (socket) {
|
||||
return exports.terminadoDetach(this, socket);
|
||||
};
|
||||
|
||||
return exports;
|
||||
});
|
||||
Vendored
-2254
File diff suppressed because it is too large
Load Diff
Vendored
-4140
File diff suppressed because it is too large
Load Diff
Vendored
-1
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
web:
|
||||
build: ./
|
||||
volumes:
|
||||
- ./:/usr/src/app
|
||||
ports:
|
||||
- 3000:3000
|
||||
@@ -0,0 +1,17 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: xtermjs/xterm.js:latest
|
||||
build: .
|
||||
volumes:
|
||||
- ./:/usr/src/app
|
||||
ports:
|
||||
- ${XTERMJS_PORT:3000}:3000
|
||||
command: ["npm", "start"]
|
||||
|
||||
watch:
|
||||
build: .
|
||||
volumes:
|
||||
- ./:/usr/src/app
|
||||
command: ["npm", "run", "watch"]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user